@intent-engine/cli 0.1.23 → 0.1.26
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/src/admin-commands.d.ts +12 -0
- package/dist/src/admin-commands.js +140 -0
- package/dist/src/admin-commands.js.map +1 -0
- package/dist/src/agent/actions.d.ts +2 -0
- package/dist/src/agent/actions.js +1 -1
- package/dist/src/agent/actions.js.map +1 -1
- package/dist/src/agent/claims.js +13 -12
- package/dist/src/agent/claims.js.map +1 -1
- package/dist/src/agent/create.d.ts +1 -0
- package/dist/src/agent/create.js +7 -3
- package/dist/src/agent/create.js.map +1 -1
- package/dist/src/agent/mandate-agent.d.ts +2 -0
- package/dist/src/agent/mandate-agent.js +136 -0
- package/dist/src/agent/mandate-agent.js.map +1 -0
- package/dist/src/agent/mandate-grant.d.ts +2 -0
- package/dist/src/agent/mandate-grant.js +192 -0
- package/dist/src/agent/mandate-grant.js.map +1 -0
- package/dist/src/agent/mandate-revoke.d.ts +1 -0
- package/dist/src/agent/mandate-revoke.js +142 -0
- package/dist/src/agent/mandate-revoke.js.map +1 -0
- package/dist/src/agent/mandate-state.d.ts +33 -0
- package/dist/src/agent/mandate-state.js +85 -0
- package/dist/src/agent/mandate-state.js.map +1 -0
- package/dist/src/agent/mandate.d.ts +4 -26
- package/dist/src/agent/mandate.js +4 -479
- package/dist/src/agent/mandate.js.map +1 -1
- package/dist/src/agent/mcp.js +7 -3
- package/dist/src/agent/mcp.js.map +1 -1
- package/dist/src/agent/prepare.js +1 -1
- package/dist/src/agent/prepare.js.map +1 -1
- package/dist/src/agent/problems.d.ts +13 -1
- package/dist/src/agent/problems.js +32 -1
- package/dist/src/agent/problems.js.map +1 -1
- package/dist/src/agent/read.d.ts +12 -0
- package/dist/src/agent/read.js +20 -6
- package/dist/src/agent/read.js.map +1 -1
- package/dist/src/agent/registry.js +6 -1
- package/dist/src/agent/registry.js.map +1 -1
- package/dist/src/agent/relay.d.ts +2 -0
- package/dist/src/agent/relay.js +11 -3
- package/dist/src/agent/relay.js.map +1 -1
- package/dist/src/agent/sales.d.ts +29 -0
- package/dist/src/agent/sales.js +248 -0
- package/dist/src/agent/sales.js.map +1 -0
- package/dist/src/agent/signed-prepare.d.ts +1 -0
- package/dist/src/agent/signed-prepare.js +141 -0
- package/dist/src/agent/signed-prepare.js.map +1 -0
- package/dist/src/agent/signed-relay.d.ts +25 -0
- package/dist/src/agent/signed-relay.js +68 -0
- package/dist/src/agent/signed-relay.js.map +1 -0
- package/dist/src/agent/signed-submit.d.ts +2 -0
- package/dist/src/agent/signed-submit.js +137 -0
- package/dist/src/agent/signed-submit.js.map +1 -0
- package/dist/src/agent/signed-terms.d.ts +85 -0
- package/dist/src/agent/signed-terms.js +84 -0
- package/dist/src/agent/signed-terms.js.map +1 -0
- package/dist/src/agent/signed.d.ts +4 -13
- package/dist/src/agent/signed.js +4 -361
- package/dist/src/agent/signed.js.map +1 -1
- package/dist/src/agent/wallet/account.d.ts +4 -0
- package/dist/src/agent/wallet/account.js +84 -0
- package/dist/src/agent/wallet/account.js.map +1 -0
- package/dist/src/agent/wallet/attest.d.ts +4 -0
- package/dist/src/agent/wallet/attest.js +178 -0
- package/dist/src/agent/wallet/attest.js.map +1 -0
- package/dist/src/agent/wallet/delivery.d.ts +13 -0
- package/dist/src/agent/wallet/delivery.js +171 -0
- package/dist/src/agent/wallet/delivery.js.map +1 -0
- package/dist/src/agent/wallet/escrow.d.ts +7 -0
- package/dist/src/agent/wallet/escrow.js +164 -0
- package/dist/src/agent/wallet/escrow.js.map +1 -0
- package/dist/src/agent/wallet/fills.d.ts +27 -0
- package/dist/src/agent/wallet/fills.js +80 -0
- package/dist/src/agent/wallet/fills.js.map +1 -0
- package/dist/src/agent/wallet/guard.d.ts +57 -0
- package/dist/src/agent/wallet/guard.js +205 -0
- package/dist/src/agent/wallet/guard.js.map +1 -0
- package/dist/src/agent/wallet/offer.d.ts +50 -0
- package/dist/src/agent/wallet/offer.js +80 -0
- package/dist/src/agent/wallet/offer.js.map +1 -0
- package/dist/src/agent/wallet/receipt.d.ts +42 -0
- package/dist/src/agent/wallet/receipt.js +102 -0
- package/dist/src/agent/wallet/receipt.js.map +1 -0
- package/dist/src/agent/wallet/record.d.ts +31 -0
- package/dist/src/agent/wallet/record.js +178 -0
- package/dist/src/agent/wallet/record.js.map +1 -0
- package/dist/src/agent/wallet/releases.d.ts +40 -0
- package/dist/src/agent/wallet/releases.js +236 -0
- package/dist/src/agent/wallet/releases.js.map +1 -0
- package/dist/src/agent/wallet/split.d.ts +10 -0
- package/dist/src/agent/wallet/split.js +271 -0
- package/dist/src/agent/wallet/split.js.map +1 -0
- package/dist/src/agent/wallet/trade.d.ts +14 -0
- package/dist/src/agent/wallet/trade.js +243 -0
- package/dist/src/agent/wallet/trade.js.map +1 -0
- package/dist/src/agent/wallet/wait.d.ts +5 -0
- package/dist/src/agent/wallet/wait.js +99 -0
- package/dist/src/agent/wallet/wait.js.map +1 -0
- package/dist/src/agent/wallet.d.ts +18 -73
- package/dist/src/agent/wallet.js +24 -1322
- package/dist/src/agent/wallet.js.map +1 -1
- package/dist/src/arg-options.d.ts +333 -0
- package/dist/src/arg-options.js +310 -0
- package/dist/src/arg-options.js.map +1 -0
- package/dist/src/arg-usage.d.ts +7 -0
- package/dist/src/arg-usage.js +53 -0
- package/dist/src/arg-usage.js.map +1 -0
- package/dist/src/arg-values.d.ts +47 -0
- package/dist/src/arg-values.js +280 -0
- package/dist/src/arg-values.js.map +1 -0
- package/dist/src/args.d.ts +7 -545
- package/dist/src/args.js +55 -923
- package/dist/src/args.js.map +1 -1
- package/dist/src/artifact.d.ts +22 -0
- package/dist/src/artifact.js +89 -0
- package/dist/src/artifact.js.map +1 -0
- package/dist/src/check-process.d.ts +39 -0
- package/dist/src/check-process.js +338 -0
- package/dist/src/check-process.js.map +1 -0
- package/dist/src/command-builders.d.ts +37 -0
- package/dist/src/command-builders.js +216 -0
- package/dist/src/command-builders.js.map +1 -0
- package/dist/src/command-types.d.ts +227 -0
- package/dist/src/command-types.js +2 -0
- package/dist/src/command-types.js.map +1 -0
- package/dist/src/commands.d.ts +7 -43
- package/dist/src/commands.js +60 -457
- package/dist/src/commands.js.map +1 -1
- package/dist/src/event-feed.d.ts +13 -0
- package/dist/src/event-feed.js +46 -0
- package/dist/src/event-feed.js.map +1 -0
- package/dist/src/flow-commands.d.ts +8 -0
- package/dist/src/flow-commands.js +116 -0
- package/dist/src/flow-commands.js.map +1 -0
- package/dist/src/flows.d.ts +6 -0
- package/dist/src/flows.js +84 -10
- package/dist/src/flows.js.map +1 -1
- package/dist/src/job-commands.d.ts +9 -0
- package/dist/src/job-commands.js +89 -0
- package/dist/src/job-commands.js.map +1 -0
- package/dist/src/judge-errors.d.ts +12 -0
- package/dist/src/judge-errors.js +16 -0
- package/dist/src/judge-errors.js.map +1 -0
- package/dist/src/judge.d.ts +11 -16
- package/dist/src/judge.js +120 -100
- package/dist/src/judge.js.map +1 -1
- package/dist/src/main.d.ts +4 -1
- package/dist/src/main.js +25 -9
- package/dist/src/main.js.map +1 -1
- package/dist/src/order-builders.d.ts +10 -0
- package/dist/src/order-builders.js +172 -0
- package/dist/src/order-builders.js.map +1 -0
- package/dist/src/render.d.ts +1 -0
- package/dist/src/render.js +9 -0
- package/dist/src/render.js.map +1 -1
- package/dist/src/runtime.d.ts +22 -0
- package/dist/src/runtime.js +2 -0
- package/dist/src/runtime.js.map +1 -0
- package/dist/src/solve-commands.d.ts +25 -0
- package/dist/src/solve-commands.js +171 -0
- package/dist/src/solve-commands.js.map +1 -0
- package/dist/src/tokens.js +2 -1
- package/dist/src/tokens.js.map +1 -1
- package/dist/src/version.d.ts +1 -1
- package/dist/src/version.js +1 -1
- package/dist/src/wallet.d.ts +4 -1
- package/dist/src/wallet.js +25 -5
- package/dist/src/wallet.js.map +1 -1
- package/package.json +16 -7
- package/dist/src/events.d.ts +0 -8
- package/dist/src/events.js +0 -43
- package/dist/src/events.js.map +0 -1
- package/dist/src/transport.d.ts +0 -208
- package/dist/src/transport.js +0 -441
- package/dist/src/transport.js.map +0 -1
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { Address } from "@solana/kit";
|
|
2
|
+
import type { EngineTransaction, Transport } from "@intent-engine/client";
|
|
3
|
+
export declare const SWAP_HEADROOM_BPS = 200n;
|
|
4
|
+
export declare const SWAP_BLIND_BPS = 2500n;
|
|
5
|
+
export declare const SWAP_CAP_BPS = 20000n;
|
|
6
|
+
export declare function recentFills(transport: Transport, inputMint: Address, outputMint: Address): Promise<Fill[]>;
|
|
7
|
+
export declare const bestOf: (fills: Fill[]) => Fill | undefined;
|
|
8
|
+
export declare const medianOf: (fills: Fill[]) => Fill | undefined;
|
|
9
|
+
export declare function openingAsk(fills: Fill[], amount: bigint, floor: bigint): bigint;
|
|
10
|
+
export type Fill = {
|
|
11
|
+
intent: Address;
|
|
12
|
+
amountIn: bigint;
|
|
13
|
+
delivered: bigint;
|
|
14
|
+
signature: string;
|
|
15
|
+
blockTime: bigint | null;
|
|
16
|
+
};
|
|
17
|
+
export type Pair = {
|
|
18
|
+
inputMint: Address;
|
|
19
|
+
outputMint: Address;
|
|
20
|
+
};
|
|
21
|
+
export declare function historyIn(transactions: readonly EngineTransaction[]): {
|
|
22
|
+
created: Map<Address, Pair>;
|
|
23
|
+
fills: Fill[];
|
|
24
|
+
ended: Map<Address, "cancelled" | "expired">;
|
|
25
|
+
unread: number;
|
|
26
|
+
};
|
|
27
|
+
export declare function pairOf(data: Uint8Array): Pair | null;
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { decodeEvent, getIntentDecoder } from "@intent-engine/core";
|
|
2
|
+
import { ESTIMATE_SCAN, ESTIMATE_FILLS } from "./guard.js";
|
|
3
|
+
export const SWAP_HEADROOM_BPS = 200n;
|
|
4
|
+
export const SWAP_BLIND_BPS = 2500n;
|
|
5
|
+
export const SWAP_CAP_BPS = 20000n;
|
|
6
|
+
export async function recentFills(transport, inputMint, outputMint) {
|
|
7
|
+
const { created, fills } = await engineHistory(transport, ESTIMATE_SCAN);
|
|
8
|
+
const unknown = [...new Set(fills.map((f) => f.intent).filter((intent) => !created.has(intent)))];
|
|
9
|
+
const views = unknown.length === 0 ? [] : await transport.getAccounts(unknown);
|
|
10
|
+
unknown.forEach((intent, i) => {
|
|
11
|
+
const view = views[i];
|
|
12
|
+
const pair = view === null || view === undefined ? null : pairOf(view.data);
|
|
13
|
+
if (pair !== null) {
|
|
14
|
+
created.set(intent, pair);
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
return fills
|
|
18
|
+
.filter((f) => f.amountIn > 0n && created.get(f.intent)?.inputMint === inputMint && created.get(f.intent)?.outputMint === outputMint)
|
|
19
|
+
.slice(0, ESTIMATE_FILLS);
|
|
20
|
+
}
|
|
21
|
+
const byRate = (fills) => [...fills].sort((a, b) => (a.delivered * b.amountIn < b.delivered * a.amountIn ? -1 : a.delivered * b.amountIn > b.delivered * a.amountIn ? 1 : 0));
|
|
22
|
+
export const bestOf = (fills) => byRate(fills).at(-1);
|
|
23
|
+
export const medianOf = (fills) => byRate(fills)[Math.floor((fills.length - 1) / 2)];
|
|
24
|
+
export function openingAsk(fills, amount, floor) {
|
|
25
|
+
const typical = medianOf(fills);
|
|
26
|
+
const blind = (floor * (10000n + SWAP_BLIND_BPS)) / 10000n;
|
|
27
|
+
const seen = typical === undefined ? 0n : (amount * typical.delivered * (10000n + SWAP_HEADROOM_BPS)) / (typical.amountIn * 10000n);
|
|
28
|
+
const cap = (floor * SWAP_CAP_BPS) / 10000n;
|
|
29
|
+
const ask = seen > blind ? seen : blind;
|
|
30
|
+
return ask < cap ? ask : cap;
|
|
31
|
+
}
|
|
32
|
+
async function engineHistory(transport, limit) {
|
|
33
|
+
return historyIn(await transport.engineTransactions(limit));
|
|
34
|
+
}
|
|
35
|
+
export function historyIn(transactions) {
|
|
36
|
+
const created = new Map();
|
|
37
|
+
const fills = [];
|
|
38
|
+
const ended = new Map();
|
|
39
|
+
let unread = 0;
|
|
40
|
+
for (const tx of transactions) {
|
|
41
|
+
if (tx.unread === true) {
|
|
42
|
+
unread += 1;
|
|
43
|
+
}
|
|
44
|
+
if (tx.failed) {
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
const begun = new Map();
|
|
48
|
+
for (const event of tx.emitted.map(decodeEvent)) {
|
|
49
|
+
if (event === null) {
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
const fields = event.fields;
|
|
53
|
+
const intent = fields["intent"];
|
|
54
|
+
if (event.name === "IntentCreated") {
|
|
55
|
+
created.set(intent, { inputMint: fields["inputMint"], outputMint: fields["outputMint"] });
|
|
56
|
+
}
|
|
57
|
+
if (event.name === "FillBegun") {
|
|
58
|
+
begun.set(intent, fields["amountIn"]);
|
|
59
|
+
}
|
|
60
|
+
const amountIn = event.name === "IntentFilled" ? fields["amountIn"] : event.name === "FillEnded" ? begun.get(intent) : undefined;
|
|
61
|
+
if (amountIn !== undefined) {
|
|
62
|
+
fills.push({ intent, amountIn, delivered: fields["delivered"], signature: tx.signature, blockTime: tx.blockTime });
|
|
63
|
+
}
|
|
64
|
+
if (event.name === "IntentCancelled" || event.name === "IntentExpired") {
|
|
65
|
+
ended.set(intent, event.name === "IntentCancelled" ? "cancelled" : "expired");
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return { created, fills, ended, unread };
|
|
70
|
+
}
|
|
71
|
+
export function pairOf(data) {
|
|
72
|
+
try {
|
|
73
|
+
const { inputMint, outputMint } = getIntentDecoder().decode(data);
|
|
74
|
+
return { inputMint, outputMint };
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=fills.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fills.js","sourceRoot":"","sources":["../../../../src/agent/wallet/fills.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { type Address, type KeyPairSigner } from "@solana/kit";
|
|
2
|
+
import { type Env, type WalletLimits } from "../../args.js";
|
|
3
|
+
import { type Files } from "../../wallet.js";
|
|
4
|
+
import type { AgentContext } from "../actions.js";
|
|
5
|
+
import type { Call } from "../claims.js";
|
|
6
|
+
import { type Sale, type SaleBook } from "../sales.js";
|
|
7
|
+
export type WalletGuard = {
|
|
8
|
+
limits: WalletLimits;
|
|
9
|
+
book: SaleBook;
|
|
10
|
+
};
|
|
11
|
+
export declare const walletGuard: (limits: WalletLimits, book?: SaleBook) => WalletGuard;
|
|
12
|
+
export type WalletAccess = {
|
|
13
|
+
url: string;
|
|
14
|
+
files: Files;
|
|
15
|
+
env: Env;
|
|
16
|
+
sleep(seconds: number): Promise<boolean>;
|
|
17
|
+
now(): bigint;
|
|
18
|
+
limits: WalletGuard;
|
|
19
|
+
};
|
|
20
|
+
export declare const SALE_WINDOW = 3600n;
|
|
21
|
+
export declare const ESTIMATE_SCAN = 12;
|
|
22
|
+
export declare const ESTIMATE_FILLS = 5;
|
|
23
|
+
export declare const WAIT_DEFAULT = 30;
|
|
24
|
+
export declare const WAIT_MAX = 40;
|
|
25
|
+
export declare const WAIT_SCAN = 10;
|
|
26
|
+
export declare const DEFAULT_EXPIRES_IN = 3600;
|
|
27
|
+
export declare const LANDING_SECONDS = 10;
|
|
28
|
+
export declare const MAINNET_GENESIS = "5eykt4UsFv8P8NJdTREpY1vzqKqZKvdpKuc147dw2N9d";
|
|
29
|
+
export declare const WALLET_NOTICE: string[];
|
|
30
|
+
export declare const walletEmpty: (address: string) => string;
|
|
31
|
+
export declare const NO_WALLET: string;
|
|
32
|
+
export declare const WALLET_OFF = "this server runs without a wallet; start it with mcp --wallet to let it sign";
|
|
33
|
+
export declare const PREVIEW_ONLY = "nothing was sent; show the summary to the user and call again with send: true only after they approve";
|
|
34
|
+
export declare function access(ctx: AgentContext): WalletAccess;
|
|
35
|
+
export declare function testCluster(ctx: AgentContext): Promise<WalletAccess>;
|
|
36
|
+
export declare function savedKeypair(wallet: WalletAccess): Promise<string | undefined>;
|
|
37
|
+
export declare function signerOf(ctx: AgentContext): Promise<KeyPairSigner>;
|
|
38
|
+
export declare function mintNamed(text: string, url: string, path: string): Address;
|
|
39
|
+
export declare function raw(tokens: string, decimals: number, path: string): bigint;
|
|
40
|
+
export declare const nameOf: (mint: Address) => string;
|
|
41
|
+
export declare const limited: (guard: WalletGuard) => boolean;
|
|
42
|
+
export declare function limitLines(limits: WalletLimits): string[];
|
|
43
|
+
export declare function bookOf(wallet: WalletAccess): Promise<string | undefined>;
|
|
44
|
+
export declare const live: (sales: readonly Sale[], now: bigint) => Sale[];
|
|
45
|
+
export declare function salesOf(wallet: WalletAccess, now: bigint): Promise<Sale[]>;
|
|
46
|
+
export declare function checkSale(guard: WalletGuard, mint: Address, decimals: number, amount: bigint, now: bigint, sales: readonly Sale[]): void;
|
|
47
|
+
export declare function checkHour(guard: WalletGuard, mint: Address, decimals: number, amount: bigint, now: bigint, sales: readonly Sale[]): void;
|
|
48
|
+
export declare function sent(ctx: AgentContext, signer: KeyPairSigner, view: Record<string, unknown>, send: boolean | undefined, call: Call): Promise<{
|
|
49
|
+
sent: boolean;
|
|
50
|
+
next: string;
|
|
51
|
+
} | {
|
|
52
|
+
sent: boolean;
|
|
53
|
+
signature: string;
|
|
54
|
+
}>;
|
|
55
|
+
export declare function sha256Of(text: string, path: string): string;
|
|
56
|
+
export declare function rpcRefused(error: unknown): boolean;
|
|
57
|
+
export declare const refusedBeforeSending: (error: unknown) => boolean;
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
import { resolve } from "node:path";
|
|
2
|
+
import { isSolanaError, SOLANA_ERROR__RPC__TRANSPORT_HTTP_ERROR } from "@solana/kit";
|
|
3
|
+
import { formatAmount, parseAmount } from "@intent-engine/core";
|
|
4
|
+
import { Charged, neverLanded } from "@intent-engine/client";
|
|
5
|
+
import { ENV_KEYPAIR, WALLET_NOT_MAINNET } from "../../args.js";
|
|
6
|
+
import { execute } from "../../flows.js";
|
|
7
|
+
import { TOKEN_NAMES, tokenNamed } from "../../tokens.js";
|
|
8
|
+
import { expandHome, FAUCET, PUBLIC_FAUCET, withSettings } from "../../wallet.js";
|
|
9
|
+
import { tool } from "../names.js";
|
|
10
|
+
import { AgentRefusal } from "../problems.js";
|
|
11
|
+
import { InvalidInput } from "../schema.js";
|
|
12
|
+
import { fileSales, salesPath } from "../sales.js";
|
|
13
|
+
export const walletGuard = (limits, book = fileSales()) => ({ limits, book });
|
|
14
|
+
export const SALE_WINDOW = 3600n;
|
|
15
|
+
export const ESTIMATE_SCAN = 12;
|
|
16
|
+
export const ESTIMATE_FILLS = 5;
|
|
17
|
+
export const WAIT_DEFAULT = 30;
|
|
18
|
+
export const WAIT_MAX = 40;
|
|
19
|
+
export const WAIT_SCAN = 10;
|
|
20
|
+
export const DEFAULT_EXPIRES_IN = 3_600;
|
|
21
|
+
export const LANDING_SECONDS = 10;
|
|
22
|
+
export const MAINNET_GENESIS = "5eykt4UsFv8P8NJdTREpY1vzqKqZKvdpKuc147dw2N9d";
|
|
23
|
+
export const WALLET_NOTICE = [
|
|
24
|
+
"Test network only: this wallet works on Solana devnet, testnet or localnet and refuses mainnet. Its tokens have no value.",
|
|
25
|
+
"Your key stays on this machine: setup makes one unless a keypair is already configured, and names its file. Only signed transactions leave it.",
|
|
26
|
+
"This server talks to no one but the RPC endpoint it was started with.",
|
|
27
|
+
"Nothing moves until you approve: swaps, auctions, escrows, releases and cancels only preview until you say yes.",
|
|
28
|
+
"Do not send real funds to this wallet or use its key anywhere else.",
|
|
29
|
+
];
|
|
30
|
+
export const walletEmpty = (address) => `the wallet ${address} holds no SOL yet; request devnet SOL for it at ${FAUCET} or ${PUBLIC_FAUCET}, then try again`;
|
|
31
|
+
export const NO_WALLET = `this server has no wallet yet; call ${tool("wallet_setup")} first`;
|
|
32
|
+
export const WALLET_OFF = "this server runs without a wallet; start it with mcp --wallet to let it sign";
|
|
33
|
+
export const PREVIEW_ONLY = "nothing was sent; show the summary to the user and call again with send: true only after they approve";
|
|
34
|
+
export function access(ctx) {
|
|
35
|
+
if (ctx.wallet === undefined) {
|
|
36
|
+
throw new AgentRefusal("WalletNotConfigured", WALLET_OFF);
|
|
37
|
+
}
|
|
38
|
+
return ctx.wallet;
|
|
39
|
+
}
|
|
40
|
+
const genesisOf = new WeakMap();
|
|
41
|
+
export async function testCluster(ctx) {
|
|
42
|
+
const wallet = access(ctx);
|
|
43
|
+
let genesis = genesisOf.get(wallet);
|
|
44
|
+
if (genesis === undefined) {
|
|
45
|
+
const read = ctx.transport.genesisHash();
|
|
46
|
+
genesis = read;
|
|
47
|
+
genesisOf.set(wallet, read);
|
|
48
|
+
read.catch(() => {
|
|
49
|
+
if (genesisOf.get(wallet) === read) {
|
|
50
|
+
genesisOf.delete(wallet);
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
if ((await genesis) === MAINNET_GENESIS) {
|
|
55
|
+
throw new AgentRefusal("WalletNotMainnet", WALLET_NOT_MAINNET);
|
|
56
|
+
}
|
|
57
|
+
return wallet;
|
|
58
|
+
}
|
|
59
|
+
export async function savedKeypair(wallet) {
|
|
60
|
+
return (await withSettings(wallet.files, wallet.env))[ENV_KEYPAIR];
|
|
61
|
+
}
|
|
62
|
+
export async function signerOf(ctx) {
|
|
63
|
+
const wallet = await testCluster(ctx);
|
|
64
|
+
const path = await savedKeypair(wallet);
|
|
65
|
+
if (path === undefined) {
|
|
66
|
+
throw new AgentRefusal("NoWallet", NO_WALLET);
|
|
67
|
+
}
|
|
68
|
+
try {
|
|
69
|
+
return await wallet.files.loadSigner(path);
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
throw new AgentRefusal("NoWallet", NO_WALLET);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
export function mintNamed(text, url, path) {
|
|
76
|
+
const mint = tokenNamed(text.trim(), url);
|
|
77
|
+
if (mint instanceof Error) {
|
|
78
|
+
throw new InvalidInput([{ path, message: mint.message }]);
|
|
79
|
+
}
|
|
80
|
+
if (!/^[1-9A-HJ-NP-Za-km-z]{32,44}$/.test(mint)) {
|
|
81
|
+
throw new InvalidInput([{ path, message: "name SOL, TEST or a token mint address" }]);
|
|
82
|
+
}
|
|
83
|
+
return mint;
|
|
84
|
+
}
|
|
85
|
+
export function raw(tokens, decimals, path) {
|
|
86
|
+
try {
|
|
87
|
+
return parseAmount(tokens, decimals);
|
|
88
|
+
}
|
|
89
|
+
catch (error) {
|
|
90
|
+
throw new InvalidInput([{ path, message: error instanceof Error ? error.message : String(error) }]);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
export const nameOf = (mint) => TOKEN_NAMES[mint] ?? mint;
|
|
94
|
+
export const limited = (guard) => guard.limits.perTrade.size + guard.limits.perHour.size > 0;
|
|
95
|
+
export function limitLines(limits) {
|
|
96
|
+
const mints = [...new Set([...limits.perTrade.keys(), ...limits.perHour.keys()])];
|
|
97
|
+
if (mints.length === 0) {
|
|
98
|
+
return [];
|
|
99
|
+
}
|
|
100
|
+
return [
|
|
101
|
+
"Whoever started this server set sell limits that no tool call can change:",
|
|
102
|
+
...mints.map((mint) => {
|
|
103
|
+
const caps = [
|
|
104
|
+
...(limits.perTrade.has(mint) ? [`${limits.perTrade.get(mint)} per trade`] : []),
|
|
105
|
+
...(limits.perHour.has(mint) ? [`${limits.perHour.get(mint)} per hour`] : []),
|
|
106
|
+
];
|
|
107
|
+
return `- ${nameOf(mint)}: at most ${caps.join(" and ")}`;
|
|
108
|
+
}),
|
|
109
|
+
"It sells no other token. Plan trades within these limits and tell the user when a request exceeds them.",
|
|
110
|
+
];
|
|
111
|
+
}
|
|
112
|
+
function capOf(text, decimals, mint) {
|
|
113
|
+
try {
|
|
114
|
+
return parseAmount(text, decimals);
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
throw new AgentRefusal("WalletTokenNotAllowed", `this server's limit of ${text} ${nameOf(mint)} does not fit a token with ${decimals} decimals, so it sells none; the user restarts it with a valid limit`);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
export async function bookOf(wallet) {
|
|
121
|
+
const path = await savedKeypair(wallet);
|
|
122
|
+
return path === undefined ? undefined : salesPath(resolve(expandHome(path, wallet.files.home)));
|
|
123
|
+
}
|
|
124
|
+
export const live = (sales, now) => sales.filter((s) => s.at > now - SALE_WINDOW);
|
|
125
|
+
export async function salesOf(wallet, now) {
|
|
126
|
+
if (!limited(wallet.limits)) {
|
|
127
|
+
return [];
|
|
128
|
+
}
|
|
129
|
+
const path = await bookOf(wallet);
|
|
130
|
+
return path === undefined ? [] : live(await wallet.limits.book.read(path), now);
|
|
131
|
+
}
|
|
132
|
+
export function checkSale(guard, mint, decimals, amount, now, sales) {
|
|
133
|
+
if (!limited(guard)) {
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
const { perTrade, perHour } = guard.limits;
|
|
137
|
+
const name = nameOf(mint);
|
|
138
|
+
if (!perTrade.has(mint) && !perHour.has(mint)) {
|
|
139
|
+
const allowed = [...new Set([...perTrade.keys(), ...perHour.keys()])].map(nameOf).join(", ");
|
|
140
|
+
throw new AgentRefusal("WalletTokenNotAllowed", `this server sells only ${allowed}, not ${name}; its limits were set when it started`);
|
|
141
|
+
}
|
|
142
|
+
const trade = perTrade.get(mint);
|
|
143
|
+
if (trade !== undefined && amount > capOf(trade, decimals, mint)) {
|
|
144
|
+
throw new AgentRefusal("WalletTradeLimit", `this server sells at most ${trade} ${name} per trade and this sells ${formatAmount(amount, decimals)}; sell less, or the user restarts the server with a higher --wallet-per-trade`);
|
|
145
|
+
}
|
|
146
|
+
checkHour(guard, mint, decimals, amount, now, sales);
|
|
147
|
+
}
|
|
148
|
+
export function checkHour(guard, mint, decimals, amount, now, sales) {
|
|
149
|
+
const hour = guard.limits.perHour.get(mint);
|
|
150
|
+
const name = nameOf(mint);
|
|
151
|
+
if (hour === undefined) {
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
const used = live(sales, now)
|
|
155
|
+
.filter((s) => s.mint === mint)
|
|
156
|
+
.reduce((sum, s) => sum + s.amount, 0n);
|
|
157
|
+
const cap = capOf(hour, decimals, mint);
|
|
158
|
+
if (used + amount > cap) {
|
|
159
|
+
throw new AgentRefusal("WalletHourLimit", `this server sells at most ${hour} ${name} per hour and has ${formatAmount(cap > used ? cap - used : 0n, decimals)} left; this sells ${formatAmount(amount, decimals)}`);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
export async function sent(ctx, signer, view, send, call) {
|
|
163
|
+
for (const undo of call.undo.splice(0)) {
|
|
164
|
+
undo();
|
|
165
|
+
}
|
|
166
|
+
const { prepared, ...shown } = view;
|
|
167
|
+
if (send !== true) {
|
|
168
|
+
return { ...shown, sent: false, next: PREVIEW_ONLY };
|
|
169
|
+
}
|
|
170
|
+
if ((await ctx.transport.genesisHash()) === MAINNET_GENESIS) {
|
|
171
|
+
throw new AgentRefusal("WalletNotMainnet", WALLET_NOT_MAINNET);
|
|
172
|
+
}
|
|
173
|
+
return { ...shown, sent: true, signature: await execute(ctx.transport, prepared, signer) };
|
|
174
|
+
}
|
|
175
|
+
export function sha256Of(text, path) {
|
|
176
|
+
const hex = text.trim().toLowerCase();
|
|
177
|
+
if (!/^[0-9a-f]{64}$/.test(hex)) {
|
|
178
|
+
throw new InvalidInput([{ path, message: "give a sha256 as 64 hex digits" }]);
|
|
179
|
+
}
|
|
180
|
+
return hex;
|
|
181
|
+
}
|
|
182
|
+
const UNREACHED = new Set(["ECONNREFUSED", "ENOTFOUND", "EAI_AGAIN"]);
|
|
183
|
+
const RPC_CAUSE_DEPTH = 8;
|
|
184
|
+
const JSON_RPC_FIRST = -32_000;
|
|
185
|
+
const JSON_RPC_LAST = -32_768;
|
|
186
|
+
export function rpcRefused(error) {
|
|
187
|
+
if (error instanceof Charged) {
|
|
188
|
+
return false;
|
|
189
|
+
}
|
|
190
|
+
let link = error;
|
|
191
|
+
for (let depth = 0; depth < RPC_CAUSE_DEPTH && link instanceof Error; depth++, link = link.cause) {
|
|
192
|
+
if (isSolanaError(link, SOLANA_ERROR__RPC__TRANSPORT_HTTP_ERROR)) {
|
|
193
|
+
return link.context.statusCode >= 400 && link.context.statusCode < 500;
|
|
194
|
+
}
|
|
195
|
+
if (isSolanaError(link) && link.context.__code <= JSON_RPC_FIRST && link.context.__code >= JSON_RPC_LAST) {
|
|
196
|
+
return true;
|
|
197
|
+
}
|
|
198
|
+
if (UNREACHED.has(link.code)) {
|
|
199
|
+
return true;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
return false;
|
|
203
|
+
}
|
|
204
|
+
export const refusedBeforeSending = (error) => neverLanded(error) || error instanceof AgentRefusal || error instanceof InvalidInput || rpcRefused(error);
|
|
205
|
+
//# sourceMappingURL=guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guard.js","sourceRoot":"","sources":["../../../../src/agent/wallet/guard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { Address } from "@solana/kit";
|
|
2
|
+
import { mintOf } from "@intent-engine/client";
|
|
3
|
+
import type { AgentContext } from "../actions.js";
|
|
4
|
+
import type { Call } from "../claims.js";
|
|
5
|
+
import { type Schema } from "../schema.js";
|
|
6
|
+
import { orderSchema } from "../shapes.js";
|
|
7
|
+
export declare const offerFields: {
|
|
8
|
+
intent: Schema<Address>;
|
|
9
|
+
nonce: Schema<bigint>;
|
|
10
|
+
summary: Schema<string[]>;
|
|
11
|
+
warnings: Schema<string[]>;
|
|
12
|
+
sent: Schema<boolean>;
|
|
13
|
+
signature: {
|
|
14
|
+
optional: Schema<string>;
|
|
15
|
+
};
|
|
16
|
+
next: {
|
|
17
|
+
optional: Schema<string>;
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
export declare const offerOutput: Schema<{
|
|
21
|
+
intent: Address;
|
|
22
|
+
nonce: bigint;
|
|
23
|
+
summary: string[];
|
|
24
|
+
warnings: string[];
|
|
25
|
+
sent: boolean;
|
|
26
|
+
} & {
|
|
27
|
+
signature?: string;
|
|
28
|
+
next?: string;
|
|
29
|
+
}>;
|
|
30
|
+
export type Token = Awaited<ReturnType<typeof mintOf>>;
|
|
31
|
+
type Order = typeof orderSchema extends Schema<infer T> ? T : never;
|
|
32
|
+
type Terms = {
|
|
33
|
+
order: Order;
|
|
34
|
+
expires_at: bigint;
|
|
35
|
+
spec_url?: string;
|
|
36
|
+
};
|
|
37
|
+
export declare function offered(ctx: AgentContext, call: Call, input: {
|
|
38
|
+
sell: string;
|
|
39
|
+
buy: string;
|
|
40
|
+
pay_to?: Address | undefined;
|
|
41
|
+
send?: boolean | undefined;
|
|
42
|
+
}, terms: (sold: Token, bought: Token, now: bigint, inputMint: Address, outputMint: Address) => Promise<Terms> | Terms): Promise<{
|
|
43
|
+
sent: boolean;
|
|
44
|
+
next: string;
|
|
45
|
+
} | {
|
|
46
|
+
sent: boolean;
|
|
47
|
+
signature: string;
|
|
48
|
+
}>;
|
|
49
|
+
export declare function nonceTaken(error: unknown): boolean;
|
|
50
|
+
export {};
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { chainTime, CLOCK_SYSVAR, explain, mintOf, unmemoized } from "@intent-engine/client";
|
|
3
|
+
import { prepareCreate } from "../create.js";
|
|
4
|
+
import { AgentRefusal, problemOf } from "../problems.js";
|
|
5
|
+
import { account, amount, flag, list, object, optional, text } from "../schema.js";
|
|
6
|
+
import { orderSchema } from "../shapes.js";
|
|
7
|
+
import { walletEmpty, access, signerOf, mintNamed, limited, bookOf, live, salesOf, checkSale, sent, refusedBeforeSending } from "./guard.js";
|
|
8
|
+
export const offerFields = {
|
|
9
|
+
intent: account(),
|
|
10
|
+
nonce: amount(),
|
|
11
|
+
summary: list(text(), 24),
|
|
12
|
+
warnings: list(text(), 16),
|
|
13
|
+
sent: flag(),
|
|
14
|
+
signature: optional(text()),
|
|
15
|
+
next: optional(text()),
|
|
16
|
+
};
|
|
17
|
+
export const offerOutput = object(offerFields);
|
|
18
|
+
export async function offered(ctx, call, input, terms) {
|
|
19
|
+
const wallet = access(ctx);
|
|
20
|
+
const signer = await signerOf(ctx);
|
|
21
|
+
const inputMint = mintNamed(input.sell, wallet.url, "sell");
|
|
22
|
+
const outputMint = mintNamed(input.buy, wallet.url, "buy");
|
|
23
|
+
await ctx.transport.warm?.([signer.address, inputMint, outputMint, CLOCK_SYSVAR]);
|
|
24
|
+
if (((await ctx.transport.getAccount(signer.address))?.lamports ?? 0n) === 0n) {
|
|
25
|
+
throw new AgentRefusal("WalletEmpty", walletEmpty(signer.address));
|
|
26
|
+
}
|
|
27
|
+
const [inputToken, outputToken, now] = await Promise.all([
|
|
28
|
+
mintOf(ctx.transport, inputMint),
|
|
29
|
+
mintOf(ctx.transport, outputMint),
|
|
30
|
+
chainTime(ctx.transport),
|
|
31
|
+
]);
|
|
32
|
+
const made = await terms(inputToken, outputToken, now, inputMint, outputMint);
|
|
33
|
+
const sold = made.order.amount_in;
|
|
34
|
+
const guard = wallet.limits;
|
|
35
|
+
checkSale(guard, inputMint, inputToken.decimals, sold, now, await salesOf(wallet, now));
|
|
36
|
+
const created = async (context) => {
|
|
37
|
+
const view = (await prepareCreate.run(context, { owner: signer.address, input_mint: inputMint, output_mint: outputMint, ...(input.pay_to === undefined ? {} : { pay_to: input.pay_to }), ...made }, call));
|
|
38
|
+
const { intent, nonce, summary, warnings, prepared } = view;
|
|
39
|
+
return { intent, nonce, summary, warnings, prepared };
|
|
40
|
+
};
|
|
41
|
+
const first = await created(ctx);
|
|
42
|
+
if (input.send !== true) {
|
|
43
|
+
return sent(ctx, signer, first, input.send, call);
|
|
44
|
+
}
|
|
45
|
+
const path = limited(guard) ? await bookOf(wallet) : undefined;
|
|
46
|
+
const sale = { id: randomUUID(), mint: inputMint, at: now, amount: sold };
|
|
47
|
+
if (path !== undefined) {
|
|
48
|
+
await guard.book.update(path, (sales) => {
|
|
49
|
+
const kept = live(sales, now);
|
|
50
|
+
checkSale(guard, inputMint, inputToken.decimals, sold, now, kept);
|
|
51
|
+
return { sales: [...kept, sale], value: undefined };
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
try {
|
|
55
|
+
try {
|
|
56
|
+
return await sent(ctx, signer, first, true, call);
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
if (!nonceTaken(error)) {
|
|
60
|
+
throw error;
|
|
61
|
+
}
|
|
62
|
+
return await sent(ctx, signer, await created({ ...ctx, transport: unmemoized(ctx.transport) }), true, call);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
if (path !== undefined && refusedBeforeSending(error)) {
|
|
67
|
+
await guard.book.update(path, (sales) => ({ sales: sales.filter((s) => s.id !== sale.id), value: undefined })).catch(() => undefined);
|
|
68
|
+
}
|
|
69
|
+
throw error;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
const NONCE_COLLISIONS = new Set(["NonceUsed", "NonceTaken"]);
|
|
73
|
+
export function nonceTaken(error) {
|
|
74
|
+
if (NONCE_COLLISIONS.has(problemOf(error).code) || explain(error)?.name === "NonceUsed") {
|
|
75
|
+
return true;
|
|
76
|
+
}
|
|
77
|
+
const text = error instanceof Error ? error.message : String(error);
|
|
78
|
+
return /already in use/i.test(text);
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=offer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"offer.js","sourceRoot":"","sources":["../../../../src/agent/wallet/offer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { type Address } from "@solana/kit";
|
|
2
|
+
import { type Transport } from "@intent-engine/client";
|
|
3
|
+
export declare const NOT_RELEASED: string;
|
|
4
|
+
export declare const RECEIPT_PARTIAL = "the escrow's history after this release could not be read in full: it is longer than the pages read or the RPC node could not return some of its transactions yet, so a follow-up recording the delivered work may be missing, and without release given, the escrow address may have been made again since; pass release, the signature the release returned, or call again in a few seconds";
|
|
5
|
+
export declare const walletReceipt: import("../actions.js").AnyAction;
|
|
6
|
+
export declare const getReceipt: import("../actions.js").AnyAction;
|
|
7
|
+
export declare function escrowReceipt(transport: Transport, owner: Address, nonce: bigint, sha256: string | undefined, releaseSignature?: string): Promise<{
|
|
8
|
+
intent: Address<string>;
|
|
9
|
+
released: boolean;
|
|
10
|
+
next: string;
|
|
11
|
+
complete?: never;
|
|
12
|
+
} | {
|
|
13
|
+
intent: Address<string>;
|
|
14
|
+
released: boolean;
|
|
15
|
+
complete: boolean;
|
|
16
|
+
next: string;
|
|
17
|
+
} | {
|
|
18
|
+
intent: Address<string>;
|
|
19
|
+
released: boolean;
|
|
20
|
+
complete?: boolean;
|
|
21
|
+
next?: string;
|
|
22
|
+
attestor: Address;
|
|
23
|
+
result: bigint;
|
|
24
|
+
signature: string;
|
|
25
|
+
delivered_sha256?: string;
|
|
26
|
+
matches?: boolean;
|
|
27
|
+
paid: string;
|
|
28
|
+
recipients: bigint;
|
|
29
|
+
} | {
|
|
30
|
+
intent: Address<string>;
|
|
31
|
+
released: boolean;
|
|
32
|
+
complete?: boolean;
|
|
33
|
+
next?: string;
|
|
34
|
+
attestor: Address;
|
|
35
|
+
result: bigint;
|
|
36
|
+
signature: string;
|
|
37
|
+
delivered_sha256?: string;
|
|
38
|
+
matches?: boolean;
|
|
39
|
+
paid_to?: Address;
|
|
40
|
+
payee: Address;
|
|
41
|
+
paid: string;
|
|
42
|
+
}>;
|