@bananapus/nana-sdk-core 1.0.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 (259) hide show
  1. package/dist/cjs/actions/JBSuckerAbi.d.ts +32 -0
  2. package/dist/cjs/actions/JBSuckerAbi.d.ts.map +1 -0
  3. package/dist/cjs/actions/JBSuckerAbi.js +42 -0
  4. package/dist/cjs/actions/JBSuckerAbi.js.map +1 -0
  5. package/dist/cjs/actions/dataHook.d.ts +29 -0
  6. package/dist/cjs/actions/dataHook.d.ts.map +1 -0
  7. package/dist/cjs/actions/dataHook.js +81 -0
  8. package/dist/cjs/actions/dataHook.js.map +1 -0
  9. package/dist/cjs/actions/projectMetadata.d.ts +16 -0
  10. package/dist/cjs/actions/projectMetadata.d.ts.map +1 -0
  11. package/dist/cjs/actions/projectMetadata.js +37 -0
  12. package/dist/cjs/actions/projectMetadata.js.map +1 -0
  13. package/dist/cjs/actions/suckerPairs.d.ts +19 -0
  14. package/dist/cjs/actions/suckerPairs.d.ts.map +1 -0
  15. package/dist/cjs/actions/suckerPairs.js +71 -0
  16. package/dist/cjs/actions/suckerPairs.js.map +1 -0
  17. package/dist/cjs/constants.d.ts +126 -0
  18. package/dist/cjs/constants.d.ts.map +1 -0
  19. package/dist/cjs/constants.js +229 -0
  20. package/dist/cjs/constants.js.map +1 -0
  21. package/dist/cjs/contracts.d.ts +71 -0
  22. package/dist/cjs/contracts.d.ts.map +1 -0
  23. package/dist/cjs/contracts.js +78 -0
  24. package/dist/cjs/contracts.js.map +1 -0
  25. package/dist/cjs/generated/juicebox.d.ts +79672 -0
  26. package/dist/cjs/generated/juicebox.d.ts.map +1 -0
  27. package/dist/cjs/generated/juicebox.js +62354 -0
  28. package/dist/cjs/generated/juicebox.js.map +1 -0
  29. package/dist/cjs/index.d.ts +9 -0
  30. package/dist/cjs/index.d.ts.map +1 -0
  31. package/dist/cjs/index.js +9 -0
  32. package/dist/cjs/index.js.map +1 -0
  33. package/dist/cjs/types.d.ts +120 -0
  34. package/dist/cjs/types.d.ts.map +1 -0
  35. package/dist/cjs/types.js +31 -0
  36. package/dist/cjs/types.js.map +1 -0
  37. package/dist/cjs/utils/contracts.d.ts +10 -0
  38. package/dist/cjs/utils/contracts.d.ts.map +1 -0
  39. package/dist/cjs/utils/contracts.js +28 -0
  40. package/dist/cjs/utils/contracts.js.map +1 -0
  41. package/dist/cjs/utils/data.d.ts +69 -0
  42. package/dist/cjs/utils/data.d.ts.map +1 -0
  43. package/dist/cjs/utils/data.js +80 -0
  44. package/dist/cjs/utils/data.js.map +1 -0
  45. package/dist/cjs/utils/data.test.d.ts +2 -0
  46. package/dist/cjs/utils/data.test.d.ts.map +1 -0
  47. package/dist/cjs/utils/data.test.js +25 -0
  48. package/dist/cjs/utils/data.test.js.map +1 -0
  49. package/dist/cjs/utils/debug.d.ts +2 -0
  50. package/dist/cjs/utils/debug.d.ts.map +1 -0
  51. package/dist/cjs/utils/debug.js +11 -0
  52. package/dist/cjs/utils/debug.js.map +1 -0
  53. package/dist/cjs/utils/deploy.d.ts +32 -0
  54. package/dist/cjs/utils/deploy.d.ts.map +1 -0
  55. package/dist/cjs/utils/deploy.js +62 -0
  56. package/dist/cjs/utils/deploy.js.map +1 -0
  57. package/dist/cjs/utils/deploy.test.d.ts +2 -0
  58. package/dist/cjs/utils/deploy.test.d.ts.map +1 -0
  59. package/dist/cjs/utils/deploy.test.js +22 -0
  60. package/dist/cjs/utils/deploy.test.js.map +1 -0
  61. package/dist/cjs/utils/fee.d.ts +2 -0
  62. package/dist/cjs/utils/fee.d.ts.map +1 -0
  63. package/dist/cjs/utils/fee.js +5 -0
  64. package/dist/cjs/utils/fee.js.map +1 -0
  65. package/dist/cjs/utils/fee.test.d.ts +2 -0
  66. package/dist/cjs/utils/fee.test.d.ts.map +1 -0
  67. package/dist/cjs/utils/fee.test.js +9 -0
  68. package/dist/cjs/utils/fee.test.js.map +1 -0
  69. package/dist/cjs/utils/format.d.ts +33 -0
  70. package/dist/cjs/utils/format.d.ts.map +1 -0
  71. package/dist/cjs/utils/format.js +48 -0
  72. package/dist/cjs/utils/format.js.map +1 -0
  73. package/dist/cjs/utils/format.test.d.ts +2 -0
  74. package/dist/cjs/utils/format.test.d.ts.map +1 -0
  75. package/dist/cjs/utils/format.test.js +25 -0
  76. package/dist/cjs/utils/format.test.js.map +1 -0
  77. package/dist/cjs/utils/hook.d.ts +9 -0
  78. package/dist/cjs/utils/hook.d.ts.map +1 -0
  79. package/dist/cjs/utils/hook.js +44 -0
  80. package/dist/cjs/utils/hook.js.map +1 -0
  81. package/dist/cjs/utils/index.d.ts +13 -0
  82. package/dist/cjs/utils/index.d.ts.map +1 -0
  83. package/dist/cjs/utils/index.js +13 -0
  84. package/dist/cjs/utils/index.js.map +1 -0
  85. package/dist/cjs/utils/ipfs.d.ts +12 -0
  86. package/dist/cjs/utils/ipfs.d.ts.map +1 -0
  87. package/dist/cjs/utils/ipfs.js +26 -0
  88. package/dist/cjs/utils/ipfs.js.map +1 -0
  89. package/dist/cjs/utils/ipfs.test.d.ts +2 -0
  90. package/dist/cjs/utils/ipfs.test.d.ts.map +1 -0
  91. package/dist/cjs/utils/ipfs.test.js +28 -0
  92. package/dist/cjs/utils/ipfs.test.js.map +1 -0
  93. package/dist/cjs/utils/revnet.d.ts +5 -0
  94. package/dist/cjs/utils/revnet.d.ts.map +1 -0
  95. package/dist/cjs/utils/revnet.js +26 -0
  96. package/dist/cjs/utils/revnet.js.map +1 -0
  97. package/dist/cjs/utils/revnet.test.d.ts +2 -0
  98. package/dist/cjs/utils/revnet.test.d.ts.map +1 -0
  99. package/dist/cjs/utils/revnet.test.js +10 -0
  100. package/dist/cjs/utils/revnet.test.js.map +1 -0
  101. package/dist/cjs/utils/ruleset.d.ts +18 -0
  102. package/dist/cjs/utils/ruleset.d.ts.map +1 -0
  103. package/dist/cjs/utils/ruleset.js +23 -0
  104. package/dist/cjs/utils/ruleset.js.map +1 -0
  105. package/dist/cjs/utils/ruleset.test.d.ts +2 -0
  106. package/dist/cjs/utils/ruleset.test.d.ts.map +1 -0
  107. package/dist/cjs/utils/ruleset.test.js +21 -0
  108. package/dist/cjs/utils/ruleset.test.js.map +1 -0
  109. package/dist/cjs/utils/token.d.ts +72 -0
  110. package/dist/cjs/utils/token.d.ts.map +1 -0
  111. package/dist/cjs/utils/token.js +129 -0
  112. package/dist/cjs/utils/token.js.map +1 -0
  113. package/dist/cjs/utils/token.test.d.ts +2 -0
  114. package/dist/cjs/utils/token.test.d.ts.map +1 -0
  115. package/dist/cjs/utils/token.test.js +38 -0
  116. package/dist/cjs/utils/token.test.js.map +1 -0
  117. package/dist/cjs/utils/tx.d.ts +2 -0
  118. package/dist/cjs/utils/tx.d.ts.map +1 -0
  119. package/dist/cjs/utils/tx.js +7 -0
  120. package/dist/cjs/utils/tx.js.map +1 -0
  121. package/dist/cjs/utils/urn.d.ts +8 -0
  122. package/dist/cjs/utils/urn.d.ts.map +1 -0
  123. package/dist/cjs/utils/urn.js +47 -0
  124. package/dist/cjs/utils/urn.js.map +1 -0
  125. package/dist/cjs/utils/urn.test.d.ts +2 -0
  126. package/dist/cjs/utils/urn.test.d.ts.map +1 -0
  127. package/dist/cjs/utils/urn.test.js +112 -0
  128. package/dist/cjs/utils/urn.test.js.map +1 -0
  129. package/dist/esm/actions/JBSuckerAbi.d.ts +32 -0
  130. package/dist/esm/actions/JBSuckerAbi.d.ts.map +1 -0
  131. package/dist/esm/actions/JBSuckerAbi.js +42 -0
  132. package/dist/esm/actions/JBSuckerAbi.js.map +1 -0
  133. package/dist/esm/actions/dataHook.d.ts +29 -0
  134. package/dist/esm/actions/dataHook.d.ts.map +1 -0
  135. package/dist/esm/actions/dataHook.js +81 -0
  136. package/dist/esm/actions/dataHook.js.map +1 -0
  137. package/dist/esm/actions/projectMetadata.d.ts +16 -0
  138. package/dist/esm/actions/projectMetadata.d.ts.map +1 -0
  139. package/dist/esm/actions/projectMetadata.js +37 -0
  140. package/dist/esm/actions/projectMetadata.js.map +1 -0
  141. package/dist/esm/actions/suckerPairs.d.ts +19 -0
  142. package/dist/esm/actions/suckerPairs.d.ts.map +1 -0
  143. package/dist/esm/actions/suckerPairs.js +71 -0
  144. package/dist/esm/actions/suckerPairs.js.map +1 -0
  145. package/dist/esm/constants.d.ts +126 -0
  146. package/dist/esm/constants.d.ts.map +1 -0
  147. package/dist/esm/constants.js +229 -0
  148. package/dist/esm/constants.js.map +1 -0
  149. package/dist/esm/contracts.d.ts +71 -0
  150. package/dist/esm/contracts.d.ts.map +1 -0
  151. package/dist/esm/contracts.js +78 -0
  152. package/dist/esm/contracts.js.map +1 -0
  153. package/dist/esm/generated/juicebox.d.ts +79672 -0
  154. package/dist/esm/generated/juicebox.d.ts.map +1 -0
  155. package/dist/esm/generated/juicebox.js +62354 -0
  156. package/dist/esm/generated/juicebox.js.map +1 -0
  157. package/dist/esm/index.d.ts +9 -0
  158. package/dist/esm/index.d.ts.map +1 -0
  159. package/dist/esm/index.js +9 -0
  160. package/dist/esm/index.js.map +1 -0
  161. package/dist/esm/types.d.ts +120 -0
  162. package/dist/esm/types.d.ts.map +1 -0
  163. package/dist/esm/types.js +31 -0
  164. package/dist/esm/types.js.map +1 -0
  165. package/dist/esm/utils/contracts.d.ts +10 -0
  166. package/dist/esm/utils/contracts.d.ts.map +1 -0
  167. package/dist/esm/utils/contracts.js +28 -0
  168. package/dist/esm/utils/contracts.js.map +1 -0
  169. package/dist/esm/utils/data.d.ts +69 -0
  170. package/dist/esm/utils/data.d.ts.map +1 -0
  171. package/dist/esm/utils/data.js +80 -0
  172. package/dist/esm/utils/data.js.map +1 -0
  173. package/dist/esm/utils/data.test.d.ts +2 -0
  174. package/dist/esm/utils/data.test.d.ts.map +1 -0
  175. package/dist/esm/utils/data.test.js +25 -0
  176. package/dist/esm/utils/data.test.js.map +1 -0
  177. package/dist/esm/utils/debug.d.ts +2 -0
  178. package/dist/esm/utils/debug.d.ts.map +1 -0
  179. package/dist/esm/utils/debug.js +11 -0
  180. package/dist/esm/utils/debug.js.map +1 -0
  181. package/dist/esm/utils/deploy.d.ts +32 -0
  182. package/dist/esm/utils/deploy.d.ts.map +1 -0
  183. package/dist/esm/utils/deploy.js +62 -0
  184. package/dist/esm/utils/deploy.js.map +1 -0
  185. package/dist/esm/utils/deploy.test.d.ts +2 -0
  186. package/dist/esm/utils/deploy.test.d.ts.map +1 -0
  187. package/dist/esm/utils/deploy.test.js +22 -0
  188. package/dist/esm/utils/deploy.test.js.map +1 -0
  189. package/dist/esm/utils/fee.d.ts +2 -0
  190. package/dist/esm/utils/fee.d.ts.map +1 -0
  191. package/dist/esm/utils/fee.js +5 -0
  192. package/dist/esm/utils/fee.js.map +1 -0
  193. package/dist/esm/utils/fee.test.d.ts +2 -0
  194. package/dist/esm/utils/fee.test.d.ts.map +1 -0
  195. package/dist/esm/utils/fee.test.js +9 -0
  196. package/dist/esm/utils/fee.test.js.map +1 -0
  197. package/dist/esm/utils/format.d.ts +33 -0
  198. package/dist/esm/utils/format.d.ts.map +1 -0
  199. package/dist/esm/utils/format.js +48 -0
  200. package/dist/esm/utils/format.js.map +1 -0
  201. package/dist/esm/utils/format.test.d.ts +2 -0
  202. package/dist/esm/utils/format.test.d.ts.map +1 -0
  203. package/dist/esm/utils/format.test.js +25 -0
  204. package/dist/esm/utils/format.test.js.map +1 -0
  205. package/dist/esm/utils/hook.d.ts +9 -0
  206. package/dist/esm/utils/hook.d.ts.map +1 -0
  207. package/dist/esm/utils/hook.js +44 -0
  208. package/dist/esm/utils/hook.js.map +1 -0
  209. package/dist/esm/utils/index.d.ts +13 -0
  210. package/dist/esm/utils/index.d.ts.map +1 -0
  211. package/dist/esm/utils/index.js +13 -0
  212. package/dist/esm/utils/index.js.map +1 -0
  213. package/dist/esm/utils/ipfs.d.ts +12 -0
  214. package/dist/esm/utils/ipfs.d.ts.map +1 -0
  215. package/dist/esm/utils/ipfs.js +26 -0
  216. package/dist/esm/utils/ipfs.js.map +1 -0
  217. package/dist/esm/utils/ipfs.test.d.ts +2 -0
  218. package/dist/esm/utils/ipfs.test.d.ts.map +1 -0
  219. package/dist/esm/utils/ipfs.test.js +28 -0
  220. package/dist/esm/utils/ipfs.test.js.map +1 -0
  221. package/dist/esm/utils/revnet.d.ts +5 -0
  222. package/dist/esm/utils/revnet.d.ts.map +1 -0
  223. package/dist/esm/utils/revnet.js +26 -0
  224. package/dist/esm/utils/revnet.js.map +1 -0
  225. package/dist/esm/utils/revnet.test.d.ts +2 -0
  226. package/dist/esm/utils/revnet.test.d.ts.map +1 -0
  227. package/dist/esm/utils/revnet.test.js +10 -0
  228. package/dist/esm/utils/revnet.test.js.map +1 -0
  229. package/dist/esm/utils/ruleset.d.ts +18 -0
  230. package/dist/esm/utils/ruleset.d.ts.map +1 -0
  231. package/dist/esm/utils/ruleset.js +23 -0
  232. package/dist/esm/utils/ruleset.js.map +1 -0
  233. package/dist/esm/utils/ruleset.test.d.ts +2 -0
  234. package/dist/esm/utils/ruleset.test.d.ts.map +1 -0
  235. package/dist/esm/utils/ruleset.test.js +21 -0
  236. package/dist/esm/utils/ruleset.test.js.map +1 -0
  237. package/dist/esm/utils/token.d.ts +72 -0
  238. package/dist/esm/utils/token.d.ts.map +1 -0
  239. package/dist/esm/utils/token.js +129 -0
  240. package/dist/esm/utils/token.js.map +1 -0
  241. package/dist/esm/utils/token.test.d.ts +2 -0
  242. package/dist/esm/utils/token.test.d.ts.map +1 -0
  243. package/dist/esm/utils/token.test.js +38 -0
  244. package/dist/esm/utils/token.test.js.map +1 -0
  245. package/dist/esm/utils/tx.d.ts +2 -0
  246. package/dist/esm/utils/tx.d.ts.map +1 -0
  247. package/dist/esm/utils/tx.js +7 -0
  248. package/dist/esm/utils/tx.js.map +1 -0
  249. package/dist/esm/utils/urn.d.ts +8 -0
  250. package/dist/esm/utils/urn.d.ts.map +1 -0
  251. package/dist/esm/utils/urn.js +47 -0
  252. package/dist/esm/utils/urn.js.map +1 -0
  253. package/dist/esm/utils/urn.test.d.ts +2 -0
  254. package/dist/esm/utils/urn.test.d.ts.map +1 -0
  255. package/dist/esm/utils/urn.test.js +112 -0
  256. package/dist/esm/utils/urn.test.js.map +1 -0
  257. package/dist/tsconfig.cjs.tsbuildinfo +1 -0
  258. package/dist/tsconfig.tsbuildinfo +1 -0
  259. package/package.json +65 -0
@@ -0,0 +1,129 @@
1
+ import { FixedInt } from "fpnum";
2
+ import { parseUnits } from "viem";
3
+ import { ONE_ETHER, MAX_CASH_OUT_TAX_RATE, MAX_RESERVED_PERCENT, } from "../constants.js";
4
+ /**
5
+ * Return a quote for how much Token B to mint for a given `tokenAAmount`.
6
+ *
7
+ * Useful for when users specify how much they want to spend (Token A).
8
+ *
9
+ * Accounts for the ruleset's `weight` and `reservedPercent`.
10
+ *
11
+ * Returned quote contains:
12
+ * - total tokens to be minted (JB ruleset `weight`).
13
+ * - tokens reserved for project.
14
+ * - tokens minted for the payer.
15
+ */
16
+ export const getTokenAToBQuote = (tokenAAmount, // wei
17
+ cycleParams) => {
18
+ const { weight, reservedPercent } = cycleParams;
19
+ const weightRatio = BigInt(10 ** tokenAAmount.decimals);
20
+ const totalTokens = (weight.value * tokenAAmount.value) / weightRatio;
21
+ const reservedTokens = (weight.value * reservedPercent.value * tokenAAmount.value) /
22
+ BigInt(MAX_RESERVED_PERCENT) /
23
+ weightRatio;
24
+ const payerTokens = totalTokens - reservedTokens;
25
+ return {
26
+ tokenAAmount,
27
+ payerTokens,
28
+ reservedTokens,
29
+ totalTokens,
30
+ };
31
+ };
32
+ /**
33
+ * Return the amount of Token A it costs to buy 1 Token B.
34
+ *
35
+ * Accounts for the ruleset's `weight` and `reservedPercent`.
36
+ */
37
+ export const getTokenBPrice = (tokenADecimals, cycleParams) => {
38
+ const oneTokenA = FixedInt.parse("1", tokenADecimals);
39
+ const weightRatio = BigInt(10 ** tokenADecimals);
40
+ // 1 Token A = x Token B
41
+ const tokenBQuote = getTokenAToBQuote(oneTokenA, cycleParams);
42
+ if (tokenBQuote.payerTokens === 0n)
43
+ return new FixedInt(0n, tokenADecimals);
44
+ const tokenBPrice = (ONE_ETHER * weightRatio) / tokenBQuote.payerTokens;
45
+ return new FixedInt(tokenBPrice, tokenADecimals);
46
+ };
47
+ /**
48
+ * Return the amount of Token A it costs to mint a given `tokenBAmount`.
49
+ *
50
+ * Accounts for the ruleset's `weight` and `reservedPercent`.
51
+ *
52
+ * Useful for when users specify the outcome they want (how much Token B they want).
53
+ */
54
+ export const getTokenBtoAQuote = (tokenBAmount, // wei
55
+ tokenADecimals, cycleParams) => {
56
+ const tokenBPrice = getTokenBPrice(tokenADecimals, cycleParams);
57
+ const oneTokenA = parseUnits("1", tokenADecimals);
58
+ const tokenAQuote = (tokenBPrice.value * tokenBAmount.value) / oneTokenA;
59
+ return new FixedInt(tokenAQuote, tokenADecimals);
60
+ };
61
+ /**
62
+ * Returns the ETH value (in wei) that a given [tokensAmount] can be redeemed for.
63
+ *
64
+ * @note Implements the formula:
65
+ * ```
66
+ * y = ox/s * ( (1 - r) + (x * r /s) )
67
+ * ```
68
+ *
69
+ * Where:
70
+ * - `y` = redeemable amount
71
+ * - `o` = overflow (primaryTerminalCurrentOverflow)
72
+ * - `x` = tokenAmount
73
+ * - `s` = total supply of token (realTotalTokenSupply)
74
+ * - `r` = cashOutTaxRate
75
+ *
76
+ * @implements JBCashOuts.cashOutFrom
77
+ * @see https://github.com/Bananapus/nana-core/blob/44ae030f910e4a40a9a70a1eccf67cb0cf0c80f9/src/libraries/JBCashOuts.sol
78
+ * @see https://www.desmos.com/calculator/sp9ru6zbpk
79
+ * @returns amount in ETH
80
+ */
81
+ export const getTokenCashOutQuoteEth = (tokensAmount, { overflowWei, // surplus
82
+ totalSupply, cashOutTaxRate, tokensReserved, }) => {
83
+ // alias names, to match the contract's implementation for easier manual comparison.
84
+ const surplus = overflowWei;
85
+ const cashOutCount = tokensAmount;
86
+ // If the cash out tax rate is the max, no surplus can be reclaimed.
87
+ if (cashOutTaxRate === MAX_CASH_OUT_TAX_RATE) {
88
+ return 0;
89
+ }
90
+ // If the total supply is being cashed out, return the entire surplus.
91
+ if (cashOutCount >= totalSupply) {
92
+ return surplus;
93
+ }
94
+ //
95
+ /**
96
+ * totalOutstandingTokensOf in contract.
97
+ * @note this deviates from the contract's `cashOutFrom` implementation.
98
+ */
99
+ const realTotalSupply = totalSupply + tokensReserved;
100
+ /**
101
+ * Get a reference to the linear proportion.
102
+ * ```
103
+ * base = ox/s
104
+ * ```
105
+ */
106
+ const base = (surplus * cashOutCount) / realTotalSupply;
107
+ /**
108
+ * These conditions are all part of the same curve.
109
+ * Edge conditions are separated to minimize the operations performed in those cases.
110
+ */
111
+ if (cashOutTaxRate === 0) {
112
+ return base;
113
+ }
114
+ const frac = (BigInt(cashOutTaxRate) * cashOutCount) / realTotalSupply;
115
+ /**
116
+ * ```
117
+ * numerator = (1 - r) + (x * r / s)
118
+ * ```
119
+ */
120
+ const numerator = BigInt(MAX_CASH_OUT_TAX_RATE - cashOutTaxRate) + frac;
121
+ /**
122
+ * ```
123
+ * y = base * numerator ==> ox/s * ( (1 - r) + (x * r / s) )
124
+ * ```
125
+ */
126
+ const y = (base * numerator) / BigInt(MAX_CASH_OUT_TAX_RATE);
127
+ return y;
128
+ };
129
+ //# sourceMappingURL=token.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token.js","sourceRoot":"","sources":["../../../src/utils/token.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=token.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token.test.d.ts","sourceRoot":"","sources":["../../../src/utils/token.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,38 @@
1
+ import { FixedInt } from "fpnum";
2
+ import { parseEther, parseUnits } from "viem";
3
+ import { describe, expect, test } from "vitest";
4
+ import { ReservedPercent } from "./data.js";
5
+ import { getTokenAToBQuote, getTokenBPrice } from "./token.js";
6
+ describe("token", () => {
7
+ describe("getTokenAToBQuote", () => {
8
+ test.each `
9
+ tokenAAmount | tokenADecimals | expectedPayerTokens
10
+ ${1000000n} | ${6} | ${parseUnits("1", 18)}
11
+ ${parseEther("1")} | ${18} | ${parseUnits("1", 18)}
12
+ `("should return the correct token B quote when amount is $tokenAAmount and decimals is $tokenADecimals", ({ tokenAAmount, tokenADecimals, expectedPayerTokens }) => {
13
+ const weight = FixedInt.parse("1", 18); // 1 token per USDC
14
+ const reservedPercent = new ReservedPercent(0);
15
+ const { payerTokens } = getTokenAToBQuote(new FixedInt(tokenAAmount, tokenADecimals), {
16
+ weight,
17
+ reservedPercent,
18
+ });
19
+ expect(payerTokens).toEqual(expectedPayerTokens);
20
+ });
21
+ test.each `
22
+ tokenADecimals | weight | expectedTokenBPrice
23
+ ${18} | ${FixedInt.parse("1", 18)} | ${parseUnits("1", 18)}
24
+ ${6} | ${FixedInt.parse("1", 18)} | ${parseUnits("1", 6)}
25
+ ${18} | ${FixedInt.parse("0.5", 18)} | ${parseUnits("2", 18)}
26
+ ${6} | ${FixedInt.parse("0.5", 18)} | ${parseUnits("2", 6)}
27
+ ${6} | ${FixedInt.parse("0.8", 18)} | ${parseUnits("1.25", 6)}
28
+ `("should return the correct token A quote when amount is $tokenBAmount and decimals is $tokenADecimals", ({ tokenADecimals, expectedTokenBPrice, weight }) => {
29
+ const reservedPercent = new ReservedPercent(0);
30
+ const tokenBPrice = getTokenBPrice(tokenADecimals, {
31
+ weight,
32
+ reservedPercent,
33
+ });
34
+ expect(tokenBPrice.value).toBe(expectedTokenBPrice);
35
+ });
36
+ });
37
+ });
38
+ //# sourceMappingURL=token.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token.test.js","sourceRoot":"","sources":["../../../src/utils/token.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE/D,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE;IACrB,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;QACjC,IAAI,CAAC,IAAI,CAAA;;QAEL,QAAQ,aAAa,CAAC,gBAAgB,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC;QACzD,UAAU,CAAC,GAAG,CAAC,MAAM,EAAE,eAAe,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC;KAC5D,CACC,sGAAsG,EACtG,CAAC,EAAE,YAAY,EAAE,cAAc,EAAE,mBAAmB,EAAE,EAAE,EAAE;YACxD,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAK,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,mBAAmB;YAC/D,MAAM,eAAe,GAAG,IAAI,eAAe,CAAC,CAAC,CAAC,CAAC;YAC/C,MAAM,EAAE,WAAW,EAAE,GAAG,iBAAiB,CACvC,IAAI,QAAQ,CAAC,YAAY,EAAE,cAAc,CAAC,EAC1C;gBACE,MAAM;gBACN,eAAe;aAChB,CACF,CAAC;YACF,MAAM,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;QACnD,CAAC,CACF,CAAC;QAEF,IAAI,CAAC,IAAI,CAAA;;QAEL,EAAE,eAAe,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,CAAC,QAAQ,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC;QACnE,CAAC,gBAAgB,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,CAAC,QAAQ,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC;QAClE,EAAE,eAAe,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC;QACnE,CAAC,gBAAgB,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC;QAClE,CAAC,gBAAgB,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;KACxE,CACC,sGAAsG,EACtG,CAAC,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,EAAE,EAAE,EAAE;YAClD,MAAM,eAAe,GAAG,IAAI,eAAe,CAAC,CAAC,CAAC,CAAC;YAC/C,MAAM,WAAW,GAAG,cAAc,CAAC,cAAc,EAAE;gBACjD,MAAM;gBACN,eAAe;aAChB,CAAC,CAAC;YAEH,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QACtD,CAAC,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function createSalt(): `0x${string}`;
2
+ //# sourceMappingURL=tx.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tx.d.ts","sourceRoot":"","sources":["../../../src/utils/tx.ts"],"names":[],"mappings":"AAEA,wBAAgB,UAAU,kBAKzB"}
@@ -0,0 +1,7 @@
1
+ import { toBytes, toHex } from "viem";
2
+ export function createSalt() {
3
+ const base = "0x" + Math.random().toString(16).slice(2); // idk lol
4
+ const salt = toHex(toBytes(base, { size: 32 }));
5
+ return salt;
6
+ }
7
+ //# sourceMappingURL=tx.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tx.js","sourceRoot":"","sources":["../../../src/utils/tx.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,MAAM,CAAC;AAEtC,MAAM,UAAU,UAAU;IACxB,MAAM,IAAI,GAAW,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU;IAC3E,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IAEhD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { JBChainId, JBVersion } from "../types.js";
2
+ export declare function jbUrn(urn: string): {
3
+ chainId: JBChainId;
4
+ projectId: bigint;
5
+ version: JBVersion;
6
+ } | null;
7
+ export declare function toJbUrn(chainId: JBChainId, projectId: bigint): string | null;
8
+ //# sourceMappingURL=urn.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"urn.d.ts","sourceRoot":"","sources":["../../../src/utils/urn.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAEnD,wBAAgB,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG;IAClC,OAAO,EAAE,SAAS,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,SAAS,CAAC;CACpB,GAAG,IAAI,CAiCP;AAED,wBAAgB,OAAO,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAS5E"}
@@ -0,0 +1,47 @@
1
+ import { JB_CHAIN_SLUGS } from "../constants.js";
2
+ export function jbUrn(urn) {
3
+ try {
4
+ const urlParts = urn.split(":").map((part) => part.trim());
5
+ if (urlParts.length < 2 || urlParts.length > 3)
6
+ return null;
7
+ let chainSlug;
8
+ let version;
9
+ let projectId;
10
+ if (urlParts.length === 2) {
11
+ // default to v4 [/eth:3]
12
+ version = 4;
13
+ chainSlug = urlParts[0];
14
+ projectId = urlParts[1];
15
+ }
16
+ else {
17
+ // with version [/v5:eth:3]
18
+ if (!urlParts[0].startsWith("v"))
19
+ return null;
20
+ version = Number(urlParts[0].replace("v", ""));
21
+ chainSlug = urlParts[1];
22
+ projectId = urlParts[2];
23
+ }
24
+ const chain = JB_CHAIN_SLUGS[chainSlug];
25
+ if (!chain || !projectId || !isValidVersion(version))
26
+ return null;
27
+ return {
28
+ chainId: chain.chain.id,
29
+ projectId: BigInt(projectId),
30
+ version,
31
+ };
32
+ }
33
+ catch (e) {
34
+ return null;
35
+ }
36
+ }
37
+ export function toJbUrn(chainId, projectId) {
38
+ const chain = Object.values(JB_CHAIN_SLUGS).find((chain) => chain.chain.id === chainId);
39
+ if (!chain) {
40
+ return null;
41
+ }
42
+ return `${chain.slug}:${projectId}`;
43
+ }
44
+ function isValidVersion(version) {
45
+ return version === 4 || version === 5 || version === 6;
46
+ }
47
+ //# sourceMappingURL=urn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"urn.js","sourceRoot":"","sources":["../../../src/utils/urn.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAGjD,MAAM,UAAU,KAAK,CAAC,GAAW;IAK/B,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAC3D,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QAE5D,IAAI,SAA6B,CAAC;QAClC,IAAI,OAA2B,CAAC;QAChC,IAAI,SAA6B,CAAC;QAElC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,yBAAyB;YACzB,OAAO,GAAG,CAAC,CAAC;YACZ,SAAS,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;YACxB,SAAS,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC1B,CAAC;aAAM,CAAC;YACN,2BAA2B;YAC3B,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC;gBAAE,OAAO,IAAI,CAAC;YAC9C,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;YAC/C,SAAS,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;YACxB,SAAS,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC1B,CAAC;QAED,MAAM,KAAK,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;QACxC,IAAI,CAAC,KAAK,IAAI,CAAC,SAAS,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC;YAAE,OAAO,IAAI,CAAC;QAElE,OAAO;YACL,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,EAAe;YACpC,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC;YAC5B,OAAO;SACR,CAAC;IACJ,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,OAAkB,EAAE,SAAiB;IAC3D,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAC9C,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,KAAK,OAAO,CACtC,CAAC;IACF,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,GAAG,KAAK,CAAC,IAAI,IAAI,SAAS,EAAE,CAAC;AACtC,CAAC;AAED,SAAS,cAAc,CAAC,OAAe;IACrC,OAAO,OAAO,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,CAAC;AACzD,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=urn.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"urn.test.d.ts","sourceRoot":"","sources":["../../../src/utils/urn.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,112 @@
1
+ import { arbitrum, base, mainnet, optimism, sepolia } from "viem/chains";
2
+ import { describe, expect, it } from "vitest";
3
+ import { jbUrn } from "./urn.js";
4
+ describe("jbUrn", () => {
5
+ describe("valid URNs", () => {
6
+ it("should parse /eth:3 as mainnet project id 3, version 4", () => {
7
+ const result = jbUrn("eth:3");
8
+ expect(result).toEqual({
9
+ chainId: mainnet.id,
10
+ projectId: 3n,
11
+ version: 4,
12
+ });
13
+ });
14
+ it("should parse /v5:eth:5 as mainnet project id 5, version 5", () => {
15
+ const result = jbUrn("v5:eth:5");
16
+ expect(result).toEqual({
17
+ chainId: mainnet.id,
18
+ projectId: 5n,
19
+ version: 5,
20
+ });
21
+ });
22
+ it("should parse large project IDs correctly", () => {
23
+ const result = jbUrn("eth:999999999999999999");
24
+ expect(result).toEqual({
25
+ chainId: mainnet.id,
26
+ projectId: 999999999999999999n,
27
+ version: 4,
28
+ });
29
+ });
30
+ });
31
+ describe("supported chains", () => {
32
+ const chainTests = [
33
+ { slug: "eth", chainId: mainnet.id, name: "Ethereum mainnet" },
34
+ { slug: "sep", chainId: sepolia.id, name: "Sepolia testnet" },
35
+ { slug: "op", chainId: optimism.id, name: "Optimism" },
36
+ { slug: "base", chainId: base.id, name: "Base" },
37
+ { slug: "arb", chainId: arbitrum.id, name: "Arbitrum" },
38
+ ];
39
+ chainTests.forEach(({ slug, chainId, name }) => {
40
+ it(`should parse ${name} (${slug}) correctly`, () => {
41
+ const result = jbUrn(`${slug}:42`);
42
+ expect(result).toEqual({ chainId, projectId: 42n, version: 4 });
43
+ });
44
+ });
45
+ });
46
+ describe("version validation", () => {
47
+ it("should accept versions 4, 5 and 6, default to 4", () => {
48
+ expect(jbUrn("v4:eth:1")?.version).toBe(4);
49
+ expect(jbUrn("v5:eth:1")?.version).toBe(5);
50
+ expect(jbUrn("v6:eth:1")?.version).toBe(6);
51
+ expect(jbUrn("eth:1")?.version).toBe(4); // default
52
+ });
53
+ it("should reject invalid versions", () => {
54
+ expect(jbUrn("v1:eth:3")).toBeNull();
55
+ expect(jbUrn("v7:eth:3")).toBeNull();
56
+ expect(jbUrn("v0:eth:3")).toBeNull();
57
+ });
58
+ });
59
+ describe("invalid URNs", () => {
60
+ it("should return null for invalid version format", () => {
61
+ expect(jbUrn("version5:eth:3")).toBeNull();
62
+ expect(jbUrn("5:eth:3")).toBeNull();
63
+ expect(jbUrn("V5:eth:3")).toBeNull();
64
+ expect(jbUrn("v5a:eth:3")).toBeNull();
65
+ });
66
+ it("should return null for unknown chain names", () => {
67
+ expect(jbUrn("bitcoin:3")).toBeNull();
68
+ expect(jbUrn("ethereum:3")).toBeNull();
69
+ expect(jbUrn("ETH:3")).toBeNull();
70
+ });
71
+ it("should return null for malformed URLs", () => {
72
+ expect(jbUrn("")).toBeNull();
73
+ expect(jbUrn("eth:")).toBeNull();
74
+ expect(jbUrn(":3")).toBeNull();
75
+ expect(jbUrn("v5:eth:3:extra")).toBeNull();
76
+ expect(jbUrn("eth")).toBeNull();
77
+ });
78
+ it("should handle invalid project IDs", () => {
79
+ expect(jbUrn("eth:abc")).toBeNull();
80
+ expect(jbUrn("eth:3.14")).toBeNull();
81
+ // 0x123 = 291
82
+ expect(jbUrn("eth:0x123")).toEqual({
83
+ chainId: mainnet.id,
84
+ projectId: 291n,
85
+ version: 4,
86
+ });
87
+ });
88
+ });
89
+ describe("edge cases", () => {
90
+ it("should handle whitespace by trimming", () => {
91
+ expect(jbUrn(" eth:3")).toEqual({
92
+ chainId: mainnet.id,
93
+ projectId: 3n,
94
+ version: 4,
95
+ });
96
+ expect(jbUrn("v5: eth : 3 ")).toEqual({
97
+ chainId: mainnet.id,
98
+ projectId: 3n,
99
+ version: 5,
100
+ });
101
+ });
102
+ it("should handle numeric edge cases", () => {
103
+ expect(jbUrn("eth:0003")?.projectId).toBe(3n);
104
+ expect(jbUrn("eth:0")?.projectId).toBe(0n);
105
+ });
106
+ it("should reject invalid formats", () => {
107
+ expect(jbUrn("eth-test:3")).toBeNull();
108
+ expect(jbUrn("a".repeat(1000) + ":1")).toBeNull();
109
+ });
110
+ });
111
+ });
112
+ //# sourceMappingURL=urn.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"urn.test.js","sourceRoot":"","sources":["../../../src/utils/urn.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ export declare const JBSuckerAbi: readonly [{
2
+ readonly type: "function";
3
+ readonly name: "peer";
4
+ readonly inputs: readonly [];
5
+ readonly outputs: readonly [{
6
+ readonly name: "";
7
+ readonly type: "address";
8
+ readonly internalType: "contract IJBSucker";
9
+ }];
10
+ readonly stateMutability: "view";
11
+ }, {
12
+ readonly type: "function";
13
+ readonly name: "projectId";
14
+ readonly inputs: readonly [];
15
+ readonly outputs: readonly [{
16
+ readonly name: "";
17
+ readonly type: "uint256";
18
+ readonly internalType: "uint256";
19
+ }];
20
+ readonly stateMutability: "view";
21
+ }, {
22
+ readonly type: "function";
23
+ readonly name: "peerChainId";
24
+ readonly inputs: readonly [];
25
+ readonly outputs: readonly [{
26
+ readonly name: "";
27
+ readonly type: "uint256";
28
+ readonly internalType: "uint256";
29
+ }];
30
+ readonly stateMutability: "view";
31
+ }];
32
+ //# sourceMappingURL=JBSuckerAbi.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JBSuckerAbi.d.ts","sourceRoot":"","sources":["../../../src/actions/JBSuckerAbi.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAwCd,CAAC"}
@@ -0,0 +1,42 @@
1
+ export const JBSuckerAbi = [
2
+ {
3
+ type: "function",
4
+ name: "peer",
5
+ inputs: [],
6
+ outputs: [
7
+ {
8
+ name: "",
9
+ type: "address",
10
+ internalType: "contract IJBSucker",
11
+ },
12
+ ],
13
+ stateMutability: "view",
14
+ },
15
+ {
16
+ type: "function",
17
+ name: "projectId",
18
+ inputs: [],
19
+ outputs: [
20
+ {
21
+ name: "",
22
+ type: "uint256",
23
+ internalType: "uint256",
24
+ },
25
+ ],
26
+ stateMutability: "view",
27
+ },
28
+ {
29
+ type: "function",
30
+ name: "peerChainId",
31
+ inputs: [],
32
+ outputs: [
33
+ {
34
+ name: "",
35
+ type: "uint256",
36
+ internalType: "uint256",
37
+ },
38
+ ],
39
+ stateMutability: "view",
40
+ },
41
+ ];
42
+ //# sourceMappingURL=JBSuckerAbi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JBSuckerAbi.js","sourceRoot":"","sources":["../../../src/actions/JBSuckerAbi.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB;QACE,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,MAAM;QACZ,MAAM,EAAE,EAAE;QACV,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,EAAE;gBACR,IAAI,EAAE,SAAS;gBACf,YAAY,EAAE,oBAAoB;aACnC;SACF;QACD,eAAe,EAAE,MAAM;KACxB;IACD;QACE,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,WAAW;QACjB,MAAM,EAAE,EAAE;QACV,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,EAAE;gBACR,IAAI,EAAE,SAAS;gBACf,YAAY,EAAE,SAAS;aACxB;SACF;QACD,eAAe,EAAE,MAAM;KACxB;IACD;QACE,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,aAAa;QACnB,MAAM,EAAE,EAAE;QACV,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,EAAE;gBACR,IAAI,EAAE,SAAS;gBACf,YAAY,EAAE,SAAS;aACxB;SACF;QACD,eAAe,EAAE,MAAM;KACxB;CACO,CAAC"}
@@ -0,0 +1,29 @@
1
+ import { JBVersion } from "../types.js";
2
+ import { Address, PublicClient } from "viem";
3
+ /**
4
+ * Find the 721 data hook for a given project and ruleset.
5
+ *
6
+ * NOTE this is an expensive call. Best to run it server-side and cache it.
7
+ */
8
+ export declare function find721DataHook(publicClient: PublicClient, args: {
9
+ dataHookAddress: Address;
10
+ projectId: bigint;
11
+ rulesetId: number;
12
+ version: JBVersion;
13
+ }): Promise<`0x${string}` | null>;
14
+ export declare function getHookSpecifications(publicClient: PublicClient, args: {
15
+ dataHookAddress: Address;
16
+ projectId: bigint;
17
+ rulesetId: number;
18
+ version: JBVersion;
19
+ }): Promise<readonly {
20
+ hook: `0x${string}`;
21
+ noop: boolean;
22
+ amount: bigint;
23
+ metadata: `0x${string}`;
24
+ }[] | readonly {
25
+ hook: `0x${string}`;
26
+ amount: bigint;
27
+ metadata: `0x${string}`;
28
+ }[]>;
29
+ //# sourceMappingURL=dataHook.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dataHook.d.ts","sourceRoot":"","sources":["../../../src/actions/dataHook.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6D,SAAS,EAAE,MAAM,aAAa,CAAC;AAEnG,OAAO,EAAE,OAAO,EAAE,YAAY,EAA4C,MAAM,MAAM,CAAC;AAQvF;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,YAAY,EAAE,YAAY,EAC1B,IAAI,EAAE;IACJ,eAAe,EAAE,OAAO,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,SAAS,CAAC;CACpB,iCA4DF;AAED,wBAAsB,qBAAqB,CACzC,YAAY,EAAE,YAAY,EAC1B,IAAI,EAAE;IACJ,eAAe,EAAE,OAAO,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,SAAS,CAAC;CACpB;;;;;;;;;KAgCF"}
@@ -0,0 +1,81 @@
1
+ import { JB721HookContracts, JBAddressRegistryContracts } from "../types.js";
2
+ import { getJBContractAddress } from "../utils/contracts.js";
3
+ import { getContract, isAddressEqual, zeroAddress } from "viem";
4
+ import { jb721TiersHookAbi, jb721TiersHookV5Abi, jbAddressRegistryAbi, } from "../generated/juicebox.js";
5
+ import { debug } from "../utils/debug.js";
6
+ /**
7
+ * Find the 721 data hook for a given project and ruleset.
8
+ *
9
+ * NOTE this is an expensive call. Best to run it server-side and cache it.
10
+ */
11
+ export async function find721DataHook(publicClient, args) {
12
+ const chainId = publicClient.chain?.id;
13
+ if (!chainId) {
14
+ throw new Error("[@bananapus/nana-sdk-core] No chain ID on public client.");
15
+ }
16
+ const deployerAddress = getJBContractAddress(JB721HookContracts.JB721TiersHookDeployer, args.version, chainId);
17
+ const registerAddress = getJBContractAddress(JBAddressRegistryContracts.JBAddressRegistry, args.version, chainId);
18
+ if (!registerAddress) {
19
+ throw new Error(`[@bananapus/nana-sdk-core] No JBAddressRegistry address for chain ${chainId}.`);
20
+ }
21
+ const registry = getContract({
22
+ address: registerAddress,
23
+ abi: jbAddressRegistryAbi,
24
+ client: publicClient,
25
+ });
26
+ debug("🧃 getHookSpecifications::args", {
27
+ dataHookAddress: args.dataHookAddress,
28
+ projectId: args.projectId,
29
+ rulesetId: args.rulesetId,
30
+ });
31
+ const hookSpecs = await getHookSpecifications(publicClient, {
32
+ dataHookAddress: args.dataHookAddress,
33
+ projectId: args.projectId,
34
+ rulesetId: args.rulesetId,
35
+ version: args.version,
36
+ });
37
+ const res = await Promise.all(hookSpecs.map(async (h) => {
38
+ const deployerOf = await registry.read.deployerOf([h.hook]);
39
+ debug("🧃 deployerOf", {
40
+ hook: h.hook,
41
+ deployerOf,
42
+ deployerAddress,
43
+ });
44
+ return isAddressEqual(deployerOf, deployerAddress);
45
+ }));
46
+ const index = res.findIndex((r) => r);
47
+ if (index === -1) {
48
+ return null;
49
+ }
50
+ return hookSpecs[index].hook;
51
+ }
52
+ export async function getHookSpecifications(publicClient, args) {
53
+ // v6's returned JBPayHookSpecification gained a `noop` field, so the v4/v5 response
54
+ // doesn't decode with the v6 ABI.
55
+ const dataHook = getContract({
56
+ address: args.dataHookAddress,
57
+ abi: args.version === 6 ? jb721TiersHookAbi : jb721TiersHookV5Abi,
58
+ client: publicClient,
59
+ });
60
+ const [_, hookSpecifications] = await dataHook.read.beforePayRecordedWith([
61
+ {
62
+ projectId: args.projectId,
63
+ rulesetId: BigInt(args.rulesetId), // TODO update the ABI to be a number, will fix this.
64
+ terminal: zeroAddress,
65
+ beneficiary: zeroAddress,
66
+ amount: {
67
+ token: zeroAddress,
68
+ value: 0n,
69
+ decimals: 0,
70
+ currency: 0,
71
+ },
72
+ payer: zeroAddress,
73
+ weight: 0n,
74
+ reservedPercent: 0n,
75
+ metadata: zeroAddress,
76
+ },
77
+ ]);
78
+ debug("🧃 getHookSpecifications", { args, hookSpecifications });
79
+ return hookSpecifications;
80
+ }
81
+ //# sourceMappingURL=dataHook.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dataHook.js","sourceRoot":"","sources":["../../../src/actions/dataHook.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { Address, PublicClient } from "viem";
2
+ import { JBProjectMetadata } from "../types.js";
3
+ /**
4
+ * Fetch the project metadata for the given [projectId]
5
+ * @param publicClient - The Viem Public Client to use for fetching on-chain data.
6
+ * @link https://viem.sh/docs/clients/public.html
7
+ * @param opts.ipfsGatewayHostname - The hostname of the IPFS gateway to use. Defaults to "ipfs.io"
8
+ *
9
+ */
10
+ export declare const getProjectMetadata: (publicClient: PublicClient, args: {
11
+ jbControllerAddress: Address;
12
+ projectId: bigint;
13
+ }, opts?: {
14
+ ipfsGatewayHostname?: string;
15
+ }) => Promise<JBProjectMetadata | undefined>;
16
+ //# sourceMappingURL=projectMetadata.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projectMetadata.d.ts","sourceRoot":"","sources":["../../../src/actions/projectMetadata.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,EACP,YAAY,EAIb,MAAM,MAAM,CAAC;AAEd,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AA+BhD;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,GAC7B,cAAc,YAAY,EAC1B,MAAM;IACJ,mBAAmB,EAAE,OAAO,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;CACnB,EACD,OAAO;IACL,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B,KACA,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAWvC,CAAC"}