mainnet-js 2.0.1 → 2.1.0-alpha.5

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 (90) hide show
  1. package/dist/index.html +1 -1
  2. package/dist/{mainnet-2.0.1.js → mainnet-2.1.0-alpha.5.js} +18 -58
  3. package/dist/module/db/StorageProvider.d.ts +9 -9
  4. package/dist/module/db/StorageProvider.d.ts.map +1 -1
  5. package/dist/module/db/StorageProvider.js +2 -1
  6. package/dist/module/db/StorageProvider.js.map +1 -1
  7. package/dist/module/db/index.d.ts +1 -2
  8. package/dist/module/db/index.d.ts.map +1 -1
  9. package/dist/module/db/index.js +2 -2
  10. package/dist/module/db/index.js.map +1 -1
  11. package/dist/module/db/interface.d.ts +0 -12
  12. package/dist/module/db/interface.d.ts.map +1 -1
  13. package/dist/module/db/util.d.ts +0 -2
  14. package/dist/module/db/util.d.ts.map +1 -1
  15. package/dist/module/db/util.js +0 -23
  16. package/dist/module/db/util.js.map +1 -1
  17. package/dist/module/index.d.ts +0 -1
  18. package/dist/module/index.d.ts.map +1 -1
  19. package/dist/module/index.js +0 -4
  20. package/dist/module/index.js.map +1 -1
  21. package/dist/module/network/index.d.ts +1 -0
  22. package/dist/module/network/index.d.ts.map +1 -1
  23. package/dist/module/wallet/Base.d.ts +1 -1
  24. package/dist/module/wallet/Base.d.ts.map +1 -1
  25. package/dist/module/wallet/Base.js +6 -1
  26. package/dist/module/wallet/Base.js.map +1 -1
  27. package/dist/module/wallet/Bcmr.d.ts.map +1 -1
  28. package/dist/module/wallet/Bcmr.js +3 -1
  29. package/dist/module/wallet/Bcmr.js.map +1 -1
  30. package/dist/tsconfig.tsbuildinfo +1 -1
  31. package/package.json +2 -12
  32. package/src/db/StorageProvider.ts +9 -9
  33. package/src/db/index.ts +1 -2
  34. package/src/db/interface.ts +0 -14
  35. package/src/db/util.ts +0 -26
  36. package/src/index.ts +0 -5
  37. package/src/network/index.ts +1 -0
  38. package/src/wallet/Base.ts +9 -2
  39. package/src/wallet/Bcmr.ts +5 -1
  40. package/src/wallet/Wif.test.ts +0 -42
  41. package/dist/module/db/IndexedDBProvider.d.ts +0 -16
  42. package/dist/module/db/IndexedDBProvider.d.ts.map +0 -1
  43. package/dist/module/db/IndexedDBProvider.js +0 -80
  44. package/dist/module/db/IndexedDBProvider.js.map +0 -1
  45. package/dist/module/db/SqlProvider.d.ts +0 -40
  46. package/dist/module/db/SqlProvider.d.ts.map +0 -1
  47. package/dist/module/db/SqlProvider.js +0 -198
  48. package/dist/module/db/SqlProvider.js.map +0 -1
  49. package/dist/module/db/getStorageProvider.d.ts +0 -3
  50. package/dist/module/db/getStorageProvider.d.ts.map +0 -1
  51. package/dist/module/db/getStorageProvider.js +0 -19
  52. package/dist/module/db/getStorageProvider.js.map +0 -1
  53. package/dist/module/webhook/Webhook.d.ts +0 -36
  54. package/dist/module/webhook/Webhook.d.ts.map +0 -1
  55. package/dist/module/webhook/Webhook.js +0 -77
  56. package/dist/module/webhook/Webhook.js.map +0 -1
  57. package/dist/module/webhook/WebhookBch.d.ts +0 -14
  58. package/dist/module/webhook/WebhookBch.d.ts.map +0 -1
  59. package/dist/module/webhook/WebhookBch.js +0 -141
  60. package/dist/module/webhook/WebhookBch.js.map +0 -1
  61. package/dist/module/webhook/WebhookWorker.d.ts +0 -23
  62. package/dist/module/webhook/WebhookWorker.d.ts.map +0 -1
  63. package/dist/module/webhook/WebhookWorker.js +0 -94
  64. package/dist/module/webhook/WebhookWorker.js.map +0 -1
  65. package/dist/module/webhook/index.d.ts +0 -5
  66. package/dist/module/webhook/index.d.ts.map +0 -1
  67. package/dist/module/webhook/index.js +0 -5
  68. package/dist/module/webhook/index.js.map +0 -1
  69. package/dist/module/webhook/interface.d.ts +0 -8
  70. package/dist/module/webhook/interface.d.ts.map +0 -1
  71. package/dist/module/webhook/interface.js +0 -2
  72. package/dist/module/webhook/interface.js.map +0 -1
  73. package/src/Wallet.test.headless.js +0 -369
  74. package/src/Wallet.test.ts +0 -519
  75. package/src/db/IndexedDBProvider.test.ts +0 -69
  76. package/src/db/IndexedDBProvider.ts +0 -93
  77. package/src/db/SqlProvider.test.ts +0 -282
  78. package/src/db/SqlProvider.ts +0 -297
  79. package/src/db/getStorageProvider.ts +0 -20
  80. package/src/db/index.test.headless.js +0 -62
  81. package/src/db/index.test.ts +0 -64
  82. package/src/wallet/createWallet.test.ts +0 -155
  83. package/src/webhook/Webhook.test.ts +0 -9
  84. package/src/webhook/Webhook.ts +0 -99
  85. package/src/webhook/WebhookBch.test.ts +0 -323
  86. package/src/webhook/WebhookBch.ts +0 -198
  87. package/src/webhook/WebhookWorker.test.ts +0 -96
  88. package/src/webhook/WebhookWorker.ts +0 -119
  89. package/src/webhook/index.ts +0 -4
  90. package/src/webhook/interface.ts +0 -7
@@ -1,282 +0,0 @@
1
- import { default as SqlProvider } from "./SqlProvider";
2
- import { RegTestWallet, TestNetWallet, Wallet } from "../wallet/Wif";
3
- import { WebhookRecurrence, WebhookType } from "../webhook";
4
- import { WalletI } from "./interface";
5
-
6
- /**
7
- * @jest-environment jsdom
8
- */
9
- test("Store and retrieve a Regtest wallet", async () => {
10
- let db = new SqlProvider(`regtest2 ${Math.random()}`);
11
- await db.init();
12
- let w1 = await RegTestWallet.newRandom();
13
- w1.name = "dave";
14
- await db.addWallet(w1.name, w1.toString());
15
- let w2 = await db.getWallet("dave");
16
- expect(w1.name).toBe(w2!.name);
17
- expect(w1.toString()).toBe(w2!.wallet);
18
- db.close();
19
- });
20
-
21
- test("Store and replace a Regtest wallet", async () => {
22
- let db = new SqlProvider(`regtest2 ${Math.random()}`);
23
- await db.init();
24
-
25
- expect(await db.walletExists("storereplace")).toBe(false);
26
- let w1 = await db.addWallet("storereplace", "keep seed");
27
- let w2 = await db.getWallet("storereplace");
28
- expect("keep seed").toBe(w2!.wallet);
29
- expect(await db.walletExists("storereplace")).toBe(true);
30
-
31
- let seedId = (
32
- await RegTestWallet.fromSeed(new Array(12).join("abandon "))
33
- ).toDbString();
34
- let w3 = await db.updateWallet("storereplace", seedId);
35
- let w4 = await db.getWallet("storereplace");
36
- expect(w4!.wallet).not.toBe("keep seed");
37
- expect(w4!.wallet).toBe(seedId);
38
-
39
- let w5 = await db.updateWallet("storereplace_nonexistent", seedId);
40
- let w6 = await db.getWallet("storereplace_nonexistent")!;
41
- expect(w6).toBe(undefined);
42
-
43
- db.close();
44
- });
45
-
46
- test("Store and retrieve a Testnet wallet", async () => {
47
- let db = new SqlProvider(`testnet ${Math.random()}`);
48
- await db.init();
49
- let w1 = await TestNetWallet.newRandom();
50
- w1.name = "dave";
51
- await db.addWallet(w1.name, w1.toString());
52
- let w2 = await db.getWallet(w1.name);
53
- expect(w1.name).toBe(w2!.name);
54
- expect(w1.toString()).toBe(w2!.wallet);
55
- db.close();
56
- });
57
-
58
- test("Store and retrieve a Wif wallet", async () => {
59
- let db = new SqlProvider(`mainnet ${Math.random()}`);
60
- await db.init();
61
- let w1 = await Wallet.newRandom();
62
- w1.name = "dave";
63
- await db.addWallet(w1.name, w1.toString());
64
- let w2 = await db.getWallet(w1.name);
65
- expect(w1.name).toBe(w2!.name);
66
- expect(w1.toString()).toBe(w2!.wallet);
67
- db.close();
68
- });
69
-
70
- test("Should handle basic sql injection", async () => {
71
- let sh = new SqlProvider(`still_here ${Math.random()}`);
72
- await sh.init();
73
- let w1 = await Wallet.newRandom();
74
- await sh.addWallet("okay", w1.toString());
75
-
76
- let db = new SqlProvider(`;DELETE table still_here; ${Math.random()}`);
77
- await db.init();
78
- let alice = await RegTestWallet.newRandom();
79
- let bob = await RegTestWallet.newRandom();
80
- let charlie = await RegTestWallet.newRandom();
81
- await db.addWallet("alice", alice.toString());
82
- await db.addWallet("bob", bob.toString());
83
- await db.addWallet("charlie", charlie.toString());
84
- let beforeWallets = await db.getWallets();
85
- expect(beforeWallets.length).toBe(3);
86
- let dave = await RegTestWallet.newRandom();
87
- await db.addWallet("; DELETE * FROM wallet limit 10;", dave.toString());
88
- await db.addWallet(
89
- "' or 1=1; DELETE * FROM wallet limit 10;",
90
- dave.toString()
91
- );
92
- await db.addWallet(
93
- "; DELETE FROM wallet WHERE GUID ='' OR '' = '';",
94
- dave.toString()
95
- );
96
- await db.addWallet("' or 1=1; TRUNCATE wallet;", dave.toString());
97
- await db.addWallet("' or 1=1; DROP table Wallet;", dave.toString());
98
- let wallets = await db.getWallets();
99
- expect(wallets.length).toBe(8);
100
- let otherTableWallets = await sh.getWallets();
101
- expect(otherTableWallets.length).toBe(1);
102
- db.close();
103
- sh.close();
104
- });
105
-
106
- test("Test wallet database name regression", async () => {
107
- const name = `test ${Math.random()}`;
108
-
109
- let wallet: Wallet, db: SqlProvider, dbWallet: WalletI | undefined;
110
-
111
- wallet = await Wallet.named(name);
112
- db = new SqlProvider("bitcoincash");
113
- await db.init();
114
- dbWallet = await db.getWallet(name);
115
- expect(wallet.toDbString()).toBe(dbWallet!.wallet);
116
- await db.close();
117
-
118
- wallet = await TestNetWallet.named(name);
119
- db = new SqlProvider("bchtest");
120
- await db.init();
121
- dbWallet = await db.getWallet(name);
122
- expect(wallet.toDbString()).toBe(dbWallet!.wallet);
123
- await db.close();
124
-
125
- wallet = await RegTestWallet.named(name);
126
- db = new SqlProvider("bchreg");
127
- await db.init();
128
- dbWallet = await db.getWallet(name);
129
- expect(wallet.toDbString()).toBe(dbWallet!.wallet);
130
- await db.close();
131
- });
132
-
133
- test("Should get ssl parameters from env", async () => {
134
- process.env.DATABASE_SSL_REJECT_UNAUTHORIZED = "false";
135
- process.env.DATABASE_SSL_CA =
136
- "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURhekNDQWxPZ0F3SUJBZ0lVQ1A0Vi9Ca2lyL3ZSVFN6TVFVTkZ3N1JsOStNd0RRWUpLb1pJaHZjTkFRRUwKQlFBd1JURUxNQWtHQTFVRUJoTUNRVlV4RXpBUkJnTlZCQWdNQ2xOdmJXVXRVM1JoZEdVeElUQWZCZ05WQkFvTQpHRWx1ZEdWeWJtVjBJRmRwWkdkcGRITWdVSFI1SUV4MFpEQWVGdzB5TVRBNU16QXhOREF5TVRaYUZ3MHlOakE1Ck1qa3hOREF5TVRaYU1FVXhDekFKQmdOVkJBWVRBa0ZWTVJNd0VRWURWUVFJREFwVGIyMWxMVk4wWVhSbE1TRXcKSHdZRFZRUUtEQmhKYm5SbGNtNWxkQ0JYYVdSbmFYUnpJRkIwZVNCTWRHUXdnZ0VpTUEwR0NTcUdTSWIzRFFFQgpBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRREpnSEVOY2VvUngwZDJmN0pyaXQ5ZTEzTXRITGF6YlpYbjFUR2JsT2JvCkVrcERQUStJeFJ4aTF5cDc0QmwwR2gyendFMzl5VDViUCs4R2RSUS9JdmV5OHJLOFdBREE0ZlhpbjFuSy9sckcKSmVEZzVSNk1TMEZLZWUrZFV5a1kya2lFK3o3RU41bFZ5RGNKWCs2NmI5cmhqM2ZsWEsyQWhBR0c2V1ZlSnBRNgoxWFVuZXhvSnFlWWhHTzlEYWRuWTZGMkhCbHBWUzJwaGEyMEZOWXh2V2RsV2NmdHdpTG8zSng2WEFRanhoc3h6ClA2c0lHcjRwbFRXZUNsOE5ySjNxZ25OQXI5bVBOZGVQYjRTU1cySVVieGdqaG02bDhGUTl1dW5qd0F4amhKWUQKTnN1R0Z2aEZreFErdlEwdi9MbHhuNUVTVStLWUo5QzlYV3dwQ3JXVlpxMzVBZ01CQUFHalV6QlJNQjBHQTFVZApEZ1FXQkJRNTBNdkdVazVwUWxhUThWN0VZVWdjSEJYcjhEQWZCZ05WSFNNRUdEQVdnQlE1ME12R1VrNXBRbGFRCjhWN0VZVWdjSEJYcjhEQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01BMEdDU3FHU0liM0RRRUJDd1VBQTRJQkFRQngKWGFjcU9Cc3hwVzlzNXM4ZG11VzA1bUcwc1hjYktIeDFvclRuRWlHRFFueVNBNjEraVdMZ0RHMkFBR2RnWm0rTwpKMDNFNG15TllGb09QbkpRTVZmYlZaZ2lZOVd3WElOakhORmRHRWNwRkxEZ2p4MlZ3MUZBajQwN0c1K0VWK21rCnJyVloxbm0wNHhRaks4ck1FVnV1MmJzNUxMQkx6UWg4eGxSL0lVREtWK2E3UjJXbVRFSWEyaGJWMXN4cVZUblIKdkZjclVBOWNXaW1RMTVkcE1oOUxTbHRNRy9EclJGbWdDcHBNcHZPYlZyUVZUWTNpbzd3UmZ5OWx4Um1aTVFlTQpPQWszOXc3M002cHUwLzNNL0JqcnM4aE1kbHlZMkpWQmY5N2JBbS9ON2dUckhvckFXSWN0L0J3NWNyM0ZmYTYrCmxuRDRQS1Y4SFYrQTczVi84MitNCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K";
137
- process.env.DATABASE_SSL_KEY =
138
- "LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFb3dJQkFBS0NBUUVBeVlCeERYSHFFY2RIZG4reWE0cmZYdGR6TFJ5MnMyMlY1OVV4bTVUbTZCSktRejBQCmlNVWNZdGNxZStBWmRCb2RzOEJOL2NrK1d6L3ZCblVVUHlMM3N2S3l2RmdBd09IMTRwOVp5djVheGlYZzRPVWUKakV0QlNubnZuVk1wR05wSWhQcyt4RGVaVmNnM0NWL3V1bS9hNFk5MzVWeXRnSVFCaHVsbFhpYVVPdFYxSjNzYQpDYW5tSVJqdlEybloyT2hkaHdaYVZVdHFZV3R0QlRXTWIxblpWbkg3Y0lpNk55Y2Vsd0VJOFliTWN6K3JDQnErCktaVTFuZ3BmRGF5ZDZvSnpRSy9aanpYWGoyK0VrbHRpRkc4WUk0WnVwZkJVUGJycDQ4QU1ZNFNXQXpiTGhoYjQKUlpNVVByME5ML3k1Y1orUkVsUGltQ2ZRdlYxc0tRcTFsV2F0K1FJREFRQUJBb0lCQUQ2Y2xvUmkvU1NCRTRlUwpybElVV013VGprcGFQYnNMTmlWUGJaYTJjZmx5bFhqSEpHaVBOdjdQZFBnQTdtZlJKYUdSQTZyME9WZ0pTYkJyCitOcVZkdm8zeDZvV2ZrVnc4UUoyR1dTbUhIYXRsbTdMUXU2OUE1Q3N5dlBMdjExbGxsc2I1cWo1emIrRjh2UUsKeHhkUFltZnNPSWtnZnhrTDY1Mk1NRjlOQllveDg2YTgveE5DaGZ5MHFJdWRObmhOT3NyMnBHT1A4aTZmNWhVcgpLcW9SL3NMY3NjaHY2VGtvd0N0MjNzdmlkWUFseDlISE9NMTV1TGcrYUxhd1dWdkh0ZHlJUVU1aUxvck5EYVRECnozWW1Ob2p0UzdFa2VaTDBlZnJQa1pMUUhlcWgxTUkrQVo4RFZFQTFEa0dVaGRsVmhmUzhBQWhkRG1sb3RrRFYKcjhNTXpYRUNnWUVBL2luVlZJTlFoVGVEV0l3c2ppOXJDNE55MUlrRXB2K1FxUUFIc0pxdk15anV3NmdsSFA5bQp1U2JBU1NpTzh5VnU1OGF2UUxUS01ZdHlGYm9tdzFQcmRmVmVLUjl3ZXFDSGUxbE9GcVl6SzV6TEttelZUeXRnCmxCY0FXcjAxanBMeXpwS29ybmpEYzR0dE1TdlBZTm1ISXh4SWhiSDNHU2QwbW9qazU5UEFKcjhDZ1lFQXl2VXgKQ2FoU1VyRUg2N0dWM3djZnByRHd0V1BVcFNEMkF0emlvbjJRcERTMXk5dDUzcE1ZSUdVTkxjWUpMZ0JKQzE2WQozV1FSRmRsSCtEUDdIaEdma1VlRmFMOWcxUUJDZmltWW9ZczZOS1ZCcTRjWVh2QVZTRWc2bGMvc1hHK0R0T1JQCmhBUmRJM0pndVdNaFZjNGI5Vm1Jai92bVQ1MnFFVkVtcHEwRzBVY0NnWUFTVi82WG5PcWcwc0xlRHkvZ0N6Z1UKbXFZZEJNNmJKdkxQMzdxdVdsdXV1NU9QOTRER09RQzIrRDhFaUxMWWhha2RmVStFd2dlZHo4eXFHTWRYYmFVZQozRml4YXgxNUhFRHEvQ1VRcVdva0NhcjRJdWE2VWcwa1l3eVpmL0p2bWRlQVpVRmJaa2ZrL1BraWhXRHdRb0xvClc5QTRKZ0lKaExsN3RjbWZtYjdTalFLQmdDTkI3dy9uYnMyd3RWaUxsQ2FYZlRjZSsrSDNBc1RnOGZ2VFZZZTIKMm42OExXekpwdVUwbG5kaU5xVGlCMHczZm5qOEtRQWsxeGI5bFJRWUs2S3dteERJNVBNcWMrN3N5YUJUSjVIQQp0dzdZT28xS3ZjQVlZd29ZaWh6bWJ3QXIyeXg4a1JlMURsMFBES0NJQ1ExMzdjRjBtVld5QS9PR3h6bVU2R3NDCkdmSVhBb0dCQUx3aWppT3VVOC9qQndkUzlZdndiNG5lNllnWGkwNHhhczBvU0F4bkduUndJWVFaZFlWdjYxRkIKZzVPbFo0bEN3RURtQytjckdVVTYwbTAxbW1qTXlDdW55VWVzVnZ0U050MVRQYVA1NkVyZ1FLcm1DTEF2cnJYKwpidldjMEtIWTkxaFluOWcwcEdWTGdkcjZnc0JUN3JFeVdVclFZM095elNobCt5TytCTkRJCi0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCg==";
139
- process.env.DATABASE_SSL_CERT =
140
- "LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFb3dJQkFBS0NBUUVBMFUzNlhUay9Jc1ZjMy9FcnA0MmJ0bk1VTVBONkdkRExQZ3lOcld5WFd5NU1PdUQ5Cm5tSld4Y3B2SGxiVmpoaTFNTUZObFVzbFlaWGVZSkh5L2tVY2gvNXVhVU0vbUowbzhUZ3R1dXVHdkxrOTVqNDkKM2QwTTVXSm5MQWVqMFdIdnpsQ2lNTnh1Q0JYT2NaVkxrYVNXMm5MUEczSW5wRTdsald0U3BhZ3pZVjRZcHduRwp2aU1FMjdkQzRzWGtwLzlWaW9iTlBGR3BpM3JQemtLcHpvZmFEaHZnQmJQR0djcTN4RUhrK2Rya245aEU2cVhSCm1LTTlwU0F6SEdFY2lWMlo1QmdiZ1U5ZlJUaGRMY2JYcy9MN2t5SjJkYWQ3VEU5QnhtYVFBS3ZRbGRsbFBQbVIKRG1ZclhMRWxHMjV2NkdsMWNvbnUxRHdQQmNkRUFrSmQwSDhhYndJREFRQUJBb0lCQVFETEQ1b2NvNU9MU21zbQpvTFkzb24wMWIwUmhrWFllWWFFdEc4VEFRaUE5eUJjUThJTmVEQTRmYXB5UGxMTXZYdTA2MWU5TkxsQ2Y4bVNDCjBGWXROaVBPRkp4TjUzNWxzK09xMDFRYWlySjNta2hoZm5WTE1GQjRveFZ4ZENBTTNiVm9ObmFFYlBjYlJQeTYKMlpzdE83OVhSQmVHaXlQR2x2ekNUU01yc0puWWxVemI0Q2pGRkN1M3VCdGd2UjVQazRtUXVkMmszWDJaaFBnawpoTWgyNDBnMFZrUVliZjM1ZEs0NG05R1hYSnFZa0FNOHhEZi9uNXlEVDhWeHQvdXgwTHM3ckNnZWk0TXJDUURXCmdheXVBSXJpRHZxUmZJR2ViVXVTUTIvc0JqNmZ6ZW9xVU9DNFFFSlc4Z2tRd3dnRGVpK1VOMlV4eVdJMGU5MzcKbTZlWXZkRVJBb0dCQVAxa1dMdWZmMVViMHkwRUtIUjc0a2FuRWc5dFZmcDhVSVBENzFmM2gwR250SThEY3ZRagpzeVgyUHBrZ0lXUndKekxYbk9DVXpmdjkrb1ZmejU3bXA2N3lwTjZhZ2ZEdGhXL2c0NzZLWVRzMnY0RFAyckUyCi81K2RZTUFsRVcyRGdIV0ZBMVhJN01GVXM4dXNwSS80eCtwK28zWDE2dUFzSSt1U2lkaXR2Y3pyQW9HQkFOTjEKZDVYb3dYWTQ1L0k5MDYwY2puZGVyZGxVVUR2emp3TWVQRjJuZ2xla2dOZG5Yb2hZd2dNVlc5TmhBZVRLYTNrTQpPNUNtZE93NEgvdUFwcnBTSEVsQTVrVWc1VFlrTFlFSkFuMldhMXh6THhzOE8vTjBKcDBRa2lyN3J4WnRTSDQ5Cmt3Y0htQjNJenJkNzNaZXBkODFMNHhXWmJ0TWJoQnVKYVBheEhIZU5Bb0dBQ1lIcFhtaldvei9mQlpKaFhqV0QKd1BqbDBaUmRwSDlqbWY0UkRmRG9yMHIybUdNZHZoRlUySGpMMG4wRkk3cWRqZWZQS0JJTlJJWThEeU1RTERzbApVWWdqTFlNSW14eWVaQnRCRUZZcTNjanBHSkV6K0hCQzJSOVRrUUlUREZQaHp3Y0ZvQU5nOXNRUjF2T01YU2FOCmdidnNzREZnOWJaU1JyV0IzSkp3UzY4Q2dZQXJiZkRGcFN3MnI3RlRtMGNpUXI4djNRNHZtSlZ4K3EvZ29CRWQKMncxMkdwOHJubHRYL1lLN1IyTzRvaS9WWVkxNUt2NEEwMjhvSk03TXhMdDVnT3UyVDlIN1dLbzYyR3RRR1IyZAoxWXJ2VGVqYTJ5QWsvRElDQ0NrOUVydi9DeXJjWXFFVHpJZDlkb1NlUXA1Y1M3NERPQmJIbE4raUZBQ3A5eXJMCm44eU04UUtCZ0Z5SzlUeDMvZjc2anZFYzRuRzM2eStVK3pQYTBQRjlQWWRmc1VPZ29VbnRydnVCZ0lxaHZubWoKekNMWEV2UGw3aXhDK0lMNWF1MllQL0h4bUJsTmlES3Y4YzllUHB0djZPZFRyMGdZaHR6RTNGemRzQ1J1eFY4MwpFYmZlalBoZHJTakR2ZElaS0pEdkIxcmNRR2dwZFB2eFYwMmU0TThUckNacGtMNGxiUWFrCi0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCg==";
141
-
142
- let fake_ca = `-----BEGIN CERTIFICATE-----
143
- MIIDazCCAlOgAwIBAgIUCP4V/Bkir/vRTSzMQUNFw7Rl9+MwDQYJKoZIhvcNAQEL
144
- BQAwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM
145
- GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDAeFw0yMTA5MzAxNDAyMTZaFw0yNjA5
146
- MjkxNDAyMTZaMEUxCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEw
147
- HwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQwggEiMA0GCSqGSIb3DQEB
148
- AQUAA4IBDwAwggEKAoIBAQDJgHENceoRx0d2f7Jrit9e13MtHLazbZXn1TGblObo
149
- EkpDPQ+IxRxi1yp74Bl0Gh2zwE39yT5bP+8GdRQ/Ivey8rK8WADA4fXin1nK/lrG
150
- JeDg5R6MS0FKee+dUykY2kiE+z7EN5lVyDcJX+66b9rhj3flXK2AhAGG6WVeJpQ6
151
- 1XUnexoJqeYhGO9DadnY6F2HBlpVS2pha20FNYxvWdlWcftwiLo3Jx6XAQjxhsxz
152
- P6sIGr4plTWeCl8NrJ3qgnNAr9mPNdePb4SSW2IUbxgjhm6l8FQ9uunjwAxjhJYD
153
- NsuGFvhFkxQ+vQ0v/Llxn5ESU+KYJ9C9XWwpCrWVZq35AgMBAAGjUzBRMB0GA1Ud
154
- DgQWBBQ50MvGUk5pQlaQ8V7EYUgcHBXr8DAfBgNVHSMEGDAWgBQ50MvGUk5pQlaQ
155
- 8V7EYUgcHBXr8DAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQBx
156
- XacqOBsxpW9s5s8dmuW05mG0sXcbKHx1orTnEiGDQnySA61+iWLgDG2AAGdgZm+O
157
- J03E4myNYFoOPnJQMVfbVZgiY9WwXINjHNFdGEcpFLDgjx2Vw1FAj407G5+EV+mk
158
- rrVZ1nm04xQjK8rMEVuu2bs5LLBLzQh8xlR/IUDKV+a7R2WmTEIa2hbV1sxqVTnR
159
- vFcrUA9cWimQ15dpMh9LSltMG/DrRFmgCppMpvObVrQVTY3io7wRfy9lxRmZMQeM
160
- OAk39w73M6pu0/3M/Bjrs8hMdlyY2JVBf97bAm/N7gTrHorAWIct/Bw5cr3Ffa6+
161
- lnD4PKV8HV+A73V/82+M
162
- -----END CERTIFICATE-----
163
- `;
164
- let fake_key = `-----BEGIN RSA PRIVATE KEY-----
165
- MIIEowIBAAKCAQEAyYBxDXHqEcdHdn+ya4rfXtdzLRy2s22V59Uxm5Tm6BJKQz0P
166
- iMUcYtcqe+AZdBods8BN/ck+Wz/vBnUUPyL3svKyvFgAwOH14p9Zyv5axiXg4OUe
167
- jEtBSnnvnVMpGNpIhPs+xDeZVcg3CV/uum/a4Y935VytgIQBhullXiaUOtV1J3sa
168
- CanmIRjvQ2nZ2OhdhwZaVUtqYWttBTWMb1nZVnH7cIi6NycelwEI8YbMcz+rCBq+
169
- KZU1ngpfDayd6oJzQK/ZjzXXj2+EkltiFG8YI4ZupfBUPbrp48AMY4SWAzbLhhb4
170
- RZMUPr0NL/y5cZ+RElPimCfQvV1sKQq1lWat+QIDAQABAoIBAD6cloRi/SSBE4eS
171
- rlIUWMwTjkpaPbsLNiVPbZa2cflylXjHJGiPNv7PdPgA7mfRJaGRA6r0OVgJSbBr
172
- +NqVdvo3x6oWfkVw8QJ2GWSmHHatlm7LQu69A5CsyvPLv11lllsb5qj5zb+F8vQK
173
- xxdPYmfsOIkgfxkL652MMF9NBYox86a8/xNChfy0qIudNnhNOsr2pGOP8i6f5hUr
174
- KqoR/sLcschv6TkowCt23svidYAlx9HHOM15uLg+aLawWVvHtdyIQU5iLorNDaTD
175
- z3YmNojtS7EkeZL0efrPkZLQHeqh1MI+AZ8DVEA1DkGUhdlVhfS8AAhdDmlotkDV
176
- r8MMzXECgYEA/inVVINQhTeDWIwsji9rC4Ny1IkEpv+QqQAHsJqvMyjuw6glHP9m
177
- uSbASSiO8yVu58avQLTKMYtyFbomw1PrdfVeKR9weqCHe1lOFqYzK5zLKmzVTytg
178
- lBcAWr01jpLyzpKornjDc4ttMSvPYNmHIxxIhbH3GSd0mojk59PAJr8CgYEAyvUx
179
- CahSUrEH67GV3wcfprDwtWPUpSD2Atzion2QpDS1y9t53pMYIGUNLcYJLgBJC16Y
180
- 3WQRFdlH+DP7HhGfkUeFaL9g1QBCfimYoYs6NKVBq4cYXvAVSEg6lc/sXG+DtORP
181
- hARdI3JguWMhVc4b9VmIj/vmT52qEVEmpq0G0UcCgYASV/6XnOqg0sLeDy/gCzgU
182
- mqYdBM6bJvLP37quWluuu5OP94DGOQC2+D8EiLLYhakdfU+Ewgedz8yqGMdXbaUe
183
- 3Fixax15HEDq/CUQqWokCar4Iua6Ug0kYwyZf/JvmdeAZUFbZkfk/PkihWDwQoLo
184
- W9A4JgIJhLl7tcmfmb7SjQKBgCNB7w/nbs2wtViLlCaXfTce++H3AsTg8fvTVYe2
185
- 2n68LWzJpuU0lndiNqTiB0w3fnj8KQAk1xb9lRQYK6KwmxDI5PMqc+7syaBTJ5HA
186
- tw7YOo1KvcAYYwoYihzmbwAr2yx8kRe1Dl0PDKCICQ137cF0mVWyA/OGxzmU6GsC
187
- GfIXAoGBALwijiOuU8/jBwdS9Yvwb4ne6YgXi04xas0oSAxnGnRwIYQZdYVv61FB
188
- g5OlZ4lCwEDmC+crGUU60m01mmjMyCunyUesVvtSNt1TPaP56ErgQKrmCLAvrrX+
189
- bvWc0KHY91hYn9g0pGVLgdr6gsBT7rEyWUrQY3OyzShl+yO+BNDI
190
- -----END RSA PRIVATE KEY-----
191
- `;
192
-
193
- /// this is not a real certificate signed by the CA, it's fake
194
- let fake_cert = `-----BEGIN RSA PRIVATE KEY-----
195
- MIIEowIBAAKCAQEA0U36XTk/IsVc3/Erp42btnMUMPN6GdDLPgyNrWyXWy5MOuD9
196
- nmJWxcpvHlbVjhi1MMFNlUslYZXeYJHy/kUch/5uaUM/mJ0o8TgtuuuGvLk95j49
197
- 3d0M5WJnLAej0WHvzlCiMNxuCBXOcZVLkaSW2nLPG3InpE7ljWtSpagzYV4YpwnG
198
- viME27dC4sXkp/9ViobNPFGpi3rPzkKpzofaDhvgBbPGGcq3xEHk+drkn9hE6qXR
199
- mKM9pSAzHGEciV2Z5BgbgU9fRThdLcbXs/L7kyJ2dad7TE9BxmaQAKvQldllPPmR
200
- DmYrXLElG25v6Gl1conu1DwPBcdEAkJd0H8abwIDAQABAoIBAQDLD5oco5OLSmsm
201
- oLY3on01b0RhkXYeYaEtG8TAQiA9yBcQ8INeDA4fapyPlLMvXu061e9NLlCf8mSC
202
- 0FYtNiPOFJxN535ls+Oq01QairJ3mkhhfnVLMFB4oxVxdCAM3bVoNnaEbPcbRPy6
203
- 2ZstO79XRBeGiyPGlvzCTSMrsJnYlUzb4CjFFCu3uBtgvR5Pk4mQud2k3X2ZhPgk
204
- hMh240g0VkQYbf35dK44m9GXXJqYkAM8xDf/n5yDT8Vxt/ux0Ls7rCgei4MrCQDW
205
- gayuAIriDvqRfIGebUuSQ2/sBj6fzeoqUOC4QEJW8gkQwwgDei+UN2UxyWI0e937
206
- m6eYvdERAoGBAP1kWLuff1Ub0y0EKHR74kanEg9tVfp8UIPD71f3h0GntI8DcvQj
207
- syX2PpkgIWRwJzLXnOCUzfv9+oVfz57mp67ypN6agfDthW/g476KYTs2v4DP2rE2
208
- /5+dYMAlEW2DgHWFA1XI7MFUs8uspI/4x+p+o3X16uAsI+uSiditvczrAoGBANN1
209
- d5XowXY45/I9060cjnderdlUUDvzjwMePF2nglekgNdnXohYwgMVW9NhAeTKa3kM
210
- O5CmdOw4H/uAprpSHElA5kUg5TYkLYEJAn2Wa1xzLxs8O/N0Jp0Qkir7rxZtSH49
211
- kwcHmB3Izrd73Zepd81L4xWZbtMbhBuJaPaxHHeNAoGACYHpXmjWoz/fBZJhXjWD
212
- wPjl0ZRdpH9jmf4RDfDor0r2mGMdvhFU2HjL0n0FI7qdjefPKBINRIY8DyMQLDsl
213
- UYgjLYMImxyeZBtBEFYq3cjpGJEz+HBC2R9TkQITDFPhzwcFoANg9sQR1vOMXSaN
214
- gbvssDFg9bZSRrWB3JJwS68CgYArbfDFpSw2r7FTm0ciQr8v3Q4vmJVx+q/goBEd
215
- 2w12Gp8rnltX/YK7R2O4oi/VYY15Kv4A028oJM7MxLt5gOu2T9H7WKo62GtQGR2d
216
- 1YrvTeja2yAk/DICCCk9Erv/CyrcYqETzId9doSeQp5cS74DOBbHlN+iFACp9yrL
217
- n8yM8QKBgFyK9Tx3/f76jvEc4nG36y+U+zPa0PF9PYdfsUOgoUntrvuBgIqhvnmj
218
- zCLXEvPl7ixC+IL5au2YP/HxmBlNiDKv8c9ePptv6OdTr0gYhtzE3FzdsCRuxV83
219
- EbfejPhdrSjDvdIZKJDvB1rcQGgpdPvxV02e4M8TrCZpkL4lbQak
220
- -----END RSA PRIVATE KEY-----
221
- `;
222
-
223
- let provider = new SqlProvider(`regtest ${Math.random()}`);
224
- let c = provider.getConfig();
225
- expect(c.ssl.rejectUnauthorized).toBe(false);
226
- expect(c.ssl.ca).toBe(fake_ca);
227
- expect(c.ssl.key).toBe(fake_key);
228
- expect(c.ssl.cert).toMatch(fake_cert);
229
- });
230
-
231
- test("Should default to rejectUnauthorized false if not exactly false", async () => {
232
- process.env.DATABASE_SSL_REJECT_UNAUTHORIZED = "False";
233
-
234
- let provider = new SqlProvider(`regtest ${Math.random()}`);
235
- let c = provider.getConfig();
236
- expect(c.ssl.rejectUnauthorized).toBe(true);
237
- });
238
-
239
- test("Should default to rejectUnauthorized when undefined", async () => {
240
- process.env.DATABASE_SSL_REJECT_UNAUTHORIZED = undefined;
241
-
242
- let provider = new SqlProvider(`regtest ${Math.random()}`);
243
- let c = provider.getConfig();
244
- expect(c.ssl.rejectUnauthorized).toBe(true);
245
- });
246
-
247
- test("Should default to rejectUnauthorized when non-existent", async () => {
248
- delete process.env.DATABASE_SSL_REJECT_UNAUTHORIZED;
249
- let provider = new SqlProvider(`regtest ${Math.random()}`);
250
- let c = provider.getConfig();
251
- expect(c.ssl.rejectUnauthorized).toBe(true);
252
- });
253
-
254
- test("Should not have ssl property when unconfigured", async () => {
255
- delete process.env.DATABASE_SSL_REJECT_UNAUTHORIZED;
256
- delete process.env.DATABASE_SSL_CA;
257
- delete process.env.DATABASE_SSL_KEY;
258
- delete process.env.DATABASE_SSL_CERT;
259
- let provider = new SqlProvider(`regtest ${Math.random()}`);
260
- let c = provider.getConfig();
261
- expect(c.ssl).toBe(undefined);
262
- });
263
-
264
- test("Store and retrieve faucet queue items", async () => {
265
- let db = new SqlProvider(`testnet ${Math.random()}`);
266
- await db.init();
267
- await db.addFaucetQueueItem("0x00", "0x0a");
268
- await db.addFaucetQueueItem("0x01", "0x0b");
269
-
270
- await db.beginTransaction();
271
- const items = await db.getFaucetQueue();
272
- expect(items.length).toBe(2);
273
- expect(items[0].address).toBe("0x00");
274
- expect(items[0].value).toBe("0x0a");
275
- await db.deleteFaucetQueueItems(items);
276
- await db.commitTransaction();
277
-
278
- const newItems = await db.getFaucetQueue();
279
- expect(newItems.length).toBe(0);
280
-
281
- db.close();
282
- });
@@ -1,297 +0,0 @@
1
- import StorageProvider from "./StorageProvider.js";
2
- import { sslConfigI, WalletI, FaucetQueueItemI } from "./interface.js";
3
- import { TxI } from "../interface.js";
4
- import { Webhook, WebhookRecurrence, WebhookType } from "../webhook/Webhook.js";
5
- import { RegisterWebhookParams } from "../webhook/interface.js";
6
- import { getSslConfig } from "./util.js";
7
- import parseDbUrl from "parse-database-url";
8
- import pg from "pg";
9
- import format from "pg-format";
10
-
11
- export default class SqlProvider implements StorageProvider {
12
- private db;
13
- private config;
14
- private info;
15
- private formatter;
16
- private walletTable: string;
17
- private webhookTable: string = "webhook";
18
- private faucetQueueTable: string = "faucet_queue";
19
- private isInit = false;
20
-
21
- public constructor(walletTable?: string) {
22
- this.walletTable = walletTable ? walletTable : "wallet";
23
- if (!process.env.DATABASE_URL) {
24
- throw new Error(
25
- "Named wallets and webhooks require a postgres DATABASE_URL environment variable to be set"
26
- );
27
- }
28
- let dbConfig = parseDbUrl(process.env.DATABASE_URL);
29
- let ssl = getSslConfig();
30
- if (ssl) {
31
- dbConfig.ssl = ssl;
32
- }
33
- this.config = dbConfig;
34
-
35
- const Pool = pg.Pool;
36
- this.db = new Pool(dbConfig);
37
- this.formatter = format;
38
- }
39
-
40
- public getConfig() {
41
- return this.config;
42
- }
43
-
44
- public async init(): Promise<StorageProvider> {
45
- if (!this.isInit) {
46
- this.isInit = true;
47
- await this.db;
48
- await this.formatter;
49
-
50
- let createWalletTable = this.formatter(
51
- "CREATE TABLE IF NOT EXISTS %I (id SERIAL, name TEXT PRIMARY KEY, wallet TEXT );",
52
- this.walletTable
53
- );
54
- const resWallet = await this.db.query(createWalletTable);
55
-
56
- let createWebhookTable = this.formatter(
57
- "CREATE TABLE IF NOT EXISTS %I (" +
58
- "id SERIAL PRIMARY KEY," +
59
- "cashaddr TEXT," +
60
- "type TEXT," +
61
- "recurrence TEXT," +
62
- "url TEXT," +
63
- "status TEXT," +
64
- "tx_seen JSON," +
65
- "last_height INTEGER," +
66
- "expires_at TIMESTAMPTZ" +
67
- ");",
68
- this.webhookTable
69
- );
70
- const resWebhook = await this.db.query(createWebhookTable);
71
-
72
- let createFaucetQueueTable = this.formatter(
73
- "CREATE TABLE IF NOT EXISTS %I (" +
74
- "id SERIAL PRIMARY KEY," +
75
- "address TEXT," +
76
- "value TEXT" +
77
- ");",
78
- this.faucetQueueTable
79
- );
80
- const resFaucetQueue = await this.db.query(createFaucetQueueTable);
81
-
82
- if (!resWallet || !resWebhook || !resFaucetQueue)
83
- throw new Error("Failed to init SqlProvider");
84
- }
85
-
86
- return this;
87
- }
88
-
89
- public async close(): Promise<StorageProvider> {
90
- await this.db.end();
91
- return this;
92
- }
93
-
94
- public getInfo(): string {
95
- return this.info;
96
- }
97
-
98
- public async addWallet(name: string, walletId: string): Promise<boolean> {
99
- let text = this.formatter(
100
- "INSERT into %I (name,wallet) VALUES ($1, $2);",
101
- this.walletTable
102
- );
103
- return await this.db.query(text, [name, walletId]);
104
- }
105
-
106
- public async getWallets(): Promise<Array<WalletI>> {
107
- let text = this.formatter("SELECT * FROM %I;", this.walletTable);
108
- let result = await this.db.query(text);
109
- if (result) {
110
- const WalletArray: WalletI[] = await Promise.all(
111
- result.rows.map(async (obj: WalletI) => {
112
- return obj;
113
- })
114
- );
115
- return WalletArray;
116
- } else {
117
- return [];
118
- }
119
- }
120
-
121
- public async getWallet(name: string): Promise<WalletI | undefined> {
122
- let text = this.formatter(
123
- "SELECT * FROM %I WHERE name = $1;",
124
- this.walletTable
125
- );
126
- let result = await this.db.query(text, [name]);
127
- let w = result.rows[0];
128
- return w;
129
- }
130
-
131
- public async updateWallet(name: string, walletId: string): Promise<void> {
132
- let text = this.formatter(
133
- "UPDATE %I SET wallet = $1 WHERE name = $2;",
134
- this.walletTable
135
- );
136
- await this.db.query(text, [walletId, name]);
137
- }
138
-
139
- public async walletExists(name: string): Promise<boolean> {
140
- return (await this.getWallet(name)) !== undefined;
141
- }
142
-
143
- public async webhookFromDb(hook: Webhook) {
144
- const { WebhookBch } = await import("../webhook/WebhookBch.js");
145
- return new WebhookBch(hook);
146
- }
147
-
148
- public async addWebhook(params: RegisterWebhookParams): Promise<Webhook> {
149
- // init db if it was not, useful for external api calls
150
- await this.init();
151
-
152
- params.type = params.type || WebhookType.transactionInOut;
153
- params.recurrence = params.recurrence || WebhookRecurrence.once;
154
- const expireTimeout =
155
- Number(process.env.WEBHOOK_EXPIRE_TIMEOUT_SECONDS) || 86400;
156
- params.duration_sec = params.duration_sec || expireTimeout;
157
- params.duration_sec =
158
- params.duration_sec > expireTimeout ? expireTimeout : params.duration_sec;
159
-
160
- const expires_at = new Date(
161
- new Date().getTime() + params.duration_sec * 1000
162
- );
163
- let text = this.formatter(
164
- "INSERT into %I (cashaddr,type,recurrence,url,status,tx_seen,last_height,expires_at) VALUES ($1, $2, $3, $4, $5, $6, $7, $8) RETURNING *;",
165
- this.webhookTable
166
- );
167
-
168
- const result = await this.db.query(text, [
169
- params.cashaddr,
170
- params.type,
171
- params.recurrence,
172
- params.url,
173
- "",
174
- "[]",
175
- 0,
176
- expires_at.toISOString(),
177
- ]);
178
- const hook = await this.webhookFromDb(result.rows[0]);
179
- hook.db = this;
180
- return hook;
181
- }
182
-
183
- public async getWebhooks(): Promise<Array<Webhook>> {
184
- let text = this.formatter("SELECT * FROM %I;", this.webhookTable);
185
- let result = await this.db.query(text);
186
- if (result) {
187
- const WebhookArray: Webhook[] = await Promise.all(
188
- result.rows.map(async (obj: any) => {
189
- obj = await this.webhookFromDb(obj);
190
- obj.db = this;
191
- return obj;
192
- })
193
- );
194
- return WebhookArray;
195
- } else {
196
- return [];
197
- }
198
- }
199
-
200
- public async getWebhook(id: number): Promise<Webhook | undefined> {
201
- const text = this.formatter(
202
- "SELECT * FROM %I WHERE id = $1;",
203
- this.webhookTable
204
- );
205
- const result = await this.db.query(text, [id]);
206
- let hook = result.rows[0];
207
- if (hook) {
208
- hook = this.webhookFromDb(hook);
209
- hook.db = this;
210
- }
211
- return hook;
212
- }
213
-
214
- public async setWebhookStatus(id: number, status: string): Promise<void> {
215
- let text = this.formatter(
216
- "UPDATE %I SET status = $1 WHERE id = $2;",
217
- this.webhookTable
218
- );
219
- await this.db.query(text, [status, id]);
220
- }
221
-
222
- public async setWebhookSeenTxLastHeight(
223
- id: number,
224
- tx_seen: Array<TxI>,
225
- last_height: number
226
- ): Promise<void> {
227
- let text = this.formatter(
228
- "UPDATE %I SET tx_seen = $1, last_height = $2 WHERE id = $3;",
229
- this.webhookTable
230
- );
231
- await this.db.query(text, [JSON.stringify(tx_seen), last_height, id]);
232
- }
233
-
234
- public async deleteWebhook(id: number): Promise<void> {
235
- let text = this.formatter(
236
- "DELETE FROM %I WHERE id = $1;",
237
- this.webhookTable
238
- );
239
- await this.db.query(text, [id]);
240
- }
241
-
242
- public async clearWebhooks(): Promise<void> {
243
- let text = this.formatter("DELETE FROM %I;", this.webhookTable);
244
- await this.db.query(text);
245
- }
246
-
247
- public async addFaucetQueueItem(
248
- address: string,
249
- value: string
250
- ): Promise<boolean> {
251
- let text = this.formatter(
252
- "INSERT into %I (address,value) VALUES ($1, $2);",
253
- this.faucetQueueTable
254
- );
255
- return await this.db.query(text, [address, value]);
256
- }
257
-
258
- public async getFaucetQueue(): Promise<Array<FaucetQueueItemI>> {
259
- let text = this.formatter("SELECT * FROM %I;", this.faucetQueueTable);
260
- let result = await this.db.query(text);
261
- if (result) {
262
- const FaucetQueueItemArray: FaucetQueueItemI[] = await Promise.all(
263
- result.rows.map(async (obj: FaucetQueueItemI) => {
264
- return obj;
265
- })
266
- );
267
- return FaucetQueueItemArray;
268
- } else {
269
- return [];
270
- }
271
- }
272
-
273
- public async deleteFaucetQueueItems(
274
- items: Array<FaucetQueueItemI>
275
- ): Promise<boolean> {
276
- const ids = items.map((val) => val.id);
277
- let text = this.formatter(
278
- "DELETE FROM %I WHERE id IN (%L);",
279
- this.faucetQueueTable,
280
- ids
281
- );
282
- let result = await this.db.query(text);
283
- return result;
284
- }
285
-
286
- public async beginTransaction(): Promise<boolean> {
287
- return await this.db.query("BEGIN");
288
- }
289
-
290
- public async commitTransaction(): Promise<boolean> {
291
- return await this.db.query("COMMIT");
292
- }
293
-
294
- public async rollbackTransaction(): Promise<boolean> {
295
- return await this.db.query("ROLLBACK");
296
- }
297
- }
@@ -1,20 +0,0 @@
1
- import { getRuntimePlatform } from "../util/getRuntimePlatform.js";
2
- import IndexedDBProvider from "./IndexedDBProvider.js";
3
- import SqlProvider from "./SqlProvider.js";
4
- import StorageProvider from "./StorageProvider.js";
5
- import { indexedDbIsAvailable } from "./util.js";
6
-
7
- export function getStorageProvider(
8
- dbName: string
9
- ): StorageProvider | undefined {
10
- if (getRuntimePlatform() !== "node" && indexedDbIsAvailable()) {
11
- return new IndexedDBProvider(dbName);
12
- } else {
13
- if ("DATABASE_URL" in process.env) {
14
- return new SqlProvider(dbName);
15
- } else {
16
- console.warn("DATABASE_URL was not configured, storage unavailable");
17
- return;
18
- }
19
- }
20
- }
@@ -1,62 +0,0 @@
1
- const playwright = require("playwright");
2
- const PAGE_URL = "http://localhost:8080";
3
-
4
- describe(`WalletDatabase should handle indexeddb `, () => {
5
- let browser = null;
6
- let page = null;
7
-
8
- /**
9
- * Create the browser and page context
10
- */
11
- beforeAll(async () => {
12
- browser = await playwright["chromium"].launch();
13
- page = await browser.newPage();
14
- if (!page) {
15
- throw new Error("Connection wasn't established");
16
- }
17
-
18
- // Open the page
19
- await page.goto(PAGE_URL, {
20
- waitUntil: "networkidle0",
21
- });
22
- });
23
-
24
- afterAll(async () => {
25
- await browser.close();
26
- });
27
-
28
- test(`Should store and recall a testnet wallet`, async () => {
29
- const result = await page.evaluate(async () => {
30
- let w1 = await TestNetWallet.newRandom("Testnet Wallet 1");
31
- let w1Again = await TestNetWallet.named("Testnet Wallet 1");
32
- return [w1, w1Again];
33
- });
34
- let w1 = result[0];
35
- let w2 = result[1];
36
- expect(w1.name).toBe("Testnet Wallet 1");
37
- expect(w1.cashaddr.slice(0, 9)).toBe("bchtest:q");
38
- expect(w1.privateKeyWif.startsWith("c")).toBeTruthy();
39
- expect(w1.network).toBe("testnet");
40
- expect(w1.name).toBe(w2.name);
41
- expect(w1.privateKeyWif).toBe(w2.privateKeyWif);
42
- });
43
-
44
- test(`Should store and recall a mainnet wallet`, async () => {
45
- const result = await page.evaluate(async () => {
46
- let w1 = await Wallet.named("Mainnet Wallet 1");
47
- let w1Again = await Wallet.named("Mainnet Wallet 1");
48
- return [w1, w1Again];
49
- });
50
- let w1 = result[0];
51
- let w2 = result[1];
52
- expect(w1.name.startsWith("Mainnet Wallet 1")).toBeTruthy();
53
- expect(w1.cashaddr.startsWith("bitcoincash:q")).toBeTruthy();
54
- expect(w1.network).toBe("mainnet");
55
- expect(
56
- w1.privateKeyWif[0] == "K" || w1.privateKeyWif[0] == "L"
57
- ).toBeTruthy();
58
-
59
- expect(w1.name).toBe(w2.name);
60
- expect(w1.privateKeyWif).toBe(w2.privateKeyWif);
61
- });
62
- });