@ledgerhq/coin-solana 0.7.0-nightly.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (521) hide show
  1. package/.eslintrc.js +20 -0
  2. package/.turbo/turbo-build.log +4 -0
  3. package/.unimportedrc.json +16 -0
  4. package/CHANGELOG.md +13 -0
  5. package/LICENSE.txt +21 -0
  6. package/jest.config.js +9 -0
  7. package/lib/api/cached.d.ts +3 -0
  8. package/lib/api/cached.d.ts.map +1 -0
  9. package/lib/api/cached.js +40 -0
  10. package/lib/api/cached.js.map +1 -0
  11. package/lib/api/chain/account/index.d.ts +2 -0
  12. package/lib/api/chain/account/index.d.ts.map +1 -0
  13. package/lib/api/chain/account/index.js +8 -0
  14. package/lib/api/chain/account/index.js.map +1 -0
  15. package/lib/api/chain/account/parser.d.ts +10 -0
  16. package/lib/api/chain/account/parser.d.ts.map +1 -0
  17. package/lib/api/chain/account/parser.js +56 -0
  18. package/lib/api/chain/account/parser.js.map +1 -0
  19. package/lib/api/chain/account/stake.d.ts +237 -0
  20. package/lib/api/chain/account/stake.d.ts.map +1 -0
  21. package/lib/api/chain/account/stake.js +38 -0
  22. package/lib/api/chain/account/stake.js.map +1 -0
  23. package/lib/api/chain/account/token.d.ts +116 -0
  24. package/lib/api/chain/account/token.d.ts.map +1 -0
  25. package/lib/api/chain/account/token.js +42 -0
  26. package/lib/api/chain/account/token.js.map +1 -0
  27. package/lib/api/chain/account/vote.d.ts +252 -0
  28. package/lib/api/chain/account/vote.d.ts.map +1 -0
  29. package/lib/api/chain/account/vote.js +44 -0
  30. package/lib/api/chain/account/vote.js.map +1 -0
  31. package/lib/api/chain/index.d.ts +29 -0
  32. package/lib/api/chain/index.d.ts.map +1 -0
  33. package/lib/api/chain/index.js +99 -0
  34. package/lib/api/chain/index.js.map +1 -0
  35. package/lib/api/chain/instruction/associated-token-account/index.d.ts +15 -0
  36. package/lib/api/chain/instruction/associated-token-account/index.d.ts.map +1 -0
  37. package/lib/api/chain/instruction/associated-token-account/index.js +21 -0
  38. package/lib/api/chain/instruction/associated-token-account/index.js.map +1 -0
  39. package/lib/api/chain/instruction/associated-token-account/types.d.ts +30 -0
  40. package/lib/api/chain/instruction/associated-token-account/types.d.ts.map +1 -0
  41. package/lib/api/chain/instruction/associated-token-account/types.js +19 -0
  42. package/lib/api/chain/instruction/associated-token-account/types.js.map +1 -0
  43. package/lib/api/chain/instruction/memo/index.d.ts +15 -0
  44. package/lib/api/chain/instruction/memo/index.d.ts.map +1 -0
  45. package/lib/api/chain/instruction/memo/index.js +14 -0
  46. package/lib/api/chain/instruction/memo/index.js.map +1 -0
  47. package/lib/api/chain/instruction/memo/types.d.ts +21 -0
  48. package/lib/api/chain/instruction/memo/types.d.ts.map +1 -0
  49. package/lib/api/chain/instruction/memo/types.js +16 -0
  50. package/lib/api/chain/instruction/memo/types.js.map +1 -0
  51. package/lib/api/chain/instruction/stake/index.d.ts +15 -0
  52. package/lib/api/chain/instruction/stake/index.d.ts.map +1 -0
  53. package/lib/api/chain/instruction/stake/index.js +20 -0
  54. package/lib/api/chain/instruction/stake/index.js.map +1 -0
  55. package/lib/api/chain/instruction/stake/types.d.ts +215 -0
  56. package/lib/api/chain/instruction/stake/types.d.ts.map +1 -0
  57. package/lib/api/chain/instruction/stake/types.js +80 -0
  58. package/lib/api/chain/instruction/stake/types.js.map +1 -0
  59. package/lib/api/chain/instruction/system/index.d.ts +15 -0
  60. package/lib/api/chain/instruction/system/index.d.ts.map +1 -0
  61. package/lib/api/chain/instruction/system/index.js +20 -0
  62. package/lib/api/chain/instruction/system/index.js.map +1 -0
  63. package/lib/api/chain/instruction/system/types.d.ts +298 -0
  64. package/lib/api/chain/instruction/system/types.d.ts.map +1 -0
  65. package/lib/api/chain/instruction/system/types.js +117 -0
  66. package/lib/api/chain/instruction/system/types.js.map +1 -0
  67. package/lib/api/chain/instruction/token/index.d.ts +15 -0
  68. package/lib/api/chain/instruction/token/index.d.ts.map +1 -0
  69. package/lib/api/chain/instruction/token/index.js +20 -0
  70. package/lib/api/chain/instruction/token/index.js.map +1 -0
  71. package/lib/api/chain/instruction/token/types.d.ts +497 -0
  72. package/lib/api/chain/instruction/token/types.d.ts.map +1 -0
  73. package/lib/api/chain/instruction/token/types.js +200 -0
  74. package/lib/api/chain/instruction/token/types.js.map +1 -0
  75. package/lib/api/chain/program/constants.d.ts +11 -0
  76. package/lib/api/chain/program/constants.d.ts.map +1 -0
  77. package/lib/api/chain/program/constants.js +14 -0
  78. package/lib/api/chain/program/constants.js.map +1 -0
  79. package/lib/api/chain/program/index.d.ts +2 -0
  80. package/lib/api/chain/program/index.d.ts.map +1 -0
  81. package/lib/api/chain/program/index.js +7 -0
  82. package/lib/api/chain/program/index.js.map +1 -0
  83. package/lib/api/chain/program/parser.d.ts +35 -0
  84. package/lib/api/chain/program/parser.d.ts.map +1 -0
  85. package/lib/api/chain/program/parser.js +66 -0
  86. package/lib/api/chain/program/parser.js.map +1 -0
  87. package/lib/api/chain/validators/bignum.d.ts +3 -0
  88. package/lib/api/chain/validators/bignum.d.ts.map +1 -0
  89. package/lib/api/chain/validators/bignum.js +11 -0
  90. package/lib/api/chain/validators/bignum.js.map +1 -0
  91. package/lib/api/chain/validators/index.d.ts +10 -0
  92. package/lib/api/chain/validators/index.d.ts.map +1 -0
  93. package/lib/api/chain/validators/index.js +10 -0
  94. package/lib/api/chain/validators/index.js.map +1 -0
  95. package/lib/api/chain/validators/pubkey.d.ts +3 -0
  96. package/lib/api/chain/validators/pubkey.d.ts.map +1 -0
  97. package/lib/api/chain/validators/pubkey.js +7 -0
  98. package/lib/api/chain/validators/pubkey.js.map +1 -0
  99. package/lib/api/chain/web3.d.ts +43 -0
  100. package/lib/api/chain/web3.d.ts.map +1 -0
  101. package/lib/api/chain/web3.js +274 -0
  102. package/lib/api/chain/web3.js.map +1 -0
  103. package/lib/api/index.d.ts +5 -0
  104. package/lib/api/index.d.ts.map +1 -0
  105. package/lib/api/index.js +25 -0
  106. package/lib/api/index.js.map +1 -0
  107. package/lib/api/logged.d.ts +3 -0
  108. package/lib/api/logged.d.ts.map +1 -0
  109. package/lib/api/logged.js +69 -0
  110. package/lib/api/logged.js.map +1 -0
  111. package/lib/api/queued.d.ts +3 -0
  112. package/lib/api/queued.d.ts.map +1 -0
  113. package/lib/api/queued.js +27 -0
  114. package/lib/api/queued.js.map +1 -0
  115. package/lib/api/traced.d.ts +3 -0
  116. package/lib/api/traced.d.ts.map +1 -0
  117. package/lib/api/traced.js +80 -0
  118. package/lib/api/traced.js.map +1 -0
  119. package/lib/bridge/bridge.d.ts +15 -0
  120. package/lib/bridge/bridge.d.ts.map +1 -0
  121. package/lib/bridge/bridge.js +139 -0
  122. package/lib/bridge/bridge.js.map +1 -0
  123. package/lib/bridge/js.d.ts +7 -0
  124. package/lib/bridge/js.d.ts.map +1 -0
  125. package/lib/bridge/js.js +28 -0
  126. package/lib/bridge/js.js.map +1 -0
  127. package/lib/bridge.integration.test.d.ts +4 -0
  128. package/lib/bridge.integration.test.d.ts.map +1 -0
  129. package/lib/bridge.integration.test.js +990 -0
  130. package/lib/bridge.integration.test.js.map +1 -0
  131. package/lib/cli-transaction.d.ts +19 -0
  132. package/lib/cli-transaction.d.ts.map +1 -0
  133. package/lib/cli-transaction.js +196 -0
  134. package/lib/cli-transaction.js.map +1 -0
  135. package/lib/datasets/solana.scanAccounts.1.d.ts +6 -0
  136. package/lib/datasets/solana.scanAccounts.1.d.ts.map +1 -0
  137. package/lib/datasets/solana.scanAccounts.1.js +12 -0
  138. package/lib/datasets/solana.scanAccounts.1.js.map +1 -0
  139. package/lib/deviceTransactionConfig.d.ts +10 -0
  140. package/lib/deviceTransactionConfig.d.ts.map +1 -0
  141. package/lib/deviceTransactionConfig.js +228 -0
  142. package/lib/deviceTransactionConfig.js.map +1 -0
  143. package/lib/errors.d.ts +61 -0
  144. package/lib/errors.d.ts.map +1 -0
  145. package/lib/errors.js +25 -0
  146. package/lib/errors.js.map +1 -0
  147. package/lib/hw-getAddress.d.ts +6 -0
  148. package/lib/hw-getAddress.d.ts.map +1 -0
  149. package/lib/hw-getAddress.js +28 -0
  150. package/lib/hw-getAddress.js.map +1 -0
  151. package/lib/js-broadcast.d.ts +7 -0
  152. package/lib/js-broadcast.d.ts.map +1 -0
  153. package/lib/js-broadcast.js +37 -0
  154. package/lib/js-broadcast.js.map +1 -0
  155. package/lib/js-buildTransaction.d.ts +5 -0
  156. package/lib/js-buildTransaction.d.ts.map +1 -0
  157. package/lib/js-buildTransaction.js +67 -0
  158. package/lib/js-buildTransaction.js.map +1 -0
  159. package/lib/js-createTransaction.d.ts +5 -0
  160. package/lib/js-createTransaction.d.ts.map +1 -0
  161. package/lib/js-createTransaction.js +19 -0
  162. package/lib/js-createTransaction.js.map +1 -0
  163. package/lib/js-estimateMaxSpendable.d.ts +11 -0
  164. package/lib/js-estimateMaxSpendable.d.ts.map +1 -0
  165. package/lib/js-estimateMaxSpendable.js +62 -0
  166. package/lib/js-estimateMaxSpendable.js.map +1 -0
  167. package/lib/js-getTransactionStatus.d.ts +5 -0
  168. package/lib/js-getTransactionStatus.d.ts.map +1 -0
  169. package/lib/js-getTransactionStatus.js +71 -0
  170. package/lib/js-getTransactionStatus.js.map +1 -0
  171. package/lib/js-preload-data.d.ts +7 -0
  172. package/lib/js-preload-data.d.ts.map +1 -0
  173. package/lib/js-preload-data.js +45 -0
  174. package/lib/js-preload-data.js.map +1 -0
  175. package/lib/js-preload.d.ts +7 -0
  176. package/lib/js-preload.d.ts.map +1 -0
  177. package/lib/js-preload.js +67 -0
  178. package/lib/js-preload.js.map +1 -0
  179. package/lib/js-preload.test.d.ts +2 -0
  180. package/lib/js-preload.test.d.ts.map +1 -0
  181. package/lib/js-preload.test.js +9 -0
  182. package/lib/js-preload.test.js.map +1 -0
  183. package/lib/js-prepareTransaction.d.ts +5 -0
  184. package/lib/js-prepareTransaction.d.ts.map +1 -0
  185. package/lib/js-prepareTransaction.js +500 -0
  186. package/lib/js-prepareTransaction.js.map +1 -0
  187. package/lib/js-signOperation.d.ts +7 -0
  188. package/lib/js-signOperation.d.ts.map +1 -0
  189. package/lib/js-signOperation.js +153 -0
  190. package/lib/js-signOperation.js.map +1 -0
  191. package/lib/js-synchronization.d.ts +5 -0
  192. package/lib/js-synchronization.d.ts.map +1 -0
  193. package/lib/js-synchronization.js +464 -0
  194. package/lib/js-synchronization.js.map +1 -0
  195. package/lib/logic.d.ts +29 -0
  196. package/lib/logic.d.ts.map +1 -0
  197. package/lib/logic.js +102 -0
  198. package/lib/logic.js.map +1 -0
  199. package/lib/serialization.d.ts +9 -0
  200. package/lib/serialization.d.ts.map +1 -0
  201. package/lib/serialization.js +69 -0
  202. package/lib/serialization.js.map +1 -0
  203. package/lib/signer.d.ts +11 -0
  204. package/lib/signer.d.ts.map +1 -0
  205. package/lib/signer.js +3 -0
  206. package/lib/signer.js.map +1 -0
  207. package/lib/specs.d.ts +7 -0
  208. package/lib/specs.d.ts.map +1 -0
  209. package/lib/specs.js +409 -0
  210. package/lib/specs.js.map +1 -0
  211. package/lib/speculos-deviceActions.d.ts +8 -0
  212. package/lib/speculos-deviceActions.d.ts.map +1 -0
  213. package/lib/speculos-deviceActions.js +217 -0
  214. package/lib/speculos-deviceActions.js.map +1 -0
  215. package/lib/transaction.d.ts +15 -0
  216. package/lib/transaction.d.ts.map +1 -0
  217. package/lib/transaction.js +153 -0
  218. package/lib/transaction.js.map +1 -0
  219. package/lib/tx-fees.d.ts +4 -0
  220. package/lib/tx-fees.d.ts.map +1 -0
  221. package/lib/tx-fees.js +167 -0
  222. package/lib/tx-fees.js.map +1 -0
  223. package/lib/types.d.ts +222 -0
  224. package/lib/types.d.ts.map +1 -0
  225. package/lib/types.js +3 -0
  226. package/lib/types.js.map +1 -0
  227. package/lib/utils.d.ts +24 -0
  228. package/lib/utils.d.ts.map +1 -0
  229. package/lib/utils.js +172 -0
  230. package/lib/utils.js.map +1 -0
  231. package/lib/validator-app/index.d.ts +22 -0
  232. package/lib/validator-app/index.d.ts.map +1 -0
  233. package/lib/validator-app/index.js +62 -0
  234. package/lib/validator-app/index.js.map +1 -0
  235. package/lib-es/api/cached.d.ts +3 -0
  236. package/lib-es/api/cached.d.ts.map +1 -0
  237. package/lib-es/api/cached.js +33 -0
  238. package/lib-es/api/cached.js.map +1 -0
  239. package/lib-es/api/chain/account/index.d.ts +2 -0
  240. package/lib-es/api/chain/account/index.d.ts.map +1 -0
  241. package/lib-es/api/chain/account/index.js +2 -0
  242. package/lib-es/api/chain/account/index.js.map +1 -0
  243. package/lib-es/api/chain/account/parser.d.ts +10 -0
  244. package/lib-es/api/chain/account/parser.d.ts.map +1 -0
  245. package/lib-es/api/chain/account/parser.js +48 -0
  246. package/lib-es/api/chain/account/parser.js.map +1 -0
  247. package/lib-es/api/chain/account/stake.d.ts +237 -0
  248. package/lib-es/api/chain/account/stake.d.ts.map +1 -0
  249. package/lib-es/api/chain/account/stake.js +35 -0
  250. package/lib-es/api/chain/account/stake.js.map +1 -0
  251. package/lib-es/api/chain/account/token.d.ts +116 -0
  252. package/lib-es/api/chain/account/token.d.ts.map +1 -0
  253. package/lib-es/api/chain/account/token.js +39 -0
  254. package/lib-es/api/chain/account/token.js.map +1 -0
  255. package/lib-es/api/chain/account/vote.d.ts +252 -0
  256. package/lib-es/api/chain/account/vote.d.ts.map +1 -0
  257. package/lib-es/api/chain/account/vote.js +41 -0
  258. package/lib-es/api/chain/account/vote.js.map +1 -0
  259. package/lib-es/api/chain/index.d.ts +29 -0
  260. package/lib-es/api/chain/index.d.ts.map +1 -0
  261. package/lib-es/api/chain/index.js +95 -0
  262. package/lib-es/api/chain/index.js.map +1 -0
  263. package/lib-es/api/chain/instruction/associated-token-account/index.d.ts +15 -0
  264. package/lib-es/api/chain/instruction/associated-token-account/index.d.ts.map +1 -0
  265. package/lib-es/api/chain/instruction/associated-token-account/index.js +17 -0
  266. package/lib-es/api/chain/instruction/associated-token-account/index.js.map +1 -0
  267. package/lib-es/api/chain/instruction/associated-token-account/types.d.ts +30 -0
  268. package/lib-es/api/chain/instruction/associated-token-account/types.d.ts.map +1 -0
  269. package/lib-es/api/chain/instruction/associated-token-account/types.js +16 -0
  270. package/lib-es/api/chain/instruction/associated-token-account/types.js.map +1 -0
  271. package/lib-es/api/chain/instruction/memo/index.d.ts +15 -0
  272. package/lib-es/api/chain/instruction/memo/index.d.ts.map +1 -0
  273. package/lib-es/api/chain/instruction/memo/index.js +10 -0
  274. package/lib-es/api/chain/instruction/memo/index.js.map +1 -0
  275. package/lib-es/api/chain/instruction/memo/types.d.ts +21 -0
  276. package/lib-es/api/chain/instruction/memo/types.d.ts.map +1 -0
  277. package/lib-es/api/chain/instruction/memo/types.js +13 -0
  278. package/lib-es/api/chain/instruction/memo/types.js.map +1 -0
  279. package/lib-es/api/chain/instruction/stake/index.d.ts +15 -0
  280. package/lib-es/api/chain/instruction/stake/index.d.ts.map +1 -0
  281. package/lib-es/api/chain/instruction/stake/index.js +16 -0
  282. package/lib-es/api/chain/instruction/stake/index.js.map +1 -0
  283. package/lib-es/api/chain/instruction/stake/types.d.ts +215 -0
  284. package/lib-es/api/chain/instruction/stake/types.d.ts.map +1 -0
  285. package/lib-es/api/chain/instruction/stake/types.js +77 -0
  286. package/lib-es/api/chain/instruction/stake/types.js.map +1 -0
  287. package/lib-es/api/chain/instruction/system/index.d.ts +15 -0
  288. package/lib-es/api/chain/instruction/system/index.d.ts.map +1 -0
  289. package/lib-es/api/chain/instruction/system/index.js +16 -0
  290. package/lib-es/api/chain/instruction/system/index.js.map +1 -0
  291. package/lib-es/api/chain/instruction/system/types.d.ts +298 -0
  292. package/lib-es/api/chain/instruction/system/types.d.ts.map +1 -0
  293. package/lib-es/api/chain/instruction/system/types.js +114 -0
  294. package/lib-es/api/chain/instruction/system/types.js.map +1 -0
  295. package/lib-es/api/chain/instruction/token/index.d.ts +15 -0
  296. package/lib-es/api/chain/instruction/token/index.d.ts.map +1 -0
  297. package/lib-es/api/chain/instruction/token/index.js +16 -0
  298. package/lib-es/api/chain/instruction/token/index.js.map +1 -0
  299. package/lib-es/api/chain/instruction/token/types.d.ts +497 -0
  300. package/lib-es/api/chain/instruction/token/types.d.ts.map +1 -0
  301. package/lib-es/api/chain/instruction/token/types.js +197 -0
  302. package/lib-es/api/chain/instruction/token/types.js.map +1 -0
  303. package/lib-es/api/chain/program/constants.d.ts +11 -0
  304. package/lib-es/api/chain/program/constants.d.ts.map +1 -0
  305. package/lib-es/api/chain/program/constants.js +11 -0
  306. package/lib-es/api/chain/program/constants.js.map +1 -0
  307. package/lib-es/api/chain/program/index.d.ts +2 -0
  308. package/lib-es/api/chain/program/index.d.ts.map +1 -0
  309. package/lib-es/api/chain/program/index.js +2 -0
  310. package/lib-es/api/chain/program/index.js.map +1 -0
  311. package/lib-es/api/chain/program/parser.d.ts +35 -0
  312. package/lib-es/api/chain/program/parser.d.ts.map +1 -0
  313. package/lib-es/api/chain/program/parser.js +61 -0
  314. package/lib-es/api/chain/program/parser.js.map +1 -0
  315. package/lib-es/api/chain/validators/bignum.d.ts +3 -0
  316. package/lib-es/api/chain/validators/bignum.d.ts.map +1 -0
  317. package/lib-es/api/chain/validators/bignum.js +8 -0
  318. package/lib-es/api/chain/validators/bignum.js.map +1 -0
  319. package/lib-es/api/chain/validators/index.d.ts +10 -0
  320. package/lib-es/api/chain/validators/index.d.ts.map +1 -0
  321. package/lib-es/api/chain/validators/index.js +7 -0
  322. package/lib-es/api/chain/validators/index.js.map +1 -0
  323. package/lib-es/api/chain/validators/pubkey.d.ts +3 -0
  324. package/lib-es/api/chain/validators/pubkey.d.ts.map +1 -0
  325. package/lib-es/api/chain/validators/pubkey.js +4 -0
  326. package/lib-es/api/chain/validators/pubkey.js.map +1 -0
  327. package/lib-es/api/chain/web3.d.ts +43 -0
  328. package/lib-es/api/chain/web3.d.ts.map +1 -0
  329. package/lib-es/api/chain/web3.js +251 -0
  330. package/lib-es/api/chain/web3.js.map +1 -0
  331. package/lib-es/api/index.d.ts +5 -0
  332. package/lib-es/api/index.d.ts.map +1 -0
  333. package/lib-es/api/index.js +5 -0
  334. package/lib-es/api/index.js.map +1 -0
  335. package/lib-es/api/logged.d.ts +3 -0
  336. package/lib-es/api/logged.d.ts.map +1 -0
  337. package/lib-es/api/logged.js +65 -0
  338. package/lib-es/api/logged.js.map +1 -0
  339. package/lib-es/api/queued.d.ts +3 -0
  340. package/lib-es/api/queued.d.ts.map +1 -0
  341. package/lib-es/api/queued.js +23 -0
  342. package/lib-es/api/queued.js.map +1 -0
  343. package/lib-es/api/traced.d.ts +3 -0
  344. package/lib-es/api/traced.d.ts.map +1 -0
  345. package/lib-es/api/traced.js +76 -0
  346. package/lib-es/api/traced.js.map +1 -0
  347. package/lib-es/bridge/bridge.d.ts +15 -0
  348. package/lib-es/bridge/bridge.d.ts.map +1 -0
  349. package/lib-es/bridge/bridge.js +132 -0
  350. package/lib-es/bridge/bridge.js.map +1 -0
  351. package/lib-es/bridge/js.d.ts +7 -0
  352. package/lib-es/bridge/js.d.ts.map +1 -0
  353. package/lib-es/bridge/js.js +24 -0
  354. package/lib-es/bridge/js.js.map +1 -0
  355. package/lib-es/bridge.integration.test.d.ts +4 -0
  356. package/lib-es/bridge.integration.test.d.ts.map +1 -0
  357. package/lib-es/bridge.integration.test.js +988 -0
  358. package/lib-es/bridge.integration.test.js.map +1 -0
  359. package/lib-es/cli-transaction.d.ts +19 -0
  360. package/lib-es/cli-transaction.d.ts.map +1 -0
  361. package/lib-es/cli-transaction.js +190 -0
  362. package/lib-es/cli-transaction.js.map +1 -0
  363. package/lib-es/datasets/solana.scanAccounts.1.d.ts +6 -0
  364. package/lib-es/datasets/solana.scanAccounts.1.d.ts.map +1 -0
  365. package/lib-es/datasets/solana.scanAccounts.1.js +10 -0
  366. package/lib-es/datasets/solana.scanAccounts.1.js.map +1 -0
  367. package/lib-es/deviceTransactionConfig.d.ts +10 -0
  368. package/lib-es/deviceTransactionConfig.d.ts.map +1 -0
  369. package/lib-es/deviceTransactionConfig.js +223 -0
  370. package/lib-es/deviceTransactionConfig.js.map +1 -0
  371. package/lib-es/errors.d.ts +61 -0
  372. package/lib-es/errors.d.ts.map +1 -0
  373. package/lib-es/errors.js +22 -0
  374. package/lib-es/errors.js.map +1 -0
  375. package/lib-es/hw-getAddress.d.ts +6 -0
  376. package/lib-es/hw-getAddress.d.ts.map +1 -0
  377. package/lib-es/hw-getAddress.js +23 -0
  378. package/lib-es/hw-getAddress.js.map +1 -0
  379. package/lib-es/js-broadcast.d.ts +7 -0
  380. package/lib-es/js-broadcast.d.ts.map +1 -0
  381. package/lib-es/js-broadcast.js +33 -0
  382. package/lib-es/js-broadcast.js.map +1 -0
  383. package/lib-es/js-buildTransaction.d.ts +5 -0
  384. package/lib-es/js-buildTransaction.d.ts.map +1 -0
  385. package/lib-es/js-buildTransaction.js +63 -0
  386. package/lib-es/js-buildTransaction.js.map +1 -0
  387. package/lib-es/js-createTransaction.d.ts +5 -0
  388. package/lib-es/js-createTransaction.d.ts.map +1 -0
  389. package/lib-es/js-createTransaction.js +17 -0
  390. package/lib-es/js-createTransaction.js.map +1 -0
  391. package/lib-es/js-estimateMaxSpendable.d.ts +11 -0
  392. package/lib-es/js-estimateMaxSpendable.d.ts.map +1 -0
  393. package/lib-es/js-estimateMaxSpendable.js +55 -0
  394. package/lib-es/js-estimateMaxSpendable.js.map +1 -0
  395. package/lib-es/js-getTransactionStatus.d.ts +5 -0
  396. package/lib-es/js-getTransactionStatus.d.ts.map +1 -0
  397. package/lib-es/js-getTransactionStatus.js +69 -0
  398. package/lib-es/js-getTransactionStatus.js.map +1 -0
  399. package/lib-es/js-preload-data.d.ts +7 -0
  400. package/lib-es/js-preload-data.d.ts.map +1 -0
  401. package/lib-es/js-preload-data.js +39 -0
  402. package/lib-es/js-preload-data.js.map +1 -0
  403. package/lib-es/js-preload.d.ts +7 -0
  404. package/lib-es/js-preload.d.ts.map +1 -0
  405. package/lib-es/js-preload.js +62 -0
  406. package/lib-es/js-preload.js.map +1 -0
  407. package/lib-es/js-preload.test.d.ts +2 -0
  408. package/lib-es/js-preload.test.d.ts.map +1 -0
  409. package/lib-es/js-preload.test.js +7 -0
  410. package/lib-es/js-preload.test.js.map +1 -0
  411. package/lib-es/js-prepareTransaction.d.ts +5 -0
  412. package/lib-es/js-prepareTransaction.d.ts.map +1 -0
  413. package/lib-es/js-prepareTransaction.js +497 -0
  414. package/lib-es/js-prepareTransaction.js.map +1 -0
  415. package/lib-es/js-signOperation.d.ts +7 -0
  416. package/lib-es/js-signOperation.d.ts.map +1 -0
  417. package/lib-es/js-signOperation.js +146 -0
  418. package/lib-es/js-signOperation.js.map +1 -0
  419. package/lib-es/js-synchronization.d.ts +5 -0
  420. package/lib-es/js-synchronization.d.ts.map +1 -0
  421. package/lib-es/js-synchronization.js +457 -0
  422. package/lib-es/js-synchronization.js.map +1 -0
  423. package/lib-es/logic.d.ts +29 -0
  424. package/lib-es/logic.d.ts.map +1 -0
  425. package/lib-es/logic.js +87 -0
  426. package/lib-es/logic.js.map +1 -0
  427. package/lib-es/serialization.d.ts +9 -0
  428. package/lib-es/serialization.d.ts.map +1 -0
  429. package/lib-es/serialization.js +60 -0
  430. package/lib-es/serialization.js.map +1 -0
  431. package/lib-es/signer.d.ts +11 -0
  432. package/lib-es/signer.d.ts.map +1 -0
  433. package/lib-es/signer.js +2 -0
  434. package/lib-es/signer.js.map +1 -0
  435. package/lib-es/specs.d.ts +7 -0
  436. package/lib-es/specs.d.ts.map +1 -0
  437. package/lib-es/specs.js +404 -0
  438. package/lib-es/specs.js.map +1 -0
  439. package/lib-es/speculos-deviceActions.d.ts +8 -0
  440. package/lib-es/speculos-deviceActions.d.ts.map +1 -0
  441. package/lib-es/speculos-deviceActions.js +211 -0
  442. package/lib-es/speculos-deviceActions.js.map +1 -0
  443. package/lib-es/transaction.d.ts +15 -0
  444. package/lib-es/transaction.d.ts.map +1 -0
  445. package/lib-es/transaction.js +147 -0
  446. package/lib-es/transaction.js.map +1 -0
  447. package/lib-es/tx-fees.d.ts +4 -0
  448. package/lib-es/tx-fees.d.ts.map +1 -0
  449. package/lib-es/tx-fees.js +160 -0
  450. package/lib-es/tx-fees.js.map +1 -0
  451. package/lib-es/types.d.ts +222 -0
  452. package/lib-es/types.d.ts.map +1 -0
  453. package/lib-es/types.js +2 -0
  454. package/lib-es/types.js.map +1 -0
  455. package/lib-es/utils.d.ts +24 -0
  456. package/lib-es/utils.d.ts.map +1 -0
  457. package/lib-es/utils.js +157 -0
  458. package/lib-es/utils.js.map +1 -0
  459. package/lib-es/validator-app/index.d.ts +22 -0
  460. package/lib-es/validator-app/index.d.ts.map +1 -0
  461. package/lib-es/validator-app/index.js +55 -0
  462. package/lib-es/validator-app/index.js.map +1 -0
  463. package/package.json +89 -0
  464. package/src/api/cached.ts +87 -0
  465. package/src/api/chain/account/index.ts +1 -0
  466. package/src/api/chain/account/parser.ts +63 -0
  467. package/src/api/chain/account/stake.ts +45 -0
  468. package/src/api/chain/account/token.ts +63 -0
  469. package/src/api/chain/account/vote.ts +55 -0
  470. package/src/api/chain/index.ts +203 -0
  471. package/src/api/chain/instruction/associated-token-account/index.ts +33 -0
  472. package/src/api/chain/instruction/associated-token-account/types.ts +23 -0
  473. package/src/api/chain/instruction/memo/index.ts +24 -0
  474. package/src/api/chain/instruction/memo/types.ts +18 -0
  475. package/src/api/chain/instruction/stake/index.ts +29 -0
  476. package/src/api/chain/instruction/stake/types.ts +95 -0
  477. package/src/api/chain/instruction/system/index.ts +30 -0
  478. package/src/api/chain/instruction/system/types.ts +141 -0
  479. package/src/api/chain/instruction/token/index.ts +30 -0
  480. package/src/api/chain/instruction/token/types.ts +222 -0
  481. package/src/api/chain/program/constants.ts +10 -0
  482. package/src/api/chain/program/index.ts +1 -0
  483. package/src/api/chain/program/parser.ts +120 -0
  484. package/src/api/chain/validators/bignum.ts +7 -0
  485. package/src/api/chain/validators/index.ts +9 -0
  486. package/src/api/chain/validators/pubkey.ts +8 -0
  487. package/src/api/chain/web3.ts +399 -0
  488. package/src/api/index.ts +4 -0
  489. package/src/api/logged.ts +70 -0
  490. package/src/api/queued.ts +25 -0
  491. package/src/api/traced.ts +89 -0
  492. package/src/bridge/bridge.ts +195 -0
  493. package/src/bridge/js.ts +44 -0
  494. package/src/bridge.integration.test.ts +1106 -0
  495. package/src/cli-transaction.ts +246 -0
  496. package/src/datasets/solana.scanAccounts.1.ts +9 -0
  497. package/src/deviceTransactionConfig.ts +302 -0
  498. package/src/errors.ts +61 -0
  499. package/src/hw-getAddress.ts +26 -0
  500. package/src/js-broadcast.ts +38 -0
  501. package/src/js-buildTransaction.ts +81 -0
  502. package/src/js-createTransaction.ts +20 -0
  503. package/src/js-estimateMaxSpendable.ts +72 -0
  504. package/src/js-getTransactionStatus.ts +72 -0
  505. package/src/js-preload-data.ts +46 -0
  506. package/src/js-preload.test.ts +14 -0
  507. package/src/js-preload.ts +74 -0
  508. package/src/js-prepareTransaction.ts +686 -0
  509. package/src/js-signOperation.ts +329 -0
  510. package/src/js-synchronization.ts +729 -0
  511. package/src/logic.ts +123 -0
  512. package/src/serialization.ts +81 -0
  513. package/src/signer.ts +21 -0
  514. package/src/specs.ts +514 -0
  515. package/src/speculos-deviceActions.ts +229 -0
  516. package/src/transaction.ts +194 -0
  517. package/src/tx-fees.ts +206 -0
  518. package/src/types.ts +284 -0
  519. package/src/utils.ts +176 -0
  520. package/src/validator-app/index.ts +79 -0
  521. package/tsconfig.json +12 -0
@@ -0,0 +1,686 @@
1
+ import { getTokenById } from "@ledgerhq/cryptoassets";
2
+ import {
3
+ AmountRequired,
4
+ InvalidAddress,
5
+ InvalidAddressBecauseDestinationIsAlsoSource,
6
+ NotEnoughBalance,
7
+ RecipientRequired,
8
+ } from "@ledgerhq/errors";
9
+ import type { Account } from "@ledgerhq/types-live";
10
+ import { findSubAccountById } from "@ledgerhq/coin-framework/account/index";
11
+ import { ChainAPI } from "./api";
12
+ import {
13
+ getMaybeTokenAccount,
14
+ getMaybeVoteAccount,
15
+ getStakeAccountAddressWithSeed,
16
+ getStakeAccountMinimumBalanceForRentExemption,
17
+ } from "./api/chain/web3";
18
+ import {
19
+ SolanaAccountNotFunded,
20
+ SolanaAddressOffEd25519,
21
+ SolanaInvalidValidator,
22
+ SolanaMemoIsTooLong,
23
+ SolanaRecipientAssociatedTokenAccountWillBeFunded,
24
+ SolanaStakeAccountIsNotDelegatable,
25
+ SolanaStakeAccountIsNotUndelegatable,
26
+ SolanaStakeAccountNotFound,
27
+ SolanaStakeAccountNothingToWithdraw,
28
+ SolanaStakeAccountRequired,
29
+ SolanaStakeAccountValidatorIsUnchangeable,
30
+ SolanaStakeNoStakeAuth,
31
+ SolanaStakeNoWithdrawAuth,
32
+ SolanaTokenAccounNotInitialized,
33
+ SolanaTokenAccountHoldsAnotherToken,
34
+ SolanaTokenRecipientIsSenderATA,
35
+ SolanaValidatorRequired,
36
+ } from "./errors";
37
+ import {
38
+ decodeAccountIdWithTokenAccountAddress,
39
+ isEd25519Address,
40
+ isValidBase58Address,
41
+ MAX_MEMO_LENGTH,
42
+ } from "./logic";
43
+ import type {
44
+ CommandDescriptor,
45
+ SolanaAccount,
46
+ SolanaStake,
47
+ StakeCreateAccountTransaction,
48
+ StakeDelegateTransaction,
49
+ StakeSplitTransaction,
50
+ StakeUndelegateTransaction,
51
+ StakeWithdrawTransaction,
52
+ TokenCreateATATransaction,
53
+ TokenRecipientDescriptor,
54
+ TokenTransferTransaction,
55
+ Transaction,
56
+ TransactionModel,
57
+ TransferCommand,
58
+ TransferTransaction,
59
+ } from "./types";
60
+ import { assertUnreachable } from "./utils";
61
+ import { defaultUpdateTransaction } from "@ledgerhq/coin-framework/bridge/jsHelpers";
62
+ import { estimateFeeAndSpendable } from "./js-estimateMaxSpendable";
63
+
64
+ async function deriveCommandDescriptor(
65
+ mainAccount: SolanaAccount,
66
+ tx: Transaction,
67
+ api: ChainAPI,
68
+ ): Promise<CommandDescriptor> {
69
+ const { model } = tx;
70
+
71
+ switch (model.kind) {
72
+ case "transfer":
73
+ return deriveTransferCommandDescriptor(mainAccount, tx, model, api);
74
+ case "token.transfer":
75
+ return deriveTokenTransferCommandDescriptor(mainAccount, tx, model, api);
76
+ case "token.createATA":
77
+ return deriveCreateAssociatedTokenAccountCommandDescriptor(mainAccount, tx, model, api);
78
+ case "stake.createAccount":
79
+ return deriveStakeCreateAccountCommandDescriptor(mainAccount, tx, model, api);
80
+ case "stake.delegate":
81
+ return deriveStakeDelegateCommandDescriptor(mainAccount, tx, model, api);
82
+ case "stake.undelegate":
83
+ return deriveStakeUndelegateCommandDescriptor(mainAccount, tx, model, api);
84
+ case "stake.withdraw":
85
+ return deriveStakeWithdrawCommandDescriptor(mainAccount, tx, model, api);
86
+ case "stake.split":
87
+ return deriveStakeSplitCommandDescriptor(mainAccount, tx, model, api);
88
+ default:
89
+ return assertUnreachable(model);
90
+ }
91
+ }
92
+
93
+ const prepareTransaction = async (
94
+ mainAccount: SolanaAccount,
95
+ tx: Transaction,
96
+ api: ChainAPI,
97
+ ): Promise<Transaction> => {
98
+ const txToDeriveFrom = updateModelIfSubAccountIdPresent(tx);
99
+
100
+ const commandDescriptor = await deriveCommandDescriptor(mainAccount, txToDeriveFrom, api);
101
+
102
+ const model: TransactionModel = {
103
+ ...tx.model,
104
+ commandDescriptor,
105
+ };
106
+
107
+ const patch: Partial<Transaction> = {
108
+ model,
109
+ };
110
+
111
+ return defaultUpdateTransaction(tx, patch);
112
+ };
113
+
114
+ const deriveTokenTransferCommandDescriptor = async (
115
+ mainAccount: Account,
116
+ tx: Transaction,
117
+ model: TransactionModel & { kind: TokenTransferTransaction["kind"] },
118
+ api: ChainAPI,
119
+ ): Promise<CommandDescriptor> => {
120
+ const errors: Record<string, Error> = {};
121
+ const warnings: Record<string, Error> = {};
122
+
123
+ const subAccount = findSubAccountById(mainAccount, model.uiState.subAccountId);
124
+
125
+ if (!subAccount || subAccount.type !== "TokenAccount") {
126
+ throw new Error("subaccount not found");
127
+ }
128
+
129
+ await validateRecipientCommon(mainAccount, tx, errors, warnings, api);
130
+
131
+ const memo = model.uiState.memo;
132
+
133
+ if (typeof memo === "string" && memo.length > 0) {
134
+ validateMemoCommon(memo, errors);
135
+ }
136
+
137
+ const tokenIdParts = subAccount.token.id.split("/");
138
+ const mintAddress = tokenIdParts[tokenIdParts.length - 1];
139
+ const mintDecimals = subAccount.token.units[0].magnitude;
140
+
141
+ const senderAssociatedTokenAccountAddress = decodeAccountIdWithTokenAccountAddress(
142
+ subAccount.id,
143
+ ).address;
144
+
145
+ if (!errors.recipient && tx.recipient === senderAssociatedTokenAccountAddress) {
146
+ errors.recipient = new SolanaTokenRecipientIsSenderATA();
147
+ }
148
+
149
+ const defaultRecipientDescriptor: TokenRecipientDescriptor = {
150
+ shouldCreateAsAssociatedTokenAccount: false,
151
+ tokenAccAddress: "",
152
+ walletAddress: "",
153
+ };
154
+
155
+ const recipientDescriptorOrError = errors.recipient
156
+ ? defaultRecipientDescriptor
157
+ : await getTokenRecipient(tx.recipient, mintAddress, api);
158
+
159
+ if (!errors.recipient && recipientDescriptorOrError instanceof Error) {
160
+ errors.recipient = recipientDescriptorOrError;
161
+ }
162
+
163
+ const recipientDescriptor: TokenRecipientDescriptor =
164
+ recipientDescriptorOrError instanceof Error
165
+ ? defaultRecipientDescriptor
166
+ : recipientDescriptorOrError;
167
+
168
+ const assocAccRentExempt = recipientDescriptor.shouldCreateAsAssociatedTokenAccount
169
+ ? await api.getAssocTokenAccMinNativeBalance()
170
+ : 0;
171
+
172
+ if (recipientDescriptor.shouldCreateAsAssociatedTokenAccount) {
173
+ warnings.recipient = new SolanaRecipientAssociatedTokenAccountWillBeFunded();
174
+ }
175
+
176
+ const { fee, spendable: spendableSol } = await estimateFeeAndSpendable(api, mainAccount, tx);
177
+
178
+ if (spendableSol.lt(assocAccRentExempt)) {
179
+ errors.fee = new NotEnoughBalance();
180
+ }
181
+
182
+ if (!tx.useAllAmount && tx.amount.lte(0)) {
183
+ errors.amount = new AmountRequired();
184
+ }
185
+
186
+ const txAmount = tx.useAllAmount ? subAccount.spendableBalance.toNumber() : tx.amount.toNumber();
187
+
188
+ if (!errors.amount && txAmount > subAccount.spendableBalance.toNumber()) {
189
+ errors.amount = new NotEnoughBalance();
190
+ }
191
+
192
+ return {
193
+ command: {
194
+ kind: "token.transfer",
195
+ ownerAddress: mainAccount.freshAddress,
196
+ ownerAssociatedTokenAccountAddress: senderAssociatedTokenAccountAddress,
197
+ amount: txAmount,
198
+ mintAddress,
199
+ mintDecimals,
200
+ recipientDescriptor: recipientDescriptor,
201
+ memo: model.uiState.memo,
202
+ },
203
+ fee: fee + assocAccRentExempt,
204
+ warnings,
205
+ errors,
206
+ };
207
+ };
208
+
209
+ async function getTokenRecipient(
210
+ recipientAddress: string,
211
+ mintAddress: string,
212
+ api: ChainAPI,
213
+ ): Promise<TokenRecipientDescriptor | Error> {
214
+ const recipientTokenAccount = await getMaybeTokenAccount(recipientAddress, api);
215
+
216
+ if (recipientTokenAccount instanceof Error) {
217
+ throw recipientTokenAccount;
218
+ }
219
+
220
+ if (recipientTokenAccount === undefined) {
221
+ if (!isEd25519Address(recipientAddress)) {
222
+ return new SolanaAddressOffEd25519();
223
+ }
224
+
225
+ const recipientAssociatedTokenAccountAddress = await api.findAssocTokenAccAddress(
226
+ recipientAddress,
227
+ mintAddress,
228
+ );
229
+
230
+ const shouldCreateAsAssociatedTokenAccount = !(await isAccountFunded(
231
+ recipientAssociatedTokenAccountAddress,
232
+ api,
233
+ ));
234
+
235
+ return {
236
+ walletAddress: recipientAddress,
237
+ shouldCreateAsAssociatedTokenAccount,
238
+ tokenAccAddress: recipientAssociatedTokenAccountAddress,
239
+ };
240
+ } else {
241
+ if (recipientTokenAccount.mint.toBase58() !== mintAddress) {
242
+ return new SolanaTokenAccountHoldsAnotherToken();
243
+ }
244
+ if (recipientTokenAccount.state !== "initialized") {
245
+ return new SolanaTokenAccounNotInitialized();
246
+ }
247
+ }
248
+
249
+ return {
250
+ walletAddress: recipientTokenAccount.owner.toBase58(),
251
+ shouldCreateAsAssociatedTokenAccount: false,
252
+ tokenAccAddress: recipientAddress,
253
+ };
254
+ }
255
+
256
+ async function deriveCreateAssociatedTokenAccountCommandDescriptor(
257
+ mainAccount: Account,
258
+ tx: Transaction,
259
+ model: TransactionModel & { kind: TokenCreateATATransaction["kind"] },
260
+ api: ChainAPI,
261
+ ): Promise<CommandDescriptor> {
262
+ const errors: Record<string, Error> = {};
263
+
264
+ const token = getTokenById(model.uiState.tokenId);
265
+ const tokenIdParts = token.id.split("/");
266
+ const mint = tokenIdParts[tokenIdParts.length - 1];
267
+
268
+ const associatedTokenAccountAddress = await api.findAssocTokenAccAddress(
269
+ mainAccount.freshAddress,
270
+ mint,
271
+ );
272
+
273
+ const { fee } = await estimateFeeAndSpendable(api, mainAccount, tx);
274
+
275
+ if (mainAccount.spendableBalance.lt(fee)) {
276
+ errors.fee = new NotEnoughBalance();
277
+ }
278
+
279
+ return {
280
+ fee,
281
+ command: {
282
+ kind: model.kind,
283
+ mint: mint,
284
+ owner: mainAccount.freshAddress,
285
+ associatedTokenAccountAddress,
286
+ },
287
+ warnings: {},
288
+ errors,
289
+ };
290
+ }
291
+
292
+ async function deriveTransferCommandDescriptor(
293
+ mainAccount: Account,
294
+ tx: Transaction,
295
+ model: TransactionModel & { kind: TransferTransaction["kind"] },
296
+ api: ChainAPI,
297
+ ): Promise<CommandDescriptor> {
298
+ const errors: Record<string, Error> = {};
299
+ const warnings: Record<string, Error> = {};
300
+
301
+ await validateRecipientCommon(mainAccount, tx, errors, warnings, api);
302
+
303
+ const memo = model.uiState.memo;
304
+
305
+ if (typeof memo === "string" && memo.length > 0) {
306
+ validateMemoCommon(memo, errors);
307
+ }
308
+
309
+ const { fee, spendable } = await estimateFeeAndSpendable(api, mainAccount, tx);
310
+ const txAmount = tx.useAllAmount ? spendable : tx.amount;
311
+
312
+ if (tx.useAllAmount) {
313
+ if (txAmount.eq(0)) {
314
+ errors.amount = new NotEnoughBalance();
315
+ }
316
+ } else {
317
+ if (txAmount.lte(0)) {
318
+ errors.amount = new AmountRequired();
319
+ } else if (txAmount.gt(spendable)) {
320
+ errors.amount = new NotEnoughBalance();
321
+ }
322
+ }
323
+
324
+ const command: TransferCommand = {
325
+ kind: "transfer",
326
+ amount: txAmount.toNumber(),
327
+ sender: mainAccount.freshAddress,
328
+ recipient: tx.recipient,
329
+ memo: model.uiState.memo,
330
+ };
331
+
332
+ return {
333
+ command,
334
+ fee,
335
+ warnings,
336
+ errors,
337
+ };
338
+ }
339
+
340
+ async function deriveStakeCreateAccountCommandDescriptor(
341
+ mainAccount: Account,
342
+ tx: Transaction,
343
+ model: TransactionModel & { kind: StakeCreateAccountTransaction["kind"] },
344
+ api: ChainAPI,
345
+ ): Promise<CommandDescriptor> {
346
+ const errors: Record<string, Error> = {};
347
+ const warnings: Record<string, Error> = {};
348
+
349
+ const { fee, spendable } = await estimateFeeAndSpendable(api, mainAccount, tx);
350
+ const txAmount = tx.useAllAmount ? spendable : tx.amount;
351
+
352
+ if (tx.useAllAmount) {
353
+ if (txAmount.eq(0)) {
354
+ errors.amount = new NotEnoughBalance();
355
+ }
356
+ } else {
357
+ if (txAmount.lte(0)) {
358
+ errors.amount = new AmountRequired();
359
+ } else if (txAmount.gt(spendable)) {
360
+ errors.amount = new NotEnoughBalance();
361
+ }
362
+ }
363
+
364
+ const {
365
+ uiState: { delegate },
366
+ } = model;
367
+
368
+ await validateValidatorCommon(delegate.voteAccAddress, errors, api);
369
+
370
+ const stakeAccAddressSeed = `stake:${Math.random().toString()}`;
371
+ const stakeAccAddress = await getStakeAccountAddressWithSeed({
372
+ fromAddress: mainAccount.freshAddress,
373
+ seed: stakeAccAddressSeed,
374
+ });
375
+ const stakeAccRentExemptAmount = await getStakeAccountMinimumBalanceForRentExemption(api);
376
+
377
+ return {
378
+ command: {
379
+ kind: "stake.createAccount",
380
+ amount: txAmount.toNumber(),
381
+ stakeAccRentExemptAmount,
382
+ fromAccAddress: mainAccount.freshAddress,
383
+ stakeAccAddress,
384
+ delegate,
385
+ seed: stakeAccAddressSeed,
386
+ },
387
+ fee,
388
+ warnings,
389
+ errors,
390
+ };
391
+ }
392
+
393
+ async function deriveStakeDelegateCommandDescriptor(
394
+ mainAccount: SolanaAccount,
395
+ tx: Transaction,
396
+ model: TransactionModel & { kind: StakeDelegateTransaction["kind"] },
397
+ api: ChainAPI,
398
+ ): Promise<CommandDescriptor> {
399
+ const errors: Record<string, Error> = {};
400
+
401
+ const { uiState } = model;
402
+
403
+ const stake = validateAndTryGetStakeAccount(mainAccount, uiState.stakeAccAddr, errors);
404
+
405
+ if (stake !== undefined && !stake.hasStakeAuth && !stake.hasWithdrawAuth) {
406
+ errors.stakeAccAddr = new SolanaStakeNoStakeAuth();
407
+ }
408
+
409
+ await validateValidatorCommon(uiState.voteAccAddr, errors, api);
410
+
411
+ if (!errors.voteAccAddr && stake !== undefined) {
412
+ switch (stake.activation.state) {
413
+ case "active":
414
+ case "activating":
415
+ errors.stakeAccAddr = new SolanaStakeAccountIsNotDelegatable();
416
+ break;
417
+ case "inactive":
418
+ break;
419
+ case "deactivating":
420
+ if (stake.delegation?.voteAccAddr !== uiState.voteAccAddr) {
421
+ errors.stakeAccAddr = new SolanaStakeAccountValidatorIsUnchangeable();
422
+ }
423
+ break;
424
+ default:
425
+ return assertUnreachable(stake.activation.state);
426
+ }
427
+ }
428
+
429
+ const { fee } = await estimateFeeAndSpendable(api, mainAccount, tx);
430
+
431
+ if (mainAccount.spendableBalance.lt(fee)) {
432
+ errors.fee = new NotEnoughBalance();
433
+ }
434
+
435
+ return {
436
+ command: {
437
+ kind: "stake.delegate",
438
+ authorizedAccAddr: mainAccount.freshAddress,
439
+ stakeAccAddr: uiState.stakeAccAddr,
440
+ voteAccAddr: uiState.voteAccAddr,
441
+ },
442
+ fee,
443
+ warnings: {},
444
+ errors,
445
+ };
446
+ }
447
+
448
+ async function deriveStakeUndelegateCommandDescriptor(
449
+ mainAccount: SolanaAccount,
450
+ tx: Transaction,
451
+ model: TransactionModel & { kind: StakeUndelegateTransaction["kind"] },
452
+ api: ChainAPI,
453
+ ): Promise<CommandDescriptor> {
454
+ const errors: Record<string, Error> = {};
455
+
456
+ const { uiState } = model;
457
+
458
+ const stake = validateAndTryGetStakeAccount(mainAccount, uiState.stakeAccAddr, errors);
459
+
460
+ if (stake !== undefined) {
461
+ switch (stake.activation.state) {
462
+ case "active":
463
+ case "activating":
464
+ break;
465
+ case "inactive":
466
+ case "deactivating":
467
+ errors.stakeAccAddr = new SolanaStakeAccountIsNotUndelegatable();
468
+ break;
469
+ default:
470
+ return assertUnreachable(stake.activation.state);
471
+ }
472
+
473
+ if (!errors.stakeAccAddr && !stake.hasStakeAuth && !stake.hasWithdrawAuth) {
474
+ errors.stakeAccAddr = new SolanaStakeNoStakeAuth();
475
+ }
476
+ }
477
+
478
+ const { fee } = await estimateFeeAndSpendable(api, mainAccount, tx);
479
+ if (mainAccount.solanaResources.unstakeReserve.lt(fee)) {
480
+ errors.fee = new NotEnoughBalance();
481
+ }
482
+
483
+ return {
484
+ command: {
485
+ kind: "stake.undelegate",
486
+ authorizedAccAddr: mainAccount.freshAddress,
487
+ stakeAccAddr: uiState.stakeAccAddr,
488
+ },
489
+ fee,
490
+ warnings: {},
491
+ errors,
492
+ };
493
+ }
494
+
495
+ async function deriveStakeWithdrawCommandDescriptor(
496
+ mainAccount: SolanaAccount,
497
+ tx: Transaction,
498
+ model: TransactionModel & { kind: StakeWithdrawTransaction["kind"] },
499
+ api: ChainAPI,
500
+ ): Promise<CommandDescriptor> {
501
+ const errors: Record<string, Error> = {};
502
+ const { uiState } = model;
503
+
504
+ const stake = validateAndTryGetStakeAccount(mainAccount, uiState.stakeAccAddr, errors);
505
+
506
+ if (!errors.stakeAccAddr && stake !== undefined) {
507
+ if (!stake.hasWithdrawAuth) {
508
+ errors.stakeAccAddr = new SolanaStakeNoWithdrawAuth();
509
+ } else if (stake.withdrawable <= 0) {
510
+ errors.stakeAccAddr = new SolanaStakeAccountNothingToWithdraw();
511
+ }
512
+ }
513
+
514
+ const { fee } = await estimateFeeAndSpendable(api, mainAccount, tx);
515
+ if (mainAccount.solanaResources.unstakeReserve.lt(fee)) {
516
+ errors.fee = new NotEnoughBalance();
517
+ }
518
+
519
+ return {
520
+ command: {
521
+ kind: "stake.withdraw",
522
+ authorizedAccAddr: mainAccount.freshAddress,
523
+ stakeAccAddr: uiState.stakeAccAddr,
524
+ amount: stake?.withdrawable ?? 0,
525
+ toAccAddr: mainAccount.freshAddress,
526
+ },
527
+ fee,
528
+ warnings: {},
529
+ errors,
530
+ };
531
+ }
532
+
533
+ async function deriveStakeSplitCommandDescriptor(
534
+ mainAccount: SolanaAccount,
535
+ tx: Transaction,
536
+ model: TransactionModel & { kind: StakeSplitTransaction["kind"] },
537
+ api: ChainAPI,
538
+ ): Promise<CommandDescriptor> {
539
+ const errors: Record<string, Error> = {};
540
+
541
+ // TODO: find stake account in the main acc when synced
542
+ const { uiState } = model;
543
+
544
+ // TODO: use all amount
545
+ if (tx.amount.lte(0)) {
546
+ errors.amount = new AmountRequired();
547
+ }
548
+ // TODO: else if amount > stake balance
549
+
550
+ if (!isValidBase58Address(uiState.stakeAccAddr)) {
551
+ errors.stakeAccAddr = new InvalidAddress("", {
552
+ currencyName: mainAccount.currency.name,
553
+ });
554
+ }
555
+
556
+ mainAccount.solanaResources?.stakes ?? [];
557
+
558
+ const commandFees = await getStakeAccountMinimumBalanceForRentExemption(api);
559
+
560
+ const splitStakeAccAddrSeed = `stake:${Math.random().toString()}`;
561
+ const splitStakeAccAddr = await getStakeAccountAddressWithSeed({
562
+ fromAddress: mainAccount.freshAddress,
563
+ seed: splitStakeAccAddrSeed,
564
+ });
565
+
566
+ return {
567
+ command: {
568
+ kind: "stake.split",
569
+ authorizedAccAddr: mainAccount.freshAddress,
570
+ stakeAccAddr: uiState.stakeAccAddr,
571
+ amount: tx.amount.toNumber(),
572
+ seed: splitStakeAccAddrSeed,
573
+ splitStakeAccAddr,
574
+ },
575
+ fee: commandFees,
576
+ warnings: {},
577
+ errors: {},
578
+ };
579
+ }
580
+
581
+ // if subaccountid present - it's a token transfer
582
+ function updateModelIfSubAccountIdPresent(tx: Transaction): Transaction {
583
+ if (tx.subAccountId) {
584
+ return {
585
+ ...tx,
586
+ model: {
587
+ kind: "token.transfer",
588
+ uiState: {
589
+ ...tx.model.uiState,
590
+ subAccountId: tx.subAccountId,
591
+ },
592
+ },
593
+ };
594
+ }
595
+
596
+ return tx;
597
+ }
598
+
599
+ async function isAccountFunded(address: string, api: ChainAPI): Promise<boolean> {
600
+ const balance = await api.getBalance(address);
601
+ return balance > 0;
602
+ }
603
+
604
+ async function validateRecipientCommon(
605
+ mainAccount: Account,
606
+ tx: Transaction,
607
+ errors: Record<string, Error>,
608
+ warnings: Record<string, Error>,
609
+ api: ChainAPI,
610
+ ) {
611
+ if (!tx.recipient) {
612
+ errors.recipient = new RecipientRequired();
613
+ } else if (mainAccount.freshAddress === tx.recipient) {
614
+ errors.recipient = new InvalidAddressBecauseDestinationIsAlsoSource();
615
+ } else if (!isValidBase58Address(tx.recipient)) {
616
+ errors.recipient = new InvalidAddress("", {
617
+ currencyName: mainAccount.currency.name,
618
+ });
619
+ } else {
620
+ const recipientWalletIsUnfunded = !(await isAccountFunded(tx.recipient, api));
621
+
622
+ if (recipientWalletIsUnfunded) {
623
+ warnings.recipient = new SolanaAccountNotFunded();
624
+ }
625
+ if (!isEd25519Address(tx.recipient)) {
626
+ warnings.recipientOffCurve = new SolanaAddressOffEd25519();
627
+ }
628
+ }
629
+ }
630
+
631
+ function validateMemoCommon(memo: string, errors: Record<string, Error>) {
632
+ const memoBytes = Buffer.from(memo, "utf-8");
633
+ if (memoBytes.byteLength > MAX_MEMO_LENGTH) {
634
+ errors.memo = errors.memo = new SolanaMemoIsTooLong(undefined, {
635
+ maxLength: MAX_MEMO_LENGTH,
636
+ });
637
+ // LLM expects <transaction> as error key to disable continue button
638
+ errors.transaction = errors.memo;
639
+ }
640
+ }
641
+
642
+ async function validateValidatorCommon(addr: string, errors: Record<string, Error>, api: ChainAPI) {
643
+ if (addr.length === 0) {
644
+ errors.voteAccAddr = new SolanaValidatorRequired();
645
+ } else if (!isValidBase58Address(addr)) {
646
+ errors.voteAccAddr = new InvalidAddress("", {
647
+ currencyName: "Solana",
648
+ });
649
+ } else {
650
+ const voteAcc = await getMaybeVoteAccount(addr, api);
651
+
652
+ if (voteAcc instanceof Error || voteAcc === undefined) {
653
+ errors.voteAccAddr = new SolanaInvalidValidator();
654
+ }
655
+ }
656
+ }
657
+
658
+ function validateAndTryGetStakeAccount(
659
+ account: SolanaAccount,
660
+ stakeAccAddr: string,
661
+ errors: Record<string, Error>,
662
+ ): SolanaStake | undefined {
663
+ if (stakeAccAddr.length === 0) {
664
+ errors.stakeAccAddr = new SolanaStakeAccountRequired();
665
+ } else if (!isValidBase58Address(stakeAccAddr)) {
666
+ errors.stakeAccAddr = new InvalidAddress("", {
667
+ currencyName: account.currency.name,
668
+ });
669
+ }
670
+
671
+ if (!errors.stakeAccAddr) {
672
+ const stake = account.solanaResources?.stakes.find(
673
+ stake => stake.stakeAccAddr === stakeAccAddr,
674
+ );
675
+
676
+ if (stake === undefined) {
677
+ errors.stakeAccAddr = new SolanaStakeAccountNotFound();
678
+ }
679
+
680
+ return stake;
681
+ }
682
+
683
+ return undefined;
684
+ }
685
+
686
+ export { prepareTransaction };