@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,104 @@
|
|
|
1
|
+
import { ZeroAddress } from 'ethers';
|
|
2
|
+
import { formatAnts } from './format.js';
|
|
3
|
+
import { toJson } from './json.js';
|
|
4
|
+
import { silentReporter } from './steps.js';
|
|
5
|
+
async function safe(read, fallback) {
|
|
6
|
+
try {
|
|
7
|
+
return await read();
|
|
8
|
+
}
|
|
9
|
+
catch {
|
|
10
|
+
return fallback;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export async function seller(ctx) {
|
|
14
|
+
const stack = await ctx.stack();
|
|
15
|
+
const identity = ctx.identity();
|
|
16
|
+
const registry = ctx.sellerRegistry();
|
|
17
|
+
const legacyStaking = ctx.legacyStakingAt(stack.legacyStaking);
|
|
18
|
+
const pools = ctx.pools();
|
|
19
|
+
const init = ctx.positionInit();
|
|
20
|
+
const [identityRegistered, registryAgentId, legacyAgentId, legacyStake, legacyEligible, registryEligible, legacyEligibilityEnabled, minPoolStake] = await Promise.all([
|
|
21
|
+
identity ? safe(() => identity.isRegistered(ctx.address), false) : Promise.resolve(false),
|
|
22
|
+
registry ? safe(() => registry.getAgentId(ctx.address), 0) : Promise.resolve(0),
|
|
23
|
+
legacyStaking ? safe(() => legacyStaking.getAgentId(ctx.address), 0) : Promise.resolve(0),
|
|
24
|
+
legacyStaking ? safe(() => legacyStaking.getStake(ctx.address), 0n) : Promise.resolve(0n),
|
|
25
|
+
legacyStaking ? safe(() => legacyStaking.isStakedAboveMin(ctx.address), false) : Promise.resolve(false),
|
|
26
|
+
registry ? safe(() => registry.isStakedAboveMin(ctx.address), false) : Promise.resolve(false),
|
|
27
|
+
registry ? safe(() => registry.legacyStakeEligibilityEnabled(), null) : Promise.resolve(null),
|
|
28
|
+
registry ? safe(() => registry.minSellerPoolStake(), null) : Promise.resolve(null),
|
|
29
|
+
]);
|
|
30
|
+
const agentId = registryAgentId || legacyAgentId;
|
|
31
|
+
const poolActiveStake = pools && agentId ? await safe(() => pools.poolActiveStakeAtEpoch(agentId, stack.currentEpoch), 0n) : 0n;
|
|
32
|
+
let starter = null;
|
|
33
|
+
if (init && pools) {
|
|
34
|
+
const [initialized, remaining, amount, endEpoch, activationDelay] = await Promise.all([
|
|
35
|
+
agentId ? safe(() => init.agentInitialized(agentId), false) : Promise.resolve(false),
|
|
36
|
+
safe(() => init.remainingInits(), 0n), safe(() => init.initAmount(), 0n), safe(() => init.initEndEpoch(), 0), safe(() => pools.stakeActivationDelay(), 1),
|
|
37
|
+
]);
|
|
38
|
+
const legacyStarterEligible = legacyAgentId !== 0 && legacyEligible;
|
|
39
|
+
const expired = stack.currentEpoch + activationDelay >= endEpoch;
|
|
40
|
+
starter = {
|
|
41
|
+
contract: init.contractAddress, initialized, remaining: remaining.toString(), amount: amount.toString(), endEpoch,
|
|
42
|
+
legacyEligible: legacyStarterEligible, expired, claimable: legacyStarterEligible && !initialized && !expired && remaining > 0n,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
return toJson({
|
|
46
|
+
address: ctx.address,
|
|
47
|
+
agentId,
|
|
48
|
+
identityRegistered,
|
|
49
|
+
registryBound: registryAgentId !== 0,
|
|
50
|
+
eligible: stack.phase === 'active' ? registryEligible : legacyEligible,
|
|
51
|
+
legacyStake: legacyStake.toString(),
|
|
52
|
+
legacyEligibilityEnabled,
|
|
53
|
+
minPoolStake: minPoolStake === null ? null : minPoolStake.toString(),
|
|
54
|
+
poolActiveStake: poolActiveStake.toString(),
|
|
55
|
+
starter,
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
export async function registerBinding(ctx, agentIdInput, report = silentReporter) {
|
|
59
|
+
const signer = ctx.requireSigner();
|
|
60
|
+
const registry = ctx.sellerRegistry();
|
|
61
|
+
if (!registry)
|
|
62
|
+
throw new Error('Seller registry is not configured; use `antseed seller register` on this chain.');
|
|
63
|
+
const stack = await ctx.stack();
|
|
64
|
+
const legacyStaking = ctx.legacyStakingAt(stack.legacyStaking);
|
|
65
|
+
const agentId = agentIdInput ?? (legacyStaking ? await safe(() => legacyStaking.getAgentId(ctx.address), 0) : 0);
|
|
66
|
+
if (!agentId)
|
|
67
|
+
throw new Error('No agent ID known for this wallet. Register an identity first with `antseed seller register`.');
|
|
68
|
+
const identity = ctx.identity();
|
|
69
|
+
if (identity) {
|
|
70
|
+
const owner = await safe(() => identity.getAgentWallet(agentId), ZeroAddress);
|
|
71
|
+
if (owner.toLowerCase() !== ctx.address.toLowerCase())
|
|
72
|
+
throw new Error(`Agent ${agentId} is owned by ${owner}, not this wallet.`);
|
|
73
|
+
}
|
|
74
|
+
await report(`Binding agent ${agentId} to ${ctx.address} in the seller registry`);
|
|
75
|
+
let sent = false;
|
|
76
|
+
await registry.registerSellerBinding(signer, agentId, async (hash) => { sent = true; await report('Registration confirmed', hash); });
|
|
77
|
+
if (!sent)
|
|
78
|
+
await report('Registration already complete; nothing sent');
|
|
79
|
+
ctx.invalidate();
|
|
80
|
+
return { agentId, sent };
|
|
81
|
+
}
|
|
82
|
+
export async function claimStarter(ctx, report = silentReporter) {
|
|
83
|
+
const signer = ctx.requireSigner();
|
|
84
|
+
const init = ctx.positionInit();
|
|
85
|
+
if (!init)
|
|
86
|
+
throw new Error('Starter positions are not configured for this chain.');
|
|
87
|
+
const view = await seller(ctx);
|
|
88
|
+
if (!view.starter)
|
|
89
|
+
throw new Error('Starter positions are unavailable.');
|
|
90
|
+
if (view.starter.initialized)
|
|
91
|
+
throw new Error(`Starter position already initialized for agent ${view.agentId}.`);
|
|
92
|
+
if (!view.starter.legacyEligible)
|
|
93
|
+
throw new Error('Starter grants require a legacy USDC stake at or above the minimum bound to this wallet.');
|
|
94
|
+
if (view.starter.expired)
|
|
95
|
+
throw new Error(`Starter initialization closed at epoch ${view.starter.endEpoch}.`);
|
|
96
|
+
if (BigInt(view.starter.remaining) === 0n)
|
|
97
|
+
throw new Error('The starter faucet is depleted.');
|
|
98
|
+
await report(`Creating ${formatAnts(view.starter.amount)} ANTS starter position for agent ${view.agentId} (locked through epoch ${view.starter.endEpoch})`);
|
|
99
|
+
const hash = await init.initPosition(signer);
|
|
100
|
+
await report('Starter position created', hash);
|
|
101
|
+
ctx.invalidate();
|
|
102
|
+
return { hash, agentId: view.agentId, amount: view.starter.amount, endEpoch: view.starter.endEpoch };
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=seller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seller.js","sourceRoot":"","sources":["../../src/service/seller.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/** Progress callback used by every multi-transaction action. */
|
|
2
|
+
export type StepReporter = (label: string, hash?: string) => void | Promise<void>;
|
|
3
|
+
export declare const silentReporter: StepReporter;
|
|
4
|
+
export declare function assertPositiveIds(ids: unknown): number[];
|
|
5
|
+
export declare function assertEpochs(epochs: unknown, min: number, max: number): number;
|
|
6
|
+
export declare function assertAgentId(agentId: unknown): number;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export const silentReporter = () => { };
|
|
2
|
+
export function assertPositiveIds(ids) {
|
|
3
|
+
if (!Array.isArray(ids) || ids.length === 0)
|
|
4
|
+
throw new Error('At least one position ID is required.');
|
|
5
|
+
const parsed = ids.map((value) => Number(value));
|
|
6
|
+
if (parsed.some((id) => !Number.isSafeInteger(id) || id <= 0))
|
|
7
|
+
throw new Error('Position IDs must be positive integers.');
|
|
8
|
+
if (new Set(parsed).size !== parsed.length)
|
|
9
|
+
throw new Error('Position IDs must not repeat.');
|
|
10
|
+
return parsed;
|
|
11
|
+
}
|
|
12
|
+
export function assertEpochs(epochs, min, max) {
|
|
13
|
+
const value = Number(epochs);
|
|
14
|
+
if (!Number.isInteger(value) || value < min || value > max)
|
|
15
|
+
throw new Error(`Lock length must be a whole number of epochs between ${min} and ${max}.`);
|
|
16
|
+
return value;
|
|
17
|
+
}
|
|
18
|
+
export function assertAgentId(agentId) {
|
|
19
|
+
const value = Number(agentId);
|
|
20
|
+
if (!Number.isSafeInteger(value) || value <= 0)
|
|
21
|
+
throw new Error('Agent ID must be a positive integer.');
|
|
22
|
+
return value;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=steps.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"steps.js","sourceRoot":"","sources":["../../src/service/steps.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,cAAc,GAAiB,GAAG,EAAE,GAAE,CAAC,CAAC;AAErD,MAAM,UAAU,iBAAiB,CAAC,GAAY;IAC5C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IACtG,MAAM,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACjD,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;IAC1H,IAAI,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;IAC7F,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,MAAe,EAAE,GAAW,EAAE,GAAW;IACpE,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IAC7B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,GAAG,IAAI,KAAK,GAAG,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,wDAAwD,GAAG,QAAQ,GAAG,GAAG,CAAC,CAAC;IACvJ,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAAgB;IAC5C,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IAC9B,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;IACxG,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { AntsContext } from './context.js';
|
|
2
|
+
import type { UsageView } from '../api-types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Your buyer and seller usage per epoch with network totals. The per-epoch
|
|
5
|
+
* series comes from the indexer (no per-epoch chain reads); only the
|
|
6
|
+
* wallet's lifetime totals and the accounting policies are read live.
|
|
7
|
+
*/
|
|
8
|
+
export declare function usage(ctx: AntsContext, options?: {
|
|
9
|
+
epochs?: number;
|
|
10
|
+
}): Promise<UsageView>;
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { ZeroAddress } from 'ethers';
|
|
2
|
+
import { toJson } from './json.js';
|
|
3
|
+
import { IndexerError } from './indexer.js';
|
|
4
|
+
async function safe(read, fallback) {
|
|
5
|
+
try {
|
|
6
|
+
return await read();
|
|
7
|
+
}
|
|
8
|
+
catch {
|
|
9
|
+
return fallback;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Your buyer and seller usage per epoch with network totals. The per-epoch
|
|
14
|
+
* series comes from the indexer (no per-epoch chain reads); only the
|
|
15
|
+
* wallet's lifetime totals and the accounting policies are read live.
|
|
16
|
+
*/
|
|
17
|
+
export async function usage(ctx, options = {}) {
|
|
18
|
+
const stack = await ctx.stack();
|
|
19
|
+
const accounting = ctx.usageAccounting();
|
|
20
|
+
const indexer = ctx.indexer();
|
|
21
|
+
const count = Math.max(1, Math.min(52, options.epochs ?? 8));
|
|
22
|
+
const first = stack.effectiveEpoch ?? 0;
|
|
23
|
+
const from = Math.max(first, stack.currentEpoch - count + 1);
|
|
24
|
+
let epochs = [];
|
|
25
|
+
let source = 'chain';
|
|
26
|
+
let sourceError = null;
|
|
27
|
+
if (indexer && stack.phase === 'active') {
|
|
28
|
+
try {
|
|
29
|
+
const [participant, network] = await Promise.all([indexer.participant(ctx.address, count), indexer.stakingEpochs(count)]);
|
|
30
|
+
source = 'indexer';
|
|
31
|
+
for (let epoch = stack.currentEpoch; epoch >= from; epoch -= 1) {
|
|
32
|
+
const seller = participant.seller.find((row) => row.epoch === epoch);
|
|
33
|
+
const buyer = participant.buyer.find((row) => row.epoch === epoch);
|
|
34
|
+
const totals = network.find((row) => row.epoch === epoch);
|
|
35
|
+
epochs.push({
|
|
36
|
+
epoch,
|
|
37
|
+
buyerPoints: buyer?.points ?? '0',
|
|
38
|
+
weightedBuyerPoints: buyer?.weightedPoints ?? '0',
|
|
39
|
+
sellerPoints: seller?.points ?? '0',
|
|
40
|
+
agentId: seller?.agentId ?? 0,
|
|
41
|
+
totalBuyerPoints: totals?.totalBuyerPoints ?? '0',
|
|
42
|
+
totalSellerPoints: totals?.totalSellerPoints ?? '0',
|
|
43
|
+
totalPoolPoints: totals?.totalSellerPoints ?? '0',
|
|
44
|
+
totalWeightedPoolPoints: totals?.totalWeightedPoolPoints ?? '0',
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
if (!(error instanceof IndexerError))
|
|
50
|
+
throw error;
|
|
51
|
+
sourceError = error.message;
|
|
52
|
+
epochs = [];
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
const [buyerTotal, networkTotal, pointsPolicy, poolWeightPolicy, minimumPower] = await Promise.all([
|
|
56
|
+
accounting ? safe(() => accounting.buyerUsageTotal(ctx.address), { points: 0n, weightedPoints: 0n }) : Promise.resolve({ points: 0n, weightedPoints: 0n }),
|
|
57
|
+
accounting ? safe(() => accounting.totalUsage(), { buyers: { points: 0n, weightedPoints: 0n }, sellers: { points: 0n, weightedPoints: 0n } }) : Promise.resolve({ buyers: { points: 0n, weightedPoints: 0n }, sellers: { points: 0n, weightedPoints: 0n } }),
|
|
58
|
+
accounting ? safe(() => accounting.pointsPolicy(), null) : Promise.resolve(null),
|
|
59
|
+
accounting ? safe(() => accounting.poolWeightPolicy(), null) : Promise.resolve(null),
|
|
60
|
+
accounting ? safe(() => accounting.minimumAccountedPoolPower(), null) : Promise.resolve(null),
|
|
61
|
+
]);
|
|
62
|
+
return toJson({
|
|
63
|
+
currentEpoch: stack.currentEpoch,
|
|
64
|
+
firstRewardedEpoch: stack.effectiveEpoch,
|
|
65
|
+
epochs,
|
|
66
|
+
totals: {
|
|
67
|
+
buyerPoints: buyerTotal.points.toString(), buyerWeightedPoints: buyerTotal.weightedPoints.toString(),
|
|
68
|
+
networkBuyerPoints: networkTotal.buyers.points.toString(), networkSellerPoints: networkTotal.sellers.points.toString(),
|
|
69
|
+
},
|
|
70
|
+
pointsPolicy: pointsPolicy && pointsPolicy !== ZeroAddress ? pointsPolicy : null,
|
|
71
|
+
poolWeightPolicy: poolWeightPolicy && poolWeightPolicy !== ZeroAddress ? poolWeightPolicy : null,
|
|
72
|
+
minimumAccountedPoolPower: minimumPower === null ? null : minimumPower.toString(),
|
|
73
|
+
source,
|
|
74
|
+
sourceError,
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=usage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage.js","sourceRoot":"","sources":["../../src/service/usage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAGrC,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACnC,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,KAAK,UAAU,IAAI,CAAI,IAAsB,EAAE,QAAW;IACxD,IAAI,CAAC;QAAC,OAAO,MAAM,IAAI,EAAE,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,QAAQ,CAAC;IAAC,CAAC;AACzD,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,GAAgB,EAAE,UAA+B,EAAE;IAC7E,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC;IAChC,MAAM,UAAU,GAAG,GAAG,CAAC,eAAe,EAAE,CAAC;IACzC,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC;IAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC;IAC7D,MAAM,KAAK,GAAG,KAAK,CAAC,cAAc,IAAI,CAAC,CAAC;IACxC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,YAAY,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC;IAC7D,IAAI,MAAM,GAAqB,EAAE,CAAC;IAClC,IAAI,MAAM,GAAwB,OAAO,CAAC;IAC1C,IAAI,WAAW,GAAkB,IAAI,CAAC;IACtC,IAAI,OAAO,IAAI,KAAK,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;QACxC,IAAI,CAAC;YACH,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC1H,MAAM,GAAG,SAAS,CAAC;YACnB,KAAK,IAAI,KAAK,GAAG,KAAK,CAAC,YAAY,EAAE,KAAK,IAAI,IAAI,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;gBAC/D,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC;gBACrE,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC;gBACnE,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC;gBAC1D,MAAM,CAAC,IAAI,CAAC;oBACV,KAAK;oBACL,WAAW,EAAE,KAAK,EAAE,MAAM,IAAI,GAAG;oBACjC,mBAAmB,EAAE,KAAK,EAAE,cAAc,IAAI,GAAG;oBACjD,YAAY,EAAE,MAAM,EAAE,MAAM,IAAI,GAAG;oBACnC,OAAO,EAAE,MAAM,EAAE,OAAO,IAAI,CAAC;oBAC7B,gBAAgB,EAAE,MAAM,EAAE,gBAAgB,IAAI,GAAG;oBACjD,iBAAiB,EAAE,MAAM,EAAE,iBAAiB,IAAI,GAAG;oBACnD,eAAe,EAAE,MAAM,EAAE,iBAAiB,IAAI,GAAG;oBACjD,uBAAuB,EAAE,MAAM,EAAE,uBAAuB,IAAI,GAAG;iBAChE,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,CAAC,KAAK,YAAY,YAAY,CAAC;gBAAE,MAAM,KAAK,CAAC;YAClD,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC;YAC5B,MAAM,GAAG,EAAE,CAAC;QACd,CAAC;IACH,CAAC;IACD,MAAM,CAAC,UAAU,EAAE,YAAY,EAAE,YAAY,EAAE,gBAAgB,EAAE,YAAY,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACjG,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE,CAAC;QAC1J,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,UAAU,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE,EAAE,CAAC;QAC5P,UAAU,CAAC,CAAC,CAAC,IAAI,CAAgB,GAAG,EAAE,CAAC,UAAU,CAAC,YAAY,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;QAC/F,UAAU,CAAC,CAAC,CAAC,IAAI,CAAgB,GAAG,EAAE,CAAC,UAAU,CAAC,gBAAgB,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;QACnG,UAAU,CAAC,CAAC,CAAC,IAAI,CAAgB,GAAG,EAAE,CAAC,UAAU,CAAC,yBAAyB,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;KAC7G,CAAC,CAAC;IACH,OAAO,MAAM,CAAC;QACZ,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,kBAAkB,EAAE,KAAK,CAAC,cAAc;QACxC,MAAM;QACN,MAAM,EAAE;YACN,WAAW,EAAE,UAAU,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,mBAAmB,EAAE,UAAU,CAAC,cAAc,CAAC,QAAQ,EAAE;YACpG,kBAAkB,EAAE,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,mBAAmB,EAAE,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE;SACvH;QACD,YAAY,EAAE,YAAY,IAAI,YAAY,KAAK,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI;QAChF,gBAAgB,EAAE,gBAAgB,IAAI,gBAAgB,KAAK,WAAW,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI;QAChG,yBAAyB,EAAE,YAAY,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,QAAQ,EAAE;QACjF,MAAM;QACN,WAAW;KACZ,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { AntsContext } from './context.js';
|
|
2
|
+
import type { VerificationView, ProofStatusView } from '../api-types.js';
|
|
3
|
+
import { type StepReporter } from './steps.js';
|
|
4
|
+
export declare function verification(ctx: AntsContext, seller?: string): Promise<VerificationView>;
|
|
5
|
+
export declare function proofStatus(ctx: AntsContext, proofId: string): Promise<ProofStatusView>;
|
|
6
|
+
export interface SubmitProofResult {
|
|
7
|
+
proofId: string;
|
|
8
|
+
seller: string;
|
|
9
|
+
finalized: boolean;
|
|
10
|
+
transactions: string[];
|
|
11
|
+
}
|
|
12
|
+
export declare function submitProof(ctx: AntsContext, artifact: unknown, report?: StepReporter): Promise<SubmitProofResult>;
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { ZeroAddress } from 'ethers';
|
|
2
|
+
import { validateSellerProofArtifact, sellerProofId } from '@antseed/node/payments';
|
|
3
|
+
import { toJson } from './json.js';
|
|
4
|
+
import { silentReporter } from './steps.js';
|
|
5
|
+
async function safe(read, fallback) {
|
|
6
|
+
try {
|
|
7
|
+
return await read();
|
|
8
|
+
}
|
|
9
|
+
catch {
|
|
10
|
+
return fallback;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
function sameAddress(a, b) {
|
|
14
|
+
return !!a && !!b && a.toLowerCase() === b.toLowerCase();
|
|
15
|
+
}
|
|
16
|
+
export async function verification(ctx, seller) {
|
|
17
|
+
const wash = ctx.washRegistry();
|
|
18
|
+
const policies = ctx.pointsPolicyRegistry();
|
|
19
|
+
const accounting = ctx.usageAccounting();
|
|
20
|
+
const target = seller ?? ctx.address;
|
|
21
|
+
if (!/^0x[0-9a-fA-F]{40}$/.test(target))
|
|
22
|
+
throw new Error('Seller must be an address.');
|
|
23
|
+
const [registry, status, policyList, pointsPolicy] = await Promise.all([
|
|
24
|
+
wash ? safe(async () => ({ address: wash.contractAddress, ...(await wash.registryConfig()) }), null) : Promise.resolve(null),
|
|
25
|
+
wash ? safe(async () => {
|
|
26
|
+
const result = await wash.sellerStatus(target);
|
|
27
|
+
return { seller: result.seller, provenWashVolume: result.provenWashVolume.toString(), totalSellerVolume: result.totalSellerVolume.toString(), provenWashShareBps: result.provenWashShareBps, evidenceDigest: result.evidenceDigest, isProvenWashTrader: result.isProvenWashTrader };
|
|
28
|
+
}, null) : Promise.resolve(null),
|
|
29
|
+
policies ? safe(() => policies.policies(), []) : Promise.resolve([]),
|
|
30
|
+
accounting ? safe(() => accounting.pointsPolicy(), null) : Promise.resolve(null),
|
|
31
|
+
]);
|
|
32
|
+
const described = await Promise.all(policyList.map(async (address) => ({ address, washTradingRegistry: policies ? await policies.washTradingRegistryOf(address) : null })));
|
|
33
|
+
const enforced = !!pointsPolicy && sameAddress(pointsPolicy, policies?.contractAddress) && described.some((policy) => wash && sameAddress(policy.washTradingRegistry, wash.contractAddress));
|
|
34
|
+
return toJson({ registry, seller: status, policies: described, pointsPolicy: pointsPolicy && pointsPolicy !== ZeroAddress ? pointsPolicy : null, enforced });
|
|
35
|
+
}
|
|
36
|
+
export async function proofStatus(ctx, proofId) {
|
|
37
|
+
const wash = ctx.washRegistry();
|
|
38
|
+
if (!wash)
|
|
39
|
+
throw new Error('Wash-trading registry is not configured for this chain.');
|
|
40
|
+
if (!/^0x[0-9a-fA-F]{64}$/.test(proofId))
|
|
41
|
+
throw new Error('Proof ID must be a bytes32 hash.');
|
|
42
|
+
return toJson(await wash.proofStatus(proofId));
|
|
43
|
+
}
|
|
44
|
+
export async function submitProof(ctx, artifact, report = silentReporter) {
|
|
45
|
+
const wash = ctx.washRegistry();
|
|
46
|
+
if (!wash)
|
|
47
|
+
throw new Error('Wash-trading registry is not configured for this chain.');
|
|
48
|
+
const signer = ctx.requireSigner();
|
|
49
|
+
const validated = validateSellerProofArtifact(artifact);
|
|
50
|
+
const config = await wash.registryConfig();
|
|
51
|
+
if (validated.chainId !== undefined && Number(validated.chainId) !== ctx.chain.evmChainId) {
|
|
52
|
+
throw new Error(`Artifact is for chain ${validated.chainId}; this registry is on chain ${ctx.chain.evmChainId}.`);
|
|
53
|
+
}
|
|
54
|
+
const proofId = sellerProofId(validated.publicValues);
|
|
55
|
+
await report(`Submitting seller proof ${proofId} for ${validated.seller} (${validated.blockAuthenticationChunkCount} block-authentication chunk(s), period ${config.periodStartBlock}–${config.periodEndBlock})`);
|
|
56
|
+
const transactions = [];
|
|
57
|
+
const result = await wash.submitSellerProof(signer, validated, async (step) => {
|
|
58
|
+
if (step.hash)
|
|
59
|
+
transactions.push(step.hash);
|
|
60
|
+
if (step.kind === 'stage')
|
|
61
|
+
await report(step.skipped ? 'Proof already staged' : 'Proof staged (SP1 verification passed)', step.hash);
|
|
62
|
+
else if (step.kind === 'authenticate')
|
|
63
|
+
await report(`${step.skipped ? 'Already authenticated' : 'Authenticated'} block chunk ${step.chunkIndex + 1}/${step.chunkCount}`, step.hash);
|
|
64
|
+
else
|
|
65
|
+
await report(step.skipped ? 'Proof was already finalized' : 'Proof finalized', step.hash);
|
|
66
|
+
});
|
|
67
|
+
return { proofId: result.proofId, seller: validated.seller, finalized: result.finalized, transactions };
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=verification.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verification.js","sourceRoot":"","sources":["../../src/service/verification.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Read-side cache for dashboard views. Public Base RPCs throttle bursts, and
|
|
3
|
+
* the failover provider fans a slow call out to every endpoint, so four tabs
|
|
4
|
+
* loading at once used to turn into minutes of 429 backoff. Reads are run one
|
|
5
|
+
* at a time (each view already batches its own calls), identical concurrent
|
|
6
|
+
* requests share one load, and results stay fresh for `ttlMs` unless a job
|
|
7
|
+
* invalidates them.
|
|
8
|
+
*/
|
|
9
|
+
export declare class ViewCache {
|
|
10
|
+
private readonly ttlMs;
|
|
11
|
+
private readonly entries;
|
|
12
|
+
private readonly inflight;
|
|
13
|
+
private queue;
|
|
14
|
+
constructor(ttlMs?: number);
|
|
15
|
+
read<T>(key: string, load: () => Promise<T>): Promise<T>;
|
|
16
|
+
/** Drop every cached view; in-flight loads finish and are cached as usual. */
|
|
17
|
+
invalidate(): void;
|
|
18
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
const DEFAULT_TTL_MS = 20_000;
|
|
2
|
+
/**
|
|
3
|
+
* Read-side cache for dashboard views. Public Base RPCs throttle bursts, and
|
|
4
|
+
* the failover provider fans a slow call out to every endpoint, so four tabs
|
|
5
|
+
* loading at once used to turn into minutes of 429 backoff. Reads are run one
|
|
6
|
+
* at a time (each view already batches its own calls), identical concurrent
|
|
7
|
+
* requests share one load, and results stay fresh for `ttlMs` unless a job
|
|
8
|
+
* invalidates them.
|
|
9
|
+
*/
|
|
10
|
+
export class ViewCache {
|
|
11
|
+
ttlMs;
|
|
12
|
+
entries = new Map();
|
|
13
|
+
inflight = new Map();
|
|
14
|
+
queue = Promise.resolve();
|
|
15
|
+
constructor(ttlMs = DEFAULT_TTL_MS) {
|
|
16
|
+
this.ttlMs = ttlMs;
|
|
17
|
+
}
|
|
18
|
+
read(key, load) {
|
|
19
|
+
const hit = this.entries.get(key);
|
|
20
|
+
if (hit && Date.now() - hit.at < this.ttlMs)
|
|
21
|
+
return Promise.resolve(hit.value);
|
|
22
|
+
const running = this.inflight.get(key);
|
|
23
|
+
if (running)
|
|
24
|
+
return running;
|
|
25
|
+
const task = this.queue.then(load, load);
|
|
26
|
+
this.queue = task.catch(() => undefined);
|
|
27
|
+
this.inflight.set(key, task);
|
|
28
|
+
// Settle in the first continuation so a caller awaiting `task` never sees a stale in-flight entry.
|
|
29
|
+
const settle = () => { if (this.inflight.get(key) === task)
|
|
30
|
+
this.inflight.delete(key); };
|
|
31
|
+
task.then((value) => { this.entries.set(key, { at: Date.now(), value }); settle(); }, settle);
|
|
32
|
+
return task;
|
|
33
|
+
}
|
|
34
|
+
/** Drop every cached view; in-flight loads finish and are cached as usual. */
|
|
35
|
+
invalidate() {
|
|
36
|
+
this.entries.clear();
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=view-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"view-cache.js","sourceRoot":"","sources":["../src/view-cache.ts"],"names":[],"mappings":"AAAA,MAAM,cAAc,GAAG,MAAM,CAAC;AAE9B;;;;;;;GAOG;AACH,MAAM,OAAO,SAAS;IAKS;IAJZ,OAAO,GAAG,IAAI,GAAG,EAA0C,CAAC;IAC5D,QAAQ,GAAG,IAAI,GAAG,EAA4B,CAAC;IACxD,KAAK,GAAqB,OAAO,CAAC,OAAO,EAAE,CAAC;IAEpD,YAA6B,QAAQ,cAAc;QAAtB,UAAK,GAAL,KAAK,CAAiB;IAAG,CAAC;IAEvD,IAAI,CAAI,GAAW,EAAE,IAAsB;QACzC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK;YAAE,OAAO,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,KAAU,CAAC,CAAC;QACpF,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACvC,IAAI,OAAO;YAAE,OAAO,OAAqB,CAAC;QAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACzC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QACzC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC7B,mGAAmG;QACnG,MAAM,MAAM,GAAG,GAAG,EAAE,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,IAAI;YAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACzF,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QAC9F,OAAO,IAAI,CAAC;IACd,CAAC;IAED,8EAA8E;IAC9E,UAAU;QACR,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;CACF"}
|
package/package.json
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@antseed/ants",
|
|
3
|
+
"version": "0.1.1",
|
|
4
|
+
"description": "ANTS staking dashboard and service layer for the AntSeed CLI",
|
|
5
|
+
"files": [
|
|
6
|
+
"dist"
|
|
7
|
+
],
|
|
8
|
+
"type": "module",
|
|
9
|
+
"main": "dist/index.js",
|
|
10
|
+
"exports": {
|
|
11
|
+
".": "./dist/index.js",
|
|
12
|
+
"./service": "./dist/service/index.js"
|
|
13
|
+
},
|
|
14
|
+
"dependencies": {
|
|
15
|
+
"@fastify/cors": "^10.0.0",
|
|
16
|
+
"@fastify/static": "^9.0.0",
|
|
17
|
+
"ethers": "^6.13.0",
|
|
18
|
+
"fastify": "^5.7.4",
|
|
19
|
+
"@antseed/node": "0.2.118"
|
|
20
|
+
},
|
|
21
|
+
"devDependencies": {
|
|
22
|
+
"@types/node": "^20.11.0",
|
|
23
|
+
"@types/react": "^18.3.12",
|
|
24
|
+
"@types/react-dom": "^18.3.1",
|
|
25
|
+
"@vitejs/plugin-react": "^4.3.0",
|
|
26
|
+
"concurrently": "^9.0.1",
|
|
27
|
+
"react": "^18.3.1",
|
|
28
|
+
"react-dom": "^18.3.1",
|
|
29
|
+
"sass": "^1.97.3",
|
|
30
|
+
"typescript": "^5.6.0",
|
|
31
|
+
"vite": "^6.0.0",
|
|
32
|
+
"vitest": "^2.1.9"
|
|
33
|
+
},
|
|
34
|
+
"scripts": {
|
|
35
|
+
"build": "npm run build:server && npm run build:web",
|
|
36
|
+
"build:server": "tsc -p tsconfig.json",
|
|
37
|
+
"build:web": "vite build",
|
|
38
|
+
"dev": "concurrently -k \"npm:dev:web\" \"npm:dev:server\"",
|
|
39
|
+
"dev:web": "vite",
|
|
40
|
+
"dev:server": "tsc -p tsconfig.json --watch --preserveWatchOutput",
|
|
41
|
+
"test": "vitest run",
|
|
42
|
+
"typecheck": "tsc --noEmit -p tsconfig.json && tsc --noEmit -p web/tsconfig.json"
|
|
43
|
+
}
|
|
44
|
+
}
|