@nktkas/hyperliquid 0.24.3 → 0.25.0-beta.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 (358) hide show
  1. package/README.md +141 -32
  2. package/esm/mod.d.ts +11 -11
  3. package/esm/mod.d.ts.map +1 -1
  4. package/esm/mod.js +2 -1
  5. package/esm/mod.js.map +1 -0
  6. package/esm/src/clients/exchange.d.ts +29 -25
  7. package/esm/src/clients/exchange.d.ts.map +1 -1
  8. package/esm/src/clients/exchange.js +54 -53
  9. package/esm/src/clients/exchange.js.map +1 -0
  10. package/esm/src/clients/info.d.ts +80 -20
  11. package/esm/src/clients/info.d.ts.map +1 -1
  12. package/esm/src/clients/info.js +312 -73
  13. package/esm/src/clients/info.js.map +1 -0
  14. package/esm/src/clients/multiSign.d.ts +11 -7
  15. package/esm/src/clients/multiSign.d.ts.map +1 -1
  16. package/esm/src/clients/multiSign.js +2 -1
  17. package/esm/src/clients/multiSign.js.map +1 -0
  18. package/esm/src/clients/subscription.d.ts +9 -9
  19. package/esm/src/clients/subscription.d.ts.map +1 -1
  20. package/esm/src/clients/subscription.js +29 -27
  21. package/esm/src/clients/subscription.js.map +1 -0
  22. package/esm/src/{base.d.ts → errors.d.ts} +1 -1
  23. package/esm/src/errors.d.ts.map +1 -0
  24. package/esm/src/{base.js → errors.js} +1 -0
  25. package/esm/src/errors.js.map +1 -0
  26. package/esm/src/schemas/_base.d.ts +14 -0
  27. package/esm/src/schemas/_base.d.ts.map +1 -0
  28. package/esm/src/schemas/_base.js +15 -0
  29. package/esm/src/schemas/_base.js.map +1 -0
  30. package/esm/src/schemas/exchange/requests.d.ts +8953 -0
  31. package/esm/src/schemas/exchange/requests.d.ts.map +1 -0
  32. package/esm/src/schemas/exchange/requests.js +1414 -0
  33. package/esm/src/schemas/exchange/requests.js.map +1 -0
  34. package/esm/src/schemas/exchange/responses.d.ts +567 -0
  35. package/esm/src/schemas/exchange/responses.d.ts.map +1 -0
  36. package/esm/src/schemas/exchange/responses.js +244 -0
  37. package/esm/src/schemas/exchange/responses.js.map +1 -0
  38. package/esm/src/schemas/explorer/requests.d.ts +44 -0
  39. package/esm/src/schemas/explorer/requests.d.ts.map +1 -0
  40. package/esm/src/schemas/explorer/requests.js +33 -0
  41. package/esm/src/schemas/explorer/requests.js.map +1 -0
  42. package/esm/src/schemas/explorer/responses.d.ts +360 -0
  43. package/esm/src/schemas/explorer/responses.d.ts.map +1 -0
  44. package/esm/src/schemas/explorer/responses.js +57 -0
  45. package/esm/src/schemas/explorer/responses.js.map +1 -0
  46. package/esm/src/schemas/info/accounts.d.ts +2159 -0
  47. package/esm/src/schemas/info/accounts.d.ts.map +1 -0
  48. package/esm/src/schemas/info/accounts.js +623 -0
  49. package/esm/src/schemas/info/accounts.js.map +1 -0
  50. package/esm/src/schemas/info/assets.d.ts +974 -0
  51. package/esm/src/schemas/info/assets.d.ts.map +1 -0
  52. package/esm/src/schemas/info/assets.js +285 -0
  53. package/esm/src/schemas/info/assets.js.map +1 -0
  54. package/esm/src/schemas/info/markets.d.ts +155 -0
  55. package/esm/src/schemas/info/markets.d.ts.map +1 -0
  56. package/esm/src/schemas/info/markets.js +70 -0
  57. package/esm/src/schemas/info/markets.js.map +1 -0
  58. package/esm/src/schemas/info/orders.d.ts +957 -0
  59. package/esm/src/schemas/info/orders.d.ts.map +1 -0
  60. package/esm/src/schemas/info/orders.js +298 -0
  61. package/esm/src/schemas/info/orders.js.map +1 -0
  62. package/esm/src/schemas/info/requests.d.ts +924 -0
  63. package/esm/src/schemas/info/requests.d.ts.map +1 -0
  64. package/esm/src/schemas/info/requests.js +687 -0
  65. package/esm/src/schemas/info/requests.js.map +1 -0
  66. package/esm/src/schemas/info/validators.d.ts +326 -0
  67. package/esm/src/schemas/info/validators.d.ts.map +1 -0
  68. package/esm/src/schemas/info/validators.js +126 -0
  69. package/esm/src/schemas/info/validators.js.map +1 -0
  70. package/esm/src/schemas/info/vaults.d.ts +447 -0
  71. package/esm/src/schemas/info/vaults.d.ts.map +1 -0
  72. package/esm/src/schemas/info/vaults.js +111 -0
  73. package/esm/src/schemas/info/vaults.js.map +1 -0
  74. package/esm/src/schemas/mod.d.ts +101 -0
  75. package/esm/src/schemas/mod.d.ts.map +1 -0
  76. package/esm/src/schemas/mod.js +115 -0
  77. package/esm/src/schemas/mod.js.map +1 -0
  78. package/esm/src/schemas/subscriptions/requests.d.ts +332 -0
  79. package/esm/src/schemas/subscriptions/requests.d.ts.map +1 -0
  80. package/esm/src/schemas/subscriptions/requests.js +259 -0
  81. package/esm/src/schemas/subscriptions/requests.js.map +1 -0
  82. package/esm/src/schemas/subscriptions/responses.d.ts +3643 -0
  83. package/esm/src/schemas/subscriptions/responses.d.ts.map +1 -0
  84. package/esm/src/schemas/subscriptions/responses.js +234 -0
  85. package/esm/src/schemas/subscriptions/responses.js.map +1 -0
  86. package/esm/src/signing/_signTypedData/ethers.js +1 -0
  87. package/esm/src/signing/_signTypedData/ethers.js.map +1 -0
  88. package/esm/src/signing/_signTypedData/mod.js +1 -0
  89. package/esm/src/signing/_signTypedData/mod.js.map +1 -0
  90. package/esm/src/signing/_signTypedData/private_key.js +1 -0
  91. package/esm/src/signing/_signTypedData/private_key.js.map +1 -0
  92. package/esm/src/signing/_signTypedData/viem.js +1 -0
  93. package/esm/src/signing/_signTypedData/viem.js.map +1 -0
  94. package/esm/src/signing/mod.d.ts +109 -29
  95. package/esm/src/signing/mod.d.ts.map +1 -1
  96. package/esm/src/signing/mod.js +136 -29
  97. package/esm/src/signing/mod.js.map +1 -0
  98. package/esm/src/transports/base.d.ts +4 -4
  99. package/esm/src/transports/base.d.ts.map +1 -1
  100. package/esm/src/transports/base.js +3 -2
  101. package/esm/src/transports/base.js.map +1 -0
  102. package/esm/src/transports/http/http_transport.d.ts +3 -2
  103. package/esm/src/transports/http/http_transport.d.ts.map +1 -1
  104. package/esm/src/transports/http/http_transport.js +1 -0
  105. package/esm/src/transports/http/http_transport.js.map +1 -0
  106. package/esm/src/transports/websocket/_hyperliquid_event_target.d.ts +1 -1
  107. package/esm/src/transports/websocket/_hyperliquid_event_target.d.ts.map +1 -1
  108. package/esm/src/transports/websocket/_hyperliquid_event_target.js +1 -0
  109. package/esm/src/transports/websocket/_hyperliquid_event_target.js.map +1 -0
  110. package/esm/src/transports/websocket/_reconnecting_websocket.js +1 -0
  111. package/esm/src/transports/websocket/_reconnecting_websocket.js.map +1 -0
  112. package/esm/src/transports/websocket/_websocket_async_request.js +1 -0
  113. package/esm/src/transports/websocket/_websocket_async_request.js.map +1 -0
  114. package/esm/src/transports/websocket/websocket_transport.d.ts +9 -1
  115. package/esm/src/transports/websocket/websocket_transport.d.ts.map +1 -1
  116. package/esm/src/transports/websocket/websocket_transport.js +4 -0
  117. package/esm/src/transports/websocket/websocket_transport.js.map +1 -0
  118. package/package.json +6 -5
  119. package/script/mod.d.ts +11 -11
  120. package/script/mod.d.ts.map +1 -1
  121. package/script/mod.js +2 -1
  122. package/script/mod.js.map +1 -0
  123. package/script/src/clients/exchange.d.ts +29 -25
  124. package/script/src/clients/exchange.d.ts.map +1 -1
  125. package/script/src/clients/exchange.js +60 -59
  126. package/script/src/clients/exchange.js.map +1 -0
  127. package/script/src/clients/info.d.ts +80 -20
  128. package/script/src/clients/info.d.ts.map +1 -1
  129. package/script/src/clients/info.js +312 -73
  130. package/script/src/clients/info.js.map +1 -0
  131. package/script/src/clients/multiSign.d.ts +11 -7
  132. package/script/src/clients/multiSign.d.ts.map +1 -1
  133. package/script/src/clients/multiSign.js +2 -1
  134. package/script/src/clients/multiSign.js.map +1 -0
  135. package/script/src/clients/subscription.d.ts +9 -9
  136. package/script/src/clients/subscription.d.ts.map +1 -1
  137. package/script/src/clients/subscription.js +29 -27
  138. package/script/src/clients/subscription.js.map +1 -0
  139. package/script/src/{base.d.ts → errors.d.ts} +1 -1
  140. package/script/src/errors.d.ts.map +1 -0
  141. package/script/src/{base.js → errors.js} +1 -0
  142. package/script/src/errors.js.map +1 -0
  143. package/script/src/schemas/_base.d.ts +14 -0
  144. package/script/src/schemas/_base.d.ts.map +1 -0
  145. package/script/src/schemas/_base.js +51 -0
  146. package/script/src/schemas/_base.js.map +1 -0
  147. package/script/src/schemas/exchange/requests.d.ts +8953 -0
  148. package/script/src/schemas/exchange/requests.d.ts.map +1 -0
  149. package/script/src/schemas/exchange/requests.js +1450 -0
  150. package/script/src/schemas/exchange/requests.js.map +1 -0
  151. package/script/src/schemas/exchange/responses.d.ts +567 -0
  152. package/script/src/schemas/exchange/responses.d.ts.map +1 -0
  153. package/script/src/schemas/exchange/responses.js +280 -0
  154. package/script/src/schemas/exchange/responses.js.map +1 -0
  155. package/script/src/schemas/explorer/requests.d.ts +44 -0
  156. package/script/src/schemas/explorer/requests.d.ts.map +1 -0
  157. package/script/src/schemas/explorer/requests.js +69 -0
  158. package/script/src/schemas/explorer/requests.js.map +1 -0
  159. package/script/src/schemas/explorer/responses.d.ts +360 -0
  160. package/script/src/schemas/explorer/responses.d.ts.map +1 -0
  161. package/script/src/schemas/explorer/responses.js +93 -0
  162. package/script/src/schemas/explorer/responses.js.map +1 -0
  163. package/script/src/schemas/info/accounts.d.ts +2159 -0
  164. package/script/src/schemas/info/accounts.d.ts.map +1 -0
  165. package/script/src/schemas/info/accounts.js +659 -0
  166. package/script/src/schemas/info/accounts.js.map +1 -0
  167. package/script/src/schemas/info/assets.d.ts +974 -0
  168. package/script/src/schemas/info/assets.d.ts.map +1 -0
  169. package/script/src/schemas/info/assets.js +321 -0
  170. package/script/src/schemas/info/assets.js.map +1 -0
  171. package/script/src/schemas/info/markets.d.ts +155 -0
  172. package/script/src/schemas/info/markets.d.ts.map +1 -0
  173. package/script/src/schemas/info/markets.js +106 -0
  174. package/script/src/schemas/info/markets.js.map +1 -0
  175. package/script/src/schemas/info/orders.d.ts +957 -0
  176. package/script/src/schemas/info/orders.d.ts.map +1 -0
  177. package/script/src/schemas/info/orders.js +334 -0
  178. package/script/src/schemas/info/orders.js.map +1 -0
  179. package/script/src/schemas/info/requests.d.ts +924 -0
  180. package/script/src/schemas/info/requests.d.ts.map +1 -0
  181. package/script/src/schemas/info/requests.js +724 -0
  182. package/script/src/schemas/info/requests.js.map +1 -0
  183. package/script/src/schemas/info/validators.d.ts +326 -0
  184. package/script/src/schemas/info/validators.d.ts.map +1 -0
  185. package/script/src/schemas/info/validators.js +162 -0
  186. package/script/src/schemas/info/validators.js.map +1 -0
  187. package/script/src/schemas/info/vaults.d.ts +447 -0
  188. package/script/src/schemas/info/vaults.d.ts.map +1 -0
  189. package/script/src/schemas/info/vaults.js +147 -0
  190. package/script/src/schemas/info/vaults.js.map +1 -0
  191. package/script/src/schemas/mod.d.ts +101 -0
  192. package/script/src/schemas/mod.d.ts.map +1 -0
  193. package/script/src/schemas/mod.js +157 -0
  194. package/script/src/schemas/mod.js.map +1 -0
  195. package/script/src/schemas/subscriptions/requests.d.ts +332 -0
  196. package/script/src/schemas/subscriptions/requests.d.ts.map +1 -0
  197. package/script/src/schemas/subscriptions/requests.js +295 -0
  198. package/script/src/schemas/subscriptions/requests.js.map +1 -0
  199. package/script/src/schemas/subscriptions/responses.d.ts +3643 -0
  200. package/script/src/schemas/subscriptions/responses.d.ts.map +1 -0
  201. package/script/src/schemas/subscriptions/responses.js +270 -0
  202. package/script/src/schemas/subscriptions/responses.js.map +1 -0
  203. package/script/src/signing/_signTypedData/ethers.js +1 -0
  204. package/script/src/signing/_signTypedData/ethers.js.map +1 -0
  205. package/script/src/signing/_signTypedData/mod.js +1 -0
  206. package/script/src/signing/_signTypedData/mod.js.map +1 -0
  207. package/script/src/signing/_signTypedData/private_key.js +1 -0
  208. package/script/src/signing/_signTypedData/private_key.js.map +1 -0
  209. package/script/src/signing/_signTypedData/viem.js +1 -0
  210. package/script/src/signing/_signTypedData/viem.js.map +1 -0
  211. package/script/src/signing/mod.d.ts +109 -29
  212. package/script/src/signing/mod.d.ts.map +1 -1
  213. package/script/src/signing/mod.js +138 -33
  214. package/script/src/signing/mod.js.map +1 -0
  215. package/script/src/transports/base.d.ts +4 -4
  216. package/script/src/transports/base.d.ts.map +1 -1
  217. package/script/src/transports/base.js +4 -3
  218. package/script/src/transports/base.js.map +1 -0
  219. package/script/src/transports/http/http_transport.d.ts +3 -2
  220. package/script/src/transports/http/http_transport.d.ts.map +1 -1
  221. package/script/src/transports/http/http_transport.js +1 -0
  222. package/script/src/transports/http/http_transport.js.map +1 -0
  223. package/script/src/transports/websocket/_hyperliquid_event_target.d.ts +1 -1
  224. package/script/src/transports/websocket/_hyperliquid_event_target.d.ts.map +1 -1
  225. package/script/src/transports/websocket/_hyperliquid_event_target.js +1 -0
  226. package/script/src/transports/websocket/_hyperliquid_event_target.js.map +1 -0
  227. package/script/src/transports/websocket/_reconnecting_websocket.js +1 -0
  228. package/script/src/transports/websocket/_reconnecting_websocket.js.map +1 -0
  229. package/script/src/transports/websocket/_websocket_async_request.js +1 -0
  230. package/script/src/transports/websocket/_websocket_async_request.js.map +1 -0
  231. package/script/src/transports/websocket/websocket_transport.d.ts +9 -1
  232. package/script/src/transports/websocket/websocket_transport.d.ts.map +1 -1
  233. package/script/src/transports/websocket/websocket_transport.js +4 -0
  234. package/script/src/transports/websocket/websocket_transport.js.map +1 -0
  235. package/src/mod.ts +28 -0
  236. package/src/src/clients/exchange.ts +2246 -0
  237. package/src/src/clients/info.ts +2076 -0
  238. package/src/src/clients/multiSign.ts +183 -0
  239. package/src/src/clients/subscription.ts +841 -0
  240. package/src/src/errors.ts +7 -0
  241. package/src/src/schemas/_base.ts +43 -0
  242. package/src/src/schemas/exchange/requests.ts +3057 -0
  243. package/src/src/schemas/exchange/responses.ts +540 -0
  244. package/src/src/schemas/explorer/requests.ts +65 -0
  245. package/src/src/schemas/explorer/responses.ts +138 -0
  246. package/src/src/schemas/info/accounts.ts +1490 -0
  247. package/src/src/schemas/info/assets.ts +693 -0
  248. package/src/src/schemas/info/markets.ts +171 -0
  249. package/src/src/schemas/info/orders.ts +597 -0
  250. package/src/src/schemas/info/requests.ts +1369 -0
  251. package/src/src/schemas/info/validators.ts +299 -0
  252. package/src/src/schemas/info/vaults.ts +262 -0
  253. package/src/src/schemas/mod.ts +121 -0
  254. package/src/src/schemas/subscriptions/requests.ts +504 -0
  255. package/src/src/schemas/subscriptions/responses.ts +576 -0
  256. package/src/src/signing/_signTypedData/ethers.ts +59 -0
  257. package/src/src/signing/_signTypedData/mod.ts +121 -0
  258. package/src/src/signing/_signTypedData/private_key.ts +229 -0
  259. package/src/src/signing/_signTypedData/viem.ts +55 -0
  260. package/src/src/signing/mod.ts +572 -0
  261. package/src/src/transports/base.ts +54 -0
  262. package/src/src/transports/http/http_transport.ts +208 -0
  263. package/src/src/transports/websocket/_hyperliquid_event_target.ts +118 -0
  264. package/src/src/transports/websocket/_reconnecting_websocket.ts +404 -0
  265. package/src/src/transports/websocket/_websocket_async_request.ts +229 -0
  266. package/src/src/transports/websocket/websocket_transport.ts +394 -0
  267. package/esm/src/base.d.ts.map +0 -1
  268. package/esm/src/signing/_sorter.d.ts +0 -127
  269. package/esm/src/signing/_sorter.d.ts.map +0 -1
  270. package/esm/src/signing/_sorter.js +0 -693
  271. package/esm/src/types/exchange/requests.d.ts +0 -1345
  272. package/esm/src/types/exchange/requests.d.ts.map +0 -1
  273. package/esm/src/types/exchange/requests.js +0 -1
  274. package/esm/src/types/exchange/responses.d.ts +0 -233
  275. package/esm/src/types/exchange/responses.d.ts.map +0 -1
  276. package/esm/src/types/exchange/responses.js +0 -1
  277. package/esm/src/types/explorer/requests.d.ts +0 -32
  278. package/esm/src/types/explorer/requests.d.ts.map +0 -1
  279. package/esm/src/types/explorer/requests.js +0 -1
  280. package/esm/src/types/explorer/responses.d.ts +0 -58
  281. package/esm/src/types/explorer/responses.d.ts.map +0 -1
  282. package/esm/src/types/explorer/responses.js +0 -1
  283. package/esm/src/types/info/accounts.d.ts +0 -864
  284. package/esm/src/types/info/accounts.d.ts.map +0 -1
  285. package/esm/src/types/info/accounts.js +0 -1
  286. package/esm/src/types/info/assets.d.ts +0 -354
  287. package/esm/src/types/info/assets.d.ts.map +0 -1
  288. package/esm/src/types/info/assets.js +0 -1
  289. package/esm/src/types/info/markets.d.ts +0 -79
  290. package/esm/src/types/info/markets.d.ts.map +0 -1
  291. package/esm/src/types/info/markets.js +0 -1
  292. package/esm/src/types/info/orders.d.ts +0 -266
  293. package/esm/src/types/info/orders.d.ts.map +0 -1
  294. package/esm/src/types/info/orders.js +0 -1
  295. package/esm/src/types/info/requests.d.ts +0 -640
  296. package/esm/src/types/info/requests.d.ts.map +0 -1
  297. package/esm/src/types/info/requests.js +0 -1
  298. package/esm/src/types/info/validators.d.ts +0 -147
  299. package/esm/src/types/info/validators.d.ts.map +0 -1
  300. package/esm/src/types/info/validators.js +0 -1
  301. package/esm/src/types/info/vaults.d.ts +0 -119
  302. package/esm/src/types/info/vaults.d.ts.map +0 -1
  303. package/esm/src/types/info/vaults.js +0 -1
  304. package/esm/src/types/mod.d.ts +0 -38
  305. package/esm/src/types/mod.d.ts.map +0 -1
  306. package/esm/src/types/mod.js +0 -24
  307. package/esm/src/types/subscriptions/requests.d.ts +0 -154
  308. package/esm/src/types/subscriptions/requests.d.ts.map +0 -1
  309. package/esm/src/types/subscriptions/requests.js +0 -1
  310. package/esm/src/types/subscriptions/responses.d.ts +0 -238
  311. package/esm/src/types/subscriptions/responses.d.ts.map +0 -1
  312. package/esm/src/types/subscriptions/responses.js +0 -1
  313. package/script/src/base.d.ts.map +0 -1
  314. package/script/src/signing/_sorter.d.ts +0 -127
  315. package/script/src/signing/_sorter.d.ts.map +0 -1
  316. package/script/src/signing/_sorter.js +0 -696
  317. package/script/src/types/exchange/requests.d.ts +0 -1345
  318. package/script/src/types/exchange/requests.d.ts.map +0 -1
  319. package/script/src/types/exchange/requests.js +0 -2
  320. package/script/src/types/exchange/responses.d.ts +0 -233
  321. package/script/src/types/exchange/responses.d.ts.map +0 -1
  322. package/script/src/types/exchange/responses.js +0 -2
  323. package/script/src/types/explorer/requests.d.ts +0 -32
  324. package/script/src/types/explorer/requests.d.ts.map +0 -1
  325. package/script/src/types/explorer/requests.js +0 -2
  326. package/script/src/types/explorer/responses.d.ts +0 -58
  327. package/script/src/types/explorer/responses.d.ts.map +0 -1
  328. package/script/src/types/explorer/responses.js +0 -2
  329. package/script/src/types/info/accounts.d.ts +0 -864
  330. package/script/src/types/info/accounts.d.ts.map +0 -1
  331. package/script/src/types/info/accounts.js +0 -2
  332. package/script/src/types/info/assets.d.ts +0 -354
  333. package/script/src/types/info/assets.d.ts.map +0 -1
  334. package/script/src/types/info/assets.js +0 -2
  335. package/script/src/types/info/markets.d.ts +0 -79
  336. package/script/src/types/info/markets.d.ts.map +0 -1
  337. package/script/src/types/info/markets.js +0 -2
  338. package/script/src/types/info/orders.d.ts +0 -266
  339. package/script/src/types/info/orders.d.ts.map +0 -1
  340. package/script/src/types/info/orders.js +0 -2
  341. package/script/src/types/info/requests.d.ts +0 -640
  342. package/script/src/types/info/requests.d.ts.map +0 -1
  343. package/script/src/types/info/requests.js +0 -2
  344. package/script/src/types/info/validators.d.ts +0 -147
  345. package/script/src/types/info/validators.d.ts.map +0 -1
  346. package/script/src/types/info/validators.js +0 -2
  347. package/script/src/types/info/vaults.d.ts +0 -119
  348. package/script/src/types/info/vaults.d.ts.map +0 -1
  349. package/script/src/types/info/vaults.js +0 -2
  350. package/script/src/types/mod.d.ts +0 -38
  351. package/script/src/types/mod.d.ts.map +0 -1
  352. package/script/src/types/mod.js +0 -25
  353. package/script/src/types/subscriptions/requests.d.ts +0 -154
  354. package/script/src/types/subscriptions/requests.d.ts.map +0 -1
  355. package/script/src/types/subscriptions/requests.js +0 -2
  356. package/script/src/types/subscriptions/responses.d.ts +0 -238
  357. package/script/src/types/subscriptions/responses.d.ts.map +0 -1
  358. package/script/src/types/subscriptions/responses.js +0 -2
@@ -0,0 +1,121 @@
1
+ import {
2
+ type AbstractEthersV5Signer,
3
+ type AbstractEthersV6Signer,
4
+ isAbstractEthersV5Signer,
5
+ isAbstractEthersV6Signer,
6
+ } from "./ethers.js";
7
+ import { isValidPrivateKey, privateKeyToAddress, signTypedData as signTypedDataWithPrivateKey } from "./private_key.js";
8
+ import { type AbstractViemJsonRpcAccount, type AbstractViemLocalAccount, isAbstractViemWallet } from "./viem.js";
9
+
10
+ /** Abstract interface for a wallet that can sign typed data. */
11
+ export type AbstractWallet =
12
+ | `0x${string}` // Private key
13
+ | AbstractViemJsonRpcAccount
14
+ | AbstractViemLocalAccount
15
+ | AbstractEthersV6Signer
16
+ | AbstractEthersV5Signer;
17
+
18
+ /** ECDSA signature components for Ethereum transactions and typed data. */
19
+ export interface Signature {
20
+ /** First 32-byte component of ECDSA signature */
21
+ r: `0x${string}`;
22
+ /** Second 32-byte component of ECDSA signature */
23
+ s: `0x${string}`;
24
+ /** Recovery identifier */
25
+ v: 27 | 28;
26
+ }
27
+
28
+ export async function signTypedData(args: {
29
+ wallet: AbstractWallet;
30
+ domain: {
31
+ name: string;
32
+ version: string;
33
+ chainId: number;
34
+ verifyingContract: `0x${string}`;
35
+ };
36
+ types: {
37
+ [key: string]: {
38
+ name: string;
39
+ type: string;
40
+ }[];
41
+ };
42
+ primaryType: string;
43
+ message: Record<string, unknown>;
44
+ }): Promise<Signature> {
45
+ const { wallet, domain, types, primaryType, message } = args;
46
+
47
+ let signature: `0x${string}`;
48
+ if (isAbstractViemWallet(wallet)) {
49
+ signature = await wallet.signTypedData({
50
+ domain,
51
+ types: {
52
+ EIP712Domain: [
53
+ { name: "name", type: "string" },
54
+ { name: "version", type: "string" },
55
+ { name: "chainId", type: "uint256" },
56
+ { name: "verifyingContract", type: "address" },
57
+ ],
58
+ ...types,
59
+ },
60
+ primaryType,
61
+ message,
62
+ });
63
+ } else if (isAbstractEthersV6Signer(wallet)) {
64
+ signature = await wallet.signTypedData(domain, types, message) as `0x${string}`;
65
+ } else if (isAbstractEthersV5Signer(wallet)) {
66
+ signature = await wallet._signTypedData(domain, types, message) as `0x${string}`;
67
+ } else if (isValidPrivateKey(wallet)) {
68
+ signature = await signTypedDataWithPrivateKey({ privateKey: wallet, domain, types, primaryType, message });
69
+ } else {
70
+ throw new Error("Unsupported wallet for signing typed data");
71
+ }
72
+
73
+ return splitSignature(signature);
74
+ }
75
+
76
+ function splitSignature(signature: `0x${string}`): Signature {
77
+ const r = `0x${signature.slice(2, 66)}` as const;
78
+ const s = `0x${signature.slice(66, 130)}` as const;
79
+ const v = parseInt(signature.slice(130, 132), 16) as 27 | 28;
80
+ return { r, s, v };
81
+ }
82
+
83
+ /** Get the chain ID of the wallet. */
84
+ export async function getWalletChainId(wallet: AbstractWallet): Promise<`0x${string}`> {
85
+ if (isAbstractViemWallet(wallet)) {
86
+ if ("getChainId" in wallet && wallet.getChainId) {
87
+ const chainId = await wallet.getChainId();
88
+ return `0x${chainId.toString(16)}`;
89
+ } else {
90
+ return "0x1";
91
+ }
92
+ } else if (isAbstractEthersV6Signer(wallet) || isAbstractEthersV5Signer(wallet)) {
93
+ if ("provider" in wallet && wallet.provider) {
94
+ const network = await wallet.provider.getNetwork();
95
+ return `0x${network.chainId.toString(16)}`;
96
+ } else {
97
+ return "0x1";
98
+ }
99
+ } else {
100
+ return "0x1";
101
+ }
102
+ }
103
+
104
+ /** Get the wallet address from various wallet types. */
105
+ export async function getWalletAddress(wallet: AbstractWallet): Promise<`0x${string}`> {
106
+ if (isAbstractViemWallet(wallet)) {
107
+ if ("address" in wallet && wallet.address) {
108
+ return wallet.address;
109
+ } else if ("getAddresses" in wallet && wallet.getAddresses) {
110
+ const addresses = await wallet.getAddresses();
111
+ return addresses[0];
112
+ }
113
+ } else if (isAbstractEthersV6Signer(wallet) || isAbstractEthersV5Signer(wallet)) {
114
+ if ("getAddress" in wallet && wallet.getAddress) {
115
+ return await wallet.getAddress() as `0x${string}`;
116
+ }
117
+ } else if (isValidPrivateKey(wallet)) {
118
+ return privateKeyToAddress(wallet);
119
+ }
120
+ throw new Error("Unsupported wallet for getting address");
121
+ }
@@ -0,0 +1,229 @@
1
+ import { keccak_256 } from "@noble/hashes/sha3";
2
+ import { etc, getPublicKey, signAsync, utils } from "@noble/secp256k1";
3
+
4
+ interface Types {
5
+ [type: string]: {
6
+ name: string;
7
+ type: string;
8
+ }[];
9
+ }
10
+
11
+ interface Domain extends Record<string, unknown> {
12
+ name?: string;
13
+ version?: string;
14
+ chainId?: number | string | bigint | `0x${string}`;
15
+ verifyingContract?: `0x${string}`;
16
+ salt?: `0x${string}`;
17
+ }
18
+
19
+ /** Signs typed data with a private key. */
20
+ export async function signTypedData(args: {
21
+ privateKey: string;
22
+ domain?: Domain;
23
+ types: Types;
24
+ primaryType: string;
25
+ message: Record<string, unknown>;
26
+ }): Promise<`0x${string}`> {
27
+ const {
28
+ privateKey,
29
+ domain = {},
30
+ types,
31
+ primaryType,
32
+ message,
33
+ } = args;
34
+
35
+ const hash = hashTypedData({ domain, types, primaryType, message });
36
+
37
+ const signature = await signAsync(hash, cleanHex(privateKey));
38
+
39
+ const r = signature.r.toString(16).padStart(64, "0");
40
+ const s = signature.s.toString(16).padStart(64, "0");
41
+ const v = (signature.recovery + 27).toString(16).padStart(2, "0");
42
+
43
+ return `0x${r}${s}${v}`;
44
+ }
45
+
46
+ function hashTypedData(args: {
47
+ domain: Domain;
48
+ types: Types;
49
+ primaryType: string;
50
+ message: Record<string, unknown>;
51
+ }): Uint8Array {
52
+ const { domain, types: types_, primaryType, message } = args;
53
+
54
+ const domainFields = [];
55
+ if (domain.name !== undefined) {
56
+ domainFields.push({ name: "name", type: "string" });
57
+ }
58
+ if (domain.version !== undefined) {
59
+ domainFields.push({ name: "version", type: "string" });
60
+ }
61
+ if (domain.chainId !== undefined) {
62
+ domainFields.push({ name: "chainId", type: "uint256" });
63
+ }
64
+ if (domain.verifyingContract !== undefined) {
65
+ domainFields.push({ name: "verifyingContract", type: "address" });
66
+ }
67
+ if (domain.salt !== undefined) {
68
+ domainFields.push({ name: "salt", type: "bytes32" });
69
+ }
70
+
71
+ const types = {
72
+ EIP712Domain: domainFields,
73
+ ...types_,
74
+ };
75
+
76
+ const bytes: Uint8Array[] = [new Uint8Array([0x19, 0x01])];
77
+ bytes.push(hashStruct("EIP712Domain", domain, types));
78
+ if (primaryType !== "EIP712Domain") bytes.push(hashStruct(primaryType, message, types));
79
+
80
+ return keccak_256(etc.concatBytes(...bytes));
81
+ }
82
+
83
+ function hashStruct(primaryType: string, data: Record<string, unknown>, types: Types): Uint8Array {
84
+ const typeHash = keccak_256(new TextEncoder().encode(encodeType(primaryType, types)));
85
+ const encodedValues = types[primaryType].map((field) => encodeValue(field.type, data[field.name], types));
86
+ return keccak_256(etc.concatBytes(typeHash, ...encodedValues));
87
+ }
88
+
89
+ function encodeType(primaryType: string, types: Types): string {
90
+ const deps = findTypeDependencies(primaryType, types);
91
+ const sortedDeps = [primaryType, ...deps.filter((d) => d !== primaryType).sort()];
92
+ return sortedDeps
93
+ .map((type) =>
94
+ `${type}(${types[type].map((field) => `${resolveTypeAlias(field.type)} ${field.name}`).join(",")})`
95
+ )
96
+ .join("");
97
+ }
98
+
99
+ function resolveTypeAlias(type: string): string {
100
+ if (type === "uint") return "uint256";
101
+ if (type === "int") return "int256";
102
+ return type;
103
+ }
104
+
105
+ function findTypeDependencies(primaryType: string, types: Types, _found = new Set<string>()): string[] {
106
+ if (_found.has(primaryType) || !types[primaryType]) return [];
107
+ _found.add(primaryType);
108
+
109
+ for (const field of types[primaryType]) {
110
+ const baseType = field.type.replace(/\[.*?\]/g, "");
111
+ if (types[baseType]) {
112
+ findTypeDependencies(baseType, types, _found);
113
+ }
114
+ }
115
+ return Array.from(_found);
116
+ }
117
+
118
+ function encodeValue(type: string, value: unknown, types: Types): Uint8Array {
119
+ const arrayMatch = type.match(/^(.*)\[(\d*)\]$/);
120
+ if (arrayMatch) {
121
+ // Extract type info: base type and optional length
122
+ const [, baseType, len] = arrayMatch;
123
+ if (!Array.isArray(value)) {
124
+ throw new Error(`Expected array for ${type}. Received: ${typeof value}`);
125
+ }
126
+ if (len && value.length !== +len) {
127
+ throw new Error(`Invalid length for ${type}: expected ${len}. Received: ${value.length}`);
128
+ }
129
+
130
+ // Encode each element in the array and hash them together
131
+ const encodedElements = value.map((v) => encodeValue(baseType, v, types));
132
+ return keccak_256(etc.concatBytes(...encodedElements));
133
+ }
134
+
135
+ if (types[type]) {
136
+ if (value === undefined) return new Uint8Array(32);
137
+ return hashStruct(type, value as Record<string, unknown>, types);
138
+ }
139
+
140
+ if (type === "string") {
141
+ return keccak_256(new TextEncoder().encode(value as string));
142
+ }
143
+
144
+ if (type === "address") {
145
+ const bytes = etc.hexToBytes(cleanHex(value as string));
146
+ if (bytes.length !== 20) {
147
+ throw new Error(`Address must be 20 bytes.`);
148
+ }
149
+ const padded = new Uint8Array(32);
150
+ padded.set(bytes, 12);
151
+ return padded;
152
+ }
153
+
154
+ if (type.startsWith("uint") || type.startsWith("int")) {
155
+ // Extract type info: uint/int and bit size
156
+ const isUint = type.startsWith("uint");
157
+ const bitsStr = type.slice(isUint ? 4 : 3);
158
+ const bits = parseInt(bitsStr || "256");
159
+ if (bits > 256 || bits % 8 !== 0) {
160
+ throw new Error(`Invalid ${isUint ? "uint" : "int"} size: ${bitsStr}. Must be 8-256 in steps of 8`);
161
+ }
162
+
163
+ // Apply Two's complement for specified bit size
164
+ const bigIntValue = BigInt(value as number | string | bigint | `0x${string}`);
165
+ const resizedValue = isUint ? BigInt.asUintN(bits, bigIntValue) : BigInt.asIntN(bits, bigIntValue);
166
+
167
+ // Convert to 32-byte big-endian
168
+ const hex = BigInt.asUintN(256, resizedValue).toString(16).padStart(64, "0");
169
+ return etc.hexToBytes(hex);
170
+ }
171
+
172
+ if (type === "bool") {
173
+ const result = new Uint8Array(32);
174
+ result[31] = value ? 1 : 0;
175
+ return result;
176
+ }
177
+
178
+ if (type === "bytes") {
179
+ const bytes = typeof value === "string" ? etc.hexToBytes(cleanHex(value)) : value as Uint8Array;
180
+ return keccak_256(bytes);
181
+ }
182
+
183
+ const bytesMatch = type.match(/^bytes(\d+)$/);
184
+ if (bytesMatch) {
185
+ // Extract type info: bytes size
186
+ const size = parseInt(bytesMatch[1]);
187
+ if (size === 0 || size > 32) {
188
+ throw new Error(`bytesN size must be 1-32. Received: ${size}`);
189
+ }
190
+
191
+ // Convert hex to bytes
192
+ const bytes = etc.hexToBytes(cleanHex(value as string));
193
+ if (bytes.length !== size) {
194
+ throw new Error(`${type} requires exactly ${size} bytes. Received: ${bytes.length} from '${value}'`);
195
+ }
196
+
197
+ // Pad to 32 bytes
198
+ const padded = new Uint8Array(32);
199
+ padded.set(bytes, 0);
200
+ return padded;
201
+ }
202
+
203
+ throw new Error(`Unsupported type: '${type}'.`);
204
+ }
205
+
206
+ function cleanHex(hex: string): string {
207
+ return hex.startsWith("0x") ? hex.slice(2) : hex;
208
+ }
209
+
210
+ /** Validates if a string is a valid secp256k1 private key. */
211
+ export function isValidPrivateKey(privateKey: unknown): privateKey is string {
212
+ if (typeof privateKey !== "string") return false;
213
+ return utils.isValidPrivateKey(cleanHex(privateKey));
214
+ }
215
+
216
+ /** Converts a private key to an Ethereum address. */
217
+ export function privateKeyToAddress(privateKey: string): `0x${string}` {
218
+ const cleanPrivKey = cleanHex(privateKey);
219
+
220
+ const publicKey = getPublicKey(cleanPrivKey, false);
221
+ const publicKeyWithoutPrefix = publicKey.slice(1);
222
+
223
+ const hash = keccak_256(publicKeyWithoutPrefix);
224
+
225
+ const addressBytes = hash.slice(-20);
226
+ const address = etc.bytesToHex(addressBytes);
227
+
228
+ return `0x${address}`;
229
+ }
@@ -0,0 +1,55 @@
1
+ /** Abstract interface for a viem {@link https://viem.sh/docs/accounts/jsonRpc#json-rpc-account | JSON-RPC Account}. */
2
+ export interface AbstractViemJsonRpcAccount {
3
+ signTypedData(
4
+ params: {
5
+ domain: {
6
+ name: string;
7
+ version: string;
8
+ chainId: number;
9
+ verifyingContract: `0x${string}`;
10
+ };
11
+ types: {
12
+ [key: string]: {
13
+ name: string;
14
+ type: string;
15
+ }[];
16
+ };
17
+ primaryType: string;
18
+ message: Record<string, unknown>;
19
+ },
20
+ options?: unknown,
21
+ ): Promise<`0x${string}`>;
22
+ getAddresses?(): Promise<`0x${string}`[]>;
23
+ getChainId?(): Promise<number>;
24
+ }
25
+
26
+ /** Abstract interface for a viem {@link https://viem.sh/docs/accounts/local | Local Account}. */
27
+ export interface AbstractViemLocalAccount {
28
+ signTypedData(
29
+ params: {
30
+ domain: {
31
+ name: string;
32
+ version: string;
33
+ chainId: number;
34
+ verifyingContract: `0x${string}`;
35
+ };
36
+ types: {
37
+ [key: string]: {
38
+ name: string;
39
+ type: string;
40
+ }[];
41
+ };
42
+ primaryType: string;
43
+ message: Record<string, unknown>;
44
+ },
45
+ options?: unknown,
46
+ ): Promise<`0x${string}`>;
47
+ address?: `0x${string}`;
48
+ }
49
+
50
+ /** Checks if the given value is an abstract viem wallet. */
51
+ export function isAbstractViemWallet(client: unknown): client is AbstractViemJsonRpcAccount | AbstractViemLocalAccount {
52
+ return typeof client === "object" && client !== null &&
53
+ "signTypedData" in client && typeof client.signTypedData === "function" &&
54
+ (client.signTypedData.length === 1 || client.signTypedData.length === 2);
55
+ }