@mainnet-cash/postgresql-storage 4.0.0-next.0 → 4.0.0-next.11

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