@t2000/cli 0.17.23 → 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.
Files changed (137) hide show
  1. package/dist/commands/address.d.ts +3 -0
  2. package/dist/commands/address.d.ts.map +1 -0
  3. package/dist/commands/address.js +26 -0
  4. package/dist/commands/address.js.map +1 -0
  5. package/dist/commands/balance.d.ts +3 -0
  6. package/dist/commands/balance.d.ts.map +1 -0
  7. package/dist/commands/balance.js +134 -0
  8. package/dist/commands/balance.js.map +1 -0
  9. package/dist/commands/borrow.d.ts +3 -0
  10. package/dist/commands/borrow.d.ts.map +1 -0
  11. package/dist/commands/borrow.js +40 -0
  12. package/dist/commands/borrow.js.map +1 -0
  13. package/dist/commands/claimRewards.d.ts +3 -0
  14. package/dist/commands/claimRewards.d.ts.map +1 -0
  15. package/dist/commands/claimRewards.js +49 -0
  16. package/dist/commands/claimRewards.js.map +1 -0
  17. package/dist/commands/config.d.ts +3 -0
  18. package/dist/commands/config.d.ts.map +1 -0
  19. package/dist/commands/config.js +139 -0
  20. package/dist/commands/config.js.map +1 -0
  21. package/dist/commands/contacts.d.ts +3 -0
  22. package/dist/commands/contacts.d.ts.map +1 -0
  23. package/dist/commands/contacts.js +83 -0
  24. package/dist/commands/contacts.js.map +1 -0
  25. package/dist/commands/deposit.d.ts +3 -0
  26. package/dist/commands/deposit.d.ts.map +1 -0
  27. package/dist/commands/deposit.js +27 -0
  28. package/dist/commands/deposit.js.map +1 -0
  29. package/dist/commands/earn.d.ts +3 -0
  30. package/dist/commands/earn.d.ts.map +1 -0
  31. package/dist/commands/earn.js +186 -0
  32. package/dist/commands/earn.js.map +1 -0
  33. package/dist/commands/earnings.d.ts +3 -0
  34. package/dist/commands/earnings.d.ts.map +1 -0
  35. package/dist/commands/earnings.js +38 -0
  36. package/dist/commands/earnings.js.map +1 -0
  37. package/dist/commands/exchange.d.ts +3 -0
  38. package/dist/commands/exchange.d.ts.map +1 -0
  39. package/dist/commands/exchange.js +45 -0
  40. package/dist/commands/exchange.js.map +1 -0
  41. package/dist/commands/exportKey.d.ts +3 -0
  42. package/dist/commands/exportKey.d.ts.map +1 -0
  43. package/dist/commands/exportKey.js +81 -0
  44. package/dist/commands/exportKey.js.map +1 -0
  45. package/dist/commands/fundStatus.d.ts +3 -0
  46. package/dist/commands/fundStatus.d.ts.map +1 -0
  47. package/dist/commands/fundStatus.js +50 -0
  48. package/dist/commands/fundStatus.js.map +1 -0
  49. package/dist/commands/health.d.ts +3 -0
  50. package/dist/commands/health.d.ts.map +1 -0
  51. package/dist/commands/health.js +44 -0
  52. package/dist/commands/health.js.map +1 -0
  53. package/dist/commands/history.d.ts +3 -0
  54. package/dist/commands/history.d.ts.map +1 -0
  55. package/dist/commands/history.js +37 -0
  56. package/dist/commands/history.js.map +1 -0
  57. package/dist/commands/importKey.d.ts +3 -0
  58. package/dist/commands/importKey.d.ts.map +1 -0
  59. package/dist/commands/importKey.js +39 -0
  60. package/dist/commands/importKey.js.map +1 -0
  61. package/dist/commands/init.d.ts +3 -0
  62. package/dist/commands/init.d.ts.map +1 -0
  63. package/dist/commands/init.js +56 -0
  64. package/dist/commands/init.js.map +1 -0
  65. package/dist/commands/invest.d.ts +3 -0
  66. package/dist/commands/invest.d.ts.map +1 -0
  67. package/dist/commands/invest.js +635 -0
  68. package/dist/commands/invest.js.map +1 -0
  69. package/dist/commands/lock.d.ts +3 -0
  70. package/dist/commands/lock.d.ts.map +1 -0
  71. package/dist/commands/lock.js +66 -0
  72. package/dist/commands/lock.js.map +1 -0
  73. package/dist/commands/mcp.d.ts +3 -0
  74. package/dist/commands/mcp.d.ts.map +1 -0
  75. package/dist/commands/mcp.js +141 -0
  76. package/dist/commands/mcp.js.map +1 -0
  77. package/dist/commands/pay.d.ts +3 -0
  78. package/dist/commands/pay.d.ts.map +1 -0
  79. package/dist/commands/pay.js +96 -0
  80. package/dist/commands/pay.js.map +1 -0
  81. package/dist/commands/portfolio.d.ts +3 -0
  82. package/dist/commands/portfolio.d.ts.map +1 -0
  83. package/dist/commands/portfolio.js +104 -0
  84. package/dist/commands/portfolio.js.map +1 -0
  85. package/dist/commands/positions.d.ts +3 -0
  86. package/dist/commands/positions.d.ts.map +1 -0
  87. package/dist/commands/positions.js +73 -0
  88. package/dist/commands/positions.js.map +1 -0
  89. package/dist/commands/rates.d.ts +3 -0
  90. package/dist/commands/rates.d.ts.map +1 -0
  91. package/dist/commands/rates.js +64 -0
  92. package/dist/commands/rates.js.map +1 -0
  93. package/dist/commands/rebalance.d.ts +3 -0
  94. package/dist/commands/rebalance.d.ts.map +1 -0
  95. package/dist/commands/rebalance.js +109 -0
  96. package/dist/commands/rebalance.js.map +1 -0
  97. package/dist/commands/repay.d.ts +3 -0
  98. package/dist/commands/repay.d.ts.map +1 -0
  99. package/dist/commands/repay.js +35 -0
  100. package/dist/commands/repay.js.map +1 -0
  101. package/dist/commands/save.d.ts +3 -0
  102. package/dist/commands/save.d.ts.map +1 -0
  103. package/dist/commands/save.js +57 -0
  104. package/dist/commands/save.js.map +1 -0
  105. package/dist/commands/send.d.ts +3 -0
  106. package/dist/commands/send.d.ts.map +1 -0
  107. package/dist/commands/send.js +52 -0
  108. package/dist/commands/send.js.map +1 -0
  109. package/dist/commands/sentinel.d.ts +3 -0
  110. package/dist/commands/sentinel.d.ts.map +1 -0
  111. package/dist/commands/sentinel.js +142 -0
  112. package/dist/commands/sentinel.js.map +1 -0
  113. package/dist/commands/serve.d.ts +3 -0
  114. package/dist/commands/serve.d.ts.map +1 -0
  115. package/dist/commands/serve.js +341 -0
  116. package/dist/commands/serve.js.map +1 -0
  117. package/dist/commands/withdraw.d.ts +3 -0
  118. package/dist/commands/withdraw.d.ts.map +1 -0
  119. package/dist/commands/withdraw.js +34 -0
  120. package/dist/commands/withdraw.js.map +1 -0
  121. package/dist/index.d.ts +2 -0
  122. package/dist/index.d.ts.map +1 -0
  123. package/dist/index.js +2 -2708
  124. package/dist/index.js.map +1 -1
  125. package/dist/output.d.ts +16 -0
  126. package/dist/output.d.ts.map +1 -0
  127. package/dist/output.js +85 -0
  128. package/dist/output.js.map +1 -0
  129. package/dist/program.d.ts +3 -0
  130. package/dist/program.d.ts.map +1 -0
  131. package/dist/program.js +80 -0
  132. package/dist/program.js.map +1 -0
  133. package/dist/prompts.d.ts +16 -0
  134. package/dist/prompts.d.ts.map +1 -0
  135. package/dist/prompts.js +69 -0
  136. package/dist/prompts.js.map +1 -0
  137. package/package.json +4 -4
@@ -0,0 +1,186 @@
1
+ import { T2000, MIST_PER_SUI, listSentinels, formatUsd } from '@t2000/sdk';
2
+ import { resolvePin } from '../prompts.js';
3
+ import { printHeader, printKeyValue, printBlank, printJson, isJsonMode, handleError, printDivider, printLine, printInfo, } from '../output.js';
4
+ import pc from 'picocolors';
5
+ function mistToSui(mist) {
6
+ return Number(mist) / Number(MIST_PER_SUI);
7
+ }
8
+ function bestTarget(sentinels) {
9
+ const withPool = sentinels.filter((s) => s.prizePool > 0n && s.attackFee > 0n);
10
+ if (withPool.length === 0)
11
+ return undefined;
12
+ return withPool.sort((a, b) => {
13
+ const ratioA = Number(a.prizePool) / Number(a.attackFee);
14
+ const ratioB = Number(b.prizePool) / Number(b.attackFee);
15
+ return ratioB - ratioA;
16
+ })[0];
17
+ }
18
+ export function registerEarn(program) {
19
+ program
20
+ .command('earn')
21
+ .description('Show all earning opportunities — savings yield + sentinel bounties')
22
+ .option('--key <path>', 'Key file path')
23
+ .action(async (opts) => {
24
+ try {
25
+ const pin = await resolvePin();
26
+ const agent = await T2000.create({ pin, keyPath: opts.key });
27
+ const [positionsResult, portfolioResult, ratesResult, sentinels] = await Promise.allSettled([
28
+ agent.positions(),
29
+ agent.getPortfolio(),
30
+ agent.allRates('USDC'),
31
+ listSentinels(),
32
+ ]);
33
+ const posData = positionsResult.status === 'fulfilled' ? positionsResult.value : null;
34
+ const portfolio = portfolioResult.status === 'fulfilled' ? portfolioResult.value : null;
35
+ const ratesData = ratesResult.status === 'fulfilled' ? ratesResult.value : null;
36
+ const agents = sentinels.status === 'fulfilled' ? sentinels.value : null;
37
+ const savePositions = posData?.positions.filter((p) => p.type === 'save') ?? [];
38
+ const totalSaved = savePositions.reduce((s, p) => s + p.amount, 0);
39
+ const earningInvestments = portfolio?.positions.filter((p) => p.earning && p.currentValue > 0) ?? [];
40
+ const bestSaveApy = ratesData?.length
41
+ ? Math.max(...ratesData.map(r => r.rates.saveApy))
42
+ : 0;
43
+ if (isJsonMode()) {
44
+ const best = agents ? bestTarget(agents) : undefined;
45
+ const totalPool = agents
46
+ ? agents.reduce((sum, s) => sum + mistToSui(s.prizePool), 0)
47
+ : 0;
48
+ const cheapest = agents
49
+ ? Math.min(...agents.map((s) => mistToSui(s.attackFee)))
50
+ : 0;
51
+ printJson({
52
+ savings: savePositions.map((p) => ({
53
+ protocol: p.protocol,
54
+ asset: p.asset,
55
+ amount: p.amount,
56
+ apy: p.apy,
57
+ })),
58
+ totalSaved,
59
+ availableRates: ratesData?.map(r => ({
60
+ protocol: r.protocol,
61
+ asset: 'USDC',
62
+ saveApy: r.rates.saveApy,
63
+ })) ?? [],
64
+ investments: earningInvestments.map((p) => ({
65
+ asset: p.asset,
66
+ amount: p.totalAmount,
67
+ value: p.currentValue,
68
+ protocol: p.earningProtocol,
69
+ apy: p.earningApy,
70
+ })),
71
+ sentinel: agents
72
+ ? {
73
+ activeSentinels: agents.length,
74
+ totalPrizePool: Number(totalPool.toFixed(2)),
75
+ cheapestFee: Number(cheapest.toFixed(2)),
76
+ bestTarget: best
77
+ ? {
78
+ name: best.name,
79
+ objectId: best.objectId,
80
+ prizePool: mistToSui(best.prizePool),
81
+ attackFee: mistToSui(best.attackFee),
82
+ ratio: Number((Number(best.prizePool) / Number(best.attackFee)).toFixed(1)),
83
+ }
84
+ : null,
85
+ }
86
+ : null,
87
+ });
88
+ return;
89
+ }
90
+ printHeader('Earning Opportunities');
91
+ // --- Savings section ---
92
+ printLine(pc.bold('SAVINGS') + pc.dim(' — Passive Yield'));
93
+ printDivider();
94
+ if (savePositions.length > 0) {
95
+ for (const pos of savePositions) {
96
+ const dailyYield = (pos.amount * pos.apy / 100) / 365;
97
+ printKeyValue(pos.protocol, `${formatUsd(pos.amount)} ${pos.asset} @ ${pos.apy.toFixed(2)}% APY`);
98
+ if (dailyYield > 0.0001) {
99
+ const dailyStr = dailyYield < 0.01 ? `$${dailyYield.toFixed(4)}` : formatUsd(dailyYield);
100
+ const monthlyStr = dailyYield * 30 < 0.01 ? `$${(dailyYield * 30).toFixed(4)}` : formatUsd(dailyYield * 30);
101
+ printLine(pc.dim(` ~${dailyStr}/day · ~${monthlyStr}/month`));
102
+ }
103
+ }
104
+ if (savePositions.length > 1) {
105
+ printBlank();
106
+ printKeyValue('Total Saved', formatUsd(totalSaved));
107
+ }
108
+ }
109
+ else if (ratesData && ratesData.length > 0) {
110
+ const sorted = [...ratesData].sort((a, b) => b.rates.saveApy - a.rates.saveApy);
111
+ for (const r of sorted) {
112
+ printKeyValue(r.protocol, `USDC @ ${r.rates.saveApy.toFixed(2)}% APY`);
113
+ }
114
+ const example = 100;
115
+ const daily = (example * bestSaveApy / 100) / 365;
116
+ const monthly = daily * 30;
117
+ printLine(pc.dim(` Save $${example} → ~$${daily.toFixed(2)}/day · ~$${monthly.toFixed(2)}/month`));
118
+ printBlank();
119
+ printInfo('No savings yet — run `t2000 save <amount>` to start');
120
+ }
121
+ else if (posData) {
122
+ printInfo('No savings yet — run `t2000 save <amount>` to start');
123
+ }
124
+ else {
125
+ printInfo('Savings data unavailable');
126
+ }
127
+ // --- Investment yield section ---
128
+ if (earningInvestments.length > 0) {
129
+ printBlank();
130
+ printLine(pc.bold('INVESTMENTS') + pc.dim(' — Earning Yield'));
131
+ printDivider();
132
+ let totalInvestValue = 0;
133
+ for (const pos of earningInvestments) {
134
+ const dailyYield = (pos.currentValue * (pos.earningApy ?? 0) / 100) / 365;
135
+ const apyStr = pos.earningApy ? `${pos.earningApy.toFixed(2)}%` : '—';
136
+ printKeyValue(`${pos.asset} via ${pos.earningProtocol ?? 'unknown'}`, `${formatUsd(pos.currentValue)} (${pos.totalAmount.toFixed(4)} ${pos.asset}) @ ${apyStr} APY`);
137
+ if (dailyYield > 0.0001) {
138
+ const dailyStr = dailyYield < 0.01 ? `$${dailyYield.toFixed(4)}` : formatUsd(dailyYield);
139
+ const monthlyStr = dailyYield * 30 < 0.01 ? `$${(dailyYield * 30).toFixed(4)}` : formatUsd(dailyYield * 30);
140
+ printLine(pc.dim(` ~${dailyStr}/day · ~${monthlyStr}/month`));
141
+ }
142
+ totalInvestValue += pos.currentValue;
143
+ }
144
+ if (earningInvestments.length > 1) {
145
+ printBlank();
146
+ printKeyValue('Total Earning', formatUsd(totalInvestValue));
147
+ }
148
+ }
149
+ printBlank();
150
+ // --- Sentinel section ---
151
+ printLine(pc.bold('SENTINEL BOUNTIES') + pc.dim(' — Active Red Teaming'));
152
+ printDivider();
153
+ if (agents && agents.length > 0) {
154
+ const totalPool = agents.reduce((sum, s) => sum + mistToSui(s.prizePool), 0);
155
+ const cheapest = Math.min(...agents.map((s) => mistToSui(s.attackFee)));
156
+ const best = bestTarget(agents);
157
+ printKeyValue('Active', `${agents.length} sentinels`);
158
+ printKeyValue('Prize Pools', `${totalPool.toFixed(2)} SUI available`);
159
+ printKeyValue('Cheapest Fee', `${cheapest.toFixed(2)} SUI`);
160
+ if (best) {
161
+ const ratio = (Number(best.prizePool) / Number(best.attackFee)).toFixed(1);
162
+ printKeyValue('Best Target', `${best.name} — ${mistToSui(best.prizePool).toFixed(2)} SUI pool (${ratio}x ratio)`);
163
+ }
164
+ }
165
+ else if (agents) {
166
+ printInfo('No active bounties right now');
167
+ }
168
+ else {
169
+ printInfo('Sentinel data unavailable');
170
+ }
171
+ printBlank();
172
+ // --- Quick actions ---
173
+ printLine(pc.bold('Quick Actions'));
174
+ printDivider();
175
+ printLine(` ${pc.dim('t2000 save <amount> [asset]')} Save stablecoins for yield`);
176
+ printLine(` ${pc.dim('t2000 invest earn <asset>')} Earn yield on investments`);
177
+ printLine(` ${pc.dim('t2000 sentinel list')} Browse sentinel bounties`);
178
+ printLine(` ${pc.dim('t2000 sentinel attack <id>')} Attack a sentinel`);
179
+ printBlank();
180
+ }
181
+ catch (error) {
182
+ handleError(error);
183
+ }
184
+ });
185
+ }
186
+ //# sourceMappingURL=earn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"earn.js","sourceRoot":"","sources":["../../src/commands/earn.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE3E,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EACL,WAAW,EACX,aAAa,EACb,UAAU,EACV,SAAS,EACT,UAAU,EACV,WAAW,EACX,YAAY,EACZ,SAAS,EACT,SAAS,GACV,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5B,SAAS,SAAS,CAAC,IAAY;IAC7B,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;AAC7C,CAAC;AAED,SAAS,UAAU,CAAC,SAA0B;IAC5C,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,EAAE,IAAI,CAAC,CAAC,SAAS,GAAG,EAAE,CAAC,CAAC;IAC/E,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAC5C,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAC5B,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QACzD,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QACzD,OAAO,MAAM,GAAG,MAAM,CAAC;IACzB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACR,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,OAAgB;IAC3C,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,oEAAoE,CAAC;SACjF,MAAM,CAAC,cAAc,EAAE,eAAe,CAAC;SACvC,MAAM,CAAC,KAAK,EAAE,IAAsB,EAAE,EAAE;QACvC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,UAAU,EAAE,CAAC;YAC/B,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;YAE7D,MAAM,CAAC,eAAe,EAAE,eAAe,EAAE,WAAW,EAAE,SAAS,CAAC,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC;gBAC1F,KAAK,CAAC,SAAS,EAAE;gBACjB,KAAK,CAAC,YAAY,EAAE;gBACpB,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;gBACtB,aAAa,EAAE;aAChB,CAAC,CAAC;YAEH,MAAM,OAAO,GAAG,eAAe,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;YACtF,MAAM,SAAS,GAAG,eAAe,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;YACxF,MAAM,SAAS,GAAG,WAAW,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;YAChF,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;YACzE,MAAM,aAAa,GAAG,OAAO,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC;YAChF,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YACnE,MAAM,kBAAkB,GAAG,SAAS,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;YACrG,MAAM,WAAW,GAAG,SAAS,EAAE,MAAM;gBACnC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBAClD,CAAC,CAAC,CAAC,CAAC;YAEN,IAAI,UAAU,EAAE,EAAE,CAAC;gBACjB,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;gBACrD,MAAM,SAAS,GAAG,MAAM;oBACtB,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;oBAC5D,CAAC,CAAC,CAAC,CAAC;gBACN,MAAM,QAAQ,GAAG,MAAM;oBACrB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;oBACxD,CAAC,CAAC,CAAC,CAAC;gBAEN,SAAS,CAAC;oBACR,OAAO,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;wBACjC,QAAQ,EAAE,CAAC,CAAC,QAAQ;wBACpB,KAAK,EAAE,CAAC,CAAC,KAAK;wBACd,MAAM,EAAE,CAAC,CAAC,MAAM;wBAChB,GAAG,EAAE,CAAC,CAAC,GAAG;qBACX,CAAC,CAAC;oBACH,UAAU;oBACV,cAAc,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;wBACnC,QAAQ,EAAE,CAAC,CAAC,QAAQ;wBACpB,KAAK,EAAE,MAAM;wBACb,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO;qBACzB,CAAC,CAAC,IAAI,EAAE;oBACT,WAAW,EAAE,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;wBAC1C,KAAK,EAAE,CAAC,CAAC,KAAK;wBACd,MAAM,EAAE,CAAC,CAAC,WAAW;wBACrB,KAAK,EAAE,CAAC,CAAC,YAAY;wBACrB,QAAQ,EAAE,CAAC,CAAC,eAAe;wBAC3B,GAAG,EAAE,CAAC,CAAC,UAAU;qBAClB,CAAC,CAAC;oBACH,QAAQ,EAAE,MAAM;wBACd,CAAC,CAAC;4BACE,eAAe,EAAE,MAAM,CAAC,MAAM;4BAC9B,cAAc,EAAE,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;4BAC5C,WAAW,EAAE,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;4BACxC,UAAU,EAAE,IAAI;gCACd,CAAC,CAAC;oCACE,IAAI,EAAE,IAAI,CAAC,IAAI;oCACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;oCACvB,SAAS,EAAE,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC;oCACpC,SAAS,EAAE,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC;oCACpC,KAAK,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;iCAC5E;gCACH,CAAC,CAAC,IAAI;yBACT;wBACH,CAAC,CAAC,IAAI;iBACT,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YAED,WAAW,CAAC,uBAAuB,CAAC,CAAC;YAErC,0BAA0B;YAC1B,SAAS,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC;YAC3D,YAAY,EAAE,CAAC;YAEf,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC7B,KAAK,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;oBAChC,MAAM,UAAU,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;oBACtD,aAAa,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,KAAK,MAAM,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;oBAClG,IAAI,UAAU,GAAG,MAAM,EAAE,CAAC;wBACxB,MAAM,QAAQ,GAAG,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;wBACzF,MAAM,UAAU,GAAG,UAAU,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,UAAU,GAAG,EAAE,CAAC,CAAC;wBAC5G,SAAS,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,QAAQ,WAAW,UAAU,QAAQ,CAAC,CAAC,CAAC;oBACnE,CAAC;gBACH,CAAC;gBACD,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC7B,UAAU,EAAE,CAAC;oBACb,aAAa,CAAC,aAAa,EAAE,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC;gBACtD,CAAC;YACH,CAAC;iBAAM,IAAI,SAAS,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC7C,MAAM,MAAM,GAAG,CAAC,GAAG,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBAChF,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;oBACvB,aAAa,CAAC,CAAC,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;gBACzE,CAAC;gBACD,MAAM,OAAO,GAAG,GAAG,CAAC;gBACpB,MAAM,KAAK,GAAG,CAAC,OAAO,GAAG,WAAW,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;gBAClD,MAAM,OAAO,GAAG,KAAK,GAAG,EAAE,CAAC;gBAC3B,SAAS,CAAC,EAAE,CAAC,GAAG,CAAC,aAAa,OAAO,QAAQ,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;gBACtG,UAAU,EAAE,CAAC;gBACb,SAAS,CAAC,qDAAqD,CAAC,CAAC;YACnE,CAAC;iBAAM,IAAI,OAAO,EAAE,CAAC;gBACnB,SAAS,CAAC,qDAAqD,CAAC,CAAC;YACnE,CAAC;iBAAM,CAAC;gBACN,SAAS,CAAC,0BAA0B,CAAC,CAAC;YACxC,CAAC;YAED,mCAAmC;YACnC,IAAI,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAClC,UAAU,EAAE,CAAC;gBACb,SAAS,CAAC,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC;gBAC/D,YAAY,EAAE,CAAC;gBAEf,IAAI,gBAAgB,GAAG,CAAC,CAAC;gBACzB,KAAK,MAAM,GAAG,IAAI,kBAAkB,EAAE,CAAC;oBACrC,MAAM,UAAU,GAAG,CAAC,GAAG,CAAC,YAAY,GAAG,CAAC,GAAG,CAAC,UAAU,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;oBAC1E,MAAM,MAAM,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;oBACtE,aAAa,CACX,GAAG,GAAG,CAAC,KAAK,QAAQ,GAAG,CAAC,eAAe,IAAI,SAAS,EAAE,EACtD,GAAG,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC,KAAK,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,OAAO,MAAM,MAAM,CAC9F,CAAC;oBACF,IAAI,UAAU,GAAG,MAAM,EAAE,CAAC;wBACxB,MAAM,QAAQ,GAAG,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;wBACzF,MAAM,UAAU,GAAG,UAAU,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,UAAU,GAAG,EAAE,CAAC,CAAC;wBAC5G,SAAS,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,QAAQ,WAAW,UAAU,QAAQ,CAAC,CAAC,CAAC;oBACnE,CAAC;oBACD,gBAAgB,IAAI,GAAG,CAAC,YAAY,CAAC;gBACvC,CAAC;gBAED,IAAI,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAClC,UAAU,EAAE,CAAC;oBACb,aAAa,CAAC,eAAe,EAAE,SAAS,CAAC,gBAAgB,CAAC,CAAC,CAAC;gBAC9D,CAAC;YACH,CAAC;YAED,UAAU,EAAE,CAAC;YAEb,2BAA2B;YAC3B,SAAS,CAAC,EAAE,CAAC,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC,CAAC;YAC1E,YAAY,EAAE,CAAC;YAEf,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAChC,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC7E,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;gBACxE,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;gBAEhC,aAAa,CAAC,QAAQ,EAAE,GAAG,MAAM,CAAC,MAAM,YAAY,CAAC,CAAC;gBACtD,aAAa,CAAC,aAAa,EAAE,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC;gBACtE,aAAa,CAAC,cAAc,EAAE,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;gBAE5D,IAAI,IAAI,EAAE,CAAC;oBACT,MAAM,KAAK,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;oBAC3E,aAAa,CAAC,aAAa,EAAE,GAAG,IAAI,CAAC,IAAI,MAAM,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc,KAAK,UAAU,CAAC,CAAC;gBACpH,CAAC;YACH,CAAC;iBAAM,IAAI,MAAM,EAAE,CAAC;gBAClB,SAAS,CAAC,8BAA8B,CAAC,CAAC;YAC5C,CAAC;iBAAM,CAAC;gBACN,SAAS,CAAC,2BAA2B,CAAC,CAAC;YACzC,CAAC;YAED,UAAU,EAAE,CAAC;YAEb,wBAAwB;YACxB,SAAS,CAAC,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;YACpC,YAAY,EAAE,CAAC;YACf,SAAS,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,6BAA6B,CAAC,iCAAiC,CAAC,CAAC;YACvF,SAAS,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,2BAA2B,CAAC,gCAAgC,CAAC,CAAC;YACpF,SAAS,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,qBAAqB,CAAC,sCAAsC,CAAC,CAAC;YACpF,SAAS,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,4BAA4B,CAAC,wBAAwB,CAAC,CAAC;YAC7E,UAAU,EAAE,CAAC;QACf,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,WAAW,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerEarnings(program: Command): void;
3
+ //# sourceMappingURL=earnings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"earnings.d.ts","sourceRoot":"","sources":["../../src/commands/earnings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMzC,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,QAoChD"}
@@ -0,0 +1,38 @@
1
+ import pc from 'picocolors';
2
+ import { T2000, formatUsd } from '@t2000/sdk';
3
+ import { resolvePin } from '../prompts.js';
4
+ import { printKeyValue, printBlank, printJson, isJsonMode, handleError, printLine } from '../output.js';
5
+ export function registerEarnings(program) {
6
+ program
7
+ .command('earnings')
8
+ .description('Show yield earned to date')
9
+ .option('--key <path>', 'Key file path')
10
+ .action(async (opts) => {
11
+ try {
12
+ const pin = await resolvePin();
13
+ const agent = await T2000.create({ pin, keyPath: opts.key });
14
+ const result = await agent.earnings();
15
+ const pos = await agent.positions();
16
+ const savePositions = pos.positions.filter((p) => p.type === 'save');
17
+ if (isJsonMode()) {
18
+ printJson({ ...result, positions: savePositions });
19
+ return;
20
+ }
21
+ printBlank();
22
+ printKeyValue('Total Saved', formatUsd(result.supplied));
23
+ if (savePositions.length > 0) {
24
+ for (const p of savePositions) {
25
+ printLine(` ${pc.dim('•')} ${formatUsd(p.amount)} ${p.asset} on ${p.protocol} @ ${p.apy.toFixed(2)}% APY`);
26
+ }
27
+ }
28
+ printKeyValue('Blended APY', `${result.currentApy.toFixed(2)}%`);
29
+ printKeyValue('Daily Yield', `~${formatUsd(result.dailyEarning)}/day`);
30
+ printKeyValue('Est. Earned', `~${formatUsd(result.totalYieldEarned)}`);
31
+ printBlank();
32
+ }
33
+ catch (error) {
34
+ handleError(error);
35
+ }
36
+ });
37
+ }
38
+ //# sourceMappingURL=earnings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"earnings.js","sourceRoot":"","sources":["../../src/commands/earnings.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAExG,MAAM,UAAU,gBAAgB,CAAC,OAAgB;IAC/C,OAAO;SACJ,OAAO,CAAC,UAAU,CAAC;SACnB,WAAW,CAAC,2BAA2B,CAAC;SACxC,MAAM,CAAC,cAAc,EAAE,eAAe,CAAC;SACvC,MAAM,CAAC,KAAK,EAAE,IAAsB,EAAE,EAAE;QACvC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,UAAU,EAAE,CAAC;YAC/B,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;YAE7D,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,QAAQ,EAAE,CAAC;YACtC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,SAAS,EAAE,CAAC;YACpC,MAAM,aAAa,GAAG,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;YAErE,IAAI,UAAU,EAAE,EAAE,CAAC;gBACjB,SAAS,CAAC,EAAE,GAAG,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC,CAAC;gBACnD,OAAO;YACT,CAAC;YAED,UAAU,EAAE,CAAC;YACb,aAAa,CAAC,aAAa,EAAE,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;YAEzD,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC7B,KAAK,MAAM,CAAC,IAAI,aAAa,EAAE,CAAC;oBAC9B,SAAS,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,QAAQ,MAAM,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;gBAC9G,CAAC;YACH,CAAC;YAED,aAAa,CAAC,aAAa,EAAE,GAAG,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YACjE,aAAa,CAAC,aAAa,EAAE,IAAI,SAAS,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;YACvE,aAAa,CAAC,aAAa,EAAE,IAAI,SAAS,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;YACvE,UAAU,EAAE,CAAC;QACf,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,WAAW,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerExchange(program: Command): void;
3
+ //# sourceMappingURL=exchange.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exchange.d.ts","sourceRoot":"","sources":["../../src/commands/exchange.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKzC,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,QA6ChD"}
@@ -0,0 +1,45 @@
1
+ import { T2000, formatUsd, SUPPORTED_ASSETS } from '@t2000/sdk';
2
+ import { resolvePin } from '../prompts.js';
3
+ import { printSuccess, printKeyValue, printBlank, printJson, isJsonMode, handleError, explorerUrl } from '../output.js';
4
+ export function registerExchange(program) {
5
+ program
6
+ .command('exchange <amount> <from> <to>')
7
+ .description('Exchange between tokens (e.g. USDC ⇌ SUI) via Cetus DEX')
8
+ .option('--key <path>', 'Key file path')
9
+ .option('--slippage <pct>', 'Max slippage percentage (default: 3)', '3')
10
+ .action(async (amount, from, to, opts) => {
11
+ try {
12
+ const pin = await resolvePin();
13
+ const agent = await T2000.create({ pin, keyPath: opts.key });
14
+ const fromAsset = from.toUpperCase();
15
+ const toAsset = to.toUpperCase();
16
+ const parsedAmount = parseFloat(amount);
17
+ if (isNaN(parsedAmount) || parsedAmount <= 0) {
18
+ throw new Error('Amount must be a positive number');
19
+ }
20
+ const result = await agent.exchange({
21
+ from: fromAsset,
22
+ to: toAsset,
23
+ amount: parsedAmount,
24
+ maxSlippage: parseFloat(opts.slippage ?? '3'),
25
+ });
26
+ if (isJsonMode()) {
27
+ printJson(result);
28
+ return;
29
+ }
30
+ const fromDisplay = SUPPORTED_ASSETS[fromAsset]?.displayName ?? fromAsset;
31
+ const toDisplay = SUPPORTED_ASSETS[toAsset]?.displayName ?? toAsset;
32
+ const toDecimals = toAsset === 'SUI' ? 4 : 2;
33
+ printBlank();
34
+ const fromStr = ['USDC', 'USDT', 'USDE'].includes(fromAsset) ? formatUsd(parsedAmount) : parsedAmount.toFixed(4);
35
+ printSuccess(`Exchanged ${fromStr} ${fromDisplay} → ${result.toAmount.toFixed(toDecimals)} ${toDisplay}`);
36
+ printKeyValue('Tx', explorerUrl(result.tx));
37
+ printKeyValue('Gas', `${result.gasCost.toFixed(4)} SUI (${result.gasMethod})`);
38
+ printBlank();
39
+ }
40
+ catch (error) {
41
+ handleError(error);
42
+ }
43
+ });
44
+ }
45
+ //# sourceMappingURL=exchange.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exchange.js","sourceRoot":"","sources":["../../src/commands/exchange.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAExH,MAAM,UAAU,gBAAgB,CAAC,OAAgB;IAC/C,OAAO;SACJ,OAAO,CAAC,+BAA+B,CAAC;SACxC,WAAW,CAAC,yDAAyD,CAAC;SACtE,MAAM,CAAC,cAAc,EAAE,eAAe,CAAC;SACvC,MAAM,CAAC,kBAAkB,EAAE,sCAAsC,EAAE,GAAG,CAAC;SACvE,MAAM,CAAC,KAAK,EAAE,MAAc,EAAE,IAAY,EAAE,EAAU,EAAE,IAAyC,EAAE,EAAE;QACpG,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,UAAU,EAAE,CAAC;YAC/B,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;YAE7D,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;YACrC,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC;YACjC,MAAM,YAAY,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;YAExC,IAAI,KAAK,CAAC,YAAY,CAAC,IAAI,YAAY,IAAI,CAAC,EAAE,CAAC;gBAC7C,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;YACtD,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC;gBAClC,IAAI,EAAE,SAAS;gBACf,EAAE,EAAE,OAAO;gBACX,MAAM,EAAE,YAAY;gBACpB,WAAW,EAAE,UAAU,CAAC,IAAI,CAAC,QAAQ,IAAI,GAAG,CAAC;aAC9C,CAAC,CAAC;YAEH,IAAI,UAAU,EAAE,EAAE,CAAC;gBACjB,SAAS,CAAC,MAAM,CAAC,CAAC;gBAClB,OAAO;YACT,CAAC;YAED,MAAM,WAAW,GAAG,gBAAgB,CAAC,SAA0C,CAAC,EAAE,WAAW,IAAI,SAAS,CAAC;YAC3G,MAAM,SAAS,GAAG,gBAAgB,CAAC,OAAwC,CAAC,EAAE,WAAW,IAAI,OAAO,CAAC;YACrG,MAAM,UAAU,GAAG,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAE7C,UAAU,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACjH,YAAY,CAAC,aAAa,OAAO,IAAI,WAAW,MAAM,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,SAAS,EAAE,CAAC,CAAC;YAC1G,aAAa,CAAC,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;YAC5C,aAAa,CAAC,KAAK,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,MAAM,CAAC,SAAS,GAAG,CAAC,CAAC;YAC/E,UAAU,EAAE,CAAC;QACf,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,WAAW,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerExport(program: Command): void;
3
+ //# sourceMappingURL=exportKey.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exportKey.d.ts","sourceRoot":"","sources":["../../src/commands/exportKey.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA+BzC,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,QA8D9C"}
@@ -0,0 +1,81 @@
1
+ import { readFile, writeFile, mkdir } from 'node:fs/promises';
2
+ import { resolve } from 'node:path';
3
+ import { homedir } from 'node:os';
4
+ import { T2000 } from '@t2000/sdk';
5
+ import { resolvePin, askConfirm } from '../prompts.js';
6
+ import { printSuccess, printBlank, printInfo, printJson, isJsonMode, handleError, printError } from '../output.js';
7
+ const LOCKFILE = resolve(homedir(), '.t2000', '.pin-lock');
8
+ const MAX_ATTEMPTS = 5;
9
+ const LOCKOUT_MS = 5 * 60 * 1000;
10
+ async function getLockState() {
11
+ try {
12
+ const data = JSON.parse(await readFile(LOCKFILE, 'utf-8'));
13
+ return data;
14
+ }
15
+ catch {
16
+ return { attempts: 0, lockedUntil: 0 };
17
+ }
18
+ }
19
+ async function setLockState(state) {
20
+ await mkdir(resolve(homedir(), '.t2000'), { recursive: true });
21
+ await writeFile(LOCKFILE, JSON.stringify(state), { mode: 0o600 });
22
+ }
23
+ export function registerExport(program) {
24
+ program
25
+ .command('export')
26
+ .description('Export private key (raw Ed25519 hex)')
27
+ .option('--key <path>', 'Key file path')
28
+ .option('--yes', 'Skip confirmation')
29
+ .action(async (opts) => {
30
+ try {
31
+ const lock = await getLockState();
32
+ if (lock.lockedUntil > Date.now()) {
33
+ const remainSec = Math.ceil((lock.lockedUntil - Date.now()) / 1000);
34
+ printError(`Too many failed PIN attempts. Try again in ${remainSec}s.`);
35
+ return;
36
+ }
37
+ if (!opts.yes && !isJsonMode()) {
38
+ const proceed = await askConfirm('WARNING: This will display your raw private key. Anyone with this key controls your wallet. Continue?');
39
+ if (!proceed)
40
+ return;
41
+ }
42
+ const pin = await resolvePin();
43
+ let agent;
44
+ try {
45
+ agent = await T2000.create({ pin, keyPath: opts.key });
46
+ }
47
+ catch (error) {
48
+ const msg = error instanceof Error ? error.message : '';
49
+ if (msg.includes('Invalid PIN')) {
50
+ const newAttempts = lock.attempts + 1;
51
+ if (newAttempts >= MAX_ATTEMPTS) {
52
+ await setLockState({ attempts: newAttempts, lockedUntil: Date.now() + LOCKOUT_MS });
53
+ printError(`Invalid PIN. Account locked for 5 minutes (${newAttempts} failed attempts).`);
54
+ }
55
+ else {
56
+ await setLockState({ attempts: newAttempts, lockedUntil: 0 });
57
+ printError(`Invalid PIN. ${MAX_ATTEMPTS - newAttempts} attempts remaining.`);
58
+ }
59
+ return;
60
+ }
61
+ throw error;
62
+ }
63
+ await setLockState({ attempts: 0, lockedUntil: 0 });
64
+ const hex = agent.exportKey();
65
+ if (isJsonMode()) {
66
+ printJson({ privateKey: hex, format: 'ed25519_hex' });
67
+ return;
68
+ }
69
+ printBlank();
70
+ printSuccess('Private key (Ed25519, hex):');
71
+ console.log(` ${hex}`);
72
+ printBlank();
73
+ printInfo('Not a BIP39 mnemonic. Store securely and never share.');
74
+ printBlank();
75
+ }
76
+ catch (error) {
77
+ handleError(error);
78
+ }
79
+ });
80
+ }
81
+ //# sourceMappingURL=exportKey.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exportKey.js","sourceRoot":"","sources":["../../src/commands/exportKey.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerFundStatus(program: Command): void;
3
+ //# sourceMappingURL=fundStatus.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fundStatus.d.ts","sourceRoot":"","sources":["../../src/commands/fundStatus.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMzC,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,QA+ClD"}
@@ -0,0 +1,50 @@
1
+ import pc from 'picocolors';
2
+ import { T2000, formatUsd } from '@t2000/sdk';
3
+ import { resolvePin } from '../prompts.js';
4
+ import { printSuccess, printKeyValue, printBlank, printJson, isJsonMode, handleError, printInfo, printLine } from '../output.js';
5
+ export function registerFundStatus(program) {
6
+ program
7
+ .command('fund-status')
8
+ .description('Full savings summary')
9
+ .option('--key <path>', 'Key file path')
10
+ .action(async (opts) => {
11
+ try {
12
+ const pin = await resolvePin();
13
+ const agent = await T2000.create({ pin, keyPath: opts.key });
14
+ const result = await agent.fundStatus();
15
+ const pos = await agent.positions();
16
+ const savePositions = pos.positions.filter((p) => p.type === 'save');
17
+ if (isJsonMode()) {
18
+ printJson({ ...result, positions: savePositions });
19
+ return;
20
+ }
21
+ printBlank();
22
+ if (result.supplied > 0) {
23
+ printSuccess('Savings: ACTIVE');
24
+ }
25
+ else {
26
+ printInfo('Savings: INACTIVE — run `t2000 save <amount>` to start earning');
27
+ }
28
+ printBlank();
29
+ printKeyValue('Total Saved', formatUsd(result.supplied));
30
+ if (savePositions.length > 0) {
31
+ for (const p of savePositions) {
32
+ printLine(` ${pc.dim('•')} ${formatUsd(p.amount)} ${p.asset} on ${p.protocol} @ ${p.apy.toFixed(2)}% APY`);
33
+ }
34
+ }
35
+ printKeyValue('Blended APY', `${result.apy.toFixed(2)}%`);
36
+ printKeyValue('Earned today', `~${formatUsd(result.earnedToday)}`);
37
+ printKeyValue('Earned all time', `~${formatUsd(result.earnedAllTime)}`);
38
+ printKeyValue('Monthly projected', `~${formatUsd(result.projectedMonthly)}/month`);
39
+ printBlank();
40
+ if (result.supplied > 0) {
41
+ printInfo('Withdraw anytime: t2000 withdraw <amount>');
42
+ }
43
+ printBlank();
44
+ }
45
+ catch (error) {
46
+ handleError(error);
47
+ }
48
+ });
49
+ }
50
+ //# sourceMappingURL=fundStatus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fundStatus.js","sourceRoot":"","sources":["../../src/commands/fundStatus.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerHealth(program: Command): void;
3
+ //# sourceMappingURL=health.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../src/commands/health.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKzC,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,QAwC9C"}
@@ -0,0 +1,44 @@
1
+ import { T2000, formatUsd } from '@t2000/sdk';
2
+ import { resolvePin } from '../prompts.js';
3
+ import { printKeyValue, printBlank, printJson, isJsonMode, handleError, printSuccess, printWarning, printError } from '../output.js';
4
+ export function registerHealth(program) {
5
+ program
6
+ .command('health')
7
+ .description('Check savings health factor')
8
+ .option('--key <path>', 'Key file path')
9
+ .action(async (opts) => {
10
+ try {
11
+ const pin = await resolvePin();
12
+ const agent = await T2000.create({ pin, keyPath: opts.key });
13
+ const hf = await agent.healthFactor();
14
+ if (isJsonMode()) {
15
+ printJson(hf);
16
+ return;
17
+ }
18
+ printBlank();
19
+ const noActiveLoan = hf.borrowed < 0.01;
20
+ const hfStr = (hf.healthFactor === Infinity || noActiveLoan) ? '∞' : hf.healthFactor.toFixed(2);
21
+ if (hf.healthFactor >= 2.0) {
22
+ printSuccess(`Health Factor: ${hfStr} (healthy)`);
23
+ }
24
+ else if (hf.healthFactor >= 1.5) {
25
+ printWarning(`Health Factor: ${hfStr} (moderate)`);
26
+ }
27
+ else if (hf.healthFactor >= 1.2) {
28
+ printWarning(`Health Factor: ${hfStr} (low)`);
29
+ }
30
+ else {
31
+ printError(`Health Factor: ${hfStr} (CRITICAL)`);
32
+ }
33
+ printBlank();
34
+ printKeyValue('Supplied', `${formatUsd(hf.supplied)} USDC`);
35
+ printKeyValue('Borrowed', `${formatUsd(hf.borrowed)} USDC`);
36
+ printKeyValue('Max Borrow', `${formatUsd(hf.maxBorrow)} USDC`);
37
+ printBlank();
38
+ }
39
+ catch (error) {
40
+ handleError(error);
41
+ }
42
+ });
43
+ }
44
+ //# sourceMappingURL=health.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.js","sourceRoot":"","sources":["../../src/commands/health.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAErI,MAAM,UAAU,cAAc,CAAC,OAAgB;IAC7C,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,6BAA6B,CAAC;SAC1C,MAAM,CAAC,cAAc,EAAE,eAAe,CAAC;SACvC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,UAAU,EAAE,CAAC;YAC/B,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;YAE7D,MAAM,EAAE,GAAG,MAAM,KAAK,CAAC,YAAY,EAAE,CAAC;YAEtC,IAAI,UAAU,EAAE,EAAE,CAAC;gBACjB,SAAS,CAAC,EAAE,CAAC,CAAC;gBACd,OAAO;YACT,CAAC;YAED,UAAU,EAAE,CAAC;YAEb,MAAM,YAAY,GAAG,EAAE,CAAC,QAAQ,GAAG,IAAI,CAAC;YACxC,MAAM,KAAK,GAAG,CAAC,EAAE,CAAC,YAAY,KAAK,QAAQ,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAChG,IAAI,EAAE,CAAC,YAAY,IAAI,GAAG,EAAE,CAAC;gBAC3B,YAAY,CAAC,kBAAkB,KAAK,YAAY,CAAC,CAAC;YACpD,CAAC;iBAAM,IAAI,EAAE,CAAC,YAAY,IAAI,GAAG,EAAE,CAAC;gBAClC,YAAY,CAAC,kBAAkB,KAAK,aAAa,CAAC,CAAC;YACrD,CAAC;iBAAM,IAAI,EAAE,CAAC,YAAY,IAAI,GAAG,EAAE,CAAC;gBAClC,YAAY,CAAC,kBAAkB,KAAK,QAAQ,CAAC,CAAC;YAChD,CAAC;iBAAM,CAAC;gBACN,UAAU,CAAC,kBAAkB,KAAK,aAAa,CAAC,CAAC;YACnD,CAAC;YAED,UAAU,EAAE,CAAC;YACb,aAAa,CAAC,UAAU,EAAE,GAAG,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAC5D,aAAa,CAAC,UAAU,EAAE,GAAG,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAC5D,aAAa,CAAC,YAAY,EAAE,GAAG,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YAC/D,UAAU,EAAE,CAAC;QACf,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,WAAW,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerHistory(program: Command): void;
3
+ //# sourceMappingURL=history.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../../src/commands/history.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKzC,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,QAmC/C"}
@@ -0,0 +1,37 @@
1
+ import { T2000, truncateAddress } from '@t2000/sdk';
2
+ import { resolvePin } from '../prompts.js';
3
+ import { printHeader, printBlank, printJson, isJsonMode, handleError, printLine, printInfo } from '../output.js';
4
+ export function registerHistory(program) {
5
+ program
6
+ .command('history')
7
+ .description('Show transaction history')
8
+ .option('--limit <n>', 'Number of transactions', '20')
9
+ .option('--key <path>', 'Key file path')
10
+ .action(async (opts) => {
11
+ try {
12
+ const pin = await resolvePin();
13
+ const agent = await T2000.create({ pin, keyPath: opts.key });
14
+ const txns = await agent.history({ limit: parseInt(opts.limit, 10) });
15
+ if (isJsonMode()) {
16
+ printJson(txns);
17
+ return;
18
+ }
19
+ printHeader('Transaction History');
20
+ if (txns.length === 0) {
21
+ printInfo('No transactions yet.');
22
+ }
23
+ else {
24
+ for (const tx of txns) {
25
+ const time = tx.timestamp ? new Date(tx.timestamp).toLocaleString() : 'unknown';
26
+ const gas = tx.gasMethod ? ` (${tx.gasMethod})` : '';
27
+ printLine(`${truncateAddress(tx.digest)} ${tx.action}${gas} ${time}`);
28
+ }
29
+ }
30
+ printBlank();
31
+ }
32
+ catch (error) {
33
+ handleError(error);
34
+ }
35
+ });
36
+ }
37
+ //# sourceMappingURL=history.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history.js","sourceRoot":"","sources":["../../src/commands/history.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEjH,MAAM,UAAU,eAAe,CAAC,OAAgB;IAC9C,OAAO;SACJ,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,0BAA0B,CAAC;SACvC,MAAM,CAAC,aAAa,EAAE,wBAAwB,EAAE,IAAI,CAAC;SACrD,MAAM,CAAC,cAAc,EAAE,eAAe,CAAC;SACvC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,UAAU,EAAE,CAAC;YAC/B,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;YAE7D,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;YAEtE,IAAI,UAAU,EAAE,EAAE,CAAC;gBACjB,SAAS,CAAC,IAAI,CAAC,CAAC;gBAChB,OAAO;YACT,CAAC;YAED,WAAW,CAAC,qBAAqB,CAAC,CAAC;YAEnC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACtB,SAAS,CAAC,sBAAsB,CAAC,CAAC;YACpC,CAAC;iBAAM,CAAC;gBACN,KAAK,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC;oBACtB,MAAM,IAAI,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;oBAChF,MAAM,GAAG,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;oBACrD,SAAS,CAAC,GAAG,eAAe,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,MAAM,GAAG,GAAG,KAAK,IAAI,EAAE,CAAC,CAAC;gBAC1E,CAAC;YACH,CAAC;YAED,UAAU,EAAE,CAAC;QACf,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,WAAW,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerImport(program: Command): void;
3
+ //# sourceMappingURL=importKey.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"importKey.d.ts","sourceRoot":"","sources":["../../src/commands/importKey.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMzC,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,QAmC9C"}