@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,170 @@
1
+ import { revLoansAbi } from "../generated/juicebox.js";
2
+ import { v6Address } from "./types.js";
3
+ /**
4
+ * The denominator for REVLoans fee percents: prepaid fee percents and source fee percents
5
+ * are expressed out of 1000.
6
+ */
7
+ export const LOANS_MAX_FEE = 1000n;
8
+ /**
9
+ * The minimum `prepaidFeePercent` REVLoans accepts when borrowing: 25 of {@link LOANS_MAX_FEE}
10
+ * (2.5%), paid upfront to the source revnet. Prepaying more than the minimum extends the
11
+ * loan's zero-additional-cost duration; after it expires the repayment cost increases
12
+ * linearly until the loan liquidates at 10 years.
13
+ */
14
+ export const MIN_PREPAID_FEE_PERCENT = 25n;
15
+ /**
16
+ * The upfront fee REVLoans routes to the $REV revnet on every borrow: 10 of
17
+ * {@link LOANS_MAX_FEE} (1%), taken in addition to the prepaid fee.
18
+ */
19
+ export const REV_PREPAID_FEE_PERCENT = 10n;
20
+ /**
21
+ * The JBPermissions permission id apps grant to the REVLoans contract before borrowing
22
+ * against a holder's tokens (v6 ROOT permission id 1). REVLoans needs it to manage the
23
+ * holder's collateral tokens on their behalf.
24
+ */
25
+ export const REVLOANS_PERMISSION_ID = 1;
26
+ /**
27
+ * An empty Permit2 allowance: use when no permit signature is needed (native-token
28
+ * repayments, or ERC-20s already approved to REVLoans).
29
+ */
30
+ export const EMPTY_SINGLE_ALLOWANCE = {
31
+ sigDeadline: 0n,
32
+ amount: 0n,
33
+ expiration: 0,
34
+ nonce: 0,
35
+ signature: "0x",
36
+ };
37
+ /**
38
+ * Builds a `borrowFrom` transaction on REVLoans, opening a loan against a holder's revnet
39
+ * tokens.
40
+ *
41
+ * The caller must be the holder or have permission to act on their behalf, and the holder
42
+ * must have granted permission id {@link REVLOANS_PERMISSION_ID} to REVLoans.
43
+ *
44
+ * @param args.chainId The chain to borrow on.
45
+ * @param args.revnetId The revnet to borrow from.
46
+ * @param args.token The terminal token to borrow.
47
+ * @param args.minBorrowAmount The minimum amount to borrow, denominated in `token`.
48
+ * Defaults to 0.
49
+ * @param args.collateralCount The number of revnet tokens to lock as collateral, as a
50
+ * fixed point number with 18 decimals.
51
+ * @param args.beneficiary The address that receives the borrowed funds and the loan NFT.
52
+ * @param args.prepaidFeePercent The fee percent to prepay, out of {@link LOANS_MAX_FEE}.
53
+ * Must be at least {@link MIN_PREPAID_FEE_PERCENT}.
54
+ * @param args.holder The address whose tokens are used as collateral.
55
+ */
56
+ export function buildBorrowTx({ chainId, revnetId, token, minBorrowAmount = 0n, collateralCount, beneficiary, prepaidFeePercent, holder, }) {
57
+ return {
58
+ chainId,
59
+ address: v6Address("REVLoans", chainId),
60
+ abi: revLoansAbi,
61
+ functionName: "borrowFrom",
62
+ args: [
63
+ revnetId,
64
+ token,
65
+ minBorrowAmount,
66
+ collateralCount,
67
+ beneficiary,
68
+ prepaidFeePercent,
69
+ holder,
70
+ ],
71
+ };
72
+ }
73
+ /**
74
+ * Builds a `repayLoan` transaction on REVLoans, paying down a loan and reclaiming
75
+ * collateral.
76
+ *
77
+ * Payable: when the loan's source token is the native token, send the repayment as
78
+ * `value`.
79
+ *
80
+ * @param args.chainId The chain the loan lives on.
81
+ * @param args.loanId The id of the loan being repaid (also the loan NFT's token id).
82
+ * @param args.maxRepayBorrowAmount The maximum amount to repay, denominated in the loan's
83
+ * source token. Excess above what's owed is refunded.
84
+ * @param args.collateralCountToReturn The number of collateral tokens to reclaim, as a
85
+ * fixed point number with 18 decimals.
86
+ * @param args.beneficiary The address that receives the reclaimed collateral (and any new
87
+ * loan NFT for a partial repayment).
88
+ * @param args.allowance A Permit2 allowance for ERC-20 repayments. Defaults to
89
+ * {@link EMPTY_SINGLE_ALLOWANCE}.
90
+ * @param args.value The native-token repayment to send along. Defaults to 0.
91
+ */
92
+ export function buildRepayLoanTx({ chainId, loanId, maxRepayBorrowAmount, collateralCountToReturn, beneficiary, allowance = EMPTY_SINGLE_ALLOWANCE, value = 0n, }) {
93
+ return {
94
+ chainId,
95
+ address: v6Address("REVLoans", chainId),
96
+ abi: revLoansAbi,
97
+ functionName: "repayLoan",
98
+ args: [
99
+ loanId,
100
+ maxRepayBorrowAmount,
101
+ collateralCountToReturn,
102
+ beneficiary,
103
+ allowance,
104
+ ],
105
+ value,
106
+ };
107
+ }
108
+ /**
109
+ * Builds a `reallocateCollateralFromLoan` transaction on REVLoans, moving collateral out
110
+ * of an existing loan and into a new loan (optionally adding more collateral and borrowing
111
+ * more).
112
+ *
113
+ * Note: this internally opens a new loan with the full current borrow capacity, so it is
114
+ * economically equivalent to borrowing.
115
+ *
116
+ * @param args.chainId The chain the loan lives on.
117
+ * @param args.loanId The id of the loan to reallocate collateral from.
118
+ * @param args.collateralCountToTransfer The number of collateral tokens to move from the
119
+ * existing loan into the new one, as a fixed point number with 18 decimals.
120
+ * @param args.token The terminal token to borrow with the new loan.
121
+ * @param args.minBorrowAmount The minimum amount the new loan must borrow, denominated in
122
+ * `token`. Defaults to 0.
123
+ * @param args.collateralCountToAdd The number of additional collateral tokens to add to
124
+ * the new loan, as a fixed point number with 18 decimals.
125
+ * @param args.beneficiary The address that receives the borrowed funds and the new loan
126
+ * NFT.
127
+ * @param args.prepaidFeePercent The fee percent to prepay on the new loan, out of
128
+ * {@link LOANS_MAX_FEE}. Must be at least {@link MIN_PREPAID_FEE_PERCENT}.
129
+ */
130
+ export function buildReallocateCollateralTx({ chainId, loanId, collateralCountToTransfer, token, minBorrowAmount = 0n, collateralCountToAdd, beneficiary, prepaidFeePercent, }) {
131
+ return {
132
+ chainId,
133
+ address: v6Address("REVLoans", chainId),
134
+ abi: revLoansAbi,
135
+ functionName: "reallocateCollateralFromLoan",
136
+ args: [
137
+ loanId,
138
+ collateralCountToTransfer,
139
+ token,
140
+ minBorrowAmount,
141
+ collateralCountToAdd,
142
+ beneficiary,
143
+ prepaidFeePercent,
144
+ ],
145
+ };
146
+ }
147
+ /**
148
+ * Reads how much a given collateral count can borrow from a revnet, via
149
+ * `REVLoans.borrowableAmountFrom`.
150
+ *
151
+ * @param client A viem PublicClient connected to `chainId`.
152
+ * @param args.chainId The chain to read on.
153
+ * @param args.revnetId The revnet to borrow from.
154
+ * @param args.collateralCount The number of revnet tokens that would be locked as
155
+ * collateral, as a fixed point number with 18 decimals.
156
+ * @param args.decimals The decimals the returned amounts should be denominated in.
157
+ * @param args.currency The currency the returned amounts should be denominated in.
158
+ * @returns `borrowableNow` (currently borrowable, net of the revnet's cash-out delay) and
159
+ * `borrowableCapacity` (the full capacity the collateral represents).
160
+ */
161
+ export async function getBorrowableAmount(client, { chainId, revnetId, collateralCount, decimals, currency, }) {
162
+ const [borrowableNow, borrowableCapacity] = await client.readContract({
163
+ address: v6Address("REVLoans", chainId),
164
+ abi: revLoansAbi,
165
+ functionName: "borrowableAmountFrom",
166
+ args: [revnetId, collateralCount, decimals, currency],
167
+ });
168
+ return { borrowableNow, borrowableCapacity };
169
+ }
170
+ //# sourceMappingURL=loans.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loans.js","sourceRoot":"","sources":["../../../src/v6/loans.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC;;;GAGG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,CAAC;AAEnC;;;;;GAKG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,GAAG,CAAC;AAE3C;;;GAGG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,GAAG,CAAC;AAE3C;;;;GAIG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC;AAexC;;;GAGG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAsB;IACvD,WAAW,EAAE,EAAE;IACf,MAAM,EAAE,EAAE;IACV,UAAU,EAAE,CAAC;IACb,KAAK,EAAE,CAAC;IACR,SAAS,EAAE,IAAI;CAChB,CAAC;AAEF;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,aAAa,CAAC,EAC5B,OAAO,EACP,QAAQ,EACR,KAAK,EACL,eAAe,GAAG,EAAE,EACpB,eAAe,EACf,WAAW,EACX,iBAAiB,EACjB,MAAM,GAUP;IAOC,OAAO;QACL,OAAO;QACP,OAAO,EAAE,SAAS,CAAC,UAAU,EAAE,OAAO,CAAC;QACvC,GAAG,EAAE,WAAW;QAChB,YAAY,EAAE,YAAY;QAC1B,IAAI,EAAE;YACJ,QAAQ;YACR,KAAK;YACL,eAAe;YACf,eAAe;YACf,WAAW;YACX,iBAAiB;YACjB,MAAM;SACP;KACF,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,gBAAgB,CAAC,EAC/B,OAAO,EACP,MAAM,EACN,oBAAoB,EACpB,uBAAuB,EACvB,WAAW,EACX,SAAS,GAAG,sBAAsB,EAClC,KAAK,GAAG,EAAE,GASX;IAQC,OAAO;QACL,OAAO;QACP,OAAO,EAAE,SAAS,CAAC,UAAU,EAAE,OAAO,CAAC;QACvC,GAAG,EAAE,WAAW;QAChB,YAAY,EAAE,WAAW;QACzB,IAAI,EAAE;YACJ,MAAM;YACN,oBAAoB;YACpB,uBAAuB;YACvB,WAAW;YACX,SAAS;SACV;QACD,KAAK;KACN,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,UAAU,2BAA2B,CAAC,EAC1C,OAAO,EACP,MAAM,EACN,yBAAyB,EACzB,KAAK,EACL,eAAe,GAAG,EAAE,EACpB,oBAAoB,EACpB,WAAW,EACX,iBAAiB,GAUlB;IAOC,OAAO;QACL,OAAO;QACP,OAAO,EAAE,SAAS,CAAC,UAAU,EAAE,OAAO,CAAC;QACvC,GAAG,EAAE,WAAW;QAChB,YAAY,EAAE,8BAA8B;QAC5C,IAAI,EAAE;YACJ,MAAM;YACN,yBAAyB;YACzB,KAAK;YACL,eAAe;YACf,oBAAoB;YACpB,WAAW;YACX,iBAAiB;SAClB;KACF,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,MAAoB,EACpB,EACE,OAAO,EACP,QAAQ,EACR,eAAe,EACf,QAAQ,EACR,QAAQ,GAOT;IAED,MAAM,CAAC,aAAa,EAAE,kBAAkB,CAAC,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC;QACpE,OAAO,EAAE,SAAS,CAAC,UAAU,EAAE,OAAO,CAAC;QACvC,GAAG,EAAE,WAAW;QAChB,YAAY,EAAE,sBAAsB;QACpC,IAAI,EAAE,CAAC,QAAQ,EAAE,eAAe,EAAE,QAAQ,EAAE,QAAQ,CAAC;KACtD,CAAC,CAAC;IAEH,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,CAAC;AAC/C,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=loans.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loans.test.d.ts","sourceRoot":"","sources":["../../../src/v6/loans.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,127 @@
1
+ import { describe, expect, test, vi } from "vitest";
2
+ import { decodeFunctionData, encodeFunctionData } from "viem";
3
+ import { revLoansAbi } from "../generated/juicebox.js";
4
+ import { EMPTY_SINGLE_ALLOWANCE, LOANS_MAX_FEE, MIN_PREPAID_FEE_PERCENT, REVLOANS_PERMISSION_ID, REV_PREPAID_FEE_PERCENT, buildBorrowTx, buildReallocateCollateralTx, buildRepayLoanTx, getBorrowableAmount, } from "./loans.js";
5
+ import { v6Address } from "./types.js";
6
+ const token = "0x000000000000000000000000000000000000EEEe";
7
+ const beneficiary = "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266";
8
+ const holder = "0x70997970C51812dc3A010C7d01b50e0d17dc79C8";
9
+ describe("loans", () => {
10
+ test("constants match REVLoans", () => {
11
+ expect(MIN_PREPAID_FEE_PERCENT).toEqual(25n);
12
+ expect(REV_PREPAID_FEE_PERCENT).toEqual(10n);
13
+ expect(LOANS_MAX_FEE).toEqual(1000n);
14
+ expect(REVLOANS_PERMISSION_ID).toEqual(1);
15
+ });
16
+ describe("buildBorrowTx", () => {
17
+ test("targets REVLoans and encodes borrowFrom", () => {
18
+ const tx = buildBorrowTx({
19
+ chainId: 11155111,
20
+ revnetId: 4n,
21
+ token,
22
+ collateralCount: 100n * 10n ** 18n,
23
+ beneficiary,
24
+ prepaidFeePercent: MIN_PREPAID_FEE_PERCENT,
25
+ holder,
26
+ });
27
+ expect(tx.address).toEqual(v6Address("REVLoans", 11155111));
28
+ expect(tx.functionName).toEqual("borrowFrom");
29
+ const data = encodeFunctionData(tx);
30
+ const decoded = decodeFunctionData({ abi: revLoansAbi, data });
31
+ expect(decoded.functionName).toEqual("borrowFrom");
32
+ expect(decoded.args).toEqual([
33
+ 4n,
34
+ token,
35
+ 0n, // minBorrowAmount defaults to 0
36
+ 100n * 10n ** 18n,
37
+ beneficiary,
38
+ 25n,
39
+ holder,
40
+ ]);
41
+ });
42
+ });
43
+ describe("buildRepayLoanTx", () => {
44
+ test("defaults to an empty Permit2 allowance and 0 value", () => {
45
+ const tx = buildRepayLoanTx({
46
+ chainId: 11155111,
47
+ loanId: 7n,
48
+ maxRepayBorrowAmount: 1000n,
49
+ collateralCountToReturn: 5n,
50
+ beneficiary,
51
+ });
52
+ expect(tx.value).toEqual(0n);
53
+ expect(tx.args[4]).toEqual(EMPTY_SINGLE_ALLOWANCE);
54
+ const data = encodeFunctionData(tx);
55
+ const decoded = decodeFunctionData({ abi: revLoansAbi, data });
56
+ expect(decoded.functionName).toEqual("repayLoan");
57
+ expect(decoded.args).toEqual([
58
+ 7n,
59
+ 1000n,
60
+ 5n,
61
+ beneficiary,
62
+ EMPTY_SINGLE_ALLOWANCE,
63
+ ]);
64
+ });
65
+ test("passes a native-token repayment value through", () => {
66
+ const tx = buildRepayLoanTx({
67
+ chainId: 1,
68
+ loanId: 7n,
69
+ maxRepayBorrowAmount: 1000n,
70
+ collateralCountToReturn: 0n,
71
+ beneficiary,
72
+ value: 1000n,
73
+ });
74
+ expect(tx.value).toEqual(1000n);
75
+ expect(() => encodeFunctionData(tx)).not.toThrow();
76
+ });
77
+ });
78
+ describe("buildReallocateCollateralTx", () => {
79
+ test("encodes reallocateCollateralFromLoan", () => {
80
+ const tx = buildReallocateCollateralTx({
81
+ chainId: 11155111,
82
+ loanId: 7n,
83
+ collateralCountToTransfer: 3n,
84
+ token,
85
+ collateralCountToAdd: 2n,
86
+ beneficiary,
87
+ prepaidFeePercent: 50n,
88
+ });
89
+ expect(tx.address).toEqual(v6Address("REVLoans", 11155111));
90
+ const data = encodeFunctionData(tx);
91
+ const decoded = decodeFunctionData({ abi: revLoansAbi, data });
92
+ expect(decoded.functionName).toEqual("reallocateCollateralFromLoan");
93
+ expect(decoded.args).toEqual([
94
+ 7n,
95
+ 3n,
96
+ token,
97
+ 0n, // minBorrowAmount defaults to 0
98
+ 2n,
99
+ beneficiary,
100
+ 50n,
101
+ ]);
102
+ });
103
+ });
104
+ describe("getBorrowableAmount", () => {
105
+ test("returns named fields from borrowableAmountFrom", async () => {
106
+ const readContract = vi.fn().mockResolvedValue([111n, 222n]);
107
+ const client = { readContract };
108
+ const result = await getBorrowableAmount(client, {
109
+ chainId: 11155111,
110
+ revnetId: 4n,
111
+ collateralCount: 100n,
112
+ decimals: 18n,
113
+ currency: 1n,
114
+ });
115
+ expect(readContract).toHaveBeenCalledWith(expect.objectContaining({
116
+ address: v6Address("REVLoans", 11155111),
117
+ functionName: "borrowableAmountFrom",
118
+ args: [4n, 100n, 18n, 1n],
119
+ }));
120
+ expect(result).toEqual({
121
+ borrowableNow: 111n,
122
+ borrowableCapacity: 222n,
123
+ });
124
+ });
125
+ });
126
+ });
127
+ //# sourceMappingURL=loans.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loans.test.js","sourceRoot":"","sources":["../../../src/v6/loans.test.ts"],"names":[],"mappings":"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"}