@subwallet/extension-base 1.2.31-0 → 1.2.33-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 (418) hide show
  1. package/background/KoniTypes.d.ts +78 -227
  2. package/background/KoniTypes.js +3 -40
  3. package/background/errors/SWError.d.ts +4 -7
  4. package/background/errors/SWError.js +4 -0
  5. package/background/errors/TransactionError.d.ts +2 -2
  6. package/background/errors/TransactionError.js +2 -4
  7. package/background/handlers/State.d.ts +0 -12
  8. package/background/types.d.ts +9 -134
  9. package/background/warnings/TransactionWarning.d.ts +1 -1
  10. package/background/warnings/TransactionWarning.js +5 -1
  11. package/cjs/background/KoniTypes.js +4 -44
  12. package/cjs/background/errors/SWError.js +4 -0
  13. package/cjs/background/errors/TransactionError.js +13 -15
  14. package/cjs/background/warnings/TransactionWarning.js +6 -2
  15. package/cjs/constants/environment.js +13 -0
  16. package/cjs/constants/index.js +40 -13
  17. package/cjs/constants/signing.js +23 -0
  18. package/cjs/constants/storage.js +4 -2
  19. package/cjs/core/consts.js +20 -0
  20. package/cjs/core/logic-validation/recipientAddress.js +106 -0
  21. package/cjs/core/logic-validation/request.js +11 -19
  22. package/cjs/core/logic-validation/swap.js +5 -5
  23. package/cjs/core/logic-validation/transfer.js +83 -42
  24. package/cjs/core/types.js +26 -0
  25. package/cjs/core/utils.js +113 -0
  26. package/cjs/koni/api/dotsama/crowdloan.js +1 -1
  27. package/cjs/koni/api/nft/index.js +14 -5
  28. package/cjs/koni/api/staking/bonding/paraChain.js +8 -8
  29. package/cjs/koni/api/staking/bonding/relayChain.js +9 -9
  30. package/cjs/koni/api/staking/index.js +4 -1
  31. package/cjs/koni/background/cron.js +7 -7
  32. package/cjs/koni/background/handlers/Extension.js +510 -1446
  33. package/cjs/koni/background/handlers/State.js +61 -238
  34. package/cjs/koni/background/handlers/Tabs.js +143 -107
  35. package/cjs/koni/background/subscription.js +5 -5
  36. package/cjs/packageInfo.js +1 -1
  37. package/cjs/page/Accounts.js +2 -5
  38. package/cjs/page/SubWalleEvmProvider.js +1 -1
  39. package/cjs/page/index.js +2 -1
  40. package/cjs/services/balance-service/BalanceMapImpl.js +48 -20
  41. package/cjs/services/balance-service/helpers/subscribe/index.js +27 -15
  42. package/cjs/services/balance-service/helpers/subscribe/ton/consts.js +40 -0
  43. package/cjs/services/balance-service/helpers/subscribe/ton/ton.js +120 -0
  44. package/cjs/services/balance-service/helpers/subscribe/ton/utils.js +181 -0
  45. package/cjs/services/balance-service/index.js +25 -13
  46. package/cjs/services/balance-service/transfer/token.js +41 -24
  47. package/cjs/services/balance-service/transfer/ton-transfer.js +136 -0
  48. package/cjs/services/buy-service/index.js +5 -1
  49. package/cjs/services/chain-service/constants.js +1 -1
  50. package/cjs/services/chain-service/handler/SubstrateApi.js +1 -0
  51. package/cjs/services/chain-service/handler/TonApi.js +213 -0
  52. package/cjs/services/chain-service/handler/TonChainHandler.js +81 -0
  53. package/cjs/services/chain-service/index.js +32 -8
  54. package/cjs/services/chain-service/utils/index.js +78 -22
  55. package/cjs/services/earning-service/constants/chains.js +3 -1
  56. package/cjs/services/earning-service/handlers/base.js +2 -1
  57. package/cjs/services/earning-service/handlers/lending/base.js +8 -9
  58. package/cjs/services/earning-service/handlers/lending/interlay.js +1 -1
  59. package/cjs/services/earning-service/handlers/liquid-staking/base.js +9 -10
  60. package/cjs/services/earning-service/handlers/liquid-staking/stella-swap.js +1 -1
  61. package/cjs/services/earning-service/handlers/native-staking/amplitude.js +1 -1
  62. package/cjs/services/earning-service/handlers/native-staking/astar.js +2 -2
  63. package/cjs/services/earning-service/handlers/native-staking/base-para.js +13 -13
  64. package/cjs/services/earning-service/handlers/native-staking/base.js +2 -2
  65. package/cjs/services/earning-service/handlers/native-staking/para-chain.js +2 -2
  66. package/cjs/services/earning-service/handlers/native-staking/relay-chain.js +15 -15
  67. package/cjs/services/earning-service/handlers/nomination-pool/index.js +14 -14
  68. package/cjs/services/earning-service/handlers/special.js +10 -10
  69. package/cjs/services/earning-service/service.js +26 -17
  70. package/cjs/services/history-service/helpers/subscan-extrinsic-parser-helper.js +1 -1
  71. package/cjs/services/history-service/index.js +29 -11
  72. package/cjs/services/history-service/subscan-history.js +9 -21
  73. package/cjs/services/keyring-service/context/account-context.js +259 -0
  74. package/cjs/services/keyring-service/context/handlers/Base.js +20 -0
  75. package/cjs/services/keyring-service/context/handlers/Derive.js +377 -0
  76. package/cjs/services/keyring-service/context/handlers/Inject.js +75 -0
  77. package/cjs/services/keyring-service/context/handlers/Json.js +348 -0
  78. package/cjs/services/keyring-service/context/handlers/Ledger.js +165 -0
  79. package/cjs/services/keyring-service/context/handlers/Mnemonic.js +218 -0
  80. package/cjs/services/keyring-service/context/handlers/Modify.js +258 -0
  81. package/cjs/services/keyring-service/context/handlers/Secret.js +310 -0
  82. package/cjs/services/keyring-service/context/handlers/index.js +82 -0
  83. package/cjs/services/keyring-service/context/state.js +649 -0
  84. package/cjs/services/keyring-service/context/stores/AccountProxy.js +32 -0
  85. package/cjs/services/keyring-service/context/stores/Base.js +37 -0
  86. package/cjs/services/keyring-service/context/stores/CurrentAccount.js +28 -0
  87. package/cjs/services/keyring-service/context/stores/ModifyPair.js +19 -0
  88. package/cjs/services/keyring-service/context/stores/index.js +38 -0
  89. package/cjs/services/keyring-service/index.js +20 -164
  90. package/cjs/services/migration-service/scripts/index.js +6 -4
  91. package/cjs/services/migration-service/scripts/{MigrateLedgerAccountV2.js → keyring/MigrateLedgerAccountV2.js} +1 -1
  92. package/cjs/services/migration-service/scripts/keyring/MigratePairData.js +28 -0
  93. package/cjs/services/migration-service/scripts/{MigrateRemoveGenesisHash.js → keyring/MigrateRemoveGenesisHash.js} +1 -1
  94. package/cjs/services/request-service/constants.js +5 -3
  95. package/cjs/services/request-service/handler/AuthRequestHandler.js +104 -57
  96. package/cjs/services/request-service/handler/EvmRequestHandler.js +3 -4
  97. package/cjs/services/request-service/handler/SubstrateRequestHandler.js +5 -11
  98. package/cjs/services/request-service/handler/TonRequestHandler.js +175 -0
  99. package/cjs/services/request-service/index.js +24 -5
  100. package/cjs/services/swap-service/handler/asset-hub/handler.js +6 -5
  101. package/cjs/services/swap-service/handler/base-handler.js +8 -8
  102. package/cjs/services/swap-service/handler/chainflip-handler.js +5 -4
  103. package/cjs/services/swap-service/handler/hydradx-handler.js +4 -3
  104. package/cjs/services/swap-service/index.js +4 -4
  105. package/cjs/services/transaction-service/helpers/index.js +6 -1
  106. package/cjs/services/transaction-service/index.js +184 -84
  107. package/cjs/services/wallet-connect-service/handler/PolkadotRequestHandler.js +2 -10
  108. package/cjs/stores/AccountProxyStore.js +18 -0
  109. package/cjs/stores/ModifyPairStore.js +18 -0
  110. package/cjs/stores/index.js +23 -2
  111. package/cjs/types/account/action/add/index.js +38 -0
  112. package/cjs/types/account/action/add/json.js +1 -0
  113. package/cjs/types/account/action/add/mnemonic.js +1 -0
  114. package/cjs/types/account/action/add/secret.js +1 -0
  115. package/cjs/types/account/action/derive.js +1 -0
  116. package/cjs/types/account/action/edit.js +1 -0
  117. package/cjs/types/account/action/export.js +1 -0
  118. package/cjs/types/account/action/index.js +71 -0
  119. package/cjs/types/account/action/subscribe.js +16 -0
  120. package/cjs/types/account/action/validate.js +1 -0
  121. package/cjs/types/account/error/common.js +40 -0
  122. package/cjs/types/account/error/derive.js +55 -0
  123. package/cjs/types/account/error/index.js +27 -0
  124. package/cjs/types/account/index.js +38 -0
  125. package/cjs/types/account/info/current.js +1 -0
  126. package/cjs/types/account/info/index.js +38 -0
  127. package/cjs/types/account/info/keyring.js +90 -0
  128. package/cjs/types/account/info/proxy.js +49 -0
  129. package/cjs/types/error.js +1 -0
  130. package/cjs/types/index.js +44 -0
  131. package/cjs/types/transaction/data.js +1 -0
  132. package/cjs/types/transaction/error.js +53 -0
  133. package/cjs/types/transaction/index.js +49 -0
  134. package/cjs/types/transaction/request.js +1 -0
  135. package/cjs/types/transaction/warning.js +14 -0
  136. package/cjs/types/yield/actions/join/validate.js +1 -16
  137. package/cjs/utils/account/analyze.js +166 -0
  138. package/cjs/utils/account/common.js +121 -0
  139. package/cjs/utils/account/derive/index.js +27 -0
  140. package/cjs/utils/account/derive/info/index.js +27 -0
  141. package/cjs/utils/account/derive/info/solo.js +246 -0
  142. package/cjs/utils/account/derive/info/unified.js +112 -0
  143. package/cjs/utils/account/derive/validate.js +177 -0
  144. package/cjs/utils/account/index.js +49 -0
  145. package/cjs/utils/account/transform.js +566 -0
  146. package/cjs/utils/auth.js +46 -0
  147. package/cjs/utils/getId.js +8 -1
  148. package/cjs/utils/index.js +48 -62
  149. package/constants/environment.d.ts +1 -0
  150. package/constants/environment.js +6 -0
  151. package/constants/index.d.ts +5 -1
  152. package/constants/index.js +5 -2
  153. package/constants/signing.d.ts +4 -0
  154. package/constants/signing.js +15 -0
  155. package/constants/storage.d.ts +1 -0
  156. package/constants/storage.js +2 -1
  157. package/core/consts.d.ts +1 -0
  158. package/core/consts.js +13 -0
  159. package/core/logic-validation/recipientAddress.d.ts +2 -0
  160. package/core/logic-validation/recipientAddress.js +100 -0
  161. package/core/logic-validation/request.js +10 -18
  162. package/core/logic-validation/swap.js +1 -1
  163. package/core/logic-validation/transfer.d.ts +3 -2
  164. package/core/logic-validation/transfer.js +50 -10
  165. package/core/types.d.ts +26 -0
  166. package/core/types.js +19 -0
  167. package/core/utils.d.ts +10 -0
  168. package/core/utils.js +105 -0
  169. package/koni/api/dotsama/crowdloan.js +1 -1
  170. package/koni/api/nft/index.js +14 -5
  171. package/koni/api/staking/bonding/paraChain.js +2 -2
  172. package/koni/api/staking/bonding/relayChain.js +2 -2
  173. package/koni/api/staking/index.js +4 -1
  174. package/koni/background/cron.js +7 -7
  175. package/koni/background/handlers/Extension.d.ts +26 -35
  176. package/koni/background/handlers/Extension.js +337 -1242
  177. package/koni/background/handlers/State.d.ts +12 -19
  178. package/koni/background/handlers/State.js +57 -231
  179. package/koni/background/handlers/Tabs.d.ts +2 -3
  180. package/koni/background/handlers/Tabs.js +105 -61
  181. package/koni/background/subscription.js +5 -5
  182. package/package.json +352 -53
  183. package/packageInfo.js +1 -1
  184. package/page/Accounts.js +2 -5
  185. package/page/SubWalleEvmProvider.js +1 -1
  186. package/page/index.js +2 -1
  187. package/services/balance-service/BalanceMapImpl.d.ts +6 -4
  188. package/services/balance-service/BalanceMapImpl.js +44 -18
  189. package/services/balance-service/helpers/subscribe/index.d.ts +3 -4
  190. package/services/balance-service/helpers/subscribe/index.js +29 -17
  191. package/services/balance-service/helpers/subscribe/ton/consts.d.ts +18 -0
  192. package/services/balance-service/helpers/subscribe/ton/consts.js +28 -0
  193. package/services/balance-service/helpers/subscribe/ton/ton.d.ts +3 -0
  194. package/services/balance-service/helpers/subscribe/ton/ton.js +111 -0
  195. package/services/balance-service/helpers/subscribe/ton/types.d.ts +26 -0
  196. package/services/balance-service/helpers/subscribe/ton/utils.d.ts +32 -0
  197. package/services/balance-service/helpers/subscribe/ton/utils.js +159 -0
  198. package/services/balance-service/index.js +25 -13
  199. package/services/balance-service/transfer/token.d.ts +2 -2
  200. package/services/balance-service/transfer/token.js +18 -1
  201. package/services/balance-service/transfer/ton-transfer.d.ts +25 -0
  202. package/services/balance-service/transfer/ton-transfer.js +127 -0
  203. package/services/buy-service/index.js +5 -1
  204. package/services/buy-service/types.d.ts +2 -2
  205. package/services/chain-service/constants.js +1 -1
  206. package/services/chain-service/handler/SubstrateApi.js +1 -0
  207. package/services/chain-service/handler/TonApi.d.ts +52 -0
  208. package/services/chain-service/handler/TonApi.js +204 -0
  209. package/services/chain-service/handler/TonChainHandler.d.ts +17 -0
  210. package/services/chain-service/handler/TonChainHandler.js +73 -0
  211. package/services/chain-service/index.d.ts +5 -1
  212. package/services/chain-service/index.js +32 -8
  213. package/services/chain-service/types.d.ts +24 -0
  214. package/services/chain-service/utils/index.d.ts +10 -2
  215. package/services/chain-service/utils/index.js +59 -18
  216. package/services/earning-service/constants/chains.d.ts +1 -0
  217. package/services/earning-service/constants/chains.js +1 -0
  218. package/services/earning-service/handlers/base.js +3 -2
  219. package/services/earning-service/handlers/lending/base.js +1 -2
  220. package/services/earning-service/handlers/lending/interlay.js +2 -2
  221. package/services/earning-service/handlers/liquid-staking/base.js +1 -2
  222. package/services/earning-service/handlers/liquid-staking/stella-swap.js +2 -2
  223. package/services/earning-service/handlers/native-staking/amplitude.js +2 -2
  224. package/services/earning-service/handlers/native-staking/astar.js +2 -2
  225. package/services/earning-service/handlers/native-staking/base-para.js +2 -2
  226. package/services/earning-service/handlers/native-staking/base.js +2 -2
  227. package/services/earning-service/handlers/native-staking/para-chain.js +2 -2
  228. package/services/earning-service/handlers/native-staking/relay-chain.js +2 -2
  229. package/services/earning-service/handlers/nomination-pool/index.js +2 -2
  230. package/services/earning-service/handlers/special.js +2 -2
  231. package/services/earning-service/service.js +18 -9
  232. package/services/event-service/types.d.ts +3 -1
  233. package/services/history-service/helpers/subscan-extrinsic-parser-helper.js +1 -1
  234. package/services/history-service/index.d.ts +4 -1
  235. package/services/history-service/index.js +29 -11
  236. package/services/history-service/subscan-history.js +8 -20
  237. package/services/keyring-service/context/account-context.d.ts +87 -0
  238. package/services/keyring-service/context/account-context.js +250 -0
  239. package/services/keyring-service/context/handlers/Base.d.ts +11 -0
  240. package/services/keyring-service/context/handlers/Base.js +13 -0
  241. package/services/keyring-service/context/handlers/Derive.d.ts +29 -0
  242. package/services/keyring-service/context/handlers/Derive.js +365 -0
  243. package/services/keyring-service/context/handlers/Inject.d.ts +11 -0
  244. package/services/keyring-service/context/handlers/Inject.js +69 -0
  245. package/services/keyring-service/context/handlers/Json.d.ts +18 -0
  246. package/services/keyring-service/context/handlers/Json.js +328 -0
  247. package/services/keyring-service/context/handlers/Ledger.d.ts +11 -0
  248. package/services/keyring-service/context/handlers/Ledger.js +158 -0
  249. package/services/keyring-service/context/handlers/Mnemonic.d.ts +15 -0
  250. package/services/keyring-service/context/handlers/Mnemonic.js +206 -0
  251. package/services/keyring-service/context/handlers/Modify.d.ts +16 -0
  252. package/services/keyring-service/context/handlers/Modify.js +250 -0
  253. package/services/keyring-service/context/handlers/Secret.d.ts +16 -0
  254. package/services/keyring-service/context/handlers/Secret.js +299 -0
  255. package/services/keyring-service/context/handlers/index.d.ts +7 -0
  256. package/services/keyring-service/context/handlers/index.js +10 -0
  257. package/services/keyring-service/context/state.d.ts +92 -0
  258. package/services/keyring-service/context/state.js +629 -0
  259. package/services/keyring-service/context/stores/AccountProxy.d.ts +13 -0
  260. package/services/keyring-service/context/stores/AccountProxy.js +25 -0
  261. package/services/keyring-service/context/stores/Base.d.ts +22 -0
  262. package/services/keyring-service/context/stores/Base.js +30 -0
  263. package/services/keyring-service/context/stores/CurrentAccount.d.ts +15 -0
  264. package/services/keyring-service/context/stores/CurrentAccount.js +21 -0
  265. package/services/keyring-service/context/stores/ModifyPair.d.ts +10 -0
  266. package/services/keyring-service/context/stores/ModifyPair.js +12 -0
  267. package/services/keyring-service/context/stores/index.d.ts +3 -0
  268. package/services/keyring-service/context/stores/index.js +6 -0
  269. package/services/keyring-service/index.d.ts +10 -22
  270. package/services/keyring-service/index.js +20 -161
  271. package/services/migration-service/scripts/index.js +6 -4
  272. package/services/migration-service/scripts/{MigrateLedgerAccountV2.d.ts → keyring/MigrateLedgerAccountV2.d.ts} +1 -1
  273. package/services/migration-service/scripts/{MigrateLedgerAccountV2.js → keyring/MigrateLedgerAccountV2.js} +1 -1
  274. package/services/migration-service/scripts/keyring/MigratePairData.d.ts +4 -0
  275. package/services/migration-service/scripts/keyring/MigratePairData.js +20 -0
  276. package/services/migration-service/scripts/{MigrateRemoveGenesisHash.js → keyring/MigrateRemoveGenesisHash.js} +1 -1
  277. package/services/mkt-campaign-service/types.d.ts +4 -0
  278. package/services/request-service/constants.d.ts +1 -1
  279. package/services/request-service/constants.js +2 -1
  280. package/services/request-service/handler/AuthRequestHandler.d.ts +1 -0
  281. package/services/request-service/handler/AuthRequestHandler.js +93 -45
  282. package/services/request-service/handler/EvmRequestHandler.js +3 -4
  283. package/services/request-service/handler/SubstrateRequestHandler.d.ts +2 -2
  284. package/services/request-service/handler/SubstrateRequestHandler.js +5 -11
  285. package/services/request-service/handler/TonRequestHandler.d.ts +17 -0
  286. package/services/request-service/handler/TonRequestHandler.js +168 -0
  287. package/services/request-service/index.d.ts +8 -3
  288. package/services/request-service/index.js +23 -5
  289. package/services/request-service/types.d.ts +6 -3
  290. package/services/swap-service/handler/asset-hub/handler.d.ts +1 -1
  291. package/services/swap-service/handler/asset-hub/handler.js +2 -1
  292. package/services/swap-service/handler/base-handler.js +1 -1
  293. package/services/swap-service/handler/chainflip-handler.d.ts +1 -1
  294. package/services/swap-service/handler/chainflip-handler.js +4 -3
  295. package/services/swap-service/handler/hydradx-handler.d.ts +1 -1
  296. package/services/swap-service/handler/hydradx-handler.js +2 -1
  297. package/services/swap-service/index.js +1 -1
  298. package/services/transaction-service/helpers/index.d.ts +2 -0
  299. package/services/transaction-service/helpers/index.js +4 -0
  300. package/services/transaction-service/index.d.ts +1 -0
  301. package/services/transaction-service/index.js +114 -17
  302. package/services/transaction-service/types.d.ts +4 -2
  303. package/services/wallet-connect-service/handler/PolkadotRequestHandler.js +2 -10
  304. package/stores/AccountProxyStore.d.ts +5 -0
  305. package/stores/AccountProxyStore.js +10 -0
  306. package/stores/Authorize.d.ts +1 -1
  307. package/stores/CurrentAccountStore.d.ts +1 -1
  308. package/stores/ModifyPairStore.d.ts +5 -0
  309. package/stores/ModifyPairStore.js +10 -0
  310. package/stores/index.d.ts +4 -1
  311. package/stores/index.js +5 -2
  312. package/types/account/action/add/index.d.ts +3 -0
  313. package/types/account/action/add/index.js +6 -0
  314. package/types/account/action/add/json.d.ts +29 -0
  315. package/types/account/action/add/json.js +1 -0
  316. package/types/account/action/add/mnemonic.d.ts +77 -0
  317. package/types/account/action/add/mnemonic.js +1 -0
  318. package/types/account/action/add/secret.d.ts +55 -0
  319. package/types/account/action/add/secret.js +1 -0
  320. package/types/account/action/derive.d.ts +77 -0
  321. package/types/account/action/derive.js +1 -0
  322. package/types/account/action/edit.d.ts +31 -0
  323. package/types/account/action/edit.js +1 -0
  324. package/types/account/action/export.d.ts +15 -0
  325. package/types/account/action/export.js +1 -0
  326. package/types/account/action/index.d.ts +6 -0
  327. package/types/account/action/index.js +9 -0
  328. package/types/account/action/subscribe.d.ts +22 -0
  329. package/types/account/action/subscribe.js +10 -0
  330. package/types/account/action/validate.d.ts +17 -0
  331. package/types/account/action/validate.js +1 -0
  332. package/types/account/error/common.d.ts +10 -0
  333. package/types/account/error/common.js +33 -0
  334. package/types/account/error/derive.d.ts +13 -0
  335. package/types/account/error/derive.js +48 -0
  336. package/types/account/error/index.d.ts +2 -0
  337. package/types/account/error/index.js +5 -0
  338. package/types/account/index.d.ts +3 -0
  339. package/types/account/index.js +6 -0
  340. package/types/account/info/current.d.ts +10 -0
  341. package/types/account/info/current.js +1 -0
  342. package/types/account/info/index.d.ts +3 -0
  343. package/types/account/info/index.js +6 -0
  344. package/types/account/info/keyring.d.ts +161 -0
  345. package/types/account/info/keyring.js +88 -0
  346. package/types/account/info/proxy.d.ts +73 -0
  347. package/types/account/info/proxy.js +46 -0
  348. package/types/balance/index.d.ts +4 -1
  349. package/types/buy.d.ts +3 -1
  350. package/types/error.d.ts +8 -0
  351. package/types/error.js +1 -0
  352. package/types/index.d.ts +4 -0
  353. package/types/index.js +5 -1
  354. package/types/transaction/data.d.ts +17 -0
  355. package/types/transaction/data.js +1 -0
  356. package/types/transaction/error.d.ts +39 -0
  357. package/types/transaction/error.js +44 -0
  358. package/types/transaction/index.d.ts +4 -0
  359. package/types/transaction/index.js +7 -0
  360. package/types/transaction/request.d.ts +24 -0
  361. package/types/transaction/request.js +1 -0
  362. package/types/transaction/warning.d.ts +5 -0
  363. package/types/transaction/warning.js +8 -0
  364. package/types/yield/actions/join/submit.d.ts +2 -2
  365. package/types/yield/actions/join/validate.d.ts +1 -6
  366. package/types/yield/actions/join/validate.js +1 -10
  367. package/types/yield/actions/others.d.ts +1 -1
  368. package/utils/account/analyze.d.ts +4 -0
  369. package/utils/account/analyze.js +159 -0
  370. package/utils/account/common.d.ts +16 -0
  371. package/utils/account/common.js +104 -0
  372. package/utils/account/derive/index.d.ts +2 -0
  373. package/utils/account/derive/index.js +5 -0
  374. package/utils/account/derive/info/index.d.ts +2 -0
  375. package/utils/account/derive/info/index.js +5 -0
  376. package/utils/account/derive/info/solo.d.ts +11 -0
  377. package/utils/account/derive/info/solo.js +230 -0
  378. package/utils/account/derive/info/unified.d.ts +7 -0
  379. package/utils/account/derive/info/unified.js +102 -0
  380. package/utils/account/derive/validate.d.ts +8 -0
  381. package/utils/account/derive/validate.js +165 -0
  382. package/utils/account/index.d.ts +4 -0
  383. package/utils/account/index.js +7 -0
  384. package/utils/account/transform.d.ts +41 -0
  385. package/utils/account/transform.js +533 -0
  386. package/utils/auth.d.ts +2 -0
  387. package/utils/auth.js +39 -0
  388. package/utils/canDerive.d.ts +1 -1
  389. package/utils/eth/mergeTransactionAndSignature.d.ts +1 -1
  390. package/utils/getId.d.ts +1 -0
  391. package/utils/getId.js +3 -1
  392. package/utils/index.d.ts +12 -5
  393. package/utils/index.js +28 -47
  394. package/cjs/signers/substrates/KeyringSigner.js +0 -35
  395. package/cjs/signers/substrates/LedgerSigner.js +0 -44
  396. package/cjs/signers/substrates/QrSigner.js +0 -63
  397. package/cjs/signers/types.js +0 -15
  398. package/cjs/signers/web3/QrSigner.js +0 -67
  399. package/cjs/utils/account.js +0 -34
  400. package/signers/substrates/KeyringSigner.d.ts +0 -13
  401. package/signers/substrates/KeyringSigner.js +0 -27
  402. package/signers/substrates/LedgerSigner.d.ts +0 -13
  403. package/signers/substrates/LedgerSigner.js +0 -37
  404. package/signers/substrates/QrSigner.d.ts +0 -20
  405. package/signers/substrates/QrSigner.js +0 -55
  406. package/signers/types.d.ts +0 -34
  407. package/signers/types.js +0 -9
  408. package/signers/web3/QrSigner.d.ts +0 -18
  409. package/signers/web3/QrSigner.js +0 -59
  410. package/types/transaction.d.ts +0 -3
  411. package/utils/account.d.ts +0 -5
  412. package/utils/account.js +0 -24
  413. /package/cjs/{types/transaction.js → services/balance-service/helpers/subscribe/ton/types.js} +0 -0
  414. /package/cjs/services/migration-service/scripts/{MigrateLedgerAccount.js → keyring/MigrateLedgerAccount.js} +0 -0
  415. /package/{types/transaction.js → services/balance-service/helpers/subscribe/ton/types.js} +0 -0
  416. /package/services/migration-service/scripts/{MigrateLedgerAccount.d.ts → keyring/MigrateLedgerAccount.d.ts} +0 -0
  417. /package/services/migration-service/scripts/{MigrateLedgerAccount.js → keyring/MigrateLedgerAccount.js} +0 -0
  418. /package/services/migration-service/scripts/{MigrateRemoveGenesisHash.d.ts → keyring/MigrateRemoveGenesisHash.d.ts} +0 -0
@@ -6,8 +6,8 @@ import { LegacyTransaction } from '@ethereumjs/tx';
6
6
  import { TransactionError } from '@subwallet/extension-base/background/errors/TransactionError';
7
7
  import { withErrorLog } from '@subwallet/extension-base/background/handlers/helpers';
8
8
  import { createSubscription } from '@subwallet/extension-base/background/handlers/subscriptions';
9
- import { AccountExternalErrorCode, BasicTxErrorType, CampaignDataType, ChainType, ExternalRequestPromiseStatus, ExtrinsicType, MantaPayEnableMessage, StakingTxErrorType, StakingType } from '@subwallet/extension-base/background/KoniTypes';
10
- import { ALL_ACCOUNT_KEY, ALL_GENESIS_HASH, LATEST_SESSION, XCM_FEE_RATIO } from '@subwallet/extension-base/constants';
9
+ import { CampaignDataType, ChainType, ExternalRequestPromiseStatus, ExtrinsicType, MantaPayEnableMessage, StakingType } from '@subwallet/extension-base/background/KoniTypes';
10
+ import { ALL_ACCOUNT_KEY, LATEST_SESSION, XCM_FEE_RATIO } from '@subwallet/extension-base/constants';
11
11
  import { additionalValidateTransfer, additionalValidateXcmTransfer, validateTransferRequest, validateXcmTransferRequest } from '@subwallet/extension-base/core/logic-validation/transfer';
12
12
  import { _isSnowBridgeXcm } from '@subwallet/extension-base/core/substrate/xcm-parser';
13
13
  import { ALLOWED_PATH } from '@subwallet/extension-base/defaults';
@@ -21,54 +21,34 @@ import { getBondingExtrinsic, getCancelWithdrawalExtrinsic, getClaimRewardExtrin
21
21
  import { getTuringCancelCompoundingExtrinsic, getTuringCompoundExtrinsic } from '@subwallet/extension-base/koni/api/staking/bonding/paraChain';
22
22
  import { getPoolingBondingExtrinsic, getPoolingUnbondingExtrinsic, validatePoolBondingCondition, validateRelayUnbondingCondition } from '@subwallet/extension-base/koni/api/staking/bonding/relayChain';
23
23
  import { YIELD_EXTRINSIC_TYPES } from '@subwallet/extension-base/koni/api/yield/helper/utils';
24
+ import { isBounceableAddress } from '@subwallet/extension-base/services/balance-service/helpers/subscribe/ton/utils';
24
25
  import { getERC20TransactionObject, getERC721Transaction, getEVMTransactionObject, getPSP34TransferExtrinsic } from '@subwallet/extension-base/services/balance-service/transfer/smart-contract';
25
26
  import { createTransferExtrinsic, getTransferMockTxFee } from '@subwallet/extension-base/services/balance-service/transfer/token';
27
+ import { createTonTransaction } from '@subwallet/extension-base/services/balance-service/transfer/ton-transfer';
26
28
  import { createSnowBridgeExtrinsic, createXcmExtrinsic, getXcmMockTxFee } from '@subwallet/extension-base/services/balance-service/transfer/xcm';
27
29
  import { _API_OPTIONS_CHAIN_GROUP, _DEFAULT_MANTA_ZK_CHAIN, _MANTA_ZK_CHAIN_GROUP, _ZK_ASSET_PREFIX } from '@subwallet/extension-base/services/chain-service/constants';
28
30
  import { _ChainConnectionStatus } from '@subwallet/extension-base/services/chain-service/types';
29
- import { _getAssetDecimals, _getAssetSymbol, _getChainNativeTokenBasicInfo, _getContractAddressOfToken, _getEvmChainId, _getSubstrateGenesisHash, _isAssetSmartContractNft, _isChainEvmCompatible, _isCustomAsset, _isLocalToken, _isMantaZkAsset, _isNativeToken, _isPureEvmChain, _isTokenEvmSmartContract, _isTokenTransferredByEvm } from '@subwallet/extension-base/services/chain-service/utils';
31
+ import { _getAssetDecimals, _getAssetSymbol, _getChainNativeTokenBasicInfo, _getContractAddressOfToken, _getEvmChainId, _isAssetSmartContractNft, _isChainEvmCompatible, _isChainTonCompatible, _isCustomAsset, _isLocalToken, _isMantaZkAsset, _isNativeToken, _isPureEvmChain, _isTokenEvmSmartContract, _isTokenTransferredByEvm, _isTokenTransferredByTon } from '@subwallet/extension-base/services/chain-service/utils';
30
32
  import { EXTENSION_REQUEST_URL } from '@subwallet/extension-base/services/request-service/constants';
31
33
  import { DEFAULT_AUTO_LOCK_TIME } from '@subwallet/extension-base/services/setting-service/constants';
32
34
  import { WALLET_CONNECT_EIP155_NAMESPACE } from '@subwallet/extension-base/services/wallet-connect-service/constants';
33
35
  import { isProposalExpired, isSupportWalletConnectChain, isSupportWalletConnectNamespace } from '@subwallet/extension-base/services/wallet-connect-service/helpers';
34
36
  import { SWStorage } from '@subwallet/extension-base/storage';
35
37
  import { AccountsStore } from '@subwallet/extension-base/stores';
36
- import { YieldPoolType } from '@subwallet/extension-base/types';
37
- import { BN_ZERO, convertSubjectInfoToAddresses, createPromiseHandler, createTransactionFromRLP, isSameAddress, MODULE_SUPPORT, reformatAddress, signatureToHex, uniqueStringArray } from '@subwallet/extension-base/utils';
38
+ import { BasicTxErrorType, BasicTxWarningCode, StakingTxErrorType, YieldPoolType } from '@subwallet/extension-base/types';
39
+ import { _analyzeAddress, BN_ZERO, combineAllAccountProxy, createTransactionFromRLP, isSameAddress, MODULE_SUPPORT, reformatAddress, signatureToHex, transformAccounts, transformAddresses, uniqueStringArray } from '@subwallet/extension-base/utils';
38
40
  import { parseContractInput, parseEvmRlp } from '@subwallet/extension-base/utils/eth/parseTransaction';
39
41
  import { metadataExpand } from '@subwallet/extension-chains';
40
- import { createPair } from '@subwallet/keyring';
42
+ import { getKeypairTypeByAddress, isAddress, isSubstrateAddress, isTonAddress } from '@subwallet/keyring';
43
+ import { EthereumKeypairTypes, SubstrateKeypairTypes, TonKeypairTypes } from '@subwallet/keyring/types';
41
44
  import { keyring } from '@subwallet/ui-keyring';
42
45
  import { getSdkError } from '@walletconnect/utils';
43
46
  import BigN from 'bignumber.js';
44
47
  import { t } from 'i18next';
45
- import { Subject } from 'rxjs';
48
+ import { combineLatest, Subject } from 'rxjs';
46
49
  import { Metadata, TypeRegistry } from '@polkadot/types';
47
- import { assert, hexStripPrefix, hexToU8a, isAscii, isHex, u8aToHex, u8aToString } from '@polkadot/util';
48
- import { base64Decode, decodeAddress, isAddress, isEthereumAddress, jsonDecrypt, keyExtractSuri, mnemonicGenerate, mnemonicValidate } from '@polkadot/util-crypto';
49
- const ETH_DERIVE_DEFAULT = '/m/44\'/60\'/0\'/0/0';
50
- function getSuri(seed, type) {
51
- return type === 'ethereum' ? `${seed}${ETH_DERIVE_DEFAULT}` : seed;
52
- }
53
- function transformAccounts(accounts) {
54
- return Object.values(accounts).map(({
55
- json: {
56
- address,
57
- meta
58
- },
59
- type
60
- }) => ({
61
- address,
62
- ...meta,
63
- type
64
- }));
65
- }
66
- const ACCOUNT_ALL_JSON = {
67
- address: ALL_ACCOUNT_KEY,
68
- name: 'All'
69
- };
70
- export const SEED_DEFAULT_LENGTH = 12;
71
- export const SEED_LENGTHS = [12, 15, 18, 21, 24];
50
+ import { assert, hexStripPrefix, hexToU8a, isAscii, isHex, u8aToHex } from '@polkadot/util';
51
+ import { decodeAddress, isEthereumAddress } from '@polkadot/util-crypto';
72
52
  export function isJsonPayload(value) {
73
53
  return value.genesisHash !== undefined;
74
54
  }
@@ -79,6 +59,11 @@ export default class KoniExtension {
79
59
  #skipAutoLock = false;
80
60
  #firstTime = true;
81
61
  #alwaysLock = false;
62
+ /**
63
+ * Use for heartbeat.
64
+ * When auto-lock runs, the value changes, and it stops the heartbeat.
65
+ * With MV3, when the lifecycle ends, this extension Object will be destroyed, so #keyringLockSubject will be destroyed too.
66
+ * */
82
67
  #keyringLockSubject = new Subject();
83
68
  constructor(state) {
84
69
  this.#koniState = state;
@@ -117,76 +102,14 @@ export default class KoniExtension {
117
102
  next: updateTimeAutoLock
118
103
  });
119
104
  }
120
-
121
- /// Clone from PolkadotJs
122
- accountsCreateExternal({
123
- address,
124
- genesisHash,
125
- name
126
- }) {
127
- keyring.addExternal(address, {
128
- genesisHash,
129
- name
130
- });
131
- return true;
132
- }
133
- accountsCreateHardware({
134
- accountIndex,
135
- address,
136
- addressOffset,
137
- genesisHash,
138
- hardwareType,
139
- name
140
- }) {
141
- keyring.addHardware(address, hardwareType, {
142
- accountIndex,
143
- addressOffset,
144
- genesisHash,
145
- name
146
- });
147
- return true;
105
+ accountsEdit(request) {
106
+ return this.#koniState.keyringService.context.accountsEdit(request);
148
107
  }
149
- accountsCreateSuri({
150
- genesisHash,
151
- name,
152
- suri,
153
- type
154
- }) {
155
- keyring.addUri(getSuri(suri, type), {
156
- genesisHash,
157
- name
158
- }, type);
159
- return true;
108
+ tonGetAllTonWalletContractVersion(request) {
109
+ return this.#koniState.keyringService.context.tonGetAllTonWalletContractVersion(request);
160
110
  }
161
- accountsChangePassword({
162
- address,
163
- newPass,
164
- oldPass
165
- }) {
166
- const pair = keyring.getPair(address);
167
- assert(pair, t('Unable to find account'));
168
- try {
169
- if (!pair.isLocked) {
170
- pair.lock();
171
- }
172
- pair.decodePkcs8(oldPass);
173
- } catch (error) {
174
- throw new Error(t('Wrong password'));
175
- }
176
- keyring.encryptAccount(pair, newPass);
177
- return true;
178
- }
179
- accountsEdit({
180
- address,
181
- name
182
- }) {
183
- const pair = keyring.getPair(address);
184
- assert(pair, t('Unable to find account'));
185
- keyring.saveAccountMeta(pair, {
186
- ...pair.meta,
187
- name
188
- });
189
- return true;
111
+ tonAccountChangeWalletContractVersion(request) {
112
+ return this.#koniState.keyringService.context.tonAccountChangeWalletContractVersion(request);
190
113
  }
191
114
  accountsExport({
192
115
  address,
@@ -196,41 +119,6 @@ export default class KoniExtension {
196
119
  exportedJson: keyring.backupAccount(keyring.getPair(address), password)
197
120
  };
198
121
  }
199
- accountsShow({
200
- address,
201
- isShowing
202
- }) {
203
- const pair = keyring.getPair(address);
204
- assert(pair, t('Unable to find account'));
205
- keyring.saveAccountMeta(pair, {
206
- ...pair.meta,
207
- isHidden: !isShowing
208
- });
209
- return true;
210
- }
211
- accountsValidate({
212
- address,
213
- password
214
- }) {
215
- try {
216
- keyring.backupAccount(keyring.getPair(address), password);
217
- return true;
218
- } catch (e) {
219
- return false;
220
- }
221
- }
222
-
223
- // FIXME This looks very much like what we have in Tabs
224
- accountsSubscribe(id, port) {
225
- const cb = createSubscription(id, port);
226
- const accountSubject = this.#koniState.keyringService.accountSubject;
227
- const subscription = accountSubject.subscribe(accounts => cb(transformAccounts(accounts)));
228
- port.onDisconnect.addListener(() => {
229
- this.cancelSubscription(id);
230
- subscription.unsubscribe();
231
- });
232
- return true;
233
- }
234
122
  metadataApprove({
235
123
  id
236
124
  }) {
@@ -270,81 +158,6 @@ export default class KoniExtension {
270
158
  });
271
159
  return this.#koniState.metaSubject.value;
272
160
  }
273
- jsonRestore({
274
- file,
275
- password
276
- }) {
277
- try {
278
- keyring.restoreAccount(file, password, true);
279
- } catch (error) {
280
- throw new Error(error.message);
281
- }
282
- }
283
- batchRestore({
284
- file,
285
- password
286
- }) {
287
- try {
288
- keyring.restoreAccounts(file, password);
289
- } catch (error) {
290
- throw new Error(error.message);
291
- }
292
- }
293
- jsonGetAccountInfo(json) {
294
- try {
295
- const {
296
- address,
297
- meta: {
298
- genesisHash,
299
- name
300
- },
301
- type
302
- } = keyring.createFromJson(json);
303
- return {
304
- address,
305
- genesisHash,
306
- name,
307
- type
308
- };
309
- } catch (e) {
310
- console.error(e);
311
- throw new Error(e.message);
312
- }
313
- }
314
- seedCreate({
315
- length = SEED_DEFAULT_LENGTH,
316
- seed: _seed,
317
- type
318
- }) {
319
- const seed = _seed || mnemonicGenerate(length);
320
- return {
321
- address: keyring.createFromUri(getSuri(seed, type), {}, type).address,
322
- seed
323
- };
324
- }
325
- seedValidate({
326
- suri,
327
- type
328
- }) {
329
- const {
330
- phrase
331
- } = keyExtractSuri(suri);
332
- if (isHex(phrase)) {
333
- assert(isHex(phrase, 256), t('Invalid seed phrase. Please try again.'));
334
- } else {
335
- // sadly isHex detects as string, so we need a cast here
336
- assert(SEED_LENGTHS.includes(phrase.split(' ').length), t('Seed phrase needs to contain {{x}} words', {
337
- replace: {
338
- x: SEED_LENGTHS.join(', ')
339
- }
340
- }));
341
- assert(mnemonicValidate(phrase), t('Invalid seed phrase. Please try again.'));
342
- }
343
- return {
344
- address: keyring.createFromUri(getSuri(suri, type), {}, type).address,
345
- suri
346
- };
347
- }
348
161
 
349
162
  // TODO: move to request service
350
163
  signingApproveSignature({
@@ -414,50 +227,6 @@ export default class KoniExtension {
414
227
  }));
415
228
  return true;
416
229
  }
417
- derive(parentAddress, suri, password, metadata) {
418
- const parentPair = keyring.getPair(parentAddress);
419
- try {
420
- parentPair.decodePkcs8(password);
421
- } catch (e) {
422
- throw new Error(t('Wrong password'));
423
- }
424
- try {
425
- return parentPair.derive(suri, metadata);
426
- } catch (err) {
427
- throw new Error(t('"{{suri}}" is not a valid derivation path', {
428
- replace: {
429
- suri
430
- }
431
- }));
432
- }
433
- }
434
- derivationValidate({
435
- parentAddress,
436
- parentPassword,
437
- suri
438
- }) {
439
- const childPair = this.derive(parentAddress, suri, parentPassword, {});
440
- return {
441
- address: childPair.address,
442
- suri
443
- };
444
- }
445
- derivationCreate({
446
- genesisHash,
447
- name,
448
- parentAddress,
449
- parentPassword,
450
- suri
451
- }) {
452
- const childPair = this.derive(parentAddress, suri, parentPassword, {
453
- genesisHash,
454
- name,
455
- parentAddress,
456
- suri
457
- });
458
- keyring.addPair(childPair, true);
459
- return true;
460
- }
461
230
 
462
231
  ///
463
232
 
@@ -467,78 +236,101 @@ export default class KoniExtension {
467
236
  createUnsubscriptionHandle(id, unsubscribe) {
468
237
  this.#koniState.createUnsubscriptionHandle(id, unsubscribe);
469
238
  }
470
- decodeAddress = (key, ignoreChecksum, ss58Format) => {
471
- return keyring.decodeAddress(key, ignoreChecksum, ss58Format);
472
- };
473
- encodeAddress = (key, ss58Format) => {
474
- return keyring.encodeAddress(key, ss58Format);
475
- };
476
- accountExportPrivateKey({
477
- address,
478
- password
479
- }) {
480
- return this.#koniState.accountExportPrivateKey({
481
- address,
482
- password
483
- });
239
+ accountExportPrivateKey(request) {
240
+ return this.#koniState.accountExportPrivateKey(request);
484
241
  }
485
242
  checkPublicAndSecretKey(request) {
486
243
  return this.#koniState.checkPublicAndSecretKey(request);
487
244
  }
245
+ checkNameExists(request) {
246
+ return this.#koniState.keyringService.context.checkNameExists(request);
247
+ }
488
248
  async accountsGetAllWithCurrentAddress(id, port) {
489
249
  const cb = createSubscription(id, port);
490
250
  const keyringService = this.#koniState.keyringService;
491
251
  await this.#koniState.eventService.waitAccountReady;
492
252
  await this.#koniState.eventService.waitInjectReady;
493
- const currentAccount = keyringService.currentAccount;
494
- const transformedAccounts = transformAccounts(keyringService.accounts);
253
+ const currentAccount = keyringService.context.currentAccount;
254
+ const accounts = keyringService.context.accounts;
255
+ const transformedAccounts = Object.values(accounts);
495
256
  const responseData = {
496
- accounts: transformedAccounts !== null && transformedAccounts !== void 0 && transformedAccounts.length ? [{
497
- ...ACCOUNT_ALL_JSON
498
- }, ...transformedAccounts] : [],
499
- currentAddress: currentAccount === null || currentAccount === void 0 ? void 0 : currentAccount.address,
500
- currentGenesisHash: currentAccount === null || currentAccount === void 0 ? void 0 : currentAccount.currentGenesisHash
257
+ accounts: transformedAccounts !== null && transformedAccounts !== void 0 && transformedAccounts.length ? [combineAllAccountProxy(transformedAccounts), ...transformedAccounts] : [],
258
+ currentAccountProxy: currentAccount === null || currentAccount === void 0 ? void 0 : currentAccount.proxyId
501
259
  };
502
- const subscriptionAccounts = keyringService.accountSubject.subscribe(storedAccounts => {
503
- const transformedAccounts = transformAccounts(storedAccounts);
504
- responseData.accounts = transformedAccounts !== null && transformedAccounts !== void 0 && transformedAccounts.length ? [{
505
- ...ACCOUNT_ALL_JSON
506
- }, ...transformedAccounts] : [];
507
- cb(responseData);
508
- });
509
- const subscriptionCurrentAccount = keyringService.currentAccountSubject.subscribe(currentAccountData => {
510
- responseData.currentAddress = currentAccountData.address;
511
- responseData.currentGenesisHash = currentAccountData.currentGenesisHash;
260
+ const accountProxyMapObservable = keyringService.context.observable.accounts;
261
+ const currentAccountInfoObservable = keyringService.context.observable.currentAccount;
262
+ const subscriptionAccountGroups = combineLatest({
263
+ accountProxies: accountProxyMapObservable,
264
+ currentAccount: currentAccountInfoObservable
265
+ }).subscribe(({
266
+ accountProxies,
267
+ currentAccount
268
+ }) => {
269
+ const transformedAccounts = Object.values(accountProxies);
270
+ responseData.accounts = transformedAccounts !== null && transformedAccounts !== void 0 && transformedAccounts.length ? [combineAllAccountProxy(transformedAccounts), ...transformedAccounts] : [];
271
+ responseData.currentAccountProxy = currentAccount === null || currentAccount === void 0 ? void 0 : currentAccount.proxyId;
272
+ console.debug('subscriptionAccountGroups', responseData);
512
273
  cb(responseData);
513
274
  });
514
275
  this.createUnsubscriptionHandle(id, () => {
515
- subscriptionAccounts.unsubscribe();
516
- subscriptionCurrentAccount.unsubscribe();
276
+ subscriptionAccountGroups.unsubscribe();
517
277
  });
518
278
  port.onDisconnect.addListener(() => {
519
279
  this.cancelSubscription(id);
520
280
  });
521
281
  return responseData;
522
282
  }
523
- accountsGetAll(id, port) {
283
+ async subscribeInputAddressData(request, id, port) {
284
+ const {
285
+ chain,
286
+ data
287
+ } = request;
524
288
  const cb = createSubscription(id, port);
525
- const subscription = keyring.keyringOption.optionsSubject.subscribe(options => {
526
- const optionsInputAddress = {
527
- options
289
+ const combineFunction = async (chainInfoMap, accountProxyMap, _contacts) => {
290
+ const accountProxies = Object.values(accountProxyMap);
291
+ const contacts = transformAddresses(_contacts);
292
+ const chainInfo = chainInfoMap[chain];
293
+ const substrateApi = this.#koniState.chainService.getSubstrateApi(chain);
294
+ const rs = await _analyzeAddress(data, accountProxies, contacts, chainInfo, substrateApi);
295
+ return {
296
+ id,
297
+ ...rs
528
298
  };
529
- cb(optionsInputAddress);
299
+ };
300
+ const accountObservable = this.#koniState.keyringService.context.observable.accounts;
301
+ const contactObservable = this.#koniState.keyringService.context.observable.contacts;
302
+ const chainInfoMapObservable = this.#koniState.chainService.subscribeChainInfoMap().asObservable();
303
+ const subscription = combineLatest({
304
+ chainInfoMap: chainInfoMapObservable,
305
+ accountProxies: accountObservable,
306
+ contacts: contactObservable
307
+ }).subscribe(({
308
+ accountProxies,
309
+ chainInfoMap,
310
+ contacts
311
+ }) => {
312
+ combineFunction(chainInfoMap, accountProxies, contacts).then(rs => cb(rs)).catch(console.error);
313
+ });
314
+ this.createUnsubscriptionHandle(id, () => {
315
+ subscription.unsubscribe();
530
316
  });
531
- this.createUnsubscriptionHandle(id, subscription.unsubscribe);
532
317
  port.onDisconnect.addListener(() => {
533
318
  this.cancelSubscription(id);
534
319
  });
535
- return id;
320
+ const accountProxyMap = this.#koniState.keyringService.context.value.accounts;
321
+ const contacts = this.#koniState.keyringService.context.value.contacts;
322
+ const chainInfoMap = this.#koniState.chainService.getChainInfoMap();
323
+ return combineFunction(chainInfoMap, accountProxyMap, contacts);
536
324
  }
325
+
326
+ /**
327
+ * @todo: move to keyring context
328
+ * */
537
329
  subscribeAddresses(id, port) {
538
330
  const _cb = createSubscription(id, port);
539
331
  let old = '';
540
- const subscription = this.#koniState.keyringService.addressesSubject.subscribe(subjectInfo => {
541
- const addresses = convertSubjectInfoToAddresses(subjectInfo);
332
+ const subscription = this.#koniState.keyringService.context.observable.contacts.subscribe(subjectInfo => {
333
+ const addresses = transformAddresses(subjectInfo);
542
334
  const _new = JSON.stringify(addresses);
543
335
  if (old !== _new) {
544
336
  _cb({
@@ -547,15 +339,21 @@ export default class KoniExtension {
547
339
  old = _new;
548
340
  }
549
341
  });
550
- this.createUnsubscriptionHandle(id, subscription.unsubscribe);
342
+ this.createUnsubscriptionHandle(id, () => {
343
+ subscription.unsubscribe();
344
+ });
551
345
  port.onDisconnect.addListener(() => {
552
346
  this.cancelSubscription(id);
553
347
  });
554
- const subjectInfo = this.#koniState.keyringService.addresses;
348
+ const subjectInfo = this.#koniState.keyringService.context.contacts;
555
349
  return {
556
- addresses: convertSubjectInfoToAddresses(subjectInfo)
350
+ addresses: transformAccounts(subjectInfo)
557
351
  };
558
352
  }
353
+
354
+ /**
355
+ * @todo: move to keyring context
356
+ * */
559
357
  saveRecentAccount({
560
358
  accountId,
561
359
  chain
@@ -584,7 +382,7 @@ export default class KoniExtension {
584
382
  }
585
383
  }
586
384
  metadata.recentChainSlugs = recentChainSlugs;
587
- const result = keyring.addresses.add(new AccountsStore(), address, {
385
+ const result = keyring.addresses.add(new AccountsStore(), address, address, {
588
386
  address: address,
589
387
  meta: metadata
590
388
  });
@@ -597,6 +395,10 @@ export default class KoniExtension {
597
395
  throw Error(t('This is not an address'));
598
396
  }
599
397
  }
398
+
399
+ /**
400
+ * @todo: move to keyring context
401
+ * */
600
402
  editContactAccount({
601
403
  address,
602
404
  meta
@@ -609,6 +411,10 @@ export default class KoniExtension {
609
411
  throw Error(t('This is not an address'));
610
412
  }
611
413
  }
414
+
415
+ /**
416
+ * @todo: move to keyring context
417
+ * */
612
418
  deleteContactAccount({
613
419
  address
614
420
  }) {
@@ -624,7 +430,7 @@ export default class KoniExtension {
624
430
  const keyringService = this.#koniState.keyringService;
625
431
  return new Promise((resolve, reject) => {
626
432
  this.#koniState.getAuthorize(rs => {
627
- const addressList = Object.keys(keyringService.accounts);
433
+ const addressList = Object.keys(keyringService.context.pairs);
628
434
  const urlList = Object.keys(rs);
629
435
  if (Object.keys(rs[urlList[0]].isAllowedMap).toString() !== addressList.toString()) {
630
436
  urlList.forEach(url => {
@@ -737,37 +543,52 @@ export default class KoniExtension {
737
543
  });
738
544
  return true;
739
545
  }
740
- getAccounts() {
741
- const storedAccounts = this.#koniState.keyringService.accounts;
742
- const transformedAccounts = transformAccounts(storedAccounts);
743
- return transformedAccounts.map(a => a.address);
546
+ getPairs() {
547
+ const storedAccounts = this.#koniState.keyringService.context.pairs;
548
+ return transformAccounts(storedAccounts);
744
549
  }
745
- isAddressValidWithAuthType(address, accountAuthType) {
746
- if (accountAuthType === 'substrate') {
747
- return !isEthereumAddress(address);
748
- } else if (accountAuthType === 'evm') {
749
- return isEthereumAddress(address);
750
- }
751
- return true;
550
+ isAddressValidWithAuthType(address, accountAuthTypes) {
551
+ const type = getKeypairTypeByAddress(address);
552
+ const validTypes = {
553
+ evm: EthereumKeypairTypes,
554
+ substrate: SubstrateKeypairTypes,
555
+ ton: TonKeypairTypes
556
+ };
557
+ return !!accountAuthTypes && accountAuthTypes.some(authType => {
558
+ var _validTypes$authType;
559
+ return (_validTypes$authType = validTypes[authType]) === null || _validTypes$authType === void 0 ? void 0 : _validTypes$authType.includes(type);
560
+ });
752
561
  }
753
- filterAccountsByAccountAuthType(accounts, accountAuthType) {
754
- if (accountAuthType === 'substrate') {
755
- return accounts.filter(address => !isEthereumAddress(address));
756
- } else if (accountAuthType === 'evm') {
757
- return accounts.filter(address => isEthereumAddress(address));
758
- } else {
759
- return accounts;
562
+ filterAccountsByAccountAuthType(accounts, accountAuthTypes) {
563
+ if (!accountAuthTypes) {
564
+ return [];
760
565
  }
566
+ return accountAuthTypes.reduce((list, accountAuthType) => {
567
+ if (accountAuthType === 'evm') {
568
+ accounts.forEach(({
569
+ address
570
+ }) => isEthereumAddress(address) && list.push(address));
571
+ } else if (accountAuthType === 'substrate') {
572
+ accounts.forEach(({
573
+ address
574
+ }) => isSubstrateAddress(address) && list.push(address));
575
+ } else if (accountAuthType === 'ton') {
576
+ accounts.forEach(({
577
+ address
578
+ }) => isTonAddress(address) && list.push(address));
579
+ }
580
+ return list;
581
+ }, []);
761
582
  }
762
583
  _changeAuthorizationAll(connectValue, callBack) {
763
584
  this.#koniState.getAuthorize(value => {
764
585
  assert(value, 'The source is not known');
765
- const accounts = this.getAccounts();
586
+ const pairs = this.getPairs();
766
587
  Object.keys(value).forEach(url => {
767
588
  if (!value[url].isAllowed) {
768
589
  return;
769
590
  }
770
- const targetAccounts = this.filterAccountsByAccountAuthType(accounts, value[url].accountAuthType);
591
+ const targetAccounts = this.filterAccountsByAccountAuthType(pairs, value[url].accountAuthTypes);
771
592
  targetAccounts.forEach(address => {
772
593
  value[url].isAllowedMap[address] = connectValue;
773
594
  });
@@ -790,8 +611,8 @@ export default class KoniExtension {
790
611
  _changeAuthorization(url, connectValue, callBack) {
791
612
  this.#koniState.getAuthorize(value => {
792
613
  assert(value[url], 'The source is not known');
793
- const accounts = this.getAccounts();
794
- const targetAccounts = this.filterAccountsByAccountAuthType(accounts, value[url].accountAuthType);
614
+ const pairs = this.getPairs();
615
+ const targetAccounts = this.filterAccountsByAccountAuthType(pairs, value[url].accountAuthTypes);
795
616
  targetAccounts.forEach(address => {
796
617
  value[url].isAllowedMap[address] = connectValue;
797
618
  });
@@ -826,7 +647,7 @@ export default class KoniExtension {
826
647
  _changeAuthorizationPerAcc(address, connectValue, url, callBack) {
827
648
  this.#koniState.getAuthorize(value => {
828
649
  assert(value, 'The source is not known');
829
- if (this.isAddressValidWithAuthType(address, value[url].accountAuthType)) {
650
+ if (this.isAddressValidWithAuthType(address, value[url].accountAuthTypes)) {
830
651
  value[url].isAllowedMap[address] = connectValue;
831
652
  this.#koniState.setAuthorize(value, () => {
832
653
  callBack && callBack(value);
@@ -981,39 +802,10 @@ export default class KoniExtension {
981
802
  });
982
803
  return await this.#koniState.getAuthList();
983
804
  }
984
- _saveCurrentAccountAddress(address, callback) {
985
- let accountInfo = this.#koniState.keyringService.currentAccount;
986
- if (!accountInfo) {
987
- accountInfo = {
988
- address,
989
- currentGenesisHash: ALL_GENESIS_HASH,
990
- allGenesisHash: ALL_GENESIS_HASH || undefined
991
- };
992
- } else {
993
- accountInfo.address = address;
994
- if (address !== ALL_ACCOUNT_KEY) {
995
- try {
996
- const currentKeyPair = keyring.getPair(address);
997
- accountInfo.currentGenesisHash = (currentKeyPair === null || currentKeyPair === void 0 ? void 0 : currentKeyPair.meta.genesisHash) || ALL_GENESIS_HASH;
998
- } catch {
999
- accountInfo.currentGenesisHash = ALL_GENESIS_HASH;
1000
- }
1001
- } else {
1002
- accountInfo.currentGenesisHash = accountInfo.allGenesisHash || ALL_GENESIS_HASH;
1003
- }
1004
- }
1005
- this.#koniState.setCurrentAccount(accountInfo, () => {
1006
- callback && callback(accountInfo);
1007
- });
1008
- }
1009
- updateCurrentAccountAddress(address) {
1010
- this._saveCurrentAccountAddress(address);
1011
- return true;
1012
- }
1013
- async saveCurrentAccountAddress(data) {
805
+ async saveCurrentAccountProxy(data) {
1014
806
  return new Promise(resolve => {
1015
- this._saveCurrentAccountAddress(data.address, currentInfo => {
1016
- resolve(currentInfo);
807
+ this.#koniState.keyringService.context.saveCurrentAccountProxyId(data.address, () => {
808
+ resolve(true);
1017
809
  });
1018
810
  });
1019
811
  }
@@ -1096,136 +888,24 @@ export default class KoniExtension {
1096
888
  });
1097
889
  return this.getCrowdloan(true);
1098
890
  }
1099
- validatePassword(json, password) {
1100
- const cryptoType = Array.isArray(json.encoding.content) ? json.encoding.content[1] : 'ed25519';
1101
- const encType = Array.isArray(json.encoding.type) ? json.encoding.type : [json.encoding.type];
1102
- const pair = createPair({
1103
- toSS58: this.encodeAddress,
1104
- type: cryptoType
1105
- }, {
1106
- publicKey: this.decodeAddress(json.address, true)
1107
- }, json.meta, isHex(json.encoded) ? hexToU8a(json.encoded) : base64Decode(json.encoded), encType);
1108
-
1109
- // unlock then lock (locking cleans secretKey, so needs to be last)
1110
- try {
1111
- pair.decodePkcs8(password);
1112
- pair.lock();
1113
- return true;
1114
- } catch (e) {
1115
- console.error(e);
1116
- return false;
1117
- }
1118
- }
1119
- validatedAccountsPassword(json, password) {
1120
- try {
1121
- u8aToString(jsonDecrypt(json, password));
1122
- return true;
1123
- } catch (e) {
1124
- return false;
1125
- }
1126
- }
1127
- _addAddressToAuthList(address, isAllowed) {
1128
- this.#koniState.getAuthorize(value => {
1129
- if (value && Object.keys(value).length) {
1130
- Object.keys(value).forEach(url => {
1131
- if (this.isAddressValidWithAuthType(address, value[url].accountAuthType)) {
1132
- value[url].isAllowedMap[address] = isAllowed;
1133
- }
1134
- });
1135
- this.#koniState.setAuthorize(value);
1136
- }
1137
- });
1138
- }
1139
- _addAddressesToAuthList(addresses, isAllowed) {
1140
- this.#koniState.getAuthorize(value => {
1141
- if (value && Object.keys(value).length) {
1142
- Object.keys(value).forEach(url => {
1143
- addresses.forEach(address => {
1144
- if (this.isAddressValidWithAuthType(address, value[url].accountAuthType)) {
1145
- value[url].isAllowedMap[address] = isAllowed;
1146
- }
1147
- });
1148
- }); /**/
1149
-
1150
- this.#koniState.setAuthorize(value);
1151
- }
1152
- });
1153
- }
1154
- async accountsCreateSuriV2({
1155
- genesisHash,
1156
- isAllowed,
1157
- name,
1158
- password,
1159
- suri: _suri,
1160
- types
1161
- }) {
1162
- const addressDict = {};
1163
- let changedAccount = false;
1164
- const hasMasterPassword = keyring.keyring.hasMasterPassword;
1165
- if (!hasMasterPassword) {
1166
- if (!password) {
1167
- throw Error(t('The password of each account is needed to set up master password'));
1168
- } else {
1169
- keyring.changeMasterPassword(password);
1170
- this.#koniState.updateKeyringState();
1171
- }
1172
- }
1173
- const currentAccount = this.#koniState.keyringService.currentAccount;
1174
- const allGenesisHash = (currentAccount === null || currentAccount === void 0 ? void 0 : currentAccount.allGenesisHash) || undefined;
1175
- types === null || types === void 0 ? void 0 : types.forEach(type => {
1176
- const suri = getSuri(_suri, type);
1177
- const address = keyring.createFromUri(suri, {}, type).address;
1178
- addressDict[type] = address;
1179
- const newAccountName = type === 'ethereum' ? `${name} - EVM` : name;
1180
- keyring.addUri(suri, {
1181
- genesisHash,
1182
- name: newAccountName
1183
- }, type);
1184
- this._addAddressToAuthList(address, isAllowed);
1185
- if (!changedAccount) {
1186
- if (types.length === 1) {
1187
- this.#koniState.setCurrentAccount({
1188
- address,
1189
- currentGenesisHash: genesisHash || null,
1190
- allGenesisHash
1191
- });
1192
- } else {
1193
- this.#koniState.setCurrentAccount({
1194
- address: ALL_ACCOUNT_KEY,
1195
- currentGenesisHash: allGenesisHash || null,
1196
- allGenesisHash
1197
- }, undefined, true);
1198
- }
1199
- changedAccount = true;
1200
- }
1201
- });
1202
- await new Promise(resolve => {
1203
- this.#koniState.addAccountRef(Object.values(addressDict), () => {
1204
- resolve();
1205
- });
1206
- });
891
+ accountsCreateSuriV2(request) {
892
+ const addressDict = this.#koniState.keyringService.context.accountsCreateSuriV2(request);
1207
893
  if (this.#alwaysLock) {
1208
894
  this.keyringLock();
1209
895
  }
1210
896
  return addressDict;
1211
897
  }
1212
- async accountsForgetOverride({
1213
- address,
1214
- lockAfter
1215
- }) {
1216
- keyring.forgetAccount(address);
1217
- await new Promise(resolve => {
1218
- this.#koniState.removeAccountRef(address, () => {
1219
- resolve();
1220
- });
1221
- });
898
+ async accountsForgetOverride(request) {
899
+ const addresses = await this.#koniState.keyringService.context.accountProxyForget(request);
1222
900
 
1223
901
  // Remove from auth list
1224
902
  await new Promise(resolve => {
1225
903
  this.#koniState.getAuthorize(value => {
1226
904
  if (value && Object.keys(value).length) {
1227
905
  Object.keys(value).forEach(url => {
1228
- delete value[url].isAllowedMap[address];
906
+ for (const address of addresses) {
907
+ delete value[url].isAllowedMap[address];
908
+ }
1229
909
  });
1230
910
  this.#koniState.setAuthorize(value, resolve);
1231
911
  } else {
@@ -1233,242 +913,50 @@ export default class KoniExtension {
1233
913
  }
1234
914
  });
1235
915
  });
1236
-
1237
- // Set current account to all account
1238
- await new Promise(resolve => {
1239
- const currentAccountInfo = this.#koniState.keyringService.currentAccount;
1240
- this.#koniState.setCurrentAccount({
1241
- currentGenesisHash: (currentAccountInfo === null || currentAccountInfo === void 0 ? void 0 : currentAccountInfo.allGenesisHash) || null,
1242
- address: ALL_ACCOUNT_KEY
1243
- }, resolve);
1244
- });
1245
- await this.#koniState.disableMantaPay(address);
1246
- if (lockAfter) {
916
+ for (const address of addresses) {
917
+ await this.#koniState.disableMantaPay(address);
918
+ }
919
+ if (request.lockAfter) {
1247
920
  this.checkLockAfterMigrate();
1248
921
  }
1249
922
  return true;
1250
923
  }
1251
- seedCreateV2({
1252
- length = SEED_DEFAULT_LENGTH,
1253
- seed: _seed,
1254
- types
1255
- }) {
1256
- const seed = _seed || mnemonicGenerate(length);
1257
- const rs = {
1258
- seed: seed,
1259
- addressMap: {}
1260
- };
1261
- types === null || types === void 0 ? void 0 : types.forEach(type => {
1262
- rs.addressMap[type] = keyring.createFromUri(getSuri(seed, type), {}, type).address;
1263
- });
1264
- return rs;
924
+ seedCreateV2(request) {
925
+ return this.#koniState.keyringService.context.mnemonicCreateV2(request);
1265
926
  }
1266
- seedValidateV2({
1267
- suri,
1268
- types
1269
- }) {
1270
- const {
1271
- phrase
1272
- } = keyExtractSuri(suri);
1273
- if (isHex(phrase)) {
1274
- assert(isHex(phrase, 256), t('Invalid seed phrase. Please try again.'));
1275
- } else {
1276
- // sadly isHex detects as string, so we need a cast here
1277
- assert(SEED_LENGTHS.includes(phrase.split(' ').length), t('Seed phrase needs to contain {{x}} words', {
1278
- replace: {
1279
- x: SEED_LENGTHS.join(', ')
1280
- }
1281
- }));
1282
- assert(mnemonicValidate(phrase), t('Invalid seed phrase. Please try again.'));
1283
- }
1284
- const rs = {
1285
- seed: suri,
1286
- addressMap: {}
1287
- };
1288
- types && types.forEach(type => {
1289
- rs.addressMap[type] = keyring.createFromUri(getSuri(suri, type), {}, type).address;
1290
- });
1291
- return rs;
927
+ seedValidateV2(request) {
928
+ return this.#koniState.keyringService.context.mnemonicValidateV2(request);
1292
929
  }
1293
- _checkValidatePrivateKey({
1294
- suri,
1295
- types
1296
- }, autoAddPrefix = false) {
1297
- const {
1298
- phrase
1299
- } = keyExtractSuri(suri);
1300
- const rs = {
1301
- autoAddPrefix: autoAddPrefix,
1302
- addressMap: {}
1303
- };
1304
- types && types.forEach(type => {
1305
- // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
1306
- rs.addressMap[type] = '';
1307
- });
1308
- if (isHex(phrase) && isHex(phrase, 256)) {
1309
- types && types.forEach(type => {
1310
- rs.addressMap[type] = keyring.createFromUri(getSuri(suri, type), {}, type).address;
1311
- });
1312
- } else {
1313
- rs.autoAddPrefix = false;
1314
- assert(false, t('Invalid private key. Please try again.'));
1315
- }
1316
- return rs;
1317
- }
1318
- metamaskPrivateKeyValidateV2({
1319
- suri,
1320
- types
1321
- }) {
1322
- const isValidSuri = suri.startsWith('0x');
1323
- if (isValidSuri) {
1324
- return this._checkValidatePrivateKey({
1325
- suri,
1326
- types
1327
- });
1328
- } else {
1329
- return this._checkValidatePrivateKey({
1330
- suri: `0x${suri}`,
1331
- types
1332
- }, true);
1333
- }
930
+ privateKeyValidateV2(request) {
931
+ return this.#koniState.keyringService.context.privateKeyValidateV2(request);
1334
932
  }
1335
- deriveV2(parentAddress, suri, metadata) {
1336
- const parentPair = keyring.getPair(parentAddress);
1337
- if (parentPair.isLocked) {
1338
- keyring.unlockPair(parentPair.address);
1339
- }
1340
- try {
1341
- return parentPair.derive(suri, metadata);
1342
- } catch (err) {
1343
- throw new Error(t('"{{suri}}" is not a valid derivation path', {
1344
- replace: {
1345
- suri
1346
- }
1347
- }));
1348
- }
933
+
934
+ /* JSON */
935
+
936
+ parseInfoSingleJson(request) {
937
+ return this.#koniState.keyringService.context.parseInfoSingleJson(request);
1349
938
  }
1350
- derivationCreateV2({
1351
- genesisHash,
1352
- isAllowed,
1353
- name,
1354
- parentAddress,
1355
- suri
1356
- }) {
1357
- const childPair = this.deriveV2(parentAddress, suri, {
1358
- genesisHash,
1359
- name,
1360
- parentAddress,
1361
- suri
1362
- });
1363
- const address = childPair.address;
1364
- this._saveCurrentAccountAddress(address, () => {
1365
- keyring.addPair(childPair, true);
1366
- this._addAddressToAuthList(address, isAllowed);
939
+ async jsonRestoreV2(request) {
940
+ return await this.#koniState.keyringService.context.jsonRestoreV2(request, () => {
941
+ if (this.#alwaysLock) {
942
+ this.keyringLock();
943
+ }
1367
944
  });
1368
- return true;
1369
945
  }
1370
- jsonRestoreV2({
1371
- address,
1372
- file,
1373
- isAllowed,
1374
- password,
1375
- withMasterPassword
1376
- }) {
1377
- const isPasswordValidated = this.validatePassword(file, password);
1378
- const {
1379
- promise,
1380
- resolve
1381
- } = createPromiseHandler();
1382
- if (isPasswordValidated) {
1383
- try {
1384
- this._saveCurrentAccountAddress(address, () => {
1385
- var _newAccount$meta, _newAccount$meta2;
1386
- const newAccount = keyring.restoreAccount(file, password, withMasterPassword);
1387
-
1388
- // genesisHash is not used in SubWallet => reset it to empty string
1389
- if ((_newAccount$meta = newAccount.meta) !== null && _newAccount$meta !== void 0 && _newAccount$meta.genesisHash && ((_newAccount$meta2 = newAccount.meta) === null || _newAccount$meta2 === void 0 ? void 0 : _newAccount$meta2.genesisHash) !== '') {
1390
- keyring.saveAccountMeta(newAccount, {
1391
- ...newAccount.meta,
1392
- genesisHash: ''
1393
- });
1394
- }
1395
- this._addAddressToAuthList(address, isAllowed);
1396
- resolve([address]);
1397
- });
1398
- if (this.#alwaysLock) {
1399
- this.keyringLock();
1400
- }
1401
- return promise;
1402
- } catch (error) {
1403
- throw new Error(error.message);
1404
- }
1405
- } else {
1406
- throw new Error(t('Wrong password'));
1407
- }
946
+ parseInfoMultiJson(request) {
947
+ return this.#koniState.keyringService.context.parseInfoMultiJson(request);
948
+ }
949
+ batchRestoreV2(request) {
950
+ return this.#koniState.keyringService.context.batchRestoreV2(request);
951
+ }
952
+ async batchExportV2(request) {
953
+ return this.#koniState.keyringService.context.batchExportV2(request);
1408
954
  }
1409
- batchRestoreV2({
1410
- accountsInfo,
1411
- file,
1412
- isAllowed,
1413
- password
1414
- }) {
1415
- const addressList = accountsInfo.map(acc => acc.address);
1416
- const isPasswordValidated = this.validatedAccountsPassword(file, password);
1417
- const {
1418
- promise,
1419
- resolve
1420
- } = createPromiseHandler();
1421
- if (isPasswordValidated) {
1422
- try {
1423
- this._saveCurrentAccountAddress(ALL_ACCOUNT_KEY, () => {
1424
- keyring.restoreAccounts(file, password);
1425
- this.#koniState.keyringService.removeNoneHardwareGenesisHash();
1426
- const successAddressList = addressList.reduce((addressList, address) => {
1427
- try {
1428
- const account = keyring.getPair(address);
1429
- if (account) {
1430
- addressList.push(address);
1431
- }
1432
- } catch (error) {
1433
- console.log(error);
1434
- }
1435
- return addressList;
1436
- }, []);
1437
- this._addAddressesToAuthList(successAddressList, isAllowed);
1438
- resolve(successAddressList);
1439
- });
1440
955
 
1441
- // if (this.#alwaysLock) {
1442
- // this.keyringLock();
1443
- // }
956
+ /* JSON */
1444
957
 
1445
- return promise;
1446
- } catch (error) {
1447
- throw new Error(error.message);
1448
- }
1449
- } else {
1450
- throw new Error(t('Wrong password'));
1451
- }
1452
- }
1453
- async batchExportV2({
1454
- addresses,
1455
- password
1456
- }) {
1457
- try {
1458
- if (addresses && !addresses.length) {
1459
- throw new Error(t('No accounts found to export'));
1460
- }
1461
- return {
1462
- exportedJson: await keyring.backupAccounts(password, addresses)
1463
- };
1464
- } catch (e) {
1465
- const error = e;
1466
- if (error.message === 'Invalid master password') {
1467
- throw new Error(t('Wrong password'));
1468
- } else {
1469
- throw error;
1470
- }
1471
- }
958
+ exportAccountProxyMnemonic(request) {
959
+ return this.#koniState.keyringService.context.exportAccountProxyMnemonic(request);
1472
960
  }
1473
961
  getNftCollection() {
1474
962
  return this.#koniState.getNftCollection();
@@ -1610,12 +1098,12 @@ export default class KoniExtension {
1610
1098
  to,
1611
1099
  tokenSlug,
1612
1100
  transferAll,
1101
+ transferBounceable,
1613
1102
  value
1614
1103
  } = inputData;
1615
1104
  const transferTokenInfo = this.#koniState.chainService.getAssetBySlug(tokenSlug);
1616
1105
  const [errors,,] = validateTransferRequest(transferTokenInfo, from, to, value, transferAll);
1617
1106
  const warnings = [];
1618
- const evmApiMap = this.#koniState.getEvmApiMap();
1619
1107
  const chainInfo = this.#koniState.getChainInfo(networkKey);
1620
1108
  const nativeTokenInfo = this.#koniState.getNativeTokenInfo(networkKey);
1621
1109
  const nativeTokenSlug = nativeTokenInfo.slug;
@@ -1638,8 +1126,9 @@ export default class KoniExtension {
1638
1126
  if (isEthereumAddress(from) && isEthereumAddress(to) && _isTokenTransferredByEvm(transferTokenInfo)) {
1639
1127
  chainType = ChainType.EVM;
1640
1128
  const txVal = transferAll ? transferTokenAvailable.value : value || '0';
1641
- const evmApi = evmApiMap[networkKey];
1129
+ const evmApi = this.#koniState.getEvmApi(networkKey);
1642
1130
 
1131
+ // todo: refactor: merge getERC20TransactionObject & getEVMTransactionObject
1643
1132
  // Estimate with EVM API
1644
1133
  if (_isTokenEvmSmartContract(transferTokenInfo) || _isLocalToken(transferTokenInfo)) {
1645
1134
  [transaction, transferAmount.value] = await getERC20TransactionObject(_getContractAddressOfToken(transferTokenInfo), chainInfo, from, to, txVal, !!transferAll, evmApi);
@@ -1649,6 +1138,19 @@ export default class KoniExtension {
1649
1138
  } else if (_isMantaZkAsset(transferTokenInfo)) {
1650
1139
  transaction = undefined;
1651
1140
  transferAmount.value = '0';
1141
+ } else if (isTonAddress(from) && isTonAddress(to) && _isTokenTransferredByTon(transferTokenInfo)) {
1142
+ chainType = ChainType.TON;
1143
+ const tonApi = this.#koniState.getTonApi(networkKey);
1144
+ [transaction, transferAmount.value] = await createTonTransaction({
1145
+ tokenInfo: transferTokenInfo,
1146
+ from,
1147
+ to,
1148
+ networkKey,
1149
+ value: value || '0',
1150
+ transferAll: !!transferAll,
1151
+ // currently not used
1152
+ tonApi
1153
+ });
1652
1154
  } else {
1653
1155
  const substrateApi = this.#koniState.getSubstrateApi(networkKey);
1654
1156
  [transaction, transferAmount.value] = await createTransferExtrinsic({
@@ -1702,6 +1204,13 @@ export default class KoniExtension {
1702
1204
  warnings.length && inputTransaction.warnings.push(...warnings);
1703
1205
  errors.length && inputTransaction.errors.push(...errors);
1704
1206
  };
1207
+ const ignoreWarnings = [];
1208
+ if (transferAll) {
1209
+ ignoreWarnings.push(BasicTxWarningCode.NOT_ENOUGH_EXISTENTIAL_DEPOSIT);
1210
+ }
1211
+ if (transferBounceable) {
1212
+ ignoreWarnings.push(BasicTxWarningCode.IS_BOUNCEABLE_ADDRESS);
1213
+ }
1705
1214
  return this.#koniState.transactionService.handleTransaction({
1706
1215
  errors,
1707
1216
  warnings,
@@ -1712,7 +1221,7 @@ export default class KoniExtension {
1712
1221
  transaction,
1713
1222
  data: inputData,
1714
1223
  extrinsicType,
1715
- ignoreWarnings: transferAll,
1224
+ ignoreWarnings,
1716
1225
  isTransferAll: isTransferNativeToken ? transferAll : false,
1717
1226
  edAsWarning: isTransferNativeToken,
1718
1227
  additionalValidator: additionalValidator
@@ -1725,6 +1234,8 @@ export default class KoniExtension {
1725
1234
  originNetworkKey,
1726
1235
  to,
1727
1236
  tokenSlug,
1237
+ transferAll,
1238
+ transferBounceable,
1728
1239
  value
1729
1240
  } = inputData;
1730
1241
  const originTokenInfo = this.#koniState.getAssetBySlug(tokenSlug);
@@ -1802,6 +1313,13 @@ export default class KoniExtension {
1802
1313
  });
1803
1314
  };
1804
1315
  }
1316
+ const ignoreWarnings = [];
1317
+ if (transferAll) {
1318
+ ignoreWarnings.push(BasicTxWarningCode.NOT_ENOUGH_EXISTENTIAL_DEPOSIT);
1319
+ }
1320
+ if (transferBounceable) {
1321
+ ignoreWarnings.push(BasicTxWarningCode.IS_BOUNCEABLE_ADDRESS);
1322
+ }
1805
1323
  return await this.#koniState.transactionService.handleTransaction({
1806
1324
  url: EXTENSION_REQUEST_URL,
1807
1325
  address: from,
@@ -1811,8 +1329,8 @@ export default class KoniExtension {
1811
1329
  extrinsicType: ExtrinsicType.TRANSFER_XCM,
1812
1330
  chainType: !isSnowBridgeEvmTransfer ? ChainType.SUBSTRATE : ChainType.EVM,
1813
1331
  transferNativeAmount: _isNativeToken(originTokenInfo) ? value : '0',
1814
- ignoreWarnings: inputData.transferAll,
1815
- isTransferAll: inputData.transferAll,
1332
+ ignoreWarnings,
1333
+ isTransferAll: transferAll,
1816
1334
  errors,
1817
1335
  additionalValidator: additionalValidator,
1818
1336
  eventsHandler: eventsHandler
@@ -1982,7 +1500,7 @@ export default class KoniExtension {
1982
1500
  }
1983
1501
  async getNativeTokenMaxTransferable(tokenInfo, networkKey, address) {
1984
1502
  const chainInfo = this.#koniState.chainService.getChainInfoByKey(networkKey);
1985
- const api = _isChainEvmCompatible(chainInfo) && _isTokenTransferredByEvm(tokenInfo) ? this.#koniState.chainService.getEvmApi(networkKey) : this.#koniState.chainService.getSubstrateApi(networkKey);
1503
+ const api = _isChainEvmCompatible(chainInfo) && _isTokenTransferredByEvm(tokenInfo) ? this.#koniState.chainService.getEvmApi(networkKey) : _isChainTonCompatible(chainInfo) && _isTokenTransferredByTon(tokenInfo) ? this.#koniState.chainService.getTonApi(networkKey) : this.#koniState.chainService.getSubstrateApi(networkKey);
1986
1504
  const [mockTxFee, {
1987
1505
  value
1988
1506
  }] = await Promise.all([getTransferMockTxFee(address, chainInfo, tokenInfo, api), this.getAddressTransferableBalance({
@@ -2064,271 +1582,21 @@ export default class KoniExtension {
2064
1582
  }
2065
1583
  return true;
2066
1584
  }
2067
- getAccountMeta({
2068
- address
2069
- }) {
2070
- const pair = keyring.getPair(address);
2071
- assert(pair, t('Unable to find account'));
2072
- return {
2073
- meta: pair.meta
2074
- };
2075
- }
2076
- accountsTie2({
2077
- address,
2078
- genesisHash
2079
- }) {
2080
- return this.#koniState.setAccountTie(address, genesisHash);
1585
+ async accountsCreateExternalV2(request) {
1586
+ return this.#koniState.keyringService.context.accountsCreateExternalV2(request);
2081
1587
  }
2082
- async accountsCreateExternalV2({
2083
- address,
2084
- genesisHash,
2085
- isAllowed,
2086
- isEthereum,
2087
- isReadOnly,
2088
- name
2089
- }) {
2090
- try {
2091
- let result;
2092
- try {
2093
- const exists = keyring.getPair(address);
2094
- if (exists) {
2095
- if (exists.type === (isEthereum ? 'ethereum' : 'sr25519')) {
2096
- return [{
2097
- code: AccountExternalErrorCode.INVALID_ADDRESS,
2098
- message: t('Account exists')
2099
- }];
2100
- }
2101
- }
2102
- } catch (e) {}
2103
- if (isEthereum) {
2104
- const chainInfoMap = this.#koniState.getChainInfoMap();
2105
- let _gen = '';
2106
- if (genesisHash) {
2107
- for (const network of Object.values(chainInfoMap)) {
2108
- if (_getEvmChainId(network) === parseInt(genesisHash)) {
2109
- // TODO: pure EVM chains do not have genesisHash
2110
- _gen = _getSubstrateGenesisHash(network);
2111
- }
2112
- }
2113
- }
2114
- result = keyring.keyring.addFromAddress(address, {
2115
- name,
2116
- isExternal: true,
2117
- isReadOnly,
2118
- genesisHash: _gen
2119
- }, null, 'ethereum');
2120
- keyring.saveAccount(result);
2121
- } else {
2122
- result = keyring.addExternal(address, {
2123
- genesisHash,
2124
- name,
2125
- isReadOnly
2126
- }).pair;
2127
- }
2128
- const _address = result.address;
2129
- await new Promise(resolve => {
2130
- this.#koniState.addAccountRef([_address], () => {
2131
- resolve();
2132
- });
2133
- });
2134
- await new Promise(resolve => {
2135
- this._saveCurrentAccountAddress(_address, () => {
2136
- this._addAddressToAuthList(_address, isAllowed);
2137
- resolve();
2138
- });
2139
- });
2140
- return [];
2141
- } catch (e) {
2142
- return [{
2143
- code: AccountExternalErrorCode.KEYRING_ERROR,
2144
- message: e.message
2145
- }];
2146
- }
1588
+ async accountsCreateHardwareV2(request) {
1589
+ return this.#koniState.keyringService.context.accountsCreateHardwareV2(request);
2147
1590
  }
2148
- async accountsCreateHardwareV2({
2149
- accountIndex,
2150
- address,
2151
- addressOffset,
2152
- genesisHash,
2153
- hardwareType,
2154
- isAllowed,
2155
- name,
2156
- originGenesisHash
2157
- }) {
2158
- const key = keyring.addHardware(address, hardwareType, {
2159
- accountIndex,
2160
- addressOffset,
2161
- genesisHash,
2162
- name,
2163
- originGenesisHash
2164
- });
2165
- const result = key.pair;
2166
- const _address = result.address;
2167
- await new Promise(resolve => {
2168
- this.#koniState.addAccountRef([_address], () => {
2169
- resolve();
2170
- });
2171
- });
2172
- await new Promise(resolve => {
2173
- this._saveCurrentAccountAddress(_address, () => {
2174
- this._addAddressToAuthList(_address, isAllowed || false);
2175
- resolve();
2176
- });
2177
- });
2178
- return true;
1591
+ async accountsCreateHardwareMultiple(request) {
1592
+ return this.#koniState.keyringService.context.accountsCreateHardwareMultiple(request);
2179
1593
  }
2180
- async accountsCreateHardwareMultiple({
2181
- accounts
2182
- }) {
2183
- const addresses = [];
2184
- if (!accounts.length) {
2185
- throw new Error(t("Can't find an account. Please try again"));
2186
- }
2187
- const slugMap = {};
2188
- for (const account of accounts) {
2189
- const {
2190
- accountIndex,
2191
- address,
2192
- addressOffset,
2193
- genesisHash,
2194
- hardwareType,
2195
- isEthereum,
2196
- isGeneric,
2197
- name,
2198
- originGenesisHash
2199
- } = account;
2200
- let result;
2201
- const baseMeta = {
2202
- name,
2203
- hardwareType,
2204
- accountIndex,
2205
- addressOffset,
2206
- genesisHash,
2207
- originGenesisHash,
2208
- isGeneric
2209
- };
2210
- if (isEthereum) {
2211
- result = keyring.keyring.addFromAddress(address, {
2212
- ...baseMeta,
2213
- isExternal: true,
2214
- isHardware: true
2215
- }, null, 'ethereum');
2216
- keyring.saveAccount(result);
2217
- slugMap.ethereum = 'ethereum';
2218
- } else {
2219
- result = keyring.addHardware(address, hardwareType, {
2220
- ...baseMeta,
2221
- availableGenesisHashes: [genesisHash]
2222
- }).pair;
2223
- const [slug] = this.#koniState.findNetworkKeyByGenesisHash(genesisHash);
2224
- if (slug) {
2225
- slugMap[slug] = slug;
2226
- }
2227
- }
2228
- const _address = result.address;
2229
- addresses.push(_address);
2230
- await new Promise(resolve => {
2231
- this._addAddressToAuthList(_address, true);
2232
- resolve();
2233
- });
2234
- }
2235
- const currentAccount = this.#koniState.keyringService.currentAccount;
2236
- const allGenesisHash = (currentAccount === null || currentAccount === void 0 ? void 0 : currentAccount.allGenesisHash) || undefined;
2237
- if (addresses.length <= 1) {
2238
- this.#koniState.setCurrentAccount({
2239
- address: addresses[0],
2240
- currentGenesisHash: null,
2241
- allGenesisHash
2242
- });
2243
- } else {
2244
- this.#koniState.setCurrentAccount({
2245
- address: ALL_ACCOUNT_KEY,
2246
- currentGenesisHash: allGenesisHash || null,
2247
- allGenesisHash
2248
- });
2249
- }
2250
- await new Promise(resolve => {
2251
- this.#koniState.addAccountRef(addresses, () => {
2252
- resolve();
2253
- });
2254
- });
2255
- if (Object.keys(slugMap).length) {
2256
- this.enableChains({
2257
- chainSlugs: Object.keys(slugMap),
2258
- enableTokens: true
2259
- }).catch(console.error);
2260
- }
2261
- return true;
2262
- }
2263
- async accountsCreateWithSecret({
2264
- isAllow,
2265
- isEthereum,
2266
- name,
2267
- publicKey,
2268
- secretKey
2269
- }) {
2270
- try {
2271
- let keyringPair = null;
2272
- if (isEthereum) {
2273
- const _secret = hexStripPrefix(secretKey);
2274
- if (_secret.length === 64) {
2275
- const suri = `0x${_secret}`;
2276
- const {
2277
- phrase
2278
- } = keyExtractSuri(suri);
2279
- if (isHex(phrase) && isHex(phrase, 256)) {
2280
- const type = 'ethereum';
2281
- keyringPair = keyring.addUri(getSuri(suri, type), {
2282
- name: name
2283
- }, type).pair;
2284
- }
2285
- }
2286
- } else {
2287
- keyringPair = keyring.keyring.addFromPair({
2288
- publicKey: hexToU8a(publicKey),
2289
- secretKey: hexToU8a(secretKey)
2290
- }, {
2291
- name
2292
- });
2293
- keyring.addPair(keyringPair, true);
2294
- }
2295
- if (!keyringPair) {
2296
- return {
2297
- success: false,
2298
- errors: [{
2299
- code: AccountExternalErrorCode.KEYRING_ERROR,
2300
- message: t('Cannot create account')
2301
- }]
2302
- };
2303
- }
2304
- const _address = keyringPair.address;
2305
- await new Promise(resolve => {
2306
- this.#koniState.addAccountRef([_address], () => {
2307
- resolve();
2308
- });
2309
- });
2310
- await new Promise(resolve => {
2311
- this._saveCurrentAccountAddress(_address, () => {
2312
- this._addAddressToAuthList(_address, isAllow);
2313
- resolve();
2314
- });
2315
- });
2316
- if (this.#alwaysLock) {
2317
- this.keyringLock();
2318
- }
2319
- return {
2320
- errors: [],
2321
- success: true
2322
- };
2323
- } catch (e) {
2324
- return {
2325
- success: false,
2326
- errors: [{
2327
- code: AccountExternalErrorCode.KEYRING_ERROR,
2328
- message: e.message
2329
- }]
2330
- };
1594
+ async accountsCreateWithSecret(request) {
1595
+ const result = await this.#koniState.keyringService.context.accountsCreateWithSecret(request);
1596
+ if (this.#alwaysLock) {
1597
+ this.keyringLock();
2331
1598
  }
1599
+ return result;
2332
1600
  }
2333
1601
 
2334
1602
  /// External account
@@ -2378,9 +1646,21 @@ export default class KoniExtension {
2378
1646
  });
2379
1647
  return this.#koniState.getConfirmationsQueueSubject().getValue();
2380
1648
  }
1649
+ subscribeConfirmationsTon(id, port) {
1650
+ const cb = createSubscription(id, port);
1651
+ const subscription = this.#koniState.getConfirmationsQueueSubjectTon().subscribe(cb);
1652
+ this.createUnsubscriptionHandle(id, subscription.unsubscribe);
1653
+ port.onDisconnect.addListener(() => {
1654
+ this.cancelSubscription(id);
1655
+ });
1656
+ return this.#koniState.getConfirmationsQueueSubjectTon().getValue();
1657
+ }
2381
1658
  async completeConfirmation(request) {
2382
1659
  return await this.#koniState.completeConfirmation(request);
2383
1660
  }
1661
+ async completeConfirmationTon(request) {
1662
+ return await this.#koniState.completeConfirmationTon(request);
1663
+ }
2384
1664
 
2385
1665
  /// Sign Qr
2386
1666
 
@@ -2474,7 +1754,7 @@ export default class KoniExtension {
2474
1754
  } else if (isAscii(message)) {
2475
1755
  data = `0x${message}`;
2476
1756
  }
2477
- signed = await pair.evmSigner.signMessage(data, 'personal_sign');
1757
+ signed = await pair.evm.signMessage(data, 'personal_sign');
2478
1758
  } else {
2479
1759
  var _signedTranaction$r, _signedTranaction$s, _signedTranaction$v;
2480
1760
  const tx = createTransactionFromRLP(message);
@@ -2501,7 +1781,7 @@ export default class KoniExtension {
2501
1781
  const transaction = new LegacyTransaction(txObject, {
2502
1782
  common
2503
1783
  });
2504
- const signedTranaction = LegacyTransaction.fromSerializedTx(hexToU8a(pair.evmSigner.signTransaction(transaction)));
1784
+ const signedTranaction = LegacyTransaction.fromSerializedTx(hexToU8a(pair.evm.signTransaction(transaction)));
2505
1785
  signed = signatureToHex({
2506
1786
  r: ((_signedTranaction$r = signedTranaction.r) === null || _signedTranaction$r === void 0 ? void 0 : _signedTranaction$r.toString(16)) || '',
2507
1787
  s: ((_signedTranaction$s = signedTranaction.s) === null || _signedTranaction$s === void 0 ? void 0 : _signedTranaction$s.toString(16)) || '',
@@ -2795,8 +2075,7 @@ export default class KoniExtension {
2795
2075
 
2796
2076
  keyringStateSubscribe(id, port) {
2797
2077
  const cb = createSubscription(id, port);
2798
- const keyringStateSubject = this.#koniState.keyringService.keyringStateSubject;
2799
- const subscription = keyringStateSubject.subscribe(value => cb(value));
2078
+ const subscription = this.#koniState.keyringService.keyringStateSubscribe(cb);
2800
2079
  this.createUnsubscriptionHandle(id, subscription.unsubscribe);
2801
2080
  port.onDisconnect.addListener(() => {
2802
2081
  this.cancelSubscription(id);
@@ -2806,47 +2085,14 @@ export default class KoniExtension {
2806
2085
 
2807
2086
  // Change master password
2808
2087
 
2809
- keyringChangeMasterPassword({
2810
- createNew,
2811
- newPassword,
2812
- oldPassword
2813
- }) {
2814
- try {
2815
- // Remove isMasterPassword meta if createNew
2816
- if (createNew && !keyring.keyring.hasMasterPassword) {
2817
- const pairs = keyring.getPairs();
2818
- for (const pair of pairs) {
2819
- if (pair.meta.isInjected) {
2820
- // Empty
2821
- } else {
2822
- const meta = {
2823
- ...pair.meta,
2824
- isMasterPassword: false
2825
- };
2826
- if (!meta.originGenesisHash) {
2827
- meta.genesisHash = '';
2828
- }
2829
- pair.setMeta(meta);
2830
- keyring.saveAccountMeta(pair, pair.meta);
2831
- }
2832
- }
2088
+ keyringChangeMasterPassword(request) {
2089
+ const createNew = request.createNew;
2090
+ const callback = () => {
2091
+ if (this.#alwaysLock && !createNew) {
2092
+ this.keyringLock();
2833
2093
  }
2834
- keyring.changeMasterPassword(newPassword, oldPassword);
2835
- } catch (e) {
2836
- console.error(e);
2837
- return {
2838
- errors: [t(e.message)],
2839
- status: false
2840
- };
2841
- }
2842
- this.#koniState.updateKeyringState();
2843
- if (this.#alwaysLock && !createNew) {
2844
- this.keyringLock();
2845
- }
2846
- return {
2847
- status: true,
2848
- errors: []
2849
2094
  };
2095
+ return this.#koniState.keyringService.context.keyringChangeMasterPassword(request, callback);
2850
2096
  }
2851
2097
 
2852
2098
  // Migrate password
@@ -2860,24 +2106,11 @@ export default class KoniExtension {
2860
2106
  }
2861
2107
  }
2862
2108
  }
2863
- keyringMigrateMasterPassword({
2864
- address,
2865
- password
2866
- }) {
2867
- try {
2868
- keyring.migrateWithMasterPassword(address, password);
2109
+ keyringMigrateMasterPassword(request) {
2110
+ const cb = () => {
2869
2111
  this.checkLockAfterMigrate();
2870
- } catch (e) {
2871
- console.error(e);
2872
- return {
2873
- errors: [e.message],
2874
- status: false
2875
- };
2876
- }
2877
- return {
2878
- status: true,
2879
- errors: []
2880
2112
  };
2113
+ return this.#koniState.keyringService.context.keyringMigrateMasterPassword(request, cb);
2881
2114
  }
2882
2115
 
2883
2116
  // Unlock wallet
@@ -2956,7 +2189,7 @@ export default class KoniExtension {
2956
2189
  request,
2957
2190
  resolve
2958
2191
  } = queued;
2959
- const pair = keyring.getPair(queued.account.address);
2192
+ const pair = keyring.getPair(queued.address);
2960
2193
 
2961
2194
  // unlike queued.account.address the following
2962
2195
  // address is encoded with the default prefix
@@ -3046,162 +2279,24 @@ export default class KoniExtension {
3046
2279
 
3047
2280
  /// Derive account
3048
2281
 
3049
- derivationCreateMultiple({
3050
- isAllowed,
3051
- items,
3052
- parentAddress
3053
- }) {
3054
- const parentPair = keyring.getPair(parentAddress);
3055
- const isEvm = parentPair.type === 'ethereum';
3056
- if (parentPair.isLocked) {
3057
- keyring.unlockPair(parentPair.address);
3058
- }
3059
- const createChild = ({
3060
- name,
3061
- suri
3062
- }) => {
3063
- const meta = {
3064
- name: name,
3065
- parentAddress
3066
- };
3067
- if (isEvm) {
3068
- let index = 0;
3069
- try {
3070
- const reg = /^\d+$/;
3071
- const path = suri.split('//')[1];
3072
- if (reg.test(path)) {
3073
- index = parseInt(path);
3074
- }
3075
- } catch (e) {}
3076
- if (!index) {
3077
- throw Error(t('Invalid derive path'));
3078
- }
3079
- meta.suri = `//${index}`;
3080
- return parentPair.deriveEvm(index, meta);
3081
- } else {
3082
- meta.suri = suri;
3083
- return parentPair.derive(suri, meta);
3084
- }
3085
- };
3086
- const result = [];
3087
- for (const item of items) {
3088
- try {
3089
- const childPair = createChild(item);
3090
- const address = childPair.address;
3091
- keyring.addPair(childPair, true);
3092
- this._addAddressToAuthList(address, isAllowed);
3093
- result.push(childPair);
3094
- } catch (e) {
3095
- console.log(e);
3096
- }
3097
- }
3098
- if (result.length === 1) {
3099
- this._saveCurrentAccountAddress(result[0].address);
3100
- } else {
3101
- this.#koniState.setCurrentAccount({
3102
- address: ALL_ACCOUNT_KEY,
3103
- currentGenesisHash: null
3104
- });
3105
- }
3106
- return true;
2282
+ derivationCreateMultiple(request) {
2283
+ return this.#koniState.keyringService.context.derivationCreateMultiple(request);
3107
2284
  }
3108
- derivationCreateV3({
3109
- address: parentAddress
3110
- }) {
3111
- const parentPair = keyring.getPair(parentAddress);
3112
- const isEvm = parentPair.type === 'ethereum';
3113
- if (parentPair.isLocked) {
3114
- keyring.unlockPair(parentPair.address);
3115
- }
3116
- const pairs = keyring.getPairs();
3117
- const children = pairs.filter(p => p.meta.parentAddress === parentAddress);
3118
- const name = `Account ${pairs.length}`;
3119
- let index = isEvm ? 1 : 0;
3120
- let valid = false;
3121
- do {
3122
- const exist = children.find(p => p.meta.suri === `//${index}`);
3123
- if (exist) {
3124
- index++;
3125
- } else {
3126
- valid = true;
3127
- }
3128
- } while (!valid);
3129
- const meta = {
3130
- name,
3131
- parentAddress,
3132
- suri: `//${index}`
3133
- };
3134
- const childPair = isEvm ? parentPair.deriveEvm(index, meta) : parentPair.derive(meta.suri, meta);
3135
- const address = childPair.address;
3136
- this._saveCurrentAccountAddress(address, () => {
3137
- keyring.addPair(childPair, true);
3138
- this._addAddressToAuthList(address, true);
3139
- });
2285
+ derivationCreateV3(request) {
2286
+ const rs = this.#koniState.keyringService.context.derivationAccountProxyCreate(request);
3140
2287
  if (this.#alwaysLock) {
3141
2288
  this.keyringLock();
3142
2289
  }
3143
- return true;
2290
+ return rs;
3144
2291
  }
3145
- validateDerivePath({
3146
- parentAddress,
3147
- suri
3148
- }) {
3149
- const parentPair = keyring.getPair(parentAddress);
3150
- const isEvm = parentPair.type === 'ethereum';
3151
- if (parentPair.isLocked) {
3152
- keyring.unlockPair(parentPair.address);
3153
- }
3154
- const meta = {
3155
- parentAddress
3156
- };
3157
- let childPair;
3158
- if (isEvm) {
3159
- let index = 0;
3160
- try {
3161
- const reg = /^\d+$/;
3162
- const path = suri.split('//')[1];
3163
- if (reg.test(path)) {
3164
- index = parseInt(path);
3165
- }
3166
- } catch (e) {}
3167
- if (!index) {
3168
- throw Error(t('Invalid derive path'));
3169
- }
3170
- meta.suri = `//${index}`;
3171
- childPair = parentPair.deriveEvm(index, meta);
3172
- } else {
3173
- meta.suri = suri;
3174
- childPair = parentPair.derive(suri, meta);
3175
- }
3176
- return {
3177
- address: childPair.address,
3178
- suri: meta.suri
3179
- };
2292
+ validateDerivePath(request) {
2293
+ return this.#koniState.keyringService.context.validateDerivePath(request);
3180
2294
  }
3181
- getListDeriveAccounts({
3182
- limit,
3183
- page,
3184
- parentAddress
3185
- }) {
3186
- const parentPair = keyring.getPair(parentAddress);
3187
- const isEvm = parentPair.type === 'ethereum';
3188
- if (parentPair.isLocked) {
3189
- keyring.unlockPair(parentPair.address);
3190
- }
3191
- const start = (page - 1) * limit + (isEvm ? 1 : 0);
3192
- const end = start + limit;
3193
- const result = [];
3194
- for (let i = start; i < end; i++) {
3195
- const suri = `//${i}`;
3196
- const pair = isEvm ? parentPair.deriveEvm(i, {}) : parentPair.derive(suri, {});
3197
- result.push({
3198
- address: pair.address,
3199
- suri: suri
3200
- });
3201
- }
3202
- return {
3203
- result: result
3204
- };
2295
+ getDeriveSuggestion(request) {
2296
+ return this.#koniState.keyringService.context.getDeriveSuggestion(request);
2297
+ }
2298
+ getListDeriveAccounts(request) {
2299
+ return this.#koniState.keyringService.context.getListDeriveAccounts(request);
3205
2300
  }
3206
2301
 
3207
2302
  // ChainService -------------------------------------------------
@@ -3563,7 +2658,7 @@ export default class KoniExtension {
3563
2658
  }
3564
2659
  const result = await this.#koniState.enableMantaPay(true, address, password, mnemonic.result);
3565
2660
  this.#skipAutoLock = true;
3566
- await this.saveCurrentAccountAddress({
2661
+ await this.saveCurrentAccountProxy({
3567
2662
  address
3568
2663
  });
3569
2664
  const unsubSyncProgress = await ((_this$koniState$chain = this.#koniState.chainService) === null || _this$koniState$chain === void 0 ? void 0 : (_this$koniState$chain2 = _this$koniState$chain.mantaPay) === null || _this$koniState$chain2 === void 0 ? void 0 : _this$koniState$chain2.subscribeSyncProgress());
@@ -3602,7 +2697,7 @@ export default class KoniExtension {
3602
2697
  return;
3603
2698
  }
3604
2699
  this.#skipAutoLock = true;
3605
- await this.saveCurrentAccountAddress({
2700
+ await this.saveCurrentAccountProxy({
3606
2701
  address
3607
2702
  });
3608
2703
  const unsubSyncProgress = await ((_this$koniState$chain5 = this.#koniState.chainService) === null || _this$koniState$chain5 === void 0 ? void 0 : (_this$koniState$chain6 = _this$koniState$chain5.mantaPay) === null || _this$koniState$chain6 === void 0 ? void 0 : _this$koniState$chain6.subscribeSyncProgress());
@@ -3631,6 +2726,21 @@ export default class KoniExtension {
3631
2726
  async disableMantaPay(address) {
3632
2727
  return this.#koniState.disableMantaPay(address);
3633
2728
  }
2729
+ async isTonBounceableAddress({
2730
+ address,
2731
+ chain
2732
+ }) {
2733
+ try {
2734
+ const tonApi = this.#koniState.getTonApi(chain);
2735
+ const state = await tonApi.getAccountState(address);
2736
+ const isActive = state === 'active';
2737
+ const isBounceable = isBounceableAddress(address);
2738
+ return !isActive && isBounceable;
2739
+ } catch (error) {
2740
+ console.error(`Failed to validate address ${address} on chain ${chain}:`, error);
2741
+ return false;
2742
+ }
2743
+ }
3634
2744
  subscribeMantaPayConfig(id, port) {
3635
2745
  const cb = createSubscription(id, port);
3636
2746
  const mantaPayConfigSubscription = this.#koniState.subscribeMantaPayConfig().subscribe({
@@ -3712,11 +2822,11 @@ export default class KoniExtension {
3712
2822
 
3713
2823
  /// Inject account
3714
2824
  addInjects(request) {
3715
- this.#koniState.keyringService.addInjectAccounts(request.accounts);
2825
+ this.#koniState.keyringService.context.addInjectAccounts(request.accounts);
3716
2826
  return true;
3717
2827
  }
3718
2828
  removeInjects(request) {
3719
- this.#koniState.keyringService.removeInjectAccounts(request.addresses);
2829
+ this.#koniState.keyringService.context.removeInjectAccounts(request.addresses);
3720
2830
  return true;
3721
2831
  }
3722
2832
  async subscribeYieldPoolInfo(id, port) {
@@ -4202,22 +3312,8 @@ export default class KoniExtension {
4202
3312
  case 'pri(ping)':
4203
3313
  return 'pong';
4204
3314
  /// Clone from PolkadotJs
4205
- case 'pri(accounts.create.external)':
4206
- return this.accountsCreateExternal(request);
4207
- case 'pri(accounts.create.hardware)':
4208
- return this.accountsCreateHardware(request);
4209
- case 'pri(accounts.create.suri)':
4210
- return this.accountsCreateSuri(request);
4211
- case 'pri(accounts.changePassword)':
4212
- return this.accountsChangePassword(request);
4213
- case 'pri(accounts.export)':
3315
+ case 'pri(accounts.export.json)':
4214
3316
  return this.accountsExport(request);
4215
- case 'pri(accounts.show)':
4216
- return this.accountsShow(request);
4217
- case 'pri(accounts.subscribe)':
4218
- return this.accountsSubscribe(id, port);
4219
- case 'pri(accounts.validate)':
4220
- return this.accountsValidate(request);
4221
3317
  case 'pri(metadata.approve)':
4222
3318
  return this.metadataApprove(request);
4223
3319
  case 'pri(metadata.get)':
@@ -4228,20 +3324,6 @@ export default class KoniExtension {
4228
3324
  return this.metadataReject(request);
4229
3325
  case 'pri(metadata.requests)':
4230
3326
  return this.metadataSubscribe(id, port);
4231
- case 'pri(derivation.create)':
4232
- return this.derivationCreate(request);
4233
- case 'pri(derivation.validate)':
4234
- return this.derivationValidate(request);
4235
- case 'pri(json.restore)':
4236
- return this.jsonRestore(request);
4237
- case 'pri(json.batchRestore)':
4238
- return this.batchRestore(request);
4239
- case 'pri(json.account.info)':
4240
- return this.jsonGetAccountInfo(request);
4241
- case 'pri(seed.create)':
4242
- return this.seedCreate(request);
4243
- case 'pri(seed.validate)':
4244
- return this.seedValidate(request);
4245
3327
  case 'pri(signing.approve.signature)':
4246
3328
  return this.signingApproveSignature(request);
4247
3329
  case 'pri(signing.cancel)':
@@ -4320,14 +3402,6 @@ export default class KoniExtension {
4320
3402
  return this.getCrowdloanContributions(request);
4321
3403
  case 'pri(crowdloan.getSubscription)':
4322
3404
  return this.subscribeCrowdloan(id, port);
4323
- case 'pri(derivation.createV2)':
4324
- return this.derivationCreateV2(request);
4325
- case 'pri(accounts.batchExportV2)':
4326
- return this.batchExportV2(request);
4327
- case 'pri(json.restoreV2)':
4328
- return await this.jsonRestoreV2(request);
4329
- case 'pri(json.batchRestoreV2)':
4330
- return await this.batchRestoreV2(request);
4331
3405
  case 'pri(nft.getNft)':
4332
3406
  return await this.getNft();
4333
3407
  case 'pri(nft.getSubscription)':
@@ -4403,7 +3477,7 @@ export default class KoniExtension {
4403
3477
  /* Account management */
4404
3478
  // Add account
4405
3479
  case 'pri(accounts.create.suriV2)':
4406
- return await this.accountsCreateSuriV2(request);
3480
+ return this.accountsCreateSuriV2(request);
4407
3481
  case 'pri(accounts.create.externalV2)':
4408
3482
  return await this.accountsCreateExternalV2(request);
4409
3483
  case 'pri(accounts.create.hardwareV2)':
@@ -4412,6 +3486,14 @@ export default class KoniExtension {
4412
3486
  return await this.accountsCreateHardwareMultiple(request);
4413
3487
  case 'pri(accounts.create.withSecret)':
4414
3488
  return await this.accountsCreateWithSecret(request);
3489
+ case 'pri(accounts.json.info)':
3490
+ return this.parseInfoSingleJson(request);
3491
+ case 'pri(accounts.json.restoreV2)':
3492
+ return this.jsonRestoreV2(request);
3493
+ case 'pri(accounts.json.batchInfo)':
3494
+ return this.parseInfoMultiJson(request);
3495
+ case 'pri(accounts.json.batchRestoreV2)':
3496
+ return this.batchRestoreV2(request);
4415
3497
  case 'pri(seed.createV2)':
4416
3498
  return this.seedCreateV2(request);
4417
3499
 
@@ -4420,43 +3502,54 @@ export default class KoniExtension {
4420
3502
  return await this.accountsForgetOverride(request);
4421
3503
 
4422
3504
  // Validate account
4423
- case 'pri(seed.validateV2)':
3505
+ case 'pri(accounts.validate.seed)':
4424
3506
  return this.seedValidateV2(request);
4425
- case 'pri(privateKey.validateV2)':
4426
- return this.metamaskPrivateKeyValidateV2(request);
4427
- case 'pri(accounts.checkPublicAndSecretKey)':
3507
+ case 'pri(accounts.validate.privateKey)':
3508
+ return this.privateKeyValidateV2(request);
3509
+ case 'pri(accounts.validate.substrate.publicAndPrivateKey)':
4428
3510
  return this.checkPublicAndSecretKey(request);
3511
+ case 'pri(accounts.validate.name)':
3512
+ return this.checkNameExists(request);
3513
+ case 'pri(accounts.validate.bounceable)':
3514
+ return this.isTonBounceableAddress(request);
4429
3515
 
4430
3516
  // Export account
4431
- case 'pri(accounts.exportPrivateKey)':
3517
+ case 'pri(accounts.export.privateKey)':
4432
3518
  return this.accountExportPrivateKey(request);
3519
+ case 'pri(accounts.export.json.batch)':
3520
+ return this.batchExportV2(request);
3521
+ case 'pri(accounts.export.mnemonic)':
3522
+ return this.exportAccountProxyMnemonic(request);
4433
3523
 
4434
3524
  // Subscribe account
4435
- case 'pri(accounts.subscribeWithCurrentAddress)':
3525
+ case 'pri(accounts.subscribeWithCurrentProxy)':
4436
3526
  return await this.accountsGetAllWithCurrentAddress(id, port);
4437
3527
  case 'pri(accounts.subscribeAccountsInputAddress)':
4438
- return this.accountsGetAll(id, port);
3528
+ return this.subscribeInputAddressData(request, id, port);
4439
3529
 
4440
3530
  // Save current account
4441
- case 'pri(currentAccount.saveAddress)':
4442
- return await this.saveCurrentAccountAddress(request);
4443
- case 'pri(accounts.updateCurrentAddress)':
4444
- return this.updateCurrentAccountAddress(request);
3531
+ case 'pri(accounts.saveCurrentProxy)':
3532
+ return await this.saveCurrentAccountProxy(request);
4445
3533
 
4446
3534
  // Edit account
4447
3535
  case 'pri(accounts.edit)':
4448
3536
  return this.accountsEdit(request);
3537
+ // Ton change wallet contract version
3538
+ case 'pri(accounts.ton.version.map)':
3539
+ return this.tonGetAllTonWalletContractVersion(request);
3540
+ case 'pri(accounts.ton.version.change)':
3541
+ return this.tonAccountChangeWalletContractVersion(request);
4449
3542
 
4450
3543
  // Save contact address
4451
- case 'pri(accounts.saveRecent)':
3544
+ case 'pri(addressBook.saveRecent)':
4452
3545
  return this.saveRecentAccount(request);
4453
- case 'pri(accounts.editContact)':
3546
+ case 'pri(addressBook.edit)':
4454
3547
  return this.editContactAccount(request);
4455
- case 'pri(accounts.deleteContact)':
3548
+ case 'pri(addressBook.delete)':
4456
3549
  return this.deleteContactAccount(request);
4457
3550
 
4458
3551
  // Subscribe address
4459
- case 'pri(accounts.subscribeAddresses)':
3552
+ case 'pri(addressBook.subscribe)':
4460
3553
  return this.subscribeAddresses(id, port);
4461
3554
  case 'pri(accounts.resolveDomainToAddress)':
4462
3555
  return await this.resolveDomainByAddress(request);
@@ -4514,8 +3607,6 @@ export default class KoniExtension {
4514
3607
  return await this.updateAssetSetting(request);
4515
3608
  case 'pri(transfer.getMaxTransferable)':
4516
3609
  return this.getMaxTransferable(request);
4517
- case 'pri(transfer.subscribeMaxTransferable)':
4518
- return this.getMaxTransferable(request);
4519
3610
  case 'pri(freeBalance.get)':
4520
3611
  return this.getAddressTransferableBalance(request);
4521
3612
  case 'pri(freeBalance.subscribe)':
@@ -4524,8 +3615,6 @@ export default class KoniExtension {
4524
3615
  return this.cancelSubscription(request);
4525
3616
  case 'pri(chainService.recoverSubstrateApi)':
4526
3617
  return this.recoverDotSamaApi(request);
4527
- case 'pri(accounts.get.meta)':
4528
- return this.getAccountMeta(request);
4529
3618
 
4530
3619
  /// Send NFT
4531
3620
  case 'pri(evmNft.submitTransaction)':
@@ -4558,12 +3647,14 @@ export default class KoniExtension {
4558
3647
  return this.rejectExternalRequest(request);
4559
3648
  case 'pri(account.external.resolve)':
4560
3649
  return this.resolveQrTransfer(request);
4561
- case 'pri(accounts.tie)':
4562
- return this.accountsTie2(request);
4563
3650
  case 'pri(confirmations.subscribe)':
4564
3651
  return this.subscribeConfirmations(id, port);
3652
+ case 'pri(confirmationsTon.subscribe)':
3653
+ return this.subscribeConfirmationsTon(id, port);
4565
3654
  case 'pri(confirmations.complete)':
4566
3655
  return await this.completeConfirmation(request);
3656
+ case 'pri(confirmationsTon.complete)':
3657
+ return await this.completeConfirmationTon(request);
4567
3658
 
4568
3659
  /// Stake
4569
3660
  case 'pri(bonding.getBondingOptions)':
@@ -4624,14 +3715,16 @@ export default class KoniExtension {
4624
3715
  return this.signingApprovePasswordV2(request);
4625
3716
 
4626
3717
  /// Derive account
4627
- case 'pri(derivation.validateV2)':
3718
+ case 'pri(accounts.derive.validateV2)':
4628
3719
  return this.validateDerivePath(request);
4629
- case 'pri(derivation.getList)':
3720
+ case 'pri(accounts.derive.getList)':
4630
3721
  return this.getListDeriveAccounts(request);
4631
- case 'pri(derivation.create.multiple)':
3722
+ case 'pri(accounts.derive.create.multiple)':
4632
3723
  return this.derivationCreateMultiple(request);
4633
- case 'pri(derivation.createV3)':
3724
+ case 'pri(accounts.derive.createV3)':
4634
3725
  return this.derivationCreateV3(request);
3726
+ case 'pri(accounts.derive.suggestion)':
3727
+ return this.getDeriveSuggestion(request);
4635
3728
 
4636
3729
  // Transaction
4637
3730
  case 'pri(transactions.getOne)':
@@ -4737,6 +3830,8 @@ export default class KoniExtension {
4737
3830
  return this.#koniState.migrateMV3LocalStorage(request);
4738
3831
  case 'pri(database.setLocalStorage)':
4739
3832
  return this.#koniState.setStorageFromWS(request);
3833
+ case 'pri(database.getLocalStorage)':
3834
+ return this.#koniState.getStorageFromWS(request);
4740
3835
  /* Database */
4741
3836
 
4742
3837
  /* Swap service */