@ercworldio/blockchain-shared 1.0.1-dev.3 → 1.0.1-dev.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/entities/DepositAddress.d.ts +1 -0
- package/build/entities/DepositAddress.d.ts.map +1 -1
- package/build/entities/DepositAddress.js +6 -2
- package/build/entities/DepositAddressArchive.d.ts +14 -0
- package/build/entities/DepositAddressArchive.d.ts.map +1 -0
- package/build/entities/DepositAddressArchive.js +66 -0
- package/build/index.d.ts +2 -0
- package/build/index.d.ts.map +1 -1
- package/build/index.js +5 -2
- package/build/interfaces/database.d.ts +2 -0
- package/build/interfaces/database.d.ts.map +1 -1
- package/build/services/DepositAddressArchiveService.d.ts +33 -0
- package/build/services/DepositAddressArchiveService.d.ts.map +1 -0
- package/build/services/DepositAddressArchiveService.js +142 -0
- package/build/services/DepositAddressService.d.ts +3 -1
- package/build/services/DepositAddressService.d.ts.map +1 -1
- package/build/services/DepositAddressService.js +5 -1
- package/build/services/WalletManager.d.ts +2 -2
- package/build/services/WalletManager.d.ts.map +1 -1
- package/build/services/WalletManager.js +6 -4
- package/build/services/quicknode-notifications/QnWebhookAddressManager.d.ts +4 -1
- package/build/services/quicknode-notifications/QnWebhookAddressManager.d.ts.map +1 -1
- package/build/services/quicknode-notifications/QnWebhookAddressManager.js +31 -6
- package/build/services/types/wallet_manager.d.ts +1 -0
- package/build/services/types/wallet_manager.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DepositAddress.d.ts","sourceRoot":"","sources":["../../src/entities/DepositAddress.ts"],"names":[],"mappings":"AAEA,qBAEa,cAAc;IAEvB,EAAE,EAAG,MAAM,CAAC;IAGZ,OAAO,EAAG,MAAM,CAAC;IAGjB,UAAU,EAAG,MAAM,CAAC;IAGpB,YAAY,EAAG,MAAM,CAAC;IAGtB,WAAW,EAAG,MAAM,CAAC;IAGrB,OAAO,EAAG,MAAM,CAAC;IAGjB,iBAAiB,EAAG,MAAM,CAAC;IAG3B,UAAU,EAAG,IAAI,CAAC;IAGlB,UAAU,EAAG,IAAI,CAAC;CACrB"}
|
|
1
|
+
{"version":3,"file":"DepositAddress.d.ts","sourceRoot":"","sources":["../../src/entities/DepositAddress.ts"],"names":[],"mappings":"AAEA,qBAEa,cAAc;IAEvB,EAAE,EAAG,MAAM,CAAC;IAGZ,OAAO,EAAG,MAAM,CAAC;IAGjB,UAAU,EAAG,MAAM,CAAC;IAGpB,YAAY,EAAG,MAAM,CAAC;IAGtB,WAAW,EAAG,MAAM,CAAC;IAGrB,OAAO,EAAG,MAAM,CAAC;IAGjB,iBAAiB,EAAG,MAAM,CAAC;IAG3B,UAAU,EAAG,IAAI,CAAC;IAGlB,UAAU,EAAG,IAAI,CAAC;IAGlB,UAAU,EAAG,IAAI,CAAC;CACrB"}
|
|
@@ -43,11 +43,15 @@ __decorate([
|
|
|
43
43
|
__metadata("design:type", Number)
|
|
44
44
|
], DepositAddress.prototype, "transaction_count", void 0);
|
|
45
45
|
__decorate([
|
|
46
|
-
(0, typeorm_1.Column)({ type: '
|
|
46
|
+
(0, typeorm_1.Column)({ type: 'timestamptz', default: () => 'CURRENT_TIMESTAMP' }),
|
|
47
|
+
__metadata("design:type", Date)
|
|
48
|
+
], DepositAddress.prototype, "expires_at", void 0);
|
|
49
|
+
__decorate([
|
|
50
|
+
(0, typeorm_1.Column)({ type: 'timestamptz', default: () => 'CURRENT_TIMESTAMP' }),
|
|
47
51
|
__metadata("design:type", Date)
|
|
48
52
|
], DepositAddress.prototype, "created_at", void 0);
|
|
49
53
|
__decorate([
|
|
50
|
-
(0, typeorm_1.Column)({ type: '
|
|
54
|
+
(0, typeorm_1.Column)({ type: 'timestamptz', default: () => 'CURRENT_TIMESTAMP' }),
|
|
51
55
|
__metadata("design:type", Date)
|
|
52
56
|
], DepositAddress.prototype, "updated_at", void 0);
|
|
53
57
|
exports.DepositAddress = DepositAddress = __decorate([
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export declare class DepositAddressArchive {
|
|
2
|
+
id: number;
|
|
3
|
+
original_id: number;
|
|
4
|
+
user_id: number;
|
|
5
|
+
blockchain: string;
|
|
6
|
+
parent_index: number | null;
|
|
7
|
+
child_index: number | null;
|
|
8
|
+
address: string;
|
|
9
|
+
transaction_count: number;
|
|
10
|
+
expires_at: Date;
|
|
11
|
+
archived_at: Date;
|
|
12
|
+
archived_reason: 'expired' | 'revoked' | 'renewed';
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=DepositAddressArchive.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DepositAddressArchive.d.ts","sourceRoot":"","sources":["../../src/entities/DepositAddressArchive.ts"],"names":[],"mappings":"AAEA,qBAEa,qBAAqB;IAE9B,EAAE,EAAG,MAAM,CAAC;IAGZ,WAAW,EAAG,MAAM,CAAC;IAIrB,OAAO,EAAG,MAAM,CAAC;IAGjB,UAAU,EAAG,MAAM,CAAC;IAGpB,YAAY,EAAG,MAAM,GAAG,IAAI,CAAC;IAG7B,WAAW,EAAG,MAAM,GAAG,IAAI,CAAC;IAI5B,OAAO,EAAG,MAAM,CAAC;IAGjB,iBAAiB,EAAG,MAAM,CAAC;IAG3B,UAAU,EAAG,IAAI,CAAC;IAGlB,WAAW,EAAG,IAAI,CAAC;IAGnB,eAAe,EAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;CACvD"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.DepositAddressArchive = void 0;
|
|
13
|
+
const typeorm_1 = require("typeorm");
|
|
14
|
+
let DepositAddressArchive = class DepositAddressArchive {
|
|
15
|
+
};
|
|
16
|
+
exports.DepositAddressArchive = DepositAddressArchive;
|
|
17
|
+
__decorate([
|
|
18
|
+
(0, typeorm_1.PrimaryGeneratedColumn)({ type: 'bigint' }),
|
|
19
|
+
__metadata("design:type", Number)
|
|
20
|
+
], DepositAddressArchive.prototype, "id", void 0);
|
|
21
|
+
__decorate([
|
|
22
|
+
(0, typeorm_1.Column)({ type: 'bigint', name: 'original_id' }),
|
|
23
|
+
__metadata("design:type", Number)
|
|
24
|
+
], DepositAddressArchive.prototype, "original_id", void 0);
|
|
25
|
+
__decorate([
|
|
26
|
+
(0, typeorm_1.Column)({ type: 'bigint', name: 'user_id' }),
|
|
27
|
+
(0, typeorm_1.Index)(),
|
|
28
|
+
__metadata("design:type", Number)
|
|
29
|
+
], DepositAddressArchive.prototype, "user_id", void 0);
|
|
30
|
+
__decorate([
|
|
31
|
+
(0, typeorm_1.Column)(),
|
|
32
|
+
__metadata("design:type", String)
|
|
33
|
+
], DepositAddressArchive.prototype, "blockchain", void 0);
|
|
34
|
+
__decorate([
|
|
35
|
+
(0, typeorm_1.Column)({ nullable: true, name: 'parent_index' }),
|
|
36
|
+
__metadata("design:type", Object)
|
|
37
|
+
], DepositAddressArchive.prototype, "parent_index", void 0);
|
|
38
|
+
__decorate([
|
|
39
|
+
(0, typeorm_1.Column)({ nullable: true, name: 'child_index' }),
|
|
40
|
+
__metadata("design:type", Object)
|
|
41
|
+
], DepositAddressArchive.prototype, "child_index", void 0);
|
|
42
|
+
__decorate([
|
|
43
|
+
(0, typeorm_1.Column)(),
|
|
44
|
+
(0, typeorm_1.Index)(),
|
|
45
|
+
__metadata("design:type", String)
|
|
46
|
+
], DepositAddressArchive.prototype, "address", void 0);
|
|
47
|
+
__decorate([
|
|
48
|
+
(0, typeorm_1.Column)({ name: 'transaction_count' }),
|
|
49
|
+
__metadata("design:type", Number)
|
|
50
|
+
], DepositAddressArchive.prototype, "transaction_count", void 0);
|
|
51
|
+
__decorate([
|
|
52
|
+
(0, typeorm_1.Column)({ type: 'timestamptz', name: 'expires_at' }),
|
|
53
|
+
__metadata("design:type", Date)
|
|
54
|
+
], DepositAddressArchive.prototype, "expires_at", void 0);
|
|
55
|
+
__decorate([
|
|
56
|
+
(0, typeorm_1.CreateDateColumn)({ type: 'timestamptz', name: 'archived_at' }),
|
|
57
|
+
__metadata("design:type", Date)
|
|
58
|
+
], DepositAddressArchive.prototype, "archived_at", void 0);
|
|
59
|
+
__decorate([
|
|
60
|
+
(0, typeorm_1.Column)({ name: 'archived_reason', default: 'expired' }),
|
|
61
|
+
__metadata("design:type", String)
|
|
62
|
+
], DepositAddressArchive.prototype, "archived_reason", void 0);
|
|
63
|
+
exports.DepositAddressArchive = DepositAddressArchive = __decorate([
|
|
64
|
+
(0, typeorm_1.Entity)({ name: "deposit_addresses_archive", schema: "usersmanagement" }),
|
|
65
|
+
(0, typeorm_1.Unique)(['original_id'])
|
|
66
|
+
], DepositAddressArchive);
|
package/build/index.d.ts
CHANGED
|
@@ -11,6 +11,7 @@ export { default as ChainManager } from './services/ChainManager';
|
|
|
11
11
|
export { default as ClaimHistoryService } from './services/ClaimHistoryService';
|
|
12
12
|
export { default as ClaimJobService } from './services/ClaimJobService';
|
|
13
13
|
export { default as DepositAddressService } from './services/DepositAddressService';
|
|
14
|
+
export { default as DepositAddressArchiveService } from './services/DepositAddressArchiveService';
|
|
14
15
|
export { default as ElasticSearch } from './services/ElasticSearch';
|
|
15
16
|
export { default as EventsHandler } from './services/EventsHandler';
|
|
16
17
|
export { default as EventsService } from './services/EventsService';
|
|
@@ -61,6 +62,7 @@ export * from './entities/Checkpoint';
|
|
|
61
62
|
export * from './entities/ClaimHistory';
|
|
62
63
|
export * from './entities/ClaimJob';
|
|
63
64
|
export * from './entities/DepositAddress';
|
|
65
|
+
export * from './entities/DepositAddressArchive';
|
|
64
66
|
export * from './entities/DepositWalletBalance';
|
|
65
67
|
export * from './entities/SweepHistory';
|
|
66
68
|
export * from './entities/SweepJob';
|
package/build/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/build/index.js
CHANGED
|
@@ -40,8 +40,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
40
40
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
41
41
|
};
|
|
42
42
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
43
|
-
exports.
|
|
44
|
-
exports.AppErrors = exports.EscrowIdl = exports.CoverageInfo = exports.EscrowEvents = exports.Erc20Events = exports.AccessControlEvents = exports.ERC20Abi = exports.ErrorAbi = exports.EscrowAbi = exports.ERC20MockAbi = exports.BaseErrors = exports.VoltageErrors = exports.AlchemyErrors = exports.WalletErrors = exports.DatabaseErrors = void 0;
|
|
43
|
+
exports.AdminErrors = exports.TransactionsErrors = exports.EscrowInteraction = exports.QnWebhookAddressManager = exports.SetupNotifications = exports.QnNotificationsApi = exports.QuicknodeWebhookSignature = exports.Worker = exports.WithdrawalManager = exports.WalletManagerHelper = exports.WalletManager = exports.WalletIndexService = exports.SweepHistoryService = exports.SweepJobService = exports.StorageService = exports.ProviderManager = exports.Provider = exports.TronFundingWallet = exports.TronCustodialWallet = exports.TronHotWallet = exports.TronHelper = exports.TronTransaction = exports.TronSigner = exports.TimerManager = exports.RedisPubSub = exports.RedisListQueue = exports.RedisQueue = exports.Redis = exports.MemoryMonitor = exports.Logger = exports.KeyVaultHandler = exports.InvoiceQueue = exports.EscrowService = exports.EventsService = exports.EventsHandler = exports.ElasticSearch = exports.DepositAddressArchiveService = exports.DepositAddressService = exports.ClaimJobService = exports.ClaimHistoryService = exports.ChainManager = exports.BalanceService = exports.AlchemyWebhookSignature = exports.AlchemyWebhooks = exports.AlchemyWebhookAddressManager = exports.AlchemyService = exports.AccountingService = exports.AzureEventHubHandler = exports.AsyncTTLCache = exports.AsyncRateLimiter = void 0;
|
|
44
|
+
exports.AppErrors = exports.EscrowIdl = exports.CoverageInfo = exports.EscrowEvents = exports.Erc20Events = exports.AccessControlEvents = exports.ERC20Abi = exports.ErrorAbi = exports.EscrowAbi = exports.ERC20MockAbi = exports.BaseErrors = exports.VoltageErrors = exports.AlchemyErrors = exports.WalletErrors = exports.DatabaseErrors = exports.BalanceErrors = void 0;
|
|
45
45
|
// Services
|
|
46
46
|
var AsyncRateLimiter_1 = require("./utils/AsyncRateLimiter");
|
|
47
47
|
Object.defineProperty(exports, "AsyncRateLimiter", { enumerable: true, get: function () { return __importDefault(AsyncRateLimiter_1).default; } });
|
|
@@ -69,6 +69,8 @@ var ClaimJobService_1 = require("./services/ClaimJobService");
|
|
|
69
69
|
Object.defineProperty(exports, "ClaimJobService", { enumerable: true, get: function () { return __importDefault(ClaimJobService_1).default; } });
|
|
70
70
|
var DepositAddressService_1 = require("./services/DepositAddressService");
|
|
71
71
|
Object.defineProperty(exports, "DepositAddressService", { enumerable: true, get: function () { return __importDefault(DepositAddressService_1).default; } });
|
|
72
|
+
var DepositAddressArchiveService_1 = require("./services/DepositAddressArchiveService");
|
|
73
|
+
Object.defineProperty(exports, "DepositAddressArchiveService", { enumerable: true, get: function () { return __importDefault(DepositAddressArchiveService_1).default; } });
|
|
72
74
|
var ElasticSearch_1 = require("./services/ElasticSearch");
|
|
73
75
|
Object.defineProperty(exports, "ElasticSearch", { enumerable: true, get: function () { return __importDefault(ElasticSearch_1).default; } });
|
|
74
76
|
var EventsHandler_1 = require("./services/EventsHandler");
|
|
@@ -156,6 +158,7 @@ __exportStar(require("./entities/Checkpoint"), exports);
|
|
|
156
158
|
__exportStar(require("./entities/ClaimHistory"), exports);
|
|
157
159
|
__exportStar(require("./entities/ClaimJob"), exports);
|
|
158
160
|
__exportStar(require("./entities/DepositAddress"), exports);
|
|
161
|
+
__exportStar(require("./entities/DepositAddressArchive"), exports);
|
|
159
162
|
__exportStar(require("./entities/DepositWalletBalance"), exports);
|
|
160
163
|
__exportStar(require("./entities/SweepHistory"), exports);
|
|
161
164
|
__exportStar(require("./entities/SweepJob"), exports);
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { DataSource, Repository } from "typeorm";
|
|
2
2
|
import { DepositWalletBalance } from "../entities/DepositWalletBalance";
|
|
3
3
|
import { DepositAddress } from "../entities/DepositAddress";
|
|
4
|
+
import { DepositAddressArchive } from "../entities/DepositAddressArchive";
|
|
4
5
|
import { WalletIndex } from "../entities/WalletIndex";
|
|
5
6
|
import { SweepJob } from "../entities/SweepJob";
|
|
6
7
|
import { SweepHistory } from "../entities/SweepHistory";
|
|
@@ -13,6 +14,7 @@ export interface IDatabasePool {
|
|
|
13
14
|
appDataSource: DataSource | null;
|
|
14
15
|
balancesRepo: Repository<DepositWalletBalance> | null;
|
|
15
16
|
accountsRepo: Repository<DepositAddress> | null;
|
|
17
|
+
depositAddressArchiveRepo: Repository<DepositAddressArchive> | null;
|
|
16
18
|
walletIndexRepo: Repository<WalletIndex> | null;
|
|
17
19
|
sweepJobRepo: Repository<SweepJob> | null;
|
|
18
20
|
sweepHistoryRepo: Repository<SweepHistory> | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../src/interfaces/database.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AAC1B,OAAO,EAAE,uBAAuB,EAAE,MAAM,qCAAqC,CAAC;AAE9E,MAAM,WAAW,aAAa;IAC1B,qBAAqB,EAAE,UAAU,GAAG,IAAI,CAAC;IACzC,aAAa,EAAE,UAAU,GAAG,IAAI,CAAC;IACjC,YAAY,EAAE,UAAU,CAAC,oBAAoB,CAAC,GAAG,IAAI,CAAC;IACtD,YAAY,EAAE,UAAU,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC;IAChD,eAAe,EAAE,UAAU,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC;IAChD,YAAY,EAAE,UAAU,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC;IAC1C,gBAAgB,EAAE,UAAU,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC;IAClD,gBAAgB,EAAE,UAAU,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC;IAC/C,gBAAgB,EAAE,UAAU,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAAC;IACtD,2BAA2B,CAAC,EAAE,UAAU,CAAC,uBAAuB,CAAC,GAAG,IAAI,CAAC;IACzE,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,UAAU,CAAC;IAChC,SAAS,EAAE,MAAM,IAAI,CAAC;CACzB;AAGD,MAAM,WAAW,qBAAqB;IAClC,WAAW,IAAI,aAAa,CAAC;CAChC"}
|
|
1
|
+
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../src/interfaces/database.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAC1E,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AAC1B,OAAO,EAAE,uBAAuB,EAAE,MAAM,qCAAqC,CAAC;AAE9E,MAAM,WAAW,aAAa;IAC1B,qBAAqB,EAAE,UAAU,GAAG,IAAI,CAAC;IACzC,aAAa,EAAE,UAAU,GAAG,IAAI,CAAC;IACjC,YAAY,EAAE,UAAU,CAAC,oBAAoB,CAAC,GAAG,IAAI,CAAC;IACtD,YAAY,EAAE,UAAU,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC;IAChD,yBAAyB,EAAE,UAAU,CAAC,qBAAqB,CAAC,GAAG,IAAI,CAAC;IACpE,eAAe,EAAE,UAAU,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC;IAChD,YAAY,EAAE,UAAU,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC;IAC1C,gBAAgB,EAAE,UAAU,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC;IAClD,gBAAgB,EAAE,UAAU,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC;IAC/C,gBAAgB,EAAE,UAAU,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAAC;IACtD,2BAA2B,CAAC,EAAE,UAAU,CAAC,uBAAuB,CAAC,GAAG,IAAI,CAAC;IACzE,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,UAAU,CAAC;IAChC,SAAS,EAAE,MAAM,IAAI,CAAC;CACzB;AAGD,MAAM,WAAW,qBAAqB;IAClC,WAAW,IAAI,aAAa,CAAC;CAChC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { DepositAddress } from "../entities/DepositAddress";
|
|
2
|
+
import { DepositAddressArchive } from "../entities/DepositAddressArchive";
|
|
3
|
+
import { IDatabasePool } from "../interfaces/database";
|
|
4
|
+
import { Paginated } from "./types/claim_job_service";
|
|
5
|
+
export interface DepositAddressArchiveFilters {
|
|
6
|
+
userId?: number;
|
|
7
|
+
blockchain?: string;
|
|
8
|
+
address?: string;
|
|
9
|
+
archivedReason?: 'expired' | 'revoked' | 'renewed';
|
|
10
|
+
}
|
|
11
|
+
declare class DepositAddressArchiveService {
|
|
12
|
+
private dbPool;
|
|
13
|
+
constructor(dbPool: IDatabasePool);
|
|
14
|
+
private getRepo;
|
|
15
|
+
/**
|
|
16
|
+
* Archive an expired/revoked/renewed deposit address.
|
|
17
|
+
* Call this before replacing the live deposit_addresses row.
|
|
18
|
+
*/
|
|
19
|
+
archive(address: DepositAddress, reason?: 'expired' | 'revoked' | 'renewed'): Promise<DepositAddressArchive>;
|
|
20
|
+
/**
|
|
21
|
+
* Idempotent archive — safe to call from multiple workers concurrently.
|
|
22
|
+
* Uses ON CONFLICT DO NOTHING on original_id so duplicate calls are no-ops.
|
|
23
|
+
* Returns the existing row if already archived, or the newly inserted row.
|
|
24
|
+
*/
|
|
25
|
+
archiveIdempotent(address: DepositAddress, reason?: 'expired' | 'revoked' | 'renewed'): Promise<DepositAddressArchive>;
|
|
26
|
+
findById(id: number): Promise<DepositAddressArchive | null>;
|
|
27
|
+
findByOriginalId(originalId: number): Promise<DepositAddressArchive[]>;
|
|
28
|
+
findByUserId(userId: number, blockchain?: string): Promise<DepositAddressArchive[]>;
|
|
29
|
+
findByAddress(address: string): Promise<DepositAddressArchive[]>;
|
|
30
|
+
getPaginated(page: number, page_size?: number, filters?: DepositAddressArchiveFilters): Promise<Paginated<DepositAddressArchive[]>>;
|
|
31
|
+
}
|
|
32
|
+
export default DepositAddressArchiveService;
|
|
33
|
+
//# sourceMappingURL=DepositAddressArchiveService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DepositAddressArchiveService.d.ts","sourceRoot":"","sources":["../../src/services/DepositAddressArchiveService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAEtD,MAAM,WAAW,4BAA4B;IACzC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;CACtD;AAED,cAAM,4BAA4B;IAC9B,OAAO,CAAC,MAAM,CAAgB;gBAElB,MAAM,EAAE,aAAa;IAIjC,OAAO,CAAC,OAAO;IAMf;;;OAGG;IACG,OAAO,CACT,OAAO,EAAE,cAAc,EACvB,MAAM,GAAE,SAAS,GAAG,SAAS,GAAG,SAAqB,GACtD,OAAO,CAAC,qBAAqB,CAAC;IAgBjC;;;;OAIG;IACG,iBAAiB,CACnB,OAAO,EAAE,cAAc,EACvB,MAAM,GAAE,SAAS,GAAG,SAAS,GAAG,SAAqB,GACtD,OAAO,CAAC,qBAAqB,CAAC;IA+B3B,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC;IAI3D,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC;IAOtE,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC;IAMnF,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC;IAOhE,YAAY,CACd,IAAI,EAAE,MAAM,EACZ,SAAS,GAAE,MAAW,EACtB,OAAO,GAAE,4BAAiC,GAC3C,OAAO,CAAC,SAAS,CAAC,qBAAqB,EAAE,CAAC,CAAC;CA4BjD;AAED,eAAe,4BAA4B,CAAC"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
class DepositAddressArchiveService {
|
|
13
|
+
constructor(dbPool) {
|
|
14
|
+
this.dbPool = dbPool;
|
|
15
|
+
}
|
|
16
|
+
getRepo() {
|
|
17
|
+
const repo = this.dbPool.depositAddressArchiveRepo;
|
|
18
|
+
if (!repo)
|
|
19
|
+
throw new Error('depositAddressArchiveRepo is not initialized.');
|
|
20
|
+
return repo;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Archive an expired/revoked/renewed deposit address.
|
|
24
|
+
* Call this before replacing the live deposit_addresses row.
|
|
25
|
+
*/
|
|
26
|
+
archive(address_1) {
|
|
27
|
+
return __awaiter(this, arguments, void 0, function* (address, reason = 'expired') {
|
|
28
|
+
var _a, _b;
|
|
29
|
+
const repo = this.getRepo();
|
|
30
|
+
const entry = repo.create({
|
|
31
|
+
original_id: address.id,
|
|
32
|
+
user_id: address.user_id,
|
|
33
|
+
blockchain: address.blockchain,
|
|
34
|
+
parent_index: (_a = address.parent_index) !== null && _a !== void 0 ? _a : null,
|
|
35
|
+
child_index: (_b = address.child_index) !== null && _b !== void 0 ? _b : null,
|
|
36
|
+
address: address.address,
|
|
37
|
+
transaction_count: address.transaction_count,
|
|
38
|
+
expires_at: address.expires_at,
|
|
39
|
+
archived_reason: reason,
|
|
40
|
+
});
|
|
41
|
+
return repo.save(entry);
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Idempotent archive — safe to call from multiple workers concurrently.
|
|
46
|
+
* Uses ON CONFLICT DO NOTHING on original_id so duplicate calls are no-ops.
|
|
47
|
+
* Returns the existing row if already archived, or the newly inserted row.
|
|
48
|
+
*/
|
|
49
|
+
archiveIdempotent(address_1) {
|
|
50
|
+
return __awaiter(this, arguments, void 0, function* (address, reason = 'expired') {
|
|
51
|
+
var _a, _b;
|
|
52
|
+
const repo = this.getRepo();
|
|
53
|
+
const dataSource = this.dbPool.appDataSource;
|
|
54
|
+
if (!dataSource)
|
|
55
|
+
throw new Error('appDataSource is not initialized.');
|
|
56
|
+
const rows = yield dataSource.query(`
|
|
57
|
+
INSERT INTO usersmanagement.deposit_addresses_archive
|
|
58
|
+
(original_id, user_id, blockchain, parent_index, child_index, address, transaction_count, expires_at, archived_at, archived_reason)
|
|
59
|
+
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, now(), $9)
|
|
60
|
+
ON CONFLICT (original_id) DO NOTHING
|
|
61
|
+
RETURNING *
|
|
62
|
+
`, [
|
|
63
|
+
address.id,
|
|
64
|
+
address.user_id,
|
|
65
|
+
address.blockchain,
|
|
66
|
+
(_a = address.parent_index) !== null && _a !== void 0 ? _a : null,
|
|
67
|
+
(_b = address.child_index) !== null && _b !== void 0 ? _b : null,
|
|
68
|
+
address.address,
|
|
69
|
+
address.transaction_count,
|
|
70
|
+
address.expires_at,
|
|
71
|
+
reason,
|
|
72
|
+
]);
|
|
73
|
+
// If conflict (already archived), return the existing record
|
|
74
|
+
if (rows.length === 0) {
|
|
75
|
+
return repo.findOneOrFail({ where: { original_id: address.id } });
|
|
76
|
+
}
|
|
77
|
+
return rows[0];
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
findById(id) {
|
|
81
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
82
|
+
return this.getRepo().findOne({ where: { id } });
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
findByOriginalId(originalId) {
|
|
86
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
87
|
+
return this.getRepo().find({
|
|
88
|
+
where: { original_id: originalId },
|
|
89
|
+
order: { archived_at: 'DESC' },
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
findByUserId(userId, blockchain) {
|
|
94
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
95
|
+
const where = { userId };
|
|
96
|
+
if (blockchain)
|
|
97
|
+
where.blockchain = blockchain;
|
|
98
|
+
return this.getRepo().find({ where, order: { archived_at: 'DESC' } });
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
findByAddress(address) {
|
|
102
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
103
|
+
return this.getRepo().find({
|
|
104
|
+
where: { address },
|
|
105
|
+
order: { archived_at: 'DESC' },
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
getPaginated(page_1) {
|
|
110
|
+
return __awaiter(this, arguments, void 0, function* (page, page_size = 20, filters = {}) {
|
|
111
|
+
const repo = this.getRepo();
|
|
112
|
+
if (page === 0)
|
|
113
|
+
page = 1;
|
|
114
|
+
const where = {};
|
|
115
|
+
if (filters.userId)
|
|
116
|
+
where.userId = filters.userId;
|
|
117
|
+
if (filters.blockchain)
|
|
118
|
+
where.blockchain = filters.blockchain;
|
|
119
|
+
if (filters.address)
|
|
120
|
+
where.address = filters.address;
|
|
121
|
+
if (filters.archivedReason)
|
|
122
|
+
where.archivedReason = filters.archivedReason;
|
|
123
|
+
const [items, totalCount] = yield Promise.all([
|
|
124
|
+
repo.find({
|
|
125
|
+
where,
|
|
126
|
+
order: { archived_at: 'DESC' },
|
|
127
|
+
take: page_size,
|
|
128
|
+
skip: (page - 1) * page_size,
|
|
129
|
+
}),
|
|
130
|
+
repo.count({ where }),
|
|
131
|
+
]);
|
|
132
|
+
return {
|
|
133
|
+
total_count: totalCount,
|
|
134
|
+
pages_count: Math.ceil(totalCount / page_size),
|
|
135
|
+
has_next: totalCount > page * page_size,
|
|
136
|
+
current_page: page,
|
|
137
|
+
items,
|
|
138
|
+
};
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
exports.default = DepositAddressArchiveService;
|
|
@@ -15,6 +15,7 @@ interface CreateDepositResult {
|
|
|
15
15
|
childIndex: number;
|
|
16
16
|
transactionCount: number;
|
|
17
17
|
blockchain: string;
|
|
18
|
+
expiresAt: Date;
|
|
18
19
|
updatedAt: Date;
|
|
19
20
|
createdAt: Date;
|
|
20
21
|
}
|
|
@@ -23,6 +24,7 @@ export interface UpdateDepositAddressValues {
|
|
|
23
24
|
parentIndex: number;
|
|
24
25
|
childIndex: number;
|
|
25
26
|
address: string;
|
|
27
|
+
expiresAt: Date;
|
|
26
28
|
}
|
|
27
29
|
interface UpdateDepositResult extends CreateDepositResult {
|
|
28
30
|
}
|
|
@@ -35,7 +37,7 @@ declare class DepositAddressService {
|
|
|
35
37
|
findByUserId(userId: number, blockchain: string): Promise<DepositAddress>;
|
|
36
38
|
findByBlockchainAndParentIndex(blockchain: BlockchainType, parentIndex: number): Promise<null>;
|
|
37
39
|
private findByBlockchainAndUserId;
|
|
38
|
-
createDepositAddress(userId: number, blockchain: string, parentIndex: number, address: string): Promise<CreateDepositResult>;
|
|
40
|
+
createDepositAddress(userId: number, blockchain: string, parentIndex: number, address: string, expiry_duration_s: number): Promise<CreateDepositResult>;
|
|
39
41
|
updateDepositAddress(userId: number, values: UpdateDepositAddressValues): Promise<UpdateDepositResult>;
|
|
40
42
|
deleteDepositAddress(userId: number, blockchain: string): Promise<{
|
|
41
43
|
status: boolean;
|
|
@@ -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;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;
|
|
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;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;IAChB,SAAS,EAAE,IAAI,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,EAAE,iBAAiB,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;IA4DvJ,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,0BAA0B,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAqDtG,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"}
|
|
@@ -121,7 +121,7 @@ class DepositAddressService {
|
|
|
121
121
|
}
|
|
122
122
|
});
|
|
123
123
|
}
|
|
124
|
-
createDepositAddress(userId, blockchain, parentIndex, address) {
|
|
124
|
+
createDepositAddress(userId, blockchain, parentIndex, address, expiry_duration_s) {
|
|
125
125
|
return __awaiter(this, void 0, void 0, function* () {
|
|
126
126
|
try {
|
|
127
127
|
const dbDriver = this.dbPool;
|
|
@@ -146,6 +146,7 @@ class DepositAddressService {
|
|
|
146
146
|
entity.transaction_count = 0;
|
|
147
147
|
entity.blockchain = blockchain;
|
|
148
148
|
entity.parent_index = parentIndex;
|
|
149
|
+
entity.expires_at = new Date(new Date().getTime() + expiry_duration_s * 1000);
|
|
149
150
|
entity.child_index = 0;
|
|
150
151
|
entity.address = this.normalizeAddress(address, blockchain);
|
|
151
152
|
const depositAddress = yield dbDriver.accountsRepo.save(entity);
|
|
@@ -160,6 +161,7 @@ class DepositAddressService {
|
|
|
160
161
|
childIndex: updatedDepositAddress.child_index,
|
|
161
162
|
address: this.normalizeAddress(updatedDepositAddress.address, updatedDepositAddress.blockchain),
|
|
162
163
|
transactionCount: updatedDepositAddress.transaction_count,
|
|
164
|
+
expiresAt: updatedDepositAddress.expires_at,
|
|
163
165
|
updatedAt: updatedDepositAddress.updated_at,
|
|
164
166
|
createdAt: updatedDepositAddress.created_at
|
|
165
167
|
};
|
|
@@ -199,6 +201,7 @@ class DepositAddressService {
|
|
|
199
201
|
}
|
|
200
202
|
// Update address renewal date
|
|
201
203
|
entity.updated_at = new Date();
|
|
204
|
+
entity.expires_at = values.expiresAt;
|
|
202
205
|
// Insert the entity into the database
|
|
203
206
|
const insertedDepositAddress = yield dbDriver.accountsRepo.update(entity.id, entity);
|
|
204
207
|
return {
|
|
@@ -209,6 +212,7 @@ class DepositAddressService {
|
|
|
209
212
|
childIndex: entity.child_index,
|
|
210
213
|
transactionCount: entity.transaction_count,
|
|
211
214
|
blockchain: entity.blockchain,
|
|
215
|
+
expiresAt: entity.expires_at,
|
|
212
216
|
createdAt: entity.created_at,
|
|
213
217
|
updatedAt: entity.updated_at
|
|
214
218
|
};
|
|
@@ -22,7 +22,7 @@ declare class WalletManager extends BaseErrors {
|
|
|
22
22
|
getEscrowFundsManagerWallet: (blockchain: BlockchainType) => ethers.Wallet | Keypair | TronNodeWallet;
|
|
23
23
|
fund_wallets_evm: (chainId: ChainId, wallets: string[], estimation_type: TransactionType) => Promise<string>;
|
|
24
24
|
private get_wallet_service_mnemonic;
|
|
25
|
-
createWallet: (userId: number, blockchain: BlockchainType) => Promise<IWallet>;
|
|
25
|
+
createWallet: (userId: number, blockchain: BlockchainType, expiry_duration_s: number) => Promise<IWallet>;
|
|
26
26
|
isAddressExpired(blockchain: BlockchainType, address: string): Promise<boolean>;
|
|
27
27
|
calculate_expiry(wallet: IWallet): {
|
|
28
28
|
is_expired: boolean;
|
|
@@ -35,7 +35,7 @@ declare class WalletManager extends BaseErrors {
|
|
|
35
35
|
status: boolean;
|
|
36
36
|
address: string;
|
|
37
37
|
}>;
|
|
38
|
-
renewWallet: (subscription: AlchemyWebhookEnvironment, userId: number, blockchain: BlockchainType, expired_address: string) => Promise<IWallet>;
|
|
38
|
+
renewWallet: (subscription: AlchemyWebhookEnvironment, userId: number, blockchain: BlockchainType, expired_address: string, expiry_duration_s: number) => Promise<IWallet>;
|
|
39
39
|
updateWebhookAddress: (subscription: AlchemyWebhookEnvironment, blockchain: BlockchainType, old_wallet: IWallet, new_wallet: IWallet, limiter: AsyncRateLimiter) => Promise<boolean>;
|
|
40
40
|
handleRenewWallet: (old_wallet: IWallet, new_wallet: IWallet) => Promise<IWallet>;
|
|
41
41
|
deriveWallet: (parentIndex: number, childIndex: number, blockchain: BlockchainType, _mnemonic?: string) => BtcWallet;
|
|
@@ -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;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,
|
|
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,CAsB7F;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,EAAE,mBAAmB,MAAM,KAAG,OAAO,CAAC,OAAO,CAAC,CA4BpH;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,EAAE,mBAAmB,MAAM,KAAG,OAAO,CAAC,OAAO,CAAC,CAuCrL;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"}
|
|
@@ -82,6 +82,7 @@ class WalletManager extends errors_1.default {
|
|
|
82
82
|
childIndex: existingWallet.child_index,
|
|
83
83
|
transactionCount: existingWallet.transaction_count,
|
|
84
84
|
blockchain: existingWallet.blockchain,
|
|
85
|
+
expiresAt: existingWallet.expires_at,
|
|
85
86
|
updatedAt: existingWallet.updated_at,
|
|
86
87
|
createdAt: existingWallet.created_at
|
|
87
88
|
};
|
|
@@ -150,7 +151,7 @@ class WalletManager extends errors_1.default {
|
|
|
150
151
|
throw new Error("Failed to fund wallets.");
|
|
151
152
|
return response.transactionHash;
|
|
152
153
|
});
|
|
153
|
-
this.createWallet = (userId, blockchain) => __awaiter(this, void 0, void 0, function* () {
|
|
154
|
+
this.createWallet = (userId, blockchain, expiry_duration_s) => __awaiter(this, void 0, void 0, function* () {
|
|
154
155
|
try {
|
|
155
156
|
// User main wallet mnemonic
|
|
156
157
|
const mnemonic = this.get_wallet_service_mnemonic(blockchain);
|
|
@@ -167,7 +168,7 @@ class WalletManager extends errors_1.default {
|
|
|
167
168
|
throw new Error(`Failed to derive child wallet.`);
|
|
168
169
|
}
|
|
169
170
|
// Create new entity in db
|
|
170
|
-
const newEntity = yield depositAddressService.createDepositAddress(userId, blockchain, parentIndex, derivedWallet.address);
|
|
171
|
+
const newEntity = yield depositAddressService.createDepositAddress(userId, blockchain, parentIndex, derivedWallet.address, expiry_duration_s);
|
|
171
172
|
return newEntity;
|
|
172
173
|
}
|
|
173
174
|
catch (error) {
|
|
@@ -178,7 +179,7 @@ class WalletManager extends errors_1.default {
|
|
|
178
179
|
const depositAddressService = new DepositAddressService_1.default(this.dbPool);
|
|
179
180
|
return yield depositAddressService.deleteDepositAddress(userId, blockchain);
|
|
180
181
|
});
|
|
181
|
-
this.renewWallet = (subscription, userId, blockchain, expired_address) => __awaiter(this, void 0, void 0, function* () {
|
|
182
|
+
this.renewWallet = (subscription, userId, blockchain, expired_address, expiry_duration_s) => __awaiter(this, void 0, void 0, function* () {
|
|
182
183
|
const wallet = yield this.getWallet(userId, blockchain);
|
|
183
184
|
if (!wallet) {
|
|
184
185
|
throw new Error(`Wallet not found`);
|
|
@@ -196,6 +197,7 @@ class WalletManager extends errors_1.default {
|
|
|
196
197
|
childIndex: newChildIndex,
|
|
197
198
|
blockchain,
|
|
198
199
|
address: newWallet.address,
|
|
200
|
+
expiresAt: new Date(new Date().getTime() + expiry_duration_s * 1000)
|
|
199
201
|
});
|
|
200
202
|
const balanceService = new BalanceService_1.default(this.dbPool, this.config);
|
|
201
203
|
const deleteBalancesAndDispatchSweep = yield balanceService.removeWalletBalances(updatedWallet.id, blockchain);
|
|
@@ -210,7 +212,7 @@ class WalletManager extends errors_1.default {
|
|
|
210
212
|
});
|
|
211
213
|
this.updateWebhookAddress = (subscription, blockchain, old_wallet, new_wallet, limiter) => __awaiter(this, void 0, void 0, function* () {
|
|
212
214
|
const alchemy_service = AlchemyService_1.default.getInstance(this.config);
|
|
213
|
-
const qn_service = QnWebhookAddressManager_1.default.getInstance(this.config);
|
|
215
|
+
const qn_service = QnWebhookAddressManager_1.default.getInstance(this.config, this.dbPool, { maxConcurrent: 1, minDelayMs: 1000 });
|
|
214
216
|
// Add new address and remove expired address (quicknode and alchemy webhooks)
|
|
215
217
|
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
218
|
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));
|
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
import { BlockchainType, ChainId } from "../../interfaces";
|
|
2
2
|
import { IConfig } from "../../interfaces/config";
|
|
3
|
+
import { IDatabasePool } from "../../interfaces/database";
|
|
3
4
|
import { RateLimiterOptions } from "../../utils/AsyncRateLimiter";
|
|
4
5
|
declare class QnWebhookAddressManager {
|
|
5
6
|
private static instance;
|
|
6
7
|
private api;
|
|
7
8
|
private config;
|
|
8
9
|
private cache;
|
|
10
|
+
private db;
|
|
9
11
|
private constructor();
|
|
10
|
-
static getInstance(config: IConfig, rlc?: RateLimiterOptions): QnWebhookAddressManager;
|
|
12
|
+
static getInstance(config: IConfig, db: IDatabasePool, rlc?: RateLimiterOptions): QnWebhookAddressManager;
|
|
11
13
|
private get_blockchain_for_chain;
|
|
12
14
|
/** Returns the { name, network } pairs for the notification configs of a given chain. */
|
|
13
15
|
private get_webhook_keys_for_chain;
|
|
@@ -42,6 +44,7 @@ declare class QnWebhookAddressManager {
|
|
|
42
44
|
* Call this fire-and-forget after responding to the caller.
|
|
43
45
|
*/
|
|
44
46
|
sync_remove_from_remaining(blockchain: BlockchainType, address: string, exclude_chain_id: ChainId): Promise<void>;
|
|
47
|
+
private fetch_all_db_addresses;
|
|
45
48
|
}
|
|
46
49
|
export default QnWebhookAddressManager;
|
|
47
50
|
//# sourceMappingURL=QnWebhookAddressManager.d.ts.map
|
|
@@ -1 +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;
|
|
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,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AA8BlE,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,CAAC,EAAE,CAAgB;IAC1B,OAAO;IAMP,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,aAAa,EAAE,GAAG,CAAC,EAAE,kBAAkB,GAAG,uBAAuB;IAOzG,OAAO,CAAC,wBAAwB;IAKhC,yFAAyF;IACzF,OAAO,CAAC,0BAA0B;IAQlC,OAAO,CAAC,iBAAiB;IAkBzB,OAAO,CAAC,QAAQ;YAMF,IAAI;YAwCJ,aAAa;IAO3B,OAAO,CAAC,WAAW;IAIN,WAAW,CAAC,UAAU,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAkB1E,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;YAqBhH,sBAAsB;CAuBvC;AAED,eAAe,uBAAuB,CAAC"}
|
|
@@ -13,17 +13,21 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
13
13
|
};
|
|
14
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
15
|
const ChainManager_1 = __importDefault(require("../ChainManager"));
|
|
16
|
+
const DepositAddressService_1 = __importDefault(require("../DepositAddressService"));
|
|
16
17
|
const QnNotificationsApi_1 = __importDefault(require("./QnNotificationsApi"));
|
|
17
18
|
const CACHE_TTL_MS = 10 * 60 * 1000; // 10 minutes
|
|
19
|
+
const ADDRESS_SYNC_BATCH_SIZE = 500;
|
|
20
|
+
const ADDRESS_LOG_THRESHOLD = 1000;
|
|
18
21
|
class QnWebhookAddressManager {
|
|
19
|
-
constructor(config, rlc) {
|
|
22
|
+
constructor(config, db, rlc) {
|
|
20
23
|
this.cache = new Map();
|
|
21
24
|
this.config = config;
|
|
22
25
|
this.api = QnNotificationsApi_1.default.getInstance(config, rlc);
|
|
26
|
+
this.db = db;
|
|
23
27
|
}
|
|
24
|
-
static getInstance(config, rlc) {
|
|
28
|
+
static getInstance(config, db, rlc) {
|
|
25
29
|
if (!this.instance) {
|
|
26
|
-
this.instance = new QnWebhookAddressManager(config, rlc);
|
|
30
|
+
this.instance = new QnWebhookAddressManager(config, db, rlc);
|
|
27
31
|
}
|
|
28
32
|
return this.instance;
|
|
29
33
|
}
|
|
@@ -62,7 +66,6 @@ class QnWebhookAddressManager {
|
|
|
62
66
|
}
|
|
63
67
|
load(blockchain) {
|
|
64
68
|
return __awaiter(this, void 0, void 0, function* () {
|
|
65
|
-
var _a;
|
|
66
69
|
const notif_configs = this.get_notif_configs(blockchain);
|
|
67
70
|
if (notif_configs.length === 0)
|
|
68
71
|
return;
|
|
@@ -75,6 +78,8 @@ class QnWebhookAddressManager {
|
|
|
75
78
|
console.error(`QnWebhookAddressManager: Failed to fetch webhooks for blockchain=${blockchain}`, error);
|
|
76
79
|
return;
|
|
77
80
|
}
|
|
81
|
+
// Get all addresses to add to webhook
|
|
82
|
+
const addresses = yield this.fetch_all_db_addresses(blockchain);
|
|
78
83
|
const entries = [];
|
|
79
84
|
for (const notif_config of notif_configs) {
|
|
80
85
|
const existing = all_webhooks.find(w => {
|
|
@@ -86,8 +91,6 @@ class QnWebhookAddressManager {
|
|
|
86
91
|
console.warn(`QnWebhookAddressManager: No webhook found for config=${notif_config.name} network=${notif_config.network}`);
|
|
87
92
|
continue;
|
|
88
93
|
}
|
|
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
94
|
entries.push({
|
|
92
95
|
webhook_id: existing.id,
|
|
93
96
|
name: notif_config.name.toLowerCase(),
|
|
@@ -262,5 +265,27 @@ class QnWebhookAddressManager {
|
|
|
262
265
|
}
|
|
263
266
|
});
|
|
264
267
|
}
|
|
268
|
+
// Get all custodial addresses for monitoring
|
|
269
|
+
fetch_all_db_addresses(blockchain) {
|
|
270
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
271
|
+
const service = new DepositAddressService_1.default(this.db);
|
|
272
|
+
const addresses = [];
|
|
273
|
+
let page = 1;
|
|
274
|
+
const page_size = ADDRESS_SYNC_BATCH_SIZE;
|
|
275
|
+
while (true) {
|
|
276
|
+
const result = yield service.getDepositAddressesPaginated(page, page_size, { blockchain });
|
|
277
|
+
for (const item of result.items) {
|
|
278
|
+
addresses.push(item.address);
|
|
279
|
+
}
|
|
280
|
+
if (!result.has_next)
|
|
281
|
+
break;
|
|
282
|
+
page++;
|
|
283
|
+
}
|
|
284
|
+
if (addresses.length > ADDRESS_LOG_THRESHOLD) {
|
|
285
|
+
console.warn(`QnWebhookAddressManager: ${addresses.length} addresses fetched for blockchain=${blockchain} — ensure QN webhook limit is sufficient`);
|
|
286
|
+
}
|
|
287
|
+
return addresses;
|
|
288
|
+
});
|
|
289
|
+
}
|
|
265
290
|
}
|
|
266
291
|
exports.default = QnWebhookAddressManager;
|
|
@@ -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"}
|