@ercworldio/blockchain-shared 1.0.0-dev.9 → 1.0.1-dev.0

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 (63) hide show
  1. package/build/chains/networks_dev.json +43 -10
  2. package/build/chains/networks_prod-bu.json +1 -1
  3. package/build/chains/networks_prod-dz.json +1 -1
  4. package/build/chains/networks_stg-bu.json +2 -2
  5. package/build/chains/networks_stg-dz.json +12 -1
  6. package/build/index.d.ts +6 -0
  7. package/build/index.d.ts.map +1 -1
  8. package/build/index.js +13 -2
  9. package/build/interfaces/config.d.ts +1 -0
  10. package/build/interfaces/config.d.ts.map +1 -1
  11. package/build/interfaces.d.ts +2 -1
  12. package/build/interfaces.d.ts.map +1 -1
  13. package/build/services/AlchemyService.d.ts +1 -0
  14. package/build/services/AlchemyService.d.ts.map +1 -1
  15. package/build/services/AlchemyService.js +6 -2
  16. package/build/services/AlchemyWebhookAddressManager.d.ts +38 -0
  17. package/build/services/AlchemyWebhookAddressManager.d.ts.map +1 -0
  18. package/build/services/AlchemyWebhookAddressManager.js +123 -0
  19. package/build/services/BalanceService.d.ts +5 -1
  20. package/build/services/BalanceService.d.ts.map +1 -1
  21. package/build/services/BalanceService.js +32 -11
  22. package/build/services/ClaimJobService.d.ts.map +1 -1
  23. package/build/services/ClaimJobService.js +4 -1
  24. package/build/services/DepositAddressService.d.ts +8 -0
  25. package/build/services/DepositAddressService.d.ts.map +1 -1
  26. package/build/services/DepositAddressService.js +30 -0
  27. package/build/services/SweepJobService.d.ts.map +1 -1
  28. package/build/services/SweepJobService.js +4 -1
  29. package/build/services/WalletManager.d.ts +3 -1
  30. package/build/services/WalletManager.d.ts.map +1 -1
  31. package/build/services/WalletManager.js +11 -7
  32. package/build/services/WalletManagerHelper.d.ts +15 -0
  33. package/build/services/WalletManagerHelper.d.ts.map +1 -0
  34. package/build/services/WalletManagerHelper.js +65 -0
  35. package/build/services/quicknode-notifications/QnNotificationsApi.d.ts +20 -0
  36. package/build/services/quicknode-notifications/QnNotificationsApi.d.ts.map +1 -0
  37. package/build/services/quicknode-notifications/QnNotificationsApi.js +134 -0
  38. package/build/services/quicknode-notifications/QnWebhookAddressManager.d.ts +47 -0
  39. package/build/services/quicknode-notifications/QnWebhookAddressManager.d.ts.map +1 -0
  40. package/build/services/quicknode-notifications/QnWebhookAddressManager.js +265 -0
  41. package/build/services/quicknode-notifications/SetupNotifications.d.ts +40 -0
  42. package/build/services/quicknode-notifications/SetupNotifications.d.ts.map +1 -0
  43. package/build/services/quicknode-notifications/SetupNotifications.js +253 -0
  44. package/build/services/quicknode-notifications/types/index.d.ts +2 -0
  45. package/build/services/quicknode-notifications/types/index.d.ts.map +1 -0
  46. package/build/services/quicknode-notifications/types/index.js +17 -0
  47. package/build/services/quicknode-notifications/types/notification_types.d.ts +154 -0
  48. package/build/services/quicknode-notifications/types/notification_types.d.ts.map +1 -0
  49. package/build/services/quicknode-notifications/types/notification_types.js +2 -0
  50. package/build/services/solana/escrow/idl/escrow.json +110 -1
  51. package/build/services/solana/escrow/types/escrow.d.ts +110 -1
  52. package/build/services/solana/escrow/types/escrow.d.ts.map +1 -1
  53. package/build/services/types/chain_manager.d.ts +5 -0
  54. package/build/services/types/chain_manager.d.ts.map +1 -1
  55. package/build/services/types/quicknode.d.ts +1 -0
  56. package/build/services/types/quicknode.d.ts.map +1 -1
  57. package/build/utils/AsyncTTLCache.d.ts +1 -0
  58. package/build/utils/AsyncTTLCache.d.ts.map +1 -1
  59. package/build/utils/AsyncTTLCache.js +3 -0
  60. package/build/utils/solana.d.ts +1 -0
  61. package/build/utils/solana.d.ts.map +1 -1
  62. package/build/utils/solana.js +12 -5
  63. package/package.json +1 -1
@@ -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
- getEntity(userId, blockchain, chainId, paymentToken) {
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 entity = yield accountsService.findByUserId(userId, blockchain);
39
- if (!entity) {
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 balanceEntity = yield dbDriver.balancesRepo.findOne({
43
- where: { blockchain, chain_id: chainId, wallet_id: entity.id, token: (0, Wallets_1.normalizeAddress)(paymentToken, blockchain) }
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 (!balanceEntity) {
46
- throw new Error(`Balance entity not found for user ${userId} on blockchain ${blockchain} chainId: ${chainId}`);
47
- }
48
- return balanceEntity;
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.getEntity(wallet.userId, wallet.blockchain, wallet.chainId, wallet.tokenAddress);
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.getEntity(userId, blockchain, chainId, paymentToken);
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":"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"}
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 lock_expires_at < now()
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;AAGvD,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;IA4BvG,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"}
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 {
@@ -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 s.lock_expires_at + ($4 * interval '1 minute') < now()
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
- handleRenewWallet: (subscription: AlchemyWebhookEnvironment, blockchain: BlockchainType, old_wallet: IWallet, new_wallet: IWallet) => Promise<IWallet>;
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;AAK1C,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,iBAAiB,GAAU,cAAc,yBAAyB,EAAE,YAAY,cAAc,EAAE,YAAY,OAAO,EAAE,YAAY,OAAO,sBAuB9I;IAIM,YAAY,GAAI,aAAa,MAAM,EAAE,YAAY,MAAM,EAAE,YAAY,cAAc,EAAE,YAAY,MAAM,eA4E7G;CAIJ;AAED,eAAe,aAAa,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.handleRenewWallet = (subscription, blockchain, old_wallet, new_wallet) => __awaiter(this, void 0, void 0, function* () {
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"QnNotificationsApi.d.ts","sourceRoot":"","sources":["../../../src/services/quicknode-notifications/QnNotificationsApi.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,4BAA4B,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAC;AACtG,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAClD,OAAO,UAAU,MAAM,qBAAqB,CAAC;AAC7C,OAAyB,EAAE,kBAAkB,EAAa,MAAM,8BAA8B,CAAC;AAE/F,cAAM,kBAAmB,SAAQ,UAAU;IACvC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAqB;IAC5C,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAgD;IAChE,OAAO,CAAC,YAAY,CAAmB;IACvC,OAAO,CAAC,GAAG,CAA6D;IAExE,OAAO;IAWP,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,kBAAkB,GAAG,kBAAkB;IAOpE,cAAc,CACvB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EACnB,iBAAiB,EAAE,MAAM,EAAE,GAC5B,OAAO,CAAC,4BAA4B,CAAC;IAY3B,gBAAgB,IAAI,OAAO,CAAC,0BAA0B,CAAC;IAIvD,wBAAwB,CACjC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,EAAE,GACxB,OAAO,CAAC,IAAI,CAAC;IAQH,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAIhD,IAAI;CAsCrB;AAED,eAAe,kBAAkB,CAAC"}
@@ -0,0 +1,134 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
36
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
37
+ return new (P || (P = Promise))(function (resolve, reject) {
38
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
39
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
40
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
41
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
42
+ });
43
+ };
44
+ var __importDefault = (this && this.__importDefault) || function (mod) {
45
+ return (mod && mod.__esModule) ? mod : { "default": mod };
46
+ };
47
+ Object.defineProperty(exports, "__esModule", { value: true });
48
+ const errors_1 = __importDefault(require("../../errors/errors"));
49
+ const AsyncRateLimiter_1 = __importStar(require("../../utils/AsyncRateLimiter"));
50
+ class QnNotificationsApi extends errors_1.default {
51
+ constructor(config, rlc) {
52
+ super();
53
+ this.base_url = "https://api.quicknode.com/webhooks/rest/v1";
54
+ this.rlc = { maxConcurrent: 1, minDelayMs: 1000 };
55
+ this.api_key = config.config.quicknodeApiKey;
56
+ if (!this.api_key)
57
+ throw new Error(`quicknode api key is required`);
58
+ if (rlc) {
59
+ this.rlc = rlc;
60
+ }
61
+ this.rate_limiter = new AsyncRateLimiter_1.default(this.rlc);
62
+ }
63
+ static getInstance(config, rlc) {
64
+ if (!this.instance) {
65
+ this.instance = new QnNotificationsApi(config, rlc);
66
+ }
67
+ return this.instance;
68
+ }
69
+ create_webhook(template, name, network, webhook_url, initial_addresses) {
70
+ return __awaiter(this, void 0, void 0, function* () {
71
+ const template_arg_key = template === 'solanaWalletFilter' ? 'accounts' : 'wallets';
72
+ const body = {
73
+ name,
74
+ network,
75
+ status: 'active',
76
+ destination_attributes: { url: webhook_url, compression: 'none' },
77
+ templateArgs: { [template_arg_key]: initial_addresses }
78
+ };
79
+ return yield this.call(`/webhooks/template/${template}`, 'POST', { body });
80
+ });
81
+ }
82
+ get_all_webhooks() {
83
+ return __awaiter(this, void 0, void 0, function* () {
84
+ return yield this.call('/webhooks', 'GET', { query_params: { limit: 100, offset: 0 } });
85
+ });
86
+ }
87
+ update_webhook_addresses(webhook_id, template, all_addresses) {
88
+ return __awaiter(this, void 0, void 0, function* () {
89
+ const template_arg_key = template === 'solanaWalletFilter' ? 'accounts' : 'wallets';
90
+ const body = {
91
+ templateArgs: { [template_arg_key]: all_addresses }
92
+ };
93
+ yield this.call(`/webhooks/${webhook_id}/template/${template}`, 'PATCH', { body });
94
+ });
95
+ }
96
+ delete_webhook(webhook_id) {
97
+ return __awaiter(this, void 0, void 0, function* () {
98
+ yield this.call(`/webhooks/${webhook_id}`, 'DELETE');
99
+ });
100
+ }
101
+ call(endpoint, method, opts) {
102
+ return __awaiter(this, void 0, void 0, function* () {
103
+ const request_options = {
104
+ method,
105
+ headers: {
106
+ 'accept': 'application/json',
107
+ 'Content-Type': 'application/json',
108
+ 'x-api-key': this.api_key
109
+ },
110
+ body: (opts === null || opts === void 0 ? void 0 : opts.body) ? JSON.stringify(opts.body) : undefined,
111
+ };
112
+ let url = `${this.base_url}${endpoint}`;
113
+ if (opts === null || opts === void 0 ? void 0 : opts.query_params) {
114
+ const params = new URLSearchParams();
115
+ Object.entries(opts.query_params).forEach(([k, v]) => {
116
+ if (v !== undefined && v !== null)
117
+ params.append(k, String(v));
118
+ });
119
+ const qs = params.toString();
120
+ if (qs)
121
+ url += `?${qs}`;
122
+ }
123
+ console.log(`QnNotificationsApi: ${method} ${url}`);
124
+ const res = yield this.rate_limiter.execute(() => (0, AsyncRateLimiter_1.withRetry)(() => __awaiter(this, void 0, void 0, function* () { return yield fetch(url, request_options); })));
125
+ if (!res.ok) {
126
+ const err = yield res.text();
127
+ throw new Error(`QnNotificationsApi: ${method} ${endpoint} failed [${res.status}]: ${err}`);
128
+ }
129
+ const text = yield res.text();
130
+ return text ? JSON.parse(text) : null;
131
+ });
132
+ }
133
+ }
134
+ exports.default = QnNotificationsApi;
@@ -0,0 +1,47 @@
1
+ import { BlockchainType, ChainId } from "../../interfaces";
2
+ import { IConfig } from "../../interfaces/config";
3
+ import { RateLimiterOptions } from "../../utils/AsyncRateLimiter";
4
+ declare class QnWebhookAddressManager {
5
+ private static instance;
6
+ private api;
7
+ private config;
8
+ private cache;
9
+ private constructor();
10
+ static getInstance(config: IConfig, rlc?: RateLimiterOptions): QnWebhookAddressManager;
11
+ private get_blockchain_for_chain;
12
+ /** Returns the { name, network } pairs for the notification configs of a given chain. */
13
+ private get_webhook_keys_for_chain;
14
+ private get_notif_configs;
15
+ private is_stale;
16
+ private load;
17
+ private ensure_loaded;
18
+ private matches_key;
19
+ add_address(blockchain: BlockchainType, address: string): Promise<boolean>;
20
+ remove_address(blockchain: BlockchainType, address: string): Promise<boolean>;
21
+ /**
22
+ * Add an address to the webhook(s) for a single chain only.
23
+ * Matches by both name and network to avoid cross-service contamination.
24
+ * Use this for the immediate await before responding to the caller.
25
+ */
26
+ add_address_to_chain(chain_id: ChainId, address: string): Promise<boolean>;
27
+ /**
28
+ * Remove an address from the webhook(s) for a single chain only.
29
+ * Matches by both name and network to avoid cross-service contamination.
30
+ * Use this for the immediate await before responding to the caller.
31
+ */
32
+ remove_address_from_chain(chain_id: ChainId, address: string): Promise<boolean>;
33
+ /**
34
+ * Add an address to all webhooks for a blockchain except the already-updated chain.
35
+ * Excludes by both name and network so only the exact webhooks for that chain are skipped.
36
+ * Call this fire-and-forget after responding to the caller.
37
+ */
38
+ sync_add_to_remaining(blockchain: BlockchainType, address: string, exclude_chain_id: ChainId): Promise<void>;
39
+ /**
40
+ * Remove an address from all webhooks for a blockchain except the already-updated chain.
41
+ * Excludes by both name and network so only the exact webhooks for that chain are skipped.
42
+ * Call this fire-and-forget after responding to the caller.
43
+ */
44
+ sync_remove_from_remaining(blockchain: BlockchainType, address: string, exclude_chain_id: ChainId): Promise<void>;
45
+ }
46
+ export default QnWebhookAddressManager;
47
+ //# sourceMappingURL=QnWebhookAddressManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"QnWebhookAddressManager.d.ts","sourceRoot":"","sources":["../../../src/services/quicknode-notifications/QnWebhookAddressManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,OAAO,EAAiB,MAAM,kBAAkB,CAAC;AAC1E,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AA0BlE,cAAM,uBAAuB;IACzB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAA0B;IACjD,OAAO,CAAC,GAAG,CAAqB;IAChC,OAAO,CAAC,MAAM,CAAU;IACxB,OAAO,CAAC,KAAK,CAAmD;IAEhE,OAAO;IAKP,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,kBAAkB,GAAG,uBAAuB;IAOtF,OAAO,CAAC,wBAAwB;IAKhC,yFAAyF;IACzF,OAAO,CAAC,0BAA0B;IAQlC,OAAO,CAAC,iBAAiB;IAkBzB,OAAO,CAAC,QAAQ;YAMF,IAAI;YAuCJ,aAAa;IAO3B,OAAO,CAAC,WAAW;IAIN,WAAW,CAAC,UAAU,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAiB1E,cAAc,CAAC,UAAU,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAiB1F;;;;OAIG;IACU,oBAAoB,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAuBvF;;;;OAIG;IACU,yBAAyB,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAuB5F;;;;OAIG;IACU,qBAAqB,CAAC,UAAU,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBzH;;;;OAIG;IACU,0BAA0B,CAAC,UAAU,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;CAkBjI;AAED,eAAe,uBAAuB,CAAC"}