@ritbit/v4-client-js 1.3.17

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 (412) hide show
  1. package/.env +1 -0
  2. package/.eslintignore +2 -0
  3. package/.eslintrc.js +15 -0
  4. package/.gitleaks.toml +24 -0
  5. package/.gitleaksignore +1 -0
  6. package/.nvmrc +1 -0
  7. package/.prettierignore +3 -0
  8. package/.prettierrc.json +6 -0
  9. package/.releaserc +10 -0
  10. package/.vscode/launch.json +11 -0
  11. package/LICENSE +13 -0
  12. package/README.md +83 -0
  13. package/__native__/__ios__/v4-native-client.js +209891 -0
  14. package/__native__/__ios__/v4-native-client.js.map +1 -0
  15. package/__tests__/clients/composite-client.test.ts +140 -0
  16. package/__tests__/helpers/baseClients.ts +23 -0
  17. package/__tests__/helpers/constants.ts +130 -0
  18. package/__tests__/lib/helpers.test.ts +53 -0
  19. package/__tests__/lib/util.test.ts +77 -0
  20. package/__tests__/lib/validation.test.ts +289 -0
  21. package/__tests__/modules/client/AccountEndpoints.test.ts +236 -0
  22. package/__tests__/modules/client/FaucetEndpoint.test.ts +14 -0
  23. package/__tests__/modules/client/MarketsEndpoints.test.ts +84 -0
  24. package/__tests__/modules/client/Transfers.test.ts +44 -0
  25. package/__tests__/modules/client/UtilityEndpoints.test.ts +29 -0
  26. package/__tests__/modules/client/ValidatorGetEndpoints.test.ts +50 -0
  27. package/__tests__/modules/client/ValidatorPostEndpoints.test.ts +52 -0
  28. package/__tests__/modules/client/constants.ts +5 -0
  29. package/__tests__/modules/onboarding.test.ts +66 -0
  30. package/build/cjs/clients/composite-client.js +788 -0
  31. package/build/cjs/clients/constants.js +293 -0
  32. package/build/cjs/clients/faucet-client.js +36 -0
  33. package/build/cjs/clients/helpers/chain-helpers.js +178 -0
  34. package/build/cjs/clients/helpers/request-helpers.js +65 -0
  35. package/build/cjs/clients/indexer-client.js +56 -0
  36. package/build/cjs/clients/lib/axios/axiosRequest.js +34 -0
  37. package/build/cjs/clients/lib/axios/errors.js +28 -0
  38. package/build/cjs/clients/lib/axios/index.js +23 -0
  39. package/build/cjs/clients/lib/axios/types.js +11 -0
  40. package/build/cjs/clients/lib/cctpProto.js +3242 -0
  41. package/build/cjs/clients/lib/errors.js +58 -0
  42. package/build/cjs/clients/lib/registry.js +51 -0
  43. package/build/cjs/clients/modules/account.js +223 -0
  44. package/build/cjs/clients/modules/composer.js +404 -0
  45. package/build/cjs/clients/modules/get.js +469 -0
  46. package/build/cjs/clients/modules/local-wallet.js +59 -0
  47. package/build/cjs/clients/modules/markets.js +54 -0
  48. package/build/cjs/clients/modules/post.js +391 -0
  49. package/build/cjs/clients/modules/proto-includes.js +72 -0
  50. package/build/cjs/clients/modules/rest.js +33 -0
  51. package/build/cjs/clients/modules/signer.js +93 -0
  52. package/build/cjs/clients/modules/tendermintClient.js +137 -0
  53. package/build/cjs/clients/modules/utility.js +44 -0
  54. package/build/cjs/clients/modules/vault.js +25 -0
  55. package/build/cjs/clients/noble-client.js +75 -0
  56. package/build/cjs/clients/socket-client.js +301 -0
  57. package/build/cjs/clients/subaccount.js +33 -0
  58. package/build/cjs/clients/types.js +43 -0
  59. package/build/cjs/clients/validator-client.js +81 -0
  60. package/build/cjs/index.js +73 -0
  61. package/build/cjs/lib/constants.js +23 -0
  62. package/build/cjs/lib/errors.js +37 -0
  63. package/build/cjs/lib/helpers.js +98 -0
  64. package/build/cjs/lib/onboarding.js +75 -0
  65. package/build/cjs/lib/trading-key-utils.js +108 -0
  66. package/build/cjs/lib/utils.js +79 -0
  67. package/build/cjs/lib/validation.js +150 -0
  68. package/build/cjs/network_optimizer.js +96 -0
  69. package/build/cjs/package.json +1 -0
  70. package/build/cjs/tsconfig.cjs.tsbuildinfo +1 -0
  71. package/build/cjs/types.js +25 -0
  72. package/build/esm/__tests__/clients/composite-client.test.d.ts +2 -0
  73. package/build/esm/__tests__/clients/composite-client.test.d.ts.map +1 -0
  74. package/build/esm/__tests__/clients/composite-client.test.js +128 -0
  75. package/build/esm/__tests__/helpers/baseClients.d.ts +19 -0
  76. package/build/esm/__tests__/helpers/baseClients.d.ts.map +1 -0
  77. package/build/esm/__tests__/helpers/baseClients.js +22 -0
  78. package/build/esm/__tests__/helpers/constants.d.ts +19 -0
  79. package/build/esm/__tests__/helpers/constants.d.ts.map +1 -0
  80. package/build/esm/__tests__/helpers/constants.js +104 -0
  81. package/build/esm/__tests__/lib/helpers.test.d.ts +2 -0
  82. package/build/esm/__tests__/lib/helpers.test.d.ts.map +1 -0
  83. package/build/esm/__tests__/lib/helpers.test.js +40 -0
  84. package/build/esm/__tests__/lib/util.test.d.ts +2 -0
  85. package/build/esm/__tests__/lib/util.test.d.ts.map +1 -0
  86. package/build/esm/__tests__/lib/util.test.js +65 -0
  87. package/build/esm/__tests__/lib/validation.test.d.ts +2 -0
  88. package/build/esm/__tests__/lib/validation.test.d.ts.map +1 -0
  89. package/build/esm/__tests__/lib/validation.test.js +249 -0
  90. package/build/esm/__tests__/modules/client/AccountEndpoints.test.d.ts +2 -0
  91. package/build/esm/__tests__/modules/client/AccountEndpoints.test.d.ts.map +1 -0
  92. package/build/esm/__tests__/modules/client/AccountEndpoints.test.js +169 -0
  93. package/build/esm/__tests__/modules/client/FaucetEndpoint.test.d.ts +2 -0
  94. package/build/esm/__tests__/modules/client/FaucetEndpoint.test.d.ts.map +1 -0
  95. package/build/esm/__tests__/modules/client/FaucetEndpoint.test.js +13 -0
  96. package/build/esm/__tests__/modules/client/MarketsEndpoints.test.d.ts +2 -0
  97. package/build/esm/__tests__/modules/client/MarketsEndpoints.test.d.ts.map +1 -0
  98. package/build/esm/__tests__/modules/client/MarketsEndpoints.test.js +66 -0
  99. package/build/esm/__tests__/modules/client/Transfers.test.d.ts +2 -0
  100. package/build/esm/__tests__/modules/client/Transfers.test.d.ts.map +1 -0
  101. package/build/esm/__tests__/modules/client/Transfers.test.js +39 -0
  102. package/build/esm/__tests__/modules/client/UtilityEndpoints.test.d.ts +2 -0
  103. package/build/esm/__tests__/modules/client/UtilityEndpoints.test.d.ts.map +1 -0
  104. package/build/esm/__tests__/modules/client/UtilityEndpoints.test.js +26 -0
  105. package/build/esm/__tests__/modules/client/ValidatorGetEndpoints.test.d.ts +2 -0
  106. package/build/esm/__tests__/modules/client/ValidatorGetEndpoints.test.d.ts.map +1 -0
  107. package/build/esm/__tests__/modules/client/ValidatorGetEndpoints.test.js +44 -0
  108. package/build/esm/__tests__/modules/client/ValidatorPostEndpoints.test.d.ts +2 -0
  109. package/build/esm/__tests__/modules/client/ValidatorPostEndpoints.test.d.ts.map +1 -0
  110. package/build/esm/__tests__/modules/client/ValidatorPostEndpoints.test.js +48 -0
  111. package/build/esm/__tests__/modules/client/constants.d.ts +4 -0
  112. package/build/esm/__tests__/modules/client/constants.d.ts.map +1 -0
  113. package/build/esm/__tests__/modules/client/constants.js +4 -0
  114. package/build/esm/__tests__/modules/onboarding.test.d.ts +2 -0
  115. package/build/esm/__tests__/modules/onboarding.test.d.ts.map +1 -0
  116. package/build/esm/__tests__/modules/onboarding.test.js +48 -0
  117. package/build/esm/examples/account_endpoints.d.ts +5 -0
  118. package/build/esm/examples/account_endpoints.d.ts.map +1 -0
  119. package/build/esm/examples/account_endpoints.js +127 -0
  120. package/build/esm/examples/batch_cancel_orders_example.d.ts +2 -0
  121. package/build/esm/examples/batch_cancel_orders_example.d.ts.map +1 -0
  122. package/build/esm/examples/batch_cancel_orders_example.js +88 -0
  123. package/build/esm/examples/composite_example.d.ts +2 -0
  124. package/build/esm/examples/composite_example.d.ts.map +1 -0
  125. package/build/esm/examples/composite_example.js +45 -0
  126. package/build/esm/examples/constants.d.ts +13 -0
  127. package/build/esm/examples/constants.d.ts.map +1 -0
  128. package/build/esm/examples/constants.js +29 -0
  129. package/build/esm/examples/faucet_endpoint.d.ts +5 -0
  130. package/build/esm/examples/faucet_endpoint.d.ts.map +1 -0
  131. package/build/esm/examples/faucet_endpoint.js +21 -0
  132. package/build/esm/examples/gov_add_new_market.d.ts +2 -0
  133. package/build/esm/examples/gov_add_new_market.d.ts.map +1 -0
  134. package/build/esm/examples/gov_add_new_market.js +72 -0
  135. package/build/esm/examples/human_readable_orders.json +86 -0
  136. package/build/esm/examples/human_readable_short_term_orders.json +42 -0
  137. package/build/esm/examples/json-encoding.d.ts +2 -0
  138. package/build/esm/examples/json-encoding.d.ts.map +1 -0
  139. package/build/esm/examples/json-encoding.js +27 -0
  140. package/build/esm/examples/long_term_order_cancel_example.d.ts +2 -0
  141. package/build/esm/examples/long_term_order_cancel_example.d.ts.map +1 -0
  142. package/build/esm/examples/long_term_order_cancel_example.js +58 -0
  143. package/build/esm/examples/markets_endpoints.d.ts +5 -0
  144. package/build/esm/examples/markets_endpoints.d.ts.map +1 -0
  145. package/build/esm/examples/markets_endpoints.js +131 -0
  146. package/build/esm/examples/native_examples.d.ts +2 -0
  147. package/build/esm/examples/native_examples.d.ts.map +1 -0
  148. package/build/esm/examples/native_examples.js +110 -0
  149. package/build/esm/examples/noble_example.d.ts +2 -0
  150. package/build/esm/examples/noble_example.d.ts.map +1 -0
  151. package/build/esm/examples/noble_example.js +83 -0
  152. package/build/esm/examples/optimal_node.d.ts +2 -0
  153. package/build/esm/examples/optimal_node.d.ts.map +1 -0
  154. package/build/esm/examples/optimal_node.js +68 -0
  155. package/build/esm/examples/permissioned_keys_example.d.ts +2 -0
  156. package/build/esm/examples/permissioned_keys_example.d.ts.map +1 -0
  157. package/build/esm/examples/permissioned_keys_example.js +99 -0
  158. package/build/esm/examples/raw_orders.json +130 -0
  159. package/build/esm/examples/short_term_order_cancel_example.d.ts +2 -0
  160. package/build/esm/examples/short_term_order_cancel_example.d.ts.map +1 -0
  161. package/build/esm/examples/short_term_order_cancel_example.js +49 -0
  162. package/build/esm/examples/short_term_order_composite_example.d.ts +2 -0
  163. package/build/esm/examples/short_term_order_composite_example.d.ts.map +1 -0
  164. package/build/esm/examples/short_term_order_composite_example.js +63 -0
  165. package/build/esm/examples/test.d.ts +2 -0
  166. package/build/esm/examples/test.d.ts.map +1 -0
  167. package/build/esm/examples/test.js +45 -0
  168. package/build/esm/examples/transfer_example_deposit.d.ts +2 -0
  169. package/build/esm/examples/transfer_example_deposit.d.ts.map +1 -0
  170. package/build/esm/examples/transfer_example_deposit.js +24 -0
  171. package/build/esm/examples/transfer_example_send.d.ts +2 -0
  172. package/build/esm/examples/transfer_example_send.d.ts.map +1 -0
  173. package/build/esm/examples/transfer_example_send.js +37 -0
  174. package/build/esm/examples/transfer_example_subaccount_transfer.d.ts +2 -0
  175. package/build/esm/examples/transfer_example_subaccount_transfer.d.ts.map +1 -0
  176. package/build/esm/examples/transfer_example_subaccount_transfer.js +24 -0
  177. package/build/esm/examples/transfer_example_withdraw.d.ts +2 -0
  178. package/build/esm/examples/transfer_example_withdraw.d.ts.map +1 -0
  179. package/build/esm/examples/transfer_example_withdraw.js +25 -0
  180. package/build/esm/examples/transfer_example_withdraw_other.d.ts +2 -0
  181. package/build/esm/examples/transfer_example_withdraw_other.d.ts.map +1 -0
  182. package/build/esm/examples/transfer_example_withdraw_other.js +37 -0
  183. package/build/esm/examples/utility_endpoints.d.ts +5 -0
  184. package/build/esm/examples/utility_endpoints.d.ts.map +1 -0
  185. package/build/esm/examples/utility_endpoints.js +40 -0
  186. package/build/esm/examples/validator_get_example.d.ts +2 -0
  187. package/build/esm/examples/validator_get_example.d.ts.map +1 -0
  188. package/build/esm/examples/validator_get_example.js +156 -0
  189. package/build/esm/examples/validator_post_example.d.ts +2 -0
  190. package/build/esm/examples/validator_post_example.d.ts.map +1 -0
  191. package/build/esm/examples/validator_post_example.js +71 -0
  192. package/build/esm/examples/wallet_address.d.ts +2 -0
  193. package/build/esm/examples/wallet_address.d.ts.map +1 -0
  194. package/build/esm/examples/wallet_address.js +17 -0
  195. package/build/esm/examples/websocket_example.d.ts +2 -0
  196. package/build/esm/examples/websocket_example.d.ts.map +1 -0
  197. package/build/esm/examples/websocket_example.js +34 -0
  198. package/build/esm/examples/websocket_orderbook_example.d.ts +2 -0
  199. package/build/esm/examples/websocket_orderbook_example.d.ts.map +1 -0
  200. package/build/esm/examples/websocket_orderbook_example.js +194 -0
  201. package/build/esm/src/clients/composite-client.d.ts +406 -0
  202. package/build/esm/src/clients/composite-client.d.ts.map +1 -0
  203. package/build/esm/src/clients/composite-client.js +781 -0
  204. package/build/esm/src/clients/constants.d.ts +170 -0
  205. package/build/esm/src/clients/constants.d.ts.map +1 -0
  206. package/build/esm/src/clients/constants.js +269 -0
  207. package/build/esm/src/clients/faucet-client.d.ts +18 -0
  208. package/build/esm/src/clients/faucet-client.d.ts.map +1 -0
  209. package/build/esm/src/clients/faucet-client.js +29 -0
  210. package/build/esm/src/clients/helpers/chain-helpers.d.ts +15 -0
  211. package/build/esm/src/clients/helpers/chain-helpers.d.ts.map +1 -0
  212. package/build/esm/src/clients/helpers/chain-helpers.js +163 -0
  213. package/build/esm/src/clients/helpers/request-helpers.d.ts +3 -0
  214. package/build/esm/src/clients/helpers/request-helpers.d.ts.map +1 -0
  215. package/build/esm/src/clients/helpers/request-helpers.js +58 -0
  216. package/build/esm/src/clients/indexer-client.d.ts +40 -0
  217. package/build/esm/src/clients/indexer-client.d.ts.map +1 -0
  218. package/build/esm/src/clients/indexer-client.js +49 -0
  219. package/build/esm/src/clients/lib/axios/axiosRequest.d.ts +9 -0
  220. package/build/esm/src/clients/lib/axios/axiosRequest.d.ts.map +1 -0
  221. package/build/esm/src/clients/lib/axios/axiosRequest.js +28 -0
  222. package/build/esm/src/clients/lib/axios/errors.d.ts +31 -0
  223. package/build/esm/src/clients/lib/axios/errors.d.ts.map +1 -0
  224. package/build/esm/src/clients/lib/axios/errors.js +23 -0
  225. package/build/esm/src/clients/lib/axios/index.d.ts +7 -0
  226. package/build/esm/src/clients/lib/axios/index.d.ts.map +1 -0
  227. package/build/esm/src/clients/lib/axios/index.js +7 -0
  228. package/build/esm/src/clients/lib/axios/types.d.ts +7 -0
  229. package/build/esm/src/clients/lib/axios/types.d.ts.map +1 -0
  230. package/build/esm/src/clients/lib/axios/types.js +8 -0
  231. package/build/esm/src/clients/lib/cctpProto.d.ts +670 -0
  232. package/build/esm/src/clients/lib/cctpProto.d.ts.map +1 -0
  233. package/build/esm/src/clients/lib/cctpProto.js +3234 -0
  234. package/build/esm/src/clients/lib/errors.d.ts +38 -0
  235. package/build/esm/src/clients/lib/errors.d.ts.map +1 -0
  236. package/build/esm/src/clients/lib/errors.js +50 -0
  237. package/build/esm/src/clients/lib/registry.d.ts +4 -0
  238. package/build/esm/src/clients/lib/registry.d.ts.map +1 -0
  239. package/build/esm/src/clients/lib/registry.js +47 -0
  240. package/build/esm/src/clients/modules/account.d.ts +30 -0
  241. package/build/esm/src/clients/modules/account.d.ts.map +1 -0
  242. package/build/esm/src/clients/modules/account.js +217 -0
  243. package/build/esm/src/clients/modules/composer.d.ts +37 -0
  244. package/build/esm/src/clients/modules/composer.d.ts.map +1 -0
  245. package/build/esm/src/clients/modules/composer.js +397 -0
  246. package/build/esm/src/clients/modules/get.d.ts +193 -0
  247. package/build/esm/src/clients/modules/get.d.ts.map +1 -0
  248. package/build/esm/src/clients/modules/get.js +429 -0
  249. package/build/esm/src/clients/modules/local-wallet.d.ts +19 -0
  250. package/build/esm/src/clients/modules/local-wallet.d.ts.map +1 -0
  251. package/build/esm/src/clients/modules/local-wallet.js +53 -0
  252. package/build/esm/src/clients/modules/markets.d.ts +14 -0
  253. package/build/esm/src/clients/modules/markets.d.ts.map +1 -0
  254. package/build/esm/src/clients/modules/markets.js +48 -0
  255. package/build/esm/src/clients/modules/post.d.ts +133 -0
  256. package/build/esm/src/clients/modules/post.d.ts.map +1 -0
  257. package/build/esm/src/clients/modules/post.js +384 -0
  258. package/build/esm/src/clients/modules/proto-includes.d.ts +30 -0
  259. package/build/esm/src/clients/modules/proto-includes.d.ts.map +1 -0
  260. package/build/esm/src/clients/modules/proto-includes.js +32 -0
  261. package/build/esm/src/clients/modules/rest.d.ts +12 -0
  262. package/build/esm/src/clients/modules/rest.d.ts.map +1 -0
  263. package/build/esm/src/clients/modules/rest.js +27 -0
  264. package/build/esm/src/clients/modules/signer.d.ts +19 -0
  265. package/build/esm/src/clients/modules/signer.d.ts.map +1 -0
  266. package/build/esm/src/clients/modules/signer.js +86 -0
  267. package/build/esm/src/clients/modules/tendermintClient.d.ts +54 -0
  268. package/build/esm/src/clients/modules/tendermintClient.d.ts.map +1 -0
  269. package/build/esm/src/clients/modules/tendermintClient.js +133 -0
  270. package/build/esm/src/clients/modules/utility.d.ts +27 -0
  271. package/build/esm/src/clients/modules/utility.d.ts.map +1 -0
  272. package/build/esm/src/clients/modules/utility.js +38 -0
  273. package/build/esm/src/clients/modules/vault.d.ts +12 -0
  274. package/build/esm/src/clients/modules/vault.d.ts.map +1 -0
  275. package/build/esm/src/clients/modules/vault.js +19 -0
  276. package/build/esm/src/clients/native.d.ts +75 -0
  277. package/build/esm/src/clients/native.d.ts.map +1 -0
  278. package/build/esm/src/clients/native.js +1237 -0
  279. package/build/esm/src/clients/noble-client.d.ts +18 -0
  280. package/build/esm/src/clients/noble-client.d.ts.map +1 -0
  281. package/build/esm/src/clients/noble-client.js +71 -0
  282. package/build/esm/src/clients/socket-client.d.ts +146 -0
  283. package/build/esm/src/clients/socket-client.d.ts.map +1 -0
  284. package/build/esm/src/clients/socket-client.js +294 -0
  285. package/build/esm/src/clients/subaccount.d.ts +14 -0
  286. package/build/esm/src/clients/subaccount.d.ts.map +1 -0
  287. package/build/esm/src/clients/subaccount.js +29 -0
  288. package/build/esm/src/clients/types.d.ts +137 -0
  289. package/build/esm/src/clients/types.d.ts.map +1 -0
  290. package/build/esm/src/clients/types.js +26 -0
  291. package/build/esm/src/clients/validator-client.d.ts +35 -0
  292. package/build/esm/src/clients/validator-client.d.ts.map +1 -0
  293. package/build/esm/src/clients/validator-client.js +74 -0
  294. package/build/esm/src/index.d.ts +17 -0
  295. package/build/esm/src/index.d.ts.map +1 -0
  296. package/build/esm/src/index.js +19 -0
  297. package/build/esm/src/lib/constants.d.ts +13 -0
  298. package/build/esm/src/lib/constants.d.ts.map +1 -0
  299. package/build/esm/src/lib/constants.js +20 -0
  300. package/build/esm/src/lib/errors.d.ts +23 -0
  301. package/build/esm/src/lib/errors.d.ts.map +1 -0
  302. package/build/esm/src/lib/errors.js +31 -0
  303. package/build/esm/src/lib/helpers.d.ts +22 -0
  304. package/build/esm/src/lib/helpers.d.ts.map +1 -0
  305. package/build/esm/src/lib/helpers.js +88 -0
  306. package/build/esm/src/lib/onboarding.d.ts +46 -0
  307. package/build/esm/src/lib/onboarding.d.ts.map +1 -0
  308. package/build/esm/src/lib/onboarding.js +69 -0
  309. package/build/esm/src/lib/trading-key-utils.d.ts +22 -0
  310. package/build/esm/src/lib/trading-key-utils.d.ts.map +1 -0
  311. package/build/esm/src/lib/trading-key-utils.js +99 -0
  312. package/build/esm/src/lib/utils.d.ts +39 -0
  313. package/build/esm/src/lib/utils.d.ts.map +1 -0
  314. package/build/esm/src/lib/utils.js +69 -0
  315. package/build/esm/src/lib/validation.d.ts +26 -0
  316. package/build/esm/src/lib/validation.d.ts.map +1 -0
  317. package/build/esm/src/lib/validation.js +138 -0
  318. package/build/esm/src/network_optimizer.d.ts +8 -0
  319. package/build/esm/src/network_optimizer.d.ts.map +1 -0
  320. package/build/esm/src/network_optimizer.js +91 -0
  321. package/build/esm/src/types.d.ts +26 -0
  322. package/build/esm/src/types.d.ts.map +1 -0
  323. package/build/esm/src/types.js +8 -0
  324. package/build/esm/tsconfig.esm.tsbuildinfo +1 -0
  325. package/commitlint.config.js +8 -0
  326. package/examples/account_endpoints.ts +129 -0
  327. package/examples/batch_cancel_orders_example.ts +130 -0
  328. package/examples/composite_example.ts +65 -0
  329. package/examples/constants.ts +42 -0
  330. package/examples/faucet_endpoint.ts +24 -0
  331. package/examples/gov_add_new_market.json +64 -0
  332. package/examples/gov_add_new_market.ts +95 -0
  333. package/examples/human_readable_orders.json +86 -0
  334. package/examples/human_readable_short_term_orders.json +42 -0
  335. package/examples/json-encoding.ts +33 -0
  336. package/examples/long_term_order_cancel_example.ts +87 -0
  337. package/examples/markets_endpoints.ts +134 -0
  338. package/examples/native_examples.ts +151 -0
  339. package/examples/noble_example.ts +107 -0
  340. package/examples/optimal_node.ts +70 -0
  341. package/examples/permissioned_keys_example.ts +162 -0
  342. package/examples/raw_orders.json +130 -0
  343. package/examples/short_term_order_cancel_example.ts +68 -0
  344. package/examples/short_term_order_composite_example.ts +80 -0
  345. package/examples/test.ts +65 -0
  346. package/examples/transfer_example_deposit.ts +28 -0
  347. package/examples/transfer_example_send.ts +60 -0
  348. package/examples/transfer_example_subaccount_transfer.ts +29 -0
  349. package/examples/transfer_example_withdraw.ts +31 -0
  350. package/examples/transfer_example_withdraw_other.ts +60 -0
  351. package/examples/utility_endpoints.ts +42 -0
  352. package/examples/validator_get_example.ts +160 -0
  353. package/examples/validator_post_example.ts +81 -0
  354. package/examples/wallet_address.ts +18 -0
  355. package/examples/websocket_example.ts +44 -0
  356. package/examples/websocket_orderbook_example.ts +239 -0
  357. package/jest.config.js +12 -0
  358. package/jest.globalSetup.js +5 -0
  359. package/jest.setup.js +1 -0
  360. package/package.json +113 -0
  361. package/ritbit-v4-client-js-1.3.17.tgz +0 -0
  362. package/scripts/bump_version.sh +16 -0
  363. package/scripts/generate-cctp-protos.sh +41 -0
  364. package/scripts/mobile_build_pack.sh +5 -0
  365. package/scripts/publish-if-not-exists.sh +21 -0
  366. package/src/clients/composite-client.ts +1431 -0
  367. package/src/clients/constants.ts +358 -0
  368. package/src/clients/faucet-client.ts +48 -0
  369. package/src/clients/helpers/chain-helpers.ts +231 -0
  370. package/src/clients/helpers/request-helpers.ts +71 -0
  371. package/src/clients/indexer-client.ts +61 -0
  372. package/src/clients/lib/axios/axiosRequest.ts +41 -0
  373. package/src/clients/lib/axios/errors.ts +41 -0
  374. package/src/clients/lib/axios/index.ts +7 -0
  375. package/src/clients/lib/axios/types.ts +6 -0
  376. package/src/clients/lib/cctpProto.ts +4197 -0
  377. package/src/clients/lib/errors.ts +63 -0
  378. package/src/clients/lib/registry.ts +88 -0
  379. package/src/clients/modules/account.ts +388 -0
  380. package/src/clients/modules/composer.ts +645 -0
  381. package/src/clients/modules/get.ts +740 -0
  382. package/src/clients/modules/local-wallet.ts +79 -0
  383. package/src/clients/modules/markets.ts +71 -0
  384. package/src/clients/modules/post.ts +1016 -0
  385. package/src/clients/modules/proto-includes.ts +33 -0
  386. package/src/clients/modules/rest.ts +40 -0
  387. package/src/clients/modules/signer.ts +139 -0
  388. package/src/clients/modules/tendermintClient.ts +168 -0
  389. package/src/clients/modules/utility.ts +47 -0
  390. package/src/clients/modules/vault.ts +23 -0
  391. package/src/clients/native.ts +1508 -0
  392. package/src/clients/noble-client.ts +108 -0
  393. package/src/clients/socket-client.ts +331 -0
  394. package/src/clients/subaccount.ts +57 -0
  395. package/src/clients/types.ts +191 -0
  396. package/src/clients/validator-client.ts +103 -0
  397. package/src/index.ts +20 -0
  398. package/src/lib/constants.ts +28 -0
  399. package/src/lib/errors.ts +38 -0
  400. package/src/lib/helpers.ts +99 -0
  401. package/src/lib/onboarding.ts +96 -0
  402. package/src/lib/trading-key-utils.ts +136 -0
  403. package/src/lib/utils.ts +84 -0
  404. package/src/lib/validation.ts +197 -0
  405. package/src/network_optimizer.ts +132 -0
  406. package/src/types.ts +44 -0
  407. package/tasks.json +16 -0
  408. package/tsconfig.base.json +15 -0
  409. package/tsconfig.cjs.json +20 -0
  410. package/tsconfig.eslint.json +14 -0
  411. package/tsconfig.esm.json +11 -0
  412. package/webpack.config.js +56 -0
@@ -0,0 +1,1508 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ /*
3
+ Native app can call JS functions with primitives.
4
+ */
5
+
6
+ import { Secp256k1, sha256 } from '@cosmjs/crypto';
7
+ import { EncodeObject, coin as createCoin } from '@cosmjs/proto-signing';
8
+ import { MsgTransferEncodeObject, accountFromAny } from '@cosmjs/stargate';
9
+ import { Method } from '@cosmjs/tendermint-rpc';
10
+ import {
11
+ Order_Side,
12
+ Order_TimeInForce,
13
+ } from '@ritbit/v4-proto/src/codegen/ritbit/clob/order';
14
+ import * as AuthModule from 'cosmjs-types/cosmos/auth/v1beta1/query';
15
+ import Long from 'long';
16
+
17
+ import { BECH32_PREFIX, GAS_MULTIPLIER, NOBLE_BECH32_PREFIX } from '../lib/constants';
18
+ import { UserError } from '../lib/errors';
19
+ import { ByteArrayEncoding, encodeJson } from '../lib/helpers';
20
+ import { deriveHDKeyFromEthereumSignature, deriveHDKeyFromMnemonic } from '../lib/onboarding';
21
+ import { NetworkOptimizer } from '../network_optimizer';
22
+ import { CompositeClient, MarketInfo } from './composite-client';
23
+ import {
24
+ Network,
25
+ OrderType,
26
+ OrderSide,
27
+ OrderTimeInForce,
28
+ OrderExecution,
29
+ IndexerConfig,
30
+ ValidatorConfig,
31
+ SelectedGasDenom,
32
+ } from './constants';
33
+ import { FaucetClient } from './faucet-client';
34
+ import { parseToPrimitives } from './helpers/request-helpers';
35
+ import { Response } from './lib/axios';
36
+ import LocalWallet from './modules/local-wallet';
37
+ import { NobleClient } from './noble-client';
38
+ import { SubaccountInfo } from './subaccount';
39
+ import { OrderFlags, SquidIBCPayload } from './types';
40
+
41
+ declare global {
42
+ // eslint-disable-next-line vars-on-top, no-var
43
+ var client: CompositeClient;
44
+ // eslint-disable-next-line vars-on-top, no-var
45
+ var faucetClient: FaucetClient | null;
46
+ // eslint-disable-next-line vars-on-top, no-var
47
+ var wallet: LocalWallet;
48
+ // eslint-disable-next-line vars-on-top, no-var
49
+ var hdKey: {
50
+ privateKey: Uint8Array | null;
51
+ publicKey: Uint8Array | null;
52
+ };
53
+
54
+ // eslint-disable-next-line vars-on-top, no-var
55
+ var nobleClient: NobleClient | undefined;
56
+ // eslint-disable-next-line vars-on-top, no-var
57
+ var nobleWallet: LocalWallet | undefined;
58
+ }
59
+
60
+ export async function connectClient(network: Network): Promise<string> {
61
+ try {
62
+ globalThis.client = await CompositeClient.connect(network);
63
+ return encodeJson(network);
64
+ } catch (e) {
65
+ return wrappedError(e);
66
+ }
67
+ }
68
+
69
+ export async function connectNetwork(paramsJSON: string): Promise<string> {
70
+ try {
71
+ const params = JSON.parse(paramsJSON);
72
+ const {
73
+ indexerUrl,
74
+ websocketUrl,
75
+ validatorUrl,
76
+ chainId,
77
+ faucetUrl,
78
+ nobleValidatorUrl,
79
+ USDC_DENOM,
80
+ USDC_DECIMALS,
81
+ USDC_GAS_DENOM,
82
+ CHAINTOKEN_DENOM,
83
+ CHAINTOKEN_DECIMALS,
84
+ CHAINTOKEN_GAS_DENOM,
85
+ txnMemo,
86
+ } = params;
87
+
88
+ if (
89
+ indexerUrl === undefined ||
90
+ websocketUrl === undefined ||
91
+ validatorUrl === undefined ||
92
+ chainId === undefined
93
+ ) {
94
+ throw new UserError('Missing required network params');
95
+ }
96
+ if (
97
+ USDC_DENOM === undefined ||
98
+ USDC_DECIMALS === undefined ||
99
+ CHAINTOKEN_DENOM === undefined ||
100
+ CHAINTOKEN_DECIMALS === undefined
101
+ ) {
102
+ throw new UserError('Missing required token params');
103
+ }
104
+ if (txnMemo === undefined) {
105
+ throw new UserError('Missing required transaction memo (`txnMemo`)');
106
+ }
107
+
108
+ const denomConfig = {
109
+ USDC_DENOM,
110
+ USDC_DECIMALS,
111
+ USDC_GAS_DENOM,
112
+ CHAINTOKEN_DENOM,
113
+ CHAINTOKEN_DECIMALS,
114
+ CHAINTOKEN_GAS_DENOM,
115
+ };
116
+ const indexerConfig = new IndexerConfig(indexerUrl, websocketUrl);
117
+ const validatorConfig = new ValidatorConfig(
118
+ validatorUrl,
119
+ chainId,
120
+ denomConfig,
121
+ undefined,
122
+ txnMemo,
123
+ );
124
+ const config = new Network('native', indexerConfig, validatorConfig);
125
+ globalThis.client = await CompositeClient.connect(config);
126
+ if (faucetUrl !== undefined) {
127
+ globalThis.faucetClient = new FaucetClient(faucetUrl);
128
+ } else {
129
+ globalThis.faucetClient = null;
130
+ }
131
+
132
+ try {
133
+ globalThis.nobleClient = new NobleClient(nobleValidatorUrl, txnMemo);
134
+ if (globalThis.nobleWallet) {
135
+ await globalThis.nobleClient.connect(globalThis.nobleWallet);
136
+ }
137
+ } catch (e) {
138
+ console.error('Failed to connect to noble validator');
139
+ }
140
+
141
+ return encodeJson(config);
142
+ } catch (e) {
143
+ return wrappedError(e);
144
+ }
145
+ }
146
+
147
+ export async function connectWallet(mnemonic: string): Promise<string> {
148
+ try {
149
+ globalThis.wallet = await LocalWallet.fromMnemonic(mnemonic, BECH32_PREFIX);
150
+ globalThis.nobleWallet = await LocalWallet.fromMnemonic(mnemonic, NOBLE_BECH32_PREFIX);
151
+
152
+ const { privateKey, publicKey } = deriveHDKeyFromMnemonic(mnemonic);
153
+ globalThis.hdKey = {
154
+ privateKey,
155
+ publicKey,
156
+ };
157
+
158
+ try {
159
+ await globalThis.nobleClient?.connect(globalThis.nobleWallet);
160
+ } catch (e) {
161
+ console.error('Failed to connect to noble validator');
162
+ }
163
+
164
+ const address = globalThis.wallet.address!;
165
+ return encodeJson({ address });
166
+ } catch (e) {
167
+ return wrappedError(e);
168
+ }
169
+ }
170
+
171
+ export async function connect(network: Network, mnemonic: string): Promise<string> {
172
+ try {
173
+ await connectClient(network);
174
+ return connectWallet(mnemonic);
175
+ } catch (e) {
176
+ return wrappedError(e);
177
+ }
178
+ }
179
+
180
+ export async function deriveMnemomicFromEthereumSignature(signature: string): Promise<string> {
181
+ try {
182
+ const { mnemonic, privateKey, publicKey } = deriveHDKeyFromEthereumSignature(signature);
183
+ const wallet = await LocalWallet.fromMnemonic(mnemonic, BECH32_PREFIX);
184
+ globalThis.hdKey = {
185
+ privateKey,
186
+ publicKey,
187
+ };
188
+ const result = { mnemonic, address: wallet.address! };
189
+ return new Promise((resolve) => {
190
+ resolve(encodeJson(result));
191
+ });
192
+ } catch (e) {
193
+ return wrappedError(e);
194
+ }
195
+ }
196
+
197
+ export async function getHeight(): Promise<string> {
198
+ try {
199
+ const client = globalThis.client;
200
+ if (client === undefined) {
201
+ throw new UserError('client is not connected. Call connectClient() first');
202
+ }
203
+ const block = await globalThis.client?.validatorClient.get.latestBlock();
204
+ return encodeJson(block);
205
+ } catch (e) {
206
+ return wrappedError(e);
207
+ }
208
+ }
209
+
210
+ export async function getFeeTiers(): Promise<string> {
211
+ try {
212
+ const client = globalThis.client;
213
+ if (client === undefined) {
214
+ throw new UserError('client is not connected. Call connectClient() first');
215
+ }
216
+ const feeTiers = await globalThis.client?.validatorClient.get.getFeeTiers();
217
+ return encodeJson(feeTiers);
218
+ } catch (e) {
219
+ return wrappedError(e);
220
+ }
221
+ }
222
+
223
+ export async function getUserFeeTier(payload: string): Promise<string> {
224
+ try {
225
+ const client = globalThis.client;
226
+ if (client === undefined) {
227
+ throw new UserError('client is not connected. Call connectClient() first');
228
+ }
229
+ const json = JSON.parse(payload);
230
+ const address = json.address;
231
+ if (address === undefined) {
232
+ throw new UserError('address is not set');
233
+ }
234
+ const feeTiers = await globalThis.client?.validatorClient.get.getUserFeeTier(address);
235
+ return encodeJson(feeTiers);
236
+ } catch (e) {
237
+ return wrappedError(e);
238
+ }
239
+ }
240
+
241
+ export async function getEquityTiers(): Promise<string> {
242
+ try {
243
+ const client = globalThis.client;
244
+ if (client === undefined) {
245
+ throw new UserError('client is not connected. Call connectClient() first');
246
+ }
247
+ const equityTiers =
248
+ await globalThis.client?.validatorClient.get.getEquityTierLimitConfiguration();
249
+ return encodeJson(equityTiers, ByteArrayEncoding.BIGINT);
250
+ } catch (e) {
251
+ return wrappedError(e);
252
+ }
253
+ }
254
+
255
+ export async function getPerpetualMarkets(): Promise<string> {
256
+ try {
257
+ const client = globalThis.client;
258
+ if (client === undefined) {
259
+ throw new UserError('client is not connected. Call connectClient() first');
260
+ }
261
+ const markets = await globalThis.client?.indexerClient.markets.getPerpetualMarkets();
262
+ return encodeJson(markets);
263
+ } catch (e) {
264
+ return wrappedError(e);
265
+ }
266
+ }
267
+
268
+ export async function isWalletConnected(): Promise<string> {
269
+ try {
270
+ const client = globalThis.client;
271
+ if (client === undefined) {
272
+ throw new UserError('client is not connected. Call connectClient() first');
273
+ }
274
+ const wallet = globalThis.wallet;
275
+ if (wallet === undefined) {
276
+ throw new UserError('wallet is not set. Call connectWallet() first');
277
+ }
278
+ return await encodeJson({ result: true });
279
+ } catch (e) {
280
+ return wrappedError(e);
281
+ }
282
+ }
283
+
284
+ export async function placeOrder(payload: string): Promise<string> {
285
+ try {
286
+ const client = globalThis.client;
287
+ if (client === undefined) {
288
+ throw new UserError('client is not connected. Call connectClient() first');
289
+ }
290
+ const wallet = globalThis.wallet;
291
+ if (wallet === undefined) {
292
+ throw new UserError('wallet is not set. Call connectWallet() first');
293
+ }
294
+ const json = JSON.parse(payload);
295
+
296
+ const subaccountNumber = json.subaccountNumber;
297
+ if (subaccountNumber === undefined) {
298
+ throw new UserError('subaccountNumber is not set');
299
+ }
300
+ const marketId = json.marketId;
301
+ if (marketId === undefined) {
302
+ throw new UserError('marketId is not set');
303
+ }
304
+ const type = json.type;
305
+ if (type === undefined) {
306
+ throw new UserError('type is not set');
307
+ }
308
+ const side = json.side;
309
+ if (side === undefined) {
310
+ throw new UserError('side is not set');
311
+ }
312
+ const price = json.price;
313
+ if (price === undefined) {
314
+ throw new UserError('price is not set');
315
+ }
316
+ // trigger_price: number, // not used for MARKET and LIMIT
317
+ const size = json.size;
318
+ if (size === undefined) {
319
+ throw new UserError('size is not set');
320
+ }
321
+ const clientId = json.clientId;
322
+ if (clientId === undefined) {
323
+ throw new UserError('clientId is not set');
324
+ }
325
+ const timeInForce = json.timeInForce;
326
+ const goodTilTimeInSeconds = json.goodTilTimeInSeconds ?? 0;
327
+ const goodTilBlock = json.goodTilBlock ?? undefined;
328
+ const execution = json.execution;
329
+ const postOnly = json.postOnly ?? false;
330
+ const reduceOnly = json.reduceOnly ?? false;
331
+ const triggerPrice = json.triggerPrice ?? undefined;
332
+
333
+ const marketInfo = (json.marketInfo as MarketInfo) ?? undefined;
334
+ const currentHeight = (json.currentHeight as number) ?? undefined;
335
+
336
+ const subaccount = SubaccountInfo.forLocalWallet(wallet, subaccountNumber);
337
+ const tx = await client.placeOrder(
338
+ subaccount,
339
+ marketId,
340
+ type,
341
+ side,
342
+ price,
343
+ size,
344
+ clientId,
345
+ timeInForce,
346
+ goodTilTimeInSeconds,
347
+ execution,
348
+ postOnly,
349
+ reduceOnly,
350
+ triggerPrice,
351
+ marketInfo,
352
+ currentHeight,
353
+ goodTilBlock,
354
+ );
355
+ return encodeJson(tx);
356
+ } catch (error) {
357
+ return wrappedError(error);
358
+ }
359
+ }
360
+
361
+ export function wrappedError(error: Error): string {
362
+ const text = JSON.stringify(error, Object.getOwnPropertyNames(error));
363
+ return `{"error": ${text}}`;
364
+ }
365
+
366
+ export async function cancelOrder(payload: string): Promise<string> {
367
+ try {
368
+ const client = globalThis.client;
369
+ if (client === undefined) {
370
+ throw new UserError('client is not connected. Call connectNetwork() first');
371
+ }
372
+ const wallet = globalThis.wallet;
373
+ if (wallet === undefined) {
374
+ throw new UserError('wallet is not set. Call connectWallet() first');
375
+ }
376
+ const json = JSON.parse(payload);
377
+
378
+ const subaccountNumber = json.subaccountNumber;
379
+ if (subaccountNumber === undefined) {
380
+ throw new UserError('subaccountNumber is not set');
381
+ }
382
+ const clientId = json.clientId;
383
+ if (clientId === undefined) {
384
+ throw new UserError('clientId is not set');
385
+ }
386
+ const orderFlags = json.orderFlags;
387
+ if (orderFlags === undefined) {
388
+ throw new UserError('orderFlags is not set');
389
+ }
390
+ const clobPairId = json.clobPairId;
391
+ if (clobPairId === undefined) {
392
+ throw new UserError('clobPairId is not set');
393
+ }
394
+ const goodTilBlock = json.goodTilBlock;
395
+ const goodTilBlockTime = json.goodTilBlockTime;
396
+
397
+ const subaccount = SubaccountInfo.forLocalWallet(wallet, subaccountNumber);
398
+ const tx = await client.cancelRawOrder(
399
+ subaccount,
400
+ clientId,
401
+ orderFlags,
402
+ clobPairId,
403
+ goodTilBlock !== 0 ? goodTilBlock : undefined,
404
+ goodTilBlockTime !== 0 ? goodTilBlockTime : undefined,
405
+ );
406
+ return encodeJson(tx);
407
+ } catch (error) {
408
+ return wrappedError(error);
409
+ }
410
+ }
411
+
412
+ export async function deposit(payload: string): Promise<string> {
413
+ try {
414
+ const client = globalThis.client;
415
+ if (client === undefined) {
416
+ throw new UserError('client is not connected. Call connectNetwork() first');
417
+ }
418
+ const wallet = globalThis.wallet;
419
+ if (wallet === undefined) {
420
+ throw new UserError('wallet is not set. Call connectWallet() first');
421
+ }
422
+
423
+ const json = JSON.parse(payload);
424
+ const subaccountNumber = json.subaccountNumber;
425
+ if (subaccountNumber === undefined) {
426
+ throw new UserError('subaccountNumber is not set');
427
+ }
428
+ const amount = json.amount;
429
+ if (amount === undefined) {
430
+ throw new UserError('amount is not set');
431
+ }
432
+
433
+ const subaccount = SubaccountInfo.forLocalWallet(wallet, subaccountNumber);
434
+ const tx = await client.depositToSubaccount(subaccount, amount);
435
+ return encodeJson(tx);
436
+ } catch (error) {
437
+ return wrappedError(error);
438
+ }
439
+ }
440
+
441
+ export async function withdraw(payload: string): Promise<string> {
442
+ try {
443
+ const client = globalThis.client;
444
+ if (client === undefined) {
445
+ throw new UserError('client is not connected. Call connectNetwork() first');
446
+ }
447
+ const wallet = globalThis.wallet;
448
+ if (wallet === undefined) {
449
+ throw new UserError('wallet is not set. Call connectWallet() first');
450
+ }
451
+
452
+ const json = JSON.parse(payload);
453
+ const subaccountNumber = json.subaccountNumber;
454
+ if (subaccountNumber === undefined) {
455
+ throw new UserError('subaccountNumber is not set');
456
+ }
457
+ const amount = json.amount;
458
+ if (amount === undefined) {
459
+ throw new UserError('amount is not set');
460
+ }
461
+
462
+ const subaccount = SubaccountInfo.forLocalWallet(wallet, subaccountNumber);
463
+ const tx = await client.withdrawFromSubaccount(subaccount, amount, json.recipient, json.memo);
464
+ return encodeJson(tx);
465
+ } catch (error) {
466
+ return wrappedError(error);
467
+ }
468
+ }
469
+
470
+ export async function faucet(payload: string): Promise<string> {
471
+ try {
472
+ const faucetClient = globalThis.faucetClient;
473
+ if (!faucetClient) {
474
+ throw new UserError('faucetClient is not connected. Call connectNetwork() first');
475
+ }
476
+ const wallet = globalThis.wallet;
477
+ if (wallet === undefined) {
478
+ throw new UserError('wallet is not set. Call connectWallet() first');
479
+ }
480
+
481
+ const json = JSON.parse(payload);
482
+ const subaccountNumber = json.subaccountNumber;
483
+ if (subaccountNumber === undefined) {
484
+ throw new UserError('subaccountNumber is not set');
485
+ }
486
+ const amount = json.amount;
487
+ if (amount === undefined) {
488
+ throw new UserError('amount is not set');
489
+ }
490
+
491
+ const response = await faucetClient.fill(wallet.address!, subaccountNumber, amount);
492
+ const sanitized: Response = {
493
+ data: response.data,
494
+ status: response.status,
495
+ headers: response.headers,
496
+ };
497
+
498
+ return encodeJson(sanitized);
499
+ } catch (error) {
500
+ return wrappedError(error);
501
+ }
502
+ }
503
+
504
+ export async function withdrawToIBC(
505
+ subaccountNumber: number,
506
+ amount: string,
507
+ payload: string,
508
+ ): Promise<string> {
509
+ try {
510
+ const client = globalThis.client;
511
+ if (client === undefined) {
512
+ throw new UserError('client is not connected. Call connectClient() first');
513
+ }
514
+ const wallet = globalThis.wallet;
515
+ if (wallet === undefined) {
516
+ throw new UserError('wallet is not set. Call connectWallet() first');
517
+ }
518
+
519
+ const decode = (str: string): string => Buffer.from(str, 'base64').toString('binary');
520
+ const decoded = decode(payload);
521
+
522
+ const json: SquidIBCPayload = JSON.parse(decoded);
523
+
524
+ const ibcMsg: MsgTransferEncodeObject = {
525
+ typeUrl: json.msgTypeUrl, // '/ibc.applications.transfer.v1.MsgTransfer',
526
+ value: {
527
+ ...json.msg,
528
+ // Squid returns timeoutTimestamp as Long, but the signer expects BigInt
529
+ timeoutTimestamp: json.msg.timeoutTimestamp
530
+ ? BigInt(Long.fromValue(json.msg.timeoutTimestamp).toString())
531
+ : undefined,
532
+ },
533
+ };
534
+
535
+ const subaccount = SubaccountInfo.forLocalWallet(wallet, subaccountNumber);
536
+ const subaccountMsg = client.withdrawFromSubaccountMessage(subaccount, amount);
537
+
538
+ const msgs = [subaccountMsg, ibcMsg];
539
+ const encodeObjects: Promise<EncodeObject[]> = new Promise((resolve) => resolve(msgs));
540
+
541
+ const tx = await client.send(
542
+ subaccount,
543
+ () => {
544
+ return encodeObjects;
545
+ },
546
+ false,
547
+ undefined,
548
+ undefined,
549
+ );
550
+ return encodeJson(tx);
551
+ } catch (error) {
552
+ return wrappedError(error);
553
+ }
554
+ }
555
+
556
+ export async function transferNativeToken(payload: string): Promise<string> {
557
+ try {
558
+ const client = globalThis.client;
559
+ if (client === undefined) {
560
+ throw new UserError('client is not connected. Call connectClient() first');
561
+ }
562
+ const wallet = globalThis.wallet;
563
+ if (wallet === undefined) {
564
+ throw new UserError('wallet is not set. Call connectWallet() first');
565
+ }
566
+
567
+ const json = JSON.parse(payload);
568
+ const amount = json.amount;
569
+ if (amount === undefined) {
570
+ throw new UserError('amount is not set');
571
+ }
572
+
573
+ const msg: EncodeObject = client.sendTokenMessage(wallet, amount, json.recipient);
574
+ const msgs = [msg];
575
+ const encodeObjects: Promise<EncodeObject[]> = new Promise((resolve) => resolve(msgs));
576
+
577
+ const tx = await client.send(
578
+ SubaccountInfo.forLocalWallet(wallet),
579
+ () => {
580
+ return encodeObjects;
581
+ },
582
+ false,
583
+ client.validatorClient.post.defaultDydxGasPrice,
584
+ json.memo,
585
+ );
586
+ return encodeJson(tx);
587
+ } catch (error) {
588
+ return wrappedError(error);
589
+ }
590
+ }
591
+
592
+ export async function getAccountBalance(): Promise<String> {
593
+ try {
594
+ const client = globalThis.client;
595
+ if (client === undefined) {
596
+ throw new UserError('client is not connected. Call connectClient() first');
597
+ }
598
+ const wallet = globalThis.wallet;
599
+ if (wallet === undefined) {
600
+ throw new UserError('wallet is not set. Call connectWallet() first');
601
+ }
602
+ const address = globalThis.wallet.address!;
603
+
604
+ const tx = await client.validatorClient.get.getAccountBalance(
605
+ address,
606
+ client.validatorClient.config.denoms.USDC_DENOM,
607
+ );
608
+ return encodeJson(tx);
609
+ } catch (error) {
610
+ return wrappedError(error);
611
+ }
612
+ }
613
+
614
+ export async function getAccountBalances(): Promise<String> {
615
+ try {
616
+ const client = globalThis.client;
617
+ if (client === undefined) {
618
+ throw new UserError('client is not connected. Call connectClient() first');
619
+ }
620
+ const wallet = globalThis.wallet;
621
+ if (wallet === undefined) {
622
+ throw new UserError('wallet is not set. Call connectWallet() first');
623
+ }
624
+ const address = globalThis.wallet.address!;
625
+
626
+ const tx = await client.validatorClient.get.getAccountBalances(address);
627
+ return encodeJson(tx);
628
+ } catch (error) {
629
+ return wrappedError(error);
630
+ }
631
+ }
632
+
633
+ export async function getUserStats(payload: string): Promise<String> {
634
+ try {
635
+ const client = globalThis.client;
636
+ if (client === undefined) {
637
+ throw new UserError('client is not connected. Call connectClient() first');
638
+ }
639
+ const json = JSON.parse(payload);
640
+ const address = json.address;
641
+ if (address === undefined) {
642
+ throw new UserError('address is not set');
643
+ }
644
+
645
+ const tx = await client.validatorClient.get.getUserStats(address);
646
+ return encodeJson(tx);
647
+ } catch (error) {
648
+ return wrappedError(error);
649
+ }
650
+ }
651
+
652
+ export async function simulateDeposit(payload: string): Promise<string> {
653
+ try {
654
+ const client = globalThis.client;
655
+ if (client === undefined) {
656
+ throw new UserError('client is not connected. Call connectClient() first');
657
+ }
658
+ const wallet = globalThis.wallet;
659
+ if (wallet === undefined) {
660
+ throw new UserError('wallet is not set. Call connectWallet() first');
661
+ }
662
+ const json = JSON.parse(payload);
663
+ const subaccountNumber = json.subaccountNumber;
664
+ if (subaccountNumber === undefined) {
665
+ throw new UserError('subaccountNumber is not set');
666
+ }
667
+ const amount = json.amount;
668
+ if (amount === undefined) {
669
+ throw new UserError('amount is not set');
670
+ }
671
+
672
+ const subaccount = SubaccountInfo.forLocalWallet(wallet, subaccountNumber);
673
+ const msg: EncodeObject = client.depositToSubaccountMessage(subaccount, amount);
674
+ const msgs: EncodeObject[] = [msg];
675
+ const encodeObjects: Promise<EncodeObject[]> = new Promise((resolve) => resolve(msgs));
676
+
677
+ const stdFee = await client.simulate(subaccount, () => {
678
+ return encodeObjects;
679
+ });
680
+ return JSON.stringify(stdFee);
681
+ } catch (error) {
682
+ return wrappedError(error);
683
+ }
684
+ }
685
+
686
+ export async function simulateWithdraw(payload: string): Promise<string> {
687
+ try {
688
+ const client = globalThis.client;
689
+ if (client === undefined) {
690
+ throw new UserError('client is not connected. Call connectClient() first');
691
+ }
692
+ const wallet = globalThis.wallet;
693
+ if (wallet === undefined) {
694
+ throw new UserError('wallet is not set. Call connectWallet() first');
695
+ }
696
+ const json = JSON.parse(payload);
697
+ const subaccountNumber = json.subaccountNumber;
698
+ if (subaccountNumber === undefined) {
699
+ throw new UserError('subaccountNumber is not set');
700
+ }
701
+ const amount = json.amount;
702
+ if (amount === undefined) {
703
+ throw new UserError('amount is not set');
704
+ }
705
+
706
+ const subaccount = SubaccountInfo.forLocalWallet(wallet, subaccountNumber);
707
+ const msg: EncodeObject = client.withdrawFromSubaccountMessage(
708
+ subaccount,
709
+ amount,
710
+ json.recipient,
711
+ );
712
+ const msgs: EncodeObject[] = [msg];
713
+ const encodeObjects: Promise<EncodeObject[]> = new Promise((resolve) => resolve(msgs));
714
+
715
+ const stdFee = await client.simulate(subaccount, () => {
716
+ return encodeObjects;
717
+ });
718
+ return encodeJson(stdFee);
719
+ } catch (error) {
720
+ return wrappedError(error);
721
+ }
722
+ }
723
+
724
+ export async function simulateTransferNativeToken(payload: string): Promise<string> {
725
+ try {
726
+ const client = globalThis.client;
727
+ if (client === undefined) {
728
+ throw new UserError('client is not connected. Call connectClient() first');
729
+ }
730
+ const wallet = globalThis.wallet;
731
+ if (wallet === undefined) {
732
+ throw new UserError('wallet is not set. Call connectWallet() first');
733
+ }
734
+ const json = JSON.parse(payload);
735
+ const recipient = json.recipient;
736
+ if (recipient === undefined) {
737
+ throw new UserError('recipient is not set');
738
+ }
739
+ const amount = json.amount;
740
+ if (amount === undefined) {
741
+ throw new UserError('amount is not set');
742
+ }
743
+
744
+ const msg: EncodeObject = client.sendTokenMessage(wallet, amount, json.recipient);
745
+ const msgs: EncodeObject[] = [msg];
746
+ const encodeObjects: Promise<EncodeObject[]> = new Promise((resolve) => resolve(msgs));
747
+
748
+ const stdFee = await client.simulate(
749
+ SubaccountInfo.forLocalWallet(wallet),
750
+ () => {
751
+ return encodeObjects;
752
+ },
753
+ client.validatorClient.post.defaultDydxGasPrice,
754
+ );
755
+ return encodeJson(stdFee);
756
+ } catch (error) {
757
+ return wrappedError(error);
758
+ }
759
+ }
760
+
761
+ export async function signRawPlaceOrder(
762
+ subaccountNumber: number,
763
+ clientId: number,
764
+ clobPairId: number,
765
+ side: Order_Side,
766
+ quantums: Long,
767
+ subticks: Long,
768
+ timeInForce: Order_TimeInForce,
769
+ orderFlags: number,
770
+ reduceOnly: boolean,
771
+ goodTilBlock: number,
772
+ goodTilBlockTime: number,
773
+ clientMetadata: number,
774
+ ): Promise<string> {
775
+ try {
776
+ const client = globalThis.client;
777
+ if (client === undefined) {
778
+ throw new UserError('client is not connected. Call connectClient() first');
779
+ }
780
+ const wallet = globalThis.wallet;
781
+ if (wallet === undefined) {
782
+ throw new UserError('wallet is not set. Call connectWallet() first');
783
+ }
784
+
785
+ const msgs: Promise<EncodeObject[]> = new Promise((resolve) => {
786
+ const msg = client.validatorClient.post.composer.composeMsgPlaceOrder(
787
+ wallet.address!,
788
+ subaccountNumber,
789
+ clientId,
790
+ clobPairId,
791
+ orderFlags,
792
+ goodTilBlock,
793
+ goodTilBlockTime,
794
+ side,
795
+ quantums,
796
+ subticks,
797
+ timeInForce,
798
+ reduceOnly,
799
+ clientMetadata ?? 0,
800
+ );
801
+ resolve([msg]);
802
+ });
803
+ const signed = await client.sign(
804
+ SubaccountInfo.forLocalWallet(wallet, subaccountNumber),
805
+ () => msgs,
806
+ true,
807
+ );
808
+ return Buffer.from(signed).toString('base64');
809
+ } catch (error) {
810
+ return wrappedError(error);
811
+ }
812
+ }
813
+
814
+ export async function signPlaceOrder(
815
+ subaccountNumber: number,
816
+ marketId: string,
817
+ type: OrderType,
818
+ side: OrderSide,
819
+ price: number,
820
+ // trigger_price: number, // not used for MARKET and LIMIT
821
+ size: number,
822
+ clientId: number,
823
+ timeInForce: OrderTimeInForce,
824
+ goodTilTimeInSeconds: number,
825
+ execution: OrderExecution,
826
+ postOnly: boolean,
827
+ reduceOnly: boolean,
828
+ ): Promise<string> {
829
+ try {
830
+ const client = globalThis.client;
831
+ if (client === undefined) {
832
+ throw new UserError('client is not connected. Call connectClient() first');
833
+ }
834
+ const wallet = globalThis.wallet;
835
+ if (wallet === undefined) {
836
+ throw new UserError('wallet is not set. Call connectWallet() first');
837
+ }
838
+
839
+ const subaccount = SubaccountInfo.forLocalWallet(wallet, subaccountNumber);
840
+ const signed = await client.signPlaceOrder(
841
+ subaccount,
842
+ marketId,
843
+ type,
844
+ side,
845
+ price,
846
+ size,
847
+ clientId,
848
+ timeInForce,
849
+ goodTilTimeInSeconds,
850
+ execution,
851
+ postOnly,
852
+ reduceOnly,
853
+ );
854
+ return signed;
855
+ } catch (error) {
856
+ return wrappedError(error);
857
+ }
858
+ }
859
+
860
+ export async function signCancelOrder(
861
+ subaccountNumber: number,
862
+ clientId: number,
863
+ orderFlags: OrderFlags,
864
+ clobPairId: number,
865
+ goodTilBlock: number,
866
+ goodTilBlockTime: number,
867
+ ): Promise<string> {
868
+ try {
869
+ const client = globalThis.client;
870
+ if (client === undefined) {
871
+ throw new UserError('client is not connected. Call connectClient() first');
872
+ }
873
+ const wallet = globalThis.wallet;
874
+ if (wallet === undefined) {
875
+ throw new UserError('wallet is not set. Call connectWallet() first');
876
+ }
877
+
878
+ const subaccount = SubaccountInfo.forLocalWallet(wallet, subaccountNumber);
879
+ const signed = await client.signCancelOrder(
880
+ subaccount,
881
+ clientId,
882
+ orderFlags,
883
+ clobPairId,
884
+ goodTilBlock,
885
+ goodTilBlockTime,
886
+ );
887
+ return signed;
888
+ } catch (error) {
889
+ return wrappedError(error);
890
+ }
891
+ }
892
+
893
+ export async function encodeAccountRequestData(address: string): Promise<string> {
894
+ return new Promise((resolve, reject) => {
895
+ try {
896
+ const requestData: Uint8Array = Uint8Array.from(
897
+ AuthModule.QueryAccountRequest.encode({ address }).finish(),
898
+ );
899
+ resolve(Buffer.from(requestData).toString('hex'));
900
+ } catch (error) {
901
+ reject(error);
902
+ }
903
+ });
904
+ }
905
+
906
+ export async function decodeAccountResponseValue(value: string): Promise<string> {
907
+ return new Promise((resolve, reject) => {
908
+ try {
909
+ const rawData = Buffer.from(value, 'base64');
910
+ const rawAccount = AuthModule.QueryAccountResponse.decode(rawData).account;
911
+ // The promise should have been rejected if the rawAccount was undefined.
912
+ if (rawAccount === undefined) {
913
+ throw Error('rawAccount is undefined');
914
+ }
915
+ const account = accountFromAny(rawAccount);
916
+ resolve(encodeJson(account));
917
+ } catch (error) {
918
+ reject(error);
919
+ }
920
+ });
921
+ }
922
+
923
+ export async function getOptimalNode(endpointUrlsAsJson: string): Promise<string> {
924
+ /*
925
+ param:
926
+ endpointUrlsAsJson:
927
+ {
928
+ "endpointUrls": [
929
+ "https://rpc.testnet.near.org"
930
+ ],
931
+ "chainId": "testnet"
932
+ }
933
+ */
934
+ try {
935
+ const param = JSON.parse(endpointUrlsAsJson);
936
+ const endpointUrls = param.endpointUrls;
937
+ const chainId = param.chainId;
938
+ const networkOptimizer = new NetworkOptimizer();
939
+ const optimalUrl = await networkOptimizer.findOptimalNode(endpointUrls, chainId);
940
+ const url = {
941
+ url: optimalUrl,
942
+ };
943
+ return encodeJson(url);
944
+ } catch (error) {
945
+ return wrappedError(error);
946
+ }
947
+ }
948
+
949
+ export async function getOptimalIndexer(endpointUrlsAsJson: string): Promise<string> {
950
+ /*
951
+ param:
952
+ endpointUrlsAsJson:
953
+ {
954
+ "endpointUrls": [
955
+ "https://api.example.org"
956
+ ]
957
+ }
958
+ */
959
+ try {
960
+ const param = JSON.parse(endpointUrlsAsJson);
961
+ const endpointUrls = param.endpointUrls;
962
+ const networkOptimizer = new NetworkOptimizer();
963
+ const optimalUrl = await networkOptimizer.findOptimalIndexer(endpointUrls);
964
+ const url = {
965
+ url: optimalUrl,
966
+ };
967
+ return encodeJson(url);
968
+ } catch (error) {
969
+ return wrappedError(error);
970
+ }
971
+ }
972
+
973
+ export async function getRewardsParams(): Promise<string> {
974
+ try {
975
+ const client = globalThis.client;
976
+ if (client === undefined) {
977
+ throw new UserError('client is not connected. Call connectClient() first');
978
+ }
979
+ const rewardsParams = await globalThis.client?.validatorClient.get.getRewardsParams();
980
+ return encodeJson(rewardsParams);
981
+ } catch (e) {
982
+ return wrappedError(e);
983
+ }
984
+ }
985
+
986
+ export async function getDelegatorDelegations(payload: string): Promise<string> {
987
+ try {
988
+ const client = globalThis.client;
989
+ if (client === undefined) {
990
+ throw new UserError('client is not connected. Call connectClient() first');
991
+ }
992
+ const json = JSON.parse(payload);
993
+ const address = json.address;
994
+ if (address === undefined) {
995
+ throw new UserError('address is not set');
996
+ }
997
+ const delegations =
998
+ await globalThis.client?.validatorClient.get.getDelegatorDelegations(address);
999
+ return encodeJson(delegations);
1000
+ } catch (e) {
1001
+ return wrappedError(e);
1002
+ }
1003
+ }
1004
+
1005
+ export async function getStakingRewards(payload: string): Promise<string> {
1006
+ try {
1007
+ const client = globalThis.client;
1008
+ if (client === undefined) {
1009
+ throw new UserError('client is not connected. Call connectClient() first');
1010
+ }
1011
+ const json = JSON.parse(payload);
1012
+ const address = json.address;
1013
+ if (address === undefined) {
1014
+ throw new UserError('address is not set');
1015
+ }
1016
+ const delegations =
1017
+ await globalThis.client?.validatorClient.get.getDelegationTotalRewards(address);
1018
+ return encodeJson(delegations);
1019
+ } catch (e) {
1020
+ return wrappedError(e);
1021
+ }
1022
+ }
1023
+
1024
+ export async function getCurrentUnstaking(payload: string): Promise<string> {
1025
+ try {
1026
+ const client = globalThis.client;
1027
+ if (client === undefined) {
1028
+ throw new UserError('client is not connected. Call connectClient() first');
1029
+ }
1030
+ const json = JSON.parse(payload);
1031
+ const address = json.address;
1032
+ if (address === undefined) {
1033
+ throw new UserError('address is not set');
1034
+ }
1035
+ const delegations =
1036
+ await globalThis.client?.validatorClient.get.getDelegatorUnbondingDelegations(address);
1037
+ return encodeJson(delegations);
1038
+ } catch (e) {
1039
+ return wrappedError(e);
1040
+ }
1041
+ }
1042
+
1043
+ export async function getMarketPrice(payload: string): Promise<string> {
1044
+ try {
1045
+ const client = globalThis.client;
1046
+ if (client === undefined) {
1047
+ throw new UserError('client is not connected. Call connectClient() first');
1048
+ }
1049
+ const json = JSON.parse(payload);
1050
+ const marketId = json.marketId;
1051
+ if (marketId === undefined) {
1052
+ throw new UserError('marketId is not set');
1053
+ }
1054
+ const marketPrice = await client.validatorClient.get.getPrice(marketId);
1055
+ return encodeJson(marketPrice);
1056
+ } catch (e) {
1057
+ return wrappedError(e);
1058
+ }
1059
+ }
1060
+
1061
+ export async function getNobleBalance(): Promise<String> {
1062
+ try {
1063
+ const client = globalThis.nobleClient;
1064
+ if (client === undefined || !client.isConnected) {
1065
+ throw new UserError('client is not connected.');
1066
+ }
1067
+ const coin = await client.getAccountBalance('uusdc');
1068
+ return encodeJson(coin);
1069
+ } catch (error) {
1070
+ return wrappedError(error);
1071
+ }
1072
+ }
1073
+
1074
+ export async function sendNobleIBC(squidPayload: string): Promise<String> {
1075
+ try {
1076
+ const client = globalThis.nobleClient;
1077
+ if (client === undefined || !client.isConnected) {
1078
+ throw new UserError('client is not connected.');
1079
+ }
1080
+
1081
+ const json: SquidIBCPayload = JSON.parse(squidPayload);
1082
+
1083
+ const ibcMsg: MsgTransferEncodeObject = {
1084
+ typeUrl: json.msgTypeUrl,
1085
+ value: {
1086
+ ...json.msg,
1087
+ // Squid returns timeoutTimestamp as Long, but the signer expects BigInt
1088
+ timeoutTimestamp: json.msg.timeoutTimestamp
1089
+ ? BigInt(Long.fromValue(json.msg.timeoutTimestamp).toString())
1090
+ : undefined,
1091
+ },
1092
+ };
1093
+ const fee = await client.simulateTransaction([ibcMsg]);
1094
+
1095
+ if (!ibcMsg.value.token) {
1096
+ throw new UserError('Payload missing token field');
1097
+ }
1098
+
1099
+ // take out fee from amount before sweeping
1100
+ const amount =
1101
+ parseInt(ibcMsg.value.token.amount, 10) -
1102
+ Math.floor(parseInt(fee.amount[0].amount, 10) * GAS_MULTIPLIER);
1103
+
1104
+ if (amount <= 0) {
1105
+ throw new UserError('noble balance does not cover fees');
1106
+ }
1107
+
1108
+ ibcMsg.value.token = createCoin(amount.toString(), ibcMsg.value.token.denom);
1109
+ const tx = await client.IBCTransfer(ibcMsg);
1110
+ return encodeJson(tx);
1111
+ } catch (error) {
1112
+ return wrappedError(error);
1113
+ }
1114
+ }
1115
+
1116
+ export async function withdrawToNobleIBC(payload: string): Promise<String> {
1117
+ try {
1118
+ const client = globalThis.client;
1119
+ if (client === undefined) {
1120
+ throw new UserError('client is not connected. Call connectClient() first');
1121
+ }
1122
+ const wallet = globalThis.wallet;
1123
+ if (wallet === undefined) {
1124
+ throw new UserError('wallet is not set. Call connectWallet() first');
1125
+ }
1126
+ const json = JSON.parse(payload);
1127
+
1128
+ const { subaccountNumber, amount, ibcPayload } = json ?? {};
1129
+
1130
+ const decode = (str: string): string => Buffer.from(str, 'base64').toString('binary');
1131
+ const decoded = decode(ibcPayload);
1132
+
1133
+ const parsedIbcPayload: SquidIBCPayload = JSON.parse(decoded);
1134
+
1135
+ const subaccount = SubaccountInfo.forLocalWallet(wallet, subaccountNumber);
1136
+ const msg = client.withdrawFromSubaccountMessage(
1137
+ subaccount,
1138
+ parseFloat(amount).toFixed(client.validatorClient.config.denoms.USDC_DECIMALS),
1139
+ );
1140
+ const ibcMsg: MsgTransferEncodeObject = {
1141
+ typeUrl: parsedIbcPayload.msgTypeUrl,
1142
+ value: {
1143
+ ...parsedIbcPayload.msg,
1144
+ // Squid returns timeoutTimestamp as Long, but the signer expects BigInt
1145
+ timeoutTimestamp: parsedIbcPayload.msg.timeoutTimestamp
1146
+ ? BigInt(Long.fromValue(parsedIbcPayload.msg.timeoutTimestamp).toString())
1147
+ : undefined,
1148
+ },
1149
+ };
1150
+
1151
+ const tx = await client.send(subaccount, () => Promise.resolve([msg, ibcMsg]), false);
1152
+
1153
+ return encodeJson({
1154
+ txHash: `0x${Buffer.from(tx?.hash).toString('hex')}`,
1155
+ });
1156
+ } catch (error) {
1157
+ return wrappedError(error);
1158
+ }
1159
+ }
1160
+
1161
+ export async function cctpWithdraw(squidPayload: string): Promise<String> {
1162
+ try {
1163
+ const client = globalThis.nobleClient;
1164
+ if (client === undefined || !client.isConnected) {
1165
+ throw new UserError('client is not connected.');
1166
+ }
1167
+
1168
+ const json = JSON.parse(squidPayload);
1169
+
1170
+ const ibcMsg = {
1171
+ typeUrl: json.typeUrl, // '/circle.cctp.v1.MsgDepositForBurn',
1172
+ value: json.value,
1173
+ };
1174
+ const fee = await client.simulateTransaction([ibcMsg]);
1175
+
1176
+ // take out fee from amount before sweeping
1177
+ const amount =
1178
+ parseInt(ibcMsg.value.amount, 10) -
1179
+ Math.floor(parseInt(fee.amount[0].amount, 10) * GAS_MULTIPLIER);
1180
+
1181
+ if (amount <= 0) {
1182
+ throw new Error('noble balance does not cover fees');
1183
+ }
1184
+
1185
+ ibcMsg.value.amount = amount.toString();
1186
+
1187
+ const tx = await client.send([ibcMsg]);
1188
+
1189
+ return encodeJson(tx);
1190
+ } catch (error) {
1191
+ return wrappedError(error);
1192
+ }
1193
+ }
1194
+
1195
+ export async function cctpMultiMsgWithdraw(cosmosPayload: string): Promise<string> {
1196
+ try {
1197
+ const client = globalThis.nobleClient;
1198
+ const messages: { typeUrl: string; value: { amount: string } }[] = JSON.parse(cosmosPayload);
1199
+ if (client === undefined || !client.isConnected) {
1200
+ throw new UserError('client is not connected.');
1201
+ }
1202
+ const ibcMsgs = messages.map(({ typeUrl, value }) => ({
1203
+ typeUrl, // '/circle.cctp.v1.MsgDepositForBurnWithCaller', '/cosmos.bank.v1beta1.MsgSend'
1204
+ value,
1205
+ }));
1206
+
1207
+ const fee = await client.simulateTransaction(ibcMsgs);
1208
+
1209
+ // take out fee from amount before sweeping
1210
+ const amount =
1211
+ parseInt(ibcMsgs[0].value.amount, 10) -
1212
+ Math.floor(parseInt(fee.amount[0].amount, 10) * GAS_MULTIPLIER);
1213
+
1214
+ if (amount <= 0) {
1215
+ throw new Error('noble balance does not cover fees');
1216
+ }
1217
+
1218
+ ibcMsgs[0].value.amount = amount.toString();
1219
+
1220
+ const tx = await client.send(ibcMsgs);
1221
+
1222
+ return encodeJson(tx);
1223
+ } catch (error) {
1224
+ return wrappedError(error);
1225
+ }
1226
+ }
1227
+
1228
+ export async function getWithdrawalCapacityByDenom(payload: string): Promise<string> {
1229
+ try {
1230
+ const client = globalThis.client;
1231
+ if (client === undefined) {
1232
+ throw new UserError('client is not connected. Call connectClient() first');
1233
+ }
1234
+ const json = JSON.parse(payload);
1235
+ const denom = json.denom;
1236
+ if (denom === undefined) {
1237
+ throw new UserError('denom is not set');
1238
+ }
1239
+
1240
+ const response = await client.validatorClient.get.getWithdrawalCapacityByDenom(denom);
1241
+ return encodeJson(response, ByteArrayEncoding.BIGINT);
1242
+ } catch (error) {
1243
+ return wrappedError(error);
1244
+ }
1245
+ }
1246
+
1247
+ export async function getWithdrawalAndTransferGatingStatus(perpetualId: number): Promise<string> {
1248
+ try {
1249
+ const client = globalThis.client;
1250
+ if (client === undefined) {
1251
+ throw new UserError('client is not connected. Call connectClient() first');
1252
+ }
1253
+
1254
+ const response =
1255
+ await client.validatorClient.get.getWithdrawalAndTransferGatingStatus(perpetualId);
1256
+ return encodeJson(response);
1257
+ } catch (error) {
1258
+ return wrappedError(error);
1259
+ }
1260
+ }
1261
+
1262
+ export async function subaccountTransfer(payload: string): Promise<string> {
1263
+ try {
1264
+ const client = globalThis.client;
1265
+ if (client === undefined) {
1266
+ throw new UserError('client is not connected. Call connectNetwork() first');
1267
+ }
1268
+ const wallet = globalThis.wallet;
1269
+ if (wallet === undefined) {
1270
+ throw new UserError('wallet is not set. Call connectWallet() first');
1271
+ }
1272
+
1273
+ const json = JSON.parse(payload);
1274
+ const subaccountNumber = json.subaccountNumber;
1275
+ if (subaccountNumber === undefined) {
1276
+ throw new UserError('subaccountNumber is not set');
1277
+ }
1278
+ const amount = json.amount;
1279
+ if (amount === undefined) {
1280
+ throw new UserError('amount is not set');
1281
+ }
1282
+
1283
+ let destinationAddress = json.destinationAddress;
1284
+ if (destinationAddress === undefined) {
1285
+ destinationAddress = wallet.address!;
1286
+ }
1287
+
1288
+ const destinationSubaccountNumber = json.destinationSubaccountNumber;
1289
+ if (destinationSubaccountNumber === undefined) {
1290
+ throw new UserError('destinationSubaccountNumber is not set');
1291
+ }
1292
+
1293
+ const subaccount = SubaccountInfo.forLocalWallet(wallet, subaccountNumber);
1294
+ const tx = await client.transferToSubaccount(
1295
+ subaccount,
1296
+ destinationAddress,
1297
+ destinationSubaccountNumber,
1298
+ parseFloat(amount).toFixed(6),
1299
+ Method.BroadcastTxCommit,
1300
+ );
1301
+ return encodeJson(tx);
1302
+ } catch (error) {
1303
+ return wrappedError(error);
1304
+ }
1305
+ }
1306
+
1307
+ export async function signCompliancePayload(payload: string): Promise<string> {
1308
+ try {
1309
+ const json = JSON.parse(payload);
1310
+ const message = json.message;
1311
+ if (message === undefined) {
1312
+ throw new UserError('message is not set');
1313
+ }
1314
+ const action = json.action;
1315
+ if (action === undefined) {
1316
+ throw new UserError('action is not set');
1317
+ }
1318
+ const currentStatus = json.status;
1319
+ if (currentStatus === undefined) {
1320
+ throw new UserError('status is not set');
1321
+ }
1322
+ if (!globalThis.hdKey?.privateKey || !globalThis.hdKey?.publicKey) {
1323
+ throw new Error('Missing hdKey');
1324
+ }
1325
+
1326
+ const timestampInSeconds = Math.floor(Date.now() / 1000);
1327
+ const messageToSign: string = `${message}:${action}"${currentStatus ?? ''}:${timestampInSeconds}`;
1328
+ const messageHash = sha256(Buffer.from(messageToSign));
1329
+
1330
+ const signed = await Secp256k1.createSignature(messageHash, globalThis.hdKey.privateKey);
1331
+ const signedMessage = signed.toFixedLength();
1332
+
1333
+ return encodeJson({
1334
+ signedMessage: Buffer.from(signedMessage).toString('base64'),
1335
+ publicKey: Buffer.from(globalThis.hdKey.publicKey).toString('base64'),
1336
+ timestamp: timestampInSeconds,
1337
+ });
1338
+ } catch (error) {
1339
+ return wrappedError(error);
1340
+ }
1341
+ }
1342
+
1343
+ export async function signPushNotificationTokenRegistrationPayload(
1344
+ payload: string,
1345
+ ): Promise<string> {
1346
+ try {
1347
+ const json = JSON.parse(payload);
1348
+ const message = json.message;
1349
+ if (message === undefined) {
1350
+ throw new UserError('message is not set');
1351
+ }
1352
+ if (!globalThis.hdKey?.privateKey || !globalThis.hdKey?.publicKey) {
1353
+ throw new Error('Missing hdKey');
1354
+ }
1355
+
1356
+ const timestampInSeconds = Math.floor(Date.now() / 1000);
1357
+ const messageToSign: string = `${message}:REGISTER_TOKEN"${''}:${timestampInSeconds}`;
1358
+ const messageHash = sha256(Buffer.from(messageToSign));
1359
+
1360
+ const signed = await Secp256k1.createSignature(messageHash, globalThis.hdKey.privateKey);
1361
+ const signedMessage = signed.toFixedLength();
1362
+
1363
+ return encodeJson({
1364
+ signedMessage: Buffer.from(signedMessage).toString('base64'),
1365
+ publicKey: Buffer.from(globalThis.hdKey.publicKey).toString('base64'),
1366
+ timestamp: timestampInSeconds,
1367
+ });
1368
+ } catch (error) {
1369
+ return wrappedError(error);
1370
+ }
1371
+ }
1372
+
1373
+ export async function setSelectedGasDenom(gasDenom: string): Promise<string> {
1374
+ try {
1375
+ const client = globalThis.client;
1376
+ if (client === undefined) {
1377
+ throw new UserError('client is not connected. Call connectClient() first');
1378
+ }
1379
+ await client.setSelectedGasDenom(gasDenom as SelectedGasDenom);
1380
+ return encodeJson('success');
1381
+ } catch (error) {
1382
+ return wrappedError(error);
1383
+ }
1384
+ }
1385
+
1386
+ export async function getMegavaultOwnerShares(payload: string): Promise<string> {
1387
+ try {
1388
+ const client = globalThis.client;
1389
+ if (client === undefined) {
1390
+ throw new UserError('client is not connected. Call connectClient() first');
1391
+ }
1392
+ const json = JSON.parse(payload);
1393
+ const address = json.address;
1394
+ if (address === undefined) {
1395
+ throw new UserError('address is not set');
1396
+ }
1397
+ const response = await globalThis.client?.validatorClient.get.getMegavaultOwnerShares(address);
1398
+ return encodeJson(parseToPrimitives(response));
1399
+ } catch (e) {
1400
+ return wrappedError(e);
1401
+ }
1402
+ }
1403
+
1404
+ export async function getMegavaultWithdrawalInfo(sharesToWithdraw: bigint): Promise<string> {
1405
+ try {
1406
+ const client = globalThis.client;
1407
+ if (client === undefined) {
1408
+ throw new UserError('client is not connected. Call connectClient() first');
1409
+ }
1410
+ const response =
1411
+ await globalThis.client?.validatorClient.get.getMegavaultWithdrawalInfo(sharesToWithdraw);
1412
+ return encodeJson(parseToPrimitives(response));
1413
+ } catch (e) {
1414
+ return wrappedError(e);
1415
+ }
1416
+ }
1417
+
1418
+ export async function depositToMegavault(
1419
+ subaccountNumber: number,
1420
+ amountUsdc: number,
1421
+ ): Promise<string> {
1422
+ try {
1423
+ const client = globalThis.client;
1424
+ if (client === undefined) {
1425
+ throw new UserError('client is not connected. Call connectNetwork() first');
1426
+ }
1427
+ const wallet = globalThis.wallet;
1428
+ if (wallet === undefined) {
1429
+ throw new UserError('wallet is not set. Call connectWallet() first');
1430
+ }
1431
+ const subaccount = SubaccountInfo.forLocalWallet(wallet, subaccountNumber);
1432
+ const tx = await client.depositToMegavault(subaccount, amountUsdc, Method.BroadcastTxCommit);
1433
+ return encodeJson(parseToPrimitives(tx));
1434
+ } catch (error) {
1435
+ return wrappedError(error);
1436
+ }
1437
+ }
1438
+
1439
+ export async function withdrawFromMegavault(
1440
+ subaccountNumber: number,
1441
+ shares: number,
1442
+ minAmount: number,
1443
+ ): Promise<string> {
1444
+ try {
1445
+ const client = globalThis.client;
1446
+ if (client === undefined) {
1447
+ throw new UserError('client is not connected. Call connectNetwork() first');
1448
+ }
1449
+ const wallet = globalThis.wallet;
1450
+ if (wallet === undefined) {
1451
+ throw new UserError('wallet is not set. Call connectWallet() first');
1452
+ }
1453
+ const subaccount = SubaccountInfo.forLocalWallet(wallet, subaccountNumber);
1454
+ const tx = await client.withdrawFromMegavault(
1455
+ subaccount,
1456
+ shares,
1457
+ minAmount,
1458
+ Method.BroadcastTxCommit,
1459
+ );
1460
+ return encodeJson(parseToPrimitives(tx));
1461
+ } catch (error) {
1462
+ return wrappedError(error);
1463
+ }
1464
+ }
1465
+
1466
+ export async function getAllPerpMarketFeeDiscounts(): Promise<string> {
1467
+ try {
1468
+ const client = globalThis.client;
1469
+ if (client === undefined) {
1470
+ throw new UserError('client is not connected. Call connectClient() first');
1471
+ }
1472
+ const response = await globalThis.client?.validatorClient.get.getAllPerpMarketFeeDiscounts();
1473
+ return encodeJson(response);
1474
+ } catch (error) {
1475
+ return wrappedError(error);
1476
+ }
1477
+ }
1478
+
1479
+ export async function getAllStakingTiers(): Promise<string> {
1480
+ try {
1481
+ const client = globalThis.client;
1482
+ if (client === undefined) {
1483
+ throw new UserError('client is not connected. Call connectClient() first');
1484
+ }
1485
+ const response = await globalThis.client?.validatorClient.get.getAllStakingTiers();
1486
+ return encodeJson(response);
1487
+ } catch (error) {
1488
+ return wrappedError(error);
1489
+ }
1490
+ }
1491
+
1492
+ export async function getUserStakingTier(payload: string): Promise<string> {
1493
+ try {
1494
+ const client = globalThis.client;
1495
+ if (client === undefined) {
1496
+ throw new UserError('client is not connected. Call connectClient() first');
1497
+ }
1498
+ const json = JSON.parse(payload);
1499
+ const address = json.address;
1500
+ if (address === undefined) {
1501
+ throw new UserError('address is not set');
1502
+ }
1503
+ const response = await globalThis.client?.validatorClient.get.getUserStakingTier(address);
1504
+ return encodeJson(response);
1505
+ } catch (error) {
1506
+ return wrappedError(error);
1507
+ }
1508
+ }