@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,156 @@
1
+ import { getAddress, pad, sliceHex, zeroHash, } from "viem";
2
+ import { jbSuckerRegistryAbi } from "../generated/juicebox.js";
3
+ import { v6Address } from "./types.js";
4
+ /**
5
+ * Minimal v6 JBSucker ABI. v6 identifies remote beneficiaries as bytes32 (for cross-VM
6
+ * compatibility) and adds an opaque `metadata` attribution payload to prepared leaves.
7
+ */
8
+ export const jbSuckerV6Abi = [
9
+ {
10
+ type: "function",
11
+ name: "prepare",
12
+ inputs: [
13
+ { name: "projectTokenCount", type: "uint256", internalType: "uint256" },
14
+ { name: "beneficiary", type: "bytes32", internalType: "bytes32" },
15
+ { name: "minTokensReclaimed", type: "uint256", internalType: "uint256" },
16
+ { name: "token", type: "address", internalType: "address" },
17
+ { name: "metadata", type: "bytes32", internalType: "bytes32" },
18
+ ],
19
+ outputs: [],
20
+ stateMutability: "nonpayable",
21
+ },
22
+ {
23
+ type: "function",
24
+ name: "toRemote",
25
+ inputs: [{ name: "token", type: "address", internalType: "address" }],
26
+ outputs: [],
27
+ stateMutability: "payable",
28
+ },
29
+ {
30
+ type: "function",
31
+ name: "claim",
32
+ inputs: [
33
+ {
34
+ name: "claimData",
35
+ type: "tuple",
36
+ internalType: "struct JBClaim",
37
+ components: [
38
+ { name: "token", type: "address", internalType: "address" },
39
+ {
40
+ name: "leaf",
41
+ type: "tuple",
42
+ internalType: "struct JBLeaf",
43
+ components: [
44
+ { name: "index", type: "uint256", internalType: "uint256" },
45
+ { name: "beneficiary", type: "bytes32", internalType: "bytes32" },
46
+ { name: "projectTokenCount", type: "uint256", internalType: "uint256" },
47
+ { name: "terminalTokenAmount", type: "uint256", internalType: "uint256" },
48
+ { name: "metadata", type: "bytes32", internalType: "bytes32" },
49
+ ],
50
+ },
51
+ { name: "proof", type: "bytes32[32]", internalType: "bytes32[32]" },
52
+ ],
53
+ },
54
+ ],
55
+ outputs: [],
56
+ stateMutability: "nonpayable",
57
+ },
58
+ ];
59
+ /**
60
+ * Builds a `prepare` transaction on a v6 sucker, locking project tokens into an outbox
61
+ * leaf destined for the remote chain.
62
+ *
63
+ * The beneficiary is an EVM address; it's left-padded to bytes32 internally (v6 suckers
64
+ * identify beneficiaries as bytes32 for cross-VM compatibility).
65
+ *
66
+ * @param args.chainId The chain the sucker lives on.
67
+ * @param args.sucker The sucker's address.
68
+ * @param args.projectTokenCount The number of project tokens to bridge, as a fixed point
69
+ * number with 18 decimals.
70
+ * @param args.beneficiary The address that will claim the bridged tokens on the remote chain.
71
+ * @param args.minTokensReclaimed The minimum number of terminal tokens to reclaim when the
72
+ * project tokens are cashed out. Defaults to 0.
73
+ * @param args.token The local terminal token being bridged alongside the project tokens.
74
+ * @param args.metadata Opaque bytes32 attribution payload hashed into the leaf. Defaults to
75
+ * zero.
76
+ */
77
+ export function buildBridgePrepareTx({ chainId, sucker, projectTokenCount, beneficiary, minTokensReclaimed = 0n, token, metadata = zeroHash, }) {
78
+ return {
79
+ chainId,
80
+ address: sucker,
81
+ abi: jbSuckerV6Abi,
82
+ functionName: "prepare",
83
+ args: [
84
+ projectTokenCount,
85
+ // Lowercase so the bytes32 is deterministic regardless of input checksum casing.
86
+ pad(beneficiary.toLowerCase(), { size: 32 }),
87
+ minTokensReclaimed,
88
+ token,
89
+ metadata,
90
+ ],
91
+ };
92
+ }
93
+ /**
94
+ * Builds a `claim` transaction on a v6 sucker, redeeming an inbox leaf that was bridged
95
+ * from the remote chain.
96
+ *
97
+ * @param args.chainId The chain the sucker lives on.
98
+ * @param args.sucker The sucker's address.
99
+ * @param args.claim The claim: terminal token, leaf (with bytes32 beneficiary), and a
100
+ * 32-entry bytes32 inclusion proof.
101
+ */
102
+ export function buildBridgeClaimTx({ chainId, sucker, claim, }) {
103
+ return {
104
+ chainId,
105
+ address: sucker,
106
+ abi: jbSuckerV6Abi,
107
+ functionName: "claim",
108
+ args: [claim],
109
+ };
110
+ }
111
+ /**
112
+ * Builds a `toRemote` transaction on a v6 sucker, sending the outbox tree for a token to
113
+ * the remote chain.
114
+ *
115
+ * Payable: bridging over CCIP requires a fee to be sent along as `value`. Native-bridge
116
+ * suckers (OP/Base/Arbitrum) take no fee.
117
+ *
118
+ * @param args.chainId The chain the sucker lives on.
119
+ * @param args.sucker The sucker's address.
120
+ * @param args.token The local terminal token whose outbox tree should be bridged.
121
+ * @param args.value The bridge fee to send along. Defaults to 0.
122
+ */
123
+ export function buildToRemoteTx({ chainId, sucker, token, value = 0n, }) {
124
+ return {
125
+ chainId,
126
+ address: sucker,
127
+ abi: jbSuckerV6Abi,
128
+ functionName: "toRemote",
129
+ args: [token],
130
+ value,
131
+ };
132
+ }
133
+ /**
134
+ * Reads a project's v6 sucker pairs from the JBSuckerRegistry on the given chain.
135
+ *
136
+ * The v6 registry stores remote suckers as bytes32 (for cross-VM compatibility); for EVM
137
+ * peers the address is in the low 20 bytes, which this unpacks to a checksummed address.
138
+ *
139
+ * @param client A viem PublicClient connected to `chainId`.
140
+ * @param args.chainId The chain to read the registry on.
141
+ * @param args.projectId The project to look up pairs for.
142
+ */
143
+ export async function getV6SuckerPairs(client, { chainId, projectId }) {
144
+ const pairs = await client.readContract({
145
+ address: v6Address("JBSuckerRegistry", chainId),
146
+ abi: jbSuckerRegistryAbi,
147
+ functionName: "suckerPairsOf",
148
+ args: [projectId],
149
+ });
150
+ return pairs.map((pair) => ({
151
+ local: pair.local,
152
+ remote: getAddress(sliceHex(pair.remote, 12)),
153
+ remoteChainId: pair.remoteChainId,
154
+ }));
155
+ }
156
+ //# sourceMappingURL=suckers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"suckers.js","sourceRoot":"","sources":["../../../src/v6/suckers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=suckers.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"suckers.test.d.ts","sourceRoot":"","sources":["../../../src/v6/suckers.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,132 @@
1
+ import { describe, expect, test, vi } from "vitest";
2
+ import { decodeFunctionData, encodeFunctionData, pad, zeroHash, } from "viem";
3
+ import { buildBridgeClaimTx, buildBridgePrepareTx, buildToRemoteTx, getV6SuckerPairs, jbSuckerV6Abi, } from "./suckers.js";
4
+ import { v6Address } from "./types.js";
5
+ const sucker = "0x00000000000000000000000000000000000000aa";
6
+ const token = "0x000000000000000000000000000000000000000b";
7
+ const beneficiary = "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266";
8
+ const paddedBeneficiary = "0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266";
9
+ describe("suckers", () => {
10
+ describe("buildBridgePrepareTx", () => {
11
+ test("left-pads the beneficiary address to bytes32 and encodes", () => {
12
+ const tx = buildBridgePrepareTx({
13
+ chainId: 11155111,
14
+ sucker,
15
+ projectTokenCount: 100n * 10n ** 18n,
16
+ beneficiary,
17
+ token,
18
+ });
19
+ expect(tx.address).toEqual(sucker);
20
+ expect(tx.functionName).toEqual("prepare");
21
+ expect(tx.args[1]).toEqual(paddedBeneficiary);
22
+ // minTokensReclaimed and metadata default to 0.
23
+ expect(tx.args[2]).toEqual(0n);
24
+ expect(tx.args[4]).toEqual(zeroHash);
25
+ const data = encodeFunctionData(tx);
26
+ const decoded = decodeFunctionData({ abi: jbSuckerV6Abi, data });
27
+ expect(decoded.functionName).toEqual("prepare");
28
+ expect(decoded.args).toEqual([
29
+ 100n * 10n ** 18n,
30
+ paddedBeneficiary,
31
+ 0n,
32
+ token,
33
+ zeroHash,
34
+ ]);
35
+ });
36
+ test("passes explicit minTokensReclaimed and metadata through", () => {
37
+ const metadata = pad("0x1234", { size: 32 });
38
+ const tx = buildBridgePrepareTx({
39
+ chainId: 1,
40
+ sucker,
41
+ projectTokenCount: 1n,
42
+ beneficiary,
43
+ minTokensReclaimed: 42n,
44
+ token,
45
+ metadata,
46
+ });
47
+ expect(tx.args[2]).toEqual(42n);
48
+ expect(tx.args[4]).toEqual(metadata);
49
+ expect(() => encodeFunctionData(tx)).not.toThrow();
50
+ });
51
+ });
52
+ describe("buildBridgeClaimTx", () => {
53
+ const claim = {
54
+ token,
55
+ leaf: {
56
+ index: 3n,
57
+ beneficiary: paddedBeneficiary,
58
+ projectTokenCount: 5n,
59
+ terminalTokenAmount: 7n,
60
+ metadata: zeroHash,
61
+ },
62
+ proof: Array.from({ length: 32 }, () => zeroHash),
63
+ };
64
+ test("encodes a full JBClaim", () => {
65
+ const tx = buildBridgeClaimTx({ chainId: 11155111, sucker, claim });
66
+ expect(tx.address).toEqual(sucker);
67
+ expect(tx.functionName).toEqual("claim");
68
+ const data = encodeFunctionData(tx);
69
+ const decoded = decodeFunctionData({ abi: jbSuckerV6Abi, data });
70
+ expect(decoded.functionName).toEqual("claim");
71
+ expect(decoded.args[0]).toEqual(claim);
72
+ });
73
+ test("rejects proofs that aren't exactly 32 entries", () => {
74
+ const tx = buildBridgeClaimTx({
75
+ chainId: 11155111,
76
+ sucker,
77
+ claim: {
78
+ ...claim,
79
+ proof: claim.proof.slice(0, 31),
80
+ },
81
+ });
82
+ expect(() => encodeFunctionData(tx)).toThrow();
83
+ });
84
+ });
85
+ describe("buildToRemoteTx", () => {
86
+ test("is payable with a default value of 0", () => {
87
+ const tx = buildToRemoteTx({ chainId: 11155111, sucker, token });
88
+ expect(tx.value).toEqual(0n);
89
+ expect(tx.functionName).toEqual("toRemote");
90
+ expect(() => encodeFunctionData(tx)).not.toThrow();
91
+ });
92
+ test("passes an explicit CCIP fee value through", () => {
93
+ const tx = buildToRemoteTx({
94
+ chainId: 11155111,
95
+ sucker,
96
+ token,
97
+ value: 123n,
98
+ });
99
+ expect(tx.value).toEqual(123n);
100
+ expect(tx.args).toEqual([token]);
101
+ });
102
+ });
103
+ describe("getV6SuckerPairs", () => {
104
+ test("reads the registry and unpacks bytes32 remotes to checksummed addresses", async () => {
105
+ const readContract = vi.fn().mockResolvedValue([
106
+ {
107
+ local: sucker,
108
+ remote: "0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266",
109
+ remoteChainId: 10n,
110
+ },
111
+ ]);
112
+ const client = { readContract };
113
+ const pairs = await getV6SuckerPairs(client, {
114
+ chainId: 11155111,
115
+ projectId: 4n,
116
+ });
117
+ expect(readContract).toHaveBeenCalledWith(expect.objectContaining({
118
+ address: v6Address("JBSuckerRegistry", 11155111),
119
+ functionName: "suckerPairsOf",
120
+ args: [4n],
121
+ }));
122
+ expect(pairs).toEqual([
123
+ {
124
+ local: sucker,
125
+ remote: beneficiary, // checksummed low-20-bytes of the bytes32 remote
126
+ remoteChainId: 10n,
127
+ },
128
+ ]);
129
+ });
130
+ });
131
+ });
132
+ //# sourceMappingURL=suckers.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"suckers.test.js","sourceRoot":"","sources":["../../../src/v6/suckers.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ import { Address, PublicClient } from "viem";
2
+ import { JBChainId } from "../types.js";
3
+ /**
4
+ * A payment terminal resolved for a `(projectId, token)` pair.
5
+ */
6
+ export interface ResolvedPaymentTerminal {
7
+ /**
8
+ * The terminal address payments for the token should be sent to.
9
+ */
10
+ address: Address;
11
+ /**
12
+ * True when the project has no primary terminal for the token and the
13
+ * JBRouterTerminalRegistry (a universal terminal with the same `pay` signature) is
14
+ * used instead.
15
+ */
16
+ isRouter: boolean;
17
+ }
18
+ /**
19
+ * A v6 terminal accounting context.
20
+ */
21
+ export interface JBAccountingContext {
22
+ /**
23
+ * The token the context applies to.
24
+ */
25
+ token: Address;
26
+ /**
27
+ * The token's number of decimals.
28
+ */
29
+ decimals: number;
30
+ /**
31
+ * The token's accounting-context currency: `uint32(uint160(token))`.
32
+ */
33
+ currency: number;
34
+ }
35
+ /**
36
+ * Resolve the terminal to pay a project's `token` payments to.
37
+ *
38
+ * Reads `JBDirectory.primaryTerminalOf(projectId, token)`. When the project has no
39
+ * primary terminal for the token (zero address), falls back to the
40
+ * JBRouterTerminalRegistry — a universal terminal that accepts any token and exposes
41
+ * the same `pay` signature.
42
+ *
43
+ * @param client A viem public client on the given chain.
44
+ * @param args.chainId The chain to resolve on.
45
+ * @param args.projectId The project's id.
46
+ * @param args.token The token being paid.
47
+ * @returns The terminal address and whether it's the router registry fallback.
48
+ */
49
+ export declare function resolvePaymentTerminal(client: PublicClient, { chainId, projectId, token, }: {
50
+ chainId: JBChainId;
51
+ projectId: bigint;
52
+ token: Address;
53
+ }): Promise<ResolvedPaymentTerminal>;
54
+ /**
55
+ * Read the accounting contexts (accepted tokens with their decimals and currencies)
56
+ * registered for a project on the JBMultiTerminal.
57
+ *
58
+ * @param client A viem public client on the given chain.
59
+ * @param args.chainId The chain to read from.
60
+ * @param args.projectId The project's id.
61
+ * @returns The project's accounting contexts.
62
+ */
63
+ export declare function getAccountingContexts(client: PublicClient, { chainId, projectId, }: {
64
+ chainId: JBChainId;
65
+ projectId: bigint;
66
+ }): Promise<readonly JBAccountingContext[]>;
67
+ //# sourceMappingURL=terminals.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminals.d.ts","sourceRoot":"","sources":["../../../src/v6/terminals.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,YAAY,EAAe,MAAM,MAAM,CAAC;AAE1D,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAGxC;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC;;OAEG;IACH,OAAO,EAAE,OAAO,CAAC;IACjB;;;;OAIG;IACH,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC;;OAEG;IACH,KAAK,EAAE,OAAO,CAAC;IACf;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;IACjB;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,YAAY,EACpB,EACE,OAAO,EACP,SAAS,EACT,KAAK,GACN,EAAE;IACD,OAAO,EAAE,SAAS,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,OAAO,CAAC;CAChB,GACA,OAAO,CAAC,uBAAuB,CAAC,CAgBlC;AAED;;;;;;;;GAQG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,YAAY,EACpB,EACE,OAAO,EACP,SAAS,GACV,EAAE;IACD,OAAO,EAAE,SAAS,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB,GACA,OAAO,CAAC,SAAS,mBAAmB,EAAE,CAAC,CAOzC"}
@@ -0,0 +1,50 @@
1
+ import { zeroAddress } from "viem";
2
+ import { jbDirectoryAbi, jbMultiTerminalAbi } from "../generated/juicebox.js";
3
+ import { v6Address } from "./types.js";
4
+ /**
5
+ * Resolve the terminal to pay a project's `token` payments to.
6
+ *
7
+ * Reads `JBDirectory.primaryTerminalOf(projectId, token)`. When the project has no
8
+ * primary terminal for the token (zero address), falls back to the
9
+ * JBRouterTerminalRegistry — a universal terminal that accepts any token and exposes
10
+ * the same `pay` signature.
11
+ *
12
+ * @param client A viem public client on the given chain.
13
+ * @param args.chainId The chain to resolve on.
14
+ * @param args.projectId The project's id.
15
+ * @param args.token The token being paid.
16
+ * @returns The terminal address and whether it's the router registry fallback.
17
+ */
18
+ export async function resolvePaymentTerminal(client, { chainId, projectId, token, }) {
19
+ const primaryTerminal = await client.readContract({
20
+ address: v6Address("JBDirectory", chainId),
21
+ abi: jbDirectoryAbi,
22
+ functionName: "primaryTerminalOf",
23
+ args: [projectId, token],
24
+ });
25
+ if (primaryTerminal === zeroAddress) {
26
+ return {
27
+ address: v6Address("JBRouterTerminalRegistry", chainId),
28
+ isRouter: true,
29
+ };
30
+ }
31
+ return { address: primaryTerminal, isRouter: false };
32
+ }
33
+ /**
34
+ * Read the accounting contexts (accepted tokens with their decimals and currencies)
35
+ * registered for a project on the JBMultiTerminal.
36
+ *
37
+ * @param client A viem public client on the given chain.
38
+ * @param args.chainId The chain to read from.
39
+ * @param args.projectId The project's id.
40
+ * @returns The project's accounting contexts.
41
+ */
42
+ export async function getAccountingContexts(client, { chainId, projectId, }) {
43
+ return client.readContract({
44
+ address: v6Address("JBMultiTerminal", chainId),
45
+ abi: jbMultiTerminalAbi,
46
+ functionName: "accountingContextsOf",
47
+ args: [projectId],
48
+ });
49
+ }
50
+ //# sourceMappingURL=terminals.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminals.js","sourceRoot":"","sources":["../../../src/v6/terminals.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyB,WAAW,EAAE,MAAM,MAAM,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAE9E,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAoCvC;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,MAAoB,EACpB,EACE,OAAO,EACP,SAAS,EACT,KAAK,GAKN;IAED,MAAM,eAAe,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC;QAChD,OAAO,EAAE,SAAS,CAAC,aAAa,EAAE,OAAO,CAAC;QAC1C,GAAG,EAAE,cAAc;QACnB,YAAY,EAAE,mBAAmB;QACjC,IAAI,EAAE,CAAC,SAAS,EAAE,KAAK,CAAC;KACzB,CAAC,CAAC;IAEH,IAAI,eAAe,KAAK,WAAW,EAAE,CAAC;QACpC,OAAO;YACL,OAAO,EAAE,SAAS,CAAC,0BAA0B,EAAE,OAAO,CAAC;YACvD,QAAQ,EAAE,IAAI;SACf,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;AACvD,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,MAAoB,EACpB,EACE,OAAO,EACP,SAAS,GAIV;IAED,OAAO,MAAM,CAAC,YAAY,CAAC;QACzB,OAAO,EAAE,SAAS,CAAC,iBAAiB,EAAE,OAAO,CAAC;QAC9C,GAAG,EAAE,kBAAkB;QACvB,YAAY,EAAE,sBAAsB;QACpC,IAAI,EAAE,CAAC,SAAS,CAAC;KAClB,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=terminals.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminals.test.d.ts","sourceRoot":"","sources":["../../../src/v6/terminals.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,57 @@
1
+ import { zeroAddress } from "viem";
2
+ import { describe, expect, test } from "vitest";
3
+ import { NATIVE_TOKEN } from "../constants.js";
4
+ import { jbDirectoryAbi, jbMultiTerminalAbi } from "../generated/juicebox.js";
5
+ import { getAccountingContexts, resolvePaymentTerminal } from "./terminals.js";
6
+ import { v6Address } from "./types.js";
7
+ const chainId = 11155111;
8
+ const projectId = 3n;
9
+ function mockClient(result, calls = []) {
10
+ return {
11
+ async readContract(params) {
12
+ calls.push(params);
13
+ return result;
14
+ },
15
+ };
16
+ }
17
+ describe("terminals", () => {
18
+ test("resolvePaymentTerminal returns the primary terminal when set", async () => {
19
+ const terminal = "0x1111111111111111111111111111111111111111";
20
+ const calls = [];
21
+ const resolved = await resolvePaymentTerminal(mockClient(terminal, calls), {
22
+ chainId,
23
+ projectId,
24
+ token: NATIVE_TOKEN,
25
+ });
26
+ expect(resolved).toEqual({ address: terminal, isRouter: false });
27
+ expect(calls[0].address).toEqual(v6Address("JBDirectory", chainId));
28
+ expect(calls[0].abi).toBe(jbDirectoryAbi);
29
+ expect(calls[0].functionName).toEqual("primaryTerminalOf");
30
+ expect(calls[0].args).toEqual([projectId, NATIVE_TOKEN]);
31
+ });
32
+ test("resolvePaymentTerminal falls back to the router registry", async () => {
33
+ const resolved = await resolvePaymentTerminal(mockClient(zeroAddress), {
34
+ chainId,
35
+ projectId,
36
+ token: NATIVE_TOKEN,
37
+ });
38
+ expect(resolved).toEqual({
39
+ address: v6Address("JBRouterTerminalRegistry", chainId),
40
+ isRouter: true,
41
+ });
42
+ });
43
+ test("getAccountingContexts reads the multi terminal", async () => {
44
+ const contexts = [{ token: NATIVE_TOKEN, decimals: 18, currency: 61166 }];
45
+ const calls = [];
46
+ const result = await getAccountingContexts(mockClient(contexts, calls), {
47
+ chainId,
48
+ projectId,
49
+ });
50
+ expect(result).toEqual(contexts);
51
+ expect(calls[0].address).toEqual(v6Address("JBMultiTerminal", chainId));
52
+ expect(calls[0].abi).toBe(jbMultiTerminalAbi);
53
+ expect(calls[0].functionName).toEqual("accountingContextsOf");
54
+ expect(calls[0].args).toEqual([projectId]);
55
+ });
56
+ });
57
+ //# sourceMappingURL=terminals.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminals.test.js","sourceRoot":"","sources":["../../../src/v6/terminals.test.ts"],"names":[],"mappings":"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"}