@ercworldio/blockchain-shared 1.0.1-dev.2 → 1.0.1-dev.20

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 (46) hide show
  1. package/build/chains/networks_dev.json +28 -7
  2. package/build/chains/networks_prod-bu.json +14 -7
  3. package/build/chains/networks_prod-dz.json +12 -6
  4. package/build/chains/networks_stg-bu.json +14 -7
  5. package/build/chains/networks_stg-dz.json +38 -20
  6. package/build/entities/DepositAddress.d.ts +1 -0
  7. package/build/entities/DepositAddress.d.ts.map +1 -1
  8. package/build/entities/DepositAddress.js +6 -2
  9. package/build/entities/DepositAddressArchive.d.ts +14 -0
  10. package/build/entities/DepositAddressArchive.d.ts.map +1 -0
  11. package/build/entities/DepositAddressArchive.js +66 -0
  12. package/build/index.d.ts +2 -0
  13. package/build/index.d.ts.map +1 -1
  14. package/build/index.js +5 -2
  15. package/build/interfaces/database.d.ts +2 -0
  16. package/build/interfaces/database.d.ts.map +1 -1
  17. package/build/services/AlchemyWebhookAddressManager.d.ts.map +1 -1
  18. package/build/services/AlchemyWebhookAddressManager.js +3 -1
  19. package/build/services/BalanceService.d.ts +9 -0
  20. package/build/services/BalanceService.d.ts.map +1 -1
  21. package/build/services/BalanceService.js +93 -0
  22. package/build/services/DepositAddressArchiveService.d.ts +33 -0
  23. package/build/services/DepositAddressArchiveService.d.ts.map +1 -0
  24. package/build/services/DepositAddressArchiveService.js +140 -0
  25. package/build/services/DepositAddressService.d.ts +3 -1
  26. package/build/services/DepositAddressService.d.ts.map +1 -1
  27. package/build/services/DepositAddressService.js +5 -1
  28. package/build/services/WalletManager.d.ts +2 -2
  29. package/build/services/WalletManager.d.ts.map +1 -1
  30. package/build/services/WalletManager.js +6 -17
  31. package/build/services/quicknode-notifications/QnWebhookAddressManager.d.ts +5 -3
  32. package/build/services/quicknode-notifications/QnWebhookAddressManager.d.ts.map +1 -1
  33. package/build/services/quicknode-notifications/QnWebhookAddressManager.js +55 -46
  34. package/build/services/quicknode-notifications/SetupNotifications.d.ts +1 -0
  35. package/build/services/quicknode-notifications/SetupNotifications.d.ts.map +1 -1
  36. package/build/services/quicknode-notifications/SetupNotifications.js +29 -2
  37. package/build/services/types/chain_manager.d.ts +5 -0
  38. package/build/services/types/chain_manager.d.ts.map +1 -1
  39. package/build/services/types/wallet_manager.d.ts +1 -0
  40. package/build/services/types/wallet_manager.d.ts.map +1 -1
  41. package/build/utils/Logger.d.ts.map +1 -1
  42. package/build/utils/Logger.js +13 -2
  43. package/build/utils/solana.d.ts +2 -1
  44. package/build/utils/solana.d.ts.map +1 -1
  45. package/build/utils/solana.js +28 -3
  46. package/package.json +1 -1
@@ -12,18 +12,23 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
12
12
  return (mod && mod.__esModule) ? mod : { "default": mod };
13
13
  };
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
+ const AsyncTTLCache_1 = __importDefault(require("../../utils/AsyncTTLCache"));
15
16
  const ChainManager_1 = __importDefault(require("../ChainManager"));
17
+ const DepositAddressService_1 = __importDefault(require("../DepositAddressService"));
16
18
  const QnNotificationsApi_1 = __importDefault(require("./QnNotificationsApi"));
17
19
  const CACHE_TTL_MS = 10 * 60 * 1000; // 10 minutes
20
+ const ADDRESS_SYNC_BATCH_SIZE = 500;
21
+ const ADDRESS_LOG_THRESHOLD = 1000;
18
22
  class QnWebhookAddressManager {
19
- constructor(config, rlc) {
20
- this.cache = new Map();
23
+ constructor(config, db, rlc) {
24
+ this.cache = AsyncTTLCache_1.default.create(CACHE_TTL_MS);
21
25
  this.config = config;
22
26
  this.api = QnNotificationsApi_1.default.getInstance(config, rlc);
27
+ this.db = db;
23
28
  }
24
- static getInstance(config, rlc) {
29
+ static getInstance(config, db, rlc) {
25
30
  if (!this.instance) {
26
- this.instance = new QnWebhookAddressManager(config, rlc);
31
+ this.instance = new QnWebhookAddressManager(config, db, rlc);
27
32
  }
28
33
  return this.instance;
29
34
  }
@@ -54,40 +59,27 @@ class QnWebhookAddressManager {
54
59
  .flatMap(([_, cfg]) => cfg.quicknodeNotificationConfig.map(n => (Object.assign(Object.assign({}, n), { blockchain: cfg.blockchainType }))))
55
60
  .filter((n, i, arr) => arr.findIndex(x => x.name === n.name) === i);
56
61
  }
57
- is_stale(blockchain) {
58
- const cached = this.cache.get(blockchain);
59
- if (!cached)
60
- return true;
61
- return Date.now() - cached.loaded_at > CACHE_TTL_MS;
62
- }
63
- load(blockchain) {
62
+ load_entries(blockchain) {
64
63
  return __awaiter(this, void 0, void 0, function* () {
65
- var _a;
66
64
  const notif_configs = this.get_notif_configs(blockchain);
67
65
  if (notif_configs.length === 0)
68
- return;
69
- let all_webhooks = [];
70
- try {
71
- const res = yield this.api.get_all_webhooks();
72
- all_webhooks = res.data || [];
73
- }
74
- catch (error) {
75
- console.error(`QnWebhookAddressManager: Failed to fetch webhooks for blockchain=${blockchain}`, error);
76
- return;
77
- }
66
+ return [];
67
+ const res = yield this.api.get_all_webhooks();
68
+ const all_webhooks = res.data || [];
69
+ const addresses = yield this.fetch_all_db_addresses(blockchain);
70
+ console.log(`Loaded ${addresses.length} addresses from db`);
78
71
  const entries = [];
79
72
  for (const notif_config of notif_configs) {
80
73
  const existing = all_webhooks.find(w => {
81
- var _a, _b;
74
+ var _a, _b, _c;
82
75
  return ((_a = w.name) === null || _a === void 0 ? void 0 : _a.toLowerCase()) === notif_config.name.toLowerCase() &&
83
- ((_b = w.network) === null || _b === void 0 ? void 0 : _b.toLowerCase()) === notif_config.network.toLowerCase();
76
+ ((_b = w.network) === null || _b === void 0 ? void 0 : _b.toLowerCase()) === notif_config.network.toLowerCase() &&
77
+ !((_c = w.name) === null || _c === void 0 ? void 0 : _c.includes('escrow'));
84
78
  });
85
79
  if (!existing) {
86
80
  console.warn(`QnWebhookAddressManager: No webhook found for config=${notif_config.name} network=${notif_config.network}`);
87
81
  continue;
88
82
  }
89
- const arg_key = notif_config.template === 'solanaWalletFilter' ? 'accounts' : 'wallets';
90
- const addresses = ((_a = existing.templateArgs) === null || _a === void 0 ? void 0 : _a[arg_key]) || [];
91
83
  entries.push({
92
84
  webhook_id: existing.id,
93
85
  name: notif_config.name.toLowerCase(),
@@ -96,16 +88,12 @@ class QnWebhookAddressManager {
96
88
  address_set: new Set(addresses),
97
89
  });
98
90
  }
99
- this.cache.set(blockchain, { entries, loaded_at: Date.now() });
91
+ return entries;
100
92
  });
101
93
  }
102
94
  ensure_loaded(blockchain) {
103
95
  return __awaiter(this, void 0, void 0, function* () {
104
- var _a;
105
- if (this.is_stale(blockchain)) {
106
- yield this.load(blockchain);
107
- }
108
- return ((_a = this.cache.get(blockchain)) === null || _a === void 0 ? void 0 : _a.entries) || [];
96
+ return this.cache.get_value(blockchain, blockchain, (bc) => this.load_entries(bc));
109
97
  });
110
98
  }
111
99
  matches_key(entry, key) {
@@ -114,11 +102,12 @@ class QnWebhookAddressManager {
114
102
  add_address(blockchain, address) {
115
103
  return __awaiter(this, void 0, void 0, function* () {
116
104
  const entries = yield this.ensure_loaded(blockchain);
105
+ console.log(`Pushing ${entries.length} addresses: `, entries);
106
+ console.log(`Pushed ${entries.length} addresses `);
117
107
  for (const entry of entries) {
118
- if (entry.address_set.has(address))
119
- continue;
120
108
  entry.address_set.add(address);
121
109
  try {
110
+ console.log(`add_address : Adding addresses: `, entry.address_set);
122
111
  yield this.api.update_webhook_addresses(entry.webhook_id, entry.template, Array.from(entry.address_set));
123
112
  console.log(`QnWebhookAddressManager: Added ${address} to ${entry.name} webhook`);
124
113
  }
@@ -133,12 +122,12 @@ class QnWebhookAddressManager {
133
122
  }
134
123
  remove_address(blockchain, address) {
135
124
  return __awaiter(this, void 0, void 0, function* () {
125
+ console.log(`Ensuring loaded...`);
136
126
  const entries = yield this.ensure_loaded(blockchain);
137
127
  for (const entry of entries) {
138
- if (!entry.address_set.has(address))
139
- continue;
140
128
  entry.address_set.delete(address);
141
129
  try {
130
+ console.log(`remove_address: Updating webhook addresses to :`, Array.from(entry.address_set));
142
131
  yield this.api.update_webhook_addresses(entry.webhook_id, entry.template, Array.from(entry.address_set));
143
132
  console.log(`QnWebhookAddressManager: Removed ${address} from ${entry.name} webhook`);
144
133
  }
@@ -165,10 +154,10 @@ class QnWebhookAddressManager {
165
154
  const entries = (yield this.ensure_loaded(blockchain))
166
155
  .filter(e => keys.some(k => this.matches_key(e, k)));
167
156
  for (const entry of entries) {
168
- if (entry.address_set.has(address))
169
- continue;
170
- entry.address_set.add(address);
157
+ if (!entry.address_set.has(address) && !entry.address_set.has(address.toLowerCase()))
158
+ entry.address_set.add(address);
171
159
  try {
160
+ console.log(`add_address_to_chain: Updating webhook addresses. new set ${entry.address_set.size} addresses`);
172
161
  yield this.api.update_webhook_addresses(entry.webhook_id, entry.template, Array.from(entry.address_set));
173
162
  console.log(`QnWebhookAddressManager: Added ${address} to ${entry.name} webhook (chain ${chain_id})`);
174
163
  }
@@ -195,10 +184,10 @@ class QnWebhookAddressManager {
195
184
  const entries = (yield this.ensure_loaded(blockchain))
196
185
  .filter(e => keys.some(k => this.matches_key(e, k)));
197
186
  for (const entry of entries) {
198
- if (!entry.address_set.has(address))
199
- continue;
200
- entry.address_set.delete(address);
187
+ if (entry.address_set.has(address) || entry.address_set.has(address.toLowerCase()))
188
+ entry.address_set.delete(address);
201
189
  try {
190
+ console.log(`remove_address_from_chain: Updating webhook addresses. new set ${entry.address_set.size} addresses`);
202
191
  yield this.api.update_webhook_addresses(entry.webhook_id, entry.template, Array.from(entry.address_set));
203
192
  console.log(`QnWebhookAddressManager: Removed ${address} from ${entry.name} webhook (chain ${chain_id})`);
204
193
  }
@@ -222,10 +211,9 @@ class QnWebhookAddressManager {
222
211
  const entries = (yield this.ensure_loaded(blockchain))
223
212
  .filter(e => !exclude_keys.some(k => this.matches_key(e, k)));
224
213
  for (const entry of entries) {
225
- if (entry.address_set.has(address))
226
- continue;
227
214
  entry.address_set.add(address);
228
215
  try {
216
+ console.log(`sync_add_to_remaining: Updating webhook addresses. new set ${entry.address_set.size} addresses`);
229
217
  yield this.api.update_webhook_addresses(entry.webhook_id, entry.template, Array.from(entry.address_set));
230
218
  console.log(`QnWebhookAddressManager: Synced add ${address} to ${entry.name} webhook`);
231
219
  }
@@ -247,10 +235,9 @@ class QnWebhookAddressManager {
247
235
  const entries = (yield this.ensure_loaded(blockchain))
248
236
  .filter(e => !exclude_keys.some(k => this.matches_key(e, k)));
249
237
  for (const entry of entries) {
250
- if (!entry.address_set.has(address))
251
- continue;
252
238
  entry.address_set.delete(address);
253
239
  try {
240
+ console.log(`sync_remove_from_remaining: Updating webhook addresses. new set ${entry.address_set.size} addresses`);
254
241
  yield this.api.update_webhook_addresses(entry.webhook_id, entry.template, Array.from(entry.address_set));
255
242
  console.log(`QnWebhookAddressManager: Synced remove ${address} from ${entry.name} webhook`);
256
243
  }
@@ -261,5 +248,27 @@ class QnWebhookAddressManager {
261
248
  }
262
249
  });
263
250
  }
251
+ // Get all custodial addresses for monitoring
252
+ fetch_all_db_addresses(blockchain) {
253
+ return __awaiter(this, void 0, void 0, function* () {
254
+ const service = new DepositAddressService_1.default(this.db);
255
+ const addresses = [];
256
+ let page = 1;
257
+ const page_size = ADDRESS_SYNC_BATCH_SIZE;
258
+ while (true) {
259
+ const result = yield service.getDepositAddressesPaginated(page, page_size, { blockchain });
260
+ for (const item of result.items) {
261
+ addresses.push(item.address);
262
+ }
263
+ if (!result.has_next)
264
+ break;
265
+ page++;
266
+ }
267
+ if (addresses.length > ADDRESS_LOG_THRESHOLD) {
268
+ console.warn(`QnWebhookAddressManager: ${addresses.length} addresses fetched for blockchain=${blockchain} — ensure QN webhook limit is sufficient`);
269
+ }
270
+ return addresses;
271
+ });
272
+ }
264
273
  }
265
274
  exports.default = QnWebhookAddressManager;
@@ -27,6 +27,7 @@ declare class SetupNotifications extends BaseErrors {
27
27
  * The `blockchain` filter value in DepositAddressService is the string stored
28
28
  * in the DB — e.g. "solana", "evm", "ethereum", etc.
29
29
  */
30
+ private fetch_contract_addresses;
30
31
  private fetch_all_db_addresses;
31
32
  /**
32
33
  * Register a newly-created webhook entry in the internal maps.
@@ -1 +1 @@
1
- {"version":3,"file":"SetupNotifications.d.ts","sourceRoot":"","sources":["../../../src/services/quicknode-notifications/SetupNotifications.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAiB,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAQlE,MAAM,WAAW,wBAAwB;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,cAAc,CAAC;IAC3B,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAC5B;AAWD,cAAM,kBAAmB,SAAQ,UAAU;IACvC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAqB;IAC5C,OAAO,CAAC,GAAG,CAAqB;IAEhC,OAAO,CAAC,WAAW,CAAoD;IAEvE,OAAO,CAAC,aAAa,CAA8D;IAEnF,OAAO,CAAC,eAAe,CAAqD;IAC5E,OAAO,CAAC,MAAM,CAAU;IACxB,OAAO,CAAC,EAAE,CAAgB;IAC1B,OAAO;IAOP,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,aAAa,EAAE,GAAG,EAAE,kBAAkB,GAAG,kBAAkB;IAO5F,mBAAmB,IAAI,MAAM,EAAE;IAI/B,uBAAuB,CAAC,EAAE,EAAE,MAAM,GAAG,wBAAwB,GAAG,SAAS;IAOhF;;;;OAIG;YACW,sBAAsB;IAuBpC;;OAEG;IACH,OAAO,CAAC,cAAc;IAOT,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAwH3B,WAAW,CAAC,UAAU,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAyDvE,cAAc,CAAC,UAAU,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAe1F;AAED,eAAe,kBAAkB,CAAC"}
1
+ {"version":3,"file":"SetupNotifications.d.ts","sourceRoot":"","sources":["../../../src/services/quicknode-notifications/SetupNotifications.ts"],"names":[],"mappings":"AAEA,OAAO,UAAU,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAiB,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAUlE,MAAM,WAAW,wBAAwB;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,cAAc,CAAC;IAC3B,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAC5B;AAWD,cAAM,kBAAmB,SAAQ,UAAU;IACvC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAqB;IAC5C,OAAO,CAAC,GAAG,CAAqB;IAEhC,OAAO,CAAC,WAAW,CAAoD;IAEvE,OAAO,CAAC,aAAa,CAA8D;IAEnF,OAAO,CAAC,eAAe,CAAqD;IAC5E,OAAO,CAAC,MAAM,CAAU;IACxB,OAAO,CAAC,EAAE,CAAgB;IAC1B,OAAO;IAOP,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,aAAa,EAAE,GAAG,EAAE,kBAAkB,GAAG,kBAAkB;IAO5F,mBAAmB,IAAI,MAAM,EAAE;IAI/B,uBAAuB,CAAC,EAAE,EAAE,MAAM,GAAG,wBAAwB,GAAG,SAAS;IAOhF;;;;OAIG;YACW,wBAAwB;YAoBxB,sBAAsB;IAuBpC;;OAEG;IACH,OAAO,CAAC,cAAc;IAOT,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IA0H3B,WAAW,CAAC,UAAU,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAyDvE,cAAc,CAAC,UAAU,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAe1F;AAED,eAAe,kBAAkB,CAAC"}
@@ -12,11 +12,15 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
12
12
  return (mod && mod.__esModule) ? mod : { "default": mod };
13
13
  };
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
+ const web3_js_1 = require("@solana/web3.js");
16
+ const constants_1 = require("../../constants");
15
17
  const errors_1 = __importDefault(require("../../errors/errors"));
16
18
  const ChainManager_1 = __importDefault(require("../ChainManager"));
17
19
  const DepositAddressService_1 = __importDefault(require("../DepositAddressService"));
18
20
  const QuicknodeWebhookSignature_1 = __importDefault(require("../QuicknodeWebhookSignature"));
19
21
  const QnNotificationsApi_1 = __importDefault(require("./QnNotificationsApi"));
22
+ const Wallets_1 = require("../../utils/Wallets");
23
+ const __1 = require("../..");
20
24
  const ADDRESS_SYNC_BATCH_SIZE = 500;
21
25
  const ADDRESS_LOG_THRESHOLD = 1000;
22
26
  class SetupNotifications extends errors_1.default {
@@ -53,6 +57,27 @@ class SetupNotifications extends errors_1.default {
53
57
  * The `blockchain` filter value in DepositAddressService is the string stored
54
58
  * in the DB — e.g. "solana", "evm", "ethereum", etc.
55
59
  */
60
+ fetch_contract_addresses(notif_config) {
61
+ return __awaiter(this, void 0, void 0, function* () {
62
+ var _a;
63
+ if (!notif_config.chain_id) {
64
+ console.warn(`SetupNotifications: source='contract' but no chain_id set for ${notif_config.name} — skipping`);
65
+ return [];
66
+ }
67
+ const chain_manager = ChainManager_1.default.getInstance(this.config);
68
+ const escrow_config = chain_manager.getEscrowContractForChain(notif_config.chain_id);
69
+ // Derive vault authority for solana escrow program
70
+ if (notif_config.chain_id !== undefined && notif_config.blockchain === constants_1.BLOCKCHAINS.SOLANA) {
71
+ const chain_manager = ChainManager_1.default.getInstance(this.config);
72
+ const escrow_config = chain_manager.getEscrowContractForChain(parseInt(notif_config.chain_id.toString()));
73
+ // TODO handle multiple escrow contracts on solana
74
+ const escrow_program_pubkey = new web3_js_1.PublicKey((0, Wallets_1.normalizeAddress)(escrow_config.addresses[0], "solana"));
75
+ const vault_authority = __1.EscrowService.findVaultAuthorityPda(escrow_program_pubkey);
76
+ return [vault_authority.toString()];
77
+ }
78
+ return (_a = escrow_config === null || escrow_config === void 0 ? void 0 : escrow_config.addresses) !== null && _a !== void 0 ? _a : [];
79
+ });
80
+ }
56
81
  fetch_all_db_addresses(blockchain) {
57
82
  return __awaiter(this, void 0, void 0, function* () {
58
83
  const service = new DepositAddressService_1.default(this.db);
@@ -117,8 +142,10 @@ class SetupNotifications extends errors_1.default {
117
142
  return ((_a = w.name) === null || _a === void 0 ? void 0 : _a.toLowerCase()) === notif_config.name.toLowerCase() &&
118
143
  ((_b = w.network) === null || _b === void 0 ? void 0 : _b.toLowerCase()) === notif_config.network.toLowerCase();
119
144
  });
120
- // Fetch current addresses from the DB for this blockchain
121
- const db_addresses = yield this.fetch_all_db_addresses(notif_config.blockchain);
145
+ // Fetch addresses — contract source uses escrow addresses, wallet source uses DB deposit addresses
146
+ const db_addresses = notif_config.source === 'contract'
147
+ ? yield this.fetch_contract_addresses(notif_config)
148
+ : yield this.fetch_all_db_addresses(notif_config.blockchain);
122
149
  console.log(`SetupNotifications: ${db_addresses.length} DB addresses for blockchain=${notif_config.blockchain}`);
123
150
  let webhook_id;
124
151
  if (existing) {
@@ -12,6 +12,10 @@ export type QuicknodeNotificationConfig = {
12
12
  name: string;
13
13
  network: string;
14
14
  template: 'solanaWalletFilter' | 'evmWalletFilter';
15
+ /** 'wallet' (default) = custodial deposit addresses; 'contract' = escrow contract addresses */
16
+ source?: 'wallet' | 'contract';
17
+ /** Required when source === 'contract' — the chain ID to look up the escrow contract */
18
+ chain_id?: number;
15
19
  };
16
20
  export type QuicknodeStreamConfig = {
17
21
  network: string;
@@ -46,6 +50,7 @@ export interface ChainAccountingDetails {
46
50
  treasury_receiver: string;
47
51
  overflow_treasury_receiver: string;
48
52
  overflow_threshold_decimal: number;
53
+ min_funding_wallet_balance_usd: number;
49
54
  }
50
55
  export interface TronConfig {
51
56
  trxTransferCost: number;
@@ -1 +1 @@
1
- {"version":3,"file":"chain_manager.d.ts","sourceRoot":"","sources":["../../../src/services/types/chain_manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAElD,MAAM,MAAM,6BAA6B,GAAG;IACxC,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,qBAAqB,CAAC;IAC/B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,UAAU,GAAG,QAAQ,CAAC;CACjC,CAAA;AAED,MAAM,MAAM,2BAA2B,GAAG;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,oBAAoB,GAAG,iBAAiB,CAAC;CACtD,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,GAAG,qBAAqB,GAAG,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,cAAc,GAAG,cAAc,GAAG,cAAc,CAAC;IAC7H,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;CAC3C,CAAA;AAED,MAAM,MAAM,cAAc,GAAG;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,qBAAqB,EAAE,0BAA0B,EAAE,CAAC;IACpD,SAAS,EAAE,MAAM,EAAE,CAAC;CACvB,CAAA;AAED,MAAM,MAAM,0BAA0B,GAAG;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,qBAAqB,CAAC;IAC/B,IAAI,EAAE,SAAS,GAAG,kBAAkB,CAAC;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,UAAU,GAAG,QAAQ,CAAA;CAChC,CAAA;AAGD,MAAM,MAAM,WAAW,GAAG,eAAe,GAAG,MAAM,CAAC;AAEnD,MAAM,WAAW,eAAe;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,sBAAsB;IACnC,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,0BAA0B,EAAE,MAAM,CAAC;IACnC,0BAA0B,EAAE,MAAM,CAAC;CACtC;AAED,MAAM,WAAW,UAAU;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,CAAC;CAC7B"}
1
+ {"version":3,"file":"chain_manager.d.ts","sourceRoot":"","sources":["../../../src/services/types/chain_manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAElD,MAAM,MAAM,6BAA6B,GAAG;IACxC,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,qBAAqB,CAAC;IAC/B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,UAAU,GAAG,QAAQ,CAAC;CACjC,CAAA;AAED,MAAM,MAAM,2BAA2B,GAAG;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,oBAAoB,GAAG,iBAAiB,CAAC;IACnD,+FAA+F;IAC/F,MAAM,CAAC,EAAE,QAAQ,GAAG,UAAU,CAAC;IAC/B,wFAAwF;IACxF,QAAQ,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,GAAG,qBAAqB,GAAG,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,cAAc,GAAG,cAAc,GAAG,cAAc,CAAC;IAC7H,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;CAC3C,CAAA;AAED,MAAM,MAAM,cAAc,GAAG;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,qBAAqB,EAAE,0BAA0B,EAAE,CAAC;IACpD,SAAS,EAAE,MAAM,EAAE,CAAC;CACvB,CAAA;AAED,MAAM,MAAM,0BAA0B,GAAG;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,qBAAqB,CAAC;IAC/B,IAAI,EAAE,SAAS,GAAG,kBAAkB,CAAC;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,UAAU,GAAG,QAAQ,CAAA;CAChC,CAAA;AAGD,MAAM,MAAM,WAAW,GAAG,eAAe,GAAG,MAAM,CAAC;AAEnD,MAAM,WAAW,eAAe;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,sBAAsB;IACnC,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,0BAA0B,EAAE,MAAM,CAAC;IACnC,0BAA0B,EAAE,MAAM,CAAC;IACnC,8BAA8B,EAAE,MAAM,CAAC;CAC1C;AAED,MAAM,WAAW,UAAU;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,CAAC;CAC7B"}
@@ -8,6 +8,7 @@ export interface IWallet {
8
8
  childIndex: number;
9
9
  transactionCount: number;
10
10
  blockchain: string;
11
+ expiresAt: Date;
11
12
  updatedAt: Date;
12
13
  createdAt: Date;
13
14
  }
@@ -1 +1 @@
1
- {"version":3,"file":"wallet_manager.d.ts","sourceRoot":"","sources":["../../../src/services/types/wallet_manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,MAAM,WAAW,OAAO;IACpB,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;AAED,MAAM,WAAW,WAAW;IACxB,MAAM,EAAE,YAAY,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;CACnB;AACD,MAAM,WAAW,YAAY;IACzB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACnB;AAGD,MAAM,WAAW,UAAU;IACvB,MAAM,EAAE,cAAc,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,CAAC,EAAE,EAAE,GAAG,KAAK,GAAG,CAAC;CAC1B;AAED,MAAM,WAAW,SAAS;IACtB,MAAM,EAAE,GAAG,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;CACnB"}
1
+ {"version":3,"file":"wallet_manager.d.ts","sourceRoot":"","sources":["../../../src/services/types/wallet_manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,MAAM,WAAW,OAAO;IACpB,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;IAChB,SAAS,EAAE,IAAI,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IACxB,MAAM,EAAE,YAAY,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;CACnB;AACD,MAAM,WAAW,YAAY;IACzB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACnB;AAGD,MAAM,WAAW,UAAU;IACvB,MAAM,EAAE,cAAc,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,CAAC,EAAE,EAAE,GAAG,KAAK,GAAG,CAAC;CAC1B;AAED,MAAM,WAAW,SAAS;IACtB,MAAM,EAAE,GAAG,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;CACnB"}
@@ -1 +1 @@
1
- {"version":3,"file":"Logger.d.ts","sourceRoot":"","sources":["../../src/utils/Logger.ts"],"names":[],"mappings":"AACA,OAAO,aAAa,MAAM,2BAA2B,CAAC;AAItD,MAAM,WAAW,UAAU;IACvB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACtB;AASD,cAAM,MAAM;IACR,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAuB;IAC9C,OAAO,CAAC,MAAM,CAAC,OAAO,CAA8B;IACpD,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,MAAM,CAAS;IAEvB,OAAO;IAkCP;;OAEG;IACH,MAAM,CAAC,WAAW,CAAC,MAAM,GAAE,MAAc,EAAE,WAAW,GAAE,MAAsB,GAAG,MAAM;IAOvF;;OAEG;IACH,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAI/C;;;OAGG;IACH,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,MAAM;IAcxE;;OAEG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,UAAU,GAAG,IAAI;IAI/C;;OAEG;IACH,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,UAAU,GAAG,IAAI;IAI9C;;OAEG;IACH,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,UAAU,GAAG,IAAI;IAK9C;;OAEG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,UAAU,GAAG,IAAI;IAO/C;;OAEG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,UAAU,GAAG,IAAI;IAM/C;;OAEG;IACH,OAAO,CAAC,aAAa;IA8BrB;;OAEG;IACH,OAAO,CAAC,cAAc;CAezB;AAED;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,YAAY,GAAI,QAAQ,MAAM,EAAE,aAAa,MAAM,EAAE,UAAU,UAAU,KAAG,MAExF,CAAC;AAEF,eAAe,MAAM,CAAC"}
1
+ {"version":3,"file":"Logger.d.ts","sourceRoot":"","sources":["../../src/utils/Logger.ts"],"names":[],"mappings":"AACA,OAAO,aAAa,MAAM,2BAA2B,CAAC;AAItD,MAAM,WAAW,UAAU;IACvB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACtB;AASD,cAAM,MAAM;IACR,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAuB;IAC9C,OAAO,CAAC,MAAM,CAAC,OAAO,CAA8B;IACpD,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,MAAM,CAAS;IAEvB,OAAO;IAkCP;;OAEG;IACH,MAAM,CAAC,WAAW,CAAC,MAAM,GAAE,MAAc,EAAE,WAAW,GAAE,MAAsB,GAAG,MAAM;IAOvF;;OAEG;IACH,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAI/C;;;OAGG;IACH,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,MAAM;IAcxE;;OAEG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,UAAU,GAAG,IAAI;IAI/C;;OAEG;IACH,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,UAAU,GAAG,IAAI;IAI9C;;OAEG;IACH,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,UAAU,GAAG,IAAI;IAM9C;;OAEG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,UAAU,GAAG,IAAI;IAO/C;;OAEG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,UAAU,GAAG,IAAI;IAM/C;;OAEG;IACH,OAAO,CAAC,aAAa;IAuCrB;;OAEG;IACH,OAAO,CAAC,cAAc;CAezB;AAED;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,YAAY,GAAI,QAAQ,MAAM,EAAE,aAAa,MAAM,EAAE,UAAU,UAAU,KAAG,MAExF,CAAC;AAEF,eAAe,MAAM,CAAC"}
@@ -84,8 +84,9 @@ class Logger {
84
84
  * Warn level - sent to ElasticSearch
85
85
  */
86
86
  warn(message, data) {
87
- this.pino.warn(Object.assign({ source: this.source }, data), message);
88
- this.indexToElastic('Warning', message, data);
87
+ const logData = this.normalizeData(data);
88
+ this.pino.warn(Object.assign({ source: this.source }, logData), message);
89
+ this.indexToElastic('Warning', message, logData);
89
90
  }
90
91
  /**
91
92
  * Error level - sent to ElasticSearch
@@ -129,6 +130,16 @@ class Logger {
129
130
  stack: value.stack,
130
131
  };
131
132
  }
133
+ else if (value !== null && typeof value === 'object' && !Array.isArray(value)) {
134
+ // Recurse one level to catch nested Error objects (e.g. { data: { err: Error } })
135
+ const nested = {};
136
+ for (const [nk, nv] of Object.entries(value)) {
137
+ nested[nk] = nv instanceof Error
138
+ ? { name: nv.name, message: nv.message, stack: nv.stack }
139
+ : nv;
140
+ }
141
+ normalized[key] = nested;
142
+ }
132
143
  else {
133
144
  normalized[key] = value;
134
145
  }
@@ -70,7 +70,8 @@ export declare const handle_transfer_batch: (payloads: SolanaTransactionRequest[
70
70
  success: SolanaTransactionSuccessRequest[];
71
71
  failed: SolanaTransactionRequest[];
72
72
  }>;
73
- export declare const find_transfer_instruction: (tx: SolanaTransactionLog) => TransferInstructionRecord;
73
+ export declare const find_transfer_instruction: (tx: SolanaTransactionLog, receiver?: string) => TransferInstructionRecord;
74
+ export declare const find_transfer_instruction_depr: (tx: SolanaTransactionLog) => TransferInstructionRecord;
74
75
  export declare const getSolanaConnection: (chainId: string, config: IConfig) => web3.Connection;
75
76
  export declare const getSolanaArchivalConnection: (chainId: string, config: IConfig) => web3.Connection;
76
77
  export declare const getSolanaConnectionPublic: (chainId: string) => web3.Connection;
@@ -1 +1 @@
1
- {"version":3,"file":"solana.d.ts","sourceRoot":"","sources":["../../src/utils/solana.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"solana.d.ts","sourceRoot":"","sources":["../../src/utils/solana.ts"],"names":[],"mappings":"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"}
@@ -45,7 +45,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
45
45
  return (mod && mod.__esModule) ? mod : { "default": mod };
46
46
  };
47
47
  Object.defineProperty(exports, "__esModule", { value: true });
48
- exports.check_approve_delegate = exports.handle_create_versioned_transaction_spl = exports.estimate_withdraw_gas_cost = exports.create_versioned_transaction_solana = exports.get_token_account_info = exports.getSolanaConnectionPublic = exports.getSolanaArchivalConnection = exports.getSolanaConnection = exports.find_transfer_instruction = exports.handle_transfer_batch = exports.handle_sweep = exports.SplTransferCheckedLayout = exports.SolTransferInstructionLayout = exports.usdc_program_address = exports.solana_program_address = exports.min_solana_funding_lamports = void 0;
48
+ exports.check_approve_delegate = exports.handle_create_versioned_transaction_spl = exports.estimate_withdraw_gas_cost = exports.create_versioned_transaction_solana = exports.get_token_account_info = exports.getSolanaConnectionPublic = exports.getSolanaArchivalConnection = exports.getSolanaConnection = exports.find_transfer_instruction_depr = exports.find_transfer_instruction = exports.handle_transfer_batch = exports.handle_sweep = exports.SplTransferCheckedLayout = exports.SolTransferInstructionLayout = exports.usdc_program_address = exports.solana_program_address = exports.min_solana_funding_lamports = void 0;
49
49
  const buffer_layout_utils_1 = require("@solana/buffer-layout-utils");
50
50
  const buffer_layout_1 = require("@solana/buffer-layout");
51
51
  const web3_js_1 = __importStar(require("@solana/web3.js"));
@@ -182,7 +182,32 @@ const handle_transfer_batch = (payloads_1, chain_id_1, token_type_1, connection_
182
182
  return { status: true, signatures, success, failed };
183
183
  });
184
184
  exports.handle_transfer_batch = handle_transfer_batch;
185
- const find_transfer_instruction = (tx) => {
185
+ const find_transfer_instruction = (tx, receiver) => {
186
+ const message = tx.transaction[0].message[0];
187
+ const target_instruction = message.instructions.find(i => {
188
+ const program = message.account_keys[parseInt(i.program_id_index)];
189
+ if (!token_program_addresses.some(a => a === program))
190
+ return false;
191
+ // If a receiver is specified and this is a native SOL transfer, match by
192
+ // the destination account (accounts[1]) to find the exact instruction for
193
+ // that recipient. Needed for batch sends where one tx has many transfers.
194
+ if (receiver && program === exports.solana_program_address) {
195
+ if (!i.accounts || i.accounts.length < 2)
196
+ return false;
197
+ return message.account_keys[i.accounts[1]] === receiver;
198
+ }
199
+ return true; // original behaviour: first matching program
200
+ });
201
+ if (!target_instruction)
202
+ throw new Error(`Cannot find program index for accepted payment tokens: ${token_program_addresses}`);
203
+ const program_index = target_instruction.program_id_index;
204
+ return {
205
+ instruction: target_instruction,
206
+ is_native: message.account_keys[parseInt(program_index)] === exports.solana_program_address
207
+ };
208
+ };
209
+ exports.find_transfer_instruction = find_transfer_instruction;
210
+ const find_transfer_instruction_depr = (tx) => {
186
211
  const message = tx.transaction[0].message[0];
187
212
  const target_instruction = message.instructions.find(i => token_program_addresses.some(a => a === message.account_keys[parseInt(i.program_id_index)]));
188
213
  if (!target_instruction)
@@ -190,7 +215,7 @@ const find_transfer_instruction = (tx) => {
190
215
  const program_index = target_instruction === null || target_instruction === void 0 ? void 0 : target_instruction.program_id_index;
191
216
  return { instruction: target_instruction, is_native: tx.transaction[0].message[0].account_keys[parseInt(program_index)] === exports.solana_program_address };
192
217
  };
193
- exports.find_transfer_instruction = find_transfer_instruction;
218
+ exports.find_transfer_instruction_depr = find_transfer_instruction_depr;
194
219
  const getSolanaConnection = (chainId, config) => {
195
220
  const network = ChainManager_1.default.getInstance(config).getChainConfigForChainIdSync(parseInt(chainId));
196
221
  if (!network)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ercworldio/blockchain-shared",
3
- "version": "1.0.1-dev.2",
3
+ "version": "1.0.1-dev.20",
4
4
  "description": "Shared library for blockchain projects",
5
5
  "main": "build/index.js",
6
6
  "types": "build/index.d.ts",