@antseed/payments 0.1.78 → 0.1.80
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/dist/free-tier-delegations.d.ts +25 -0
- package/dist/free-tier-delegations.js +124 -0
- package/dist/free-tier-delegations.js.map +1 -0
- package/dist/free-tier-delegations.test.d.ts +1 -0
- package/dist/free-tier-delegations.test.js +83 -0
- package/dist/free-tier-delegations.test.js.map +1 -0
- package/dist/server.js +9 -3
- package/dist/server.js.map +1 -1
- package/dist/web/assets/{add-BmGLglO7.js → add-BuGrluX1.js} +1 -1
- package/dist/web/assets/{all-wallets-Ba8n7B9j.js → all-wallets-fiytzdKy.js} +1 -1
- package/dist/web/assets/{app-store-BMdLkEq6.js → app-store-CRM80Dos.js} +1 -1
- package/dist/web/assets/{apple-Bw-lMyEP.js → apple-BcIvstxs.js} +1 -1
- package/dist/web/assets/{arrow-bottom-B6iO34ZS.js → arrow-bottom-B3DyTgix.js} +1 -1
- package/dist/web/assets/{arrow-bottom-circle-DjF6mGXK.js → arrow-bottom-circle-o2xc6Vur.js} +1 -1
- package/dist/web/assets/{arrow-left-AI88nzl-.js → arrow-left-_A-KEHwO.js} +1 -1
- package/dist/web/assets/{arrow-right-Co7E5DMP.js → arrow-right-CpwiDb-r.js} +1 -1
- package/dist/web/assets/{arrow-top-Br1BAEl6.js → arrow-top-BbmzVCEg.js} +1 -1
- package/dist/web/assets/{bank-C-iVuIdQ.js → bank-BBfUUmTg.js} +1 -1
- package/dist/web/assets/{basic-D6uTDDsg.js → basic-CBpNXBox.js} +1 -1
- package/dist/web/assets/{browser-BH1XGLD_.js → browser-DCUUxXFD.js} +1 -1
- package/dist/web/assets/{card-Bk7TQeZr.js → card-Dg-VP3Jp.js} +1 -1
- package/dist/web/assets/{ccip-FBfaj_JG.js → ccip-Dp_RPrDB.js} +1 -1
- package/dist/web/assets/{checkmark-BfD3jUA6.js → checkmark-BlzM29Qx.js} +1 -1
- package/dist/web/assets/{checkmark-bold-rC-0R8Tz.js → checkmark-bold-DNJnUEe5.js} +1 -1
- package/dist/web/assets/{chevron-bottom-B9aHWtfX.js → chevron-bottom-J7_Wy9sz.js} +1 -1
- package/dist/web/assets/{chevron-left-BX6gn0U0.js → chevron-left-ChloRmGq.js} +1 -1
- package/dist/web/assets/{chevron-right-D5ryvNP_.js → chevron-right-CmMxLLHf.js} +1 -1
- package/dist/web/assets/{chevron-top-BJOZNUdW.js → chevron-top-C195_Z3c.js} +1 -1
- package/dist/web/assets/{chrome-store-Cc5Rp7DD.js → chrome-store-CXXA9iFF.js} +1 -1
- package/dist/web/assets/{clock-Isck2mmO.js → clock-CaXX8z4F.js} +1 -1
- package/dist/web/assets/{close-DRTcCHTJ.js → close-CTDyYwa3.js} +1 -1
- package/dist/web/assets/{coinPlaceholder-JxcKr4ll.js → coinPlaceholder-CNtm4br2.js} +1 -1
- package/dist/web/assets/{compass-CRrluTA_.js → compass-CQVkzTVA.js} +1 -1
- package/dist/web/assets/{copy-C_NXEzpJ.js → copy-B3CUdYJc.js} +1 -1
- package/dist/web/assets/{core-B9_TqCAE.js → core-DtBtW8-1.js} +3 -3
- package/dist/web/assets/{cursor-CCwDD6UM.js → cursor-BS8yKljr.js} +1 -1
- package/dist/web/assets/{cursor-transparent-DAIW5ZfU.js → cursor-transparent-Dwv4JccA.js} +1 -1
- package/dist/web/assets/{desktop-BLWyI0Zl.js → desktop-DPEWw6bt.js} +1 -1
- package/dist/web/assets/{disconnect-B5uFiIG1.js → disconnect-j57QNckX.js} +1 -1
- package/dist/web/assets/{discord-B-pvmlf_.js → discord-uKqS3fOF.js} +1 -1
- package/dist/web/assets/{etherscan-D09rivn2.js → etherscan-CKZnjnvC.js} +1 -1
- package/dist/web/assets/{exclamation-triangle-CmqiZweA.js → exclamation-triangle-BKyknnCw.js} +1 -1
- package/dist/web/assets/{extension-CpitF-2L.js → extension-VU0aJApQ.js} +1 -1
- package/dist/web/assets/{external-link-BEvpecPB.js → external-link-rjHfCDPq.js} +1 -1
- package/dist/web/assets/{facebook-Bh8XDyr1.js → facebook-BZcH7nAf.js} +1 -1
- package/dist/web/assets/{farcaster-4hv7JLYr.js → farcaster-BYk6HVYC.js} +1 -1
- package/dist/web/assets/{filters-C4CLQAw1.js → filters-tdgdTci1.js} +1 -1
- package/dist/web/assets/{github-iupXe9Hi.js → github-DDWtg5BI.js} +1 -1
- package/dist/web/assets/{google-DuLqmlIi.js → google-nuHZ53jx.js} +1 -1
- package/dist/web/assets/{help-circle-Dx_15WyK.js → help-circle-hkiv5Uy_.js} +1 -1
- package/dist/web/assets/{id-FEup121p.js → id-DNMpZ1pB.js} +1 -1
- package/dist/web/assets/{image-D4VdkXGr.js → image-CtGLSXGt.js} +1 -1
- package/dist/web/assets/{index-CpI_GhJ4.js → index-CS32ZEaB.js} +3 -3
- package/dist/web/assets/{index-Avo4hOlh.js → index-Ck4Xjs9A.js} +67 -67
- package/dist/web/assets/{index-D_Oia2rQ.js → index-DAffOnu-.js} +1 -1
- package/dist/web/assets/{index-DPrrbgDK.js → index-DD7uAlhH.js} +1 -1
- package/dist/web/assets/{index-DtvsHuZD.js → index-Mr-jaPV2.js} +1 -1
- package/dist/web/assets/{index.es-4jtvYW5n.js → index.es-Cb6GoQM0.js} +4 -4
- package/dist/web/assets/{info-DmGrffKx.js → info-B1qYLssh.js} +1 -1
- package/dist/web/assets/{info-circle-cRVJZhm0.js → info-circle-ocp-Jpi9.js} +1 -1
- package/dist/web/assets/{lightbulb-DXcgHaY-.js → lightbulb-c9FH_5Rm.js} +1 -1
- package/dist/web/assets/{mail-C-o0_3sQ.js → mail-Cqu155VE.js} +1 -1
- package/dist/web/assets/{metamask-sdk-CPv8vfWd.js → metamask-sdk-i1CrWVk1.js} +1 -1
- package/dist/web/assets/{mobile-DADbQ6PC.js → mobile-B1IpKlKa.js} +1 -1
- package/dist/web/assets/{more-BIX8JqDx.js → more-BIWDJ7mc.js} +1 -1
- package/dist/web/assets/{network-placeholder-Dm_1io5O.js → network-placeholder-D4Hs9LyZ.js} +1 -1
- package/dist/web/assets/{nftPlaceholder-HqtJdD2N.js → nftPlaceholder-DYMfSoZ6.js} +1 -1
- package/dist/web/assets/{off-DTH-lXVO.js → off-CU_NlIIT.js} +1 -1
- package/dist/web/assets/{play-store-uipYdNTG.js → play-store-CIoxgNs1.js} +1 -1
- package/dist/web/assets/{plus-BnkhXJou.js → plus-Do0zsP22.js} +1 -1
- package/dist/web/assets/{qr-code-T5yJxcJo.js → qr-code-UXCuS5GG.js} +1 -1
- package/dist/web/assets/{recycle-horizontal-DC7ElP7S.js → recycle-horizontal-CXXOyiew.js} +1 -1
- package/dist/web/assets/{refresh-TEuCscWV.js → refresh-fod89hf8.js} +1 -1
- package/dist/web/assets/{reown-logo-DfR-XktT.js → reown-logo-CHTOcVHN.js} +1 -1
- package/dist/web/assets/{search-toStFVmY.js → search-C-9etLr-.js} +1 -1
- package/dist/web/assets/{secp256k1-4pFpe3fj.js → secp256k1-Do1cC_MA.js} +1 -1
- package/dist/web/assets/{send-ClyDyBO7.js → send-DD9tf6By.js} +1 -1
- package/dist/web/assets/{swapHorizontal-CXCJUjUn.js → swapHorizontal-DwUF3NTe.js} +1 -1
- package/dist/web/assets/{swapHorizontalBold-Dk7L91xv.js → swapHorizontalBold-DyPkwtbf.js} +1 -1
- package/dist/web/assets/{swapHorizontalMedium-CqZa-X1O.js → swapHorizontalMedium-pgmoKKQc.js} +1 -1
- package/dist/web/assets/{swapHorizontalRoundedBold-AxS9Ahfo.js → swapHorizontalRoundedBold-DhEu9ydT.js} +1 -1
- package/dist/web/assets/{swapVertical-A42Ry_KO.js → swapVertical-CeL6qjtG.js} +1 -1
- package/dist/web/assets/{telegram-CC-Q4JVb.js → telegram-YwqiLuim.js} +1 -1
- package/dist/web/assets/{three-dots-CIbexbbL.js → three-dots-DYARiZtt.js} +1 -1
- package/dist/web/assets/{twitch-uJDw3--F.js → twitch-CxbjfG_J.js} +1 -1
- package/dist/web/assets/{twitterIcon-CQrpCxzv.js → twitterIcon-BCL0wspr.js} +1 -1
- package/dist/web/assets/{verify-C2awa59E.js → verify-CKYaNBxc.js} +1 -1
- package/dist/web/assets/{verify-filled-B9qF1cXp.js → verify-filled-C0VQdTnm.js} +1 -1
- package/dist/web/assets/{w3m-modal-DITdZ8xD.js → w3m-modal-Dd38vGmL.js} +1 -1
- package/dist/web/assets/{wallet-placeholder-BlUaZ2tK.js → wallet-placeholder-Btyoi8DW.js} +1 -1
- package/dist/web/assets/{wallet-DxxiZsDo.js → wallet-tEN9jw7i.js} +1 -1
- package/dist/web/assets/{walletconnect-ifsXHNW2.js → walletconnect-DU70qvIG.js} +1 -1
- package/dist/web/assets/{warning-circle-BACwffwW.js → warning-circle-BwVSdfIJ.js} +1 -1
- package/dist/web/assets/{x-CODHraZc.js → x-bljmw6xn.js} +1 -1
- package/dist/web/index.html +1 -1
- package/package.json +4 -4
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { FastifyInstance } from 'fastify';
|
|
2
|
+
import { type FreeTierDelegation } from '@antseed/node';
|
|
3
|
+
interface FreeTierDelegationRoutesContext {
|
|
4
|
+
configPath: string;
|
|
5
|
+
chainId: number;
|
|
6
|
+
/** The buyer identity this page serves, or null when no identity is loaded. */
|
|
7
|
+
buyerAddress: string | null;
|
|
8
|
+
}
|
|
9
|
+
/** The buyer's saved delegations from config.json (`buyer.freeTierDelegations`). */
|
|
10
|
+
export declare function readFreeTierDelegations(configPath: string): Promise<FreeTierDelegation[]>;
|
|
11
|
+
/**
|
|
12
|
+
* Save `delegation`, replacing an earlier one from the same staker to the
|
|
13
|
+
* same buyer. Other config keys are left untouched. Edits of one config file
|
|
14
|
+
* run one at a time across processes (this page, the CLI and the gateway hold
|
|
15
|
+
* the same lock file), so concurrent edits keep each other's changes; a
|
|
16
|
+
* symlinked config is updated at its target and keeps its permissions.
|
|
17
|
+
*/
|
|
18
|
+
export declare function saveFreeTierDelegation(configPath: string, delegation: FreeTierDelegation): Promise<FreeTierDelegation[]>;
|
|
19
|
+
/**
|
|
20
|
+
* Routes for the "Share free tier" page: the staker's wallet signs a
|
|
21
|
+
* delegation in the browser, and the server checks it and saves it for the
|
|
22
|
+
* buyer node to send to sellers.
|
|
23
|
+
*/
|
|
24
|
+
export declare function registerFreeTierDelegationRoutes(fastify: FastifyInstance, ctx: FreeTierDelegationRoutesContext): void;
|
|
25
|
+
export {};
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { chmod, readFile, realpath, rename, rm, stat, writeFile } from 'node:fs/promises';
|
|
3
|
+
import { getAddress, isAddress } from 'ethers';
|
|
4
|
+
import { DEFAULT_FREE_TIER_DELEGATION_DAYS, FREE_TIER_DELEGATION_TYPES, isFreeTierDelegationSigned, makeFreeTierDelegationDomain, withFileLock, withFreeTierDelegation, } from '@antseed/node';
|
|
5
|
+
/** The buyer's saved delegations from config.json (`buyer.freeTierDelegations`). */
|
|
6
|
+
export async function readFreeTierDelegations(configPath) {
|
|
7
|
+
const config = await readConfig(configPath);
|
|
8
|
+
const buyer = (config.buyer ?? {});
|
|
9
|
+
return Array.isArray(buyer.freeTierDelegations) ? buyer.freeTierDelegations : [];
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Save `delegation`, replacing an earlier one from the same staker to the
|
|
13
|
+
* same buyer. Other config keys are left untouched. Edits of one config file
|
|
14
|
+
* run one at a time across processes (this page, the CLI and the gateway hold
|
|
15
|
+
* the same lock file), so concurrent edits keep each other's changes; a
|
|
16
|
+
* symlinked config is updated at its target and keeps its permissions.
|
|
17
|
+
*/
|
|
18
|
+
export async function saveFreeTierDelegation(configPath, delegation) {
|
|
19
|
+
const target = await realTarget(configPath);
|
|
20
|
+
const save = async () => {
|
|
21
|
+
const config = await readConfig(target);
|
|
22
|
+
const buyer = (config.buyer ?? {});
|
|
23
|
+
const existing = Array.isArray(buyer.freeTierDelegations) ? buyer.freeTierDelegations : [];
|
|
24
|
+
const delegations = withFreeTierDelegation(existing, delegation);
|
|
25
|
+
config.buyer = { ...buyer, freeTierDelegations: delegations };
|
|
26
|
+
const mode = await fileMode(target) ?? 0o600;
|
|
27
|
+
const temp = `${target}.tmp-${process.pid}-${randomUUID()}`;
|
|
28
|
+
try {
|
|
29
|
+
await writeFile(temp, `${JSON.stringify(config, null, 2)}\n`, { encoding: 'utf-8', mode });
|
|
30
|
+
await chmod(temp, mode);
|
|
31
|
+
await rename(temp, target);
|
|
32
|
+
}
|
|
33
|
+
catch (err) {
|
|
34
|
+
await rm(temp, { force: true });
|
|
35
|
+
throw err;
|
|
36
|
+
}
|
|
37
|
+
return delegations;
|
|
38
|
+
};
|
|
39
|
+
return withFileLock(target, save);
|
|
40
|
+
}
|
|
41
|
+
/** The file a config path points to, following symlinks; the path itself when it does not exist yet. */
|
|
42
|
+
async function realTarget(configPath) {
|
|
43
|
+
try {
|
|
44
|
+
return await realpath(configPath);
|
|
45
|
+
}
|
|
46
|
+
catch (err) {
|
|
47
|
+
if (err.code === 'ENOENT')
|
|
48
|
+
return configPath;
|
|
49
|
+
throw err;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
async function fileMode(path) {
|
|
53
|
+
try {
|
|
54
|
+
return (await stat(path)).mode & 0o777;
|
|
55
|
+
}
|
|
56
|
+
catch (err) {
|
|
57
|
+
if (err.code === 'ENOENT')
|
|
58
|
+
return null;
|
|
59
|
+
throw err;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
async function readConfig(configPath) {
|
|
63
|
+
try {
|
|
64
|
+
return JSON.parse(await readFile(configPath, 'utf-8'));
|
|
65
|
+
}
|
|
66
|
+
catch (err) {
|
|
67
|
+
if (err.code === 'ENOENT')
|
|
68
|
+
return {};
|
|
69
|
+
throw err;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Routes for the "Share free tier" page: the staker's wallet signs a
|
|
74
|
+
* delegation in the browser, and the server checks it and saves it for the
|
|
75
|
+
* buyer node to send to sellers.
|
|
76
|
+
*/
|
|
77
|
+
export function registerFreeTierDelegationRoutes(fastify, ctx) {
|
|
78
|
+
fastify.get('/api/free-tier/delegations', async (_request, reply) => {
|
|
79
|
+
if (!ctx.buyerAddress)
|
|
80
|
+
return reply.status(503).send({ ok: false, error: 'Identity not configured' });
|
|
81
|
+
const buyer = ctx.buyerAddress.toLowerCase();
|
|
82
|
+
const delegations = (await readFreeTierDelegations(ctx.configPath))
|
|
83
|
+
.filter((delegation) => delegation.buyer.toLowerCase() === buyer);
|
|
84
|
+
return {
|
|
85
|
+
ok: true,
|
|
86
|
+
buyer: ctx.buyerAddress,
|
|
87
|
+
chainId: ctx.chainId,
|
|
88
|
+
defaultDays: DEFAULT_FREE_TIER_DELEGATION_DAYS,
|
|
89
|
+
domain: makeFreeTierDelegationDomain(ctx.chainId),
|
|
90
|
+
types: FREE_TIER_DELEGATION_TYPES,
|
|
91
|
+
delegations,
|
|
92
|
+
};
|
|
93
|
+
});
|
|
94
|
+
fastify.post('/api/free-tier/delegations', async (request, reply) => {
|
|
95
|
+
if (!ctx.buyerAddress)
|
|
96
|
+
return reply.status(503).send({ ok: false, error: 'Identity not configured' });
|
|
97
|
+
const body = request.body;
|
|
98
|
+
const staker = typeof body?.staker === 'string' ? body.staker.trim() : '';
|
|
99
|
+
const expiresAt = typeof body?.expiresAt === 'number' ? body.expiresAt : Number.NaN;
|
|
100
|
+
const signature = typeof body?.signature === 'string' ? body.signature.trim() : '';
|
|
101
|
+
if (!isAddress(staker))
|
|
102
|
+
return reply.status(400).send({ ok: false, error: 'Invalid staker address' });
|
|
103
|
+
if (!Number.isSafeInteger(expiresAt) || expiresAt * 1000 <= Date.now()) {
|
|
104
|
+
return reply.status(400).send({ ok: false, error: 'Expiry must be in the future' });
|
|
105
|
+
}
|
|
106
|
+
const delegation = {
|
|
107
|
+
staker: getAddress(staker),
|
|
108
|
+
buyer: getAddress(ctx.buyerAddress),
|
|
109
|
+
expiresAt,
|
|
110
|
+
signature,
|
|
111
|
+
};
|
|
112
|
+
if (!isFreeTierDelegationSigned(delegation, ctx.chainId)) {
|
|
113
|
+
return reply.status(400).send({ ok: false, error: 'The signature does not match the staker wallet' });
|
|
114
|
+
}
|
|
115
|
+
try {
|
|
116
|
+
await saveFreeTierDelegation(ctx.configPath, delegation);
|
|
117
|
+
return { ok: true, delegation };
|
|
118
|
+
}
|
|
119
|
+
catch (err) {
|
|
120
|
+
return reply.status(409).send({ ok: false, error: err instanceof Error ? err.message : String(err) });
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=free-tier-delegations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"free-tier-delegations.js","sourceRoot":"","sources":["../src/free-tier-delegations.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { afterEach, describe, expect, it } from 'vitest';
|
|
2
|
+
import Fastify from 'fastify';
|
|
3
|
+
import { chmodSync, lstatSync, mkdtempSync, readFileSync, rmSync, statSync, symlinkSync, writeFileSync } from 'node:fs';
|
|
4
|
+
import { tmpdir } from 'node:os';
|
|
5
|
+
import { join } from 'node:path';
|
|
6
|
+
import { Wallet } from 'ethers';
|
|
7
|
+
import { FREE_TIER_DELEGATION_TYPES, freeTierDelegationMessage, makeFreeTierDelegationDomain } from '@antseed/node';
|
|
8
|
+
import { registerFreeTierDelegationRoutes } from './free-tier-delegations.js';
|
|
9
|
+
const CHAIN_ID = 8453;
|
|
10
|
+
const BUYER = Wallet.createRandom().address;
|
|
11
|
+
const dirs = [];
|
|
12
|
+
afterEach(() => {
|
|
13
|
+
for (const dir of dirs.splice(0))
|
|
14
|
+
rmSync(dir, { recursive: true, force: true });
|
|
15
|
+
});
|
|
16
|
+
async function setup() {
|
|
17
|
+
const dir = mkdtempSync(join(tmpdir(), 'antseed-free-tier-'));
|
|
18
|
+
dirs.push(dir);
|
|
19
|
+
const configPath = join(dir, 'config.json');
|
|
20
|
+
writeFileSync(configPath, JSON.stringify({ buyer: { proxyPort: 8377 }, seller: { freeTier: { maxRequestsPerAddress: 5 } } }));
|
|
21
|
+
const app = Fastify();
|
|
22
|
+
registerFreeTierDelegationRoutes(app, { configPath, chainId: CHAIN_ID, buyerAddress: BUYER });
|
|
23
|
+
return { app, configPath };
|
|
24
|
+
}
|
|
25
|
+
async function signed(staker, expiresAt) {
|
|
26
|
+
const signature = await staker.signTypedData(makeFreeTierDelegationDomain(CHAIN_ID), FREE_TIER_DELEGATION_TYPES, freeTierDelegationMessage({ staker: staker.address, buyer: BUYER, expiresAt }));
|
|
27
|
+
return { staker: staker.address, expiresAt, signature };
|
|
28
|
+
}
|
|
29
|
+
describe('free-tier delegation routes', () => {
|
|
30
|
+
it('saves a delegation signed by the staker, keeping the rest of the config', async () => {
|
|
31
|
+
const { app, configPath } = await setup();
|
|
32
|
+
const staker = Wallet.createRandom();
|
|
33
|
+
const expiresAt = Math.floor(Date.now() / 1000) + 86_400;
|
|
34
|
+
const response = await app.inject({ method: 'POST', url: '/api/free-tier/delegations', payload: await signed(staker, expiresAt) });
|
|
35
|
+
expect(response.statusCode).toBe(200);
|
|
36
|
+
const config = JSON.parse(readFileSync(configPath, 'utf-8'));
|
|
37
|
+
expect(config.buyer.proxyPort).toBe(8377);
|
|
38
|
+
expect(config.seller.freeTier.maxRequestsPerAddress).toBe(5);
|
|
39
|
+
expect(config.buyer.freeTierDelegations).toEqual([expect.objectContaining({ staker: staker.address, buyer: BUYER, expiresAt })]);
|
|
40
|
+
// Signing again replaces the earlier delegation instead of adding another.
|
|
41
|
+
await app.inject({ method: 'POST', url: '/api/free-tier/delegations', payload: await signed(staker, expiresAt + 10) });
|
|
42
|
+
const listed = (await app.inject({ method: 'GET', url: '/api/free-tier/delegations' })).json();
|
|
43
|
+
expect(listed.delegations).toHaveLength(1);
|
|
44
|
+
expect(listed.delegations[0].expiresAt).toBe(expiresAt + 10);
|
|
45
|
+
});
|
|
46
|
+
it('keeps both delegations when two stakers save at the same time', async () => {
|
|
47
|
+
const { app, configPath } = await setup();
|
|
48
|
+
const expiresAt = Math.floor(Date.now() / 1000) + 86_400;
|
|
49
|
+
const [first, second] = [Wallet.createRandom(), Wallet.createRandom()];
|
|
50
|
+
const responses = await Promise.all([first, second].map(async (staker) => app.inject({ method: 'POST', url: '/api/free-tier/delegations', payload: await signed(staker, expiresAt) })));
|
|
51
|
+
expect(responses.map((response) => response.statusCode)).toEqual([200, 200]);
|
|
52
|
+
const config = JSON.parse(readFileSync(configPath, 'utf-8'));
|
|
53
|
+
expect(config.buyer.proxyPort).toBe(8377);
|
|
54
|
+
expect(config.buyer.freeTierDelegations.map((entry) => entry.staker).sort())
|
|
55
|
+
.toEqual([first.address, second.address].sort());
|
|
56
|
+
});
|
|
57
|
+
it('saves through a symlinked config to its target and keeps an owner-only mode', async () => {
|
|
58
|
+
const dir = mkdtempSync(join(tmpdir(), 'antseed-free-tier-'));
|
|
59
|
+
dirs.push(dir);
|
|
60
|
+
const target = join(dir, 'shared.json');
|
|
61
|
+
writeFileSync(target, JSON.stringify({ buyer: { proxyPort: 8377 } }));
|
|
62
|
+
chmodSync(target, 0o600);
|
|
63
|
+
const configPath = join(dir, 'config.json');
|
|
64
|
+
symlinkSync(target, configPath);
|
|
65
|
+
const app = Fastify();
|
|
66
|
+
registerFreeTierDelegationRoutes(app, { configPath, chainId: CHAIN_ID, buyerAddress: BUYER });
|
|
67
|
+
const staker = Wallet.createRandom();
|
|
68
|
+
const payload = await signed(staker, Math.floor(Date.now() / 1000) + 86_400);
|
|
69
|
+
expect((await app.inject({ method: 'POST', url: '/api/free-tier/delegations', payload })).statusCode).toBe(200);
|
|
70
|
+
expect(lstatSync(configPath).isSymbolicLink()).toBe(true);
|
|
71
|
+
expect(statSync(target).mode & 0o777).toBe(0o600);
|
|
72
|
+
expect(JSON.parse(readFileSync(target, 'utf-8')).buyer.freeTierDelegations).toEqual([expect.objectContaining({ staker: staker.address })]);
|
|
73
|
+
});
|
|
74
|
+
it('rejects a signature from a different wallet and expired delegations', async () => {
|
|
75
|
+
const { app } = await setup();
|
|
76
|
+
const staker = Wallet.createRandom();
|
|
77
|
+
const forged = { ...(await signed(Wallet.createRandom(), Math.floor(Date.now() / 1000) + 60)), staker: staker.address };
|
|
78
|
+
expect((await app.inject({ method: 'POST', url: '/api/free-tier/delegations', payload: forged })).statusCode).toBe(400);
|
|
79
|
+
const expired = await signed(staker, Math.floor(Date.now() / 1000) - 1);
|
|
80
|
+
expect((await app.inject({ method: 'POST', url: '/api/free-tier/delegations', payload: expired })).statusCode).toBe(400);
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
//# sourceMappingURL=free-tier-delegations.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"free-tier-delegations.test.js","sourceRoot":"","sources":["../src/free-tier-delegations.test.ts"],"names":[],"mappings":"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"}
|
package/dist/server.js
CHANGED
|
@@ -8,6 +8,7 @@ import { homedir } from 'node:os';
|
|
|
8
8
|
import { readFile } from 'node:fs/promises';
|
|
9
9
|
import { resolveChainConfig } from '@antseed/node';
|
|
10
10
|
import { registerRoutes } from './routes.js';
|
|
11
|
+
import { registerFreeTierDelegationRoutes } from './free-tier-delegations.js';
|
|
11
12
|
import { loadCryptoContext } from './crypto-context.js';
|
|
12
13
|
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
13
14
|
export async function createServer(options) {
|
|
@@ -55,10 +56,10 @@ export async function createServer(options) {
|
|
|
55
56
|
// Resolve chain config: protocol defaults + user overrides from config.json
|
|
56
57
|
let userOverrides = {};
|
|
57
58
|
let proxyPort = 8377;
|
|
59
|
+
const cfgPath = options.configPath ?? (options.dataDir
|
|
60
|
+
? path.join(options.dataDir, 'config.json')
|
|
61
|
+
: path.join(homedir(), '.antseed', 'config.json'));
|
|
58
62
|
try {
|
|
59
|
-
const cfgPath = options.configPath ?? (options.dataDir
|
|
60
|
-
? path.join(options.dataDir, 'config.json')
|
|
61
|
-
: path.join(homedir(), '.antseed', 'config.json'));
|
|
62
63
|
const raw = await readFile(cfgPath, 'utf-8');
|
|
63
64
|
const config = JSON.parse(raw);
|
|
64
65
|
const payments = (config.payments ?? {});
|
|
@@ -98,6 +99,11 @@ export async function createServer(options) {
|
|
|
98
99
|
usdcContractAddress: chainConfig.usdcContractAddress,
|
|
99
100
|
};
|
|
100
101
|
registerRoutes(fastify, { cryptoCtx, cryptoConfig, chainConfig, proxyPort });
|
|
102
|
+
registerFreeTierDelegationRoutes(fastify, {
|
|
103
|
+
configPath: cfgPath,
|
|
104
|
+
chainId: chainConfig.evmChainId,
|
|
105
|
+
buyerAddress: cryptoCtx?.evmAddress ?? null,
|
|
106
|
+
});
|
|
101
107
|
fastify.post('/api/pay/open-rewards', async (_request, reply) => {
|
|
102
108
|
if (!options.onOpenRewards)
|
|
103
109
|
return reply.status(409).send({ ok: false, error: 'Open the ANTS dashboard with antseed ants, using this account’s data directory, then select Rewards.' });
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{w as o}from"./core-
|
|
1
|
+
import{w as o}from"./core-DtBtW8-1.js";import"./index-Ck4Xjs9A.js";import"./index.es-Cb6GoQM0.js";import"./events-DQ172AOg.js";const e=o`<svg
|
|
2
2
|
width="14"
|
|
3
3
|
height="14"
|
|
4
4
|
viewBox="0 0 14 14"
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{w as o}from"./core-
|
|
1
|
+
import{w as o}from"./core-DtBtW8-1.js";import"./index-Ck4Xjs9A.js";import"./index.es-Cb6GoQM0.js";import"./events-DQ172AOg.js";const r=o`<svg fill="none" viewBox="0 0 24 24">
|
|
2
2
|
<path
|
|
3
3
|
style="fill: var(--wui-color-accent-100);"
|
|
4
4
|
d="M10.2 6.6a3.6 3.6 0 1 1-7.2 0 3.6 3.6 0 0 1 7.2 0ZM21 6.6a3.6 3.6 0 1 1-7.2 0 3.6 3.6 0 0 1 7.2 0ZM10.2 17.4a3.6 3.6 0 1 1-7.2 0 3.6 3.6 0 0 1 7.2 0ZM21 17.4a3.6 3.6 0 1 1-7.2 0 3.6 3.6 0 0 1 7.2 0Z"
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{w as t}from"./core-
|
|
1
|
+
import{w as t}from"./core-DtBtW8-1.js";import"./index-Ck4Xjs9A.js";import"./index.es-Cb6GoQM0.js";import"./events-DQ172AOg.js";const e=t`
|
|
2
2
|
<svg width="36" height="36">
|
|
3
3
|
<path
|
|
4
4
|
d="M28.724 0H7.271A7.269 7.269 0 0 0 0 7.272v21.46A7.268 7.268 0 0 0 7.271 36H28.73A7.272 7.272 0 0 0 36 28.728V7.272A7.275 7.275 0 0 0 28.724 0Z"
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{w as i}from"./core-
|
|
1
|
+
import{w as i}from"./core-DtBtW8-1.js";import"./index-Ck4Xjs9A.js";import"./index.es-Cb6GoQM0.js";import"./events-DQ172AOg.js";const c=i`<svg fill="none" viewBox="0 0 40 40">
|
|
2
2
|
<g clip-path="url(#a)">
|
|
3
3
|
<g clip-path="url(#b)">
|
|
4
4
|
<circle cx="20" cy="19.89" r="20" fill="#000" />
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{w as o}from"./core-
|
|
1
|
+
import{w as o}from"./core-DtBtW8-1.js";import"./index-Ck4Xjs9A.js";import"./index.es-Cb6GoQM0.js";import"./events-DQ172AOg.js";const i=o`<svg fill="none" viewBox="0 0 14 15">
|
|
2
2
|
<path
|
|
3
3
|
fill="currentColor"
|
|
4
4
|
fill-rule="evenodd"
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{w as C}from"./core-
|
|
1
|
+
import{w as C}from"./core-DtBtW8-1.js";import"./index-Ck4Xjs9A.js";import"./index.es-Cb6GoQM0.js";import"./events-DQ172AOg.js";const i=C`<svg
|
|
2
2
|
fill="none"
|
|
3
3
|
viewBox="0 0 21 20"
|
|
4
4
|
>
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{w as o}from"./core-
|
|
1
|
+
import{w as o}from"./core-DtBtW8-1.js";import"./index-Ck4Xjs9A.js";import"./index.es-Cb6GoQM0.js";import"./events-DQ172AOg.js";const t=o`<svg fill="none" viewBox="0 0 14 15">
|
|
2
2
|
<path
|
|
3
3
|
fill="currentColor"
|
|
4
4
|
fill-rule="evenodd"
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{w as o}from"./core-
|
|
1
|
+
import{w as o}from"./core-DtBtW8-1.js";import"./index-Ck4Xjs9A.js";import"./index.es-Cb6GoQM0.js";import"./events-DQ172AOg.js";const t=o`<svg fill="none" viewBox="0 0 14 15">
|
|
2
2
|
<path
|
|
3
3
|
fill="currentColor"
|
|
4
4
|
fill-rule="evenodd"
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{w as o}from"./core-
|
|
1
|
+
import{w as o}from"./core-DtBtW8-1.js";import"./index-Ck4Xjs9A.js";import"./index.es-Cb6GoQM0.js";import"./events-DQ172AOg.js";const p=o`<svg fill="none" viewBox="0 0 14 15">
|
|
2
2
|
<path
|
|
3
3
|
fill="currentColor"
|
|
4
4
|
fill-rule="evenodd"
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{w as o}from"./core-
|
|
1
|
+
import{w as o}from"./core-DtBtW8-1.js";import"./index-Ck4Xjs9A.js";import"./index.es-Cb6GoQM0.js";import"./events-DQ172AOg.js";const l=o`<svg
|
|
2
2
|
xmlns="http://www.w3.org/2000/svg"
|
|
3
3
|
width="12"
|
|
4
4
|
height="13"
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{i as N,e as G,r as q,c as O,d as c,k as M,n as z,O as ee,q as k,E as te,R as U,z as Me,g as K,B as j,D as ft,t as Cn,W as pt,C as Zt,h as vi,T as ei,m as Xe,M as on,F as rn,w as Ne,x as yi,f as Rn}from"./core-
|
|
1
|
+
import{i as N,e as G,r as q,c as O,d as c,k as M,n as z,O as ee,q as k,E as te,R as U,z as Me,g as K,B as j,D as ft,t as Cn,W as pt,C as Zt,h as vi,T as ei,m as Xe,M as on,F as rn,w as Ne,x as yi,f as Rn}from"./core-DtBtW8-1.js";import{n as u,c as B,o as E,r as _,U as he,e as $n,f as _n,a as In}from"./index-CS32ZEaB.js";import{n as En}from"./index-Ck4Xjs9A.js";import"./index.es-Cb6GoQM0.js";import"./events-DQ172AOg.js";const Wn=N`
|
|
2
2
|
:host {
|
|
3
3
|
position: relative;
|
|
4
4
|
background-color: var(--wui-color-gray-glass-002);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{w as l}from"./core-
|
|
1
|
+
import{w as l}from"./core-DtBtW8-1.js";import"./index-Ck4Xjs9A.js";import"./index.es-Cb6GoQM0.js";import"./events-DQ172AOg.js";const c=l`<svg fill="none" viewBox="0 0 20 20">
|
|
2
2
|
<path
|
|
3
3
|
fill="currentColor"
|
|
4
4
|
fill-rule="evenodd"
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{w as C}from"./core-
|
|
1
|
+
import{w as C}from"./core-DtBtW8-1.js";import"./index-Ck4Xjs9A.js";import"./index.es-Cb6GoQM0.js";import"./events-DQ172AOg.js";const i=C`<svg
|
|
2
2
|
xmlns="http://www.w3.org/2000/svg"
|
|
3
3
|
width="12"
|
|
4
4
|
height="13"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{B as p,g as m,s as w,d as k,i as b,l as L,a as O,c as E,b as x,e as R,H as y,f as M}from"./index-
|
|
1
|
+
import{B as p,g as m,s as w,d as k,i as b,l as L,a as O,c as E,b as x,e as R,H as y,f as M}from"./index-Ck4Xjs9A.js";class S extends p{constructor({callbackSelector:r,cause:a,data:n,extraData:i,sender:f,urls:t}){var o;super(a.shortMessage||"An error occurred while fetching for an offchain result.",{cause:a,metaMessages:[...a.metaMessages||[],(o=a.metaMessages)!=null&&o.length?"":[],"Offchain Gateway Call:",t&&[" Gateway URL(s):",...t.map(d=>` ${m(d)}`)],` Sender: ${f}`,` Data: ${n}`,` Callback selector: ${r}`,` Extra data: ${i}`].flat(),name:"OffchainLookupError"})}}class $ extends p{constructor({result:r,url:a}){super("Offchain gateway response is malformed. Response data must be a hex value.",{metaMessages:[`Gateway URL: ${m(a)}`,`Response: ${w(r)}`],name:"OffchainLookupResponseMalformedError"})}}class q extends p{constructor({sender:r,to:a}){super("Reverted sender address does not match target contract address (`to`).",{metaMessages:[`Contract address: ${a}`,`OffchainLookup sender address: ${r}`],name:"OffchainLookupSenderMismatchError"})}}const A="0x556f1830",T={name:"OffchainLookup",type:"error",inputs:[{name:"sender",type:"address"},{name:"urls",type:"string[]"},{name:"callData",type:"bytes"},{name:"callbackFunction",type:"bytes4"},{name:"extraData",type:"bytes"}]};async function D(c,{blockNumber:r,blockTag:a,data:n,to:i}){const{args:f}=k({data:n,abi:[T]}),[t,o,d,l,s]=f,{ccipRead:e}=c,h=e&&typeof(e==null?void 0:e.request)=="function"?e.request:C;try{if(!b(i,t))throw new q({sender:t,to:i});const u=o.includes(L)?await O({data:d,ccipRequest:h}):await h({data:d,sender:t,urls:o}),{data:g}=await E(c,{blockNumber:r,blockTag:a,data:x([l,R([{type:"bytes"},{type:"bytes"}],[u,s])]),to:i});return g}catch(u){throw new S({callbackSelector:l,cause:u,data:n,extraData:s,sender:t,urls:o})}}async function C({data:c,sender:r,urls:a}){var i;let n=new Error("An unknown error occurred.");for(let f=0;f<a.length;f++){const t=a[f],o=t.includes("{data}")?"GET":"POST",d=o==="POST"?{data:c,sender:r}:void 0,l=o==="POST"?{"Content-Type":"application/json"}:{};try{const s=await fetch(t.replace("{sender}",r.toLowerCase()).replace("{data}",c),{body:JSON.stringify(d),headers:l,method:o});let e;if((i=s.headers.get("Content-Type"))!=null&&i.startsWith("application/json")?e=(await s.json()).data:e=await s.text(),!s.ok){n=new y({body:d,details:e!=null&&e.error?w(e.error):s.statusText,headers:s.headers,status:s.status,url:t});continue}if(!M(e)){n=new $({result:e,url:t});continue}return e}catch(s){n=new y({body:d,details:s.message,url:t})}}throw n}export{C as ccipRequest,D as offchainLookup,T as offchainLookupAbiItem,A as offchainLookupSignature};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{w as o}from"./core-
|
|
1
|
+
import{w as o}from"./core-DtBtW8-1.js";import"./index-Ck4Xjs9A.js";import"./index.es-Cb6GoQM0.js";import"./events-DQ172AOg.js";const l=o`<svg
|
|
2
2
|
width="28"
|
|
3
3
|
height="28"
|
|
4
4
|
viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{w as o}from"./core-
|
|
1
|
+
import{w as o}from"./core-DtBtW8-1.js";import"./index-Ck4Xjs9A.js";import"./index.es-Cb6GoQM0.js";import"./events-DQ172AOg.js";const t=o`<svg fill="none" viewBox="0 0 14 14">
|
|
2
2
|
<path
|
|
3
3
|
fill="currentColor"
|
|
4
4
|
fill-rule="evenodd"
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{w as o}from"./core-
|
|
1
|
+
import{w as o}from"./core-DtBtW8-1.js";import"./index-Ck4Xjs9A.js";import"./index.es-Cb6GoQM0.js";import"./events-DQ172AOg.js";const i=o`<svg fill="none" viewBox="0 0 16 16">
|
|
2
2
|
<path
|
|
3
3
|
fill="currentColor"
|
|
4
4
|
fill-rule="evenodd"
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{w as o}from"./core-
|
|
1
|
+
import{w as o}from"./core-DtBtW8-1.js";import"./index-Ck4Xjs9A.js";import"./index.es-Cb6GoQM0.js";import"./events-DQ172AOg.js";const t=o`<svg fill="none" viewBox="0 0 16 16">
|
|
2
2
|
<path
|
|
3
3
|
fill="currentColor"
|
|
4
4
|
fill-rule="evenodd"
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{w as o}from"./core-
|
|
1
|
+
import{w as o}from"./core-DtBtW8-1.js";import"./index-Ck4Xjs9A.js";import"./index.es-Cb6GoQM0.js";import"./events-DQ172AOg.js";const t=o`<svg fill="none" viewBox="0 0 16 16">
|
|
2
2
|
<path
|
|
3
3
|
fill="currentColor"
|
|
4
4
|
fill-rule="evenodd"
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{w as o}from"./core-
|
|
1
|
+
import{w as o}from"./core-DtBtW8-1.js";import"./index-Ck4Xjs9A.js";import"./index.es-Cb6GoQM0.js";import"./events-DQ172AOg.js";const p=o`<svg fill="none" viewBox="0 0 16 16">
|
|
2
2
|
<path
|
|
3
3
|
fill="currentColor"
|
|
4
4
|
fill-rule="evenodd"
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{w as t}from"./core-
|
|
1
|
+
import{w as t}from"./core-DtBtW8-1.js";import"./index-Ck4Xjs9A.js";import"./index.es-Cb6GoQM0.js";import"./events-DQ172AOg.js";const e=t`<svg width="36" height="36" fill="none">
|
|
2
2
|
<path
|
|
3
3
|
fill="#fff"
|
|
4
4
|
fill-opacity=".05"
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{w as o}from"./core-
|
|
1
|
+
import{w as o}from"./core-DtBtW8-1.js";import"./index-Ck4Xjs9A.js";import"./index.es-Cb6GoQM0.js";import"./events-DQ172AOg.js";const r=o`<svg width="14" height="14" viewBox="0 0 14 14" fill="none">
|
|
2
2
|
<path
|
|
3
3
|
fill-rule="evenodd"
|
|
4
4
|
clip-rule="evenodd"
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{w as l}from"./core-
|
|
1
|
+
import{w as l}from"./core-DtBtW8-1.js";import"./index-Ck4Xjs9A.js";import"./index.es-Cb6GoQM0.js";import"./events-DQ172AOg.js";const t=l`<svg fill="none" viewBox="0 0 16 16">
|
|
2
2
|
<path
|
|
3
3
|
fill="currentColor"
|
|
4
4
|
fill-rule="evenodd"
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{w as o}from"./core-
|
|
1
|
+
import{w as o}from"./core-DtBtW8-1.js";import"./index-Ck4Xjs9A.js";import"./index.es-Cb6GoQM0.js";import"./events-DQ172AOg.js";const t=o`<svg fill="none" viewBox="0 0 20 20">
|
|
2
2
|
<path
|
|
3
3
|
fill="currentColor"
|
|
4
4
|
fill-rule="evenodd"
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{w as o}from"./core-
|
|
1
|
+
import{w as o}from"./core-DtBtW8-1.js";import"./index-Ck4Xjs9A.js";import"./index.es-Cb6GoQM0.js";import"./events-DQ172AOg.js";const a=o`<svg fill="none" viewBox="0 0 16 16">
|
|
2
2
|
<path
|
|
3
3
|
fill="currentColor"
|
|
4
4
|
fill-rule="evenodd"
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{w as C}from"./core-
|
|
1
|
+
import{w as C}from"./core-DtBtW8-1.js";import"./index-Ck4Xjs9A.js";import"./index.es-Cb6GoQM0.js";import"./events-DQ172AOg.js";const t=C`<svg
|
|
2
2
|
xmlns="http://www.w3.org/2000/svg"
|
|
3
3
|
width="16"
|
|
4
4
|
height="16"
|