mainnet-js 2.0.0 → 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.
- package/dist/index.html +1 -1
- package/dist/{mainnet-2.0.0.js → mainnet-2.1.0-alpha.5.js} +18 -58
- package/dist/module/db/StorageProvider.d.ts +9 -9
- package/dist/module/db/StorageProvider.d.ts.map +1 -1
- package/dist/module/db/StorageProvider.js +2 -1
- package/dist/module/db/StorageProvider.js.map +1 -1
- package/dist/module/db/index.d.ts +1 -2
- package/dist/module/db/index.d.ts.map +1 -1
- package/dist/module/db/index.js +2 -2
- package/dist/module/db/index.js.map +1 -1
- package/dist/module/db/interface.d.ts +0 -12
- package/dist/module/db/interface.d.ts.map +1 -1
- package/dist/module/db/util.d.ts +0 -2
- package/dist/module/db/util.d.ts.map +1 -1
- package/dist/module/db/util.js +0 -23
- package/dist/module/db/util.js.map +1 -1
- package/dist/module/index.d.ts +0 -1
- package/dist/module/index.d.ts.map +1 -1
- package/dist/module/index.js +0 -4
- package/dist/module/index.js.map +1 -1
- package/dist/module/network/index.d.ts +1 -0
- package/dist/module/network/index.d.ts.map +1 -1
- package/dist/module/wallet/Base.d.ts +1 -1
- package/dist/module/wallet/Base.d.ts.map +1 -1
- package/dist/module/wallet/Base.js +6 -1
- package/dist/module/wallet/Base.js.map +1 -1
- package/dist/module/wallet/Bcmr.d.ts +3 -1
- package/dist/module/wallet/Bcmr.d.ts.map +1 -1
- package/dist/module/wallet/Bcmr.js +6 -8
- package/dist/module/wallet/Bcmr.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -12
- package/src/db/StorageProvider.ts +9 -9
- package/src/db/index.ts +1 -2
- package/src/db/interface.ts +0 -14
- package/src/db/util.ts +0 -26
- package/src/index.ts +0 -5
- package/src/network/index.ts +1 -0
- package/src/wallet/Base.ts +9 -2
- package/src/wallet/Bcmr.ts +8 -9
- package/src/wallet/Wif.test.ts +0 -42
- package/dist/module/db/IndexedDBProvider.d.ts +0 -16
- package/dist/module/db/IndexedDBProvider.d.ts.map +0 -1
- package/dist/module/db/IndexedDBProvider.js +0 -80
- package/dist/module/db/IndexedDBProvider.js.map +0 -1
- package/dist/module/db/SqlProvider.d.ts +0 -40
- package/dist/module/db/SqlProvider.d.ts.map +0 -1
- package/dist/module/db/SqlProvider.js +0 -198
- package/dist/module/db/SqlProvider.js.map +0 -1
- package/dist/module/db/getStorageProvider.d.ts +0 -3
- package/dist/module/db/getStorageProvider.d.ts.map +0 -1
- package/dist/module/db/getStorageProvider.js +0 -19
- package/dist/module/db/getStorageProvider.js.map +0 -1
- package/dist/module/webhook/Webhook.d.ts +0 -36
- package/dist/module/webhook/Webhook.d.ts.map +0 -1
- package/dist/module/webhook/Webhook.js +0 -77
- package/dist/module/webhook/Webhook.js.map +0 -1
- package/dist/module/webhook/WebhookBch.d.ts +0 -14
- package/dist/module/webhook/WebhookBch.d.ts.map +0 -1
- package/dist/module/webhook/WebhookBch.js +0 -141
- package/dist/module/webhook/WebhookBch.js.map +0 -1
- package/dist/module/webhook/WebhookWorker.d.ts +0 -23
- package/dist/module/webhook/WebhookWorker.d.ts.map +0 -1
- package/dist/module/webhook/WebhookWorker.js +0 -94
- package/dist/module/webhook/WebhookWorker.js.map +0 -1
- package/dist/module/webhook/index.d.ts +0 -5
- package/dist/module/webhook/index.d.ts.map +0 -1
- package/dist/module/webhook/index.js +0 -5
- package/dist/module/webhook/index.js.map +0 -1
- package/dist/module/webhook/interface.d.ts +0 -8
- package/dist/module/webhook/interface.d.ts.map +0 -1
- package/dist/module/webhook/interface.js +0 -2
- package/dist/module/webhook/interface.js.map +0 -1
- package/src/Wallet.test.headless.js +0 -369
- package/src/Wallet.test.ts +0 -519
- package/src/db/IndexedDBProvider.test.ts +0 -69
- package/src/db/IndexedDBProvider.ts +0 -93
- package/src/db/SqlProvider.test.ts +0 -282
- package/src/db/SqlProvider.ts +0 -297
- package/src/db/getStorageProvider.ts +0 -20
- package/src/db/index.test.headless.js +0 -62
- package/src/db/index.test.ts +0 -64
- package/src/wallet/createWallet.test.ts +0 -155
- package/src/webhook/Webhook.test.ts +0 -9
- package/src/webhook/Webhook.ts +0 -99
- package/src/webhook/WebhookBch.test.ts +0 -323
- package/src/webhook/WebhookBch.ts +0 -198
- package/src/webhook/WebhookWorker.test.ts +0 -96
- package/src/webhook/WebhookWorker.ts +0 -119
- package/src/webhook/index.ts +0 -4
- 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
|
-
});
|
package/src/db/SqlProvider.ts
DELETED
|
@@ -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
|
-
});
|