@antseed/ants 0.1.1
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/LICENSE +674 -0
- package/dist/ants-web/assets/index-BunPfgXh.css +1 -0
- package/dist/ants-web/assets/index-zCPoF694.js +40 -0
- package/dist/ants-web/index.html +13 -0
- package/dist/api-types.d.ts +400 -0
- package/dist/api-types.js +8 -0
- package/dist/api-types.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/jobs.d.ts +23 -0
- package/dist/jobs.js +70 -0
- package/dist/jobs.js.map +1 -0
- package/dist/routes.d.ts +12 -0
- package/dist/routes.js +64 -0
- package/dist/routes.js.map +1 -0
- package/dist/server.d.ts +29 -0
- package/dist/server.js +90 -0
- package/dist/server.js.map +1 -0
- package/dist/service/context.d.ts +146 -0
- package/dist/service/context.js +321 -0
- package/dist/service/context.js.map +1 -0
- package/dist/service/emissions.d.ts +3 -0
- package/dist/service/emissions.js +62 -0
- package/dist/service/emissions.js.map +1 -0
- package/dist/service/explorer.d.ts +9 -0
- package/dist/service/explorer.js +44 -0
- package/dist/service/explorer.js.map +1 -0
- package/dist/service/format.d.ts +8 -0
- package/dist/service/format.js +41 -0
- package/dist/service/format.js.map +1 -0
- package/dist/service/index.d.ts +20 -0
- package/dist/service/index.js +15 -0
- package/dist/service/index.js.map +1 -0
- package/dist/service/indexer.d.ts +150 -0
- package/dist/service/indexer.js +189 -0
- package/dist/service/indexer.js.map +1 -0
- package/dist/service/json.d.ts +3 -0
- package/dist/service/json.js +8 -0
- package/dist/service/json.js.map +1 -0
- package/dist/service/overview.d.ts +9 -0
- package/dist/service/overview.js +98 -0
- package/dist/service/overview.js.map +1 -0
- package/dist/service/pool-merge.d.ts +26 -0
- package/dist/service/pool-merge.js +101 -0
- package/dist/service/pool-merge.js.map +1 -0
- package/dist/service/pools.d.ts +12 -0
- package/dist/service/pools.js +287 -0
- package/dist/service/pools.js.map +1 -0
- package/dist/service/positions.d.ts +62 -0
- package/dist/service/positions.js +281 -0
- package/dist/service/positions.js.map +1 -0
- package/dist/service/rate-limit.d.ts +17 -0
- package/dist/service/rate-limit.js +42 -0
- package/dist/service/rate-limit.js.map +1 -0
- package/dist/service/rewards.d.ts +46 -0
- package/dist/service/rewards.js +399 -0
- package/dist/service/rewards.js.map +1 -0
- package/dist/service/rpc-provider.d.ts +31 -0
- package/dist/service/rpc-provider.js +99 -0
- package/dist/service/rpc-provider.js.map +1 -0
- package/dist/service/seller.d.ts +14 -0
- package/dist/service/seller.js +104 -0
- package/dist/service/seller.js.map +1 -0
- package/dist/service/steps.d.ts +6 -0
- package/dist/service/steps.js +24 -0
- package/dist/service/steps.js.map +1 -0
- package/dist/service/usage.d.ts +10 -0
- package/dist/service/usage.js +77 -0
- package/dist/service/usage.js.map +1 -0
- package/dist/service/verification.d.ts +12 -0
- package/dist/service/verification.js +69 -0
- package/dist/service/verification.js.map +1 -0
- package/dist/view-cache.d.ts +18 -0
- package/dist/view-cache.js +39 -0
- package/dist/view-cache.js.map +1 -0
- package/package.json +44 -0
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
import { estimateEarlyExit, positionState, projectedEarlyExitSlashBps } from '@antseed/node/payments';
|
|
2
|
+
import { parseAnts, formatAnts } from './format.js';
|
|
3
|
+
import { toJson } from './json.js';
|
|
4
|
+
import { IndexerError } from './indexer.js';
|
|
5
|
+
import { assertAgentId, assertEpochs, assertPositiveIds, silentReporter } from './steps.js';
|
|
6
|
+
async function safe(read, fallback) {
|
|
7
|
+
try {
|
|
8
|
+
return await read();
|
|
9
|
+
}
|
|
10
|
+
catch {
|
|
11
|
+
return fallback;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
async function describePositions(ctx, positions, currentEpoch, config) {
|
|
15
|
+
const pools = ctx.requirePools();
|
|
16
|
+
const poolRewards = ctx.poolRewards();
|
|
17
|
+
// Closed positions keep the reward earned up to their close epoch, so every id is previewed.
|
|
18
|
+
const rewardIds = positions.map((position) => position.id);
|
|
19
|
+
const rewards = new Map();
|
|
20
|
+
if (poolRewards && rewardIds.length > 0) {
|
|
21
|
+
const amounts = await safe(() => poolRewards.previewStakerRewards(rewardIds), rewardIds.map(() => 0n));
|
|
22
|
+
rewardIds.forEach((id, index) => rewards.set(id, amounts[index] ?? 0n));
|
|
23
|
+
}
|
|
24
|
+
const details = [];
|
|
25
|
+
for (let offset = 0; offset < positions.length; offset += 8) {
|
|
26
|
+
details.push(...await Promise.all(positions.slice(offset, offset + 8).map(async (position) => {
|
|
27
|
+
const open = !position.withdrawn && position.closedAtEpoch === 0;
|
|
28
|
+
const [withdrawableEpoch, maxLocked] = await Promise.all([
|
|
29
|
+
safe(() => pools.positionWithdrawableEpoch(position.id), 0),
|
|
30
|
+
open ? safe(() => pools.isMaxLocked(position.id, Math.max(currentEpoch, position.stakeStartEpoch)), false) : Promise.resolve(false),
|
|
31
|
+
]);
|
|
32
|
+
const changePending = currentEpoch < withdrawableEpoch;
|
|
33
|
+
const slashBps = open && !changePending ? await safe(() => pools.earlyExitSlashBps(position.id), null) : null;
|
|
34
|
+
const projectedSlashBps = open ? projectedEarlyExitSlashBps(position, currentEpoch, config, maxLocked) : 0;
|
|
35
|
+
const estimate = estimateEarlyExit(position, slashBps ?? projectedSlashBps);
|
|
36
|
+
return {
|
|
37
|
+
id: position.id,
|
|
38
|
+
agentId: position.agentId,
|
|
39
|
+
owner: position.owner,
|
|
40
|
+
amount: position.amount.toString(),
|
|
41
|
+
weightAmount: position.weightAmount.toString(),
|
|
42
|
+
stakeStartEpoch: position.stakeStartEpoch,
|
|
43
|
+
stakeEndEpoch: position.stakeEndEpoch,
|
|
44
|
+
closedAtEpoch: position.closedAtEpoch,
|
|
45
|
+
withdrawn: position.withdrawn,
|
|
46
|
+
state: positionState(position, currentEpoch),
|
|
47
|
+
withdrawableEpoch,
|
|
48
|
+
changePending,
|
|
49
|
+
maxLocked,
|
|
50
|
+
slashBps,
|
|
51
|
+
projectedSlashBps,
|
|
52
|
+
slashedAmount: open ? estimate.slashedAmount.toString() : '0',
|
|
53
|
+
returnedAmount: open ? estimate.returnedAmount.toString() : '0',
|
|
54
|
+
pendingReward: (rewards.get(position.id) ?? 0n).toString(),
|
|
55
|
+
epochsRemaining: open ? Math.max(0, position.stakeEndEpoch - Math.max(currentEpoch, position.stakeStartEpoch)) : 0,
|
|
56
|
+
raw: position,
|
|
57
|
+
};
|
|
58
|
+
})));
|
|
59
|
+
}
|
|
60
|
+
return details.sort((a, b) => b.id - a.id);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Ids of this wallet's positions that left the on-chain enumeration (split,
|
|
64
|
+
* merge, move sources; withdrawals), as the indexer knows them. Empty without
|
|
65
|
+
* an indexer; never reconstructed from log scans.
|
|
66
|
+
*/
|
|
67
|
+
export async function closedPositionIds(ctx) {
|
|
68
|
+
const indexer = ctx.indexer();
|
|
69
|
+
if (!indexer)
|
|
70
|
+
return { ids: [], source: 'chain', rows: [] };
|
|
71
|
+
try {
|
|
72
|
+
const rows = (await indexer.positions(ctx.address, true)).filter((row) => row.closedAtEpoch !== 0 || row.withdrawn);
|
|
73
|
+
return { ids: rows.map((row) => row.id), source: 'indexer', rows };
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
if (error instanceof IndexerError)
|
|
77
|
+
return { ids: [], source: 'chain', rows: [] };
|
|
78
|
+
throw error;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* The wallet's open positions from the on-chain `stakerPositionIds`
|
|
83
|
+
* enumeration, plus its closed positions from the indexer (with the reward
|
|
84
|
+
* still pending on them read live). The chain is never scanned for history.
|
|
85
|
+
*/
|
|
86
|
+
export async function positions(ctx) {
|
|
87
|
+
const stack = await ctx.stack();
|
|
88
|
+
const pools = ctx.requirePools();
|
|
89
|
+
const config = await pools.poolConfig();
|
|
90
|
+
const [openIds, closed] = await Promise.all([pools.allStakerPositionIds(ctx.address), closedPositionIds(ctx)]);
|
|
91
|
+
const list = await pools.positionsBatch([...new Set([...openIds, ...closed.ids])]);
|
|
92
|
+
const details = await describePositions(ctx, list, stack.currentEpoch, config);
|
|
93
|
+
const closedById = new Map(closed.rows.map((row) => [row.id, row]));
|
|
94
|
+
const activeStake = details.filter((position) => position.state === 'active' || position.state === 'matured').reduce((sum, position) => sum + BigInt(position.amount), 0n);
|
|
95
|
+
const pendingRewards = details.reduce((sum, position) => sum + BigInt(position.pendingReward), 0n);
|
|
96
|
+
return toJson({
|
|
97
|
+
currentEpoch: stack.currentEpoch,
|
|
98
|
+
config,
|
|
99
|
+
positions: details.map(({ raw: _raw, ...view }) => {
|
|
100
|
+
const meta = closedById.get(view.id);
|
|
101
|
+
return meta ? { ...view, closedBy: meta.closedBy, replacementIds: meta.replacementIds } : view;
|
|
102
|
+
}),
|
|
103
|
+
totals: { activeStake: activeStake.toString(), pendingRewards: pendingRewards.toString(), open: details.filter((position) => !position.withdrawn && position.closedAtEpoch === 0).length },
|
|
104
|
+
historySource: closed.source,
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
async function ownedOpenPositions(ctx, ids) {
|
|
108
|
+
const pools = ctx.requirePools();
|
|
109
|
+
const list = await pools.positionsBatch(ids);
|
|
110
|
+
const foreign = list.filter((position) => position.owner.toLowerCase() !== ctx.address.toLowerCase());
|
|
111
|
+
if (foreign.length > 0)
|
|
112
|
+
throw new Error(`Position(s) ${foreign.map((position) => position.id).join(', ')} are not owned by this wallet.`);
|
|
113
|
+
const closed = list.filter((position) => position.withdrawn || position.closedAtEpoch !== 0);
|
|
114
|
+
if (closed.length > 0)
|
|
115
|
+
throw new Error(`Position(s) ${closed.map((position) => position.id).join(', ')} are already closed or withdrawn.`);
|
|
116
|
+
return list;
|
|
117
|
+
}
|
|
118
|
+
async function requireNoPendingChange(ctx, list) {
|
|
119
|
+
const pools = ctx.requirePools();
|
|
120
|
+
const stack = await ctx.stack();
|
|
121
|
+
const pending = [];
|
|
122
|
+
for (const position of list) {
|
|
123
|
+
if (stack.currentEpoch < await pools.positionWithdrawableEpoch(position.id))
|
|
124
|
+
pending.push(position.id);
|
|
125
|
+
}
|
|
126
|
+
if (pending.length > 0)
|
|
127
|
+
throw new Error(`Position(s) ${pending.join(', ')} changed this epoch; try again after the next epoch boundary.`);
|
|
128
|
+
}
|
|
129
|
+
async function requireStakeableAgent(ctx, agentId) {
|
|
130
|
+
const registry = ctx.sellerRegistry();
|
|
131
|
+
if (!registry)
|
|
132
|
+
return;
|
|
133
|
+
const seller = await registry.agentSeller(agentId).catch(() => null);
|
|
134
|
+
if (!seller || /^0x0{40}$/.test(seller)) {
|
|
135
|
+
throw new Error(`Agent ${agentId} has no seller bound in the seller registry, so it has no stakeable pool. The seller must run \`antseed seller register\` first.`);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
export async function stake(ctx, request, report = silentReporter) {
|
|
139
|
+
const pools = ctx.requirePools();
|
|
140
|
+
const signer = ctx.requireSigner();
|
|
141
|
+
const agentId = assertAgentId(request.agentId);
|
|
142
|
+
const amount = parseAnts(String(request.amount));
|
|
143
|
+
const config = await pools.poolConfig();
|
|
144
|
+
const epochs = assertEpochs(request.epochs, config.minStakeEpochs, config.maxStakeEpochs);
|
|
145
|
+
await requireStakeableAgent(ctx, agentId);
|
|
146
|
+
const token = ctx.antsToken();
|
|
147
|
+
const [balance, canTransfer] = await Promise.all([token.balanceOf(ctx.address), token.canTransfer(ctx.address)]);
|
|
148
|
+
if (!canTransfer)
|
|
149
|
+
throw new Error('ANTS transfers are not enabled for this wallet, so tokens cannot be moved into the pool yet.');
|
|
150
|
+
if (balance < amount)
|
|
151
|
+
throw new Error(`Insufficient ANTS: balance ${formatAnts(balance)} ANTS, requested ${formatAnts(amount)} ANTS.`);
|
|
152
|
+
await report(`Approving and staking ${formatAnts(amount)} ANTS into agent ${agentId} for ${epochs} epoch(s)`);
|
|
153
|
+
const hash = await pools.stake(signer, agentId, amount, epochs);
|
|
154
|
+
await report('Stake confirmed', hash);
|
|
155
|
+
ctx.invalidate();
|
|
156
|
+
return { hash, amount: amount.toString(), agentId, epochs };
|
|
157
|
+
}
|
|
158
|
+
export async function move(ctx, request, report = silentReporter) {
|
|
159
|
+
const pools = ctx.requirePools();
|
|
160
|
+
const signer = ctx.requireSigner();
|
|
161
|
+
const ids = assertPositiveIds(request.positionIds);
|
|
162
|
+
const toAgentId = assertAgentId(request.toAgentId);
|
|
163
|
+
const list = await ownedOpenPositions(ctx, ids);
|
|
164
|
+
const already = list.filter((position) => position.agentId === toAgentId);
|
|
165
|
+
if (already.length > 0)
|
|
166
|
+
throw new Error(`Position(s) ${already.map((position) => position.id).join(', ')} already stake agent ${toAgentId}.`);
|
|
167
|
+
await requireNoPendingChange(ctx, list);
|
|
168
|
+
await requireStakeableAgent(ctx, toAgentId);
|
|
169
|
+
await report(`Moving ${ids.length} position(s) to agent ${toAgentId} (effective next epoch)`);
|
|
170
|
+
const hash = ids.length === 1 ? await pools.moveStake(signer, ids[0], toAgentId) : await pools.moveStakes(signer, ids, toAgentId);
|
|
171
|
+
await report('Move confirmed', hash);
|
|
172
|
+
return { hash };
|
|
173
|
+
}
|
|
174
|
+
export async function split(ctx, request, report = silentReporter) {
|
|
175
|
+
const pools = ctx.requirePools();
|
|
176
|
+
const signer = ctx.requireSigner();
|
|
177
|
+
const [id] = assertPositiveIds([request.positionId]);
|
|
178
|
+
const splitAmount = parseAnts(String(request.amount));
|
|
179
|
+
const [position] = await ownedOpenPositions(ctx, [id]);
|
|
180
|
+
if (splitAmount >= position.amount)
|
|
181
|
+
throw new Error(`Split amount must be below the position's ${formatAnts(position.amount)} ANTS.`);
|
|
182
|
+
const secondWeight = position.weightAmount * splitAmount / position.amount;
|
|
183
|
+
if (secondWeight === 0n || position.weightAmount - secondWeight === 0n)
|
|
184
|
+
throw new Error('Split amount is too small: both parts need non-zero weight.');
|
|
185
|
+
await requireNoPendingChange(ctx, [position]);
|
|
186
|
+
await report(`Splitting ${formatAnts(splitAmount)} ANTS out of position ${id}`);
|
|
187
|
+
const hash = await pools.splitStake(signer, id, splitAmount);
|
|
188
|
+
await report('Split confirmed', hash);
|
|
189
|
+
return { hash };
|
|
190
|
+
}
|
|
191
|
+
export async function merge(ctx, request, report = silentReporter) {
|
|
192
|
+
const pools = ctx.requirePools();
|
|
193
|
+
const signer = ctx.requireSigner();
|
|
194
|
+
const ids = assertPositiveIds(request.positionIds);
|
|
195
|
+
if (ids.length < 2)
|
|
196
|
+
throw new Error('Merging needs at least two positions.');
|
|
197
|
+
const list = await ownedOpenPositions(ctx, ids);
|
|
198
|
+
const agents = new Set(list.map((position) => position.agentId));
|
|
199
|
+
if (agents.size !== 1)
|
|
200
|
+
throw new Error('All merged positions must stake the same agent pool.');
|
|
201
|
+
const ends = new Set(list.map((position) => position.stakeEndEpoch));
|
|
202
|
+
if (ends.size !== 1)
|
|
203
|
+
throw new Error('All merged positions must share the same lock end epoch (extend or disable max lock first to align them).');
|
|
204
|
+
await requireNoPendingChange(ctx, list);
|
|
205
|
+
const stack = await ctx.stack();
|
|
206
|
+
for (const position of list) {
|
|
207
|
+
if (await pools.isMaxLocked(position.id, Math.max(stack.currentEpoch, position.stakeStartEpoch))) {
|
|
208
|
+
throw new Error(`Position ${position.id} is max-locked; disable max lock before merging.`);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
await report(`Merging ${ids.length} positions in agent ${list[0].agentId}`);
|
|
212
|
+
const hash = await pools.mergeStakes(signer, ids);
|
|
213
|
+
await report('Merge confirmed', hash);
|
|
214
|
+
return { hash };
|
|
215
|
+
}
|
|
216
|
+
export async function extend(ctx, request, report = silentReporter) {
|
|
217
|
+
const pools = ctx.requirePools();
|
|
218
|
+
const signer = ctx.requireSigner();
|
|
219
|
+
const [id] = assertPositiveIds([request.positionId]);
|
|
220
|
+
const config = await pools.poolConfig();
|
|
221
|
+
const additional = assertEpochs(request.epochs, 1, config.maxStakeEpochs);
|
|
222
|
+
const [position] = await ownedOpenPositions(ctx, [id]);
|
|
223
|
+
const stack = await ctx.stack();
|
|
224
|
+
const effective = stack.currentEpoch + 1;
|
|
225
|
+
const newEnd = Math.max(position.stakeEndEpoch, effective) + additional;
|
|
226
|
+
if (newEnd - effective > config.maxStakeEpochs)
|
|
227
|
+
throw new Error(`The new lock end (epoch ${newEnd}) would exceed ${config.maxStakeEpochs} epochs from the next epoch.`);
|
|
228
|
+
await report(`Extending position ${id} by ${additional} epoch(s) to epoch ${newEnd}`);
|
|
229
|
+
const hash = await pools.extendLock(signer, id, additional);
|
|
230
|
+
await report('Extension confirmed', hash);
|
|
231
|
+
return { hash };
|
|
232
|
+
}
|
|
233
|
+
export async function maxLock(ctx, request, report = silentReporter) {
|
|
234
|
+
const pools = ctx.requirePools();
|
|
235
|
+
const signer = ctx.requireSigner();
|
|
236
|
+
const [id] = assertPositiveIds([request.positionId]);
|
|
237
|
+
const [position] = await ownedOpenPositions(ctx, [id]);
|
|
238
|
+
const stack = await ctx.stack();
|
|
239
|
+
const locked = await pools.isMaxLocked(id, Math.max(stack.currentEpoch + 1, position.stakeStartEpoch));
|
|
240
|
+
if (request.enable && locked)
|
|
241
|
+
throw new Error(`Position ${id} is already max-locked.`);
|
|
242
|
+
if (!request.enable && !locked)
|
|
243
|
+
throw new Error(`Position ${id} is not max-locked.`);
|
|
244
|
+
await report(request.enable ? `Enabling max lock on position ${id} (constant maximum power; withdrawal restarts the full countdown)` : `Disabling max lock on position ${id} (a fresh ${(await pools.poolConfig()).maxStakeEpochs}-epoch countdown starts next epoch)`);
|
|
245
|
+
const hash = request.enable ? await pools.enableMaxLock(signer, id) : await pools.disableMaxLock(signer, id);
|
|
246
|
+
await report('Max lock change confirmed', hash);
|
|
247
|
+
return { hash };
|
|
248
|
+
}
|
|
249
|
+
export async function previewWithdraw(ctx, ids) {
|
|
250
|
+
const pools = ctx.requirePools();
|
|
251
|
+
const list = await ownedOpenPositions(ctx, assertPositiveIds(ids));
|
|
252
|
+
await requireNoPendingChange(ctx, list);
|
|
253
|
+
const estimates = await Promise.all(list.map(async (position) => estimateEarlyExit(position, await pools.earlyExitSlashBps(position.id))));
|
|
254
|
+
return {
|
|
255
|
+
positions: estimates.map((estimate) => ({ id: estimate.id, amount: estimate.amount.toString(), slashBps: estimate.slashBps, slashedAmount: estimate.slashedAmount.toString(), returnedAmount: estimate.returnedAmount.toString() })),
|
|
256
|
+
totalSlashed: estimates.reduce((sum, estimate) => sum + estimate.slashedAmount, 0n).toString(),
|
|
257
|
+
totalReturned: estimates.reduce((sum, estimate) => sum + estimate.returnedAmount, 0n).toString(),
|
|
258
|
+
earlyExit: estimates.some((estimate) => estimate.slashBps > 0),
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
export async function withdraw(ctx, request, report = silentReporter) {
|
|
262
|
+
const pools = ctx.requirePools();
|
|
263
|
+
const signer = ctx.requireSigner();
|
|
264
|
+
const ids = assertPositiveIds(request.positionIds);
|
|
265
|
+
const preview = await previewWithdraw(ctx, ids);
|
|
266
|
+
if (preview.earlyExit) {
|
|
267
|
+
if (!request.acceptSlashing)
|
|
268
|
+
throw new Error(`Early exit burns an estimated ${formatAnts(preview.totalSlashed)} ANTS of principal. Re-run with slashing accepted to proceed.`);
|
|
269
|
+
if (request.maxSlashedAmount !== undefined && BigInt(preview.totalSlashed) > BigInt(request.maxSlashedAmount)) {
|
|
270
|
+
throw new Error('The slashing estimate increased since it was reviewed. Review the new estimate before withdrawing.');
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
await report(preview.earlyExit
|
|
274
|
+
? `Withdrawing ${ids.length} position(s), burning about ${formatAnts(preview.totalSlashed)} ANTS`
|
|
275
|
+
: `Withdrawing ${ids.length} matured position(s)`);
|
|
276
|
+
const hash = await pools.withdrawStakes(signer, ids);
|
|
277
|
+
await report('Withdrawal confirmed', hash);
|
|
278
|
+
ctx.invalidate();
|
|
279
|
+
return { hash, preview };
|
|
280
|
+
}
|
|
281
|
+
//# sourceMappingURL=positions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"positions.js","sourceRoot":"","sources":["../../src/service/positions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Token bucket: `take(n)` resolves once `n` tokens are available, refilling
|
|
3
|
+
* `perSecond` tokens up to `burst`. Callers are served in arrival order so a
|
|
4
|
+
* large request cannot starve behind a stream of small ones.
|
|
5
|
+
*/
|
|
6
|
+
export declare class TokenBucket {
|
|
7
|
+
private readonly perSecond;
|
|
8
|
+
private readonly burst;
|
|
9
|
+
private readonly now;
|
|
10
|
+
private tokens;
|
|
11
|
+
private lastRefill;
|
|
12
|
+
private queue;
|
|
13
|
+
constructor(perSecond: number, burst: number, now?: () => number);
|
|
14
|
+
take(count?: number): Promise<void>;
|
|
15
|
+
private wait;
|
|
16
|
+
private refill;
|
|
17
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Token bucket: `take(n)` resolves once `n` tokens are available, refilling
|
|
3
|
+
* `perSecond` tokens up to `burst`. Callers are served in arrival order so a
|
|
4
|
+
* large request cannot starve behind a stream of small ones.
|
|
5
|
+
*/
|
|
6
|
+
export class TokenBucket {
|
|
7
|
+
perSecond;
|
|
8
|
+
burst;
|
|
9
|
+
now;
|
|
10
|
+
tokens;
|
|
11
|
+
lastRefill;
|
|
12
|
+
queue = Promise.resolve();
|
|
13
|
+
constructor(perSecond, burst, now = Date.now) {
|
|
14
|
+
this.perSecond = perSecond;
|
|
15
|
+
this.burst = burst;
|
|
16
|
+
this.now = now;
|
|
17
|
+
this.tokens = burst;
|
|
18
|
+
this.lastRefill = now();
|
|
19
|
+
}
|
|
20
|
+
take(count = 1) {
|
|
21
|
+
const turn = this.queue.then(() => this.wait(Math.min(count, this.burst)));
|
|
22
|
+
this.queue = turn.catch(() => undefined);
|
|
23
|
+
return turn;
|
|
24
|
+
}
|
|
25
|
+
async wait(count) {
|
|
26
|
+
for (;;) {
|
|
27
|
+
this.refill();
|
|
28
|
+
if (this.tokens >= count) {
|
|
29
|
+
this.tokens -= count;
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
const deficit = count - this.tokens;
|
|
33
|
+
await new Promise((resolve) => setTimeout(resolve, Math.ceil(deficit / this.perSecond * 1000)));
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
refill() {
|
|
37
|
+
const at = this.now();
|
|
38
|
+
this.tokens = Math.min(this.burst, this.tokens + (at - this.lastRefill) / 1000 * this.perSecond);
|
|
39
|
+
this.lastRefill = at;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=rate-limit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rate-limit.js","sourceRoot":"","sources":["../../src/service/rate-limit.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,OAAO,WAAW;IAKO;IAAoC;IAAgC;IAJzF,MAAM,CAAS;IACf,UAAU,CAAS;IACnB,KAAK,GAAkB,OAAO,CAAC,OAAO,EAAE,CAAC;IAEjD,YAA6B,SAAiB,EAAmB,KAAa,EAAmB,MAAoB,IAAI,CAAC,GAAG;QAAhG,cAAS,GAAT,SAAS,CAAQ;QAAmB,UAAK,GAAL,KAAK,CAAQ;QAAmB,QAAG,GAAH,GAAG,CAAyB;QAC3H,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,UAAU,GAAG,GAAG,EAAE,CAAC;IAC1B,CAAC;IAED,IAAI,CAAC,KAAK,GAAG,CAAC;QACZ,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC3E,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QACzC,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,KAAK,CAAC,IAAI,CAAC,KAAa;QAC9B,SAAS,CAAC;YACR,IAAI,CAAC,MAAM,EAAE,CAAC;YACd,IAAI,IAAI,CAAC,MAAM,IAAI,KAAK,EAAE,CAAC;gBACzB,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC;gBACrB,OAAO;YACT,CAAC;YACD,MAAM,OAAO,GAAG,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC;YACpC,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAClG,CAAC;IACH,CAAC;IAEO,MAAM;QACZ,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACtB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;QACjG,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;IACvB,CAAC;CACF"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { AntsContext } from './context.js';
|
|
2
|
+
import type { RewardsView, ClaimRequest, RestakeRequest, StakeUsageRequest, RewardBucket } from '../api-types.js';
|
|
3
|
+
import { type StepReporter } from './steps.js';
|
|
4
|
+
export declare function rewards(ctx: AntsContext): Promise<RewardsView>;
|
|
5
|
+
export interface ClaimResult {
|
|
6
|
+
claimed: string;
|
|
7
|
+
transactions: string[];
|
|
8
|
+
buckets: RewardBucket[];
|
|
9
|
+
}
|
|
10
|
+
export declare function claim(ctx: AntsContext, request: ClaimRequest, report?: StepReporter): Promise<ClaimResult>;
|
|
11
|
+
export interface RestakeResult {
|
|
12
|
+
transactions: string[];
|
|
13
|
+
positionIds: number[];
|
|
14
|
+
epochs: number;
|
|
15
|
+
}
|
|
16
|
+
export declare function restake(ctx: AntsContext, request: RestakeRequest, report?: StepReporter): Promise<RestakeResult>;
|
|
17
|
+
export interface StakeUsageResult {
|
|
18
|
+
transactions: string[];
|
|
19
|
+
epochsStaked: number[];
|
|
20
|
+
}
|
|
21
|
+
export declare function stakeUsageRewards(ctx: AntsContext, request: StakeUsageRequest, report?: StepReporter): Promise<StakeUsageResult>;
|
|
22
|
+
export interface CompoundRequest {
|
|
23
|
+
epochs: number;
|
|
24
|
+
targetAgentId?: number;
|
|
25
|
+
stakeAgentId?: number;
|
|
26
|
+
}
|
|
27
|
+
export interface CompoundResult {
|
|
28
|
+
transactions: string[];
|
|
29
|
+
restakedPositionIds: number[];
|
|
30
|
+
sellerEpochs: number[];
|
|
31
|
+
buyerEpochs: number[];
|
|
32
|
+
newPositionIds: number[];
|
|
33
|
+
movedPositionIds: number[];
|
|
34
|
+
targetAgentId: number | null;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Restake everything that can be restaked in one job: indexed staker rewards
|
|
38
|
+
* (with the restake weight bonus, into their source pools), seller usage
|
|
39
|
+
* rewards into the seller's own pool, and buyer usage rewards into
|
|
40
|
+
* `stakeAgentId` (default `targetAgentId`) when this wallet is the deposits
|
|
41
|
+
* operator. When `targetAgentId` is given, every new position that landed in
|
|
42
|
+
* another pool is then moved there (principal, lock, and bonus preserved;
|
|
43
|
+
* the move takes effect next epoch). Legacy and locked-pool rewards have no
|
|
44
|
+
* stake path and are left for `claim`.
|
|
45
|
+
*/
|
|
46
|
+
export declare function compound(ctx: AntsContext, request: CompoundRequest, report?: StepReporter): Promise<CompoundResult>;
|