@ercworldio/blockchain-shared 1.0.0 → 1.0.1-dev.1
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/build/chains/networks_dev.json +44 -11
- package/build/chains/networks_prod-bu.json +7 -7
- package/build/chains/networks_prod-dz.json +510 -0
- package/build/chains/networks_prod.json +8 -8
- package/build/chains/networks_stg-bu.json +7 -7
- package/build/chains/networks_stg-dz.json +17 -6
- package/build/index.d.ts +6 -0
- package/build/index.d.ts.map +1 -1
- package/build/index.js +13 -2
- package/build/interfaces/config.d.ts +15 -2
- package/build/interfaces/config.d.ts.map +1 -1
- package/build/interfaces/config.js +5 -0
- package/build/interfaces.d.ts +2 -1
- package/build/interfaces.d.ts.map +1 -1
- package/build/services/AlchemyService.d.ts +1 -0
- package/build/services/AlchemyService.d.ts.map +1 -1
- package/build/services/AlchemyService.js +6 -2
- package/build/services/AlchemyWebhookAddressManager.d.ts +38 -0
- package/build/services/AlchemyWebhookAddressManager.d.ts.map +1 -0
- package/build/services/AlchemyWebhookAddressManager.js +123 -0
- package/build/services/AlchemyWebhookSignature.d.ts +3 -3
- package/build/services/AlchemyWebhookSignature.d.ts.map +1 -1
- package/build/services/AlchemyWebhookSignature.js +8 -8
- package/build/services/BalanceService.d.ts +5 -1
- package/build/services/BalanceService.d.ts.map +1 -1
- package/build/services/BalanceService.js +32 -11
- package/build/services/ClaimJobService.d.ts.map +1 -1
- package/build/services/ClaimJobService.js +4 -1
- package/build/services/DepositAddressService.d.ts +8 -0
- package/build/services/DepositAddressService.d.ts.map +1 -1
- package/build/services/DepositAddressService.js +30 -0
- package/build/services/KeyVaultService.d.ts +1 -1
- package/build/services/KeyVaultService.d.ts.map +1 -1
- package/build/services/KeyVaultService.js +3 -30
- package/build/services/QuicknodeWebhookSignature.d.ts +3 -3
- package/build/services/QuicknodeWebhookSignature.d.ts.map +1 -1
- package/build/services/QuicknodeWebhookSignature.js +8 -8
- package/build/services/StorageService.js +2 -2
- package/build/services/SweepJobService.d.ts.map +1 -1
- package/build/services/SweepJobService.js +4 -1
- package/build/services/WalletManager.d.ts +3 -1
- package/build/services/WalletManager.d.ts.map +1 -1
- package/build/services/WalletManager.js +11 -7
- package/build/services/WalletManagerHelper.d.ts +15 -0
- package/build/services/WalletManagerHelper.d.ts.map +1 -0
- package/build/services/WalletManagerHelper.js +65 -0
- package/build/services/quicknode-notifications/QnNotificationsApi.d.ts +20 -0
- package/build/services/quicknode-notifications/QnNotificationsApi.d.ts.map +1 -0
- package/build/services/quicknode-notifications/QnNotificationsApi.js +134 -0
- package/build/services/quicknode-notifications/QnWebhookAddressManager.d.ts +47 -0
- package/build/services/quicknode-notifications/QnWebhookAddressManager.d.ts.map +1 -0
- package/build/services/quicknode-notifications/QnWebhookAddressManager.js +265 -0
- package/build/services/quicknode-notifications/SetupNotifications.d.ts +40 -0
- package/build/services/quicknode-notifications/SetupNotifications.d.ts.map +1 -0
- package/build/services/quicknode-notifications/SetupNotifications.js +253 -0
- package/build/services/quicknode-notifications/types/index.d.ts +2 -0
- package/build/services/quicknode-notifications/types/index.d.ts.map +1 -0
- package/build/services/quicknode-notifications/types/index.js +17 -0
- package/build/services/quicknode-notifications/types/notification_types.d.ts +154 -0
- package/build/services/quicknode-notifications/types/notification_types.d.ts.map +1 -0
- package/build/services/quicknode-notifications/types/notification_types.js +2 -0
- package/build/services/solana/escrow/idl/escrow.json +110 -1
- package/build/services/solana/escrow/types/escrow.d.ts +110 -1
- package/build/services/solana/escrow/types/escrow.d.ts.map +1 -1
- package/build/services/types/chain_manager.d.ts +5 -0
- package/build/services/types/chain_manager.d.ts.map +1 -1
- package/build/services/types/quicknode.d.ts +1 -0
- package/build/services/types/quicknode.d.ts.map +1 -1
- package/build/utils/AsyncTTLCache.d.ts +1 -0
- package/build/utils/AsyncTTLCache.d.ts.map +1 -1
- package/build/utils/AsyncTTLCache.js +3 -0
- package/build/utils/solana.d.ts +1 -0
- package/build/utils/solana.d.ts.map +1 -1
- package/build/utils/solana.js +15 -1
- package/package.json +1 -1
|
@@ -6,10 +6,10 @@ declare class AlchemyWebhookSignature {
|
|
|
6
6
|
private signing_keys;
|
|
7
7
|
private constructor();
|
|
8
8
|
static getInstance(): AlchemyWebhookSignature;
|
|
9
|
-
validateWebhookEvent(
|
|
9
|
+
validateWebhookEvent(keyVaultName: string, webhook_id: string, stringified_body: string, signature: string): Promise<boolean>;
|
|
10
10
|
private getSigningKey;
|
|
11
|
-
createSigningKey(
|
|
12
|
-
deleteSigningKey(
|
|
11
|
+
createSigningKey(keyVaultName: string, webhook_id: string, value: string): Promise<boolean>;
|
|
12
|
+
deleteSigningKey(keyVaultName: string, webhook_id: string): Promise<boolean>;
|
|
13
13
|
private isValidSignatureForStringBody;
|
|
14
14
|
}
|
|
15
15
|
export default AlchemyWebhookSignature;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AlchemyWebhookSignature.d.ts","sourceRoot":"","sources":["../../src/services/AlchemyWebhookSignature.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,cAAM,uBAAuB;IACzB,MAAM,CAAC,QAAQ,EAAE,uBAAuB,CAAC;IACzC,OAAO,CAAC,YAAY,CAAkC;IACtD,OAAO;IAEP,MAAM,CAAC,WAAW;IAQL,oBAAoB,CAAC,
|
|
1
|
+
{"version":3,"file":"AlchemyWebhookSignature.d.ts","sourceRoot":"","sources":["../../src/services/AlchemyWebhookSignature.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,cAAM,uBAAuB;IACzB,MAAM,CAAC,QAAQ,EAAE,uBAAuB,CAAC;IACzC,OAAO,CAAC,YAAY,CAAkC;IACtD,OAAO;IAEP,MAAM,CAAC,WAAW;IAQL,oBAAoB,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM;YAMzG,aAAa;IAqBd,gBAAgB,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAYxE,gBAAgB,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM;IAatE,OAAO,CAAC,6BAA6B;CAUxC;AAED,eAAe,uBAAuB,CAAC"}
|
|
@@ -60,15 +60,15 @@ class AlchemyWebhookSignature {
|
|
|
60
60
|
}
|
|
61
61
|
return this.instance;
|
|
62
62
|
}
|
|
63
|
-
validateWebhookEvent(
|
|
63
|
+
validateWebhookEvent(keyVaultName, webhook_id, stringified_body, signature) {
|
|
64
64
|
return __awaiter(this, void 0, void 0, function* () {
|
|
65
|
-
const signingKey = yield this.getSigningKey(
|
|
65
|
+
const signingKey = yield this.getSigningKey(keyVaultName, webhook_id);
|
|
66
66
|
return this.isValidSignatureForStringBody(stringified_body, signature, signingKey);
|
|
67
67
|
});
|
|
68
68
|
}
|
|
69
|
-
getSigningKey(
|
|
69
|
+
getSigningKey(keyVaultName, webhook_id) {
|
|
70
70
|
return __awaiter(this, void 0, void 0, function* () {
|
|
71
|
-
const vaultHandler = new KeyVaultService_1.default(
|
|
71
|
+
const vaultHandler = new KeyVaultService_1.default(keyVaultName);
|
|
72
72
|
if (!vaultHandler.client) {
|
|
73
73
|
vaultHandler.initializeKeyVaultService();
|
|
74
74
|
}
|
|
@@ -84,9 +84,9 @@ class AlchemyWebhookSignature {
|
|
|
84
84
|
return existing;
|
|
85
85
|
});
|
|
86
86
|
}
|
|
87
|
-
createSigningKey(
|
|
87
|
+
createSigningKey(keyVaultName, webhook_id, value) {
|
|
88
88
|
return __awaiter(this, void 0, void 0, function* () {
|
|
89
|
-
const vaultHandler = new KeyVaultService_1.default(
|
|
89
|
+
const vaultHandler = new KeyVaultService_1.default(keyVaultName);
|
|
90
90
|
if (!vaultHandler.client) {
|
|
91
91
|
vaultHandler.initializeKeyVaultService();
|
|
92
92
|
}
|
|
@@ -95,9 +95,9 @@ class AlchemyWebhookSignature {
|
|
|
95
95
|
return true;
|
|
96
96
|
});
|
|
97
97
|
}
|
|
98
|
-
deleteSigningKey(
|
|
98
|
+
deleteSigningKey(keyVaultName, webhook_id) {
|
|
99
99
|
return __awaiter(this, void 0, void 0, function* () {
|
|
100
|
-
const vaultHandler = new KeyVaultService_1.default(
|
|
100
|
+
const vaultHandler = new KeyVaultService_1.default(keyVaultName);
|
|
101
101
|
if (!vaultHandler.client) {
|
|
102
102
|
vaultHandler.initializeKeyVaultService();
|
|
103
103
|
}
|
|
@@ -15,7 +15,11 @@ declare class BalanceService extends BaseErrors {
|
|
|
15
15
|
private config;
|
|
16
16
|
private logger;
|
|
17
17
|
constructor(dbPool: IDatabasePool, config: IConfig);
|
|
18
|
-
|
|
18
|
+
/**
|
|
19
|
+
* Creates the balance row with zero balance if it doesnt exist.
|
|
20
|
+
* Used for wallets that were partially initialized
|
|
21
|
+
*/
|
|
22
|
+
private getOrCreateEntity;
|
|
19
23
|
getBalance(userId: number, blockchain: string, chainId: ChainId, paymentToken: string): Promise<GetWalletBalanceResult>;
|
|
20
24
|
getBalancesNeedSweepByToken(blockchain: BlockchainType, chainId: ChainId, paymentToken: string): Promise<DepositWalletBalance[]>;
|
|
21
25
|
removeWalletBalances(walletId: number, blockchain: string): Promise<boolean>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BalanceService.d.ts","sourceRoot":"","sources":["../../src/services/BalanceService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,EAAE,cAAc,EAAgB,OAAO,EAAgB,WAAW,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAOjH,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,UAAU,MAAM,kBAAkB,CAAC;AAI1C,KAAK,aAAa,GAAG,KAAK,GAAG,QAAQ,CAAC;AAEtC,UAAU,sBAAsB;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CACpB;AAED,cAAM,cAAe,SAAQ,UAAU;IACnC,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,MAAM,CAAU;IACxB,OAAO,CAAC,MAAM,CAAS;gBACX,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,OAAO;
|
|
1
|
+
{"version":3,"file":"BalanceService.d.ts","sourceRoot":"","sources":["../../src/services/BalanceService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,EAAE,cAAc,EAAgB,OAAO,EAAgB,WAAW,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAOjH,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,UAAU,MAAM,kBAAkB,CAAC;AAI1C,KAAK,aAAa,GAAG,KAAK,GAAG,QAAQ,CAAC;AAEtC,UAAU,sBAAsB;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CACpB;AAED,cAAM,cAAe,SAAQ,UAAU;IACnC,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,MAAM,CAAU;IACxB,OAAO,CAAC,MAAM,CAAS;gBACX,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,OAAO;IASlD;;;OAGG;YACW,iBAAiB;IA6CzB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAgCvH,2BAA2B,CAAC,UAAU,EAAE,cAAc,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM;IAsB9F,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM;IA2BzD,wBAAwB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM;IAI7D,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM;YAmD/C,aAAa;IAwBd,mBAAmB,CAAC,MAAM,EAAE,YAAY,EAAE;IA0EjD,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,aAAa;;;;IA2FpK,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,EAAE,aAAa,GAAE,OAAe;IAmE3H,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,cAAc;IAUlD,uBAAuB;IAuBvB,kBAAkB,CAAC,KAAK,GAAE,MAAY;YAOrC,gBAAgB;IAoBxB,yBAAyB,CAAC,mBAAmB,EAAE,WAAW,EAAE;IAY5D,6BAA6B,CAAC,mBAAmB,EAAE,cAAc,EAAE;CA8D5E;AAED,eAAe,cAAc,CAAC"}
|
|
@@ -28,24 +28,45 @@ class BalanceService extends errors_1.default {
|
|
|
28
28
|
this.config = config;
|
|
29
29
|
this.logger = (0, Logger_1.createLogger)(`BalanceService`, this.config.pipelineConfig.azureAppName);
|
|
30
30
|
}
|
|
31
|
-
|
|
31
|
+
/**
|
|
32
|
+
* Creates the balance row with zero balance if it doesnt exist.
|
|
33
|
+
* Used for wallets that were partially initialized
|
|
34
|
+
*/
|
|
35
|
+
getOrCreateEntity(userId, blockchain, chainId, paymentToken) {
|
|
32
36
|
return __awaiter(this, void 0, void 0, function* () {
|
|
37
|
+
var _a, _b;
|
|
33
38
|
const dbDriver = this.dbPool;
|
|
34
39
|
if (!dbDriver.balancesRepo || !dbDriver.accountsRepo) {
|
|
35
40
|
throw new Error(`Db Driver appDataSource is not initialized.`);
|
|
36
41
|
}
|
|
37
42
|
const accountsService = new DepositAddressService_1.default(this.dbPool);
|
|
38
|
-
const
|
|
39
|
-
if (!
|
|
43
|
+
const account = yield accountsService.findByUserId(userId, blockchain);
|
|
44
|
+
if (!account) {
|
|
40
45
|
throw new Error(`Account not found for userId ${userId} on ${blockchain} chain`);
|
|
41
46
|
}
|
|
42
|
-
const
|
|
43
|
-
|
|
47
|
+
const normalizedToken = (0, Wallets_1.normalizeAddress)(paymentToken, blockchain);
|
|
48
|
+
const existing = yield dbDriver.balancesRepo.findOne({
|
|
49
|
+
where: { blockchain, chain_id: chainId, wallet_id: account.id, token: normalizedToken }
|
|
44
50
|
});
|
|
45
|
-
if (
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
51
|
+
if (existing)
|
|
52
|
+
return existing;
|
|
53
|
+
// Entity is missing, wallet initialization was probably interrupted
|
|
54
|
+
// Create it with zero balance so the update doesnt fail
|
|
55
|
+
const chainManager = ChainManager_1.default.getInstance(this.config);
|
|
56
|
+
const tokenConfig = (_a = chainManager.getPaymentTokensForChain(parseInt(chainId))) === null || _a === void 0 ? void 0 : _a.find(t => (0, Wallets_1.normalizeAddress)(t.address, blockchain) === normalizedToken);
|
|
57
|
+
this.logger.warn(`Balance entity missing for userId=${userId} blockchain=${blockchain} chainId=${chainId} token=${normalizedToken} — creating with zero balance`);
|
|
58
|
+
const entity = new DepositWalletBalance_1.DepositWalletBalance();
|
|
59
|
+
entity.blockchain = blockchain;
|
|
60
|
+
entity.chain_id = chainId;
|
|
61
|
+
entity.wallet_id = account.id;
|
|
62
|
+
entity.token = normalizedToken;
|
|
63
|
+
entity.decimals = (_b = tokenConfig === null || tokenConfig === void 0 ? void 0 : tokenConfig.decimals) !== null && _b !== void 0 ? _b : 0;
|
|
64
|
+
entity.balance = BigInt(0);
|
|
65
|
+
entity.transaction_count = 0;
|
|
66
|
+
entity.needs_sweep = false;
|
|
67
|
+
entity.created_at = new Date();
|
|
68
|
+
entity.updated_at = new Date();
|
|
69
|
+
return dbDriver.balancesRepo.save(entity);
|
|
49
70
|
});
|
|
50
71
|
}
|
|
51
72
|
// Gets the token balance of the wallet on the given chain
|
|
@@ -212,7 +233,7 @@ class BalanceService extends errors_1.default {
|
|
|
212
233
|
for (const wallet of walletMap.values()) {
|
|
213
234
|
const { balance: currentBalance, decimals } = yield (0, custodial_1.getWalletBalance)(wallet.blockchain, wallet.chainId, wallet.depositWallet, wallet.tokenAddress, this.dbPool, this.config);
|
|
214
235
|
// Load entity from DB
|
|
215
|
-
const entity = yield this.
|
|
236
|
+
const entity = yield this.getOrCreateEntity(wallet.userId, wallet.blockchain, wallet.chainId, wallet.tokenAddress);
|
|
216
237
|
// Update balance
|
|
217
238
|
entity.balance = currentBalance;
|
|
218
239
|
// Optional: check sweep thresholds (reuse your current logic)
|
|
@@ -265,7 +286,7 @@ class BalanceService extends errors_1.default {
|
|
|
265
286
|
if (!account) {
|
|
266
287
|
throw new Error(`Account not found for userId ${userId} on ${blockchain} chain`);
|
|
267
288
|
}
|
|
268
|
-
const entity = yield this.
|
|
289
|
+
const entity = yield this.getOrCreateEntity(userId, blockchain, chainId, paymentToken);
|
|
269
290
|
let needs_sweep = false;
|
|
270
291
|
switch (operationType) {
|
|
271
292
|
case "add":
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ClaimJobService.d.ts","sourceRoot":"","sources":["../../src/services/ClaimJobService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAGjD,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE1C,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAExC,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAI7I,cAAM,gBAAgB;IAClB,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAAS;gBAGV,MAAM,EAAE,aAAa;IAMjC,OAAO,CAAC,QAAQ,CAIf;IAED,OAAO,CAAC,gBAAgB,CAIvB;IAED,OAAO,CAAC,QAAQ,CAsBf;IAEM,kBAAkB,GAAU,QAAO,MAAW,EAAE,YAAW,MAAY,EAAE,gBAAe,oBAAoF,KAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAyCzM;IAGM,oBAAoB,GACvB,gBAAgB,SAAS,EACzB,aAAa,MAAM,EACnB,OAAO,MAAM,EACb,YAAY,MAAM,EAClB,aAAa,MAAM,EACnB,aAAa,MAAM,KACpB,OAAO,CAAC,SAAS,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"ClaimJobService.d.ts","sourceRoot":"","sources":["../../src/services/ClaimJobService.ts"],"names":[],"mappings":"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"}
|
|
@@ -97,7 +97,10 @@ class ClaimJobsService {
|
|
|
97
97
|
SELECT id
|
|
98
98
|
FROM accounting.claim_jobs
|
|
99
99
|
WHERE job_status = $4
|
|
100
|
-
AND
|
|
100
|
+
AND (
|
|
101
|
+
lock_expires_at IS NULL
|
|
102
|
+
OR lock_expires_at < now()
|
|
103
|
+
)
|
|
101
104
|
AND retry_count < $5
|
|
102
105
|
ORDER BY lock_expires_at ASC
|
|
103
106
|
LIMIT $1
|
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
import { DepositAddress } from "../entities/DepositAddress";
|
|
2
2
|
import { BlockchainType } from "../interfaces";
|
|
3
3
|
import { IDatabasePool } from "../interfaces/database";
|
|
4
|
+
import { Paginated } from "./types/claim_job_service";
|
|
5
|
+
export interface DepositAddressSearchFilters {
|
|
6
|
+
user_id?: number;
|
|
7
|
+
blockchain?: string;
|
|
8
|
+
address?: string;
|
|
9
|
+
}
|
|
4
10
|
interface CreateDepositResult {
|
|
5
11
|
id: number;
|
|
6
12
|
userId: number;
|
|
@@ -35,6 +41,8 @@ declare class DepositAddressService {
|
|
|
35
41
|
status: boolean;
|
|
36
42
|
address: string;
|
|
37
43
|
}>;
|
|
44
|
+
private paginate;
|
|
45
|
+
getDepositAddressesPaginated(page: number, page_size: number | undefined, filters: DepositAddressSearchFilters): Promise<Paginated<DepositAddress[]>>;
|
|
38
46
|
getDepositAddressByAddress(blockchain: BlockchainType, address: string): Promise<DepositAddress | null>;
|
|
39
47
|
findByBlockchainAndAddressRaw(blockchain: BlockchainType, address: string): Promise<DepositAddress | null>;
|
|
40
48
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DepositAddressService.d.ts","sourceRoot":"","sources":["../../src/services/DepositAddressService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAI5D,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"DepositAddressService.d.ts","sourceRoot":"","sources":["../../src/services/DepositAddressService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAI5D,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEvD,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAEtD,MAAM,WAAW,2BAA2B;IACxC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,UAAU,mBAAmB;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;CACnB;AACD,MAAM,WAAW,0BAA0B;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACnB;AAED,UAAU,mBAAoB,SAAQ,mBAAmB;CACxD;AAED,cAAM,qBAAqB;IACvB,OAAO,CAAC,MAAM,CAAgB;gBAClB,MAAM,EAAE,aAAa;IAKjC,OAAO,CAAC,gBAAgB;IAiBlB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAqB9E,QAAQ,CAAC,QAAQ,EAAE,MAAM;IAazB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAkBzE,8BAA8B,CAAC,UAAU,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM;YAyBtE,yBAAyB;IAqBjC,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;IA0D5H,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,0BAA0B,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAmDtG,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;YA4B/F,QAAQ;IAwBhB,4BAA4B,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,YAAK,EAAE,OAAO,EAAE,2BAA2B,GAAG,OAAO,CAAC,SAAS,CAAC,cAAc,EAAE,CAAC,CAAC;IAI9I,0BAA0B,CAAC,UAAU,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAkBvG,6BAA6B,CAAC,UAAU,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;CAanH;AAED,eAAe,qBAAqB,CAAC"}
|
|
@@ -242,6 +242,36 @@ class DepositAddressService {
|
|
|
242
242
|
}
|
|
243
243
|
});
|
|
244
244
|
}
|
|
245
|
+
paginate(page, page_size, filters) {
|
|
246
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
247
|
+
const repo = this.dbPool.accountsRepo;
|
|
248
|
+
if (!repo)
|
|
249
|
+
throw new Error(`Db Driver appDataSource is not initialized.`);
|
|
250
|
+
if (page === 0)
|
|
251
|
+
page = 1;
|
|
252
|
+
const [items, totalCount] = yield Promise.all([
|
|
253
|
+
repo.find({
|
|
254
|
+
take: page_size,
|
|
255
|
+
skip: (page - 1) * page_size,
|
|
256
|
+
where: Object.assign({}, filters),
|
|
257
|
+
order: { created_at: "DESC" }
|
|
258
|
+
}),
|
|
259
|
+
repo.count({ where: Object.assign({}, filters) })
|
|
260
|
+
]);
|
|
261
|
+
return {
|
|
262
|
+
total_count: totalCount,
|
|
263
|
+
pages_count: Math.ceil(totalCount / page_size),
|
|
264
|
+
has_next: totalCount > page * page_size,
|
|
265
|
+
current_page: page,
|
|
266
|
+
items: items || []
|
|
267
|
+
};
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
getDepositAddressesPaginated(page_1) {
|
|
271
|
+
return __awaiter(this, arguments, void 0, function* (page, page_size = 10, filters) {
|
|
272
|
+
return this.paginate(page, page_size, filters);
|
|
273
|
+
});
|
|
274
|
+
}
|
|
245
275
|
getDepositAddressByAddress(blockchain, address) {
|
|
246
276
|
return __awaiter(this, void 0, void 0, function* () {
|
|
247
277
|
try {
|
|
@@ -4,7 +4,7 @@ declare class KeyVaultHandler {
|
|
|
4
4
|
url: string;
|
|
5
5
|
client: SecretClient | null;
|
|
6
6
|
defaultVaultName: string;
|
|
7
|
-
constructor(
|
|
7
|
+
constructor(keyVaultName: string);
|
|
8
8
|
initializeKeyVaultService: () => SecretClient;
|
|
9
9
|
store: (keyName: string, pkey: string) => Promise<boolean>;
|
|
10
10
|
delete: (keyName: string) => Promise<boolean>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"KeyVaultService.d.ts","sourceRoot":"","sources":["../../src/services/KeyVaultService.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAGvD,cAAM,eAAe;IACV,SAAS,EAAE,MAAM,CAAM;IACvB,GAAG,EAAE,MAAM,CAAM;IACjB,MAAM,EAAE,YAAY,GAAG,IAAI,CAAQ;IACnC,gBAAgB,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"KeyVaultService.d.ts","sourceRoot":"","sources":["../../src/services/KeyVaultService.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAGvD,cAAM,eAAe;IACV,SAAS,EAAE,MAAM,CAAM;IACvB,GAAG,EAAE,MAAM,CAAM;IACjB,MAAM,EAAE,YAAY,GAAG,IAAI,CAAQ;IACnC,gBAAgB,EAAE,MAAM,CAAC;gBAIpB,YAAY,EAAE,MAAM;IAMhC,yBAAyB,qBAWxB;IAED,KAAK,GAAU,SAAS,MAAM,EAAE,MAAM,MAAM,sBAO3C;IAED,MAAM,GAAU,SAAS,MAAM,sBAI9B;IAEK,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;CAkBnE;AAED,eAAe,eAAe,CAAC"}
|
|
@@ -12,7 +12,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
12
12
|
const identity_1 = require("@azure/identity");
|
|
13
13
|
const keyvault_secrets_1 = require("@azure/keyvault-secrets");
|
|
14
14
|
class KeyVaultHandler {
|
|
15
|
-
constructor(projectName, environment, env_suffix = "") {
|
|
15
|
+
// constructor(projectName: string, environment: string, env_suffix: string = "", ) {
|
|
16
|
+
constructor(keyVaultName) {
|
|
16
17
|
this.vaultName = '';
|
|
17
18
|
this.url = '';
|
|
18
19
|
this.client = null;
|
|
@@ -38,35 +39,7 @@ class KeyVaultHandler {
|
|
|
38
39
|
yield this.client.beginDeleteSecret(keyName);
|
|
39
40
|
return true;
|
|
40
41
|
});
|
|
41
|
-
|
|
42
|
-
if (env_suffix.length > 0) {
|
|
43
|
-
projectName = `${projectName.slice(0, 1)}${projectName.slice(-1)}`;
|
|
44
|
-
}
|
|
45
|
-
// Handle customer specific environment
|
|
46
|
-
if (environment.startsWith(`staging-`) || environment.startsWith(`production-`) || environment.startsWith(`stg-`) || environment.startsWith(`prod-`)) {
|
|
47
|
-
const suffix = env_suffix.length > 0 ? `-${env_suffix}` : ""; // Append a suffix to the env to target a different key vault
|
|
48
|
-
this.defaultVaultName = `${projectName}-${environment}${suffix}-secrets`;
|
|
49
|
-
this.initializeKeyVaultService();
|
|
50
|
-
return;
|
|
51
|
-
}
|
|
52
|
-
const suffix = env_suffix.length > 0 ? `-${env_suffix}` : ""; // Append a suffix to the env to target a different key vault
|
|
53
|
-
switch (environment) {
|
|
54
|
-
case 'dev':
|
|
55
|
-
this.defaultVaultName = `${projectName}-dev${suffix}-secrets`;
|
|
56
|
-
break;
|
|
57
|
-
case 'stg':
|
|
58
|
-
this.defaultVaultName = `${projectName}-stg${suffix}-secrets`;
|
|
59
|
-
break;
|
|
60
|
-
case 'prod':
|
|
61
|
-
this.defaultVaultName = `${projectName}-prod${suffix}-secrets`;
|
|
62
|
-
break;
|
|
63
|
-
case 'local':
|
|
64
|
-
this.defaultVaultName = `${projectName}-dev${suffix}-secrets`;
|
|
65
|
-
break;
|
|
66
|
-
default:
|
|
67
|
-
this.defaultVaultName = `${projectName}-dev${suffix}-secrets`;
|
|
68
|
-
break;
|
|
69
|
-
}
|
|
42
|
+
this.defaultVaultName = keyVaultName;
|
|
70
43
|
this.initializeKeyVaultService();
|
|
71
44
|
}
|
|
72
45
|
getSecretValue(secretName) {
|
|
@@ -4,10 +4,10 @@ declare class QuicknodeWebhookSignature {
|
|
|
4
4
|
private signing_keys;
|
|
5
5
|
private constructor();
|
|
6
6
|
static getInstance(): QuicknodeWebhookSignature;
|
|
7
|
-
validateWebhookEvent(
|
|
7
|
+
validateWebhookEvent(keyVaultName: string, stream_id: string, signatureData: VerifyQuicknodeSignatureData): Promise<boolean>;
|
|
8
8
|
private get_signing_key;
|
|
9
|
-
createSigningKey(
|
|
10
|
-
deleteSigningKey(
|
|
9
|
+
createSigningKey(keyVaultName: string, stream_id: string, value: string): Promise<boolean>;
|
|
10
|
+
deleteSigningKey(keyVaultName: string, stream_id: string): Promise<boolean>;
|
|
11
11
|
private verifySignature;
|
|
12
12
|
}
|
|
13
13
|
export default QuicknodeWebhookSignature;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"QuicknodeWebhookSignature.d.ts","sourceRoot":"","sources":["../../src/services/QuicknodeWebhookSignature.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,4BAA4B,EAAE,MAAM,SAAS,CAAC;AAEvD,cAAM,yBAAyB;IAC3B,MAAM,CAAC,QAAQ,EAAE,yBAAyB,CAAC;IAC3C,OAAO,CAAC,YAAY,CAAkC;IAEtD,OAAO;IAEP,MAAM,CAAC,WAAW;IAQL,oBAAoB,CAAC,
|
|
1
|
+
{"version":3,"file":"QuicknodeWebhookSignature.d.ts","sourceRoot":"","sources":["../../src/services/QuicknodeWebhookSignature.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,4BAA4B,EAAE,MAAM,SAAS,CAAC;AAEvD,cAAM,yBAAyB;IAC3B,MAAM,CAAC,QAAQ,EAAE,yBAAyB,CAAC;IAC3C,OAAO,CAAC,YAAY,CAAkC;IAEtD,OAAO;IAEP,MAAM,CAAC,WAAW;IAQL,oBAAoB,CAAC,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,4BAA4B;YAMxG,eAAe;IAmBhB,gBAAgB,CAAC,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAYvE,gBAAgB,CAAC,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM;IAerE,OAAO,CAAC,eAAe;CAe1B;AAED,eAAe,yBAAyB,CAAC"}
|
|
@@ -57,18 +57,18 @@ class QuicknodeWebhookSignature {
|
|
|
57
57
|
}
|
|
58
58
|
return this.instance;
|
|
59
59
|
}
|
|
60
|
-
validateWebhookEvent(
|
|
60
|
+
validateWebhookEvent(keyVaultName, stream_id, signatureData) {
|
|
61
61
|
return __awaiter(this, void 0, void 0, function* () {
|
|
62
|
-
const signingKey = yield this.get_signing_key(
|
|
62
|
+
const signingKey = yield this.get_signing_key(keyVaultName, stream_id);
|
|
63
63
|
return this.verifySignature(signingKey, signatureData.payload, signatureData.nonce, signatureData.timestamp, signatureData.givenSignature);
|
|
64
64
|
});
|
|
65
65
|
}
|
|
66
|
-
get_signing_key(
|
|
66
|
+
get_signing_key(keyVaultName, stream_id) {
|
|
67
67
|
return __awaiter(this, void 0, void 0, function* () {
|
|
68
68
|
const key = `quicknode-stream-webhook-signing-key-${stream_id.replace(/_/g, "-")}`;
|
|
69
69
|
const existing = this.signing_keys.get(key);
|
|
70
70
|
if (!existing) {
|
|
71
|
-
const vaultHandler = new KeyVaultService_1.default(
|
|
71
|
+
const vaultHandler = new KeyVaultService_1.default(keyVaultName);
|
|
72
72
|
if (!vaultHandler.client) {
|
|
73
73
|
vaultHandler.initializeKeyVaultService();
|
|
74
74
|
}
|
|
@@ -81,9 +81,9 @@ class QuicknodeWebhookSignature {
|
|
|
81
81
|
return existing;
|
|
82
82
|
});
|
|
83
83
|
}
|
|
84
|
-
createSigningKey(
|
|
84
|
+
createSigningKey(keyVaultName, stream_id, value) {
|
|
85
85
|
return __awaiter(this, void 0, void 0, function* () {
|
|
86
|
-
const vaultHandler = new KeyVaultService_1.default(
|
|
86
|
+
const vaultHandler = new KeyVaultService_1.default(keyVaultName);
|
|
87
87
|
if (!vaultHandler.client) {
|
|
88
88
|
vaultHandler.initializeKeyVaultService();
|
|
89
89
|
}
|
|
@@ -92,9 +92,9 @@ class QuicknodeWebhookSignature {
|
|
|
92
92
|
return true;
|
|
93
93
|
});
|
|
94
94
|
}
|
|
95
|
-
deleteSigningKey(
|
|
95
|
+
deleteSigningKey(keyVaultName, stream_id) {
|
|
96
96
|
return __awaiter(this, void 0, void 0, function* () {
|
|
97
|
-
const vaultHandler = new KeyVaultService_1.default(
|
|
97
|
+
const vaultHandler = new KeyVaultService_1.default(keyVaultName);
|
|
98
98
|
if (!vaultHandler.client) {
|
|
99
99
|
vaultHandler.initializeKeyVaultService();
|
|
100
100
|
}
|
|
@@ -18,7 +18,7 @@ class StorageService {
|
|
|
18
18
|
constructor(config) {
|
|
19
19
|
this.fetchContainerContent = (containerClientName, fileName) => __awaiter(this, void 0, void 0, function* () {
|
|
20
20
|
try {
|
|
21
|
-
const vaultHandler = new KeyVaultService_1.default(this.config.config.
|
|
21
|
+
const vaultHandler = new KeyVaultService_1.default(this.config.config.keyVaultName);
|
|
22
22
|
if (!vaultHandler.client) {
|
|
23
23
|
vaultHandler.initializeKeyVaultService();
|
|
24
24
|
}
|
|
@@ -43,7 +43,7 @@ class StorageService {
|
|
|
43
43
|
// Function to update or create the content of a file in a given container
|
|
44
44
|
this.updateContainerContent = (containerName, fileName, content) => __awaiter(this, void 0, void 0, function* () {
|
|
45
45
|
try {
|
|
46
|
-
const vaultHandler = new KeyVaultService_1.default(this.config.config.
|
|
46
|
+
const vaultHandler = new KeyVaultService_1.default(this.config.config.keyVaultName);
|
|
47
47
|
if (!vaultHandler.client) {
|
|
48
48
|
vaultHandler.initializeKeyVaultService();
|
|
49
49
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SweepJobService.d.ts","sourceRoot":"","sources":["../../src/services/SweepJobService.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"SweepJobService.d.ts","sourceRoot":"","sources":["../../src/services/SweepJobService.ts"],"names":[],"mappings":"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"}
|
|
@@ -121,7 +121,10 @@ class SweepJobService {
|
|
|
121
121
|
FROM usersmanagement.sweep_jobs s
|
|
122
122
|
WHERE s.job_status = $1
|
|
123
123
|
AND s.blockchain = $2
|
|
124
|
-
AND
|
|
124
|
+
AND (
|
|
125
|
+
s.lock_expires_at IS NULL
|
|
126
|
+
OR s.lock_expires_at + ($4 * interval '1 minute') < now()
|
|
127
|
+
)
|
|
125
128
|
AND NOT EXISTS (
|
|
126
129
|
SELECT 1 FROM usersmanagement.sweep_jobs dup
|
|
127
130
|
WHERE dup.blockchain = s.blockchain
|
|
@@ -7,6 +7,7 @@ import { IDatabasePool } from "../interfaces/database";
|
|
|
7
7
|
import { BtcWallet, IWallet, TronNodeWallet } from "./types/wallet_manager";
|
|
8
8
|
import { AlchemyWebhookEnvironment } from "./types/alchemy";
|
|
9
9
|
import BaseErrors from "../errors/errors";
|
|
10
|
+
import AsyncRateLimiter from "../utils/AsyncRateLimiter";
|
|
10
11
|
declare class WalletManager extends BaseErrors {
|
|
11
12
|
static instance: WalletManager;
|
|
12
13
|
private config;
|
|
@@ -35,7 +36,8 @@ declare class WalletManager extends BaseErrors {
|
|
|
35
36
|
address: string;
|
|
36
37
|
}>;
|
|
37
38
|
renewWallet: (subscription: AlchemyWebhookEnvironment, userId: number, blockchain: BlockchainType, expired_address: string) => Promise<IWallet>;
|
|
38
|
-
|
|
39
|
+
updateWebhookAddress: (subscription: AlchemyWebhookEnvironment, blockchain: BlockchainType, old_wallet: IWallet, new_wallet: IWallet, limiter: AsyncRateLimiter) => Promise<boolean>;
|
|
40
|
+
handleRenewWallet: (old_wallet: IWallet, new_wallet: IWallet) => Promise<IWallet>;
|
|
39
41
|
deriveWallet: (parentIndex: number, childIndex: number, blockchain: BlockchainType, _mnemonic?: string) => BtcWallet;
|
|
40
42
|
}
|
|
41
43
|
export default WalletManager;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WalletManager.d.ts","sourceRoot":"","sources":["../../src/services/WalletManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAoC,MAAM,QAAQ,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAM1C,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAIxD,OAAO,EAAe,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,SAAS,EAAe,OAAO,EAAgB,cAAc,EAAc,MAAM,wBAAwB,CAAC;AACnH,OAAO,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AAO5D,OAAO,UAAU,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"WalletManager.d.ts","sourceRoot":"","sources":["../../src/services/WalletManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAoC,MAAM,QAAQ,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAM1C,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAIxD,OAAO,EAAe,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,SAAS,EAAe,OAAO,EAAgB,cAAc,EAAc,MAAM,wBAAwB,CAAC;AACnH,OAAO,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AAO5D,OAAO,UAAU,MAAM,kBAAkB,CAAC;AAG1C,OAAO,gBAA+B,MAAM,2BAA2B,CAAC;AAGxE,cAAM,aAAc,SAAQ,UAAU;IAClC,MAAM,CAAC,QAAQ,EAAE,aAAa,CAAC;IAC/B,OAAO,CAAC,MAAM,CAAU;IACxB,OAAO,CAAC,MAAM,CAAgB;IACvB,wBAAwB,EAAE,MAAM,CAAC;IACjC,8BAA8B,EAAE,MAAM,CAAC;IACvC,0BAA0B,EAAE,MAAM,CAAC;IAC1C,OAAO,CAAC,MAAM,CAAS;gBACX,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa;IAelD,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa;IAOlD,SAAS,GAAU,QAAQ,MAAM,EAAE,YAAY,cAAc,KAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAqB7F;IAEM,2BAA2B,GAAI,YAAY,cAAc,8CAoC/D;IAGM,gBAAgB,GAAU,SAAS,OAAO,EAAE,SAAS,MAAM,EAAE,EAAE,iBAAiB,eAAe,qBAiBrG;IAED,OAAO,CAAC,2BAA2B;IAa5B,YAAY,GAAU,QAAQ,MAAM,EAAE,YAAY,cAAc,KAAG,OAAO,CAAC,OAAO,CAAC,CA2BzF;IAEY,gBAAgB,CAAC,UAAU,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM;IAsBlE,gBAAgB,CAAC,MAAM,EAAE,OAAO;;;;;;;IAoBhC,YAAY,GAAU,QAAQ,MAAM,EAAE,YAAY,cAAc;;;OAGtE;IAGM,WAAW,GAAU,cAAc,yBAAyB,EAAE,QAAQ,MAAM,EAAE,YAAY,cAAc,EAAE,iBAAiB,MAAM,KAAG,OAAO,CAAC,OAAO,CAAC,CAsC1J;IAEM,oBAAoB,GAAU,cAAc,yBAAyB,EAAE,YAAY,cAAc,EAAE,YAAY,OAAO,EAAE,YAAY,OAAO,EAAE,SAAS,gBAAgB,sBA8B5K;IAGM,iBAAiB,GAAU,YAAY,OAAO,EAAE,YAAY,OAAO,sBAezE;IAIM,YAAY,GAAI,aAAa,MAAM,EAAE,YAAY,MAAM,EAAE,YAAY,cAAc,EAAE,YAAY,MAAM,eA4E7G;CAIJ;AAED,eAAe,aAAa,CAAC"}
|
|
@@ -64,6 +64,8 @@ const constants_1 = require("../constants");
|
|
|
64
64
|
const tronweb_1 = require("tronweb");
|
|
65
65
|
const errors_1 = __importDefault(require("../errors/errors"));
|
|
66
66
|
const Logger_1 = require("../utils/Logger");
|
|
67
|
+
const QnWebhookAddressManager_1 = __importDefault(require("./quicknode-notifications/QnWebhookAddressManager"));
|
|
68
|
+
const AsyncRateLimiter_1 = require("../utils/AsyncRateLimiter");
|
|
67
69
|
class WalletManager extends errors_1.default {
|
|
68
70
|
constructor(config, dbPool) {
|
|
69
71
|
super();
|
|
@@ -206,18 +208,20 @@ class WalletManager extends errors_1.default {
|
|
|
206
208
|
yield timerManager.delete_timer(userId, blockchain);
|
|
207
209
|
return updatedWallet;
|
|
208
210
|
});
|
|
209
|
-
this.
|
|
210
|
-
const wallet_manager = WalletManager.getInstance(this.config, this.dbPool);
|
|
211
|
+
this.updateWebhookAddress = (subscription, blockchain, old_wallet, new_wallet, limiter) => __awaiter(this, void 0, void 0, function* () {
|
|
211
212
|
const alchemy_service = AlchemyService_1.default.getInstance(this.config);
|
|
213
|
+
const qn_service = QnWebhookAddressManager_1.default.getInstance(this.config);
|
|
214
|
+
// Add new address and remove expired address (quicknode and alchemy webhooks)
|
|
215
|
+
const alchemy_res = yield limiter.execute(() => (0, AsyncRateLimiter_1.withRetry)(() => __awaiter(this, void 0, void 0, function* () { return yield alchemy_service.add_remove_addresses_all_webhooks(subscription, blockchain, [new_wallet.address], [old_wallet.address]); }), 2, 500));
|
|
216
|
+
const quicknode_res_add = yield limiter.execute(() => (0, AsyncRateLimiter_1.withRetry)(() => __awaiter(this, void 0, void 0, function* () { return yield qn_service.add_address(blockchain, new_wallet.address); }), 3, 500));
|
|
217
|
+
const quicknode_res_remove = yield limiter.execute(() => (0, AsyncRateLimiter_1.withRetry)(() => __awaiter(this, void 0, void 0, function* () { return yield qn_service.remove_address(blockchain, old_wallet.address); }), 3, 500));
|
|
218
|
+
return true;
|
|
219
|
+
});
|
|
220
|
+
this.handleRenewWallet = (old_wallet, new_wallet) => __awaiter(this, void 0, void 0, function* () {
|
|
212
221
|
// Dispatch insert sweep job handler
|
|
213
222
|
const sweep_job_service = new SweepJobService_1.default(this.dbPool, this.config);
|
|
214
223
|
yield sweep_job_service.dispatchAddSweepJobWithBalanceCheck(old_wallet.id, old_wallet.blockchain, old_wallet.userId, old_wallet.address, old_wallet.parentIndex, old_wallet.childIndex, true // full sweep for expired wallet
|
|
215
224
|
);
|
|
216
|
-
// Add new address and remove expired address
|
|
217
|
-
const is_added_removed = yield alchemy_service.add_remove_addresses_all_webhooks(subscription, blockchain, [new_wallet.address], [old_wallet.address]);
|
|
218
|
-
if (!is_added_removed) {
|
|
219
|
-
throw new Error(`Failed to add new wallet to address activity monitor.`);
|
|
220
|
-
}
|
|
221
225
|
return new_wallet;
|
|
222
226
|
});
|
|
223
227
|
// TODO: revisit solana and btc wallet creation and return
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Wallet } from "ethers";
|
|
2
|
+
import { BlockchainType } from "../interfaces";
|
|
3
|
+
import { IConfig } from "../interfaces/config";
|
|
4
|
+
import { Keypair } from "@solana/web3.js";
|
|
5
|
+
import BaseErrors from "../errors/errors";
|
|
6
|
+
import { TronNodeWallet } from "./types";
|
|
7
|
+
declare class WalletManagerHelper extends BaseErrors {
|
|
8
|
+
static instance: WalletManagerHelper;
|
|
9
|
+
private config;
|
|
10
|
+
private constructor();
|
|
11
|
+
static getInstance(config: IConfig): WalletManagerHelper;
|
|
12
|
+
getEscrowFundsManagerWallet: (blockchain: BlockchainType) => Wallet | Keypair | TronNodeWallet;
|
|
13
|
+
}
|
|
14
|
+
export default WalletManagerHelper;
|
|
15
|
+
//# sourceMappingURL=WalletManagerHelper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WalletManagerHelper.d.ts","sourceRoot":"","sources":["../../src/services/WalletManagerHelper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE1C,OAAO,UAAU,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAc,MAAM,SAAS,CAAC;AAErD,cAAM,mBAAoB,SAAQ,UAAU;IACxC,MAAM,CAAC,QAAQ,EAAE,mBAAmB,CAAC;IACrC,OAAO,CAAC,MAAM,CAAU;IACxB,OAAO;IAIP,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,OAAO;IAQ3B,2BAA2B,GAAI,YAAY,cAAc,uCAoC/D;CACJ;AAED,eAAe,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const ethers_1 = require("ethers");
|
|
7
|
+
const constants_1 = require("../constants");
|
|
8
|
+
const web3_js_1 = require("@solana/web3.js");
|
|
9
|
+
const tronweb_1 = require("tronweb");
|
|
10
|
+
const errors_1 = __importDefault(require("../errors/errors"));
|
|
11
|
+
class WalletManagerHelper extends errors_1.default {
|
|
12
|
+
constructor(config) {
|
|
13
|
+
super();
|
|
14
|
+
this.getEscrowFundsManagerWallet = (blockchain) => {
|
|
15
|
+
if (blockchain === constants_1.BLOCKCHAINS.EVM) {
|
|
16
|
+
const privKey = this.config.config.escrowFundingWalletPrivateKeyEvm;
|
|
17
|
+
if (!privKey)
|
|
18
|
+
throw new Error(`Missing EVM funding wallet private key`);
|
|
19
|
+
const wallet = new ethers_1.Wallet(privKey);
|
|
20
|
+
return wallet;
|
|
21
|
+
}
|
|
22
|
+
else if (blockchain === constants_1.BLOCKCHAINS.SOLANA) {
|
|
23
|
+
const privKey = this.config.config.escrowFundingWalletPrivateKeySol;
|
|
24
|
+
if (!privKey)
|
|
25
|
+
throw new Error(`Missing Solana funding wallet private key`);
|
|
26
|
+
// const secret = bs58.decode(privKey);
|
|
27
|
+
const secret = Buffer.from(privKey, "base64");
|
|
28
|
+
return web3_js_1.Keypair.fromSecretKey(secret);
|
|
29
|
+
}
|
|
30
|
+
else if (blockchain === constants_1.BLOCKCHAINS.TRON) {
|
|
31
|
+
const privKey = this.config.config.escrowFundingWalletPrivateKeyTron;
|
|
32
|
+
if (!privKey)
|
|
33
|
+
throw new Error(`Missing Tron funding wallet private key`);
|
|
34
|
+
// Create TRON account
|
|
35
|
+
const hostUrl = this.config.config.environment === 'dev' || this.config.config.environment === 'local' ? "https://nile.trongrid.io" : "https://api.trongrid.io";
|
|
36
|
+
const tronWeb = new tronweb_1.TronWeb({ fullHost: hostUrl });
|
|
37
|
+
const address = tronWeb.address.fromPrivateKey(privKey);
|
|
38
|
+
if (!address)
|
|
39
|
+
throw new Error(this.UnexpectedError("Failed to derive wallet address from private key on tron network"));
|
|
40
|
+
const tronWallet = {
|
|
41
|
+
wallet: {
|
|
42
|
+
address,
|
|
43
|
+
publicKey: address,
|
|
44
|
+
privateKey: privKey,
|
|
45
|
+
sign: (tx) => tronWeb.trx.sign(tx, privKey),
|
|
46
|
+
},
|
|
47
|
+
address: address
|
|
48
|
+
};
|
|
49
|
+
return tronWallet.wallet;
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
throw new Error(`Unsupported blockchain type ${blockchain}`);
|
|
53
|
+
}
|
|
54
|
+
;
|
|
55
|
+
};
|
|
56
|
+
this.config = config;
|
|
57
|
+
}
|
|
58
|
+
static getInstance(config) {
|
|
59
|
+
if (!this.instance) {
|
|
60
|
+
this.instance = new WalletManagerHelper(config);
|
|
61
|
+
}
|
|
62
|
+
return this.instance;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
exports.default = WalletManagerHelper;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { QnNotificationCreateResponse, QnNotificationListResponse } from "./types/notification_types";
|
|
2
|
+
import { IConfig } from "../../interfaces/config";
|
|
3
|
+
import BaseErrors from "../../errors/errors";
|
|
4
|
+
import { RateLimiterOptions } from "../../utils/AsyncRateLimiter";
|
|
5
|
+
declare class QnNotificationsApi extends BaseErrors {
|
|
6
|
+
private static instance;
|
|
7
|
+
private api_key;
|
|
8
|
+
private base_url;
|
|
9
|
+
private rate_limiter;
|
|
10
|
+
private rlc;
|
|
11
|
+
private constructor();
|
|
12
|
+
static getInstance(config: IConfig, rlc?: RateLimiterOptions): QnNotificationsApi;
|
|
13
|
+
create_webhook(template: string, name: string, network: string, webhook_url: string, initial_addresses: string[]): Promise<QnNotificationCreateResponse>;
|
|
14
|
+
get_all_webhooks(): Promise<QnNotificationListResponse>;
|
|
15
|
+
update_webhook_addresses(webhook_id: string, template: string, all_addresses: string[]): Promise<void>;
|
|
16
|
+
delete_webhook(webhook_id: string): Promise<void>;
|
|
17
|
+
private call;
|
|
18
|
+
}
|
|
19
|
+
export default QnNotificationsApi;
|
|
20
|
+
//# sourceMappingURL=QnNotificationsApi.d.ts.map
|