@t2000/sdk 0.17.22 → 0.17.24
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/README.md +1 -1
- package/dist/adapters/cetus.d.ts +29 -0
- package/dist/adapters/cetus.d.ts.map +1 -0
- package/dist/adapters/cetus.js +74 -0
- package/dist/adapters/cetus.js.map +1 -0
- package/dist/adapters/cetus.test.d.ts +2 -0
- package/dist/adapters/cetus.test.d.ts.map +1 -0
- package/dist/adapters/cetus.test.js +57 -0
- package/dist/adapters/cetus.test.js.map +1 -0
- package/dist/adapters/compliance.test.d.ts +8 -0
- package/dist/adapters/compliance.test.d.ts.map +1 -0
- package/dist/adapters/compliance.test.js +202 -0
- package/dist/adapters/compliance.test.js.map +1 -0
- package/dist/adapters/index.d.ts +10 -4
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +15 -2107
- package/dist/adapters/index.js.map +1 -1
- package/dist/adapters/navi.d.ts +41 -0
- package/dist/adapters/navi.d.ts.map +1 -0
- package/dist/adapters/navi.js +102 -0
- package/dist/adapters/navi.js.map +1 -0
- package/dist/adapters/navi.test.d.ts +2 -0
- package/dist/adapters/navi.test.d.ts.map +1 -0
- package/dist/adapters/navi.test.js +164 -0
- package/dist/adapters/navi.test.js.map +1 -0
- package/dist/adapters/registry.d.ts +47 -0
- package/dist/adapters/registry.d.ts.map +1 -0
- package/dist/adapters/registry.js +162 -0
- package/dist/adapters/registry.js.map +1 -0
- package/dist/adapters/registry.test.d.ts +2 -0
- package/dist/adapters/registry.test.d.ts.map +1 -0
- package/dist/adapters/registry.test.js +197 -0
- package/dist/adapters/registry.test.js.map +1 -0
- package/dist/adapters/suilend.d.ts +71 -0
- package/dist/adapters/suilend.d.ts.map +1 -0
- package/dist/adapters/suilend.js +826 -0
- package/dist/adapters/suilend.js.map +1 -0
- package/dist/adapters/suilend.test.d.ts +2 -0
- package/dist/adapters/suilend.test.d.ts.map +1 -0
- package/dist/adapters/suilend.test.js +294 -0
- package/dist/adapters/suilend.test.js.map +1 -0
- package/dist/adapters/types.d.ts +160 -0
- package/dist/adapters/types.d.ts.map +1 -0
- package/dist/adapters/types.js +2 -0
- package/dist/adapters/types.js.map +1 -0
- package/dist/auto-invest.d.ts +23 -0
- package/dist/auto-invest.d.ts.map +1 -0
- package/dist/auto-invest.js +131 -0
- package/dist/auto-invest.js.map +1 -0
- package/dist/auto-invest.test.d.ts +2 -0
- package/dist/auto-invest.test.d.ts.map +1 -0
- package/dist/auto-invest.test.js +220 -0
- package/dist/auto-invest.test.js.map +1 -0
- package/dist/constants.d.ts +177 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +135 -0
- package/dist/constants.js.map +1 -0
- package/dist/contacts.d.ts +25 -0
- package/dist/contacts.d.ts.map +1 -0
- package/dist/contacts.js +83 -0
- package/dist/contacts.js.map +1 -0
- package/dist/contacts.test.d.ts +2 -0
- package/dist/contacts.test.d.ts.map +1 -0
- package/dist/contacts.test.js +164 -0
- package/dist/contacts.test.js.map +1 -0
- package/dist/errors.d.ts +26 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +81 -0
- package/dist/errors.js.map +1 -0
- package/dist/errors.test.d.ts +2 -0
- package/dist/errors.test.d.ts.map +1 -0
- package/dist/errors.test.js +48 -0
- package/dist/errors.test.js.map +1 -0
- package/dist/gas/autoTopUp.d.ts +18 -0
- package/dist/gas/autoTopUp.d.ts.map +1 -0
- package/dist/gas/autoTopUp.js +55 -0
- package/dist/gas/autoTopUp.js.map +1 -0
- package/dist/gas/autoTopUp.test.d.ts +2 -0
- package/dist/gas/autoTopUp.test.d.ts.map +1 -0
- package/dist/gas/autoTopUp.test.js +59 -0
- package/dist/gas/autoTopUp.test.js.map +1 -0
- package/dist/gas/gasStation.d.ts +23 -0
- package/dist/gas/gasStation.d.ts.map +1 -0
- package/dist/gas/gasStation.js +58 -0
- package/dist/gas/gasStation.js.map +1 -0
- package/dist/gas/index.d.ts +4 -0
- package/dist/gas/index.d.ts.map +1 -0
- package/dist/gas/index.js +4 -0
- package/dist/gas/index.js.map +1 -0
- package/dist/gas/manager.d.ts +24 -0
- package/dist/gas/manager.d.ts.map +1 -0
- package/dist/gas/manager.js +142 -0
- package/dist/gas/manager.js.map +1 -0
- package/dist/gas/manager.test.d.ts +2 -0
- package/dist/gas/manager.test.d.ts.map +1 -0
- package/dist/gas/manager.test.js +220 -0
- package/dist/gas/manager.test.js.map +1 -0
- package/dist/gas/serialization.test.d.ts +2 -0
- package/dist/gas/serialization.test.d.ts.map +1 -0
- package/dist/gas/serialization.test.js +47 -0
- package/dist/gas/serialization.test.js.map +1 -0
- package/dist/index.d.ts +30 -649
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +21 -6053
- package/dist/index.js.map +1 -1
- package/dist/invest.test.d.ts +2 -0
- package/dist/invest.test.d.ts.map +1 -0
- package/dist/invest.test.js +256 -0
- package/dist/invest.test.js.map +1 -0
- package/dist/portfolio.d.ts +39 -0
- package/dist/portfolio.d.ts.map +1 -0
- package/dist/portfolio.js +201 -0
- package/dist/portfolio.js.map +1 -0
- package/dist/portfolio.test.d.ts +2 -0
- package/dist/portfolio.test.d.ts.map +1 -0
- package/dist/portfolio.test.js +301 -0
- package/dist/portfolio.test.js.map +1 -0
- package/dist/protocols/cetus.d.ts +73 -0
- package/dist/protocols/cetus.d.ts.map +1 -0
- package/dist/protocols/cetus.js +267 -0
- package/dist/protocols/cetus.js.map +1 -0
- package/dist/protocols/cetus.test.d.ts +2 -0
- package/dist/protocols/cetus.test.d.ts.map +1 -0
- package/dist/protocols/cetus.test.js +325 -0
- package/dist/protocols/cetus.test.js.map +1 -0
- package/dist/protocols/navi.d.ts +59 -0
- package/dist/protocols/navi.d.ts.map +1 -0
- package/dist/protocols/navi.js +945 -0
- package/dist/protocols/navi.js.map +1 -0
- package/dist/protocols/navi.test.d.ts +2 -0
- package/dist/protocols/navi.test.d.ts.map +1 -0
- package/dist/protocols/navi.test.js +339 -0
- package/dist/protocols/navi.test.js.map +1 -0
- package/dist/protocols/protocolFee.d.ts +17 -0
- package/dist/protocols/protocolFee.d.ts.map +1 -0
- package/dist/protocols/protocolFee.js +62 -0
- package/dist/protocols/protocolFee.js.map +1 -0
- package/dist/protocols/protocolFee.test.d.ts +2 -0
- package/dist/protocols/protocolFee.test.d.ts.map +1 -0
- package/dist/protocols/protocolFee.test.js +137 -0
- package/dist/protocols/protocolFee.test.js.map +1 -0
- package/dist/protocols/sentinel.d.ts +18 -0
- package/dist/protocols/sentinel.d.ts.map +1 -0
- package/dist/protocols/sentinel.js +188 -0
- package/dist/protocols/sentinel.js.map +1 -0
- package/dist/protocols/sentinel.test.d.ts +2 -0
- package/dist/protocols/sentinel.test.d.ts.map +1 -0
- package/dist/protocols/sentinel.test.js +199 -0
- package/dist/protocols/sentinel.test.js.map +1 -0
- package/dist/protocols/yieldTracker.d.ts +6 -0
- package/dist/protocols/yieldTracker.d.ts.map +1 -0
- package/dist/protocols/yieldTracker.js +29 -0
- package/dist/protocols/yieldTracker.js.map +1 -0
- package/dist/safeguards/enforcer.d.ts +18 -0
- package/dist/safeguards/enforcer.d.ts.map +1 -0
- package/dist/safeguards/enforcer.js +130 -0
- package/dist/safeguards/enforcer.js.map +1 -0
- package/dist/safeguards/enforcer.test.d.ts +2 -0
- package/dist/safeguards/enforcer.test.d.ts.map +1 -0
- package/dist/safeguards/enforcer.test.js +212 -0
- package/dist/safeguards/enforcer.test.js.map +1 -0
- package/dist/safeguards/errors.d.ts +24 -0
- package/dist/safeguards/errors.d.ts.map +1 -0
- package/dist/safeguards/errors.js +31 -0
- package/dist/safeguards/errors.js.map +1 -0
- package/dist/safeguards/index.d.ts +6 -0
- package/dist/safeguards/index.d.ts.map +1 -0
- package/dist/safeguards/index.js +4 -0
- package/dist/safeguards/index.js.map +1 -0
- package/dist/safeguards/types.d.ts +16 -0
- package/dist/safeguards/types.d.ts.map +1 -0
- package/dist/safeguards/types.js +13 -0
- package/dist/safeguards/types.js.map +1 -0
- package/dist/strategy.d.ts +22 -0
- package/dist/strategy.d.ts.map +1 -0
- package/dist/strategy.js +113 -0
- package/dist/strategy.js.map +1 -0
- package/dist/strategy.test.d.ts +2 -0
- package/dist/strategy.test.d.ts.map +1 -0
- package/dist/strategy.test.js +212 -0
- package/dist/strategy.test.js.map +1 -0
- package/dist/t2000.d.ts +218 -0
- package/dist/t2000.d.ts.map +1 -0
- package/dist/t2000.integration.test.d.ts +2 -0
- package/dist/t2000.integration.test.d.ts.map +1 -0
- package/dist/t2000.integration.test.js +954 -0
- package/dist/t2000.integration.test.js.map +1 -0
- package/dist/t2000.js +2395 -0
- package/dist/t2000.js.map +1 -0
- package/dist/types.d.ts +419 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/format.d.ts +22 -0
- package/dist/utils/format.d.ts.map +1 -0
- package/dist/utils/format.js +71 -0
- package/dist/utils/format.js.map +1 -0
- package/dist/utils/format.test.d.ts +2 -0
- package/dist/utils/format.test.d.ts.map +1 -0
- package/dist/utils/format.test.js +187 -0
- package/dist/utils/format.test.js.map +1 -0
- package/dist/utils/hashcash.d.ts +2 -0
- package/dist/utils/hashcash.d.ts.map +1 -0
- package/dist/utils/hashcash.js +27 -0
- package/dist/utils/hashcash.js.map +1 -0
- package/dist/utils/hashcash.test.d.ts +2 -0
- package/dist/utils/hashcash.test.d.ts.map +1 -0
- package/dist/utils/hashcash.test.js +40 -0
- package/dist/utils/hashcash.test.js.map +1 -0
- package/dist/utils/retry.d.ts +9 -0
- package/dist/utils/retry.d.ts.map +1 -0
- package/dist/utils/retry.js +47 -0
- package/dist/utils/retry.js.map +1 -0
- package/dist/utils/simulate.d.ts +15 -0
- package/dist/utils/simulate.d.ts.map +1 -0
- package/dist/utils/simulate.js +75 -0
- package/dist/utils/simulate.js.map +1 -0
- package/dist/utils/simulate.test.d.ts +2 -0
- package/dist/utils/simulate.test.d.ts.map +1 -0
- package/dist/utils/simulate.test.js +80 -0
- package/dist/utils/simulate.test.js.map +1 -0
- package/dist/utils/sui.d.ts +6 -0
- package/dist/utils/sui.d.ts.map +1 -0
- package/dist/utils/sui.js +28 -0
- package/dist/utils/sui.js.map +1 -0
- package/dist/utils/sui.test.d.ts +2 -0
- package/dist/utils/sui.test.d.ts.map +1 -0
- package/dist/utils/sui.test.js +58 -0
- package/dist/utils/sui.test.js.map +1 -0
- package/dist/wallet/balance.d.ts +4 -0
- package/dist/wallet/balance.d.ts.map +1 -0
- package/dist/wallet/balance.js +98 -0
- package/dist/wallet/balance.js.map +1 -0
- package/dist/wallet/history.d.ts +4 -0
- package/dist/wallet/history.d.ts.map +1 -0
- package/dist/wallet/history.js +38 -0
- package/dist/wallet/history.js.map +1 -0
- package/dist/wallet/keyManager.d.ts +9 -0
- package/dist/wallet/keyManager.d.ts.map +1 -0
- package/dist/wallet/keyManager.js +113 -0
- package/dist/wallet/keyManager.js.map +1 -0
- package/dist/wallet/keyManager.test.d.ts +2 -0
- package/dist/wallet/keyManager.test.d.ts.map +1 -0
- package/dist/wallet/keyManager.test.js +55 -0
- package/dist/wallet/keyManager.test.js.map +1 -0
- package/dist/wallet/send.d.ts +24 -0
- package/dist/wallet/send.d.ts.map +1 -0
- package/dist/wallet/send.js +95 -0
- package/dist/wallet/send.js.map +1 -0
- package/dist/wallet/send.test.d.ts +2 -0
- package/dist/wallet/send.test.d.ts.map +1 -0
- package/dist/wallet/send.test.js +69 -0
- package/dist/wallet/send.test.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { homedir } from 'node:os';
|
|
4
|
+
import { randomUUID } from 'node:crypto';
|
|
5
|
+
import { T2000Error } from './errors.js';
|
|
6
|
+
function emptyData() {
|
|
7
|
+
return { schedules: [] };
|
|
8
|
+
}
|
|
9
|
+
function computeNextRun(frequency, dayOfWeek, dayOfMonth, from) {
|
|
10
|
+
const base = from ?? new Date();
|
|
11
|
+
const next = new Date(base);
|
|
12
|
+
switch (frequency) {
|
|
13
|
+
case 'daily':
|
|
14
|
+
next.setDate(next.getDate() + 1);
|
|
15
|
+
next.setHours(0, 0, 0, 0);
|
|
16
|
+
break;
|
|
17
|
+
case 'weekly': {
|
|
18
|
+
const dow = dayOfWeek ?? 1; // Monday default
|
|
19
|
+
next.setDate(next.getDate() + ((7 - next.getDay() + dow) % 7 || 7));
|
|
20
|
+
next.setHours(0, 0, 0, 0);
|
|
21
|
+
break;
|
|
22
|
+
}
|
|
23
|
+
case 'monthly': {
|
|
24
|
+
const dom = dayOfMonth ?? 1;
|
|
25
|
+
next.setMonth(next.getMonth() + 1, dom);
|
|
26
|
+
next.setHours(0, 0, 0, 0);
|
|
27
|
+
break;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return next.toISOString();
|
|
31
|
+
}
|
|
32
|
+
export class AutoInvestManager {
|
|
33
|
+
data = emptyData();
|
|
34
|
+
filePath;
|
|
35
|
+
dir;
|
|
36
|
+
constructor(configDir) {
|
|
37
|
+
this.dir = configDir ?? join(homedir(), '.t2000');
|
|
38
|
+
this.filePath = join(this.dir, 'auto-invest.json');
|
|
39
|
+
this.load();
|
|
40
|
+
}
|
|
41
|
+
load() {
|
|
42
|
+
try {
|
|
43
|
+
if (existsSync(this.filePath)) {
|
|
44
|
+
this.data = JSON.parse(readFileSync(this.filePath, 'utf-8'));
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
this.data = emptyData();
|
|
49
|
+
}
|
|
50
|
+
if (!this.data.schedules) {
|
|
51
|
+
this.data.schedules = [];
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
save() {
|
|
55
|
+
if (!existsSync(this.dir))
|
|
56
|
+
mkdirSync(this.dir, { recursive: true });
|
|
57
|
+
writeFileSync(this.filePath, JSON.stringify(this.data, null, 2));
|
|
58
|
+
}
|
|
59
|
+
setup(params) {
|
|
60
|
+
this.load();
|
|
61
|
+
if (!params.strategy && !params.asset) {
|
|
62
|
+
throw new T2000Error('AUTO_INVEST_NOT_FOUND', 'Either strategy or asset must be specified');
|
|
63
|
+
}
|
|
64
|
+
if (params.amount < 1) {
|
|
65
|
+
throw new T2000Error('AUTO_INVEST_INSUFFICIENT', 'Auto-invest amount must be at least $1');
|
|
66
|
+
}
|
|
67
|
+
const schedule = {
|
|
68
|
+
id: randomUUID().slice(0, 8),
|
|
69
|
+
strategy: params.strategy,
|
|
70
|
+
asset: params.asset,
|
|
71
|
+
amount: params.amount,
|
|
72
|
+
frequency: params.frequency,
|
|
73
|
+
dayOfWeek: params.dayOfWeek,
|
|
74
|
+
dayOfMonth: params.dayOfMonth,
|
|
75
|
+
nextRun: computeNextRun(params.frequency, params.dayOfWeek, params.dayOfMonth),
|
|
76
|
+
enabled: true,
|
|
77
|
+
totalInvested: 0,
|
|
78
|
+
runCount: 0,
|
|
79
|
+
};
|
|
80
|
+
this.data.schedules.push(schedule);
|
|
81
|
+
this.save();
|
|
82
|
+
return schedule;
|
|
83
|
+
}
|
|
84
|
+
getStatus() {
|
|
85
|
+
this.load();
|
|
86
|
+
const now = new Date();
|
|
87
|
+
const pending = this.data.schedules.filter((s) => s.enabled && new Date(s.nextRun) <= now);
|
|
88
|
+
return {
|
|
89
|
+
schedules: [...this.data.schedules],
|
|
90
|
+
pendingRuns: pending,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
getSchedule(id) {
|
|
94
|
+
this.load();
|
|
95
|
+
const schedule = this.data.schedules.find((s) => s.id === id);
|
|
96
|
+
if (!schedule) {
|
|
97
|
+
throw new T2000Error('AUTO_INVEST_NOT_FOUND', `Schedule '${id}' not found`);
|
|
98
|
+
}
|
|
99
|
+
return schedule;
|
|
100
|
+
}
|
|
101
|
+
recordRun(id, amountInvested) {
|
|
102
|
+
this.load();
|
|
103
|
+
const schedule = this.data.schedules.find((s) => s.id === id);
|
|
104
|
+
if (!schedule)
|
|
105
|
+
return;
|
|
106
|
+
schedule.lastRun = new Date().toISOString();
|
|
107
|
+
schedule.nextRun = computeNextRun(schedule.frequency, schedule.dayOfWeek, schedule.dayOfMonth);
|
|
108
|
+
schedule.totalInvested += amountInvested;
|
|
109
|
+
schedule.runCount += 1;
|
|
110
|
+
this.save();
|
|
111
|
+
}
|
|
112
|
+
stop(id) {
|
|
113
|
+
this.load();
|
|
114
|
+
const schedule = this.data.schedules.find((s) => s.id === id);
|
|
115
|
+
if (!schedule) {
|
|
116
|
+
throw new T2000Error('AUTO_INVEST_NOT_FOUND', `Schedule '${id}' not found`);
|
|
117
|
+
}
|
|
118
|
+
schedule.enabled = false;
|
|
119
|
+
this.save();
|
|
120
|
+
}
|
|
121
|
+
remove(id) {
|
|
122
|
+
this.load();
|
|
123
|
+
const idx = this.data.schedules.findIndex((s) => s.id === id);
|
|
124
|
+
if (idx === -1) {
|
|
125
|
+
throw new T2000Error('AUTO_INVEST_NOT_FOUND', `Schedule '${id}' not found`);
|
|
126
|
+
}
|
|
127
|
+
this.data.schedules.splice(idx, 1);
|
|
128
|
+
this.save();
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=auto-invest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-invest.js","sourceRoot":"","sources":["../src/auto-invest.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-invest.test.d.ts","sourceRoot":"","sources":["../src/auto-invest.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach, vi, afterEach } from 'vitest';
|
|
2
|
+
import { mkdtempSync, readFileSync } from 'node:fs';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { tmpdir } from 'node:os';
|
|
5
|
+
import { AutoInvestManager } from './auto-invest.js';
|
|
6
|
+
import { T2000Error } from './errors.js';
|
|
7
|
+
describe('AutoInvestManager', () => {
|
|
8
|
+
let dir;
|
|
9
|
+
let aim;
|
|
10
|
+
beforeEach(() => {
|
|
11
|
+
dir = mkdtempSync(join(tmpdir(), 'auto-invest-test-'));
|
|
12
|
+
aim = new AutoInvestManager(dir);
|
|
13
|
+
});
|
|
14
|
+
afterEach(() => {
|
|
15
|
+
vi.useRealTimers();
|
|
16
|
+
});
|
|
17
|
+
describe('setup', () => {
|
|
18
|
+
it('creates a daily schedule for a strategy', () => {
|
|
19
|
+
const s = aim.setup({ amount: 50, frequency: 'daily', strategy: 'bluechip' });
|
|
20
|
+
expect(s.id).toHaveLength(8);
|
|
21
|
+
expect(s.strategy).toBe('bluechip');
|
|
22
|
+
expect(s.asset).toBeUndefined();
|
|
23
|
+
expect(s.amount).toBe(50);
|
|
24
|
+
expect(s.frequency).toBe('daily');
|
|
25
|
+
expect(s.enabled).toBe(true);
|
|
26
|
+
expect(s.totalInvested).toBe(0);
|
|
27
|
+
expect(s.runCount).toBe(0);
|
|
28
|
+
expect(s.nextRun).toBeDefined();
|
|
29
|
+
});
|
|
30
|
+
it('creates a weekly schedule for a single asset', () => {
|
|
31
|
+
const s = aim.setup({ amount: 100, frequency: 'weekly', asset: 'SUI', dayOfWeek: 5 });
|
|
32
|
+
expect(s.asset).toBe('SUI');
|
|
33
|
+
expect(s.frequency).toBe('weekly');
|
|
34
|
+
expect(s.dayOfWeek).toBe(5);
|
|
35
|
+
});
|
|
36
|
+
it('creates a monthly schedule', () => {
|
|
37
|
+
const s = aim.setup({ amount: 200, frequency: 'monthly', strategy: 'layer1', dayOfMonth: 15 });
|
|
38
|
+
expect(s.frequency).toBe('monthly');
|
|
39
|
+
expect(s.dayOfMonth).toBe(15);
|
|
40
|
+
});
|
|
41
|
+
it('throws when neither strategy nor asset is provided', () => {
|
|
42
|
+
try {
|
|
43
|
+
aim.setup({ amount: 50, frequency: 'daily' });
|
|
44
|
+
}
|
|
45
|
+
catch (e) {
|
|
46
|
+
expect(e.code).toBe('AUTO_INVEST_NOT_FOUND');
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
it('throws when amount is less than $1', () => {
|
|
50
|
+
try {
|
|
51
|
+
aim.setup({ amount: 0.5, frequency: 'daily', strategy: 'bluechip' });
|
|
52
|
+
}
|
|
53
|
+
catch (e) {
|
|
54
|
+
expect(e.code).toBe('AUTO_INVEST_INSUFFICIENT');
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
it('persists schedule to disk', () => {
|
|
58
|
+
aim.setup({ amount: 50, frequency: 'daily', strategy: 'bluechip' });
|
|
59
|
+
const raw = JSON.parse(readFileSync(join(dir, 'auto-invest.json'), 'utf-8'));
|
|
60
|
+
expect(raw.schedules).toHaveLength(1);
|
|
61
|
+
expect(raw.schedules[0].strategy).toBe('bluechip');
|
|
62
|
+
});
|
|
63
|
+
it('allows multiple schedules', () => {
|
|
64
|
+
aim.setup({ amount: 50, frequency: 'daily', strategy: 'bluechip' });
|
|
65
|
+
aim.setup({ amount: 100, frequency: 'weekly', asset: 'SUI' });
|
|
66
|
+
const status = aim.getStatus();
|
|
67
|
+
expect(status.schedules).toHaveLength(2);
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
describe('nextRun computation', () => {
|
|
71
|
+
it('daily schedule sets next run to tomorrow midnight', () => {
|
|
72
|
+
const s = aim.setup({ amount: 10, frequency: 'daily', strategy: 'bluechip' });
|
|
73
|
+
const nextRun = new Date(s.nextRun);
|
|
74
|
+
const tomorrow = new Date();
|
|
75
|
+
tomorrow.setDate(tomorrow.getDate() + 1);
|
|
76
|
+
tomorrow.setHours(0, 0, 0, 0);
|
|
77
|
+
expect(nextRun.getTime()).toBe(tomorrow.getTime());
|
|
78
|
+
});
|
|
79
|
+
it('monthly schedule uses specified day of month', () => {
|
|
80
|
+
const s = aim.setup({ amount: 10, frequency: 'monthly', strategy: 'bluechip', dayOfMonth: 28 });
|
|
81
|
+
const nextRun = new Date(s.nextRun);
|
|
82
|
+
expect(nextRun.getDate()).toBe(28);
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
describe('getSchedule', () => {
|
|
86
|
+
it('returns the schedule by id', () => {
|
|
87
|
+
const created = aim.setup({ amount: 50, frequency: 'daily', strategy: 'bluechip' });
|
|
88
|
+
const fetched = aim.getSchedule(created.id);
|
|
89
|
+
expect(fetched.id).toBe(created.id);
|
|
90
|
+
expect(fetched.amount).toBe(50);
|
|
91
|
+
});
|
|
92
|
+
it('throws AUTO_INVEST_NOT_FOUND for unknown id', () => {
|
|
93
|
+
try {
|
|
94
|
+
aim.getSchedule('nope');
|
|
95
|
+
}
|
|
96
|
+
catch (e) {
|
|
97
|
+
expect(e.code).toBe('AUTO_INVEST_NOT_FOUND');
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
describe('getStatus', () => {
|
|
102
|
+
it('returns empty arrays when no schedules', () => {
|
|
103
|
+
const status = aim.getStatus();
|
|
104
|
+
expect(status.schedules).toHaveLength(0);
|
|
105
|
+
expect(status.pendingRuns).toHaveLength(0);
|
|
106
|
+
});
|
|
107
|
+
it('includes all schedules', () => {
|
|
108
|
+
aim.setup({ amount: 50, frequency: 'daily', strategy: 'bluechip' });
|
|
109
|
+
aim.setup({ amount: 100, frequency: 'weekly', asset: 'SUI' });
|
|
110
|
+
const status = aim.getStatus();
|
|
111
|
+
expect(status.schedules).toHaveLength(2);
|
|
112
|
+
});
|
|
113
|
+
it('identifies pending runs where nextRun is in the past', () => {
|
|
114
|
+
const s = aim.setup({ amount: 50, frequency: 'daily', strategy: 'bluechip' });
|
|
115
|
+
// Manually backdate the nextRun to force a pending state
|
|
116
|
+
const raw = JSON.parse(readFileSync(join(dir, 'auto-invest.json'), 'utf-8'));
|
|
117
|
+
raw.schedules[0].nextRun = new Date(Date.now() - 60_000).toISOString();
|
|
118
|
+
const { writeFileSync } = require('node:fs');
|
|
119
|
+
writeFileSync(join(dir, 'auto-invest.json'), JSON.stringify(raw, null, 2));
|
|
120
|
+
const aim2 = new AutoInvestManager(dir);
|
|
121
|
+
const status = aim2.getStatus();
|
|
122
|
+
expect(status.pendingRuns).toHaveLength(1);
|
|
123
|
+
expect(status.pendingRuns[0].id).toBe(s.id);
|
|
124
|
+
});
|
|
125
|
+
it('does not include disabled schedules in pending runs', () => {
|
|
126
|
+
const s = aim.setup({ amount: 50, frequency: 'daily', strategy: 'bluechip' });
|
|
127
|
+
const raw = JSON.parse(readFileSync(join(dir, 'auto-invest.json'), 'utf-8'));
|
|
128
|
+
raw.schedules[0].nextRun = new Date(Date.now() - 60_000).toISOString();
|
|
129
|
+
const { writeFileSync } = require('node:fs');
|
|
130
|
+
writeFileSync(join(dir, 'auto-invest.json'), JSON.stringify(raw, null, 2));
|
|
131
|
+
const aim2 = new AutoInvestManager(dir);
|
|
132
|
+
aim2.stop(s.id);
|
|
133
|
+
const status = aim2.getStatus();
|
|
134
|
+
expect(status.pendingRuns).toHaveLength(0);
|
|
135
|
+
});
|
|
136
|
+
});
|
|
137
|
+
describe('recordRun', () => {
|
|
138
|
+
it('updates totalInvested, runCount, lastRun, and nextRun', () => {
|
|
139
|
+
const s = aim.setup({ amount: 50, frequency: 'daily', strategy: 'bluechip' });
|
|
140
|
+
aim.recordRun(s.id, 50);
|
|
141
|
+
const updated = aim.getSchedule(s.id);
|
|
142
|
+
expect(updated.totalInvested).toBe(50);
|
|
143
|
+
expect(updated.runCount).toBe(1);
|
|
144
|
+
expect(updated.lastRun).toBeDefined();
|
|
145
|
+
expect(new Date(updated.nextRun).getTime()).toBeGreaterThan(Date.now() - 1000);
|
|
146
|
+
});
|
|
147
|
+
it('accumulates across multiple runs', () => {
|
|
148
|
+
const s = aim.setup({ amount: 50, frequency: 'daily', strategy: 'bluechip' });
|
|
149
|
+
aim.recordRun(s.id, 50);
|
|
150
|
+
aim.recordRun(s.id, 50);
|
|
151
|
+
aim.recordRun(s.id, 30);
|
|
152
|
+
const updated = aim.getSchedule(s.id);
|
|
153
|
+
expect(updated.totalInvested).toBe(130);
|
|
154
|
+
expect(updated.runCount).toBe(3);
|
|
155
|
+
});
|
|
156
|
+
it('silently no-ops for unknown schedule id', () => {
|
|
157
|
+
expect(() => aim.recordRun('nonexistent', 50)).not.toThrow();
|
|
158
|
+
});
|
|
159
|
+
});
|
|
160
|
+
describe('stop', () => {
|
|
161
|
+
it('disables the schedule', () => {
|
|
162
|
+
const s = aim.setup({ amount: 50, frequency: 'daily', strategy: 'bluechip' });
|
|
163
|
+
expect(aim.getSchedule(s.id).enabled).toBe(true);
|
|
164
|
+
aim.stop(s.id);
|
|
165
|
+
expect(aim.getSchedule(s.id).enabled).toBe(false);
|
|
166
|
+
});
|
|
167
|
+
it('persists to disk', () => {
|
|
168
|
+
const s = aim.setup({ amount: 50, frequency: 'daily', strategy: 'bluechip' });
|
|
169
|
+
aim.stop(s.id);
|
|
170
|
+
const aim2 = new AutoInvestManager(dir);
|
|
171
|
+
expect(aim2.getSchedule(s.id).enabled).toBe(false);
|
|
172
|
+
});
|
|
173
|
+
it('throws AUTO_INVEST_NOT_FOUND for unknown id', () => {
|
|
174
|
+
try {
|
|
175
|
+
aim.stop('nonexistent');
|
|
176
|
+
}
|
|
177
|
+
catch (e) {
|
|
178
|
+
expect(e.code).toBe('AUTO_INVEST_NOT_FOUND');
|
|
179
|
+
}
|
|
180
|
+
});
|
|
181
|
+
});
|
|
182
|
+
describe('remove', () => {
|
|
183
|
+
it('removes the schedule entirely', () => {
|
|
184
|
+
const s = aim.setup({ amount: 50, frequency: 'daily', strategy: 'bluechip' });
|
|
185
|
+
aim.remove(s.id);
|
|
186
|
+
expect(() => aim.getSchedule(s.id)).toThrow(T2000Error);
|
|
187
|
+
expect(aim.getStatus().schedules).toHaveLength(0);
|
|
188
|
+
});
|
|
189
|
+
it('persists removal to disk', () => {
|
|
190
|
+
const s = aim.setup({ amount: 50, frequency: 'daily', strategy: 'bluechip' });
|
|
191
|
+
aim.remove(s.id);
|
|
192
|
+
const aim2 = new AutoInvestManager(dir);
|
|
193
|
+
expect(aim2.getStatus().schedules).toHaveLength(0);
|
|
194
|
+
});
|
|
195
|
+
it('throws AUTO_INVEST_NOT_FOUND for unknown id', () => {
|
|
196
|
+
try {
|
|
197
|
+
aim.remove('nonexistent');
|
|
198
|
+
}
|
|
199
|
+
catch (e) {
|
|
200
|
+
expect(e.code).toBe('AUTO_INVEST_NOT_FOUND');
|
|
201
|
+
}
|
|
202
|
+
});
|
|
203
|
+
it('only removes the targeted schedule', () => {
|
|
204
|
+
const s1 = aim.setup({ amount: 50, frequency: 'daily', strategy: 'bluechip' });
|
|
205
|
+
const s2 = aim.setup({ amount: 100, frequency: 'weekly', asset: 'SUI' });
|
|
206
|
+
aim.remove(s1.id);
|
|
207
|
+
expect(aim.getStatus().schedules).toHaveLength(1);
|
|
208
|
+
expect(aim.getSchedule(s2.id)).toBeDefined();
|
|
209
|
+
});
|
|
210
|
+
});
|
|
211
|
+
describe('reload from disk', () => {
|
|
212
|
+
it('picks up changes from another instance', () => {
|
|
213
|
+
const s = aim.setup({ amount: 50, frequency: 'daily', strategy: 'bluechip' });
|
|
214
|
+
const aim2 = new AutoInvestManager(dir);
|
|
215
|
+
const fetched = aim2.getSchedule(s.id);
|
|
216
|
+
expect(fetched.strategy).toBe('bluechip');
|
|
217
|
+
});
|
|
218
|
+
});
|
|
219
|
+
});
|
|
220
|
+
//# sourceMappingURL=auto-invest.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-invest.test.js","sourceRoot":"","sources":["../src/auto-invest.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
export declare const MIST_PER_SUI = 1000000000n;
|
|
2
|
+
export declare const SUI_DECIMALS = 9;
|
|
3
|
+
export declare const USDC_DECIMALS = 6;
|
|
4
|
+
export declare const BPS_DENOMINATOR = 10000n;
|
|
5
|
+
export declare const PRECISION = 1000000000000000000n;
|
|
6
|
+
export declare const MIN_DEPOSIT = 1000000n;
|
|
7
|
+
export declare const GAS_RESERVE_USDC = 1000000n;
|
|
8
|
+
export declare const AUTO_TOPUP_THRESHOLD = 50000000n;
|
|
9
|
+
export declare const AUTO_TOPUP_AMOUNT = 1000000n;
|
|
10
|
+
export declare const AUTO_TOPUP_MIN_USDC = 2000000n;
|
|
11
|
+
export declare const BOOTSTRAP_LIMIT = 10;
|
|
12
|
+
export declare const GAS_FEE_CEILING_USD = 0.05;
|
|
13
|
+
export declare const SAVE_FEE_BPS = 10n;
|
|
14
|
+
export declare const SWAP_FEE_BPS = 0n;
|
|
15
|
+
export declare const BORROW_FEE_BPS = 5n;
|
|
16
|
+
export declare const CLOCK_ID = "0x6";
|
|
17
|
+
export declare const SUPPORTED_ASSETS: {
|
|
18
|
+
readonly USDC: {
|
|
19
|
+
readonly type: "0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7::usdc::USDC";
|
|
20
|
+
readonly decimals: 6;
|
|
21
|
+
readonly symbol: "USDC";
|
|
22
|
+
readonly displayName: "USDC";
|
|
23
|
+
};
|
|
24
|
+
readonly USDT: {
|
|
25
|
+
readonly type: "0x375f70cf2ae4c00bf37117d0c85a2c71545e6ee05c4a5c7d282cd66a4504b068::usdt::USDT";
|
|
26
|
+
readonly decimals: 6;
|
|
27
|
+
readonly symbol: "USDT";
|
|
28
|
+
readonly displayName: "suiUSDT";
|
|
29
|
+
};
|
|
30
|
+
readonly USDe: {
|
|
31
|
+
readonly type: "0x41d587e5336f1c86cad50d38a7136db99333bb9bda91cea4ba69115defeb1402::sui_usde::SUI_USDE";
|
|
32
|
+
readonly decimals: 6;
|
|
33
|
+
readonly symbol: "USDe";
|
|
34
|
+
readonly displayName: "suiUSDe";
|
|
35
|
+
};
|
|
36
|
+
readonly USDsui: {
|
|
37
|
+
readonly type: "0x44f838219cf67b058f3b37907b655f226153c18e33dfcd0da559a844fea9b1c1::usdsui::USDSUI";
|
|
38
|
+
readonly decimals: 6;
|
|
39
|
+
readonly symbol: "USDsui";
|
|
40
|
+
readonly displayName: "USDsui";
|
|
41
|
+
};
|
|
42
|
+
readonly SUI: {
|
|
43
|
+
readonly type: "0x2::sui::SUI";
|
|
44
|
+
readonly decimals: 9;
|
|
45
|
+
readonly symbol: "SUI";
|
|
46
|
+
readonly displayName: "SUI";
|
|
47
|
+
};
|
|
48
|
+
readonly BTC: {
|
|
49
|
+
readonly type: "0x0041f9f9344cac094454cd574e333c4fdb132d7bcc9379bcd4aab485b2a63942::wbtc::WBTC";
|
|
50
|
+
readonly decimals: 8;
|
|
51
|
+
readonly symbol: "BTC";
|
|
52
|
+
readonly displayName: "Bitcoin";
|
|
53
|
+
};
|
|
54
|
+
readonly ETH: {
|
|
55
|
+
readonly type: "0xd0e89b2af5e4910726fbcd8b8dd37bb79b29e5f83f7491bca830e94f7f226d29::eth::ETH";
|
|
56
|
+
readonly decimals: 8;
|
|
57
|
+
readonly symbol: "ETH";
|
|
58
|
+
readonly displayName: "Ethereum";
|
|
59
|
+
};
|
|
60
|
+
readonly GOLD: {
|
|
61
|
+
readonly type: "0x9d297676e7a4b771ab023291377b2adfaa4938fb9080b8d12430e4b108b836a9::xaum::XAUM";
|
|
62
|
+
readonly decimals: 9;
|
|
63
|
+
readonly symbol: "GOLD";
|
|
64
|
+
readonly displayName: "Gold";
|
|
65
|
+
};
|
|
66
|
+
};
|
|
67
|
+
export type SupportedAsset = keyof typeof SUPPORTED_ASSETS;
|
|
68
|
+
export type StableAsset = Exclude<SupportedAsset, 'SUI' | 'BTC' | 'ETH' | 'GOLD'>;
|
|
69
|
+
export declare const STABLE_ASSETS: readonly StableAsset[];
|
|
70
|
+
export declare const T2000_PACKAGE_ID: string;
|
|
71
|
+
export declare const T2000_CONFIG_ID: string;
|
|
72
|
+
export declare const T2000_ADMIN_CAP_ID = "0x863d1b02cba1b93d0fe9b87eb92d58b60c1e85c001022cb2a760e07bade47e65";
|
|
73
|
+
export declare const T2000_TREASURY_ID: string;
|
|
74
|
+
export declare const DEFAULT_NETWORK: "mainnet";
|
|
75
|
+
export declare const DEFAULT_RPC_URL = "https://fullnode.mainnet.sui.io:443";
|
|
76
|
+
export declare const DEFAULT_KEY_PATH = "~/.t2000/wallet.key";
|
|
77
|
+
export declare const DEFAULT_CONFIG_PATH = "~/.t2000/config.json";
|
|
78
|
+
export declare const API_BASE_URL: string;
|
|
79
|
+
export declare const CETUS_USDC_SUI_POOL = "0x51e883ba7c0b566a26cbc8a94cd33eb0abd418a77cc1e60ad22fd9b1f29cd2ab";
|
|
80
|
+
export declare const CETUS_GLOBAL_CONFIG = "0xdaa46292632c3c4d8f31f23ea0f9b36a28ff3677e9684980e4438403a67a3d8f";
|
|
81
|
+
export declare const CETUS_PACKAGE = "0x1eabed72c53feb3805120a081dc15963c204dc8d091542592abaf7a35689b2fb";
|
|
82
|
+
export declare const INVESTMENT_ASSETS: {
|
|
83
|
+
readonly SUI: {
|
|
84
|
+
readonly type: "0x2::sui::SUI";
|
|
85
|
+
readonly decimals: 9;
|
|
86
|
+
readonly symbol: "SUI";
|
|
87
|
+
readonly displayName: "SUI";
|
|
88
|
+
};
|
|
89
|
+
readonly BTC: {
|
|
90
|
+
readonly type: "0x0041f9f9344cac094454cd574e333c4fdb132d7bcc9379bcd4aab485b2a63942::wbtc::WBTC";
|
|
91
|
+
readonly decimals: 8;
|
|
92
|
+
readonly symbol: "BTC";
|
|
93
|
+
readonly displayName: "Bitcoin";
|
|
94
|
+
};
|
|
95
|
+
readonly ETH: {
|
|
96
|
+
readonly type: "0xd0e89b2af5e4910726fbcd8b8dd37bb79b29e5f83f7491bca830e94f7f226d29::eth::ETH";
|
|
97
|
+
readonly decimals: 8;
|
|
98
|
+
readonly symbol: "ETH";
|
|
99
|
+
readonly displayName: "Ethereum";
|
|
100
|
+
};
|
|
101
|
+
readonly GOLD: {
|
|
102
|
+
readonly type: "0x9d297676e7a4b771ab023291377b2adfaa4938fb9080b8d12430e4b108b836a9::xaum::XAUM";
|
|
103
|
+
readonly decimals: 9;
|
|
104
|
+
readonly symbol: "GOLD";
|
|
105
|
+
readonly displayName: "Gold";
|
|
106
|
+
};
|
|
107
|
+
};
|
|
108
|
+
export type InvestmentAsset = keyof typeof INVESTMENT_ASSETS;
|
|
109
|
+
export declare const DEFAULT_STRATEGIES: {
|
|
110
|
+
readonly bluechip: {
|
|
111
|
+
readonly name: "Bluechip / Large-Cap";
|
|
112
|
+
readonly allocations: {
|
|
113
|
+
readonly BTC: 50;
|
|
114
|
+
readonly ETH: 30;
|
|
115
|
+
readonly SUI: 20;
|
|
116
|
+
};
|
|
117
|
+
readonly description: "Large-cap crypto index";
|
|
118
|
+
readonly custom: false;
|
|
119
|
+
};
|
|
120
|
+
readonly layer1: {
|
|
121
|
+
readonly name: "Smart Contract Platforms";
|
|
122
|
+
readonly allocations: {
|
|
123
|
+
readonly ETH: 50;
|
|
124
|
+
readonly SUI: 50;
|
|
125
|
+
};
|
|
126
|
+
readonly description: "Smart contract platforms";
|
|
127
|
+
readonly custom: false;
|
|
128
|
+
};
|
|
129
|
+
readonly 'sui-heavy': {
|
|
130
|
+
readonly name: "Sui-Weighted Portfolio";
|
|
131
|
+
readonly allocations: {
|
|
132
|
+
readonly BTC: 20;
|
|
133
|
+
readonly ETH: 20;
|
|
134
|
+
readonly SUI: 60;
|
|
135
|
+
};
|
|
136
|
+
readonly description: "Sui-weighted portfolio";
|
|
137
|
+
readonly custom: false;
|
|
138
|
+
};
|
|
139
|
+
readonly 'all-weather': {
|
|
140
|
+
readonly name: "All-Weather Portfolio";
|
|
141
|
+
readonly allocations: {
|
|
142
|
+
readonly BTC: 30;
|
|
143
|
+
readonly ETH: 20;
|
|
144
|
+
readonly SUI: 20;
|
|
145
|
+
readonly GOLD: 30;
|
|
146
|
+
};
|
|
147
|
+
readonly description: "Crypto and commodities";
|
|
148
|
+
readonly custom: false;
|
|
149
|
+
};
|
|
150
|
+
readonly 'safe-haven': {
|
|
151
|
+
readonly name: "Safe Haven";
|
|
152
|
+
readonly allocations: {
|
|
153
|
+
readonly BTC: 50;
|
|
154
|
+
readonly GOLD: 50;
|
|
155
|
+
};
|
|
156
|
+
readonly description: "Store-of-value assets";
|
|
157
|
+
readonly custom: false;
|
|
158
|
+
};
|
|
159
|
+
};
|
|
160
|
+
export declare const PERPS_MARKETS: readonly ["SUI-PERP"];
|
|
161
|
+
export type PerpsMarket = (typeof PERPS_MARKETS)[number];
|
|
162
|
+
export declare const DEFAULT_MAX_LEVERAGE = 5;
|
|
163
|
+
export declare const DEFAULT_MAX_POSITION_SIZE = 1000;
|
|
164
|
+
export declare const INVEST_FEE_BPS = 0n;
|
|
165
|
+
export declare const GAS_RESERVE_MIN = 0.05;
|
|
166
|
+
export declare const SENTINEL: {
|
|
167
|
+
readonly PACKAGE: "0x88b83f36dafcd5f6dcdcf1d2cb5889b03f61264ab3cee9cae35db7aa940a21b7";
|
|
168
|
+
readonly AGENT_REGISTRY: "0xc47564f5f14c12b31e0dfa1a3dc99a6380a1edf8929c28cb0eaa3359c8db36ac";
|
|
169
|
+
readonly ENCLAVE: "0xfb1261aeb9583514cb1341a548a5ec12d1231bd96af22215f1792617a93e1213";
|
|
170
|
+
readonly PROTOCOL_CONFIG: "0x2fa4fa4a1dd0498612304635ff9334e1b922e78af325000e9d9c0e88adea459f";
|
|
171
|
+
readonly TEE_API: "https://app.suisentinel.xyz/api/consume-prompt";
|
|
172
|
+
readonly SENTINELS_API: "https://api.suisentinel.xyz/agents/mainnet";
|
|
173
|
+
readonly RANDOM: "0x8";
|
|
174
|
+
readonly MIN_FEE_MIST: 100000000n;
|
|
175
|
+
readonly MAX_PROMPT_TOKENS: 600;
|
|
176
|
+
};
|
|
177
|
+
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY,cAAiB,CAAC;AAC3C,eAAO,MAAM,YAAY,IAAI,CAAC;AAC9B,eAAO,MAAM,aAAa,IAAI,CAAC;AAE/B,eAAO,MAAM,eAAe,SAAU,CAAC;AACvC,eAAO,MAAM,SAAS,uBAA6B,CAAC;AAEpD,eAAO,MAAM,WAAW,WAAa,CAAC;AACtC,eAAO,MAAM,gBAAgB,WAAa,CAAC;AAC3C,eAAO,MAAM,oBAAoB,YAAc,CAAC;AAChD,eAAO,MAAM,iBAAiB,WAAa,CAAC;AAC5C,eAAO,MAAM,mBAAmB,WAAa,CAAC;AAC9C,eAAO,MAAM,eAAe,KAAK,CAAC;AAClC,eAAO,MAAM,mBAAmB,OAAO,CAAC;AAExC,eAAO,MAAM,YAAY,MAAM,CAAC;AAChC,eAAO,MAAM,YAAY,KAAK,CAAC;AAC/B,eAAO,MAAM,cAAc,KAAK,CAAC;AAEjC,eAAO,MAAM,QAAQ,QAAQ,CAAC;AAE9B,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiDnB,CAAC;AAEX,MAAM,MAAM,cAAc,GAAG,MAAM,OAAO,gBAAgB,CAAC;AAC3D,MAAM,MAAM,WAAW,GAAG,OAAO,CAAC,cAAc,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,CAAC,CAAC;AAClF,eAAO,MAAM,aAAa,EAAE,SAAS,WAAW,EAAgD,CAAC;AAEjG,eAAO,MAAM,gBAAgB,QAAuG,CAAC;AACrI,eAAO,MAAM,eAAe,QAAsG,CAAC;AACnI,eAAO,MAAM,kBAAkB,uEAAuE,CAAC;AACvG,eAAO,MAAM,iBAAiB,QAAwG,CAAC;AAEvI,eAAO,MAAM,eAAe,EAAG,SAAkB,CAAC;AAClD,eAAO,MAAM,eAAe,wCAAwC,CAAC;AACrE,eAAO,MAAM,gBAAgB,wBAAwB,CAAC;AACtD,eAAO,MAAM,mBAAmB,yBAAyB,CAAC;AAE1D,eAAO,MAAM,YAAY,QAAsD,CAAC;AAEhF,eAAO,MAAM,mBAAmB,uEAAuE,CAAC;AACxG,eAAO,MAAM,mBAAmB,uEAAuE,CAAC;AACxG,eAAO,MAAM,aAAa,uEAAuE,CAAC;AAIlG,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;CAKpB,CAAC;AAEX,MAAM,MAAM,eAAe,GAAG,MAAM,OAAO,iBAAiB,CAAC;AAE7D,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+BrB,CAAC;AAEX,eAAO,MAAM,aAAa,uBAAwB,CAAC;AACnD,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;AAEzD,eAAO,MAAM,oBAAoB,IAAI,CAAC;AACtC,eAAO,MAAM,yBAAyB,OAAO,CAAC;AAC9C,eAAO,MAAM,cAAc,KAAK,CAAC;AACjC,eAAO,MAAM,eAAe,OAAO,CAAC;AAEpC,eAAO,MAAM,QAAQ;;;;;;;;;;CAUX,CAAC"}
|