@varla/sdk 1.11.4 → 1.13.2

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 (238) hide show
  1. package/AGENTS.md +82 -95
  2. package/CHANGELOG.md +359 -0
  3. package/README.md +227 -275
  4. package/dist/abi/full/OpinionCtfExecutionEngineAdapter.js +1 -0
  5. package/dist/abi/full/OpinionCtfExecutionEngineAdapter.js.map +1 -0
  6. package/dist/abi/full/OracleUpdaterRouter.d.ts +30 -9
  7. package/dist/abi/full/OracleUpdaterRouter.d.ts.map +1 -1
  8. package/dist/abi/full/OracleUpdaterRouter.js +37 -9
  9. package/dist/abi/full/OracleUpdaterRouter.js.map +1 -0
  10. package/dist/abi/full/PolymarketCtfAdapter.js +1 -0
  11. package/dist/abi/full/PolymarketCtfAdapter.js.map +1 -0
  12. package/dist/abi/full/VarlaAccessManager.js +1 -0
  13. package/dist/abi/full/VarlaAccessManager.js.map +1 -0
  14. package/dist/abi/full/VarlaConvertLiquidator.js +1 -0
  15. package/dist/abi/full/VarlaConvertLiquidator.js.map +1 -0
  16. package/dist/abi/full/VarlaCore.js +1 -0
  17. package/dist/abi/full/VarlaCore.js.map +1 -0
  18. package/dist/abi/full/VarlaInterestRateStrategy.js +1 -0
  19. package/dist/abi/full/VarlaInterestRateStrategy.js.map +1 -0
  20. package/dist/abi/full/VarlaLiquidator.d.ts +1 -1
  21. package/dist/abi/full/VarlaLiquidator.js +2 -1
  22. package/dist/abi/full/VarlaLiquidator.js.map +1 -0
  23. package/dist/abi/full/VarlaMergeLiquidator.js +1 -0
  24. package/dist/abi/full/VarlaMergeLiquidator.js.map +1 -0
  25. package/dist/abi/full/VarlaOracle.js +1 -0
  26. package/dist/abi/full/VarlaOracle.js.map +1 -0
  27. package/dist/abi/full/VarlaPool.js +1 -0
  28. package/dist/abi/full/VarlaPool.js.map +1 -0
  29. package/dist/abi/full/VarlaProxyAdmin.js +1 -0
  30. package/dist/abi/full/VarlaProxyAdmin.js.map +1 -0
  31. package/dist/abi/index.js +1 -0
  32. package/dist/abi/index.js.map +1 -0
  33. package/dist/abi/subsets/VarlaOracle.registry.js +1 -0
  34. package/dist/abi/subsets/VarlaOracle.registry.js.map +1 -0
  35. package/dist/abi.js +1 -0
  36. package/dist/abi.js.map +1 -0
  37. package/dist/actions/admin.js +1 -0
  38. package/dist/actions/admin.js.map +1 -0
  39. package/dist/actions/core.js +1 -0
  40. package/dist/actions/core.js.map +1 -0
  41. package/dist/actions/erc1155.js +1 -0
  42. package/dist/actions/erc1155.js.map +1 -0
  43. package/dist/actions/erc20.js +1 -0
  44. package/dist/actions/erc20.js.map +1 -0
  45. package/dist/actions/index.d.ts +7 -7
  46. package/dist/actions/index.d.ts.map +1 -1
  47. package/dist/actions/index.js +8 -7
  48. package/dist/actions/index.js.map +1 -0
  49. package/dist/actions/liquidator.js +1 -0
  50. package/dist/actions/liquidator.js.map +1 -0
  51. package/dist/actions/oracle.d.ts +1 -2
  52. package/dist/actions/oracle.d.ts.map +1 -1
  53. package/dist/actions/oracle.js +1 -0
  54. package/dist/actions/oracle.js.map +1 -0
  55. package/dist/actions/oracleUpdaterRouter.d.ts +8 -1
  56. package/dist/actions/oracleUpdaterRouter.d.ts.map +1 -1
  57. package/dist/actions/oracleUpdaterRouter.js +14 -1
  58. package/dist/actions/oracleUpdaterRouter.js.map +1 -0
  59. package/dist/actions/pool.js +1 -0
  60. package/dist/actions/pool.js.map +1 -0
  61. package/dist/actions/rbac.js +1 -0
  62. package/dist/actions/rbac.js.map +1 -0
  63. package/dist/actions/tx.js +1 -0
  64. package/dist/actions/tx.js.map +1 -0
  65. package/dist/actions/utils.js +1 -0
  66. package/dist/actions/utils.js.map +1 -0
  67. package/dist/addresses/bsc.js +1 -0
  68. package/dist/addresses/bsc.js.map +1 -0
  69. package/dist/addresses/index.js +1 -0
  70. package/dist/addresses/index.js.map +1 -0
  71. package/dist/addresses/polygon.js +1 -0
  72. package/dist/addresses/polygon.js.map +1 -0
  73. package/dist/addresses.js +1 -0
  74. package/dist/addresses.js.map +1 -0
  75. package/dist/batch.js +1 -0
  76. package/dist/batch.js.map +1 -0
  77. package/dist/contracts.d.ts +1 -2
  78. package/dist/contracts.d.ts.map +1 -1
  79. package/dist/contracts.js +2 -2
  80. package/dist/contracts.js.map +1 -0
  81. package/dist/errors.d.ts +87 -0
  82. package/dist/errors.d.ts.map +1 -0
  83. package/dist/errors.js +240 -0
  84. package/dist/errors.js.map +1 -0
  85. package/dist/events/decode.js +1 -0
  86. package/dist/events/decode.js.map +1 -0
  87. package/dist/events/defs.js +1 -0
  88. package/dist/events/defs.js.map +1 -0
  89. package/dist/events/index.d.ts +3 -3
  90. package/dist/events/index.d.ts.map +1 -1
  91. package/dist/events/index.js +4 -3
  92. package/dist/events/index.js.map +1 -0
  93. package/dist/events/logs.js +1 -0
  94. package/dist/events/logs.js.map +1 -0
  95. package/dist/events/oracleRegistrySync.js +1 -0
  96. package/dist/events/oracleRegistrySync.js.map +1 -0
  97. package/dist/events/recent.d.ts +1 -1
  98. package/dist/events/recent.d.ts.map +1 -1
  99. package/dist/events/recent.js +2 -1
  100. package/dist/events/recent.js.map +1 -0
  101. package/dist/format.js +1 -0
  102. package/dist/format.js.map +1 -0
  103. package/dist/generated.d.ts +31 -10
  104. package/dist/generated.d.ts.map +1 -1
  105. package/dist/generated.js +1 -0
  106. package/dist/generated.js.map +1 -0
  107. package/dist/index.d.ts +6 -5
  108. package/dist/index.d.ts.map +1 -1
  109. package/dist/index.js +12 -9
  110. package/dist/index.js.map +1 -0
  111. package/dist/leverage/deleverageExecute.d.ts +36 -0
  112. package/dist/leverage/deleverageExecute.d.ts.map +1 -0
  113. package/dist/leverage/deleverageExecute.js +53 -0
  114. package/dist/leverage/deleverageExecute.js.map +1 -0
  115. package/dist/leverage/execute.d.ts +62 -0
  116. package/dist/leverage/execute.d.ts.map +1 -0
  117. package/dist/leverage/execute.js +84 -0
  118. package/dist/leverage/execute.js.map +1 -0
  119. package/dist/leverage/index.d.ts +32 -0
  120. package/dist/leverage/index.d.ts.map +1 -0
  121. package/dist/leverage/index.js +12 -0
  122. package/dist/leverage/index.js.map +1 -0
  123. package/dist/leverage/math.d.ts +119 -0
  124. package/dist/leverage/math.d.ts.map +1 -0
  125. package/dist/leverage/math.js +304 -0
  126. package/dist/leverage/math.js.map +1 -0
  127. package/dist/leverage/plan.d.ts +143 -0
  128. package/dist/leverage/plan.d.ts.map +1 -0
  129. package/dist/leverage/plan.js +204 -0
  130. package/dist/leverage/plan.js.map +1 -0
  131. package/dist/leverage/preflight.d.ts +27 -0
  132. package/dist/leverage/preflight.d.ts.map +1 -0
  133. package/dist/leverage/preflight.js +34 -0
  134. package/dist/leverage/preflight.js.map +1 -0
  135. package/dist/leverage/types.d.ts +157 -0
  136. package/dist/leverage/types.d.ts.map +1 -0
  137. package/dist/leverage/types.js +43 -0
  138. package/dist/leverage/types.js.map +1 -0
  139. package/dist/meta.d.ts +42 -0
  140. package/dist/meta.d.ts.map +1 -0
  141. package/dist/meta.js +47 -0
  142. package/dist/meta.js.map +1 -0
  143. package/dist/types.js +1 -0
  144. package/dist/types.js.map +1 -0
  145. package/dist/views/accessManager.js +1 -0
  146. package/dist/views/accessManager.js.map +1 -0
  147. package/dist/views/adapters.js +1 -0
  148. package/dist/views/adapters.js.map +1 -0
  149. package/dist/views/admin.d.ts.map +1 -1
  150. package/dist/views/admin.js +1 -0
  151. package/dist/views/admin.js.map +1 -0
  152. package/dist/views/core.d.ts.map +1 -1
  153. package/dist/views/core.js +1 -0
  154. package/dist/views/core.js.map +1 -0
  155. package/dist/views/index.d.ts +5 -5
  156. package/dist/views/index.d.ts.map +1 -1
  157. package/dist/views/index.js +6 -5
  158. package/dist/views/index.js.map +1 -0
  159. package/dist/views/lenders.js +1 -0
  160. package/dist/views/lenders.js.map +1 -0
  161. package/dist/views/liquidators.js +1 -0
  162. package/dist/views/liquidators.js.map +1 -0
  163. package/dist/views/oracle.js +1 -0
  164. package/dist/views/oracle.js.map +1 -0
  165. package/dist/views/pool.js +1 -0
  166. package/dist/views/pool.js.map +1 -0
  167. package/dist/views/system.d.ts.map +1 -1
  168. package/dist/views/system.js +1 -0
  169. package/dist/views/system.js.map +1 -0
  170. package/package.json +18 -5
  171. package/src/abi/README.md +17 -0
  172. package/src/abi/full/OpinionCtfExecutionEngineAdapter.ts +320 -0
  173. package/src/abi/full/OracleUpdaterRouter.ts +528 -0
  174. package/src/abi/full/PolymarketCtfAdapter.ts +312 -0
  175. package/src/abi/full/VarlaAccessManager.ts +1171 -0
  176. package/src/abi/full/VarlaConvertLiquidator.ts +834 -0
  177. package/src/abi/full/VarlaCore.ts +2277 -0
  178. package/src/abi/full/VarlaInterestRateStrategy.ts +442 -0
  179. package/src/abi/full/VarlaLiquidator.ts +914 -0
  180. package/src/abi/full/VarlaMergeLiquidator.ts +797 -0
  181. package/src/abi/full/VarlaOracle.ts +1825 -0
  182. package/src/abi/full/VarlaPool.ts +1637 -0
  183. package/src/abi/full/VarlaProxyAdmin.ts +301 -0
  184. package/src/abi/index.ts +17 -0
  185. package/src/abi/subsets/VarlaOracle.registry.ts +784 -0
  186. package/src/abi.ts +2 -0
  187. package/src/actions/admin.ts +357 -0
  188. package/src/actions/core.ts +68 -0
  189. package/src/actions/erc1155.ts +22 -0
  190. package/src/actions/erc20.ts +22 -0
  191. package/src/actions/index.ts +13 -0
  192. package/src/actions/liquidator.ts +76 -0
  193. package/src/actions/oracle.ts +618 -0
  194. package/src/actions/oracleUpdaterRouter.ts +233 -0
  195. package/src/actions/pool.ts +76 -0
  196. package/src/actions/rbac.ts +72 -0
  197. package/src/actions/tx.ts +16 -0
  198. package/src/actions/utils.ts +15 -0
  199. package/src/addresses/README.md +17 -0
  200. package/src/addresses/bsc.json +16 -0
  201. package/src/addresses/bsc.ts +15 -0
  202. package/src/addresses/index.ts +6 -0
  203. package/src/addresses/polygon.json +16 -0
  204. package/src/addresses/polygon.ts +15 -0
  205. package/src/addresses.ts +2 -0
  206. package/src/batch.ts +55 -0
  207. package/src/contracts.ts +232 -0
  208. package/src/errors.ts +305 -0
  209. package/src/events/decode.ts +37 -0
  210. package/src/events/defs.ts +70 -0
  211. package/src/events/index.ts +7 -0
  212. package/src/events/logs.ts +42 -0
  213. package/src/events/oracleRegistrySync.ts +206 -0
  214. package/src/events/recent.ts +39 -0
  215. package/src/format.ts +121 -0
  216. package/src/generated.ts +27 -0
  217. package/src/index.ts +18 -0
  218. package/src/leverage/deleverageExecute.ts +111 -0
  219. package/src/leverage/execute.ts +172 -0
  220. package/src/leverage/index.ts +88 -0
  221. package/src/leverage/math.ts +446 -0
  222. package/src/leverage/plan.ts +356 -0
  223. package/src/leverage/preflight.ts +63 -0
  224. package/src/leverage/types.ts +204 -0
  225. package/src/meta.ts +82 -0
  226. package/src/types.ts +25 -0
  227. package/src/views/accessManager.ts +286 -0
  228. package/src/views/adapters.ts +27 -0
  229. package/src/views/admin.ts +92 -0
  230. package/src/views/core.ts +1370 -0
  231. package/src/views/index.ts +11 -0
  232. package/src/views/lenders.ts +65 -0
  233. package/src/views/liquidators.ts +227 -0
  234. package/src/views/oracle.ts +739 -0
  235. package/src/views/pool.ts +277 -0
  236. package/src/views/system.ts +42 -0
  237. package/BACKEND.md +0 -405
  238. package/FRONTEND.md +0 -485
@@ -0,0 +1,233 @@
1
+ // Note: explicit .js extension is required for Node ESM resolution.
2
+
3
+ import type { Address, Hash, Hex } from "viem";
4
+ import { concat, encodeAbiParameters, encodePacked, keccak256, toHex } from "viem";
5
+
6
+ import { abis } from "../generated.js";
7
+
8
+ /**
9
+ * EIP-712 payload builder for OracleUpdaterRouter.
10
+ *
11
+ * Router contract name/version are fixed by the solidity constructor:
12
+ * - name: VarlaOracleUpdaterRouter
13
+ * - version: 1
14
+ */
15
+ export const ORACLE_UPDATER_ROUTER_EIP712 = {
16
+ name: "VarlaOracleUpdaterRouter",
17
+ version: "2",
18
+ } as const;
19
+
20
+ // ── Nonce-lane helpers (EIP-4337 style) ─────────────────────────────────────
21
+
22
+ /** Upper 192 bits = lane key, lower 64 bits = sequential counter. */
23
+ export function buildNonce(laneKey: bigint, seq: bigint): bigint {
24
+ return (laneKey << 64n) | (seq & 0xffffffffffffffffn);
25
+ }
26
+
27
+ /** Split a combined nonce into { laneKey, seq }. */
28
+ export function splitNonce(nonce: bigint): { laneKey: bigint; seq: bigint } {
29
+ return {
30
+ laneKey: nonce >> 64n,
31
+ seq: nonce & 0xffffffffffffffffn,
32
+ };
33
+ }
34
+
35
+ export type OracleUpdaterRouterUpdate = {
36
+ oracle: Address;
37
+ chainId: bigint;
38
+ publisher: Address;
39
+ nonce: bigint;
40
+ deadline: bigint;
41
+ positionIds: readonly bigint[];
42
+ priceList: readonly bigint[];
43
+ twapList: readonly bigint[];
44
+ liquidityList: readonly bigint[];
45
+ };
46
+
47
+ export const ORACLE_UPDATER_ROUTER_TYPES = {
48
+ Update: [
49
+ { name: "oracle", type: "address" },
50
+ { name: "chainId", type: "uint256" },
51
+ { name: "publisher", type: "address" },
52
+ { name: "nonce", type: "uint256" },
53
+ { name: "deadline", type: "uint256" },
54
+ { name: "positionIdsHash", type: "bytes32" },
55
+ { name: "priceListHash", type: "bytes32" },
56
+ { name: "twapListHash", type: "bytes32" },
57
+ { name: "liquidityListHash", type: "bytes32" },
58
+ ],
59
+ } as const;
60
+
61
+ /**
62
+ * Hardcoded UPDATE_TYPEHASH from the deployed OracleUpdaterRouter contract.
63
+ *
64
+ * Computed from:
65
+ * keccak256("Update(address oracle,uint256 chainId,address publisher,uint256 nonce,uint256 deadline,bytes32 positionIdsHash,bytes32 priceListHash,bytes32 twapListHash,bytes32 liquidityListHash)")
66
+ *
67
+ * IMPORTANT: This must match the contract's hardcoded UPDATE_TYPEHASH exactly.
68
+ * If the contract is redeployed with a different type hash, this must be updated.
69
+ */
70
+ export const UPDATE_TYPEHASH: Hash =
71
+ "0xfb5c9ee2f30c92eeb6fe0049d8ba63d98fcbb57cccd2761e2fd7275ac1bd9bd0";
72
+
73
+ /**
74
+ * Hardcoded EIP712Domain type hash.
75
+ * keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)")
76
+ */
77
+ const EIP712_DOMAIN_TYPEHASH: Hash =
78
+ "0x8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f";
79
+
80
+ /**
81
+ * Hash a uint256[] array using Solidity's abi.encodePacked semantics.
82
+ * Matches: keccak256(abi.encodePacked(uint256[]))
83
+ */
84
+ function hashU256Array(xs: readonly bigint[]): Hash {
85
+ if (xs.length === 0) return keccak256(new Uint8Array([]));
86
+ // abi.encodePacked(uint256[]) is just tight packing of each uint256 as 32 bytes
87
+ const packed = encodePacked(
88
+ xs.map(() => "uint256" as const),
89
+ xs as bigint[],
90
+ );
91
+ return keccak256(packed);
92
+ }
93
+
94
+ /**
95
+ * Convert an update with dynamic arrays into the typed-data "message" shape expected by the router.
96
+ */
97
+ export function toOracleUpdaterRouterTypedMessage(u: OracleUpdaterRouterUpdate) {
98
+ return {
99
+ oracle: u.oracle,
100
+ chainId: u.chainId,
101
+ publisher: u.publisher,
102
+ nonce: u.nonce,
103
+ deadline: u.deadline,
104
+ positionIdsHash: hashU256Array(u.positionIds),
105
+ priceListHash: hashU256Array(u.priceList),
106
+ twapListHash: hashU256Array(u.twapList),
107
+ liquidityListHash: hashU256Array(u.liquidityList),
108
+ } as const;
109
+ }
110
+
111
+ /**
112
+ * Compute the EIP-712 domain separator for the OracleUpdaterRouter.
113
+ */
114
+ function computeDomainSeparator(chainId: bigint, routerAddress: Address): Hash {
115
+ return keccak256(
116
+ encodeAbiParameters(
117
+ [
118
+ { type: "bytes32" },
119
+ { type: "bytes32" },
120
+ { type: "bytes32" },
121
+ { type: "uint256" },
122
+ { type: "address" },
123
+ ],
124
+ [
125
+ EIP712_DOMAIN_TYPEHASH,
126
+ keccak256(toHex(ORACLE_UPDATER_ROUTER_EIP712.name)),
127
+ keccak256(toHex(ORACLE_UPDATER_ROUTER_EIP712.version)),
128
+ chainId,
129
+ routerAddress,
130
+ ],
131
+ ),
132
+ );
133
+ }
134
+
135
+ /**
136
+ * Compute the struct hash for an Update using the contract's exact UPDATE_TYPEHASH.
137
+ * This bypasses viem's automatic type hash computation to ensure exact match with the contract.
138
+ */
139
+ function computeStructHash(update: OracleUpdaterRouterUpdate): Hash {
140
+ const msg = toOracleUpdaterRouterTypedMessage(update);
141
+
142
+ return keccak256(
143
+ encodeAbiParameters(
144
+ [
145
+ { type: "bytes32" }, // UPDATE_TYPEHASH
146
+ { type: "address" }, // oracle
147
+ { type: "uint256" }, // chainId
148
+ { type: "address" }, // publisher
149
+ { type: "uint256" }, // nonce
150
+ { type: "uint256" }, // deadline
151
+ { type: "bytes32" }, // positionIdsHash
152
+ { type: "bytes32" }, // priceListHash
153
+ { type: "bytes32" }, // twapListHash
154
+ { type: "bytes32" }, // liquidityListHash
155
+ ],
156
+ [
157
+ UPDATE_TYPEHASH,
158
+ msg.oracle,
159
+ msg.chainId,
160
+ msg.publisher,
161
+ msg.nonce,
162
+ msg.deadline,
163
+ msg.positionIdsHash,
164
+ msg.priceListHash,
165
+ msg.twapListHash,
166
+ msg.liquidityListHash,
167
+ ],
168
+ ),
169
+ );
170
+ }
171
+
172
+ /**
173
+ * Compute the EIP-712 digest that should be signed.
174
+ * This manually computes the digest to ensure exact match with the contract's hashUpdate().
175
+ */
176
+ export function computeOracleUpdaterDigest(params: {
177
+ routerAddress: Address;
178
+ update: OracleUpdaterRouterUpdate;
179
+ }): Hash {
180
+ const domainSeparator = computeDomainSeparator(params.update.chainId, params.routerAddress);
181
+ const structHash = computeStructHash(params.update);
182
+
183
+ // EIP-712: "\x19\x01" ++ domainSeparator ++ structHash
184
+ return keccak256(concat(["0x1901", domainSeparator, structHash]));
185
+ }
186
+
187
+ export async function signOracleUpdaterRouterUpdate(params: {
188
+ walletClient: {
189
+ signMessage: (args: { message: { raw: Hex } }) => Promise<Hash>;
190
+ };
191
+ routerAddress: Address;
192
+ update: OracleUpdaterRouterUpdate;
193
+ }): Promise<Hash> {
194
+ // Manually compute the EIP-712 digest to ensure exact match with contract
195
+ const digest = computeOracleUpdaterDigest({
196
+ routerAddress: params.routerAddress,
197
+ update: params.update,
198
+ });
199
+
200
+ // Sign the raw digest (not a personal_sign, just the raw hash)
201
+ return params.walletClient.signMessage({
202
+ message: { raw: digest },
203
+ });
204
+ }
205
+
206
+ export async function prepareOracleUpdaterRouterUpdatePricesWithSig(params: {
207
+ publicClient: { simulateContract: (args: any) => Promise<any> };
208
+ routerAddress: Address;
209
+ account: Address;
210
+ update: OracleUpdaterRouterUpdate;
211
+ signature: Hash;
212
+ }): Promise<any> {
213
+ return await params.publicClient.simulateContract({
214
+ address: params.routerAddress,
215
+ abi: abis.ORACLEUPDATERROUTER_ABI,
216
+ functionName: "updatePricesWithSig",
217
+ args: [
218
+ {
219
+ oracle: params.update.oracle,
220
+ chainId: params.update.chainId,
221
+ publisher: params.update.publisher,
222
+ nonce: params.update.nonce,
223
+ deadline: params.update.deadline,
224
+ positionIds: params.update.positionIds,
225
+ priceList: params.update.priceList,
226
+ twapList: params.update.twapList,
227
+ liquidityList: params.update.liquidityList,
228
+ },
229
+ params.signature,
230
+ ],
231
+ account: params.account,
232
+ });
233
+ }
@@ -0,0 +1,76 @@
1
+ // Note: explicit .js extension is required for Node ESM resolution.
2
+
3
+ import type { Address, PublicClient } from "viem";
4
+
5
+ import { abis } from "../generated.js";
6
+ import type { SimulatedTx } from "./oracle.js";
7
+
8
+ // ---------------------------------------------------------------------------
9
+ // ERC4626 (VarlaPool) write helpers
10
+ // ---------------------------------------------------------------------------
11
+
12
+ export async function preparePoolDeposit(params: {
13
+ publicClient: Pick<PublicClient, "simulateContract">;
14
+ poolAddress: Address;
15
+ account: Address;
16
+ assets: bigint;
17
+ receiver: Address;
18
+ }): Promise<SimulatedTx> {
19
+ return (await params.publicClient.simulateContract({
20
+ address: params.poolAddress,
21
+ abi: abis.VARLAPOOL_ABI,
22
+ functionName: "deposit",
23
+ args: [params.assets, params.receiver],
24
+ account: params.account,
25
+ } as any)) as any;
26
+ }
27
+
28
+ export async function preparePoolMint(params: {
29
+ publicClient: Pick<PublicClient, "simulateContract">;
30
+ poolAddress: Address;
31
+ account: Address;
32
+ shares: bigint;
33
+ receiver: Address;
34
+ }): Promise<SimulatedTx> {
35
+ return (await params.publicClient.simulateContract({
36
+ address: params.poolAddress,
37
+ abi: abis.VARLAPOOL_ABI,
38
+ functionName: "mint",
39
+ args: [params.shares, params.receiver],
40
+ account: params.account,
41
+ } as any)) as any;
42
+ }
43
+
44
+ export async function preparePoolWithdraw(params: {
45
+ publicClient: Pick<PublicClient, "simulateContract">;
46
+ poolAddress: Address;
47
+ account: Address;
48
+ assets: bigint;
49
+ receiver: Address;
50
+ owner: Address;
51
+ }): Promise<SimulatedTx> {
52
+ return (await params.publicClient.simulateContract({
53
+ address: params.poolAddress,
54
+ abi: abis.VARLAPOOL_ABI,
55
+ functionName: "withdraw",
56
+ args: [params.assets, params.receiver, params.owner],
57
+ account: params.account,
58
+ } as any)) as any;
59
+ }
60
+
61
+ export async function preparePoolRedeem(params: {
62
+ publicClient: Pick<PublicClient, "simulateContract">;
63
+ poolAddress: Address;
64
+ account: Address;
65
+ shares: bigint;
66
+ receiver: Address;
67
+ owner: Address;
68
+ }): Promise<SimulatedTx> {
69
+ return (await params.publicClient.simulateContract({
70
+ address: params.poolAddress,
71
+ abi: abis.VARLAPOOL_ABI,
72
+ functionName: "redeem",
73
+ args: [params.shares, params.receiver, params.owner],
74
+ account: params.account,
75
+ } as any)) as any;
76
+ }
@@ -0,0 +1,72 @@
1
+ // Note: explicit .js extension is required for Node ESM resolution.
2
+
3
+ import type { Address, Hex } from "viem";
4
+
5
+ // ---------------------------------------------------------------------------
6
+ // Common signatures (DevEx)
7
+ // ---------------------------------------------------------------------------
8
+
9
+ /**
10
+ * ABI signatures for commonly preflighted RBAC targets.
11
+ *
12
+ * Use with `selectorFromSignature(sig)`.
13
+ */
14
+ export const ORACLE_SIGS = {
15
+ configurePositionsBatch:
16
+ "configurePositionsBatch(uint256[],uint8[],bytes32[],uint256[])" as const,
17
+ configureOppositePositions: "configureOppositePositions(uint256,uint256)" as const,
18
+ configureNegRiskPositionsBatch: "configureNegRiskPositionsBatch(uint256[],bytes32)" as const,
19
+ updatePrices: "updatePrices(uint256[],uint256[],uint256[],uint256[])" as const,
20
+ } as const;
21
+
22
+ /**
23
+ * Minimal AccessManager interface needed for RBAC preflight.
24
+ */
25
+ export type AccessManagerCanCallLike = {
26
+ read: {
27
+ canCall: (args: readonly [Address, Address, Hex]) => Promise<unknown>;
28
+ };
29
+ };
30
+
31
+ export type CanCallResult = {
32
+ immediate: boolean;
33
+ delay: bigint;
34
+ };
35
+
36
+ // wraps: AccessManager.canCall
37
+ export async function readCanCall(params: {
38
+ accessManager: AccessManagerCanCallLike;
39
+ caller: Address;
40
+ target: Address;
41
+ selector: Hex;
42
+ }): Promise<CanCallResult> {
43
+ const raw = await params.accessManager.read.canCall([
44
+ params.caller,
45
+ params.target,
46
+ params.selector,
47
+ ]);
48
+ const r: any = raw as any;
49
+ const immediate = r.immediate ?? r[0];
50
+ const delayRaw = r.delay ?? r[1];
51
+ const delay = typeof delayRaw === "bigint" ? delayRaw : BigInt(delayRaw);
52
+
53
+ if (typeof immediate !== "boolean" || typeof delay !== "bigint") {
54
+ throw new Error("Unexpected canCall() return shape");
55
+ }
56
+ return { immediate, delay };
57
+ }
58
+
59
+ /**
60
+ * Convenience preflight for UIs/backends: throws if the call is not immediately permitted.
61
+ */
62
+ export async function assertCanCallImmediate(params: {
63
+ accessManager: AccessManagerCanCallLike;
64
+ caller: Address;
65
+ target: Address;
66
+ selector: Hex;
67
+ }): Promise<void> {
68
+ const r = await readCanCall(params);
69
+ if (!r.immediate) {
70
+ throw new Error(`AccessManager.canCall denied or delayed (delay=${r.delay})`);
71
+ }
72
+ }
@@ -0,0 +1,16 @@
1
+ // Note: explicit .js extension is required for Node ESM resolution.
2
+
3
+ import type { Hash, WalletClient } from "viem";
4
+
5
+ /**
6
+ * Thin wrapper over `walletClient.writeContract`.
7
+ *
8
+ * This is intentionally minimal; callers are expected to call `simulateContract`
9
+ * first (via SDK `prepare*` helpers) and pass the returned `request` here.
10
+ */
11
+ export async function sendTx(params: {
12
+ walletClient: Pick<WalletClient, "writeContract">;
13
+ request: unknown;
14
+ }): Promise<Hash> {
15
+ return (await params.walletClient.writeContract(params.request as any)) as Hash;
16
+ }
@@ -0,0 +1,15 @@
1
+ // Note: explicit .js extension is required for Node ESM resolution.
2
+
3
+ import type { Hex } from "viem";
4
+ import { keccak256, toBytes } from "viem";
5
+
6
+ /**
7
+ * Compute a 4-byte function selector from a Solidity function signature.
8
+ *
9
+ * Example:
10
+ * - "borrow(uint256)" -> 0x....
11
+ */
12
+ export function selectorFromSignature(signature: string): Hex {
13
+ const hash = keccak256(toBytes(signature));
14
+ return `0x${hash.slice(2, 10)}` as Hex;
15
+ }
@@ -0,0 +1,17 @@
1
+ This folder is generated.
2
+
3
+ Run from repo root:
4
+
5
+ ```bash
6
+ bun run gen:sdk
7
+ ```
8
+
9
+ (Legacy alias: `bun run gen:protocol`)
10
+
11
+ Or run from the SDK package:
12
+
13
+ ```bash
14
+ cd packages/sdk
15
+ bun run gen
16
+ ```
17
+
@@ -0,0 +1,16 @@
1
+ {
2
+ "chain": "bsc",
3
+ "generatedAt": "",
4
+ "deploymentsDir": "bsc",
5
+ "contracts": {
6
+ "VarlaAccessManager": "0xd1FbB7E03EAe69314bc1A8412da464844d31208D",
7
+ "VarlaOracle": "0x9F4eFE380f6A1c124056ABC64fAe6c18d9a717ee",
8
+ "VarlaCore": "0x765CFa9BFD553B81985cc614559F5F4Ce8B617e0",
9
+ "VarlaPool": "0x4a7fEDCc9365A98Fc482358f08b132f82fEE2eCb",
10
+ "OracleUpdaterRouter": "0x58fbf3be3d0CbBed091ad6940d4dbF7462bEb6aA",
11
+ "VarlaLiquidator": "0xf53eBDf041EEa32794d883CA9C4380775abd592A",
12
+ "VarlaMergeLiquidator": "0x651e48875e07B66ec886E68249449A5F795B545d",
13
+ "VarlaConvertLiquidator": "0xd265863a9A4860E73E4d9b0EE2783A3e379b53Ca",
14
+ "OpinionCtfExecutionEngineAdapter": "0x9E56d02E50ba99943aB6A3f6Bd466E7954674A31"
15
+ }
16
+ }
@@ -0,0 +1,15 @@
1
+ // Auto-generated from varla-protocol deployments/bsc
2
+ import type { AddressBook } from "../types";
3
+
4
+ export const bsc: AddressBook = {
5
+ accessManager: "0xd1FbB7E03EAe69314bc1A8412da464844d31208D",
6
+ oracle: "0x9F4eFE380f6A1c124056ABC64fAe6c18d9a717ee",
7
+ core: "0x765CFa9BFD553B81985cc614559F5F4Ce8B617e0",
8
+ pool: "0x4a7fEDCc9365A98Fc482358f08b132f82fEE2eCb",
9
+ oracleUpdaterRouter: "0x58fbf3be3d0CbBed091ad6940d4dbF7462bEb6aA",
10
+ liquidator: "0xf53eBDf041EEa32794d883CA9C4380775abd592A",
11
+ mergeLiquidator: "0x651e48875e07B66ec886E68249449A5F795B545d",
12
+ convertLiquidator: "0xd265863a9A4860E73E4d9b0EE2783A3e379b53Ca",
13
+ opinionCtfExecutionEngineAdapter: "0x9E56d02E50ba99943aB6A3f6Bd466E7954674A31",
14
+ };
15
+
@@ -0,0 +1,6 @@
1
+ // Auto-generated by varla-protocol/scripts/export-addressbook.ts
2
+ // Do not edit manually.
3
+
4
+ export * from "./polygon.js";
5
+ export * from "./bsc.js";
6
+
@@ -0,0 +1,16 @@
1
+ {
2
+ "chain": "polygon",
3
+ "generatedAt": "",
4
+ "deploymentsDir": "polygon",
5
+ "contracts": {
6
+ "VarlaAccessManager": "0x8D0Afc20555F3B0042A542d4843F8d03B85e89Ad",
7
+ "VarlaOracle": "0x196519791b96051104dE06aeA887D9cC8D5e4A15",
8
+ "VarlaCore": "0x0E611985132Ee9C13fe8e9ADC9cB094a250FBb82",
9
+ "VarlaPool": "0x62DB666faC25a2280917CDd59A9370E66A2ea533",
10
+ "OracleUpdaterRouter": "0xa9Bf7DcaA9b40950aC645D61f334155a8F00e734",
11
+ "VarlaLiquidator": "0x0BcE7dc799C8d7011ea48B9D4Abd2657D6d9e2E9",
12
+ "VarlaMergeLiquidator": "0x991B90cd8CEC1E5526fF04b01811250204A563ab",
13
+ "VarlaConvertLiquidator": "0x4554316C874ed1Dcb128B34cC5204Ae4717fAa9B",
14
+ "PolymarketCtfAdapter": "0x38aF55797a6F31bd9313d88b3D0Bb81a6a2007E3"
15
+ }
16
+ }
@@ -0,0 +1,15 @@
1
+ // Auto-generated from varla-protocol deployments/polygon
2
+ import type { AddressBook } from "../types";
3
+
4
+ export const polygon: AddressBook = {
5
+ accessManager: "0x8D0Afc20555F3B0042A542d4843F8d03B85e89Ad",
6
+ oracle: "0x196519791b96051104dE06aeA887D9cC8D5e4A15",
7
+ core: "0x0E611985132Ee9C13fe8e9ADC9cB094a250FBb82",
8
+ pool: "0x62DB666faC25a2280917CDd59A9370E66A2ea533",
9
+ oracleUpdaterRouter: "0xa9Bf7DcaA9b40950aC645D61f334155a8F00e734",
10
+ liquidator: "0x0BcE7dc799C8d7011ea48B9D4Abd2657D6d9e2E9",
11
+ mergeLiquidator: "0x991B90cd8CEC1E5526fF04b01811250204A563ab",
12
+ convertLiquidator: "0x4554316C874ed1Dcb128B34cC5204Ae4717fAa9B",
13
+ polymarketCtfAdapter: "0x38aF55797a6F31bd9313d88b3D0Bb81a6a2007E3",
14
+ };
15
+
@@ -0,0 +1,2 @@
1
+ // Note: explicit .js extension is required for Node ESM resolution.
2
+ export * from "./addresses/index.js";
package/src/batch.ts ADDED
@@ -0,0 +1,55 @@
1
+ // Note: explicit .js extension is required for Node ESM resolution.
2
+
3
+ import type { Abi, Address, PublicClient } from "viem";
4
+
5
+ export type MulticallChunkOptions = {
6
+ /** Number of calls per multicall batch. */
7
+ chunkSize?: number;
8
+ };
9
+
10
+ /**
11
+ * Small utility to chunk an array.
12
+ */
13
+ export function chunk<T>(items: readonly T[], chunkSize: number): T[][] {
14
+ if (chunkSize <= 0) throw new Error(`chunkSize must be > 0 (got ${chunkSize})`);
15
+ const out: T[][] = [];
16
+ for (let i = 0; i < items.length; i += chunkSize) out.push(items.slice(i, i + chunkSize));
17
+ return out;
18
+ }
19
+
20
+ /**
21
+ * Executes `client.multicall` in chunks.
22
+ *
23
+ * - Keeps requests bounded for public RPC providers.
24
+ * - Preserves order.
25
+ */
26
+ export async function multicallChunks<_TAbi extends Abi>(params: {
27
+ client: PublicClient;
28
+ // Keep this type explicit and non-generic.
29
+ // viem's `PublicClient` is generic, and extracting `multicall`'s parameter types
30
+ // from an un-parameterized PublicClient can degrade to `unknown[]`.
31
+ contracts: readonly {
32
+ address: Address;
33
+ abi: Abi;
34
+ functionName: string;
35
+ args?: readonly unknown[] | undefined;
36
+ }[];
37
+ chunkSize?: number;
38
+ }): Promise<Awaited<ReturnType<PublicClient["multicall"]>>> {
39
+ const { client } = params;
40
+ const chunkSize = params.chunkSize ?? 128;
41
+ const calls = params.contracts;
42
+
43
+ if (calls.length === 0) return [] as any;
44
+
45
+ // Note: we avoid a generic chunk() here because TS can sometimes lose the
46
+ // `client.multicall` contract-call type across the generic boundary.
47
+ const out: any[] = [];
48
+ for (let i = 0; i < calls.length; i += chunkSize) {
49
+ const slice = calls.slice(i, i + chunkSize);
50
+ const res = await client.multicall({ contracts: slice as any });
51
+ out.push(...res);
52
+ }
53
+
54
+ return out as any;
55
+ }