@bitpay-labs/bitcore-wallet-service 11.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (949) hide show
  1. package/.coveralls.yml +1 -0
  2. package/.travis.yml +27 -0
  3. package/DKG-flow.png +0 -0
  4. package/DSG-flow.png +0 -0
  5. package/Dockerfile +18 -0
  6. package/Installation.md +138 -0
  7. package/LICENCE +22 -0
  8. package/Makefile +5 -0
  9. package/README.md +429 -0
  10. package/TSS.md +136 -0
  11. package/bws.example.config.js +451 -0
  12. package/package.json +119 -0
  13. package/scripts/checkCopayerIds.js +118 -0
  14. package/scripts/clean_db.mongodb +5 -0
  15. package/scripts/deleteDupAddresses.mongo +6 -0
  16. package/scripts/deleteWallet.mongo +18 -0
  17. package/scripts/delme.ts +468 -0
  18. package/scripts/findEmail.js +32 -0
  19. package/scripts/fixAddressType.js +98 -0
  20. package/scripts/getSolStats2.js +81 -0
  21. package/scripts/migrateToNamedTestnets.js +191 -0
  22. package/scripts/migrateWalletsNetwork.js +204 -0
  23. package/scripts/preview-email.js +359 -0
  24. package/scripts/purgeNotifications.js +107 -0
  25. package/scripts/resetV8registration.mongo +21 -0
  26. package/scripts/v8tool-list.ts +93 -0
  27. package/scripts/v8tool.ts +82 -0
  28. package/scripts/walletStats.js +290 -0
  29. package/src/app.ts +28 -0
  30. package/src/bcmonitor/bcmonitor.ts +11 -0
  31. package/src/bws.ts +85 -0
  32. package/src/cleanfiatrates/cleanfiatrates.ts +9 -0
  33. package/src/config.ts +540 -0
  34. package/src/db/.empty +0 -0
  35. package/src/deprecated-serverMessages.ts +15 -0
  36. package/src/emailservice/emailservice.ts +11 -0
  37. package/src/externalservices/banxa.ts +261 -0
  38. package/src/externalservices/changelly.ts +371 -0
  39. package/src/externalservices/coingecko.ts +453 -0
  40. package/src/externalservices/moonpay.ts +435 -0
  41. package/src/externalservices/oneInch.ts +169 -0
  42. package/src/externalservices/ramp.ts +259 -0
  43. package/src/externalservices/sardine.ts +237 -0
  44. package/src/externalservices/simplex.ts +281 -0
  45. package/src/externalservices/thorswap.ts +197 -0
  46. package/src/externalservices/transak.ts +320 -0
  47. package/src/externalservices/wyre.ts +131 -0
  48. package/src/fiatrateservice/fiatrateservice.ts +15 -0
  49. package/src/index.ts +9 -0
  50. package/src/lib/bchaddresstranslator.ts +59 -0
  51. package/src/lib/blockchainexplorer.ts +84 -0
  52. package/src/lib/blockchainexplorers/v8/client.ts +177 -0
  53. package/src/lib/blockchainexplorers/v8.ts +730 -0
  54. package/src/lib/blockchainmonitor.ts +423 -0
  55. package/src/lib/chain/arb/index.ts +8 -0
  56. package/src/lib/chain/base/index.ts +8 -0
  57. package/src/lib/chain/bch/index.ts +40 -0
  58. package/src/lib/chain/btc/index.ts +991 -0
  59. package/src/lib/chain/doge/index.ts +387 -0
  60. package/src/lib/chain/eth/abi-erc20.ts +222 -0
  61. package/src/lib/chain/eth/abi-invoice.ts +277 -0
  62. package/src/lib/chain/eth/index.ts +657 -0
  63. package/src/lib/chain/index.ts +178 -0
  64. package/src/lib/chain/ltc/index.ts +9 -0
  65. package/src/lib/chain/matic/index.ts +8 -0
  66. package/src/lib/chain/op/index.ts +8 -0
  67. package/src/lib/chain/sol/index.ts +349 -0
  68. package/src/lib/chain/xrp/index.ts +338 -0
  69. package/src/lib/cleanfiatrates.ts +160 -0
  70. package/src/lib/common/constants.ts +231 -0
  71. package/src/lib/common/defaults.ts +436 -0
  72. package/src/lib/common/index.ts +11 -0
  73. package/src/lib/common/services.ts +43 -0
  74. package/src/lib/common/utils.ts +506 -0
  75. package/src/lib/emailservice.ts +741 -0
  76. package/src/lib/errors/clienterror.ts +44 -0
  77. package/src/lib/errors/errordefinitions.ts +158 -0
  78. package/src/lib/expressapp.ts +2415 -0
  79. package/src/lib/fiatrateproviders/bitpay.ts +20 -0
  80. package/src/lib/fiatrateproviders/bitstamp.ts +16 -0
  81. package/src/lib/fiatrateproviders/index.ts +8 -0
  82. package/src/lib/fiatrateproviders/provider.d.ts +10 -0
  83. package/src/lib/fiatrateservice.ts +338 -0
  84. package/src/lib/iconsconfig.ts +31 -0
  85. package/src/lib/index.ts +0 -0
  86. package/src/lib/lock.ts +112 -0
  87. package/src/lib/logger.ts +77 -0
  88. package/src/lib/messagebroker.ts +42 -0
  89. package/src/lib/model/address.ts +226 -0
  90. package/src/lib/model/addressmanager.ts +138 -0
  91. package/src/lib/model/advertisement.ts +84 -0
  92. package/src/lib/model/copayer.ts +162 -0
  93. package/src/lib/model/email.ts +103 -0
  94. package/src/lib/model/index.ts +12 -0
  95. package/src/lib/model/notification.ts +77 -0
  96. package/src/lib/model/preferences.ts +79 -0
  97. package/src/lib/model/pushnotificationsub.ts +50 -0
  98. package/src/lib/model/session.ts +65 -0
  99. package/src/lib/model/tsskeygen.ts +154 -0
  100. package/src/lib/model/tsssign.ts +136 -0
  101. package/src/lib/model/txconfirmationsub.ts +50 -0
  102. package/src/lib/model/txnote.ts +60 -0
  103. package/src/lib/model/txproposal.ts +561 -0
  104. package/src/lib/model/txproposal_legacy.ts +236 -0
  105. package/src/lib/model/txproposalaction.ts +48 -0
  106. package/src/lib/model/wallet.ts +359 -0
  107. package/src/lib/notificationbroadcaster.ts +17 -0
  108. package/src/lib/pushnotificationsservice.ts +802 -0
  109. package/src/lib/routes/helpers/error.ts +51 -0
  110. package/src/lib/routes/helpers/index.ts +1 -0
  111. package/src/lib/routes/middleware/authRequest.ts +117 -0
  112. package/src/lib/routes/middleware/authTssRequest.ts +66 -0
  113. package/src/lib/routes/middleware/createWalletLimiter.ts +21 -0
  114. package/src/lib/routes/middleware/log.ts +63 -0
  115. package/src/lib/routes/middleware/verifyTssMessage.ts +37 -0
  116. package/src/lib/routes/tss.ts +123 -0
  117. package/src/lib/server.ts +5342 -0
  118. package/src/lib/stats.ts +174 -0
  119. package/src/lib/storage.ts +1919 -0
  120. package/src/lib/tss.ts +446 -0
  121. package/src/lib/updatestats.ts +291 -0
  122. package/src/messagebroker/messagebroker.ts +18 -0
  123. package/src/pushnotificationsservice/pushnotificationsservice.ts +11 -0
  124. package/src/serverMessages.ts +30 -0
  125. package/src/types/chain.d.ts +62 -0
  126. package/src/types/emailservice.d.ts +11 -0
  127. package/src/types/expressapp.d.ts +15 -0
  128. package/src/types/externalservices.d.ts +41 -0
  129. package/src/types/notifications.d.ts +8 -0
  130. package/src/types/pushnotificationservice.d.ts +51 -0
  131. package/src/types/server.d.ts +24 -0
  132. package/src/updatestats/updatestats.ts +10 -0
  133. package/start-docker.sh +18 -0
  134. package/start.sh +38 -0
  135. package/static/images/down-arrow-green.png +0 -0
  136. package/static/images/failed-icon.png +0 -0
  137. package/static/images/green-check.png +0 -0
  138. package/static/images/person-plus.png +0 -0
  139. package/static/images/up-arrow-gray.png +0 -0
  140. package/static/images/writing-gray.png +0 -0
  141. package/stop.sh +19 -0
  142. package/templates/en/new_copayer.html +13 -0
  143. package/templates/en/new_copayer.plain +2 -0
  144. package/templates/en/new_incoming_tx.html +11 -0
  145. package/templates/en/new_incoming_tx.plain +2 -0
  146. package/templates/en/new_incoming_tx_testnet.html +13 -0
  147. package/templates/en/new_incoming_tx_testnet.plain +2 -0
  148. package/templates/en/new_outgoing_tx.html +11 -0
  149. package/templates/en/new_outgoing_tx.plain +2 -0
  150. package/templates/en/new_tx_proposal.html +13 -0
  151. package/templates/en/new_tx_proposal.plain +2 -0
  152. package/templates/en/new_zero_outgoing_tx.html +13 -0
  153. package/templates/en/new_zero_outgoing_tx.plain +2 -0
  154. package/templates/en/tx_confirmation.html +13 -0
  155. package/templates/en/tx_confirmation.plain +2 -0
  156. package/templates/en/tx_confirmation_receiver.html +13 -0
  157. package/templates/en/tx_confirmation_receiver.plain +2 -0
  158. package/templates/en/tx_confirmation_sender.html +13 -0
  159. package/templates/en/tx_confirmation_sender.plain +2 -0
  160. package/templates/en/txp_finally_rejected.html +13 -0
  161. package/templates/en/txp_finally_rejected.plain +2 -0
  162. package/templates/en/wallet_complete.html +13 -0
  163. package/templates/en/wallet_complete.plain +2 -0
  164. package/templates/es/new_copayer.html +13 -0
  165. package/templates/es/new_copayer.plain +2 -0
  166. package/templates/es/new_incoming_tx.html +11 -0
  167. package/templates/es/new_incoming_tx.plain +2 -0
  168. package/templates/es/new_incoming_tx_testnet.html +13 -0
  169. package/templates/es/new_incoming_tx_testnet.plain +2 -0
  170. package/templates/es/new_outgoing_tx.html +11 -0
  171. package/templates/es/new_outgoing_tx.plain +2 -0
  172. package/templates/es/new_tx_proposal.html +13 -0
  173. package/templates/es/new_tx_proposal.plain +2 -0
  174. package/templates/es/new_zero_outgoing_tx.html +13 -0
  175. package/templates/es/new_zero_outgoing_tx.plain +2 -0
  176. package/templates/es/tx_confirmation.html +13 -0
  177. package/templates/es/tx_confirmation.plain +2 -0
  178. package/templates/es/tx_confirmation_receiver.html +13 -0
  179. package/templates/es/tx_confirmation_receiver.plain +2 -0
  180. package/templates/es/tx_confirmation_sender.html +13 -0
  181. package/templates/es/tx_confirmation_sender.plain +2 -0
  182. package/templates/es/txp_finally_rejected.html +13 -0
  183. package/templates/es/txp_finally_rejected.plain +2 -0
  184. package/templates/es/wallet_complete.html +13 -0
  185. package/templates/es/wallet_complete.plain +2 -0
  186. package/templates/fr/new_copayer.html +13 -0
  187. package/templates/fr/new_copayer.plain +2 -0
  188. package/templates/fr/new_incoming_tx.html +11 -0
  189. package/templates/fr/new_incoming_tx.plain +2 -0
  190. package/templates/fr/new_incoming_tx_testnet.html +13 -0
  191. package/templates/fr/new_incoming_tx_testnet.plain +2 -0
  192. package/templates/fr/new_outgoing_tx.html +11 -0
  193. package/templates/fr/new_outgoing_tx.plain +2 -0
  194. package/templates/fr/new_tx_proposal.html +13 -0
  195. package/templates/fr/new_tx_proposal.plain +2 -0
  196. package/templates/fr/new_zero_outgoing_tx.html +13 -0
  197. package/templates/fr/new_zero_outgoing_tx.plain +2 -0
  198. package/templates/fr/tx_confirmation.html +13 -0
  199. package/templates/fr/tx_confirmation.plain +2 -0
  200. package/templates/fr/tx_confirmation_receiver.html +13 -0
  201. package/templates/fr/tx_confirmation_receiver.plain +2 -0
  202. package/templates/fr/tx_confirmation_sender.html +13 -0
  203. package/templates/fr/tx_confirmation_sender.plain +2 -0
  204. package/templates/fr/txp_finally_rejected.html +13 -0
  205. package/templates/fr/txp_finally_rejected.plain +2 -0
  206. package/templates/fr/wallet_complete.html +13 -0
  207. package/templates/fr/wallet_complete.plain +2 -0
  208. package/templates/ja/new_copayer.html +13 -0
  209. package/templates/ja/new_copayer.plain +2 -0
  210. package/templates/ja/new_incoming_tx.html +11 -0
  211. package/templates/ja/new_incoming_tx.plain +2 -0
  212. package/templates/ja/new_incoming_tx_testnet.html +13 -0
  213. package/templates/ja/new_incoming_tx_testnet.plain +2 -0
  214. package/templates/ja/new_outgoing_tx.html +11 -0
  215. package/templates/ja/new_outgoing_tx.plain +2 -0
  216. package/templates/ja/new_tx_proposal.html +13 -0
  217. package/templates/ja/new_tx_proposal.plain +2 -0
  218. package/templates/ja/new_zero_outgoing_tx.html +13 -0
  219. package/templates/ja/new_zero_outgoing_tx.plain +2 -0
  220. package/templates/ja/tx_confirmation.html +13 -0
  221. package/templates/ja/tx_confirmation.plain +2 -0
  222. package/templates/ja/tx_confirmation_receiver.html +13 -0
  223. package/templates/ja/tx_confirmation_receiver.plain +2 -0
  224. package/templates/ja/tx_confirmation_sender.html +13 -0
  225. package/templates/ja/tx_confirmation_sender.plain +2 -0
  226. package/templates/ja/txp_finally_rejected.html +13 -0
  227. package/templates/ja/txp_finally_rejected.plain +2 -0
  228. package/templates/ja/wallet_complete.html +13 -0
  229. package/templates/ja/wallet_complete.plain +2 -0
  230. package/templates/master-template.html +494 -0
  231. package/test/bchaddresstranslator.test.ts +50 -0
  232. package/test/blockchainexplorer.test.ts +66 -0
  233. package/test/chain/bch.test.ts +115 -0
  234. package/test/chain/btc.test.ts +331 -0
  235. package/test/chain/doge.test.ts +347 -0
  236. package/test/chain/eth.test.ts +21 -0
  237. package/test/chain/ltc.test.ts +328 -0
  238. package/test/chain/matic.test.ts +21 -0
  239. package/test/chain/xrp.test.ts +206 -0
  240. package/test/expressapp.test.ts +513 -0
  241. package/test/integration/bcmonitor.test.ts +381 -0
  242. package/test/integration/cashAddrMigration.test.ts +127 -0
  243. package/test/integration/data/tss/2of3/index.ts +3 -0
  244. package/test/integration/data/tss/2of3/party0.key.ts +5 -0
  245. package/test/integration/data/tss/2of3/party1.key.ts +5 -0
  246. package/test/integration/data/tss/2of3/party2.key.ts +5 -0
  247. package/test/integration/emailnotifications.test.ts +864 -0
  248. package/test/integration/externalservices/banxa.test.ts +373 -0
  249. package/test/integration/externalservices/changelly.test.ts +515 -0
  250. package/test/integration/externalservices/coinGecko.test.ts +284 -0
  251. package/test/integration/externalservices/moonpay.test.ts +569 -0
  252. package/test/integration/externalservices/oneInch.test.ts +162 -0
  253. package/test/integration/externalservices/ramp.test.ts +475 -0
  254. package/test/integration/externalservices/sardine.test.ts +352 -0
  255. package/test/integration/externalservices/simplex.test.ts +384 -0
  256. package/test/integration/externalservices/thorswap.test.ts +309 -0
  257. package/test/integration/externalservices/transak.test.ts +410 -0
  258. package/test/integration/externalservices/wyre.test.ts +270 -0
  259. package/test/integration/fiatrateservice.test.ts +979 -0
  260. package/test/integration/helpers.ts +694 -0
  261. package/test/integration/history.test.ts +1142 -0
  262. package/test/integration/hugetx.ts +6986 -0
  263. package/test/integration/pushNotifications.test.ts +1523 -0
  264. package/test/integration/server.test.ts +10740 -0
  265. package/test/integration/tss.test.ts +340 -0
  266. package/test/lock.test.ts +224 -0
  267. package/test/model/address.test.ts +187 -0
  268. package/test/model/addressmanager.test.ts +146 -0
  269. package/test/model/advertisement.test.ts +31 -0
  270. package/test/model/copayer.test.ts +131 -0
  271. package/test/model/txproposal.test.ts +185 -0
  272. package/test/model/wallet.test.ts +191 -0
  273. package/test/storage.test.ts +430 -0
  274. package/test/test-config.ts +12 -0
  275. package/test/testdata.ts +388 -0
  276. package/test/utils.test.ts +457 -0
  277. package/test/v8.test.ts +332 -0
  278. package/ts_build/package.json +119 -0
  279. package/ts_build/scripts/delme.d.ts +2 -0
  280. package/ts_build/scripts/delme.d.ts.map +1 -0
  281. package/ts_build/scripts/delme.js +453 -0
  282. package/ts_build/scripts/delme.js.map +1 -0
  283. package/ts_build/scripts/v8tool-list.d.ts +3 -0
  284. package/ts_build/scripts/v8tool-list.d.ts.map +1 -0
  285. package/ts_build/scripts/v8tool-list.js +80 -0
  286. package/ts_build/scripts/v8tool-list.js.map +1 -0
  287. package/ts_build/scripts/v8tool.d.ts +3 -0
  288. package/ts_build/scripts/v8tool.d.ts.map +1 -0
  289. package/ts_build/scripts/v8tool.js +69 -0
  290. package/ts_build/scripts/v8tool.js.map +1 -0
  291. package/ts_build/src/app.d.ts +3 -0
  292. package/ts_build/src/app.d.ts.map +1 -0
  293. package/ts_build/src/app.js +29 -0
  294. package/ts_build/src/app.js.map +1 -0
  295. package/ts_build/src/bcmonitor/bcmonitor.d.ts +3 -0
  296. package/ts_build/src/bcmonitor/bcmonitor.d.ts.map +1 -0
  297. package/ts_build/src/bcmonitor/bcmonitor.js +16 -0
  298. package/ts_build/src/bcmonitor/bcmonitor.js.map +1 -0
  299. package/ts_build/src/bws.d.ts +3 -0
  300. package/ts_build/src/bws.d.ts.map +1 -0
  301. package/ts_build/src/bws.js +98 -0
  302. package/ts_build/src/bws.js.map +1 -0
  303. package/ts_build/src/cleanfiatrates/cleanfiatrates.d.ts +3 -0
  304. package/ts_build/src/cleanfiatrates/cleanfiatrates.d.ts.map +1 -0
  305. package/ts_build/src/cleanfiatrates/cleanfiatrates.js +11 -0
  306. package/ts_build/src/cleanfiatrates/cleanfiatrates.js.map +1 -0
  307. package/ts_build/src/config.d.ts +3 -0
  308. package/ts_build/src/config.d.ts.map +1 -0
  309. package/ts_build/src/config.js +256 -0
  310. package/ts_build/src/config.js.map +1 -0
  311. package/ts_build/src/deprecated-serverMessages.d.ts +10 -0
  312. package/ts_build/src/deprecated-serverMessages.d.ts.map +1 -0
  313. package/ts_build/src/deprecated-serverMessages.js +20 -0
  314. package/ts_build/src/deprecated-serverMessages.js.map +1 -0
  315. package/ts_build/src/emailservice/emailservice.d.ts +3 -0
  316. package/ts_build/src/emailservice/emailservice.d.ts.map +1 -0
  317. package/ts_build/src/emailservice/emailservice.js +16 -0
  318. package/ts_build/src/emailservice/emailservice.js.map +1 -0
  319. package/ts_build/src/externalservices/banxa.d.ts +11 -0
  320. package/ts_build/src/externalservices/banxa.d.ts.map +1 -0
  321. package/ts_build/src/externalservices/banxa.js +254 -0
  322. package/ts_build/src/externalservices/banxa.js.map +1 -0
  323. package/ts_build/src/externalservices/changelly.d.ts +18 -0
  324. package/ts_build/src/externalservices/changelly.d.ts.map +1 -0
  325. package/ts_build/src/externalservices/changelly.js +356 -0
  326. package/ts_build/src/externalservices/changelly.js.map +1 -0
  327. package/ts_build/src/externalservices/coingecko.d.ts +43 -0
  328. package/ts_build/src/externalservices/coingecko.d.ts.map +1 -0
  329. package/ts_build/src/externalservices/coingecko.js +416 -0
  330. package/ts_build/src/externalservices/coingecko.js.map +1 -0
  331. package/ts_build/src/externalservices/moonpay.d.ts +19 -0
  332. package/ts_build/src/externalservices/moonpay.d.ts.map +1 -0
  333. package/ts_build/src/externalservices/moonpay.js +397 -0
  334. package/ts_build/src/externalservices/moonpay.js.map +1 -0
  335. package/ts_build/src/externalservices/oneInch.d.ts +11 -0
  336. package/ts_build/src/externalservices/oneInch.d.ts.map +1 -0
  337. package/ts_build/src/externalservices/oneInch.js +179 -0
  338. package/ts_build/src/externalservices/oneInch.js.map +1 -0
  339. package/ts_build/src/externalservices/ramp.d.ts +12 -0
  340. package/ts_build/src/externalservices/ramp.d.ts.map +1 -0
  341. package/ts_build/src/externalservices/ramp.js +256 -0
  342. package/ts_build/src/externalservices/ramp.js.map +1 -0
  343. package/ts_build/src/externalservices/sardine.d.ts +10 -0
  344. package/ts_build/src/externalservices/sardine.d.ts.map +1 -0
  345. package/ts_build/src/externalservices/sardine.js +232 -0
  346. package/ts_build/src/externalservices/sardine.js.map +1 -0
  347. package/ts_build/src/externalservices/simplex.d.ts +11 -0
  348. package/ts_build/src/externalservices/simplex.d.ts.map +1 -0
  349. package/ts_build/src/externalservices/simplex.js +261 -0
  350. package/ts_build/src/externalservices/simplex.js.map +1 -0
  351. package/ts_build/src/externalservices/thorswap.d.ts +9 -0
  352. package/ts_build/src/externalservices/thorswap.d.ts.map +1 -0
  353. package/ts_build/src/externalservices/thorswap.js +206 -0
  354. package/ts_build/src/externalservices/thorswap.js.map +1 -0
  355. package/ts_build/src/externalservices/transak.d.ts +13 -0
  356. package/ts_build/src/externalservices/transak.d.ts.map +1 -0
  357. package/ts_build/src/externalservices/transak.js +311 -0
  358. package/ts_build/src/externalservices/transak.js.map +1 -0
  359. package/ts_build/src/externalservices/wyre.d.ts +7 -0
  360. package/ts_build/src/externalservices/wyre.d.ts.map +1 -0
  361. package/ts_build/src/externalservices/wyre.js +144 -0
  362. package/ts_build/src/externalservices/wyre.js.map +1 -0
  363. package/ts_build/src/fiatrateservice/fiatrateservice.d.ts +3 -0
  364. package/ts_build/src/fiatrateservice/fiatrateservice.d.ts.map +1 -0
  365. package/ts_build/src/fiatrateservice/fiatrateservice.js +20 -0
  366. package/ts_build/src/fiatrateservice/fiatrateservice.js.map +1 -0
  367. package/ts_build/src/index.d.ts +8 -0
  368. package/ts_build/src/index.d.ts.map +1 -0
  369. package/ts_build/src/index.js +11 -0
  370. package/ts_build/src/index.js.map +1 -0
  371. package/ts_build/src/lib/bchaddresstranslator.d.ts +5 -0
  372. package/ts_build/src/lib/bchaddresstranslator.d.ts.map +1 -0
  373. package/ts_build/src/lib/bchaddresstranslator.js +66 -0
  374. package/ts_build/src/lib/bchaddresstranslator.js.map +1 -0
  375. package/ts_build/src/lib/blockchainexplorer.d.ts +3 -0
  376. package/ts_build/src/lib/blockchainexplorer.d.ts.map +1 -0
  377. package/ts_build/src/lib/blockchainexplorer.js +87 -0
  378. package/ts_build/src/lib/blockchainexplorer.js.map +1 -0
  379. package/ts_build/src/lib/blockchainexplorers/v8/client.d.ts +31 -0
  380. package/ts_build/src/lib/blockchainexplorers/v8/client.d.ts.map +1 -0
  381. package/ts_build/src/lib/blockchainexplorers/v8/client.js +191 -0
  382. package/ts_build/src/lib/blockchainexplorers/v8/client.js.map +1 -0
  383. package/ts_build/src/lib/blockchainexplorers/v8.d.ts +91 -0
  384. package/ts_build/src/lib/blockchainexplorers/v8.d.ts.map +1 -0
  385. package/ts_build/src/lib/blockchainexplorers/v8.js +662 -0
  386. package/ts_build/src/lib/blockchainexplorers/v8.js.map +1 -0
  387. package/ts_build/src/lib/blockchainmonitor.d.ts +32 -0
  388. package/ts_build/src/lib/blockchainmonitor.d.ts.map +1 -0
  389. package/ts_build/src/lib/blockchainmonitor.js +413 -0
  390. package/ts_build/src/lib/blockchainmonitor.js.map +1 -0
  391. package/ts_build/src/lib/chain/arb/index.d.ts +5 -0
  392. package/ts_build/src/lib/chain/arb/index.d.ts.map +1 -0
  393. package/ts_build/src/lib/chain/arb/index.js +12 -0
  394. package/ts_build/src/lib/chain/arb/index.js.map +1 -0
  395. package/ts_build/src/lib/chain/base/index.d.ts +5 -0
  396. package/ts_build/src/lib/chain/base/index.d.ts.map +1 -0
  397. package/ts_build/src/lib/chain/base/index.js +12 -0
  398. package/ts_build/src/lib/chain/base/index.js.map +1 -0
  399. package/ts_build/src/lib/chain/bch/index.d.ts +9 -0
  400. package/ts_build/src/lib/chain/bch/index.d.ts.map +1 -0
  401. package/ts_build/src/lib/chain/bch/index.js +43 -0
  402. package/ts_build/src/lib/chain/bch/index.js.map +1 -0
  403. package/ts_build/src/lib/chain/btc/index.d.ts +65 -0
  404. package/ts_build/src/lib/chain/btc/index.d.ts.map +1 -0
  405. package/ts_build/src/lib/chain/btc/index.js +829 -0
  406. package/ts_build/src/lib/chain/btc/index.js.map +1 -0
  407. package/ts_build/src/lib/chain/doge/index.d.ts +9 -0
  408. package/ts_build/src/lib/chain/doge/index.d.ts.map +1 -0
  409. package/ts_build/src/lib/chain/doge/index.js +338 -0
  410. package/ts_build/src/lib/chain/doge/index.js.map +1 -0
  411. package/ts_build/src/lib/chain/eth/abi-erc20.d.ts +39 -0
  412. package/ts_build/src/lib/chain/eth/abi-erc20.d.ts.map +1 -0
  413. package/ts_build/src/lib/chain/eth/abi-erc20.js +226 -0
  414. package/ts_build/src/lib/chain/eth/abi-erc20.js.map +1 -0
  415. package/ts_build/src/lib/chain/eth/abi-invoice.d.ts +42 -0
  416. package/ts_build/src/lib/chain/eth/abi-invoice.d.ts.map +1 -0
  417. package/ts_build/src/lib/chain/eth/abi-invoice.js +281 -0
  418. package/ts_build/src/lib/chain/eth/abi-invoice.js.map +1 -0
  419. package/ts_build/src/lib/chain/eth/index.d.ts +66 -0
  420. package/ts_build/src/lib/chain/eth/index.d.ts.map +1 -0
  421. package/ts_build/src/lib/chain/eth/index.js +516 -0
  422. package/ts_build/src/lib/chain/eth/index.js.map +1 -0
  423. package/ts_build/src/lib/chain/index.d.ts +40 -0
  424. package/ts_build/src/lib/chain/index.d.ts.map +1 -0
  425. package/ts_build/src/lib/chain/index.js +143 -0
  426. package/ts_build/src/lib/chain/index.js.map +1 -0
  427. package/ts_build/src/lib/chain/ltc/index.d.ts +6 -0
  428. package/ts_build/src/lib/chain/ltc/index.d.ts.map +1 -0
  429. package/ts_build/src/lib/chain/ltc/index.js +12 -0
  430. package/ts_build/src/lib/chain/ltc/index.js.map +1 -0
  431. package/ts_build/src/lib/chain/matic/index.d.ts +5 -0
  432. package/ts_build/src/lib/chain/matic/index.d.ts.map +1 -0
  433. package/ts_build/src/lib/chain/matic/index.js +12 -0
  434. package/ts_build/src/lib/chain/matic/index.js.map +1 -0
  435. package/ts_build/src/lib/chain/op/index.d.ts +5 -0
  436. package/ts_build/src/lib/chain/op/index.d.ts.map +1 -0
  437. package/ts_build/src/lib/chain/op/index.js +12 -0
  438. package/ts_build/src/lib/chain/op/index.js.map +1 -0
  439. package/ts_build/src/lib/chain/sol/index.d.ts +52 -0
  440. package/ts_build/src/lib/chain/sol/index.d.ts.map +1 -0
  441. package/ts_build/src/lib/chain/sol/index.js +305 -0
  442. package/ts_build/src/lib/chain/sol/index.js.map +1 -0
  443. package/ts_build/src/lib/chain/xrp/index.d.ts +46 -0
  444. package/ts_build/src/lib/chain/xrp/index.d.ts.map +1 -0
  445. package/ts_build/src/lib/chain/xrp/index.js +300 -0
  446. package/ts_build/src/lib/chain/xrp/index.js.map +1 -0
  447. package/ts_build/src/lib/cleanfiatrates.d.ts +13 -0
  448. package/ts_build/src/lib/cleanfiatrates.d.ts.map +1 -0
  449. package/ts_build/src/lib/cleanfiatrates.js +176 -0
  450. package/ts_build/src/lib/cleanfiatrates.js.map +1 -0
  451. package/ts_build/src/lib/common/constants.d.ts +387 -0
  452. package/ts_build/src/lib/common/constants.d.ts.map +1 -0
  453. package/ts_build/src/lib/common/constants.js +234 -0
  454. package/ts_build/src/lib/common/constants.js.map +1 -0
  455. package/ts_build/src/lib/common/defaults.d.ts +326 -0
  456. package/ts_build/src/lib/common/defaults.d.ts.map +1 -0
  457. package/ts_build/src/lib/common/defaults.js +356 -0
  458. package/ts_build/src/lib/common/defaults.js.map +1 -0
  459. package/ts_build/src/lib/common/index.d.ts +793 -0
  460. package/ts_build/src/lib/common/index.d.ts.map +1 -0
  461. package/ts_build/src/lib/common/index.js +14 -0
  462. package/ts_build/src/lib/common/index.js.map +1 -0
  463. package/ts_build/src/lib/common/services.d.ts +34 -0
  464. package/ts_build/src/lib/common/services.d.ts.map +1 -0
  465. package/ts_build/src/lib/common/services.js +44 -0
  466. package/ts_build/src/lib/common/services.js.map +1 -0
  467. package/ts_build/src/lib/common/utils.d.ts +47 -0
  468. package/ts_build/src/lib/common/utils.d.ts.map +1 -0
  469. package/ts_build/src/lib/common/utils.js +385 -0
  470. package/ts_build/src/lib/common/utils.js.map +1 -0
  471. package/ts_build/src/lib/emailservice.d.ts +62 -0
  472. package/ts_build/src/lib/emailservice.d.ts.map +1 -0
  473. package/ts_build/src/lib/emailservice.js +727 -0
  474. package/ts_build/src/lib/emailservice.js.map +1 -0
  475. package/ts_build/src/lib/errors/clienterror.d.ts +11 -0
  476. package/ts_build/src/lib/errors/clienterror.d.ts.map +1 -0
  477. package/ts_build/src/lib/errors/clienterror.js +46 -0
  478. package/ts_build/src/lib/errors/clienterror.js.map +1 -0
  479. package/ts_build/src/lib/errors/errordefinitions.d.ts +76 -0
  480. package/ts_build/src/lib/errors/errordefinitions.d.ts.map +1 -0
  481. package/ts_build/src/lib/errors/errordefinitions.js +82 -0
  482. package/ts_build/src/lib/errors/errordefinitions.js.map +1 -0
  483. package/ts_build/src/lib/expressapp.d.ts +8 -0
  484. package/ts_build/src/lib/expressapp.d.ts.map +1 -0
  485. package/ts_build/src/lib/expressapp.js +2221 -0
  486. package/ts_build/src/lib/expressapp.js.map +1 -0
  487. package/ts_build/src/lib/fiatrateproviders/bitpay.d.ts +3 -0
  488. package/ts_build/src/lib/fiatrateproviders/bitpay.d.ts.map +1 -0
  489. package/ts_build/src/lib/fiatrateproviders/bitpay.js +22 -0
  490. package/ts_build/src/lib/fiatrateproviders/bitpay.js.map +1 -0
  491. package/ts_build/src/lib/fiatrateproviders/bitstamp.d.ts +3 -0
  492. package/ts_build/src/lib/fiatrateproviders/bitstamp.d.ts.map +1 -0
  493. package/ts_build/src/lib/fiatrateproviders/bitstamp.js +18 -0
  494. package/ts_build/src/lib/fiatrateproviders/bitstamp.js.map +1 -0
  495. package/ts_build/src/lib/fiatrateproviders/index.d.ts +3 -0
  496. package/ts_build/src/lib/fiatrateproviders/index.d.ts.map +1 -0
  497. package/ts_build/src/lib/fiatrateproviders/index.js +8 -0
  498. package/ts_build/src/lib/fiatrateproviders/index.js.map +1 -0
  499. package/ts_build/src/lib/fiatrateservice.d.ts +18 -0
  500. package/ts_build/src/lib/fiatrateservice.d.ts.map +1 -0
  501. package/ts_build/src/lib/fiatrateservice.js +313 -0
  502. package/ts_build/src/lib/fiatrateservice.js.map +1 -0
  503. package/ts_build/src/lib/iconsconfig.d.ts +2 -0
  504. package/ts_build/src/lib/iconsconfig.d.ts.map +1 -0
  505. package/ts_build/src/lib/iconsconfig.js +31 -0
  506. package/ts_build/src/lib/iconsconfig.js.map +1 -0
  507. package/ts_build/src/lib/index.d.ts +1 -0
  508. package/ts_build/src/lib/index.d.ts.map +1 -0
  509. package/ts_build/src/lib/index.js +1 -0
  510. package/ts_build/src/lib/index.js.map +1 -0
  511. package/ts_build/src/lib/lock.d.ts +14 -0
  512. package/ts_build/src/lib/lock.d.ts.map +1 -0
  513. package/ts_build/src/lib/lock.js +55 -0
  514. package/ts_build/src/lib/lock.js.map +1 -0
  515. package/ts_build/src/lib/logger.d.ts +7 -0
  516. package/ts_build/src/lib/logger.d.ts.map +1 -0
  517. package/ts_build/src/lib/logger.js +95 -0
  518. package/ts_build/src/lib/logger.js.map +1 -0
  519. package/ts_build/src/lib/messagebroker.d.ts +11 -0
  520. package/ts_build/src/lib/messagebroker.d.ts.map +1 -0
  521. package/ts_build/src/lib/messagebroker.js +77 -0
  522. package/ts_build/src/lib/messagebroker.js.map +1 -0
  523. package/ts_build/src/lib/model/address.d.ts +47 -0
  524. package/ts_build/src/lib/model/address.d.ts.map +1 -0
  525. package/ts_build/src/lib/model/address.js +158 -0
  526. package/ts_build/src/lib/model/address.js.map +1 -0
  527. package/ts_build/src/lib/model/addressmanager.d.ts +41 -0
  528. package/ts_build/src/lib/model/addressmanager.d.ts.map +1 -0
  529. package/ts_build/src/lib/model/addressmanager.js +103 -0
  530. package/ts_build/src/lib/model/addressmanager.js.map +1 -0
  531. package/ts_build/src/lib/model/advertisement.d.ts +38 -0
  532. package/ts_build/src/lib/model/advertisement.d.ts.map +1 -0
  533. package/ts_build/src/lib/model/advertisement.js +68 -0
  534. package/ts_build/src/lib/model/advertisement.js.map +1 -0
  535. package/ts_build/src/lib/model/copayer.d.ts +48 -0
  536. package/ts_build/src/lib/model/copayer.d.ts.map +1 -0
  537. package/ts_build/src/lib/model/copayer.js +116 -0
  538. package/ts_build/src/lib/model/copayer.js.map +1 -0
  539. package/ts_build/src/lib/model/email.d.ts +23 -0
  540. package/ts_build/src/lib/model/email.d.ts.map +1 -0
  541. package/ts_build/src/lib/model/email.js +84 -0
  542. package/ts_build/src/lib/model/email.js.map +1 -0
  543. package/ts_build/src/lib/model/index.d.ts +13 -0
  544. package/ts_build/src/lib/model/index.d.ts.map +1 -0
  545. package/ts_build/src/lib/model/index.js +28 -0
  546. package/ts_build/src/lib/model/index.js.map +1 -0
  547. package/ts_build/src/lib/model/notification.d.ts +23 -0
  548. package/ts_build/src/lib/model/notification.d.ts.map +1 -0
  549. package/ts_build/src/lib/model/notification.js +40 -0
  550. package/ts_build/src/lib/model/notification.js.map +1 -0
  551. package/ts_build/src/lib/model/preferences.d.ts +37 -0
  552. package/ts_build/src/lib/model/preferences.d.ts.map +1 -0
  553. package/ts_build/src/lib/model/preferences.js +61 -0
  554. package/ts_build/src/lib/model/preferences.js.map +1 -0
  555. package/ts_build/src/lib/model/pushnotificationsub.d.ts +23 -0
  556. package/ts_build/src/lib/model/pushnotificationsub.d.ts.map +1 -0
  557. package/ts_build/src/lib/model/pushnotificationsub.js +40 -0
  558. package/ts_build/src/lib/model/pushnotificationsub.js.map +1 -0
  559. package/ts_build/src/lib/model/session.d.ts +22 -0
  560. package/ts_build/src/lib/model/session.d.ts.map +1 -0
  561. package/ts_build/src/lib/model/session.js +52 -0
  562. package/ts_build/src/lib/model/session.js.map +1 -0
  563. package/ts_build/src/lib/model/tsskeygen.d.ts +67 -0
  564. package/ts_build/src/lib/model/tsskeygen.d.ts.map +1 -0
  565. package/ts_build/src/lib/model/tsskeygen.js +69 -0
  566. package/ts_build/src/lib/model/tsskeygen.js.map +1 -0
  567. package/ts_build/src/lib/model/tsssign.d.ts +70 -0
  568. package/ts_build/src/lib/model/tsssign.d.ts.map +1 -0
  569. package/ts_build/src/lib/model/tsssign.js +54 -0
  570. package/ts_build/src/lib/model/tsssign.js.map +1 -0
  571. package/ts_build/src/lib/model/txconfirmationsub.d.ts +23 -0
  572. package/ts_build/src/lib/model/txconfirmationsub.d.ts.map +1 -0
  573. package/ts_build/src/lib/model/txconfirmationsub.js +40 -0
  574. package/ts_build/src/lib/model/txconfirmationsub.js.map +1 -0
  575. package/ts_build/src/lib/model/txnote.d.ts +23 -0
  576. package/ts_build/src/lib/model/txnote.d.ts.map +1 -0
  577. package/ts_build/src/lib/model/txnote.js +46 -0
  578. package/ts_build/src/lib/model/txnote.js.map +1 -0
  579. package/ts_build/src/lib/model/txproposal.d.ts +196 -0
  580. package/ts_build/src/lib/model/txproposal.d.ts.map +1 -0
  581. package/ts_build/src/lib/model/txproposal.js +382 -0
  582. package/ts_build/src/lib/model/txproposal.js.map +1 -0
  583. package/ts_build/src/lib/model/txproposal_legacy.d.ts +93 -0
  584. package/ts_build/src/lib/model/txproposal_legacy.d.ts.map +1 -0
  585. package/ts_build/src/lib/model/txproposal_legacy.js +185 -0
  586. package/ts_build/src/lib/model/txproposal_legacy.js.map +1 -0
  587. package/ts_build/src/lib/model/txproposalaction.d.ts +21 -0
  588. package/ts_build/src/lib/model/txproposalaction.d.ts.map +1 -0
  589. package/ts_build/src/lib/model/txproposalaction.js +37 -0
  590. package/ts_build/src/lib/model/txproposalaction.js.map +1 -0
  591. package/ts_build/src/lib/model/wallet.d.ts +110 -0
  592. package/ts_build/src/lib/model/wallet.d.ts.map +1 -0
  593. package/ts_build/src/lib/model/wallet.js +224 -0
  594. package/ts_build/src/lib/model/wallet.js.map +1 -0
  595. package/ts_build/src/lib/notificationbroadcaster.d.ts +6 -0
  596. package/ts_build/src/lib/notificationbroadcaster.d.ts.map +1 -0
  597. package/ts_build/src/lib/notificationbroadcaster.js +19 -0
  598. package/ts_build/src/lib/notificationbroadcaster.js.map +1 -0
  599. package/ts_build/src/lib/pushnotificationsservice.d.ts +56 -0
  600. package/ts_build/src/lib/pushnotificationsservice.d.ts.map +1 -0
  601. package/ts_build/src/lib/pushnotificationsservice.js +721 -0
  602. package/ts_build/src/lib/pushnotificationsservice.js.map +1 -0
  603. package/ts_build/src/lib/routes/helpers/error.d.ts +10 -0
  604. package/ts_build/src/lib/routes/helpers/error.d.ts.map +1 -0
  605. package/ts_build/src/lib/routes/helpers/error.js +54 -0
  606. package/ts_build/src/lib/routes/helpers/error.js.map +1 -0
  607. package/ts_build/src/lib/routes/helpers/index.d.ts +2 -0
  608. package/ts_build/src/lib/routes/helpers/index.d.ts.map +1 -0
  609. package/ts_build/src/lib/routes/helpers/index.js +18 -0
  610. package/ts_build/src/lib/routes/helpers/index.js.map +1 -0
  611. package/ts_build/src/lib/routes/middleware/authRequest.d.ts +6 -0
  612. package/ts_build/src/lib/routes/middleware/authRequest.d.ts.map +1 -0
  613. package/ts_build/src/lib/routes/middleware/authRequest.js +106 -0
  614. package/ts_build/src/lib/routes/middleware/authRequest.js.map +1 -0
  615. package/ts_build/src/lib/routes/middleware/authTssRequest.d.ts +3 -0
  616. package/ts_build/src/lib/routes/middleware/authTssRequest.d.ts.map +1 -0
  617. package/ts_build/src/lib/routes/middleware/authTssRequest.js +56 -0
  618. package/ts_build/src/lib/routes/middleware/authTssRequest.js.map +1 -0
  619. package/ts_build/src/lib/routes/middleware/createWalletLimiter.d.ts +4 -0
  620. package/ts_build/src/lib/routes/middleware/createWalletLimiter.d.ts.map +1 -0
  621. package/ts_build/src/lib/routes/middleware/createWalletLimiter.js +28 -0
  622. package/ts_build/src/lib/routes/middleware/createWalletLimiter.js.map +1 -0
  623. package/ts_build/src/lib/routes/middleware/log.d.ts +9 -0
  624. package/ts_build/src/lib/routes/middleware/log.d.ts.map +1 -0
  625. package/ts_build/src/lib/routes/middleware/log.js +52 -0
  626. package/ts_build/src/lib/routes/middleware/log.js.map +1 -0
  627. package/ts_build/src/lib/routes/middleware/verifyTssMessage.d.ts +2 -0
  628. package/ts_build/src/lib/routes/middleware/verifyTssMessage.d.ts.map +1 -0
  629. package/ts_build/src/lib/routes/middleware/verifyTssMessage.js +34 -0
  630. package/ts_build/src/lib/routes/middleware/verifyTssMessage.js.map +1 -0
  631. package/ts_build/src/lib/routes/tss.d.ts +14 -0
  632. package/ts_build/src/lib/routes/tss.d.ts.map +1 -0
  633. package/ts_build/src/lib/routes/tss.js +120 -0
  634. package/ts_build/src/lib/routes/tss.js.map +1 -0
  635. package/ts_build/src/lib/server.d.ts +250 -0
  636. package/ts_build/src/lib/server.d.ts.map +1 -0
  637. package/ts_build/src/lib/server.js +4115 -0
  638. package/ts_build/src/lib/server.js.map +1 -0
  639. package/ts_build/src/lib/stats.d.ts +17 -0
  640. package/ts_build/src/lib/stats.d.ts.map +1 -0
  641. package/ts_build/src/lib/stats.js +203 -0
  642. package/ts_build/src/lib/stats.js.map +1 -0
  643. package/ts_build/src/lib/storage.d.ts +163 -0
  644. package/ts_build/src/lib/storage.d.ts.map +1 -0
  645. package/ts_build/src/lib/storage.js +1513 -0
  646. package/ts_build/src/lib/storage.js.map +1 -0
  647. package/ts_build/src/lib/tss.d.ts +70 -0
  648. package/ts_build/src/lib/tss.d.ts.map +1 -0
  649. package/ts_build/src/lib/tss.js +379 -0
  650. package/ts_build/src/lib/tss.js.map +1 -0
  651. package/ts_build/src/lib/updatestats.d.ts +16 -0
  652. package/ts_build/src/lib/updatestats.d.ts.map +1 -0
  653. package/ts_build/src/lib/updatestats.js +308 -0
  654. package/ts_build/src/lib/updatestats.js.map +1 -0
  655. package/ts_build/src/messagebroker/messagebroker.d.ts +3 -0
  656. package/ts_build/src/messagebroker/messagebroker.d.ts.map +1 -0
  657. package/ts_build/src/messagebroker/messagebroker.js +20 -0
  658. package/ts_build/src/messagebroker/messagebroker.js.map +1 -0
  659. package/ts_build/src/pushnotificationsservice/pushnotificationsservice.d.ts +3 -0
  660. package/ts_build/src/pushnotificationsservice/pushnotificationsservice.d.ts.map +1 -0
  661. package/ts_build/src/pushnotificationsservice/pushnotificationsservice.js +16 -0
  662. package/ts_build/src/pushnotificationsservice/pushnotificationsservice.js.map +1 -0
  663. package/ts_build/src/serverMessages.d.ts +2 -0
  664. package/ts_build/src/serverMessages.d.ts.map +1 -0
  665. package/ts_build/src/serverMessages.js +35 -0
  666. package/ts_build/src/serverMessages.js.map +1 -0
  667. package/ts_build/src/updatestats/updatestats.d.ts +3 -0
  668. package/ts_build/src/updatestats/updatestats.d.ts.map +1 -0
  669. package/ts_build/src/updatestats/updatestats.js +15 -0
  670. package/ts_build/src/updatestats/updatestats.js.map +1 -0
  671. package/ts_build/templates/en/new_copayer.html +13 -0
  672. package/ts_build/templates/en/new_copayer.plain +2 -0
  673. package/ts_build/templates/en/new_incoming_tx.html +11 -0
  674. package/ts_build/templates/en/new_incoming_tx.plain +2 -0
  675. package/ts_build/templates/en/new_incoming_tx_testnet.html +13 -0
  676. package/ts_build/templates/en/new_incoming_tx_testnet.plain +2 -0
  677. package/ts_build/templates/en/new_outgoing_tx.html +11 -0
  678. package/ts_build/templates/en/new_outgoing_tx.plain +2 -0
  679. package/ts_build/templates/en/new_tx_proposal.html +13 -0
  680. package/ts_build/templates/en/new_tx_proposal.plain +2 -0
  681. package/ts_build/templates/en/new_zero_outgoing_tx.html +13 -0
  682. package/ts_build/templates/en/new_zero_outgoing_tx.plain +2 -0
  683. package/ts_build/templates/en/tx_confirmation.html +13 -0
  684. package/ts_build/templates/en/tx_confirmation.plain +2 -0
  685. package/ts_build/templates/en/tx_confirmation_receiver.html +13 -0
  686. package/ts_build/templates/en/tx_confirmation_receiver.plain +2 -0
  687. package/ts_build/templates/en/tx_confirmation_sender.html +13 -0
  688. package/ts_build/templates/en/tx_confirmation_sender.plain +2 -0
  689. package/ts_build/templates/en/txp_finally_rejected.html +13 -0
  690. package/ts_build/templates/en/txp_finally_rejected.plain +2 -0
  691. package/ts_build/templates/en/wallet_complete.html +13 -0
  692. package/ts_build/templates/en/wallet_complete.plain +2 -0
  693. package/ts_build/templates/es/new_copayer.html +13 -0
  694. package/ts_build/templates/es/new_copayer.plain +2 -0
  695. package/ts_build/templates/es/new_incoming_tx.html +11 -0
  696. package/ts_build/templates/es/new_incoming_tx.plain +2 -0
  697. package/ts_build/templates/es/new_incoming_tx_testnet.html +13 -0
  698. package/ts_build/templates/es/new_incoming_tx_testnet.plain +2 -0
  699. package/ts_build/templates/es/new_outgoing_tx.html +11 -0
  700. package/ts_build/templates/es/new_outgoing_tx.plain +2 -0
  701. package/ts_build/templates/es/new_tx_proposal.html +13 -0
  702. package/ts_build/templates/es/new_tx_proposal.plain +2 -0
  703. package/ts_build/templates/es/new_zero_outgoing_tx.html +13 -0
  704. package/ts_build/templates/es/new_zero_outgoing_tx.plain +2 -0
  705. package/ts_build/templates/es/tx_confirmation.html +13 -0
  706. package/ts_build/templates/es/tx_confirmation.plain +2 -0
  707. package/ts_build/templates/es/tx_confirmation_receiver.html +13 -0
  708. package/ts_build/templates/es/tx_confirmation_receiver.plain +2 -0
  709. package/ts_build/templates/es/tx_confirmation_sender.html +13 -0
  710. package/ts_build/templates/es/tx_confirmation_sender.plain +2 -0
  711. package/ts_build/templates/es/txp_finally_rejected.html +13 -0
  712. package/ts_build/templates/es/txp_finally_rejected.plain +2 -0
  713. package/ts_build/templates/es/wallet_complete.html +13 -0
  714. package/ts_build/templates/es/wallet_complete.plain +2 -0
  715. package/ts_build/templates/fr/new_copayer.html +13 -0
  716. package/ts_build/templates/fr/new_copayer.plain +2 -0
  717. package/ts_build/templates/fr/new_incoming_tx.html +11 -0
  718. package/ts_build/templates/fr/new_incoming_tx.plain +2 -0
  719. package/ts_build/templates/fr/new_incoming_tx_testnet.html +13 -0
  720. package/ts_build/templates/fr/new_incoming_tx_testnet.plain +2 -0
  721. package/ts_build/templates/fr/new_outgoing_tx.html +11 -0
  722. package/ts_build/templates/fr/new_outgoing_tx.plain +2 -0
  723. package/ts_build/templates/fr/new_tx_proposal.html +13 -0
  724. package/ts_build/templates/fr/new_tx_proposal.plain +2 -0
  725. package/ts_build/templates/fr/new_zero_outgoing_tx.html +13 -0
  726. package/ts_build/templates/fr/new_zero_outgoing_tx.plain +2 -0
  727. package/ts_build/templates/fr/tx_confirmation.html +13 -0
  728. package/ts_build/templates/fr/tx_confirmation.plain +2 -0
  729. package/ts_build/templates/fr/tx_confirmation_receiver.html +13 -0
  730. package/ts_build/templates/fr/tx_confirmation_receiver.plain +2 -0
  731. package/ts_build/templates/fr/tx_confirmation_sender.html +13 -0
  732. package/ts_build/templates/fr/tx_confirmation_sender.plain +2 -0
  733. package/ts_build/templates/fr/txp_finally_rejected.html +13 -0
  734. package/ts_build/templates/fr/txp_finally_rejected.plain +2 -0
  735. package/ts_build/templates/fr/wallet_complete.html +13 -0
  736. package/ts_build/templates/fr/wallet_complete.plain +2 -0
  737. package/ts_build/templates/ja/new_copayer.html +13 -0
  738. package/ts_build/templates/ja/new_copayer.plain +2 -0
  739. package/ts_build/templates/ja/new_incoming_tx.html +11 -0
  740. package/ts_build/templates/ja/new_incoming_tx.plain +2 -0
  741. package/ts_build/templates/ja/new_incoming_tx_testnet.html +13 -0
  742. package/ts_build/templates/ja/new_incoming_tx_testnet.plain +2 -0
  743. package/ts_build/templates/ja/new_outgoing_tx.html +11 -0
  744. package/ts_build/templates/ja/new_outgoing_tx.plain +2 -0
  745. package/ts_build/templates/ja/new_tx_proposal.html +13 -0
  746. package/ts_build/templates/ja/new_tx_proposal.plain +2 -0
  747. package/ts_build/templates/ja/new_zero_outgoing_tx.html +13 -0
  748. package/ts_build/templates/ja/new_zero_outgoing_tx.plain +2 -0
  749. package/ts_build/templates/ja/tx_confirmation.html +13 -0
  750. package/ts_build/templates/ja/tx_confirmation.plain +2 -0
  751. package/ts_build/templates/ja/tx_confirmation_receiver.html +13 -0
  752. package/ts_build/templates/ja/tx_confirmation_receiver.plain +2 -0
  753. package/ts_build/templates/ja/tx_confirmation_sender.html +13 -0
  754. package/ts_build/templates/ja/tx_confirmation_sender.plain +2 -0
  755. package/ts_build/templates/ja/txp_finally_rejected.html +13 -0
  756. package/ts_build/templates/ja/txp_finally_rejected.plain +2 -0
  757. package/ts_build/templates/ja/wallet_complete.html +13 -0
  758. package/ts_build/templates/ja/wallet_complete.plain +2 -0
  759. package/ts_build/templates/master-template.html +494 -0
  760. package/ts_build/test/bchaddresstranslator.test.d.ts +2 -0
  761. package/ts_build/test/bchaddresstranslator.test.d.ts.map +1 -0
  762. package/ts_build/test/bchaddresstranslator.test.js +76 -0
  763. package/ts_build/test/bchaddresstranslator.test.js.map +1 -0
  764. package/ts_build/test/blockchainexplorer.test.d.ts +2 -0
  765. package/ts_build/test/blockchainexplorer.test.d.ts.map +1 -0
  766. package/ts_build/test/blockchainexplorer.test.js +98 -0
  767. package/ts_build/test/blockchainexplorer.test.js.map +1 -0
  768. package/ts_build/test/chain/bch.test.d.ts +2 -0
  769. package/ts_build/test/chain/bch.test.d.ts.map +1 -0
  770. package/ts_build/test/chain/bch.test.js +135 -0
  771. package/ts_build/test/chain/bch.test.js.map +1 -0
  772. package/ts_build/test/chain/btc.test.d.ts +2 -0
  773. package/ts_build/test/chain/btc.test.d.ts.map +1 -0
  774. package/ts_build/test/chain/btc.test.js +310 -0
  775. package/ts_build/test/chain/btc.test.js.map +1 -0
  776. package/ts_build/test/chain/doge.test.d.ts +2 -0
  777. package/ts_build/test/chain/doge.test.d.ts.map +1 -0
  778. package/ts_build/test/chain/doge.test.js +343 -0
  779. package/ts_build/test/chain/doge.test.js.map +1 -0
  780. package/ts_build/test/chain/eth.test.d.ts +2 -0
  781. package/ts_build/test/chain/eth.test.d.ts.map +1 -0
  782. package/ts_build/test/chain/eth.test.js +51 -0
  783. package/ts_build/test/chain/eth.test.js.map +1 -0
  784. package/ts_build/test/chain/ltc.test.d.ts +2 -0
  785. package/ts_build/test/chain/ltc.test.d.ts.map +1 -0
  786. package/ts_build/test/chain/ltc.test.js +323 -0
  787. package/ts_build/test/chain/ltc.test.js.map +1 -0
  788. package/ts_build/test/chain/matic.test.d.ts +2 -0
  789. package/ts_build/test/chain/matic.test.d.ts.map +1 -0
  790. package/ts_build/test/chain/matic.test.js +51 -0
  791. package/ts_build/test/chain/matic.test.js.map +1 -0
  792. package/ts_build/test/chain/xrp.test.d.ts +2 -0
  793. package/ts_build/test/chain/xrp.test.d.ts.map +1 -0
  794. package/ts_build/test/chain/xrp.test.js +228 -0
  795. package/ts_build/test/chain/xrp.test.js.map +1 -0
  796. package/ts_build/test/expressapp.test.d.ts +2 -0
  797. package/ts_build/test/expressapp.test.d.ts.map +1 -0
  798. package/ts_build/test/expressapp.test.js +523 -0
  799. package/ts_build/test/expressapp.test.js.map +1 -0
  800. package/ts_build/test/integration/bcmonitor.test.d.ts +2 -0
  801. package/ts_build/test/integration/bcmonitor.test.d.ts.map +1 -0
  802. package/ts_build/test/integration/bcmonitor.test.js +375 -0
  803. package/ts_build/test/integration/bcmonitor.test.js.map +1 -0
  804. package/ts_build/test/integration/cashAddrMigration.test.d.ts +2 -0
  805. package/ts_build/test/integration/cashAddrMigration.test.d.ts.map +1 -0
  806. package/ts_build/test/integration/cashAddrMigration.test.js +147 -0
  807. package/ts_build/test/integration/cashAddrMigration.test.js.map +1 -0
  808. package/ts_build/test/integration/data/tss/2of3/index.d.ts +4 -0
  809. package/ts_build/test/integration/data/tss/2of3/index.d.ts.map +1 -0
  810. package/ts_build/test/integration/data/tss/2of3/index.js +20 -0
  811. package/ts_build/test/integration/data/tss/2of3/index.js.map +1 -0
  812. package/ts_build/test/integration/data/tss/2of3/party0.key.d.ts +6 -0
  813. package/ts_build/test/integration/data/tss/2of3/party0.key.d.ts.map +1 -0
  814. package/ts_build/test/integration/data/tss/2of3/party0.key.js +9 -0
  815. package/ts_build/test/integration/data/tss/2of3/party0.key.js.map +1 -0
  816. package/ts_build/test/integration/data/tss/2of3/party1.key.d.ts +6 -0
  817. package/ts_build/test/integration/data/tss/2of3/party1.key.d.ts.map +1 -0
  818. package/ts_build/test/integration/data/tss/2of3/party1.key.js +9 -0
  819. package/ts_build/test/integration/data/tss/2of3/party1.key.js.map +1 -0
  820. package/ts_build/test/integration/data/tss/2of3/party2.key.d.ts +6 -0
  821. package/ts_build/test/integration/data/tss/2of3/party2.key.d.ts.map +1 -0
  822. package/ts_build/test/integration/data/tss/2of3/party2.key.js +9 -0
  823. package/ts_build/test/integration/data/tss/2of3/party2.key.js.map +1 -0
  824. package/ts_build/test/integration/emailnotifications.test.d.ts +2 -0
  825. package/ts_build/test/integration/emailnotifications.test.d.ts.map +1 -0
  826. package/ts_build/test/integration/emailnotifications.test.js +805 -0
  827. package/ts_build/test/integration/emailnotifications.test.js.map +1 -0
  828. package/ts_build/test/integration/externalservices/banxa.test.d.ts +2 -0
  829. package/ts_build/test/integration/externalservices/banxa.test.d.ts.map +1 -0
  830. package/ts_build/test/integration/externalservices/banxa.test.js +382 -0
  831. package/ts_build/test/integration/externalservices/banxa.test.js.map +1 -0
  832. package/ts_build/test/integration/externalservices/changelly.test.d.ts +2 -0
  833. package/ts_build/test/integration/externalservices/changelly.test.d.ts.map +1 -0
  834. package/ts_build/test/integration/externalservices/changelly.test.js +509 -0
  835. package/ts_build/test/integration/externalservices/changelly.test.js.map +1 -0
  836. package/ts_build/test/integration/externalservices/coinGecko.test.d.ts +2 -0
  837. package/ts_build/test/integration/externalservices/coinGecko.test.d.ts.map +1 -0
  838. package/ts_build/test/integration/externalservices/coinGecko.test.js +295 -0
  839. package/ts_build/test/integration/externalservices/coinGecko.test.js.map +1 -0
  840. package/ts_build/test/integration/externalservices/moonpay.test.d.ts +2 -0
  841. package/ts_build/test/integration/externalservices/moonpay.test.d.ts.map +1 -0
  842. package/ts_build/test/integration/externalservices/moonpay.test.js +567 -0
  843. package/ts_build/test/integration/externalservices/moonpay.test.js.map +1 -0
  844. package/ts_build/test/integration/externalservices/oneInch.test.d.ts +2 -0
  845. package/ts_build/test/integration/externalservices/oneInch.test.d.ts.map +1 -0
  846. package/ts_build/test/integration/externalservices/oneInch.test.js +182 -0
  847. package/ts_build/test/integration/externalservices/oneInch.test.js.map +1 -0
  848. package/ts_build/test/integration/externalservices/ramp.test.d.ts +2 -0
  849. package/ts_build/test/integration/externalservices/ramp.test.d.ts.map +1 -0
  850. package/ts_build/test/integration/externalservices/ramp.test.js +459 -0
  851. package/ts_build/test/integration/externalservices/ramp.test.js.map +1 -0
  852. package/ts_build/test/integration/externalservices/sardine.test.d.ts +2 -0
  853. package/ts_build/test/integration/externalservices/sardine.test.d.ts.map +1 -0
  854. package/ts_build/test/integration/externalservices/sardine.test.js +364 -0
  855. package/ts_build/test/integration/externalservices/sardine.test.js.map +1 -0
  856. package/ts_build/test/integration/externalservices/simplex.test.d.ts +2 -0
  857. package/ts_build/test/integration/externalservices/simplex.test.d.ts.map +1 -0
  858. package/ts_build/test/integration/externalservices/simplex.test.js +383 -0
  859. package/ts_build/test/integration/externalservices/simplex.test.js.map +1 -0
  860. package/ts_build/test/integration/externalservices/thorswap.test.d.ts +2 -0
  861. package/ts_build/test/integration/externalservices/thorswap.test.d.ts.map +1 -0
  862. package/ts_build/test/integration/externalservices/thorswap.test.js +316 -0
  863. package/ts_build/test/integration/externalservices/thorswap.test.js.map +1 -0
  864. package/ts_build/test/integration/externalservices/transak.test.d.ts +2 -0
  865. package/ts_build/test/integration/externalservices/transak.test.d.ts.map +1 -0
  866. package/ts_build/test/integration/externalservices/transak.test.js +409 -0
  867. package/ts_build/test/integration/externalservices/transak.test.js.map +1 -0
  868. package/ts_build/test/integration/externalservices/wyre.test.d.ts +2 -0
  869. package/ts_build/test/integration/externalservices/wyre.test.d.ts.map +1 -0
  870. package/ts_build/test/integration/externalservices/wyre.test.js +281 -0
  871. package/ts_build/test/integration/externalservices/wyre.test.js.map +1 -0
  872. package/ts_build/test/integration/fiatrateservice.test.d.ts +2 -0
  873. package/ts_build/test/integration/fiatrateservice.test.d.ts.map +1 -0
  874. package/ts_build/test/integration/fiatrateservice.test.js +838 -0
  875. package/ts_build/test/integration/fiatrateservice.test.js.map +1 -0
  876. package/ts_build/test/integration/helpers.d.ts +57 -0
  877. package/ts_build/test/integration/helpers.d.ts.map +1 -0
  878. package/ts_build/test/integration/helpers.js +633 -0
  879. package/ts_build/test/integration/helpers.js.map +1 -0
  880. package/ts_build/test/integration/history.test.d.ts +2 -0
  881. package/ts_build/test/integration/history.test.d.ts.map +1 -0
  882. package/ts_build/test/integration/history.test.js +1064 -0
  883. package/ts_build/test/integration/history.test.js.map +1 -0
  884. package/ts_build/test/integration/hugetx.d.ts +46 -0
  885. package/ts_build/test/integration/hugetx.d.ts.map +1 -0
  886. package/ts_build/test/integration/hugetx.js +6459 -0
  887. package/ts_build/test/integration/hugetx.js.map +1 -0
  888. package/ts_build/test/integration/pushNotifications.test.d.ts +2 -0
  889. package/ts_build/test/integration/pushNotifications.test.d.ts.map +1 -0
  890. package/ts_build/test/integration/pushNotifications.test.js +1379 -0
  891. package/ts_build/test/integration/pushNotifications.test.js.map +1 -0
  892. package/ts_build/test/integration/server.test.d.ts +2 -0
  893. package/ts_build/test/integration/server.test.d.ts.map +1 -0
  894. package/ts_build/test/integration/server.test.js +9980 -0
  895. package/ts_build/test/integration/server.test.js.map +1 -0
  896. package/ts_build/test/integration/tss.test.d.ts +2 -0
  897. package/ts_build/test/integration/tss.test.d.ts.map +1 -0
  898. package/ts_build/test/integration/tss.test.js +360 -0
  899. package/ts_build/test/integration/tss.test.js.map +1 -0
  900. package/ts_build/test/lock.test.d.ts +2 -0
  901. package/ts_build/test/lock.test.d.ts.map +1 -0
  902. package/ts_build/test/lock.test.js +226 -0
  903. package/ts_build/test/lock.test.js.map +1 -0
  904. package/ts_build/test/model/address.test.d.ts +2 -0
  905. package/ts_build/test/model/address.test.d.ts.map +1 -0
  906. package/ts_build/test/model/address.test.js +209 -0
  907. package/ts_build/test/model/address.test.js.map +1 -0
  908. package/ts_build/test/model/addressmanager.test.d.ts +2 -0
  909. package/ts_build/test/model/addressmanager.test.d.ts.map +1 -0
  910. package/ts_build/test/model/addressmanager.test.js +178 -0
  911. package/ts_build/test/model/addressmanager.test.js.map +1 -0
  912. package/ts_build/test/model/advertisement.test.d.ts +2 -0
  913. package/ts_build/test/model/advertisement.test.d.ts.map +1 -0
  914. package/ts_build/test/model/advertisement.test.js +61 -0
  915. package/ts_build/test/model/advertisement.test.js.map +1 -0
  916. package/ts_build/test/model/copayer.test.d.ts +2 -0
  917. package/ts_build/test/model/copayer.test.d.ts.map +1 -0
  918. package/ts_build/test/model/copayer.test.js +161 -0
  919. package/ts_build/test/model/copayer.test.js.map +1 -0
  920. package/ts_build/test/model/txproposal.test.d.ts +2 -0
  921. package/ts_build/test/model/txproposal.test.d.ts.map +1 -0
  922. package/ts_build/test/model/txproposal.test.js +198 -0
  923. package/ts_build/test/model/txproposal.test.js.map +1 -0
  924. package/ts_build/test/model/wallet.test.d.ts +2 -0
  925. package/ts_build/test/model/wallet.test.d.ts.map +1 -0
  926. package/ts_build/test/model/wallet.test.js +215 -0
  927. package/ts_build/test/model/wallet.test.js.map +1 -0
  928. package/ts_build/test/storage.test.d.ts +2 -0
  929. package/ts_build/test/storage.test.d.ts.map +1 -0
  930. package/ts_build/test/storage.test.js +433 -0
  931. package/ts_build/test/storage.test.js.map +1 -0
  932. package/ts_build/test/test-config.d.ts +8 -0
  933. package/ts_build/test/test-config.d.ts.map +1 -0
  934. package/ts_build/test/test-config.js +14 -0
  935. package/ts_build/test/test-config.js.map +1 -0
  936. package/ts_build/test/testdata.d.ts +91 -0
  937. package/ts_build/test/testdata.d.ts.map +1 -0
  938. package/ts_build/test/testdata.js +304 -0
  939. package/ts_build/test/testdata.js.map +1 -0
  940. package/ts_build/test/utils.test.d.ts +2 -0
  941. package/ts_build/test/utils.test.d.ts.map +1 -0
  942. package/ts_build/test/utils.test.js +450 -0
  943. package/ts_build/test/utils.test.js.map +1 -0
  944. package/ts_build/test/v8.test.d.ts +2 -0
  945. package/ts_build/test/v8.test.d.ts.map +1 -0
  946. package/ts_build/test/v8.test.js +341 -0
  947. package/ts_build/test/v8.test.js.map +1 -0
  948. package/tsconfig.json +43 -0
  949. package/tsconfig.prod.json +6 -0
@@ -0,0 +1,2415 @@
1
+ import path from 'path';
2
+ import * as async from 'async';
3
+ import compression from 'compression';
4
+ import cors from 'cors';
5
+ import express from 'express';
6
+ import RateLimit from 'express-rate-limit';
7
+ import _ from 'lodash';
8
+ import rp from 'request-promise-native';
9
+ import 'source-map-support/register';
10
+ import config from '../config';
11
+ import * as Types from '../types/expressapp';
12
+ import { Common } from './common';
13
+ import { ClientError } from './errors/clienterror';
14
+ import { Errors } from './errors/errordefinitions';
15
+ import { logger, transports } from './logger';
16
+ import { error } from './routes/helpers';
17
+ import { createWalletLimiter } from './routes/middleware/createWalletLimiter';
18
+ import { LogMiddleware } from './routes/middleware/log';
19
+ import { TssRouter } from './routes/tss';
20
+ import { WalletService } from './server';
21
+ import { Stats } from './stats';
22
+ import type { GetAddressesOpts } from '../types/server';
23
+
24
+ const Defaults = Common.Defaults;
25
+ const Utils = Common.Utils;
26
+
27
+ export class ExpressApp {
28
+ app: express.Express;
29
+
30
+ constructor() {
31
+ this.app = express();
32
+ }
33
+ /**
34
+ * start
35
+ *
36
+ * @param opts.WalletService options for WalletService class
37
+ * @param opts.basePath
38
+ * @param opts.disableLogs
39
+ * @param opts.doNotCheckV8
40
+ * @param {Callback} cb
41
+ */
42
+ start(opts, cb) {
43
+ opts = opts || {};
44
+
45
+ this.app.use(compression());
46
+
47
+ this.app.use((req, res, next) => {
48
+ res.setHeader('Access-Control-Allow-Origin', '*');
49
+ res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, DELETE');
50
+ res.setHeader(
51
+ 'Access-Control-Allow-Headers',
52
+ 'x-signature,x-identity,x-identities,x-session,x-client-version,x-wallet-id,X-Requested-With,Content-Type,Authorization'
53
+ );
54
+ res.setHeader('x-service-version', WalletService.getServiceVersion());
55
+ next();
56
+ });
57
+ const allowCORS = (req, res, next) => {
58
+ if ('OPTIONS' == req.method) {
59
+ res.sendStatus(200);
60
+ res.end();
61
+ return;
62
+ }
63
+ next();
64
+ };
65
+ this.app.use(allowCORS);
66
+ this.app.enable('trust proxy');
67
+
68
+ // handle `abort` https://nodejs.org/api/http.html#http_event_abort
69
+ this.app.use((req, res, next) => {
70
+ req.on('abort', () => {
71
+ logger.warn('Request aborted by the client');
72
+ });
73
+ next();
74
+ });
75
+
76
+ const POST_LIMIT = 1024 * 100; // Max POST 100 KB
77
+ const POST_LIMIT_LARGE = 2 * 1024 * 1024; // Max POST 2 MB
78
+
79
+ this.app.use((req, res, next) => {
80
+ if (req.path.includes('/txproposals') || req.path.includes('/tss/')) {
81
+ // Pushing a lot of utxos to txproposals can make the request much bigger than 100 MB
82
+ return express.json({ limit: POST_LIMIT_LARGE })(req, res, next);
83
+ } else {
84
+ return express.json({ limit: POST_LIMIT })(req, res, next);
85
+ }
86
+ });
87
+
88
+ this.app.use((req, res, next) => {
89
+ if (config.maintenanceOpts.maintenanceMode === true) {
90
+ // send a 503 error, with a message to the bitpay status page
91
+ const errorCode = 503;
92
+ const errorMessage = 'BWS down for maintenance';
93
+ res.status(503).send({ code: errorCode, message: errorMessage });
94
+ } else {
95
+ next();
96
+ }
97
+ });
98
+
99
+ if (opts.disableLogs) {
100
+ for (const transport of transports) {
101
+ transport.level = 'error';
102
+ }
103
+ } else {
104
+ this.app.use(LogMiddleware());
105
+ // morgan.token('walletId', function getId(req) {
106
+ // return req.walletId ? '<' + req.walletId + '>' : '<>';
107
+ // });
108
+
109
+ // const logFormat =
110
+ // ':walletId :remote-addr :date[iso] ":method :url" :status :res[content-length] :response-time ":user-agent" ';
111
+ // const logOpts = {
112
+ // skip(req, res) {
113
+ // if (res.statusCode != 200) return false;
114
+ // return req.path.indexOf('/notifications/') >= 0;
115
+ // },
116
+ // stream: logger.stream
117
+ // };
118
+
119
+ // this.app.use(morgan(logFormat, logOpts));
120
+ }
121
+
122
+ const router = express.Router();
123
+
124
+ error.setOpts(opts);
125
+ const returnError: Types.ReturnErrorFn = error.returnError.bind(error);
126
+
127
+ const logDeprecated: Types.LogDeprecatedFn = req => {
128
+ logger.warn('DEPRECATED', req.method, req.url, '(' + req.header('x-client-version') + ')');
129
+ };
130
+
131
+ const getCredentials: Types.GetCredentialsFn = req => {
132
+ const identity = req.header('x-identity');
133
+ if (!identity) return;
134
+
135
+ return {
136
+ copayerId: identity,
137
+ signature: req.header('x-signature'),
138
+ session: req.header('x-session')
139
+ };
140
+ };
141
+
142
+ const getServer: Types.GetServerFn = (req, _res) => {
143
+ const opts = {
144
+ clientVersion: req.header('x-client-version'),
145
+ userAgent: req.header('user-agent')
146
+ };
147
+ return WalletService.getInstance(opts);
148
+ };
149
+
150
+ const getServerWithAuth: Types.GetServerWithAuthFn = async (req, res, opts, cb) => {
151
+ if (typeof opts === 'function') {
152
+ cb = opts;
153
+ opts = {};
154
+ }
155
+ opts = (opts || {}) as Types.ServerOpts;
156
+
157
+ const credentials = getCredentials(req);
158
+ if (!credentials)
159
+ return returnError(Errors.NOT_AUTHORIZED, res, req);
160
+
161
+ const reqUrl = req.redirectedUrl || req.url;
162
+
163
+ const auth = {
164
+ copayerId: credentials.copayerId,
165
+ message: req.method.toLowerCase() + '|' + reqUrl + '|' + JSON.stringify(req.body),
166
+ signature: credentials.signature,
167
+ clientVersion: req.header('x-client-version'),
168
+ userAgent: req.header('user-agent'),
169
+ walletId: req.header('x-wallet-id'),
170
+ session: undefined
171
+ };
172
+ if (opts.allowSession) {
173
+ auth.session = credentials.session;
174
+ }
175
+ try {
176
+ const server: WalletService = await new Promise((resolve, reject) => {
177
+ WalletService.getInstanceWithAuth(auth, (err, server) => {
178
+ if (err) {
179
+ return reject(err);
180
+ }
181
+
182
+ if (opts.onlySupportStaff && !server.copayerIsSupportStaff) {
183
+ return reject(Errors.NOT_AUTHORIZED);
184
+ }
185
+
186
+ if (server.copayerIsSupportStaff) {
187
+ req.isSupportStaff = true;
188
+ }
189
+
190
+ if (opts.onlyMarketingStaff && !server.copayerIsMarketingStaff) {
191
+ return reject(Errors.NOT_AUTHORIZED);
192
+ }
193
+
194
+ // For logging
195
+ req.walletId = server.walletId;
196
+ req.copayerId = server.copayerId;
197
+
198
+ return resolve(server);
199
+ });
200
+ });
201
+ if (cb) {
202
+ return cb(server);
203
+ }
204
+ return server;
205
+ } catch (err) {
206
+ if (opts.silentFailure) {
207
+ if (cb) {
208
+ return cb(null, err);
209
+ }
210
+ throw err;
211
+ }
212
+ return returnError(err, res, req);
213
+ }
214
+ };
215
+
216
+ /**
217
+ * @description process simultaneous requests based on multiple identities that have the same key, hence, the same signature
218
+ * @param {Request} req
219
+ * @param {Response} res
220
+ * @param {Object} opts
221
+ * @returns Array<Promise>
222
+ */
223
+ const getServerWithMultiAuth: Types.GetServerWithMultiAuthFn = (req, res, opts = {}) => {
224
+ const identities = req.headers['x-identities'] ? req.headers['x-identities'].split(',') : false;
225
+ const signature = req.headers['x-signature'];
226
+ if (!identities || !signature) {
227
+ throw Errors.NOT_AUTHORIZED;
228
+ }
229
+
230
+ if (!Array.isArray(identities)) {
231
+ throw Errors.NOT_AUTHORIZED;
232
+ }
233
+
234
+ // return a list of promises that we can await or chain
235
+ return identities.map(
236
+ id =>
237
+ new Promise((resolve, reject) =>
238
+ getServerWithAuth(
239
+ Object.assign(req, {
240
+ headers: {
241
+ ...req.headers,
242
+ 'x-identity': id
243
+ }
244
+ }),
245
+ res,
246
+ opts,
247
+ (server, err) => (err ? reject(err) : resolve(server))
248
+ )
249
+ )
250
+ );
251
+ };
252
+
253
+
254
+ const ONE_MINUTE = 60;
255
+ // See https://support.cloudflare.com/hc/en-us/articles/115003206852-Understanding-Origin-Cache-Control
256
+ // Case: "▶Cache an asset with revalidation, but allow stale responses if origin server is unreachable"
257
+ function SetPublicCache(res: express.Response, seconds: number) {
258
+ res.setHeader('Cache-Control', `public, max-age=${seconds}, stale-if-error=${10 * seconds}`);
259
+ }
260
+
261
+ // retrieve latest version of copay
262
+ router.get('/latest-version', async (req, res) => {
263
+ SetPublicCache(res, 10 * ONE_MINUTE);
264
+ try {
265
+ res.setHeader('User-Agent', 'copay');
266
+ const options = {
267
+ uri: 'https://api.github.com/repos/bitpay/wallet/releases/latest',
268
+ headers: {
269
+ 'User-Agent': 'Copay'
270
+ },
271
+ json: true
272
+ };
273
+
274
+ let server: WalletService;
275
+ try {
276
+ server = getServer(req, res);
277
+ } catch (ex) {
278
+ return returnError(ex, res, req);
279
+ }
280
+ server.storage.checkAndUseGlobalCache(
281
+ 'latest-copay-version',
282
+ Defaults.COPAY_VERSION_CACHE_DURATION,
283
+ async (err, version) => {
284
+ if (err) {
285
+ res.send(err);
286
+ }
287
+ if (version) {
288
+ res.json({ version });
289
+ } else {
290
+ try {
291
+ const htmlString = await rp(options);
292
+ if (htmlString['tag_name']) {
293
+ server.storage.storeGlobalCache('latest-copay-version', htmlString['tag_name'], () => {
294
+ res.json({ version: htmlString['tag_name'] });
295
+ });
296
+ }
297
+ } catch (err) {
298
+ res.send(err);
299
+ }
300
+ }
301
+ }
302
+ );
303
+ } catch (err) {
304
+ res.send(err);
305
+ }
306
+ });
307
+
308
+ // DEPRECATED
309
+ router.post('/v1/wallets/', createWalletLimiter(opts), (req, res) => {
310
+ logDeprecated(req);
311
+ return returnError(new ClientError('BIP45 wallet creation no longer supported'), res, req);
312
+ });
313
+
314
+ router.post('/v2/wallets/', createWalletLimiter(opts), (req, res) => {
315
+ let server: WalletService;
316
+ try {
317
+ server = getServer(req, res);
318
+ } catch (ex) {
319
+ return returnError(ex, res, req);
320
+ }
321
+ server.createWallet(req.body, (err, walletId) => {
322
+ if (err) return returnError(err, res, req);
323
+ res.json({
324
+ walletId
325
+ });
326
+ });
327
+ });
328
+
329
+ router.put('/v1/copayers/:id/', (req, res) => {
330
+ req.body.copayerId = req.params['id'];
331
+ let server: WalletService;
332
+ try {
333
+ server = getServer(req, res);
334
+ } catch (ex) {
335
+ return returnError(ex, res, req);
336
+ }
337
+ server.addAccess(req.body, (err, result) => {
338
+ if (err) return returnError(err, res, req);
339
+ res.json(result);
340
+ });
341
+ });
342
+
343
+ // DEPRECATED
344
+ router.post('/v1/wallets/:id/copayers/', (req, res) => {
345
+ logDeprecated(req);
346
+ return returnError(new ClientError('BIP45 wallet creation no longer supported'), res, req);
347
+ });
348
+
349
+ router.post('/v2/wallets/:id/copayers/', (req, res) => {
350
+ req.body.walletId = req.params['id'];
351
+ let server: WalletService;
352
+ try {
353
+ server = getServer(req, res);
354
+ } catch (ex) {
355
+ return returnError(ex, res, req);
356
+ }
357
+ server.joinWallet(req.body, (err, result) => {
358
+ if (err) return returnError(err, res, req);
359
+
360
+ res.json(result);
361
+ });
362
+ });
363
+
364
+ // DEPRECATED
365
+ router.get('/v1/wallets/', (req, res) => {
366
+ logDeprecated(req);
367
+ getServerWithAuth(req, res, server => {
368
+ server.getStatus(
369
+ {
370
+ includeExtendedInfo: true
371
+ },
372
+ (err, status) => {
373
+ if (err) return returnError(err, res, req);
374
+ res.json(status);
375
+ }
376
+ );
377
+ });
378
+ });
379
+
380
+ // DEPRECATED
381
+ router.get('/v2/wallets/', (req, res) => {
382
+ getServerWithAuth(req, res, server => {
383
+ const opts = { includeExtendedInfo: false, twoStep: false };
384
+ if (req.query.includeExtendedInfo == '1') opts.includeExtendedInfo = true;
385
+ if (req.query.twoStep == '1') opts.twoStep = true;
386
+
387
+ server.getStatus(opts, (err, status) => {
388
+ if (err) return returnError(err, res, req);
389
+ res.json(status);
390
+ });
391
+ });
392
+ });
393
+
394
+ router.get('/v3/wallets/', (req, res) => {
395
+ getServerWithAuth(req, res, server => {
396
+ const opts = {
397
+ includeExtendedInfo: false,
398
+ twoStep: false,
399
+ includeServerMessages: false,
400
+ tokenAddress: req.query.tokenAddress,
401
+ multisigContractAddress: req.query.multisigContractAddress,
402
+ network: req.query.network
403
+ };
404
+ if (req.query.includeExtendedInfo == '1') opts.includeExtendedInfo = true;
405
+ if (req.query.twoStep == '1') opts.twoStep = true;
406
+ if (req.query.serverMessageArray == '1') opts.includeServerMessages = true;
407
+ server.getStatus(opts, (err, status) => {
408
+ if (err) return returnError(err, res, req);
409
+ res.json(status);
410
+ });
411
+ });
412
+ });
413
+
414
+ router.get('/v1/wallets/all/', async (req, res) => {
415
+ let responses;
416
+ const includeExtendedInfo = req.query.includeExtendedInfo == '1';
417
+ const twoStep = req.query.twoStep == '1';
418
+ const silentFailure = req.query.silentFailure == '1';
419
+ const includeServerMessages = req.query.serverMessageArray == '1';
420
+
421
+ const buildOpts = (req, copayerId) => {
422
+ const getParam = (param, returnArray = false) => {
423
+ // Handle old client params
424
+ const value = req.query[`${copayerId}:${param}`] || req.query[copayerId]?.[param];
425
+ if (returnArray) {
426
+ return Array.isArray(value) ? value : value ? [value] : null;
427
+ }
428
+ return value ? value : null;
429
+ };
430
+ const opts = {
431
+ includeExtendedInfo,
432
+ twoStep,
433
+ silentFailure,
434
+ includeServerMessages,
435
+ tokenAddresses: getParam('tokenAddress', true),
436
+ multisigContractAddress: getParam('multisigContractAddress'),
437
+ network: getParam('network')
438
+ };
439
+ return opts;
440
+ };
441
+
442
+ try {
443
+ responses = await Promise.all(
444
+ getServerWithMultiAuth(req, res, { silentFailure }).map(promise =>
445
+ promise.then(
446
+ (server: WalletService) =>
447
+ new Promise(resolve => {
448
+ const options: any = buildOpts(req, server.copayerId);
449
+ if (options.tokenAddresses) {
450
+ // add a null entry to array so we can get the chain balance
451
+ options.tokenAddresses.unshift(null);
452
+ return async.concat(
453
+ options.tokenAddresses,
454
+ (tokenAddress, cb) => {
455
+ const optsClone = JSON.parse(JSON.stringify(options));
456
+ optsClone.tokenAddresses = null;
457
+ optsClone.tokenAddress = tokenAddress;
458
+ return server.getStatus(optsClone, (err, status) => {
459
+ const result: any = {
460
+ walletId: server.walletId,
461
+ tokenAddress: optsClone.tokenAddress,
462
+ success: true,
463
+ ...(err ? { success: false, message: err.message } : {}),
464
+ status
465
+ };
466
+ if (err && err.message)
467
+ logger.error(
468
+ `An error occurred retrieving wallet status - id: ${server.walletId} - token address: ${optsClone.tokenAddress} - err: ${err.message}`
469
+ );
470
+ cb(null, result); // do not throw error, continue with next wallets
471
+ });
472
+ },
473
+ (err, result) => {
474
+ return resolve(result);
475
+ }
476
+ );
477
+ } else {
478
+ return server.getStatus(options, (err, status) => {
479
+ return resolve([
480
+ {
481
+ walletId: server.walletId,
482
+ tokenAddress: null,
483
+ success: true,
484
+ ...(err ? { success: false, message: err.message } : {}),
485
+ status
486
+ }
487
+ ]);
488
+ });
489
+ }
490
+ }),
491
+ ({ message }) => Promise.resolve({ success: false, error: message })
492
+ )
493
+ .catch(err => {
494
+ if (!silentFailure) {
495
+ returnError(err, res, req);
496
+ }
497
+ })
498
+ )
499
+ );
500
+ } catch (err) {
501
+ return returnError(err, res, req);
502
+ }
503
+
504
+ return res.json(_.flatten(responses));
505
+ });
506
+
507
+ router.get('/v1/wallets/:identifier/', (req, res) => {
508
+ getServerWithAuth(
509
+ req,
510
+ res,
511
+ {
512
+ onlySupportStaff: true
513
+ },
514
+ server => {
515
+ const opts = {
516
+ identifier: req.params['identifier'],
517
+ walletCheck: ['1', 'true'].includes(req.query['walletCheck'])
518
+ };
519
+ server.getWalletFromIdentifier(opts, (err, wallet) => {
520
+ if (err) return returnError(err, res, req);
521
+ if (!wallet) return res.end();
522
+
523
+ server.walletId = wallet.id;
524
+ const opts = { includeExtendedInfo: false };
525
+ if (req.query.includeExtendedInfo == '1') opts.includeExtendedInfo = true;
526
+ server.getStatus(opts, (err, status) => {
527
+ if (err) return returnError(err, res, req);
528
+ res.json(status);
529
+ });
530
+ });
531
+ }
532
+ );
533
+ });
534
+
535
+ router.get('/v1/preferences/', (req, res) => {
536
+ getServerWithAuth(req, res, server => {
537
+ server.getPreferences({}, (err, preferences) => {
538
+ if (err) return returnError(err, res, req);
539
+ res.json(preferences);
540
+ });
541
+ });
542
+ });
543
+
544
+ router.put('/v1/preferences', (req, res) => {
545
+ getServerWithAuth(req, res, server => {
546
+ server.savePreferences(req.body, (err, result) => {
547
+ if (err) return returnError(err, res, req);
548
+ res.json(result);
549
+ });
550
+ });
551
+ });
552
+
553
+ // DEPRECATED (do not use cashaddr)
554
+ router.get('/v1/txproposals/', (req, res) => {
555
+ getServerWithAuth(req, res, server => {
556
+ server.getPendingTxs({ noCashAddr: true }, (err, pendings) => {
557
+ if (err) return returnError(err, res, req);
558
+ res.json(pendings);
559
+ });
560
+ });
561
+ });
562
+
563
+ router.get('/v2/txproposals/', (req, res) => {
564
+ getServerWithAuth(req, res, server => {
565
+ server.getPendingTxs({}, (err, pendings) => {
566
+ if (err) return returnError(err, res, req);
567
+ res.json(pendings);
568
+ });
569
+ });
570
+ });
571
+
572
+ // DEPRECATED
573
+ router.post('/v1/txproposals/', (req, res) => {
574
+ const err = Errors.UPGRADE_NEEDED;
575
+ return returnError(err, res, req);
576
+ });
577
+
578
+ // DEPRECATED, no cash addr
579
+ router.post('/v2/txproposals/', (req, res) => {
580
+ getServerWithAuth(req, res, server => {
581
+ req.body.noCashAddr = true;
582
+ req.body.txpVersion = 3;
583
+ server.createTx(req.body, (err, txp) => {
584
+ if (err) return returnError(err, res, req);
585
+ res.json(txp);
586
+ });
587
+ });
588
+ });
589
+
590
+ router.post('/v3/txproposals/', (req, res) => {
591
+ getServerWithAuth(req, res, server => {
592
+ req.body.txpVersion = 3;
593
+ server.createTx(req.body, (err, txp) => {
594
+ if (err) return returnError(err, res, req);
595
+ res.json(txp);
596
+ });
597
+ });
598
+ });
599
+
600
+ // create advertisement
601
+ router.post('/v1/advertisements/', (req, res) => {
602
+ getServerWithAuth(
603
+ req,
604
+ res,
605
+ {
606
+ onlyMarketingStaff: true
607
+ },
608
+ server => {
609
+ server.createAdvert(req.body, (err, advert) => {
610
+ if (err) {
611
+ return returnError(err, res, req);
612
+ }
613
+ if (advert) res.json(advert);
614
+ });
615
+ }
616
+ );
617
+ });
618
+
619
+ router.get('/v1/advertisements/', (req, res) => {
620
+ let server: WalletService;
621
+ const testing = req.query.testing;
622
+
623
+ try {
624
+ server = getServer(req, res);
625
+ } catch (ex) {
626
+ return returnError(ex, res, req);
627
+ }
628
+
629
+ if (testing) {
630
+ server.getTestingAdverts(req.body, (err, ads) => {
631
+ if (err) returnError(err, res, req);
632
+ res.json(ads);
633
+ });
634
+ } else {
635
+ SetPublicCache(res, 5 * ONE_MINUTE);
636
+ server.getAdverts(req.body, (err, ads) => {
637
+ if (err) returnError(err, res, req);
638
+ res.json(ads);
639
+ });
640
+ }
641
+ });
642
+
643
+ router.get('/v1/advertisements/:adId/', (req, res) => {
644
+ let server: WalletService;
645
+
646
+ try {
647
+ server = getServer(req, res);
648
+ } catch (ex) {
649
+ return returnError(ex, res, req);
650
+ }
651
+
652
+ const opts = { adId: req.params['adId'] };
653
+
654
+ if (req.params['adId']) {
655
+ server.getAdvert(opts, (err, ad) => {
656
+ if (err) returnError(err, res, req);
657
+ res.json(ad);
658
+ });
659
+ }
660
+ });
661
+
662
+ router.get('/v1/advertisements/country/:country', (req, res) => {
663
+ let server: WalletService;
664
+ const country = req.params['country'];
665
+
666
+ const opts = { country };
667
+
668
+ try {
669
+ server = getServer(req, res);
670
+ } catch (ex) {
671
+ return returnError(ex, res, req);
672
+ }
673
+
674
+ server.getAdvertsByCountry(opts, (err, ads) => {
675
+ if (err) returnError(err, res, req);
676
+ res.json(ads);
677
+ });
678
+ });
679
+
680
+ router.post('/v1/advertisements/:adId/activate', (req, res) => {
681
+ const opts = { adId: req.params['adId'] };
682
+
683
+ getServerWithAuth(
684
+ req,
685
+ res,
686
+ {
687
+ onlyMarketingStaff: true
688
+ },
689
+ server => {
690
+ if (req.params['adId']) {
691
+ server.activateAdvert(opts, (err, _ad) => {
692
+ if (err) returnError(err, res, req);
693
+ res.json({ advertisementId: opts.adId, message: 'advert activated' });
694
+ });
695
+ }
696
+ }
697
+ );
698
+ });
699
+
700
+ router.post('/v1/advertisements/:adId/deactivate', (req, res) => {
701
+ const opts = { adId: req.params['adId'] };
702
+
703
+ getServerWithAuth(
704
+ req,
705
+ res,
706
+ {
707
+ onlyMarketingStaff: true
708
+ },
709
+ server => {
710
+ if (req.params['adId']) {
711
+ server.deactivateAdvert(opts, (err, _ad) => {
712
+ if (err) returnError(err, res, req);
713
+ res.json({ advertisementId: opts.adId, message: 'advert deactivated' });
714
+ });
715
+ }
716
+ }
717
+ );
718
+ });
719
+
720
+ router.delete('/v1/advertisements/:adId/', (req, res) => {
721
+ getServerWithAuth(
722
+ req,
723
+ res,
724
+ {
725
+ onlyMarketingStaff: true
726
+ },
727
+ server => {
728
+ req.body.adId = req.params['adId'];
729
+ server.removeAdvert(req.body, (err, removedAd) => {
730
+ if (err) returnError(err, res, req);
731
+ if (removedAd) {
732
+ res.json(removedAd);
733
+ }
734
+ });
735
+ }
736
+ );
737
+ });
738
+
739
+ /* THIS WAS NEVED ENABLED YET NOW 2020-04-07
740
+ router.post('/v4/txproposals/', (req, res) => {
741
+ getServerWithAuth(req, res, server => {
742
+ req.body.txpVersion = 4;
743
+ server.createTx(req.body, (err, txp) => {
744
+ if (err) return returnError(err, res, req);
745
+ res.json(txp);
746
+ });
747
+ });
748
+ });
749
+
750
+ */
751
+
752
+ // DEPRECATED
753
+ router.post('/v1/addresses/', (req, res) => {
754
+ logDeprecated(req);
755
+ getServerWithAuth(req, res, server => {
756
+ server.createAddress(
757
+ {
758
+ ignoreMaxGap: true
759
+ },
760
+ (err, address) => {
761
+ if (err) return returnError(err, res, req);
762
+ res.json(address);
763
+ }
764
+ );
765
+ });
766
+ });
767
+
768
+ // DEPRECATED
769
+ router.post('/v2/addresses/', (req, res) => {
770
+ logDeprecated(req);
771
+ getServerWithAuth(req, res, server => {
772
+ server.createAddress(
773
+ {
774
+ ignoreMaxGap: true
775
+ },
776
+ (err, address) => {
777
+ if (err) return returnError(err, res, req);
778
+ res.json(address);
779
+ }
780
+ );
781
+ });
782
+ });
783
+
784
+ // DEPRECATED (no cashaddr by default)
785
+ router.post('/v3/addresses/', (req, res) => {
786
+ getServerWithAuth(req, res, server => {
787
+ let opts = req.body;
788
+ opts = opts || {};
789
+ opts.noCashAddr = true;
790
+ server.createAddress(opts, (err, address) => {
791
+ if (err) return returnError(err, res, req);
792
+ res.json(address);
793
+ });
794
+ });
795
+ });
796
+
797
+ router.post('/v4/addresses/', (req, res) => {
798
+ getServerWithAuth(req, res, server => {
799
+ server.createAddress(req.body, (err, address) => {
800
+ if (err) return returnError(err, res, req);
801
+ res.json(address);
802
+ });
803
+ });
804
+ });
805
+
806
+ // DEPRECATED (default noChange=1)
807
+ router.get('/v1/addresses/', (req, res) => {
808
+ logDeprecated(req);
809
+ req.query.noChange = req.query.noChange ?? '1'; // default to no change addresses (backward compatibility)
810
+ req.redirectedUrl = req.url;
811
+ req.url = '/v2/addresses?' + Object.entries(req.query).map(([key, value]) => `${key}=${value}`).join('&');
812
+ router.handle(req, res);
813
+ });
814
+
815
+ router.get('/v2/addresses/', (req, res) => {
816
+ getServerWithAuth(req, res, server => {
817
+ const opts: GetAddressesOpts = {};
818
+ if (req.query.limit) opts.limit = +req.query.limit;
819
+ if (req.query.skip) opts.skip = +req.query.skip;
820
+ opts.reverse = req.query.reverse == '1';
821
+ if (req.query.addresses) {
822
+ opts.addresses = Array.isArray(req.query.addresses)
823
+ ? req.query.addresses
824
+ : req.query.addresses.split(',');
825
+ }
826
+ opts.noChange = Utils.castToBool(req.query.noChange);
827
+
828
+ server.getAddresses(opts, (err, addresses) => {
829
+ if (err) return returnError(err, res, req);
830
+ res.json(addresses);
831
+ });
832
+ });
833
+ });
834
+
835
+ router.get('/v1/balance/', (req, res) => {
836
+ getServerWithAuth(req, res, server => {
837
+ const opts: { coin?: string; twoStep?: boolean; tokenAddress?: string; multisigContractAddress?: string } = {};
838
+ if (req.query.coin) opts.coin = req.query.coin as string;
839
+ if (req.query.twoStep == '1') opts.twoStep = true;
840
+ if (req.query.tokenAddress) opts.tokenAddress = req.query.tokenAddress as string;
841
+ if (req.query.multisigContractAddress)
842
+ opts.multisigContractAddress = req.query.multisigContractAddress as string;
843
+
844
+ server.getBalance(opts, (err, balance) => {
845
+ if (err) return returnError(err, res, req);
846
+ res.json(balance);
847
+ });
848
+ });
849
+ });
850
+
851
+ let estimateFeeLimiter;
852
+
853
+ if (Defaults.RateLimit.estimateFee && !opts.ignoreRateLimiter) {
854
+ logger.info(
855
+ 'Limiting estimate fee per IP: %o req/h',
856
+ ((Defaults.RateLimit.estimateFee.max / Defaults.RateLimit.estimateFee.windowMs) * 60 * 60 * 1000).toFixed(2)
857
+ );
858
+ estimateFeeLimiter = new RateLimit(Defaults.RateLimit.estimateFee);
859
+ // router.use(/\/v\d+\/wallets\/$/, createWalletLimiter)
860
+ } else {
861
+ estimateFeeLimiter = (req, res, next) => {
862
+ next();
863
+ };
864
+ }
865
+
866
+ // DEPRECATED
867
+ router.get('/v1/feelevels/', estimateFeeLimiter, (req, res) => {
868
+ SetPublicCache(res, 1 * ONE_MINUTE);
869
+ logDeprecated(req);
870
+ const opts: { network?: string } = {};
871
+ if (req.query.network) opts.network = req.query.network as string;
872
+ let server: WalletService;
873
+ try {
874
+ server = getServer(req, res);
875
+ } catch (ex) {
876
+ return returnError(ex, res, req);
877
+ }
878
+ server.getFeeLevels(opts, (err, feeLevels) => {
879
+ if (err) return returnError(err, res, req);
880
+ _.each(feeLevels, feeLevel => {
881
+ feeLevel.feePerKB = feeLevel.feePerKb;
882
+ delete feeLevel.feePerKb;
883
+ });
884
+ res.json(feeLevels);
885
+ });
886
+ });
887
+
888
+ router.get('/v2/feelevels/', (req, res) => {
889
+ const opts: { coin?: string; network?: string; chain?: string } = {};
890
+ SetPublicCache(res, 1 * ONE_MINUTE);
891
+
892
+ if (req.query.coin) opts.coin = req.query.coin as string;
893
+ if (req.query.chain || req.query.coin) opts.chain = (req.query.chain || req.query.coin) as string;
894
+ if (req.query.network) opts.network = req.query.network as string;
895
+
896
+ let server: WalletService;
897
+ try {
898
+ server = getServer(req, res);
899
+ } catch (ex) {
900
+ return returnError(ex, res, req);
901
+ }
902
+ server.getFeeLevels(opts, (err, feeLevels) => {
903
+ if (err) return returnError(err, res, req);
904
+ res.json(feeLevels);
905
+ });
906
+ });
907
+
908
+ router.post('/v3/estimateGas/', (req, res) => {
909
+ getServerWithAuth(req, res, async server => {
910
+ try {
911
+ const gasLimit = await server.estimateGas(req.body);
912
+ res.json(gasLimit);
913
+ } catch (err) {
914
+ returnError(err, res, req);
915
+ }
916
+ });
917
+ });
918
+
919
+ // DEPRECATED
920
+ router.post('/v1/ethmultisig/', (req, res) => {
921
+ getServerWithAuth(req, res, async server => {
922
+ try {
923
+ const multisigContractInstantiationInfo = await server.getMultisigContractInstantiationInfo(req.body);
924
+ res.json(multisigContractInstantiationInfo);
925
+ } catch (err) {
926
+ returnError(err, res, req);
927
+ }
928
+ });
929
+ });
930
+
931
+ // DEPRECATED
932
+ router.post('/v1/ethmultisig/info', (req, res) => {
933
+ getServerWithAuth(req, res, async server => {
934
+ try {
935
+ const multisigContractInfo = await server.getMultisigContractInfo(req.body);
936
+ res.json(multisigContractInfo);
937
+ } catch (err) {
938
+ returnError(err, res, req);
939
+ }
940
+ });
941
+ });
942
+
943
+ router.post('/v1/multisig/', (req, res) => {
944
+ getServerWithAuth(req, res, async server => {
945
+ try {
946
+ const multisigContractInstantiationInfo = await server.getMultisigContractInstantiationInfo(req.body);
947
+ res.json(multisigContractInstantiationInfo);
948
+ } catch (err) {
949
+ returnError(err, res, req);
950
+ }
951
+ });
952
+ });
953
+
954
+ router.post('/v1/multisig/info', (req, res) => {
955
+ getServerWithAuth(req, res, async server => {
956
+ try {
957
+ const multisigContractInfo = await server.getMultisigContractInfo(req.body);
958
+ res.json(multisigContractInfo);
959
+ } catch (err) {
960
+ returnError(err, res, req);
961
+ }
962
+ });
963
+ });
964
+
965
+ router.post('/v1/token/info', (req, res) => {
966
+ getServerWithAuth(req, res, async server => {
967
+ try {
968
+ const tokenContractInfo = await server.getTokenContractInfo(req.body);
969
+ res.json(tokenContractInfo);
970
+ } catch (err) {
971
+ returnError(err, res, req);
972
+ }
973
+ });
974
+ });
975
+
976
+ router.get('/v1/sendmaxinfo/', (req, res) => {
977
+ getServerWithAuth(req, res, server => {
978
+ const q = req.query;
979
+ const opts: {
980
+ feePerKb?: number;
981
+ feeLevel?: number;
982
+ returnInputs?: boolean;
983
+ excludeUnconfirmedUtxos?: boolean;
984
+ } = {};
985
+ if (q.feePerKb) opts.feePerKb = +q.feePerKb;
986
+ if (q.feeLevel) opts.feeLevel = Number(q.feeLevel);
987
+ if (q.excludeUnconfirmedUtxos == '1') opts.excludeUnconfirmedUtxos = true;
988
+ if (q.returnInputs == '1') opts.returnInputs = true;
989
+ server.getSendMaxInfo(opts, (err, info) => {
990
+ if (err) return returnError(err, res, req);
991
+ res.json(info);
992
+ });
993
+ });
994
+ });
995
+
996
+ router.get('/v1/utxos/', (req, res) => {
997
+ const opts: { addresses?: string[] } = {};
998
+ const addresses = req.query.addresses;
999
+ if (addresses && _.isString(addresses)) opts.addresses = (req.query.addresses as string).split(',');
1000
+ getServerWithAuth(req, res, server => {
1001
+ server.getUtxos(opts, (err, utxos) => {
1002
+ if (err) return returnError(err, res, req);
1003
+ res.json(utxos);
1004
+ });
1005
+ });
1006
+ });
1007
+
1008
+ router.get('/v1/txcoins/', (req, res) => {
1009
+ const txId = req.query.txId;
1010
+ getServerWithAuth(req, res, server => {
1011
+ server.getCoinsForTx({ txId }, (err, coins) => {
1012
+ if (err) return returnError(err, res, req);
1013
+ res.json(coins);
1014
+ });
1015
+ });
1016
+ });
1017
+
1018
+ router.post('/v1/broadcast_raw/', (req, res) => {
1019
+ getServerWithAuth(req, res, server => {
1020
+ server.broadcastRawTx(req.body, (err, txid) => {
1021
+ if (err) return returnError(err, res, req);
1022
+ res.json(txid);
1023
+ res.end();
1024
+ });
1025
+ });
1026
+ });
1027
+
1028
+ // DEPRECATEED
1029
+ router.post('/v1/txproposals/:id/signatures/', (req, res) => {
1030
+ getServerWithAuth(req, res, server => {
1031
+ req.body.maxTxpVersion = 3;
1032
+ req.body.txProposalId = req.params['id'];
1033
+ server.signTx(req.body, (err, txp) => {
1034
+ if (err) return returnError(err, res, req);
1035
+ res.json(txp);
1036
+ res.end();
1037
+ });
1038
+ });
1039
+ });
1040
+
1041
+ // We created a new endpoint that support BCH schnorr signatues
1042
+ // so we can safely throw the error "UPGRADE NEEDED" if an old
1043
+ // client tries to post ECDSA signatures to a Schnorr TXP.
1044
+ // (using the old /v1/txproposal method): if (txp.signingMethod === 'schnorr' && !opts.supportBchSchnorr) return cb(Errors.UPGRADE_NEEDED);
1045
+ router.post('/v2/txproposals/:id/signatures/', (req, res) => {
1046
+ getServerWithAuth(req, res, server => {
1047
+ req.body.txProposalId = req.params['id'];
1048
+ req.body.maxTxpVersion = 3;
1049
+ req.body.supportBchSchnorr = true;
1050
+ server.signTx(req.body, (err, txp) => {
1051
+ if (err) return returnError(err, res, req);
1052
+ res.json(txp);
1053
+ res.end();
1054
+ });
1055
+ });
1056
+ });
1057
+
1058
+ /* THIS WAS NEVED ENABLED YET NOW 2020-04-07 (see above)
1059
+ router.post('/v3/txproposals/:id/signatures/', (req, res) => {
1060
+ getServerWithAuth(req, res, server => {
1061
+ req.body.txProposalId = req.params['id'];
1062
+ req.body.maxTxpVersion = 4;
1063
+ server.signTx(req.body, (err, txp) => {
1064
+ if (err) return returnError(err, res, req);
1065
+ res.json(txp);
1066
+ res.end();
1067
+ });
1068
+ });
1069
+ });
1070
+ */
1071
+
1072
+ //
1073
+ router.post('/v1/txproposals/:id/publish/', (req, res) => {
1074
+ getServerWithAuth(req, res, server => {
1075
+ req.body.txProposalId = req.params['id'];
1076
+ req.body.noCashAddr = true;
1077
+ server.publishTx(req.body, (err, txp) => {
1078
+ if (err) return returnError(err, res, req);
1079
+ res.json(txp);
1080
+ res.end();
1081
+ });
1082
+ });
1083
+ });
1084
+
1085
+ router.post('/v2/txproposals/:id/publish/', (req, res) => {
1086
+ getServerWithAuth(req, res, server => {
1087
+ req.body.txProposalId = req.params['id'];
1088
+ server.publishTx(req.body, (err, txp) => {
1089
+ if (err) return returnError(err, res, req);
1090
+ res.json(txp);
1091
+ res.end();
1092
+ });
1093
+ });
1094
+ });
1095
+
1096
+ // TODO Check HTTP verb and URL name
1097
+ router.post('/v1/txproposals/:id/broadcast/', (req, res) => {
1098
+ getServerWithAuth(req, res, server => {
1099
+ req.body.txProposalId = req.params['id'];
1100
+ server.broadcastTx(req.body, (err, txp) => {
1101
+ if (err) return returnError(err, res, req);
1102
+ res.json(txp);
1103
+ res.end();
1104
+ });
1105
+ });
1106
+ });
1107
+
1108
+ router.post('/v1/txproposals/:id/rejections', (req, res) => {
1109
+ getServerWithAuth(req, res, server => {
1110
+ req.body.txProposalId = req.params['id'];
1111
+ server.rejectTx(req.body, (err, txp) => {
1112
+ if (err) return returnError(err, res, req);
1113
+ res.json(txp);
1114
+ res.end();
1115
+ });
1116
+ });
1117
+ });
1118
+
1119
+ router.delete('/v1/txproposals/:id/', (req, res) => {
1120
+ getServerWithAuth(req, res, server => {
1121
+ req.body.txProposalId = req.params['id'];
1122
+ server.removePendingTx(req.body, err => {
1123
+ if (err) return returnError(err, res, req);
1124
+ res.json({
1125
+ success: true
1126
+ });
1127
+ res.end();
1128
+ });
1129
+ });
1130
+ });
1131
+
1132
+ router.get('/v1/txproposals/:id/', (req, res) => {
1133
+ getServerWithAuth(req, res, server => {
1134
+ req.body.txProposalId = req.params['id'];
1135
+ server.getTx(req.body, (err, tx) => {
1136
+ if (err) return returnError(err, res, req);
1137
+ res.json(tx);
1138
+ res.end();
1139
+ });
1140
+ });
1141
+ });
1142
+
1143
+ router.get('/v1/txproposalsbyhash/:id/', (req, res) => {
1144
+ getServerWithAuth(req, res, server => {
1145
+ req.body.txid = req.params['id'];
1146
+ server.getTxByHash(req.body, (err, tx) => {
1147
+ if (err) return returnError(err, res, req);
1148
+ res.json(tx);
1149
+ res.end();
1150
+ });
1151
+ });
1152
+ });
1153
+
1154
+ router.get('/v1/txhistory/', (req, res) => {
1155
+ getServerWithAuth(req, res, server => {
1156
+ const opts: {
1157
+ skip?: number;
1158
+ limit?: number;
1159
+ includeExtendedInfo?: boolean;
1160
+ tokenAddress?: string;
1161
+ multisigContractAddress?: string;
1162
+ } = {};
1163
+ if (req.query.skip) opts.skip = +req.query.skip;
1164
+ if (req.query.limit) opts.limit = +req.query.limit;
1165
+ if (req.query.tokenAddress) opts.tokenAddress = req.query.tokenAddress as string;
1166
+ if (req.query.multisigContractAddress)
1167
+ opts.multisigContractAddress = req.query.multisigContractAddress as string;
1168
+ if (req.query.includeExtendedInfo == '1') opts.includeExtendedInfo = true;
1169
+
1170
+ server.getTxHistory(opts, (err, txs) => {
1171
+ if (err) return returnError(err, res, req);
1172
+ res.json(txs);
1173
+ res.end();
1174
+ });
1175
+ });
1176
+ });
1177
+
1178
+ router.post('/v1/addresses/scan/', (req, res) => {
1179
+ getServerWithAuth(req, res, server => {
1180
+ req.body = req.body || {};
1181
+ req.body.startIdx = server.copayerIsSupportStaff ? Number(req.body.startIdx) : null;
1182
+ server.startScan(req.body, (err, started) => {
1183
+ if (err) return returnError(err, res, req);
1184
+ res.json(started);
1185
+ res.end();
1186
+ });
1187
+ });
1188
+ });
1189
+
1190
+ // Retrive stats DO NOT UPDATE THEM
1191
+ // To update them run /updatestats
1192
+ router.get('/v1/stats/', (req, res) => {
1193
+ SetPublicCache(res, 1 * ONE_MINUTE);
1194
+ const opts: {
1195
+ network?: string;
1196
+ coin?: string;
1197
+ from?: string;
1198
+ to?: string;
1199
+ } = {};
1200
+
1201
+ if (req.query.network) opts.network = req.query.network as string;
1202
+ if (req.query.coin) opts.coin = req.query.coin as string;
1203
+ if (req.query.from) opts.from = req.query.from as string;
1204
+ if (req.query.to) opts.to = req.query.to as string;
1205
+
1206
+ const stats = new Stats(opts);
1207
+ stats.run((err, data) => {
1208
+ if (err) return returnError(err, res, req);
1209
+ res.json(data);
1210
+ res.end();
1211
+ });
1212
+ });
1213
+
1214
+ router.get('/v1/version/', (req, res) => {
1215
+ SetPublicCache(res, 1 * ONE_MINUTE);
1216
+ res.json({
1217
+ serviceVersion: WalletService.getServiceVersion()
1218
+ });
1219
+ res.end();
1220
+ });
1221
+
1222
+ router.post('/v1/login/', (req, res) => {
1223
+ getServerWithAuth(req, res, server => {
1224
+ server.login({}, (err, session) => {
1225
+ if (err) return returnError(err, res, req);
1226
+ res.json(session);
1227
+ });
1228
+ });
1229
+ });
1230
+
1231
+ router.post('/v1/logout/', (req, res) => {
1232
+ getServerWithAuth(req, res, server => {
1233
+ server.logout({}, err => {
1234
+ if (err) return returnError(err, res, req);
1235
+ res.end();
1236
+ });
1237
+ });
1238
+ });
1239
+
1240
+ router.get('/v1/notifications/', (req, res) => {
1241
+ getServerWithAuth(
1242
+ req,
1243
+ res,
1244
+ {
1245
+ allowSession: true
1246
+ },
1247
+ server => {
1248
+ const timeSpan = req.query.timeSpan
1249
+ ? Math.min(+req.query.timeSpan || 0, Defaults.MAX_NOTIFICATIONS_TIMESPAN)
1250
+ : Defaults.NOTIFICATIONS_TIMESPAN;
1251
+ const opts = {
1252
+ minTs: +Date.now() - timeSpan * 1000,
1253
+ notificationId: req.query.notificationId
1254
+ };
1255
+
1256
+ server.getNotifications(opts, (err, notifications) => {
1257
+ if (err) return returnError(err, res, req);
1258
+ res.json(notifications);
1259
+ });
1260
+ }
1261
+ );
1262
+ });
1263
+
1264
+ router.get('/v1/txnotes/:txid', (req, res) => {
1265
+ getServerWithAuth(req, res, server => {
1266
+ const opts = {
1267
+ txid: req.params['txid']
1268
+ };
1269
+ server.getTxNote(opts, (err, note) => {
1270
+ if (err) return returnError(err, res, req);
1271
+ res.json(note);
1272
+ });
1273
+ });
1274
+ });
1275
+
1276
+ router.put('/v1/txnotes/:txid/', (req, res) => {
1277
+ req.body.txid = req.params['txid'];
1278
+ getServerWithAuth(req, res, server => {
1279
+ server.editTxNote(req.body, (err, note) => {
1280
+ if (err) return returnError(err, res, req);
1281
+ res.json(note);
1282
+ });
1283
+ });
1284
+ });
1285
+
1286
+ router.get('/v1/txnotes/', (req, res) => {
1287
+ getServerWithAuth(req, res, server => {
1288
+ const opts: { minTs?: number } = {};
1289
+ if (req.query.minTs && _.isNumber(+req.query.minTs)) {
1290
+ opts.minTs = +req.query.minTs;
1291
+ }
1292
+ server.getTxNotes(opts, (err, notes) => {
1293
+ if (err) return returnError(err, res, req);
1294
+ res.json(notes);
1295
+ });
1296
+ });
1297
+ });
1298
+
1299
+ router.get('/v1/nonce/:address', (req, res) => {
1300
+ getServerWithAuth(req, res, async server => {
1301
+ const opts = {
1302
+ coin: req.query.coin || 'eth',
1303
+ chain: req.query.chain,
1304
+ network: req.query.network || 'livenet',
1305
+ address: req.params['address']
1306
+ };
1307
+ try {
1308
+ const nonce = await server.getNonce(opts);
1309
+ res.json(nonce);
1310
+ } catch (err) {
1311
+ returnError(err, res, req);
1312
+ }
1313
+ });
1314
+ });
1315
+
1316
+ router.post('/v1/clearcache/', (req, res) => {
1317
+ getServerWithAuth(req, res, server => {
1318
+ const opts = req.query;
1319
+ server.clearWalletCache(opts).then(val => {
1320
+ if (val) {
1321
+ res.sendStatus(200);
1322
+ } else {
1323
+ res.sendStatus(500);
1324
+ }
1325
+ });
1326
+ });
1327
+ });
1328
+
1329
+ router.get('/v1/fiatrates/:code/', (req, res) => {
1330
+ SetPublicCache(res, 5 * ONE_MINUTE);
1331
+ let server: WalletService;
1332
+ const opts = {
1333
+ code: req.params['code'],
1334
+ coin: req.query.coin || 'btc',
1335
+ ts: req.query.ts ? +req.query.ts : null
1336
+ };
1337
+ try {
1338
+ server = getServer(req, res);
1339
+ } catch (ex) {
1340
+ return returnError(ex, res, req);
1341
+ }
1342
+ server.getFiatRate(opts, (err, rates) => {
1343
+ if (err) return returnError(err, res, req);
1344
+ res.json(rates);
1345
+ });
1346
+ });
1347
+
1348
+ router.get('/v2/fiatrates/:code/', (req, res) => {
1349
+ SetPublicCache(res, 5 * ONE_MINUTE);
1350
+ let server: WalletService;
1351
+ const opts = {
1352
+ code: req.params['code'],
1353
+ ts: req.query.ts ? +req.query.ts : null
1354
+ };
1355
+ try {
1356
+ server = getServer(req, res);
1357
+ } catch (ex) {
1358
+ return returnError(ex, res, req);
1359
+ }
1360
+ server.getHistoricalRates(opts, (err, rates) => {
1361
+ if (err) return returnError(err, res, req);
1362
+ res.json(rates);
1363
+ });
1364
+ });
1365
+
1366
+ router.get('/v3/fiatrates/', (req, res) => {
1367
+ SetPublicCache(res, 5 * ONE_MINUTE);
1368
+ let server: WalletService;
1369
+ const opts = {
1370
+ code: req.query.code || null,
1371
+ ts: req.query.ts ? +req.query.ts : null
1372
+ };
1373
+ try {
1374
+ server = getServer(req, res);
1375
+ } catch (ex) {
1376
+ return returnError(ex, res, req);
1377
+ }
1378
+ server.getFiatRates(opts, (err, rates) => {
1379
+ if (err) return returnError(err, res, req);
1380
+ res.json(rates);
1381
+ });
1382
+ });
1383
+
1384
+ router.get('/v3/fiatrates/:coin/', (req, res) => {
1385
+ SetPublicCache(res, 5 * ONE_MINUTE);
1386
+ let server: WalletService;
1387
+ const opts = {
1388
+ coin: req.params['coin'],
1389
+ code: req.query.code || null,
1390
+ ts: req.query.ts ? +req.query.ts : null
1391
+ };
1392
+ try {
1393
+ server = getServer(req, res);
1394
+ } catch (ex) {
1395
+ return returnError(ex, res, req);
1396
+ }
1397
+ server.getFiatRatesByCoin(opts, (err, rates) => {
1398
+ if (err) return returnError(err, res, req);
1399
+ res.json(rates);
1400
+ });
1401
+ });
1402
+
1403
+ router.get('/v4/fiatrates/:code/', (req, res) => {
1404
+ SetPublicCache(res, 5 * ONE_MINUTE);
1405
+ let server: WalletService;
1406
+ try {
1407
+ server = getServer(req, res);
1408
+ } catch (ex) {
1409
+ return returnError(ex, res, req);
1410
+ }
1411
+ server.externalServices.coinGecko.coinGeckoGetFiatRates(req)
1412
+ .then(response => {
1413
+ res.json(response);
1414
+ })
1415
+ .catch(err => {
1416
+ return returnError(err ?? 'unknown', res, req);
1417
+ });
1418
+ });
1419
+
1420
+ // DEPRECATED
1421
+ router.post('/v1/pushnotifications/subscriptions/', (req, res) => {
1422
+ getServerWithAuth(req, res, server => {
1423
+ server.pushNotificationsSubscribe(req.body, (err, response) => {
1424
+ if (err) return returnError(err, res, req);
1425
+ res.json(response);
1426
+ });
1427
+ });
1428
+ });
1429
+
1430
+ router.post('/v2/pushnotifications/subscriptions/', (req, res) => {
1431
+ getServerWithAuth(req, res, server => {
1432
+ server.pushNotificationsBrazeSubscribe(req.body, (err, response) => {
1433
+ if (err) return returnError(err, res, req);
1434
+ res.json(response);
1435
+ });
1436
+ });
1437
+ });
1438
+
1439
+ // DEPRECATED
1440
+ router.delete('/v1/pushnotifications/subscriptions/', (req, res) => {
1441
+ logDeprecated(req);
1442
+ getServerWithAuth(req, res, server => {
1443
+ server.pushNotificationsUnsubscribe(
1444
+ {
1445
+ token: 'dummy'
1446
+ },
1447
+ (err, response) => {
1448
+ if (err) return returnError(err, res, req);
1449
+ res.json(response);
1450
+ }
1451
+ );
1452
+ });
1453
+ });
1454
+
1455
+ // DEPRECATED
1456
+ router.delete('/v2/pushnotifications/subscriptions/:token', (req, res) => {
1457
+ const opts = {
1458
+ token: req.params['token']
1459
+ };
1460
+ getServerWithAuth(req, res, server => {
1461
+ server.pushNotificationsUnsubscribe(opts, (err, response) => {
1462
+ if (err) return returnError(err, res, req);
1463
+ res.json(response);
1464
+ });
1465
+ });
1466
+ });
1467
+
1468
+ router.delete('/v3/pushnotifications/subscriptions/:externalUserId', (req, res) => {
1469
+ const opts = {
1470
+ externalUserId: req.params['externalUserId']
1471
+ };
1472
+ getServerWithAuth(req, res, server => {
1473
+ server.pushNotificationsBrazeUnsubscribe(opts, (err, response) => {
1474
+ if (err) return returnError(err, res, req);
1475
+ res.json(response);
1476
+ });
1477
+ });
1478
+ });
1479
+
1480
+ router.post('/v1/txconfirmations/', (req, res) => {
1481
+ getServerWithAuth(req, res, server => {
1482
+ server.txConfirmationSubscribe(req.body, (err, response) => {
1483
+ if (err) return returnError(err, res, req);
1484
+ res.json(response);
1485
+ });
1486
+ });
1487
+ });
1488
+
1489
+ router.delete('/v1/txconfirmations/:txid', (req, res) => {
1490
+ const opts = {
1491
+ txid: req.params['txid']
1492
+ };
1493
+ getServerWithAuth(req, res, server => {
1494
+ server.txConfirmationUnsubscribe(opts, (err, response) => {
1495
+ if (err) return returnError(err, res, req);
1496
+ res.json(response);
1497
+ });
1498
+ });
1499
+ });
1500
+
1501
+ router.get('/v1/services', (req, res) => {
1502
+ let server: WalletService;
1503
+ try {
1504
+ server = getServer(req, res);
1505
+ } catch (ex) {
1506
+ return returnError(ex, res, req);
1507
+ }
1508
+ const opts = req.query;
1509
+ server.getServicesData(opts, (err, response) => {
1510
+ if (err) return returnError(err, res, req);
1511
+ res.json(response);
1512
+ });
1513
+ });
1514
+
1515
+ router.post('/v1/service/checkAvailability', (req, res) => {
1516
+ let server: WalletService, response;
1517
+ try {
1518
+ server = getServer(req, res);
1519
+ response = server.checkServiceAvailability(req);
1520
+ return res.json(response);
1521
+ } catch (ex) {
1522
+ return returnError(ex, res, req);
1523
+ }
1524
+ });
1525
+
1526
+ router.post('/v1/service/banxa/getCoins', async (req, res) => {
1527
+ let server: WalletService, response;
1528
+ try {
1529
+ server = getServer(req, res);
1530
+ response = await server.externalServices.banxa.banxaGetCoins(req);
1531
+ return res.json(response);
1532
+ } catch (ex) {
1533
+ return returnError(ex, res, req);
1534
+ }
1535
+ });
1536
+
1537
+ router.post('/v1/service/banxa/paymentMethods', async (req, res) => {
1538
+ let server: WalletService, response;
1539
+ try {
1540
+ server = getServer(req, res);
1541
+ response = await server.externalServices.banxa.banxaGetPaymentMethods(req);
1542
+ return res.json(response);
1543
+ } catch (ex) {
1544
+ return returnError(ex, res, req);
1545
+ }
1546
+ });
1547
+
1548
+ router.post('/v1/service/banxa/quote', (req, res) => {
1549
+ getServerWithAuth(req, res, async server => {
1550
+ let response;
1551
+ try {
1552
+ response = await server.externalServices.banxa.banxaGetQuote(req);
1553
+ return res.json(response);
1554
+ } catch (ex) {
1555
+ return returnError(ex, res, req);
1556
+ }
1557
+ });
1558
+ });
1559
+
1560
+ router.post('/v1/service/banxa/createOrder', (req, res) => {
1561
+ getServerWithAuth(req, res, async server => {
1562
+ let response;
1563
+ try {
1564
+ response = await server.externalServices.banxa.banxaCreateOrder(req);
1565
+ return res.json(response);
1566
+ } catch (ex) {
1567
+ return returnError(ex, res, req);
1568
+ }
1569
+ });
1570
+ });
1571
+
1572
+ router.post('/v1/service/banxa/getOrder', async (req, res) => {
1573
+ let server: WalletService, response;
1574
+ try {
1575
+ server = getServer(req, res);
1576
+ response = await server.externalServices.banxa.banxaGetOrder(req);
1577
+ return res.json(response);
1578
+ } catch (ex) {
1579
+ return returnError(ex, res, req);
1580
+ }
1581
+ });
1582
+
1583
+ router.post('/v1/service/moonpay/getCurrencies', async (req, res) => {
1584
+ let server: WalletService, response;
1585
+ try {
1586
+ server = getServer(req, res);
1587
+ response = await server.externalServices.moonpay.moonpayGetCurrencies(req);
1588
+ return res.json(response);
1589
+ } catch (ex) {
1590
+ return returnError(ex, res, req);
1591
+ }
1592
+ });
1593
+
1594
+ router.post('/v1/service/moonpay/quote', (req, res) => {
1595
+ getServerWithAuth(req, res, async server => {
1596
+ let response;
1597
+ try {
1598
+ response = await server.externalServices.moonpay.moonpayGetQuote(req);
1599
+ return res.json(response);
1600
+ } catch (ex) {
1601
+ return returnError(ex, res, req);
1602
+ }
1603
+ });
1604
+ });
1605
+
1606
+ router.post('/v1/service/moonpay/sellQuote', (req, res) => {
1607
+ getServerWithAuth(req, res, async server => {
1608
+ let response;
1609
+ try {
1610
+ response = await server.externalServices.moonpay.moonpayGetSellQuote(req);
1611
+ return res.json(response);
1612
+ } catch (ex) {
1613
+ return returnError(ex, res, req);
1614
+ }
1615
+ });
1616
+ });
1617
+
1618
+ router.post('/v1/service/moonpay/currencyLimits', async (req, res) => {
1619
+ let server: WalletService, response;
1620
+ try {
1621
+ server = getServer(req, res);
1622
+ response = await server.externalServices.moonpay.moonpayGetCurrencyLimits(req);
1623
+ return res.json(response);
1624
+ } catch (ex) {
1625
+ return returnError(ex, res, req);
1626
+ }
1627
+ });
1628
+
1629
+ router.post('/v1/service/moonpay/signedPaymentUrl', (req, res) => {
1630
+ getServerWithAuth(req, res, server => {
1631
+ let response;
1632
+ try {
1633
+ response = server.externalServices.moonpay.moonpayGetSignedPaymentUrl(req);
1634
+ return res.json(response);
1635
+ } catch (ex) {
1636
+ return returnError(ex, res, req);
1637
+ }
1638
+ });
1639
+ });
1640
+
1641
+ router.post('/v1/service/moonpay/sellSignedPaymentUrl', (req, res) => {
1642
+ getServerWithAuth(req, res, async server => {
1643
+ let response;
1644
+ try {
1645
+ response = await server.externalServices.moonpay.moonpayGetSellSignedPaymentUrl(req);
1646
+ return res.json(response);
1647
+ } catch (ex) {
1648
+ return returnError(ex, res, req);
1649
+ }
1650
+ });
1651
+ });
1652
+
1653
+ router.post('/v1/service/moonpay/transactionDetails', async (req, res) => {
1654
+ let server: WalletService, response;
1655
+ try {
1656
+ server = getServer(req, res);
1657
+ response = await server.externalServices.moonpay.moonpayGetTransactionDetails(req);
1658
+ return res.json(response);
1659
+ } catch (ex) {
1660
+ return returnError(ex, res, req);
1661
+ }
1662
+ });
1663
+
1664
+ router.post('/v1/service/moonpay/sellTransactionDetails', async (req, res) => {
1665
+ let server: WalletService, response;
1666
+ try {
1667
+ server = getServer(req, res);
1668
+ response = await server.externalServices.moonpay.moonpayGetSellTransactionDetails(req);
1669
+ return res.json(response);
1670
+ } catch (ex) {
1671
+ return returnError(ex, res, req);
1672
+ }
1673
+ });
1674
+
1675
+ router.post('/v1/service/moonpay/cancelSellTransaction', (req, res) => {
1676
+ getServerWithAuth(req, res, async server => {
1677
+ let response;
1678
+ try {
1679
+ response = await server.externalServices.moonpay.moonpayCancelSellTransaction(req);
1680
+ return res.json(response);
1681
+ } catch (ex) {
1682
+ return returnError(ex, res, req);
1683
+ }
1684
+ });
1685
+ });
1686
+
1687
+ router.post('/v1/service/moonpay/accountDetails', async (req, res) => {
1688
+ let server: WalletService, response;
1689
+ try {
1690
+ server = getServer(req, res);
1691
+ response = await server.externalServices.moonpay.moonpayGetAccountDetails(req);
1692
+ return res.json(response);
1693
+ } catch (ex) {
1694
+ return returnError(ex, res, req);
1695
+ }
1696
+ });
1697
+
1698
+ router.post('/v1/service/ramp/quote', (req, res) => {
1699
+ getServerWithAuth(req, res, async server => {
1700
+ let response;
1701
+ try {
1702
+ response = await server.externalServices.ramp.rampGetQuote(req);
1703
+ return res.json(response);
1704
+ } catch (ex) {
1705
+ return returnError(ex, res, req);
1706
+ }
1707
+ });
1708
+ });
1709
+
1710
+ router.post('/v1/service/ramp/sellQuote', (req, res) => {
1711
+ getServerWithAuth(req, res, async server => {
1712
+ let response;
1713
+ try {
1714
+ response = await server.externalServices.ramp.rampGetSellQuote(req);
1715
+ return res.json(response);
1716
+ } catch (ex) {
1717
+ return returnError(ex, res, req);
1718
+ }
1719
+ });
1720
+ });
1721
+
1722
+ router.post('/v1/service/ramp/signedPaymentUrl', (req, res) => {
1723
+ getServerWithAuth(req, res, async server => {
1724
+ let response;
1725
+ try {
1726
+ response = await server.externalServices.ramp.rampGetSignedPaymentUrl(req);
1727
+ return res.json(response);
1728
+ } catch (ex) {
1729
+ return returnError(ex, res, req);
1730
+ }
1731
+ });
1732
+ });
1733
+
1734
+ router.post('/v1/service/ramp/assets', async (req, res) => {
1735
+ let server: WalletService, response;
1736
+ try {
1737
+ server = getServer(req, res);
1738
+ response = await server.externalServices.ramp.rampGetAssets(req);
1739
+ return res.json(response);
1740
+ } catch (ex) {
1741
+ return returnError(ex, res, req);
1742
+ }
1743
+ });
1744
+
1745
+ router.post('/v1/service/ramp/sellTransactionDetails', async (req, res) => {
1746
+ let server, response;
1747
+ try {
1748
+ server = getServer(req, res);
1749
+ response = await server.externalServices.ramp.rampGetSellTransactionDetails(req);
1750
+ return res.json(response);
1751
+ } catch (ex) {
1752
+ return returnError(ex, res, req);
1753
+ }
1754
+ });
1755
+
1756
+ router.post('/v1/service/sardine/quote', (req, res) => {
1757
+ getServerWithAuth(req, res, server => {
1758
+ server.externalServices.sardine
1759
+ .sardineGetQuote(req)
1760
+ .then(response => {
1761
+ res.json(response);
1762
+ })
1763
+ .catch(err => {
1764
+ return returnError(err ?? 'unknown', res, req);
1765
+ });
1766
+ });
1767
+ });
1768
+
1769
+ router.post('/v1/service/sardine/getToken', (req, res) => {
1770
+ getServerWithAuth(req, res, server => {
1771
+ server.externalServices.sardine
1772
+ .sardineGetToken(req)
1773
+ .then(response => {
1774
+ res.json(response);
1775
+ })
1776
+ .catch(err => {
1777
+ return returnError(err ?? 'unknown', res, req);
1778
+ });
1779
+ });
1780
+ });
1781
+
1782
+ router.post('/v1/service/sardine/getSupportedTokens', async (req, res) => {
1783
+ let server: WalletService, response;
1784
+ try {
1785
+ server = getServer(req, res);
1786
+ response = await server.externalServices.sardine.sardineGetSupportedTokens(req);
1787
+ return res.json(response);
1788
+ } catch (ex) {
1789
+ return returnError(ex, res, req);
1790
+ }
1791
+ });
1792
+
1793
+ router.post('/v1/service/sardine/currencyLimits', (req, res) => {
1794
+ let server: WalletService;
1795
+ try {
1796
+ server = getServer(req, res);
1797
+ } catch (ex) {
1798
+ return returnError(ex, res, req);
1799
+ }
1800
+
1801
+ server.externalServices.sardine
1802
+ .sardineGetCurrencyLimits(req)
1803
+ .then(response => {
1804
+ res.json(response);
1805
+ })
1806
+ .catch(err => {
1807
+ return returnError(err ?? 'unknown', res, req);
1808
+ });
1809
+ });
1810
+
1811
+ router.post('/v1/service/sardine/ordersDetails', (req, res) => {
1812
+ let server: WalletService;
1813
+ try {
1814
+ server = getServer(req, res);
1815
+ } catch (ex) {
1816
+ return returnError(ex, res, req);
1817
+ }
1818
+
1819
+ server.externalServices.sardine
1820
+ .sardineGetOrdersDetails(req)
1821
+ .then(response => {
1822
+ res.json(response);
1823
+ })
1824
+ .catch(err => {
1825
+ return returnError(err ?? 'unknown', res, req);
1826
+ });
1827
+ });
1828
+
1829
+ router.post('/v1/service/simplex/getCurrencies', (req, res) => {
1830
+ let server: WalletService;
1831
+ try {
1832
+ server = getServer(req, res);
1833
+ } catch (ex) {
1834
+ return returnError(ex, res, req);
1835
+ }
1836
+
1837
+ server.externalServices.simplex
1838
+ .simplexGetCurrencies(req)
1839
+ .then(response => {
1840
+ res.json(response);
1841
+ })
1842
+ .catch(err => {
1843
+ return returnError(err ?? 'unknown', res, req);
1844
+ });
1845
+ });
1846
+
1847
+ router.post('/v1/service/simplex/quote', (req, res) => {
1848
+ getServerWithAuth(req, res, server => {
1849
+ server.externalServices.simplex
1850
+ .simplexGetQuote(req)
1851
+ .then(response => {
1852
+ res.json(response);
1853
+ })
1854
+ .catch(err => {
1855
+ return returnError(err ?? 'unknown', res, req);
1856
+ });
1857
+ });
1858
+ });
1859
+
1860
+ router.post('/v1/service/simplex/sellQuote', (req, res) => {
1861
+ getServerWithAuth(req, res, server => {
1862
+ server.externalServices.simplex
1863
+ .simplexGetSellQuote(req)
1864
+ .then(response => {
1865
+ res.json(response);
1866
+ })
1867
+ .catch(err => {
1868
+ return returnError(err ?? 'unknown', res, req);
1869
+ });
1870
+ });
1871
+ });
1872
+
1873
+ router.post('/v1/service/simplex/paymentRequest', (req, res) => {
1874
+ getServerWithAuth(req, res, server => {
1875
+ server.externalServices.simplex
1876
+ .simplexPaymentRequest(req)
1877
+ .then(response => {
1878
+ res.json(response);
1879
+ })
1880
+ .catch(err => {
1881
+ return returnError(err ?? 'unknown', res, req);
1882
+ });
1883
+ });
1884
+ });
1885
+
1886
+ router.post('/v1/service/simplex/sellPaymentRequest', (req, res) => {
1887
+ getServerWithAuth(req, res, server => {
1888
+ server.externalServices.simplex
1889
+ .simplexSellPaymentRequest(req)
1890
+ .then(response => {
1891
+ res.json(response);
1892
+ })
1893
+ .catch(err => {
1894
+ return returnError(err ?? 'unknown', res, req);
1895
+ });
1896
+ });
1897
+ });
1898
+
1899
+ router.get('/v1/service/simplex/events', (req, res) => {
1900
+ getServerWithAuth(req, res, server => {
1901
+ const opts = { env: req.query.env };
1902
+ server.externalServices.simplex
1903
+ .simplexGetEvents(opts)
1904
+ .then(response => {
1905
+ res.json(response);
1906
+ })
1907
+ .catch(err => {
1908
+ return returnError(err ?? 'unknown', res, req);
1909
+ });
1910
+ });
1911
+ });
1912
+
1913
+ router.post('/v1/service/thorswap/supportedChains', (req, res) => {
1914
+ let server: WalletService;
1915
+ try {
1916
+ server = getServer(req, res);
1917
+ } catch (ex) {
1918
+ return returnError(ex, res, req);
1919
+ }
1920
+
1921
+ server.externalServices.thorswap
1922
+ .thorswapGetSupportedChains(req)
1923
+ .then(response => {
1924
+ res.json(response);
1925
+ })
1926
+ .catch(err => {
1927
+ return returnError(err ?? 'unknown', res, req);
1928
+ });
1929
+ });
1930
+
1931
+ router.post('/v1/service/thorswap/cryptoCurrencies', (req, res) => {
1932
+ let server: WalletService;
1933
+ try {
1934
+ server = getServer(req, res);
1935
+ } catch (ex) {
1936
+ return returnError(ex, res, req);
1937
+ }
1938
+
1939
+ server.externalServices.thorswap
1940
+ .thorswapGetCryptoCurrencies(req)
1941
+ .then(response => {
1942
+ res.json(response);
1943
+ })
1944
+ .catch(err => {
1945
+ return returnError(err ?? 'unknown', res, req);
1946
+ });
1947
+ });
1948
+
1949
+ router.post('/v1/service/thorswap/getSwapQuote', (req, res) => {
1950
+ getServerWithAuth(req, res, async server => {
1951
+ let response;
1952
+ try {
1953
+ response = await server.externalServices.thorswap.thorswapGetSwapQuote(req);
1954
+ return res.json(response);
1955
+ } catch (ex) {
1956
+ return returnError(ex, res, req);
1957
+ }
1958
+ });
1959
+ });
1960
+
1961
+ router.post('/v1/service/thorswap/getSwapTx', (req, res) => {
1962
+ let server: WalletService;
1963
+ try {
1964
+ server = getServer(req, res);
1965
+ } catch (ex) {
1966
+ return returnError(ex, res, req);
1967
+ }
1968
+
1969
+ server.externalServices.thorswap
1970
+ .thorswapGetSwapTx(req)
1971
+ .then(response => {
1972
+ res.json(response);
1973
+ })
1974
+ .catch(err => {
1975
+ return returnError(err ?? 'unknown', res, req);
1976
+ });
1977
+ });
1978
+
1979
+ router.post('/v1/service/transak/getAccessToken', (req, res) => {
1980
+ getServerWithAuth(req, res, async server => {
1981
+ let response;
1982
+ try {
1983
+ response = await server.externalServices.transak.transakGetAccessToken(req);
1984
+ return res.json(response);
1985
+ } catch (ex) {
1986
+ return returnError(ex, res, req);
1987
+ }
1988
+ });
1989
+ });
1990
+
1991
+ router.post('/v1/service/transak/cryptoCurrencies', (req, res) => {
1992
+ let server: WalletService;
1993
+ try {
1994
+ server = getServer(req, res);
1995
+ } catch (ex) {
1996
+ return returnError(ex, res, req);
1997
+ }
1998
+
1999
+ server.externalServices.transak
2000
+ .transakGetCryptoCurrencies(req)
2001
+ .then(response => {
2002
+ res.json(response);
2003
+ })
2004
+ .catch(err => {
2005
+ return returnError(err ?? 'unknown', res, req);
2006
+ });
2007
+ });
2008
+
2009
+ router.post('/v1/service/transak/fiatCurrencies', (req, res) => {
2010
+ let server: WalletService;
2011
+ try {
2012
+ server = getServer(req, res);
2013
+ } catch (ex) {
2014
+ return returnError(ex, res, req);
2015
+ }
2016
+
2017
+ server.externalServices.transak
2018
+ .transakGetFiatCurrencies(req)
2019
+ .then(response => {
2020
+ res.json(response);
2021
+ })
2022
+ .catch(err => {
2023
+ return returnError(err ?? 'unknown', res, req);
2024
+ });
2025
+ });
2026
+
2027
+ router.post('/v1/service/transak/quote', (req, res) => {
2028
+ getServerWithAuth(req, res, async server => {
2029
+ let response;
2030
+ try {
2031
+ response = await server.externalServices.transak.transakGetQuote(req);
2032
+ return res.json(response);
2033
+ } catch (ex) {
2034
+ return returnError(ex, res, req);
2035
+ }
2036
+ });
2037
+ });
2038
+
2039
+ router.post('/v1/service/transak/signedPaymentUrl', (req, res) => {
2040
+ getServerWithAuth(req, res, async server => {
2041
+ let response;
2042
+ try {
2043
+ response = await server.externalServices.transak.transakGetSignedPaymentUrl(req);
2044
+ return res.json(response);
2045
+ } catch (ex) {
2046
+ return returnError(ex, res, req);
2047
+ }
2048
+ });
2049
+ });
2050
+
2051
+ router.post('/v1/service/transak/orderDetails', (req, res) => {
2052
+ let server: WalletService;
2053
+ try {
2054
+ server = getServer(req, res);
2055
+ } catch (ex) {
2056
+ return returnError(ex, res, req);
2057
+ }
2058
+
2059
+ server.externalServices.transak
2060
+ .transakGetOrderDetails(req)
2061
+ .then(response => {
2062
+ res.json(response);
2063
+ })
2064
+ .catch(err => {
2065
+ return returnError(err ?? 'unknown', res, req);
2066
+ });
2067
+ });
2068
+
2069
+ router.post('/v1/service/wyre/walletOrderQuotation', (req, res) => {
2070
+ getServerWithAuth(req, res, server => {
2071
+ server.externalServices.wyre
2072
+ .wyreWalletOrderQuotation(req)
2073
+ .then(response => {
2074
+ res.json(response);
2075
+ })
2076
+ .catch(err => {
2077
+ return returnError(err ?? 'unknown', res, req);
2078
+ });
2079
+ });
2080
+ });
2081
+
2082
+ router.post('/v1/service/wyre/walletOrderReservation', (req, res) => {
2083
+ getServerWithAuth(req, res, server => {
2084
+ server.externalServices.wyre
2085
+ .wyreWalletOrderReservation(req)
2086
+ .then(response => {
2087
+ res.json(response);
2088
+ })
2089
+ .catch(err => {
2090
+ return returnError(err ?? 'unknown', res, req);
2091
+ });
2092
+ });
2093
+ });
2094
+
2095
+ router.post('/v1/service/changelly/getCurrencies', (req, res) => {
2096
+ let server: WalletService;
2097
+ try {
2098
+ server = getServer(req, res);
2099
+ } catch (ex) {
2100
+ return returnError(ex, res, req);
2101
+ }
2102
+ server.externalServices.changelly
2103
+ .changellyGetCurrencies(req)
2104
+ .then(response => {
2105
+ res.json(response);
2106
+ })
2107
+ .catch(err => {
2108
+ return returnError(err ?? 'unknown', res, req);
2109
+ });
2110
+ });
2111
+
2112
+ router.post('/v1/service/changelly/getPairsParams', (req, res) => {
2113
+ getServerWithAuth(req, res, server => {
2114
+ server.externalServices.changelly
2115
+ .changellyGetPairsParams(req)
2116
+ .then(response => {
2117
+ res.json(response);
2118
+ })
2119
+ .catch(err => {
2120
+ return returnError(err ?? 'unknown', res, req);
2121
+ });
2122
+ });
2123
+ });
2124
+
2125
+ router.post('/v1/service/changelly/getFixRateForAmount', (req, res) => {
2126
+ getServerWithAuth(req, res, server => {
2127
+ server.externalServices.changelly
2128
+ .changellyGetFixRateForAmount(req)
2129
+ .then(response => {
2130
+ res.json(response);
2131
+ })
2132
+ .catch(err => {
2133
+ return returnError(err ?? 'unknown', res, req);
2134
+ });
2135
+ });
2136
+ });
2137
+
2138
+ router.post('/v1/service/changelly/createFixTransaction', (req, res) => {
2139
+ getServerWithAuth(req, res, server => {
2140
+ server.externalServices.changelly
2141
+ .changellyCreateFixTransaction(req)
2142
+ .then(response => {
2143
+ res.json(response);
2144
+ })
2145
+ .catch(err => {
2146
+ return returnError(err ?? 'unknown', res, req);
2147
+ });
2148
+ });
2149
+ });
2150
+
2151
+ router.post('/v1/service/changelly/getTransactions', (req, res) => {
2152
+ let server: WalletService;
2153
+ try {
2154
+ server = getServer(req, res);
2155
+ } catch (ex) {
2156
+ return returnError(ex, res, req);
2157
+ }
2158
+ server.externalServices.changelly
2159
+ .changellyGetTransactions(req)
2160
+ .then(response => {
2161
+ res.json(response);
2162
+ })
2163
+ .catch(err => {
2164
+ return returnError(err ?? 'unknown', res, req);
2165
+ });
2166
+ });
2167
+
2168
+ router.post('/v1/service/changelly/getStatus', (req, res) => {
2169
+ let server: WalletService;
2170
+ try {
2171
+ server = getServer(req, res);
2172
+ } catch (ex) {
2173
+ return returnError(ex, res, req);
2174
+ }
2175
+ server.externalServices.changelly
2176
+ .changellyGetStatus(req)
2177
+ .then(response => {
2178
+ res.json(response);
2179
+ })
2180
+ .catch(err => {
2181
+ return returnError(err ?? 'unknown', res, req);
2182
+ });
2183
+ });
2184
+
2185
+ router.get('/v1/service/oneInch/getReferrerFee', (req, res) => {
2186
+ let server: WalletService;
2187
+ try {
2188
+ server = getServer(req, res);
2189
+ } catch (ex) {
2190
+ return returnError(ex, res, req);
2191
+ }
2192
+ server.externalServices.oneInch
2193
+ .oneInchGetReferrerFee(req)
2194
+ .then(response => {
2195
+ res.json(response);
2196
+ })
2197
+ .catch(err => {
2198
+ return returnError(err ?? 'unknown', res, req);
2199
+ });
2200
+ });
2201
+
2202
+ router.post('/v1/service/oneInch/getSwap/:chain?', (req, res) => {
2203
+ getServerWithAuth(req, res, server => {
2204
+ server.externalServices.oneInch
2205
+ .oneInchGetSwap(req)
2206
+ .then(response => {
2207
+ res.json(response);
2208
+ })
2209
+ .catch(err => {
2210
+ return returnError(err ?? 'unknown', res, req);
2211
+ });
2212
+ });
2213
+ });
2214
+
2215
+ router.get('/v1/service/oneInch/getTokens/:chain?', (req, res) => {
2216
+ SetPublicCache(res, 1 * ONE_MINUTE);
2217
+ let server: WalletService;
2218
+ try {
2219
+ server = getServer(req, res);
2220
+ } catch (ex) {
2221
+ return returnError(ex, res, req);
2222
+ }
2223
+ server.externalServices.coinGecko.coinGeckoGetTokens(req)
2224
+ .then(response => {
2225
+ res.json(response);
2226
+ })
2227
+ .catch(err => {
2228
+ return returnError(err ?? 'unknown', res, req);
2229
+ });
2230
+ });
2231
+
2232
+ router.get('/v1/marketstats/:code/', (req, res) => {
2233
+ SetPublicCache(res, 5 * ONE_MINUTE);
2234
+ let server: WalletService;
2235
+ try {
2236
+ server = getServer(req, res);
2237
+ } catch (ex) {
2238
+ return returnError(ex, res, req);
2239
+ }
2240
+ server.externalServices.coinGecko.coinGeckoGetMarketStats(req)
2241
+ .then(response => {
2242
+ res.json(response);
2243
+ })
2244
+ .catch(err => {
2245
+ return returnError(err ?? 'unknown', res, req);
2246
+ });
2247
+ });
2248
+
2249
+ router.get('/v1/services/dex/getSpenderApprovalWhitelist', (req, res) => {
2250
+ let server: WalletService;
2251
+ try {
2252
+ server = getServer(req, res);
2253
+ } catch (ex) {
2254
+ return returnError(ex, res, req);
2255
+ }
2256
+
2257
+ server.getSpenderApprovalWhitelist((err, response) => {
2258
+ if (err) return returnError(err, res, req);
2259
+ res.json(response);
2260
+ });
2261
+ });
2262
+
2263
+ const moralisCorsOptions = {
2264
+ origin: (origin, cb) => {
2265
+ const moralisWhiteList = config.moralis?.whitelist ?? [];
2266
+ if (moralisWhiteList.indexOf(origin) !== -1) {
2267
+ cb(null, true);
2268
+ } else {
2269
+ cb(new Error('Not allowed by CORS'));
2270
+ }
2271
+ },
2272
+ };
2273
+
2274
+ router.post('/v1/moralis/getWalletTokenBalances', cors(moralisCorsOptions), (req, res) => {
2275
+ let server: WalletService;
2276
+ try {
2277
+ server = getServer(req, res);
2278
+ } catch (ex) {
2279
+ return returnError(ex, res, req);
2280
+ }
2281
+
2282
+ server.moralisGetWalletTokenBalances(req)
2283
+ .then(response => {
2284
+ res.json(response);
2285
+ })
2286
+ .catch(err => {
2287
+ return returnError(err ?? 'unknown', res, req);
2288
+ });
2289
+ });
2290
+
2291
+ router.post('/v1/moralis/moralisGetTokenAllowance', cors(moralisCorsOptions), (req, res) => {
2292
+ let server: WalletService;
2293
+ try {
2294
+ server = getServer(req, res);
2295
+ } catch (ex) {
2296
+ return returnError(ex, res, req);
2297
+ }
2298
+
2299
+ server.moralisGetTokenAllowance(req)
2300
+ .then(response => {
2301
+ res.json(response);
2302
+ })
2303
+ .catch(err => {
2304
+ return returnError(err ?? 'unknown', res, req);
2305
+ });
2306
+ });
2307
+
2308
+ router.post('/v1/moralis/moralisGetNativeBalance', cors(moralisCorsOptions), (req, res) => {
2309
+ let server: WalletService;
2310
+ try {
2311
+ server = getServer(req, res);
2312
+ } catch (ex) {
2313
+ return returnError(ex, res, req);
2314
+ }
2315
+
2316
+ server.moralisGetNativeBalance(req)
2317
+ .then(response => {
2318
+ res.json(response);
2319
+ })
2320
+ .catch(err => {
2321
+ return returnError(err ?? 'unknown', res, req);
2322
+ });
2323
+ });
2324
+
2325
+ router.post('/v1/moralis/GetTokenPrice', cors(moralisCorsOptions), (req, res) => {
2326
+ let server: WalletService;
2327
+ try {
2328
+ server = getServer(req, res);
2329
+ } catch (ex) {
2330
+ return returnError(ex, res, req);
2331
+ }
2332
+
2333
+ server.moralisGetTokenPrice(req)
2334
+ .then(response => {
2335
+ res.json(response);
2336
+ })
2337
+ .catch(err => {
2338
+ return returnError(err ?? 'unknown', res, req);
2339
+ });
2340
+ });
2341
+
2342
+ router.post('/v1/moralis/getMultipleERC20TokenPrices', cors(moralisCorsOptions), (req, res) => {
2343
+ let server: WalletService;
2344
+ try {
2345
+ server = getServer(req, res);
2346
+ } catch (ex) {
2347
+ return returnError(ex, res, req);
2348
+ }
2349
+
2350
+ server.moralisGetMultipleERC20TokenPrices(req)
2351
+ .then(response => {
2352
+ res.json(response);
2353
+ })
2354
+ .catch(err => {
2355
+ return returnError(err ?? 'unknown', res, req);
2356
+ });
2357
+ });
2358
+
2359
+ router.post('/v1/moralis/getERC20TokenBalancesWithPricesByWallet', cors(moralisCorsOptions), (req, res) => {
2360
+ let server: WalletService;
2361
+ try {
2362
+ server = getServer(req, res);
2363
+ } catch (ex) {
2364
+ return returnError(ex, res, req);
2365
+ }
2366
+
2367
+ server.moralisGetERC20TokenBalancesWithPricesByWallet(req)
2368
+ .then(response => {
2369
+ res.json(response);
2370
+ })
2371
+ .catch(err => {
2372
+ return returnError(err ?? 'unknown', res, req);
2373
+ });
2374
+ });
2375
+
2376
+ router.post('/v1/moralis/getSolWalletPortfolio', cors(moralisCorsOptions), (req, res) => {
2377
+ let server: WalletService;
2378
+ try {
2379
+ server = getServer(req, res);
2380
+ } catch (ex) {
2381
+ return returnError(ex, res, req);
2382
+ }
2383
+
2384
+ server.moralisGetSolWalletPortfolio(req)
2385
+ .then(response => {
2386
+ res.json(response);
2387
+ })
2388
+ .catch(err => {
2389
+ return returnError(err ?? 'unknown', res, req);
2390
+ });
2391
+ });
2392
+
2393
+ /** Imported routes */
2394
+ router.use(new TssRouter({ returnError, opts }).router);
2395
+
2396
+
2397
+ // Set no-cache by default
2398
+ this.app.use((req, res, next) => {
2399
+ res.setHeader('Cache-Control', 'no-store');
2400
+ next();
2401
+ });
2402
+
2403
+ const staticPath = path.join(__dirname, '../../../static');
2404
+ this.app.use('/bws/static', express.static(staticPath));
2405
+
2406
+ this.app.use(opts.basePath || '/bws/api', router);
2407
+
2408
+ if (config.staticRoot) {
2409
+ logger.debug(`Serving static files from ${config.staticRoot}`);
2410
+ this.app.use('/static', express.static(config.staticRoot));
2411
+ }
2412
+
2413
+ WalletService.initialize(opts, cb);
2414
+ }
2415
+ }