@bananapus/nana-sdk-core 1.0.0 → 1.1.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 (243) hide show
  1. package/dist/cjs/v6/cashOut.d.ts +83 -0
  2. package/dist/cjs/v6/cashOut.d.ts.map +1 -0
  3. package/dist/cjs/v6/cashOut.js +68 -0
  4. package/dist/cjs/v6/cashOut.js.map +1 -0
  5. package/dist/cjs/v6/cashOut.test.d.ts +2 -0
  6. package/dist/cjs/v6/cashOut.test.d.ts.map +1 -0
  7. package/dist/cjs/v6/cashOut.test.js +100 -0
  8. package/dist/cjs/v6/cashOut.test.js.map +1 -0
  9. package/dist/cjs/v6/currency.d.ts +43 -0
  10. package/dist/cjs/v6/currency.d.ts.map +1 -0
  11. package/dist/cjs/v6/currency.js +44 -0
  12. package/dist/cjs/v6/currency.js.map +1 -0
  13. package/dist/cjs/v6/currency.test.d.ts +2 -0
  14. package/dist/cjs/v6/currency.test.d.ts.map +1 -0
  15. package/dist/cjs/v6/currency.test.js +24 -0
  16. package/dist/cjs/v6/currency.test.js.map +1 -0
  17. package/dist/cjs/v6/fees.d.ts +43 -0
  18. package/dist/cjs/v6/fees.d.ts.map +1 -0
  19. package/dist/cjs/v6/fees.js +51 -0
  20. package/dist/cjs/v6/fees.js.map +1 -0
  21. package/dist/cjs/v6/fees.test.d.ts +2 -0
  22. package/dist/cjs/v6/fees.test.d.ts.map +1 -0
  23. package/dist/cjs/v6/fees.test.js +38 -0
  24. package/dist/cjs/v6/fees.test.js.map +1 -0
  25. package/dist/cjs/v6/index.d.ts +16 -0
  26. package/dist/cjs/v6/index.d.ts.map +1 -0
  27. package/dist/cjs/v6/index.js +16 -0
  28. package/dist/cjs/v6/index.js.map +1 -0
  29. package/dist/cjs/v6/launch.d.ts +2754 -0
  30. package/dist/cjs/v6/launch.d.ts.map +1 -0
  31. package/dist/cjs/v6/launch.js +176 -0
  32. package/dist/cjs/v6/launch.js.map +1 -0
  33. package/dist/cjs/v6/launch.test.d.ts +2 -0
  34. package/dist/cjs/v6/launch.test.d.ts.map +1 -0
  35. package/dist/cjs/v6/launch.test.js +135 -0
  36. package/dist/cjs/v6/launch.test.js.map +1 -0
  37. package/dist/cjs/v6/loans.d.ts +176 -0
  38. package/dist/cjs/v6/loans.d.ts.map +1 -0
  39. package/dist/cjs/v6/loans.js +170 -0
  40. package/dist/cjs/v6/loans.js.map +1 -0
  41. package/dist/cjs/v6/loans.test.d.ts +2 -0
  42. package/dist/cjs/v6/loans.test.d.ts.map +1 -0
  43. package/dist/cjs/v6/loans.test.js +127 -0
  44. package/dist/cjs/v6/loans.test.js.map +1 -0
  45. package/dist/cjs/v6/omnichain.d.ts +10997 -0
  46. package/dist/cjs/v6/omnichain.d.ts.map +1 -0
  47. package/dist/cjs/v6/omnichain.js +116 -0
  48. package/dist/cjs/v6/omnichain.js.map +1 -0
  49. package/dist/cjs/v6/omnichain.test.d.ts +2 -0
  50. package/dist/cjs/v6/omnichain.test.d.ts.map +1 -0
  51. package/dist/cjs/v6/omnichain.test.js +143 -0
  52. package/dist/cjs/v6/omnichain.test.js.map +1 -0
  53. package/dist/cjs/v6/pay.d.ts +110 -0
  54. package/dist/cjs/v6/pay.d.ts.map +1 -0
  55. package/dist/cjs/v6/pay.js +106 -0
  56. package/dist/cjs/v6/pay.js.map +1 -0
  57. package/dist/cjs/v6/pay.test.d.ts +2 -0
  58. package/dist/cjs/v6/pay.test.d.ts.map +1 -0
  59. package/dist/cjs/v6/pay.test.js +128 -0
  60. package/dist/cjs/v6/pay.test.js.map +1 -0
  61. package/dist/cjs/v6/permissions.d.ts +128 -0
  62. package/dist/cjs/v6/permissions.d.ts.map +1 -0
  63. package/dist/cjs/v6/permissions.js +120 -0
  64. package/dist/cjs/v6/permissions.js.map +1 -0
  65. package/dist/cjs/v6/permissions.test.d.ts +2 -0
  66. package/dist/cjs/v6/permissions.test.d.ts.map +1 -0
  67. package/dist/cjs/v6/permissions.test.js +115 -0
  68. package/dist/cjs/v6/permissions.test.js.map +1 -0
  69. package/dist/cjs/v6/revnets.d.ts +4457 -0
  70. package/dist/cjs/v6/revnets.d.ts.map +1 -0
  71. package/dist/cjs/v6/revnets.js +161 -0
  72. package/dist/cjs/v6/revnets.js.map +1 -0
  73. package/dist/cjs/v6/revnets.test.d.ts +2 -0
  74. package/dist/cjs/v6/revnets.test.d.ts.map +1 -0
  75. package/dist/cjs/v6/revnets.test.js +231 -0
  76. package/dist/cjs/v6/revnets.test.js.map +1 -0
  77. package/dist/cjs/v6/rulesets.d.ts +2700 -0
  78. package/dist/cjs/v6/rulesets.d.ts.map +1 -0
  79. package/dist/cjs/v6/rulesets.js +70 -0
  80. package/dist/cjs/v6/rulesets.js.map +1 -0
  81. package/dist/cjs/v6/rulesets.test.d.ts +2 -0
  82. package/dist/cjs/v6/rulesets.test.d.ts.map +1 -0
  83. package/dist/cjs/v6/rulesets.test.js +104 -0
  84. package/dist/cjs/v6/rulesets.test.js.map +1 -0
  85. package/dist/cjs/v6/splits.d.ts +2670 -0
  86. package/dist/cjs/v6/splits.d.ts.map +1 -0
  87. package/dist/cjs/v6/splits.js +105 -0
  88. package/dist/cjs/v6/splits.js.map +1 -0
  89. package/dist/cjs/v6/splits.test.d.ts +2 -0
  90. package/dist/cjs/v6/splits.test.d.ts.map +1 -0
  91. package/dist/cjs/v6/splits.test.js +131 -0
  92. package/dist/cjs/v6/splits.test.js.map +1 -0
  93. package/dist/cjs/v6/suckers.d.ts +247 -0
  94. package/dist/cjs/v6/suckers.d.ts.map +1 -0
  95. package/dist/cjs/v6/suckers.js +156 -0
  96. package/dist/cjs/v6/suckers.js.map +1 -0
  97. package/dist/cjs/v6/suckers.test.d.ts +2 -0
  98. package/dist/cjs/v6/suckers.test.d.ts.map +1 -0
  99. package/dist/cjs/v6/suckers.test.js +132 -0
  100. package/dist/cjs/v6/suckers.test.js.map +1 -0
  101. package/dist/cjs/v6/terminals.d.ts +67 -0
  102. package/dist/cjs/v6/terminals.d.ts.map +1 -0
  103. package/dist/cjs/v6/terminals.js +50 -0
  104. package/dist/cjs/v6/terminals.js.map +1 -0
  105. package/dist/cjs/v6/terminals.test.d.ts +2 -0
  106. package/dist/cjs/v6/terminals.test.d.ts.map +1 -0
  107. package/dist/cjs/v6/terminals.test.js +57 -0
  108. package/dist/cjs/v6/terminals.test.js.map +1 -0
  109. package/dist/cjs/v6/tokens.d.ts +194 -0
  110. package/dist/cjs/v6/tokens.d.ts.map +1 -0
  111. package/dist/cjs/v6/tokens.js +161 -0
  112. package/dist/cjs/v6/tokens.js.map +1 -0
  113. package/dist/cjs/v6/tokens.test.d.ts +2 -0
  114. package/dist/cjs/v6/tokens.test.d.ts.map +1 -0
  115. package/dist/cjs/v6/tokens.test.js +139 -0
  116. package/dist/cjs/v6/tokens.test.js.map +1 -0
  117. package/dist/cjs/v6/types.d.ts +12 -0
  118. package/dist/cjs/v6/types.d.ts.map +1 -0
  119. package/dist/cjs/v6/types.js +12 -0
  120. package/dist/cjs/v6/types.js.map +1 -0
  121. package/dist/esm/v6/cashOut.d.ts +83 -0
  122. package/dist/esm/v6/cashOut.d.ts.map +1 -0
  123. package/dist/esm/v6/cashOut.js +68 -0
  124. package/dist/esm/v6/cashOut.js.map +1 -0
  125. package/dist/esm/v6/cashOut.test.d.ts +2 -0
  126. package/dist/esm/v6/cashOut.test.d.ts.map +1 -0
  127. package/dist/esm/v6/cashOut.test.js +100 -0
  128. package/dist/esm/v6/cashOut.test.js.map +1 -0
  129. package/dist/esm/v6/currency.d.ts +43 -0
  130. package/dist/esm/v6/currency.d.ts.map +1 -0
  131. package/dist/esm/v6/currency.js +44 -0
  132. package/dist/esm/v6/currency.js.map +1 -0
  133. package/dist/esm/v6/currency.test.d.ts +2 -0
  134. package/dist/esm/v6/currency.test.d.ts.map +1 -0
  135. package/dist/esm/v6/currency.test.js +24 -0
  136. package/dist/esm/v6/currency.test.js.map +1 -0
  137. package/dist/esm/v6/fees.d.ts +43 -0
  138. package/dist/esm/v6/fees.d.ts.map +1 -0
  139. package/dist/esm/v6/fees.js +51 -0
  140. package/dist/esm/v6/fees.js.map +1 -0
  141. package/dist/esm/v6/fees.test.d.ts +2 -0
  142. package/dist/esm/v6/fees.test.d.ts.map +1 -0
  143. package/dist/esm/v6/fees.test.js +38 -0
  144. package/dist/esm/v6/fees.test.js.map +1 -0
  145. package/dist/esm/v6/index.d.ts +16 -0
  146. package/dist/esm/v6/index.d.ts.map +1 -0
  147. package/dist/esm/v6/index.js +16 -0
  148. package/dist/esm/v6/index.js.map +1 -0
  149. package/dist/esm/v6/launch.d.ts +2754 -0
  150. package/dist/esm/v6/launch.d.ts.map +1 -0
  151. package/dist/esm/v6/launch.js +176 -0
  152. package/dist/esm/v6/launch.js.map +1 -0
  153. package/dist/esm/v6/launch.test.d.ts +2 -0
  154. package/dist/esm/v6/launch.test.d.ts.map +1 -0
  155. package/dist/esm/v6/launch.test.js +135 -0
  156. package/dist/esm/v6/launch.test.js.map +1 -0
  157. package/dist/esm/v6/loans.d.ts +176 -0
  158. package/dist/esm/v6/loans.d.ts.map +1 -0
  159. package/dist/esm/v6/loans.js +170 -0
  160. package/dist/esm/v6/loans.js.map +1 -0
  161. package/dist/esm/v6/loans.test.d.ts +2 -0
  162. package/dist/esm/v6/loans.test.d.ts.map +1 -0
  163. package/dist/esm/v6/loans.test.js +127 -0
  164. package/dist/esm/v6/loans.test.js.map +1 -0
  165. package/dist/esm/v6/omnichain.d.ts +10997 -0
  166. package/dist/esm/v6/omnichain.d.ts.map +1 -0
  167. package/dist/esm/v6/omnichain.js +116 -0
  168. package/dist/esm/v6/omnichain.js.map +1 -0
  169. package/dist/esm/v6/omnichain.test.d.ts +2 -0
  170. package/dist/esm/v6/omnichain.test.d.ts.map +1 -0
  171. package/dist/esm/v6/omnichain.test.js +143 -0
  172. package/dist/esm/v6/omnichain.test.js.map +1 -0
  173. package/dist/esm/v6/pay.d.ts +110 -0
  174. package/dist/esm/v6/pay.d.ts.map +1 -0
  175. package/dist/esm/v6/pay.js +106 -0
  176. package/dist/esm/v6/pay.js.map +1 -0
  177. package/dist/esm/v6/pay.test.d.ts +2 -0
  178. package/dist/esm/v6/pay.test.d.ts.map +1 -0
  179. package/dist/esm/v6/pay.test.js +128 -0
  180. package/dist/esm/v6/pay.test.js.map +1 -0
  181. package/dist/esm/v6/permissions.d.ts +128 -0
  182. package/dist/esm/v6/permissions.d.ts.map +1 -0
  183. package/dist/esm/v6/permissions.js +120 -0
  184. package/dist/esm/v6/permissions.js.map +1 -0
  185. package/dist/esm/v6/permissions.test.d.ts +2 -0
  186. package/dist/esm/v6/permissions.test.d.ts.map +1 -0
  187. package/dist/esm/v6/permissions.test.js +115 -0
  188. package/dist/esm/v6/permissions.test.js.map +1 -0
  189. package/dist/esm/v6/revnets.d.ts +4457 -0
  190. package/dist/esm/v6/revnets.d.ts.map +1 -0
  191. package/dist/esm/v6/revnets.js +161 -0
  192. package/dist/esm/v6/revnets.js.map +1 -0
  193. package/dist/esm/v6/revnets.test.d.ts +2 -0
  194. package/dist/esm/v6/revnets.test.d.ts.map +1 -0
  195. package/dist/esm/v6/revnets.test.js +231 -0
  196. package/dist/esm/v6/revnets.test.js.map +1 -0
  197. package/dist/esm/v6/rulesets.d.ts +2700 -0
  198. package/dist/esm/v6/rulesets.d.ts.map +1 -0
  199. package/dist/esm/v6/rulesets.js +70 -0
  200. package/dist/esm/v6/rulesets.js.map +1 -0
  201. package/dist/esm/v6/rulesets.test.d.ts +2 -0
  202. package/dist/esm/v6/rulesets.test.d.ts.map +1 -0
  203. package/dist/esm/v6/rulesets.test.js +104 -0
  204. package/dist/esm/v6/rulesets.test.js.map +1 -0
  205. package/dist/esm/v6/splits.d.ts +2670 -0
  206. package/dist/esm/v6/splits.d.ts.map +1 -0
  207. package/dist/esm/v6/splits.js +105 -0
  208. package/dist/esm/v6/splits.js.map +1 -0
  209. package/dist/esm/v6/splits.test.d.ts +2 -0
  210. package/dist/esm/v6/splits.test.d.ts.map +1 -0
  211. package/dist/esm/v6/splits.test.js +131 -0
  212. package/dist/esm/v6/splits.test.js.map +1 -0
  213. package/dist/esm/v6/suckers.d.ts +247 -0
  214. package/dist/esm/v6/suckers.d.ts.map +1 -0
  215. package/dist/esm/v6/suckers.js +156 -0
  216. package/dist/esm/v6/suckers.js.map +1 -0
  217. package/dist/esm/v6/suckers.test.d.ts +2 -0
  218. package/dist/esm/v6/suckers.test.d.ts.map +1 -0
  219. package/dist/esm/v6/suckers.test.js +132 -0
  220. package/dist/esm/v6/suckers.test.js.map +1 -0
  221. package/dist/esm/v6/terminals.d.ts +67 -0
  222. package/dist/esm/v6/terminals.d.ts.map +1 -0
  223. package/dist/esm/v6/terminals.js +50 -0
  224. package/dist/esm/v6/terminals.js.map +1 -0
  225. package/dist/esm/v6/terminals.test.d.ts +2 -0
  226. package/dist/esm/v6/terminals.test.d.ts.map +1 -0
  227. package/dist/esm/v6/terminals.test.js +57 -0
  228. package/dist/esm/v6/terminals.test.js.map +1 -0
  229. package/dist/esm/v6/tokens.d.ts +194 -0
  230. package/dist/esm/v6/tokens.d.ts.map +1 -0
  231. package/dist/esm/v6/tokens.js +161 -0
  232. package/dist/esm/v6/tokens.js.map +1 -0
  233. package/dist/esm/v6/tokens.test.d.ts +2 -0
  234. package/dist/esm/v6/tokens.test.d.ts.map +1 -0
  235. package/dist/esm/v6/tokens.test.js +139 -0
  236. package/dist/esm/v6/tokens.test.js.map +1 -0
  237. package/dist/esm/v6/types.d.ts +12 -0
  238. package/dist/esm/v6/types.d.ts.map +1 -0
  239. package/dist/esm/v6/types.js +12 -0
  240. package/dist/esm/v6/types.js.map +1 -0
  241. package/dist/tsconfig.cjs.tsbuildinfo +1 -1
  242. package/dist/tsconfig.tsbuildinfo +1 -1
  243. package/package.json +7 -1
@@ -0,0 +1,68 @@
1
+ import { jbMultiTerminalAbi, jbTerminalStoreAbi, } from "../generated/juicebox.js";
2
+ import { applyJbDaoCashOutFee } from "../utils/fee.js";
3
+ import { NATIVE_TOKEN_CURRENCY_ID } from "./currency.js";
4
+ import { v6Address } from "./types.js";
5
+ /**
6
+ * Build a `cashOutTokensOf(holder, projectId, cashOutCount, tokenToReclaim,
7
+ * minTokensReclaimed, beneficiary, metadata)` transaction request for a v6 terminal.
8
+ *
9
+ * @param args.chainId The chain to cash out on.
10
+ * @param args.terminal The terminal holding the project's `tokenToReclaim` balance.
11
+ * @param args.holder The address whose project tokens are being cashed out.
12
+ * @param args.projectId The project's id.
13
+ * @param args.cashOutCount The number of project tokens to cash out, as a fixed point
14
+ * number with 18 decimals.
15
+ * @param args.tokenToReclaim The terminal token to reclaim from the project's surplus.
16
+ * @param args.minTokensReclaimed The minimum `tokenToReclaim` amount that must be
17
+ * reclaimed, else the transaction reverts. Defaults to 0.
18
+ * @param args.beneficiary The address that receives the reclaimed tokens.
19
+ * @param args.metadata Hook metadata. Defaults to "0x".
20
+ * @returns The transaction request.
21
+ */
22
+ export function buildCashOutTx({ chainId, terminal, holder, projectId, cashOutCount, tokenToReclaim, minTokensReclaimed = 0n, beneficiary, metadata = "0x", }) {
23
+ return {
24
+ chainId,
25
+ address: terminal,
26
+ abi: jbMultiTerminalAbi,
27
+ functionName: "cashOutTokensOf",
28
+ args: [
29
+ holder,
30
+ projectId,
31
+ cashOutCount,
32
+ tokenToReclaim,
33
+ minTokensReclaimed,
34
+ beneficiary,
35
+ metadata,
36
+ ],
37
+ };
38
+ }
39
+ /**
40
+ * Quote the surplus reclaimed by cashing out `cashOutCount` project tokens, via
41
+ * `JBTerminalStore.currentReclaimableSurplusOf(projectId, cashOutCount, [], [],
42
+ * decimals, currency)`. Passing empty terminal/token arrays uses all of the project's
43
+ * terminals and tokens.
44
+ *
45
+ * @param client A viem public client on the given chain.
46
+ * @param args.chainId The chain to quote on.
47
+ * @param args.projectId The project's id.
48
+ * @param args.cashOutCount The number of project tokens to cash out, as a fixed point
49
+ * number with 18 decimals.
50
+ * @param args.decimals The decimals to quote the reclaim amount in. Defaults to 18.
51
+ * @param args.currency The currency to quote the reclaim amount in (an
52
+ * accounting-context currency, `uint32(uint160(token))`). Defaults to the native
53
+ * token's currency (61166).
54
+ * @returns The raw reclaim amount and the amount net of the 2.5% protocol fee.
55
+ */
56
+ export async function getCashOutQuote(client, { chainId, projectId, cashOutCount, decimals = 18n, currency = BigInt(NATIVE_TOKEN_CURRENCY_ID), }) {
57
+ const reclaimAmount = await client.readContract({
58
+ address: v6Address("JBTerminalStore", chainId),
59
+ abi: jbTerminalStoreAbi,
60
+ functionName: "currentReclaimableSurplusOf",
61
+ args: [projectId, cashOutCount, [], [], decimals, currency],
62
+ });
63
+ return {
64
+ reclaimAmount,
65
+ reclaimAmountAfterFee: applyJbDaoCashOutFee(reclaimAmount),
66
+ };
67
+ }
68
+ //# sourceMappingURL=cashOut.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cashOut.js","sourceRoot":"","sources":["../../../src/v6/cashOut.ts"],"names":[],"mappings":"AACA,OAAO,EACL,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAcvC;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,cAAc,CAAC,EAC7B,OAAO,EACP,QAAQ,EACR,MAAM,EACN,SAAS,EACT,YAAY,EACZ,cAAc,EACd,kBAAkB,GAAG,EAAE,EACvB,WAAW,EACX,QAAQ,GAAG,IAAI,GAWhB;IACC,OAAO;QACL,OAAO;QACP,OAAO,EAAE,QAAQ;QACjB,GAAG,EAAE,kBAAkB;QACvB,YAAY,EAAE,iBAAiB;QAC/B,IAAI,EAAE;YACJ,MAAM;YACN,SAAS;YACT,YAAY;YACZ,cAAc;YACd,kBAAkB;YAClB,WAAW;YACX,QAAQ;SACT;KACF,CAAC;AACJ,CAAC;AAmBD;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,MAAoB,EACpB,EACE,OAAO,EACP,SAAS,EACT,YAAY,EACZ,QAAQ,GAAG,GAAG,EACd,QAAQ,GAAG,MAAM,CAAC,wBAAwB,CAAC,GAO5C;IAED,MAAM,aAAa,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC;QAC9C,OAAO,EAAE,SAAS,CAAC,iBAAiB,EAAE,OAAO,CAAC;QAC9C,GAAG,EAAE,kBAAkB;QACvB,YAAY,EAAE,6BAA6B;QAC3C,IAAI,EAAE,CAAC,SAAS,EAAE,YAAY,EAAE,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,QAAQ,CAAC;KAC5D,CAAC,CAAC;IAEH,OAAO;QACL,aAAa;QACb,qBAAqB,EAAE,oBAAoB,CAAC,aAAa,CAAC;KAC3D,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=cashOut.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cashOut.test.d.ts","sourceRoot":"","sources":["../../../src/v6/cashOut.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,100 @@
1
+ import { encodeFunctionData } from "viem";
2
+ import { describe, expect, test } from "vitest";
3
+ import { NATIVE_TOKEN, ONE_ETHER } from "../constants.js";
4
+ import { jbTerminalStoreAbi } from "../generated/juicebox.js";
5
+ import { buildCashOutTx, getCashOutQuote } from "./cashOut.js";
6
+ import { v6Address } from "./types.js";
7
+ const chainId = 11155111;
8
+ const terminal = "0x1111111111111111111111111111111111111111";
9
+ const holder = "0x2222222222222222222222222222222222222222";
10
+ const beneficiary = "0x3333333333333333333333333333333333333333";
11
+ const projectId = 3n;
12
+ describe("cashOut", () => {
13
+ test("buildCashOutTx encodes cashOutTokensOf", () => {
14
+ const tx = buildCashOutTx({
15
+ chainId,
16
+ terminal,
17
+ holder,
18
+ projectId,
19
+ cashOutCount: ONE_ETHER,
20
+ tokenToReclaim: NATIVE_TOKEN,
21
+ beneficiary,
22
+ });
23
+ expect(tx.chainId).toEqual(chainId);
24
+ expect(tx.address).toEqual(terminal);
25
+ expect(tx.functionName).toEqual("cashOutTokensOf");
26
+ expect(tx.args).toEqual([
27
+ holder,
28
+ projectId,
29
+ ONE_ETHER,
30
+ NATIVE_TOKEN,
31
+ 0n,
32
+ beneficiary,
33
+ "0x",
34
+ ]);
35
+ expect(() => encodeFunctionData(tx)).not.toThrow();
36
+ });
37
+ test("buildCashOutTx passes minTokensReclaimed and metadata through", () => {
38
+ const tx = buildCashOutTx({
39
+ chainId,
40
+ terminal,
41
+ holder,
42
+ projectId,
43
+ cashOutCount: ONE_ETHER,
44
+ tokenToReclaim: NATIVE_TOKEN,
45
+ minTokensReclaimed: 999n,
46
+ beneficiary,
47
+ metadata: "0x1234",
48
+ });
49
+ expect(tx.args[4]).toEqual(999n);
50
+ expect(tx.args[6]).toEqual("0x1234");
51
+ expect(() => encodeFunctionData(tx)).not.toThrow();
52
+ });
53
+ test("getCashOutQuote reads the terminal store and applies the 2.5% fee", async () => {
54
+ const calls = [];
55
+ const client = {
56
+ async readContract(params) {
57
+ calls.push(params);
58
+ return ONE_ETHER;
59
+ },
60
+ };
61
+ const quote = await getCashOutQuote(client, {
62
+ chainId,
63
+ projectId,
64
+ cashOutCount: ONE_ETHER,
65
+ });
66
+ expect(quote.reclaimAmount).toEqual(ONE_ETHER);
67
+ expect(quote.reclaimAmountAfterFee).toEqual(975000000000000000n);
68
+ expect(calls[0].address).toEqual(v6Address("JBTerminalStore", chainId));
69
+ expect(calls[0].abi).toBe(jbTerminalStoreAbi);
70
+ expect(calls[0].functionName).toEqual("currentReclaimableSurplusOf");
71
+ // Empty terminal/token arrays use all of the project's terminals and tokens;
72
+ // defaults quote 18 decimals in the native token's currency.
73
+ expect(calls[0].args).toEqual([projectId, ONE_ETHER, [], [], 18n, 61166n]);
74
+ });
75
+ test("getCashOutQuote respects custom decimals and currency", async () => {
76
+ const calls = [];
77
+ const client = {
78
+ async readContract(params) {
79
+ calls.push(params);
80
+ return 0n;
81
+ },
82
+ };
83
+ await getCashOutQuote(client, {
84
+ chainId,
85
+ projectId,
86
+ cashOutCount: ONE_ETHER,
87
+ decimals: 6n,
88
+ currency: 0x3606eb48n,
89
+ });
90
+ expect(calls[0].args).toEqual([
91
+ projectId,
92
+ ONE_ETHER,
93
+ [],
94
+ [],
95
+ 6n,
96
+ 0x3606eb48n,
97
+ ]);
98
+ });
99
+ });
100
+ //# sourceMappingURL=cashOut.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cashOut.test.js","sourceRoot":"","sources":["../../../src/v6/cashOut.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ import { Address } from "viem";
2
+ /**
3
+ * The v6 base currency id for ETH (JBCurrencyIds.ETH).
4
+ *
5
+ * Base currencies are the small standard ids (ETH = 1, USD = 2) used to denominate a
6
+ * ruleset's `baseCurrency` and fund access limits. They are NOT the same as
7
+ * accounting-context currencies, which are derived from a token's address via
8
+ * {@link tokenCurrencyId}. Never use an accounting-context currency (e.g. 61166 for the
9
+ * native token) as a ruleset `baseCurrency` to "skip the price feed" — base currency
10
+ * must be 1 or 2.
11
+ *
12
+ * @link https://github.com/Bananapus/nana-core-v6/blob/main/src/libraries/JBCurrencyIds.sol
13
+ */
14
+ export declare const BASE_CURRENCY_ETH = 1;
15
+ /**
16
+ * The v6 base currency id for USD (JBCurrencyIds.USD).
17
+ *
18
+ * See {@link BASE_CURRENCY_ETH} for the distinction between base currencies and
19
+ * accounting-context currencies.
20
+ *
21
+ * @link https://github.com/Bananapus/nana-core-v6/blob/main/src/libraries/JBCurrencyIds.sol
22
+ */
23
+ export declare const BASE_CURRENCY_USD = 2;
24
+ /**
25
+ * The accounting-context currency id of the network's native token (e.g. ETH).
26
+ *
27
+ * Equal to `uint32(uint160(0x000000000000000000000000000000000000EEEe))` = 61166.
28
+ * This is what {@link tokenCurrencyId} returns for the native token address.
29
+ */
30
+ export declare const NATIVE_TOKEN_CURRENCY_ID = 61166;
31
+ /**
32
+ * The v6 accounting-context currency id for a token: `uint32(uint160(tokenAddress))`,
33
+ * i.e. the lowest 4 bytes of the token's address.
34
+ *
35
+ * Use this for terminal accounting contexts (`{ token, decimals, currency }`) — NOT for
36
+ * a ruleset's `baseCurrency`, which must be a base currency id
37
+ * ({@link BASE_CURRENCY_ETH} or {@link BASE_CURRENCY_USD}).
38
+ *
39
+ * @param token The token address to derive a currency id from.
40
+ * @returns The token's accounting-context currency id (fits in a uint32).
41
+ */
42
+ export declare function tokenCurrencyId(token: Address): number;
43
+ //# sourceMappingURL=currency.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"currency.d.ts","sourceRoot":"","sources":["../../../src/v6/currency.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAE/B;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,iBAAiB,IAAI,CAAC;AAEnC;;;;;;;GAOG;AACH,eAAO,MAAM,iBAAiB,IAAI,CAAC;AAEnC;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB,QAAQ,CAAC;AAE9C;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAEtD"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * The v6 base currency id for ETH (JBCurrencyIds.ETH).
3
+ *
4
+ * Base currencies are the small standard ids (ETH = 1, USD = 2) used to denominate a
5
+ * ruleset's `baseCurrency` and fund access limits. They are NOT the same as
6
+ * accounting-context currencies, which are derived from a token's address via
7
+ * {@link tokenCurrencyId}. Never use an accounting-context currency (e.g. 61166 for the
8
+ * native token) as a ruleset `baseCurrency` to "skip the price feed" — base currency
9
+ * must be 1 or 2.
10
+ *
11
+ * @link https://github.com/Bananapus/nana-core-v6/blob/main/src/libraries/JBCurrencyIds.sol
12
+ */
13
+ export const BASE_CURRENCY_ETH = 1;
14
+ /**
15
+ * The v6 base currency id for USD (JBCurrencyIds.USD).
16
+ *
17
+ * See {@link BASE_CURRENCY_ETH} for the distinction between base currencies and
18
+ * accounting-context currencies.
19
+ *
20
+ * @link https://github.com/Bananapus/nana-core-v6/blob/main/src/libraries/JBCurrencyIds.sol
21
+ */
22
+ export const BASE_CURRENCY_USD = 2;
23
+ /**
24
+ * The accounting-context currency id of the network's native token (e.g. ETH).
25
+ *
26
+ * Equal to `uint32(uint160(0x000000000000000000000000000000000000EEEe))` = 61166.
27
+ * This is what {@link tokenCurrencyId} returns for the native token address.
28
+ */
29
+ export const NATIVE_TOKEN_CURRENCY_ID = 61166;
30
+ /**
31
+ * The v6 accounting-context currency id for a token: `uint32(uint160(tokenAddress))`,
32
+ * i.e. the lowest 4 bytes of the token's address.
33
+ *
34
+ * Use this for terminal accounting contexts (`{ token, decimals, currency }`) — NOT for
35
+ * a ruleset's `baseCurrency`, which must be a base currency id
36
+ * ({@link BASE_CURRENCY_ETH} or {@link BASE_CURRENCY_USD}).
37
+ *
38
+ * @param token The token address to derive a currency id from.
39
+ * @returns The token's accounting-context currency id (fits in a uint32).
40
+ */
41
+ export function tokenCurrencyId(token) {
42
+ return Number(BigInt(token) & 0xffffffffn);
43
+ }
44
+ //# sourceMappingURL=currency.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"currency.js","sourceRoot":"","sources":["../../../src/v6/currency.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC;AAEnC;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC;AAEnC;;;;;GAKG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,KAAK,CAAC;AAE9C;;;;;;;;;;GAUG;AACH,MAAM,UAAU,eAAe,CAAC,KAAc;IAC5C,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC,CAAC;AAC7C,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=currency.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"currency.test.d.ts","sourceRoot":"","sources":["../../../src/v6/currency.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,24 @@
1
+ import { describe, expect, test } from "vitest";
2
+ import { NATIVE_TOKEN } from "../constants.js";
3
+ import { BASE_CURRENCY_ETH, BASE_CURRENCY_USD, NATIVE_TOKEN_CURRENCY_ID, tokenCurrencyId, } from "./currency.js";
4
+ describe("currency", () => {
5
+ test("base currency ids", () => {
6
+ expect(BASE_CURRENCY_ETH).toEqual(1);
7
+ expect(BASE_CURRENCY_USD).toEqual(2);
8
+ });
9
+ test("tokenCurrencyId of the native token is 61166", () => {
10
+ expect(tokenCurrencyId(NATIVE_TOKEN)).toEqual(61166);
11
+ expect(tokenCurrencyId(NATIVE_TOKEN)).toEqual(NATIVE_TOKEN_CURRENCY_ID);
12
+ });
13
+ test("tokenCurrencyId is the low 32 bits of the address", () => {
14
+ // Mainnet USDC; low 4 bytes are 0x3606eb48.
15
+ expect(tokenCurrencyId("0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48")).toEqual(0x3606eb48);
16
+ });
17
+ test("tokenCurrencyId of the zero address is 0", () => {
18
+ expect(tokenCurrencyId("0x0000000000000000000000000000000000000000")).toEqual(0);
19
+ });
20
+ test("tokenCurrencyId fits in a uint32 even for high addresses", () => {
21
+ expect(tokenCurrencyId("0xffffffffffffffffffffffffffffffffffffffff")).toEqual(0xffffffff);
22
+ });
23
+ });
24
+ //# sourceMappingURL=currency.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"currency.test.js","sourceRoot":"","sources":["../../../src/v6/currency.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,wBAAwB,EACxB,eAAe,GAChB,MAAM,eAAe,CAAC;AAEvB,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;IACxB,IAAI,CAAC,mBAAmB,EAAE,GAAG,EAAE;QAC7B,MAAM,CAAC,iBAAiB,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACrC,MAAM,CAAC,iBAAiB,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACxD,MAAM,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACrD,MAAM,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC7D,4CAA4C;QAC5C,MAAM,CACJ,eAAe,CAAC,4CAA4C,CAAC,CAC9D,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACxB,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,0CAA0C,EAAE,GAAG,EAAE;QACpD,MAAM,CACJ,eAAe,CAAC,4CAA4C,CAAC,CAC9D,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACf,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,0DAA0D,EAAE,GAAG,EAAE;QACpE,MAAM,CACJ,eAAe,CAAC,4CAA4C,CAAC,CAC9D,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACxB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * The Juicebox protocol fee, as a decimal fraction: 2.5%.
3
+ *
4
+ * Applies to payouts sent outside the protocol and to cash outs from rulesets with a
5
+ * non-zero cash out tax rate.
6
+ */
7
+ export declare const PROTOCOL_FEE_PERCENT = 0.025;
8
+ /**
9
+ * The standard protocol fee expressed out of {@link MAX_FEE}: 25 / 1000 = 2.5%.
10
+ *
11
+ * @link JBMultiTerminal.sol `FEE`
12
+ */
13
+ export declare const STANDARD_FEE = 25n;
14
+ /**
15
+ * The denominator for {@link STANDARD_FEE}-style fee percents.
16
+ */
17
+ export declare const MAX_FEE = 1000n;
18
+ /**
19
+ * The standard 2.5% protocol fee expressed per billion (out of 1e9), for legacy-style
20
+ * fixed-point math: 25_000_000 / 1_000_000_000 = 2.5%.
21
+ */
22
+ export declare const TERMINAL_FEE_PER_BILLION = 25000000n;
23
+ /**
24
+ * The fee taken from `amount`, rounded down.
25
+ *
26
+ * @param amount The gross amount the fee is taken from.
27
+ * @param feePerBillion The fee rate out of 1e9. Defaults to the standard 2.5% protocol
28
+ * fee ({@link TERMINAL_FEE_PER_BILLION}).
29
+ * @returns The fee, in the same fixed-point representation as `amount`.
30
+ */
31
+ export declare function feeForAmount(amount: bigint, feePerBillion?: bigint): bigint;
32
+ /**
33
+ * The amount left over once the fee has been taken from `amount`.
34
+ *
35
+ * Guaranteed to satisfy `amountAfterFee(x) + feeForAmount(x) === x`.
36
+ *
37
+ * @param amount The gross amount the fee is taken from.
38
+ * @param feePerBillion The fee rate out of 1e9. Defaults to the standard 2.5% protocol
39
+ * fee ({@link TERMINAL_FEE_PER_BILLION}).
40
+ * @returns The net amount after the fee.
41
+ */
42
+ export declare function amountAfterFee(amount: bigint, feePerBillion?: bigint): bigint;
43
+ //# sourceMappingURL=fees.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fees.d.ts","sourceRoot":"","sources":["../../../src/v6/fees.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,QAAQ,CAAC;AAE1C;;;;GAIG;AACH,eAAO,MAAM,YAAY,MAAM,CAAC;AAEhC;;GAEG;AACH,eAAO,MAAM,OAAO,QAAQ,CAAC;AAE7B;;;GAGG;AACH,eAAO,MAAM,wBAAwB,YAAc,CAAC;AAOpD;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,MAAM,EACd,aAAa,GAAE,MAAiC,GAC/C,MAAM,CAER;AAED;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,MAAM,EACd,aAAa,GAAE,MAAiC,GAC/C,MAAM,CAER"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * The Juicebox protocol fee, as a decimal fraction: 2.5%.
3
+ *
4
+ * Applies to payouts sent outside the protocol and to cash outs from rulesets with a
5
+ * non-zero cash out tax rate.
6
+ */
7
+ export const PROTOCOL_FEE_PERCENT = 0.025;
8
+ /**
9
+ * The standard protocol fee expressed out of {@link MAX_FEE}: 25 / 1000 = 2.5%.
10
+ *
11
+ * @link JBMultiTerminal.sol `FEE`
12
+ */
13
+ export const STANDARD_FEE = 25n;
14
+ /**
15
+ * The denominator for {@link STANDARD_FEE}-style fee percents.
16
+ */
17
+ export const MAX_FEE = 1000n;
18
+ /**
19
+ * The standard 2.5% protocol fee expressed per billion (out of 1e9), for legacy-style
20
+ * fixed-point math: 25_000_000 / 1_000_000_000 = 2.5%.
21
+ */
22
+ export const TERMINAL_FEE_PER_BILLION = 25000000n;
23
+ /**
24
+ * The per-billion fee denominator (1e9).
25
+ */
26
+ const PER_BILLION = 1000000000n;
27
+ /**
28
+ * The fee taken from `amount`, rounded down.
29
+ *
30
+ * @param amount The gross amount the fee is taken from.
31
+ * @param feePerBillion The fee rate out of 1e9. Defaults to the standard 2.5% protocol
32
+ * fee ({@link TERMINAL_FEE_PER_BILLION}).
33
+ * @returns The fee, in the same fixed-point representation as `amount`.
34
+ */
35
+ export function feeForAmount(amount, feePerBillion = TERMINAL_FEE_PER_BILLION) {
36
+ return (amount * feePerBillion) / PER_BILLION;
37
+ }
38
+ /**
39
+ * The amount left over once the fee has been taken from `amount`.
40
+ *
41
+ * Guaranteed to satisfy `amountAfterFee(x) + feeForAmount(x) === x`.
42
+ *
43
+ * @param amount The gross amount the fee is taken from.
44
+ * @param feePerBillion The fee rate out of 1e9. Defaults to the standard 2.5% protocol
45
+ * fee ({@link TERMINAL_FEE_PER_BILLION}).
46
+ * @returns The net amount after the fee.
47
+ */
48
+ export function amountAfterFee(amount, feePerBillion = TERMINAL_FEE_PER_BILLION) {
49
+ return amount - feeForAmount(amount, feePerBillion);
50
+ }
51
+ //# sourceMappingURL=fees.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fees.js","sourceRoot":"","sources":["../../../src/v6/fees.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,CAAC;AAE1C;;;;GAIG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,GAAG,CAAC;AAEhC;;GAEG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,CAAC;AAE7B;;;GAGG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,SAAW,CAAC;AAEpD;;GAEG;AACH,MAAM,WAAW,GAAG,WAAc,CAAC;AAEnC;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY,CAC1B,MAAc,EACd,gBAAwB,wBAAwB;IAEhD,OAAO,CAAC,MAAM,GAAG,aAAa,CAAC,GAAG,WAAW,CAAC;AAChD,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,cAAc,CAC5B,MAAc,EACd,gBAAwB,wBAAwB;IAEhD,OAAO,MAAM,GAAG,YAAY,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;AACtD,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=fees.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fees.test.d.ts","sourceRoot":"","sources":["../../../src/v6/fees.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,38 @@
1
+ import { describe, expect, test } from "vitest";
2
+ import { ONE_ETHER } from "../constants.js";
3
+ import { applyJbDaoCashOutFee } from "../utils/fee.js";
4
+ import { MAX_FEE, STANDARD_FEE, TERMINAL_FEE_PER_BILLION, amountAfterFee, feeForAmount, } from "./fees.js";
5
+ describe("fees", () => {
6
+ test("constants agree on 2.5%", () => {
7
+ expect(STANDARD_FEE).toEqual(25n);
8
+ expect(MAX_FEE).toEqual(1000n);
9
+ expect((STANDARD_FEE * 1000000000n) / MAX_FEE).toEqual(TERMINAL_FEE_PER_BILLION);
10
+ });
11
+ test("feeForAmount takes 2.5% by default", () => {
12
+ expect(feeForAmount(ONE_ETHER)).toEqual(25000000000000000n);
13
+ expect(feeForAmount(1000000000n)).toEqual(25000000n);
14
+ });
15
+ test("amountAfterFee leaves 97.5% by default", () => {
16
+ expect(amountAfterFee(ONE_ETHER)).toEqual(975000000000000000n);
17
+ expect(amountAfterFee(ONE_ETHER)).toEqual(applyJbDaoCashOutFee(ONE_ETHER));
18
+ });
19
+ test("fee + net always equals the gross amount", () => {
20
+ for (const amount of [0n, 1n, 39n, 40n, 41n, ONE_ETHER, ONE_ETHER + 1n]) {
21
+ expect(feeForAmount(amount) + amountAfterFee(amount)).toEqual(amount);
22
+ }
23
+ });
24
+ test("fee rounds down; tiny amounts pay no fee", () => {
25
+ expect(feeForAmount(39n)).toEqual(0n);
26
+ expect(amountAfterFee(39n)).toEqual(39n);
27
+ expect(feeForAmount(40n)).toEqual(1n);
28
+ });
29
+ test("custom fee rates", () => {
30
+ // 10% per billion.
31
+ expect(feeForAmount(ONE_ETHER, 100000000n)).toEqual(100000000000000000n);
32
+ expect(amountAfterFee(ONE_ETHER, 100000000n)).toEqual(900000000000000000n);
33
+ // Zero fee.
34
+ expect(feeForAmount(ONE_ETHER, 0n)).toEqual(0n);
35
+ expect(amountAfterFee(ONE_ETHER, 0n)).toEqual(ONE_ETHER);
36
+ });
37
+ });
38
+ //# sourceMappingURL=fees.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fees.test.js","sourceRoot":"","sources":["../../../src/v6/fees.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EACL,OAAO,EACP,YAAY,EACZ,wBAAwB,EACxB,cAAc,EACd,YAAY,GACb,MAAM,WAAW,CAAC;AAEnB,QAAQ,CAAC,MAAM,EAAE,GAAG,EAAE;IACpB,IAAI,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACnC,MAAM,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAClC,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC/B,MAAM,CAAC,CAAC,YAAY,GAAG,WAAc,CAAC,GAAG,OAAO,CAAC,CAAC,OAAO,CACvD,wBAAwB,CACzB,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC9C,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;QAC5D,MAAM,CAAC,YAAY,CAAC,WAAc,CAAC,CAAC,CAAC,OAAO,CAAC,SAAW,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAClD,MAAM,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;QAC/D,MAAM,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC,CAAC;IAC7E,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,0CAA0C,EAAE,GAAG,EAAE;QACpD,KAAK,MAAM,MAAM,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,SAAS,GAAG,EAAE,CAAC,EAAE,CAAC;YACxE,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACxE,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,0CAA0C,EAAE,GAAG,EAAE;QACpD,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACtC,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACzC,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAC5B,mBAAmB;QACnB,MAAM,CAAC,YAAY,CAAC,SAAS,EAAE,UAAY,CAAC,CAAC,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;QAC3E,MAAM,CAAC,cAAc,CAAC,SAAS,EAAE,UAAY,CAAC,CAAC,CAAC,OAAO,CACrD,mBAAmB,CACpB,CAAC;QACF,YAAY;QACZ,MAAM,CAAC,YAAY,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAChD,MAAM,CAAC,cAAc,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,16 @@
1
+ export * from "./types.js";
2
+ export * from "./currency.js";
3
+ export * from "./fees.js";
4
+ export * from "./launch.js";
5
+ export * from "./omnichain.js";
6
+ export * from "./rulesets.js";
7
+ export * from "./splits.js";
8
+ export * from "./revnets.js";
9
+ export * from "./terminals.js";
10
+ export * from "./pay.js";
11
+ export * from "./cashOut.js";
12
+ export * from "./tokens.js";
13
+ export * from "./permissions.js";
14
+ export * from "./suckers.js";
15
+ export * from "./loans.js";
16
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +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,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC"}
@@ -0,0 +1,16 @@
1
+ export * from "./types.js";
2
+ export * from "./currency.js";
3
+ export * from "./fees.js";
4
+ export * from "./launch.js";
5
+ export * from "./omnichain.js";
6
+ export * from "./rulesets.js";
7
+ export * from "./splits.js";
8
+ export * from "./revnets.js";
9
+ export * from "./terminals.js";
10
+ export * from "./pay.js";
11
+ export * from "./cashOut.js";
12
+ export * from "./tokens.js";
13
+ export * from "./permissions.js";
14
+ export * from "./suckers.js";
15
+ export * from "./loans.js";
16
+ //# sourceMappingURL=index.js.map
@@ -0,0 +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,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC"}