@intent-engine/cli 0.0.0-stage → 0.1.0
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 +202 -0
- package/dist/src/accounts.d.ts +112 -0
- package/dist/src/accounts.js +162 -0
- package/dist/src/accounts.js.map +1 -0
- package/dist/src/agent/actions.d.ts +45 -0
- package/dist/src/agent/actions.js +43 -0
- package/dist/src/agent/actions.js.map +1 -0
- package/dist/src/agent/budget.d.ts +22 -0
- package/dist/src/agent/budget.js +31 -0
- package/dist/src/agent/budget.js.map +1 -0
- package/dist/src/agent/claims.d.ts +15 -0
- package/dist/src/agent/claims.js +47 -0
- package/dist/src/agent/claims.js.map +1 -0
- package/dist/src/agent/create.d.ts +56 -0
- package/dist/src/agent/create.js +118 -0
- package/dist/src/agent/create.js.map +1 -0
- package/dist/src/agent/mandate.d.ts +30 -0
- package/dist/src/agent/mandate.js +478 -0
- package/dist/src/agent/mandate.js.map +1 -0
- package/dist/src/agent/mcp.d.ts +17 -0
- package/dist/src/agent/mcp.js +53 -0
- package/dist/src/agent/mcp.js.map +1 -0
- package/dist/src/agent/names.d.ts +1 -0
- package/dist/src/agent/names.js +3 -0
- package/dist/src/agent/names.js.map +1 -0
- package/dist/src/agent/owner.d.ts +40 -0
- package/dist/src/agent/owner.js +123 -0
- package/dist/src/agent/owner.js.map +1 -0
- package/dist/src/agent/prepare.d.ts +14 -0
- package/dist/src/agent/prepare.js +32 -0
- package/dist/src/agent/prepare.js.map +1 -0
- package/dist/src/agent/problems.d.ts +120 -0
- package/dist/src/agent/problems.js +189 -0
- package/dist/src/agent/problems.js.map +1 -0
- package/dist/src/agent/read.d.ts +13 -0
- package/dist/src/agent/read.js +210 -0
- package/dist/src/agent/read.js.map +1 -0
- package/dist/src/agent/registry.d.ts +2 -0
- package/dist/src/agent/registry.js +24 -0
- package/dist/src/agent/registry.js.map +1 -0
- package/dist/src/agent/relay.d.ts +20 -0
- package/dist/src/agent/relay.js +43 -0
- package/dist/src/agent/relay.js.map +1 -0
- package/dist/src/agent/schema.d.ts +68 -0
- package/dist/src/agent/schema.js +210 -0
- package/dist/src/agent/schema.js.map +1 -0
- package/dist/src/agent/settle.d.ts +5 -0
- package/dist/src/agent/settle.js +144 -0
- package/dist/src/agent/settle.js.map +1 -0
- package/dist/src/agent/shapes.d.ts +165 -0
- package/dist/src/agent/shapes.js +162 -0
- package/dist/src/agent/shapes.js.map +1 -0
- package/dist/src/agent/signed.d.ts +21 -0
- package/dist/src/agent/signed.js +360 -0
- package/dist/src/agent/signed.js.map +1 -0
- package/dist/src/agent/wallet.d.ts +18 -0
- package/dist/src/agent/wallet.js +186 -0
- package/dist/src/agent/wallet.js.map +1 -0
- package/dist/src/args.d.ts +491 -0
- package/dist/src/args.js +1124 -0
- package/dist/src/args.js.map +1 -0
- package/dist/src/bin.d.ts +2 -0
- package/dist/src/bin.js +4 -0
- package/dist/src/bin.js.map +1 -0
- package/dist/src/commands.d.ts +51 -0
- package/dist/src/commands.js +451 -0
- package/dist/src/commands.js.map +1 -0
- package/dist/src/compute.d.ts +19 -0
- package/dist/src/compute.js +81 -0
- package/dist/src/compute.js.map +1 -0
- package/dist/src/crank.d.ts +39 -0
- package/dist/src/crank.js +171 -0
- package/dist/src/crank.js.map +1 -0
- package/dist/src/events.d.ts +8 -0
- package/dist/src/events.js +43 -0
- package/dist/src/events.js.map +1 -0
- package/dist/src/flows.d.ts +23 -0
- package/dist/src/flows.js +128 -0
- package/dist/src/flows.js.map +1 -0
- package/dist/src/main.d.ts +32 -0
- package/dist/src/main.js +99 -0
- package/dist/src/main.js.map +1 -0
- package/dist/src/render.d.ts +5 -0
- package/dist/src/render.js +46 -0
- package/dist/src/render.js.map +1 -0
- package/dist/src/tokens.d.ts +6 -0
- package/dist/src/tokens.js +15 -0
- package/dist/src/tokens.js.map +1 -0
- package/dist/src/transport.d.ts +155 -0
- package/dist/src/transport.js +173 -0
- package/dist/src/transport.js.map +1 -0
- package/dist/src/treasury.d.ts +27 -0
- package/dist/src/treasury.js +85 -0
- package/dist/src/treasury.js.map +1 -0
- package/dist/src/version.d.ts +1 -0
- package/dist/src/version.js +2 -0
- package/dist/src/version.js.map +1 -0
- package/dist/src/wallet.d.ts +29 -0
- package/dist/src/wallet.js +108 -0
- package/dist/src/wallet.js.map +1 -0
- package/package.json +37 -3
- package/README.md +0 -3
|
@@ -0,0 +1,360 @@
|
|
|
1
|
+
import { createNoopSigner, getBase58Encoder, getBase64Decoder, getBase64Encoder, getPublicKeyFromAddress, verifySignature, } from "@solana/kit";
|
|
2
|
+
import { buildApproveDelegate, buildCreateIntentSigned, buildEd25519Instruction, createExt, describeSignedIntent, encodeParams, escrowAmount, findAssociatedTokenAddress, formatAmount, findIntentPda, getIntentDecoder, partnerOf, signedIntentMessage, validate, } from "@intent-engine/core";
|
|
3
|
+
import { chainTime, clusterDomain, createdAccount, loadConfig, mintOf } from "../accounts.js";
|
|
4
|
+
import { Charged } from "../transport.js";
|
|
5
|
+
import { define } from "./actions.js";
|
|
6
|
+
import { tool } from "./names.js";
|
|
7
|
+
import { expiryOf, termsInput, termsOutput, warningsOf } from "./create.js";
|
|
8
|
+
import { initUserIfMissing, pickNonce, raiseAllowance, setupLines, tokenAccountIfMissing, unusedIntent, userOf, } from "./owner.js";
|
|
9
|
+
import { prepare, transactionSize } from "./prepare.js";
|
|
10
|
+
import { AgentRefusal } from "./problems.js";
|
|
11
|
+
import { createCost, rentFor, SIGNATURE_FEE, TOKEN_ACCOUNT_RENT_BYTES } from "./budget.js";
|
|
12
|
+
import { bytesFit } from "@intent-engine/solver";
|
|
13
|
+
import { admitRelay } from "./relay.js";
|
|
14
|
+
import { claim, claimedBy, enter } from "./claims.js";
|
|
15
|
+
import { orderSchema, paramsOf, partnerSchema, preparedSchema, preparedView } from "./shapes.js";
|
|
16
|
+
import { account, amount, integer, list, nullable, object, optional, text, time } from "./schema.js";
|
|
17
|
+
export const DEFAULT_SUBMIT_WITHIN = 60 * 60;
|
|
18
|
+
export const MAX_SUBMIT_WITHIN = 24 * 60 * 60;
|
|
19
|
+
export const SIGNATURE_PATTERN = "^[1-9A-HJ-NP-Za-km-z]{64,88}$";
|
|
20
|
+
const signedTerms = {
|
|
21
|
+
owner: account("the wallet that signs the message and sells"),
|
|
22
|
+
input_mint: account(),
|
|
23
|
+
output_mint: account(),
|
|
24
|
+
order: orderSchema,
|
|
25
|
+
expires_at: time(),
|
|
26
|
+
nonce: amount(),
|
|
27
|
+
submit_by: time("unix seconds after which the signature can no longer be submitted"),
|
|
28
|
+
epoch: amount("the owner's signing epoch the signature is bound to"),
|
|
29
|
+
relayer_fee: amount("raw input units the owner pays, from the same allowance, to whoever submits the signature"),
|
|
30
|
+
partner: optional(partnerSchema),
|
|
31
|
+
};
|
|
32
|
+
async function fieldsOf(transport, t, params, outputTokenProgram) {
|
|
33
|
+
const { config } = await loadConfig(transport);
|
|
34
|
+
const inputToken = await mintOf(transport, t.input_mint);
|
|
35
|
+
const fields = {
|
|
36
|
+
domain: Uint8Array.from(config.domain),
|
|
37
|
+
owner: t.owner,
|
|
38
|
+
ownerInput: await findAssociatedTokenAddress({ owner: t.owner, mint: t.input_mint, tokenProgram: inputToken.tokenProgram }),
|
|
39
|
+
inputMint: t.input_mint,
|
|
40
|
+
outputMint: t.output_mint,
|
|
41
|
+
receiver: await findAssociatedTokenAddress({ owner: t.owner, mint: t.output_mint, tokenProgram: outputTokenProgram }),
|
|
42
|
+
nonce: t.nonce,
|
|
43
|
+
expiresAt: t.expires_at,
|
|
44
|
+
submitBy: t.submit_by,
|
|
45
|
+
kind: params.kind,
|
|
46
|
+
params: encodeParams(params),
|
|
47
|
+
epoch: t.epoch,
|
|
48
|
+
relayerFee: t.relayer_fee,
|
|
49
|
+
ext: createExt(t.partner === undefined ? {} : { partner: { key: t.partner.account, bps: t.partner.bps } }),
|
|
50
|
+
};
|
|
51
|
+
return { config, inputToken, fields };
|
|
52
|
+
}
|
|
53
|
+
export function relayFloor(relay, mint) {
|
|
54
|
+
const floor = relay.fees.get(mint);
|
|
55
|
+
if (floor === undefined) {
|
|
56
|
+
throw new AgentRefusal("RelayMintNotAccepted", `this server's relayer does not relay intents selling ${mint}; it relays only ${[...relay.fees.keys()].join(", ")}`);
|
|
57
|
+
}
|
|
58
|
+
return floor;
|
|
59
|
+
}
|
|
60
|
+
export const RELAY_TOO_LARGE = "this server's relayer cannot fit these signed terms in one Solana transaction; drop the partner fee or use a relayer that adds no priority fee";
|
|
61
|
+
async function relayCreate(input, relay, config, params, tokenPrograms) {
|
|
62
|
+
return buildCreateIntentSigned({
|
|
63
|
+
payer: relay.signer,
|
|
64
|
+
owner: input.owner,
|
|
65
|
+
treasury: config.feeRecipient,
|
|
66
|
+
maxCreateFee: config.createFee,
|
|
67
|
+
maxBounty: config.crankBounty,
|
|
68
|
+
nonce: input.nonce,
|
|
69
|
+
params,
|
|
70
|
+
expiresAt: input.expires_at,
|
|
71
|
+
...(input.partner === undefined ? {} : { partner: { key: input.partner.account, bps: input.partner.bps } }),
|
|
72
|
+
inputMint: input.input_mint,
|
|
73
|
+
outputMint: input.output_mint,
|
|
74
|
+
inputTokenProgram: tokenPrograms.input,
|
|
75
|
+
outputTokenProgram: tokenPrograms.output,
|
|
76
|
+
submitBy: input.submit_by,
|
|
77
|
+
relayerFee: input.relayer_fee,
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
export async function relayFits(transport, relay, instructions) {
|
|
81
|
+
const budgeted = await transport.budget(instructions, relay.signer.address);
|
|
82
|
+
return bytesFit(await transactionSize(transport, budgeted, relay.signer.address));
|
|
83
|
+
}
|
|
84
|
+
const preparedFits = (prepared) => bytesFit(getBase64Encoder().encode(prepared.transaction).length);
|
|
85
|
+
export function offeredFee(floor, offered) {
|
|
86
|
+
if (offered === undefined) {
|
|
87
|
+
return floor;
|
|
88
|
+
}
|
|
89
|
+
if (offered < floor) {
|
|
90
|
+
throw new AgentRefusal("RelayFeeTooLow", `this server's relayer charges ${floor} raw units of the input token; offer at least that or leave relayer_fee out`);
|
|
91
|
+
}
|
|
92
|
+
return offered;
|
|
93
|
+
}
|
|
94
|
+
export const prepareSignedIntent = define({
|
|
95
|
+
name: tool("prepare_signed_intent"),
|
|
96
|
+
title: "Prepare a relayer-submitted signed intent",
|
|
97
|
+
description: `Build an intent the owner authorises by signing a message off-chain, so a relayer creates it on chain and pays its rent and fees. Steps: (1) the owner signs and sends the returned setup transaction; it registers them, creates the receiving token account and raises the engine's spending allowance on the input token by this intent's escrow plus any relayer fee, and it is the only part that costs the owner SOL: its network fee, which the summary gives in lamports, plus rent for any account it creates; (2) the owner signs message with their wallet's sign-message; (3) pass submit unchanged plus that base58 signature to ${tool("submit_signed_intent")}. When this server runs a relayer, it relays only the input tokens it lists a fee for, the message includes that fee, and the owner pays it in that token as the intent is created; without a relayer this server can prepare but not submit. Read summary and warnings before the owner signs anything.`,
|
|
98
|
+
effect: "prepare",
|
|
99
|
+
input: object({
|
|
100
|
+
...termsInput,
|
|
101
|
+
owner: account("the wallet that signs the message off-chain; it pays only the setup transaction's network fee and any rent named in the summary, in SOL"),
|
|
102
|
+
submit_within: optional(integer(60, MAX_SUBMIT_WITHIN, `seconds the relayer has to submit the signature; default ${DEFAULT_SUBMIT_WITHIN}`)),
|
|
103
|
+
relayer_fee: optional(amount("raw input units offered to whoever submits; default and minimum is this server's relayer fee for the input token")),
|
|
104
|
+
}),
|
|
105
|
+
output: object({
|
|
106
|
+
...termsOutput,
|
|
107
|
+
message: text("base64 bytes the owner signs with sign-message"),
|
|
108
|
+
digest: text("sha-256 of the signed terms; the wallet shows the same value"),
|
|
109
|
+
submit: object(signedTerms, `pass these unchanged, plus the signature, to ${tool("submit_signed_intent")}`),
|
|
110
|
+
setup: preparedSchema,
|
|
111
|
+
}),
|
|
112
|
+
run: async ({ transport, claims, relay }, input, call) => {
|
|
113
|
+
const now = await chainTime(transport);
|
|
114
|
+
const expiresAt = expiryOf(input, now);
|
|
115
|
+
const params = validate(paramsOf(input.order));
|
|
116
|
+
const user = await userOf(transport, input.owner);
|
|
117
|
+
const outputToken = await mintOf(transport, input.output_mint);
|
|
118
|
+
if (input.nonce !== undefined) {
|
|
119
|
+
await unusedIntent(transport, input.owner, input.nonce);
|
|
120
|
+
}
|
|
121
|
+
const terms = {
|
|
122
|
+
owner: input.owner,
|
|
123
|
+
input_mint: input.input_mint,
|
|
124
|
+
output_mint: input.output_mint,
|
|
125
|
+
order: input.order,
|
|
126
|
+
expires_at: expiresAt,
|
|
127
|
+
nonce: pickNonce(user, input.nonce, claimedBy(claims, input.owner, now)),
|
|
128
|
+
submit_by: now + BigInt(input.submit_within ?? DEFAULT_SUBMIT_WITHIN),
|
|
129
|
+
epoch: user?.epoch ?? 0n,
|
|
130
|
+
relayer_fee: offeredFee(relay === undefined ? 0n : relayFloor(relay, input.input_mint), input.relayer_fee),
|
|
131
|
+
...(input.partner === undefined ? {} : { partner: input.partner }),
|
|
132
|
+
};
|
|
133
|
+
claim(claims, call, input.owner, terms.nonce, terms.submit_by, now);
|
|
134
|
+
const { config, inputToken, fields } = await fieldsOf(transport, terms, params, outputToken.tokenProgram);
|
|
135
|
+
if (relay !== undefined) {
|
|
136
|
+
const placeholder = buildEd25519Instruction({
|
|
137
|
+
publicKey: input.owner,
|
|
138
|
+
signature: new Uint8Array(64),
|
|
139
|
+
message: await signedIntentMessage(fields),
|
|
140
|
+
});
|
|
141
|
+
const create = await relayCreate(terms, relay, config, params, {
|
|
142
|
+
input: inputToken.tokenProgram,
|
|
143
|
+
output: outputToken.tokenProgram,
|
|
144
|
+
});
|
|
145
|
+
if (!(await relayFits(transport, relay, [placeholder, create]))) {
|
|
146
|
+
throw new AgentRefusal("RelayTooLarge", RELAY_TOO_LARGE);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
const description = await describeSignedIntent(fields, {
|
|
150
|
+
now,
|
|
151
|
+
currentEpoch: terms.epoch,
|
|
152
|
+
expectedDomain: await clusterDomain(transport),
|
|
153
|
+
outputTokenProgram: outputToken.tokenProgram,
|
|
154
|
+
inputDecimals: inputToken.decimals,
|
|
155
|
+
outputDecimals: outputToken.decimals,
|
|
156
|
+
});
|
|
157
|
+
const escrow = escrowAmount(params);
|
|
158
|
+
const allowance = await raiseAllowance(transport, input.owner, fields.ownerInput, escrow + terms.relayer_fee);
|
|
159
|
+
const receiver = await tokenAccountIfMissing(transport, createNoopSigner(input.owner), input.owner, input.output_mint, outputToken.tokenProgram);
|
|
160
|
+
const approve = await buildApproveDelegate({
|
|
161
|
+
owner: createNoopSigner(input.owner),
|
|
162
|
+
mint: input.input_mint,
|
|
163
|
+
tokenProgram: inputToken.tokenProgram,
|
|
164
|
+
amount: allowance.after,
|
|
165
|
+
decimals: inputToken.decimals,
|
|
166
|
+
});
|
|
167
|
+
const register = await initUserIfMissing(user, input.owner);
|
|
168
|
+
const setup = [...register, ...receiver.create, approve];
|
|
169
|
+
const intent = await unusedIntent(transport, input.owner, terms.nonce);
|
|
170
|
+
const disclosed = setupLines({
|
|
171
|
+
registers: register.length > 0,
|
|
172
|
+
creates: receiver.create.length > 0 ? [input.output_mint] : [],
|
|
173
|
+
allowance,
|
|
174
|
+
decimals: inputToken.decimals,
|
|
175
|
+
});
|
|
176
|
+
const ready = await prepare(transport, setup, input.owner);
|
|
177
|
+
const prepared = preparedView(ready);
|
|
178
|
+
const setupFee = SIGNATURE_FEE * BigInt(ready.signers.length) + ready.priorityLamports;
|
|
179
|
+
return {
|
|
180
|
+
intent,
|
|
181
|
+
nonce: terms.nonce,
|
|
182
|
+
expires_at: expiresAt,
|
|
183
|
+
escrow,
|
|
184
|
+
summary: [
|
|
185
|
+
...description.lines,
|
|
186
|
+
terms.relayer_fee === 0n
|
|
187
|
+
? `Cost to you: no relayer fee; only ${setupFee} lamports of SOL for the setup transaction's network fee, once`
|
|
188
|
+
: `Cost to you: ${formatAmount(terms.relayer_fee, inputToken.decimals)} of ${input.input_mint} to the relayer, plus ${setupFee} lamports of SOL for the setup transaction's network fee, once`,
|
|
189
|
+
...disclosed.lines,
|
|
190
|
+
],
|
|
191
|
+
warnings: [
|
|
192
|
+
...new Set([
|
|
193
|
+
...warningsOf(params.kind, expiresAt, now, inputToken.scaled || outputToken.scaled),
|
|
194
|
+
...description.warnings,
|
|
195
|
+
...disclosed.warnings,
|
|
196
|
+
]),
|
|
197
|
+
],
|
|
198
|
+
message: getBase64Decoder().decode(await signedIntentMessage(fields)),
|
|
199
|
+
digest: description.digest,
|
|
200
|
+
submit: terms,
|
|
201
|
+
setup: prepared,
|
|
202
|
+
};
|
|
203
|
+
},
|
|
204
|
+
});
|
|
205
|
+
export const submitSignedIntent = define({
|
|
206
|
+
name: tool("submit_signed_intent"),
|
|
207
|
+
title: "Submit a signed intent",
|
|
208
|
+
description: `Relay an owner's signed intent: this server's relayer key pays the fee and creates the intent on chain, within the relayer's limits: accepted input tokens and their minimum fee, lamport cost per intent and per hour, expiry, transaction size and intents per owner per hour. Pass the submit object from ${tool("prepare_signed_intent")} unchanged plus the owner's base58 signature of its message. Calling again after success returns the same intent without sending anything.`,
|
|
209
|
+
effect: "submit",
|
|
210
|
+
input: object({ ...signedTerms, signature: text("the owner's base58 Ed25519 signature of the message") }),
|
|
211
|
+
output: object({ intent: account(), signature: nullable(text("the relayed transaction's signature; null if it already existed")) }),
|
|
212
|
+
run: async ({ transport, relay, claims }, input, call) => {
|
|
213
|
+
if (relay === undefined) {
|
|
214
|
+
throw new AgentRefusal("RelayerNotConfigured", "this server has no relayer key; start it with --relayer to submit signed intents");
|
|
215
|
+
}
|
|
216
|
+
const leave = enter(claims, `${input.owner}:${input.nonce}`);
|
|
217
|
+
try {
|
|
218
|
+
return await relaySigned(transport, relay, input, call);
|
|
219
|
+
}
|
|
220
|
+
finally {
|
|
221
|
+
leave();
|
|
222
|
+
}
|
|
223
|
+
},
|
|
224
|
+
});
|
|
225
|
+
async function relaySigned(transport, relay, input, call) {
|
|
226
|
+
const params = validate(paramsOf(input.order));
|
|
227
|
+
const outputToken = await mintOf(transport, input.output_mint);
|
|
228
|
+
const { config, inputToken, fields } = await fieldsOf(transport, input, params, outputToken.tokenProgram);
|
|
229
|
+
const [intent] = await findIntentPda({ owner: input.owner, nonce: input.nonce });
|
|
230
|
+
const existing = await createdAccount(transport, intent);
|
|
231
|
+
if (existing !== null) {
|
|
232
|
+
if (!sameTerms(getIntentDecoder().decode(existing.data), fields)) {
|
|
233
|
+
throw new AgentRefusal("NonceTaken", "a different intent already uses this owner's nonce; these signed terms can never be submitted");
|
|
234
|
+
}
|
|
235
|
+
return { intent, signature: null };
|
|
236
|
+
}
|
|
237
|
+
const floor = relayFloor(relay, input.input_mint);
|
|
238
|
+
if (input.relayer_fee < floor) {
|
|
239
|
+
throw new AgentRefusal("RelayFeeTooLow", `this relayer charges ${floor} raw units of ${input.input_mint} per intent; prepare and sign the intent again on this server`);
|
|
240
|
+
}
|
|
241
|
+
const message = await signedIntentMessage(fields);
|
|
242
|
+
const signature = signatureBytes(input.signature);
|
|
243
|
+
if (!(await verifySignature(await getPublicKeyFromAddress(input.owner), signature, message))) {
|
|
244
|
+
throw new AgentRefusal("SignatureInvalid", `the signature is not the owner's signature of these exact terms; sign the message from ${tool("prepare_signed_intent")} again`);
|
|
245
|
+
}
|
|
246
|
+
const feeAccount = input.relayer_fee === 0n
|
|
247
|
+
? { create: [] }
|
|
248
|
+
: await tokenAccountIfMissing(transport, relay.signer, relay.signer.address, input.input_mint, inputToken.tokenProgram);
|
|
249
|
+
const relayed = [
|
|
250
|
+
buildEd25519Instruction({ publicKey: input.owner, signature, message }),
|
|
251
|
+
await relayCreate(input, relay, config, params, { input: inputToken.tokenProgram, output: outputToken.tokenProgram }),
|
|
252
|
+
];
|
|
253
|
+
const now = await chainTime(transport);
|
|
254
|
+
let prepared = await prepare(transport, [...feeAccount.create, ...relayed], relay.signer.address);
|
|
255
|
+
const split = feeAccount.create.length !== 0 && !preparedFits(prepared);
|
|
256
|
+
const ticket = admitRelay(relay, input.owner, BigInt(config.createFee) + BigInt(config.crankBounty) + prepared.priorityLamports, createCost(config) +
|
|
257
|
+
prepared.priorityLamports +
|
|
258
|
+
(feeAccount.create.length > 0 ? rentFor(TOKEN_ACCOUNT_RENT_BYTES) : 0n) +
|
|
259
|
+
(split ? SIGNATURE_FEE + prepared.priorityLamports : 0n), input.expires_at, now);
|
|
260
|
+
const paid = { any: false };
|
|
261
|
+
call.undo.push(() => {
|
|
262
|
+
if (!paid.any) {
|
|
263
|
+
ticket.cancel();
|
|
264
|
+
}
|
|
265
|
+
});
|
|
266
|
+
const admitted = prepared.priorityLamports;
|
|
267
|
+
if (split) {
|
|
268
|
+
await paying(paid, transport.send(feeAccount.create, relay.signer));
|
|
269
|
+
prepared = await prepare(transport, relayed, relay.signer.address);
|
|
270
|
+
refuseRepricing(admitted, prepared.priorityLamports);
|
|
271
|
+
}
|
|
272
|
+
if (!preparedFits(prepared)) {
|
|
273
|
+
throw new AgentRefusal("RelayTooLarge", RELAY_TOO_LARGE);
|
|
274
|
+
}
|
|
275
|
+
return { intent, signature: await paying(paid, transport.send(prepared.instructions, relay.signer)) };
|
|
276
|
+
}
|
|
277
|
+
export async function paying(paid, sending) {
|
|
278
|
+
try {
|
|
279
|
+
const result = await sending;
|
|
280
|
+
paid.any = true;
|
|
281
|
+
return result;
|
|
282
|
+
}
|
|
283
|
+
catch (error) {
|
|
284
|
+
if (error instanceof Charged) {
|
|
285
|
+
paid.any = true;
|
|
286
|
+
}
|
|
287
|
+
throw error;
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
export const repriced = (admitted, now) => `the priority fee rose from the admitted ${admitted} to ${now} lamports while relaying; ask again later`;
|
|
291
|
+
export function refuseRepricing(admitted, now) {
|
|
292
|
+
if (now > admitted) {
|
|
293
|
+
throw new AgentRefusal("RelayTooCostly", repriced(admitted, now));
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
export const previewSignedIntent = define({
|
|
297
|
+
name: tool("preview_signed_intent"),
|
|
298
|
+
title: "Check a signed intent before relaying it",
|
|
299
|
+
description: `Verify an owner's signature over signed terms and describe what relaying them creates, without sending anything.`,
|
|
300
|
+
effect: "read",
|
|
301
|
+
input: object({ ...signedTerms, signature: text("the owner's base58 Ed25519 signature of the message") }),
|
|
302
|
+
output: object({
|
|
303
|
+
intent: account(),
|
|
304
|
+
exists: integer(0, 1, "1 if the intent is already on chain, else 0"),
|
|
305
|
+
relayer_fee: amount("raw input-token units the relayer receives"),
|
|
306
|
+
summary: list(text(), 32, "what relaying creates"),
|
|
307
|
+
warnings: list(text(), 16, "anything to check before relaying"),
|
|
308
|
+
}),
|
|
309
|
+
run: async ({ transport }, input) => {
|
|
310
|
+
const params = validate(paramsOf(input.order));
|
|
311
|
+
const outputToken = await mintOf(transport, input.output_mint);
|
|
312
|
+
const { config, inputToken, fields } = await fieldsOf(transport, input, params, outputToken.tokenProgram);
|
|
313
|
+
const message = await signedIntentMessage(fields);
|
|
314
|
+
if (!(await verifySignature(await getPublicKeyFromAddress(input.owner), signatureBytes(input.signature), message))) {
|
|
315
|
+
throw new AgentRefusal("SignatureInvalid", "the signature is not the owner's signature of these exact terms");
|
|
316
|
+
}
|
|
317
|
+
const [intent] = await findIntentPda({ owner: input.owner, nonce: input.nonce });
|
|
318
|
+
const exists = (await createdAccount(transport, intent)) !== null;
|
|
319
|
+
const user = await userOf(transport, input.owner);
|
|
320
|
+
const description = await describeSignedIntent(fields, {
|
|
321
|
+
now: await chainTime(transport),
|
|
322
|
+
currentEpoch: user?.epoch ?? 0n,
|
|
323
|
+
expectedDomain: await clusterDomain(transport),
|
|
324
|
+
outputTokenProgram: outputToken.tokenProgram,
|
|
325
|
+
inputDecimals: inputToken.decimals,
|
|
326
|
+
outputDecimals: outputToken.decimals,
|
|
327
|
+
});
|
|
328
|
+
return {
|
|
329
|
+
intent,
|
|
330
|
+
exists: exists ? 1 : 0,
|
|
331
|
+
relayer_fee: input.relayer_fee,
|
|
332
|
+
summary: [
|
|
333
|
+
...description.lines,
|
|
334
|
+
`Relaying costs you ${createCost(config)} lamports in create fee, crank bounty, rent and signature fee, plus any priority fee; you receive ${formatAmount(input.relayer_fee, inputToken.decimals)} of ${input.input_mint}`,
|
|
335
|
+
],
|
|
336
|
+
warnings: description.warnings,
|
|
337
|
+
};
|
|
338
|
+
},
|
|
339
|
+
});
|
|
340
|
+
export function sameTerms(stored, fields) {
|
|
341
|
+
const partner = partnerOf(fields.ext ?? new Uint8Array());
|
|
342
|
+
return (stored.inputMint === fields.inputMint &&
|
|
343
|
+
stored.outputMint === fields.outputMint &&
|
|
344
|
+
stored.receiver === fields.receiver &&
|
|
345
|
+
stored.expiresAt === fields.expiresAt &&
|
|
346
|
+
stored.kind === fields.kind &&
|
|
347
|
+
stored.flags === (fields.flags ?? 0) &&
|
|
348
|
+
stored.partnerBps === (partner?.bps ?? 0) &&
|
|
349
|
+
(partner === undefined || stored.partner === partner.key) &&
|
|
350
|
+
stored.params.length === fields.params.length &&
|
|
351
|
+
stored.params.every((byte, i) => byte === fields.params[i]));
|
|
352
|
+
}
|
|
353
|
+
export function signatureBytes(text) {
|
|
354
|
+
const bytes = new RegExp(SIGNATURE_PATTERN).test(text) ? getBase58Encoder().encode(text) : new Uint8Array();
|
|
355
|
+
if (bytes.length !== 64) {
|
|
356
|
+
throw new AgentRefusal("SignatureMalformed", "the signature must be 64 bytes written in base58");
|
|
357
|
+
}
|
|
358
|
+
return bytes;
|
|
359
|
+
}
|
|
360
|
+
//# sourceMappingURL=signed.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signed.js","sourceRoot":"","sources":["../../../src/agent/signed.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { type Env } from "../args.js";
|
|
2
|
+
import { type Files } from "../wallet.js";
|
|
3
|
+
import { type AnyAction } from "./actions.js";
|
|
4
|
+
export type WalletAccess = {
|
|
5
|
+
url: string;
|
|
6
|
+
files: Files;
|
|
7
|
+
env: Env;
|
|
8
|
+
};
|
|
9
|
+
export declare const DEFAULT_EXPIRES_IN = 3600;
|
|
10
|
+
export declare const NO_WALLET: string;
|
|
11
|
+
export declare const WALLET_OFF = "this server runs without a wallet; start it with mcp --wallet to let it sign";
|
|
12
|
+
export declare const PREVIEW_ONLY = "nothing was sent; show the summary to the user and call again with send: true only after they approve";
|
|
13
|
+
export declare const walletSetup: AnyAction;
|
|
14
|
+
export declare const walletBalance: AnyAction;
|
|
15
|
+
export declare const walletSwap: AnyAction;
|
|
16
|
+
export declare const walletIntents: AnyAction;
|
|
17
|
+
export declare const walletCancel: AnyAction;
|
|
18
|
+
export declare const WALLET_ACTIONS: readonly AnyAction[];
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
import { parseAmount } from "@intent-engine/core";
|
|
2
|
+
import { mintOf } from "../accounts.js";
|
|
3
|
+
import { ENV_KEYPAIR } from "../args.js";
|
|
4
|
+
import { execute } from "../flows.js";
|
|
5
|
+
import { tokenNamed } from "../tokens.js";
|
|
6
|
+
import { balances, defaultMints, setup, withSettings } from "../wallet.js";
|
|
7
|
+
import { define } from "./actions.js";
|
|
8
|
+
import { MAX_EXPIRES_IN, MIN_EXPIRES_IN, prepareCreate } from "./create.js";
|
|
9
|
+
import { tool } from "./names.js";
|
|
10
|
+
import { AgentRefusal } from "./problems.js";
|
|
11
|
+
import { listIntents } from "./read.js";
|
|
12
|
+
import { InvalidInput, account, amount, choice, flag, integer, list, object, optional, text } from "./schema.js";
|
|
13
|
+
import { prepareCancel } from "./settle.js";
|
|
14
|
+
import { STATUS } from "../accounts.js";
|
|
15
|
+
export const DEFAULT_EXPIRES_IN = 3_600;
|
|
16
|
+
export const NO_WALLET = `this server has no wallet yet; call ${tool("wallet_setup")} first`;
|
|
17
|
+
export const WALLET_OFF = "this server runs without a wallet; start it with mcp --wallet to let it sign";
|
|
18
|
+
export const PREVIEW_ONLY = "nothing was sent; show the summary to the user and call again with send: true only after they approve";
|
|
19
|
+
function access(ctx) {
|
|
20
|
+
if (ctx.wallet === undefined) {
|
|
21
|
+
throw new AgentRefusal("WalletNotConfigured", WALLET_OFF);
|
|
22
|
+
}
|
|
23
|
+
return ctx.wallet;
|
|
24
|
+
}
|
|
25
|
+
async function savedKeypair(wallet) {
|
|
26
|
+
return (await withSettings(wallet.files, wallet.env))[ENV_KEYPAIR];
|
|
27
|
+
}
|
|
28
|
+
async function signerOf(ctx) {
|
|
29
|
+
const wallet = access(ctx);
|
|
30
|
+
const path = await savedKeypair(wallet);
|
|
31
|
+
if (path === undefined) {
|
|
32
|
+
throw new AgentRefusal("NoWallet", NO_WALLET);
|
|
33
|
+
}
|
|
34
|
+
try {
|
|
35
|
+
return await wallet.files.loadSigner(path);
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
throw new AgentRefusal("NoWallet", NO_WALLET);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
function mintNamed(text, url, path) {
|
|
42
|
+
const mint = tokenNamed(text.trim(), url);
|
|
43
|
+
if (mint instanceof Error) {
|
|
44
|
+
throw new InvalidInput([{ path, message: mint.message }]);
|
|
45
|
+
}
|
|
46
|
+
if (!/^[1-9A-HJ-NP-Za-km-z]{32,44}$/.test(mint)) {
|
|
47
|
+
throw new InvalidInput([{ path, message: "name SOL, TEST or a token mint address" }]);
|
|
48
|
+
}
|
|
49
|
+
return mint;
|
|
50
|
+
}
|
|
51
|
+
function raw(tokens, decimals, path) {
|
|
52
|
+
try {
|
|
53
|
+
return parseAmount(tokens, decimals);
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
throw new InvalidInput([{ path, message: error instanceof Error ? error.message : String(error) }]);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
async function sent(ctx, signer, view, send, call) {
|
|
60
|
+
for (const undo of call.undo.splice(0)) {
|
|
61
|
+
undo();
|
|
62
|
+
}
|
|
63
|
+
const { prepared, ...shown } = view;
|
|
64
|
+
if (send !== true) {
|
|
65
|
+
return { ...shown, sent: false, next: PREVIEW_ONLY };
|
|
66
|
+
}
|
|
67
|
+
return { ...shown, sent: true, signature: await execute(ctx.transport, prepared, signer) };
|
|
68
|
+
}
|
|
69
|
+
const tokenRow = object({
|
|
70
|
+
mint: account(),
|
|
71
|
+
name: optional(text()),
|
|
72
|
+
account: account("the wallet's token account for this mint"),
|
|
73
|
+
balance: text("in whole tokens"),
|
|
74
|
+
});
|
|
75
|
+
export const walletSetup = define({
|
|
76
|
+
name: tool("wallet_setup"),
|
|
77
|
+
title: "Set up the wallet",
|
|
78
|
+
description: "Create this server's devnet wallet if it has none, save it, and fund it from the devnet airdrop when it holds less than 0.5 SOL. Safe to call again: it reuses the saved wallet. Call this first.",
|
|
79
|
+
effect: "submit",
|
|
80
|
+
input: object({}),
|
|
81
|
+
output: object({
|
|
82
|
+
address: account(),
|
|
83
|
+
keypair: text("the file holding the wallet's key on this machine"),
|
|
84
|
+
created: flag("true when this call made the wallet"),
|
|
85
|
+
url: text(),
|
|
86
|
+
sol: text("SOL the wallet holds"),
|
|
87
|
+
next: text("what to tell the user"),
|
|
88
|
+
}),
|
|
89
|
+
run: async (ctx) => {
|
|
90
|
+
const wallet = access(ctx);
|
|
91
|
+
return setup(ctx.transport, wallet.files, wallet.url, await savedKeypair(wallet));
|
|
92
|
+
},
|
|
93
|
+
});
|
|
94
|
+
export const walletBalance = define({
|
|
95
|
+
name: tool("wallet_balance"),
|
|
96
|
+
title: "Show the wallet's balances",
|
|
97
|
+
description: "Show the SOL and token balances of this server's wallet, in whole tokens. Without mints it shows wrapped SOL and, on devnet, the TEST token.",
|
|
98
|
+
effect: "read",
|
|
99
|
+
input: object({ mints: optional(list(text("SOL, TEST or a mint address"), 8)) }),
|
|
100
|
+
output: object({ address: account(), sol: text(), tokens: list(tokenRow, 8) }),
|
|
101
|
+
run: async (ctx, input) => {
|
|
102
|
+
const wallet = access(ctx);
|
|
103
|
+
const owner = (await signerOf(ctx)).address;
|
|
104
|
+
const mints = input.mints?.map((m, i) => mintNamed(m, wallet.url, `mints.${i}`)) ?? defaultMints(wallet.url);
|
|
105
|
+
return balances(ctx.transport, owner, mints);
|
|
106
|
+
},
|
|
107
|
+
});
|
|
108
|
+
export const walletSwap = define({
|
|
109
|
+
name: tool("wallet_swap"),
|
|
110
|
+
title: "Swap from the wallet",
|
|
111
|
+
description: "Offer an exact amount of one token for at least an amount of another, from this server's wallet: the tokens are escrowed in an intent that a solver fills or that the wallet gets back. Amounts are whole tokens such as 0.05. Selling SOL wraps it first. Without send it only previews; show the user the summary and call again with send: true once they approve.",
|
|
112
|
+
effect: "submit",
|
|
113
|
+
repeats: true,
|
|
114
|
+
input: object({
|
|
115
|
+
sell: text("SOL, TEST or a mint address"),
|
|
116
|
+
buy: text("SOL, TEST or a mint address"),
|
|
117
|
+
amount: text("whole tokens to sell, such as 0.05"),
|
|
118
|
+
min_receive: text("least whole tokens to receive for all of it"),
|
|
119
|
+
expires_in: optional(integer(MIN_EXPIRES_IN, MAX_EXPIRES_IN, `seconds until the offer expires; default ${DEFAULT_EXPIRES_IN}`)),
|
|
120
|
+
send: optional(flag("true signs and sends; leave out to preview")),
|
|
121
|
+
}),
|
|
122
|
+
output: object({
|
|
123
|
+
intent: account(),
|
|
124
|
+
nonce: amount(),
|
|
125
|
+
summary: list(text(), 24),
|
|
126
|
+
warnings: list(text(), 16),
|
|
127
|
+
sent: flag(),
|
|
128
|
+
signature: optional(text()),
|
|
129
|
+
next: optional(text()),
|
|
130
|
+
}),
|
|
131
|
+
run: async (ctx, input, call) => {
|
|
132
|
+
const wallet = access(ctx);
|
|
133
|
+
const signer = await signerOf(ctx);
|
|
134
|
+
const inputMint = mintNamed(input.sell, wallet.url, "sell");
|
|
135
|
+
const outputMint = mintNamed(input.buy, wallet.url, "buy");
|
|
136
|
+
const [inputToken, outputToken] = [await mintOf(ctx.transport, inputMint), await mintOf(ctx.transport, outputMint)];
|
|
137
|
+
const view = (await prepareCreate.run(ctx, {
|
|
138
|
+
owner: signer.address,
|
|
139
|
+
input_mint: inputMint,
|
|
140
|
+
output_mint: outputMint,
|
|
141
|
+
order: {
|
|
142
|
+
kind: "swap",
|
|
143
|
+
amount_in: raw(input.amount, inputToken.decimals, "amount"),
|
|
144
|
+
min_out: raw(input.min_receive, outputToken.decimals, "min_receive"),
|
|
145
|
+
},
|
|
146
|
+
expires_in: input.expires_in ?? DEFAULT_EXPIRES_IN,
|
|
147
|
+
}, call));
|
|
148
|
+
const { intent, nonce, summary, warnings, prepared } = view;
|
|
149
|
+
return sent(ctx, signer, { intent, nonce, summary, warnings, prepared }, input.send, call);
|
|
150
|
+
},
|
|
151
|
+
});
|
|
152
|
+
export const walletIntents = define({
|
|
153
|
+
name: tool("wallet_intents"),
|
|
154
|
+
title: "List the wallet's intents",
|
|
155
|
+
description: "List the intents this server's wallet created, newest state first: open ones can still fill or be cancelled.",
|
|
156
|
+
effect: "read",
|
|
157
|
+
input: object({ status: optional(choice(STATUS, "only intents in this status")) }),
|
|
158
|
+
output: listIntents.output,
|
|
159
|
+
run: async (ctx, input, call) => {
|
|
160
|
+
const owner = (await signerOf(ctx)).address;
|
|
161
|
+
return listIntents.run(ctx, { owner, ...(input.status === undefined ? {} : { status: input.status }) }, call);
|
|
162
|
+
},
|
|
163
|
+
});
|
|
164
|
+
export const walletCancel = define({
|
|
165
|
+
name: tool("wallet_cancel"),
|
|
166
|
+
title: "Cancel a wallet intent",
|
|
167
|
+
description: "Cancel an open intent of this server's wallet by its nonce: the escrow returns to the wallet and the intent account closes, returning its rent. Without send it only previews; call again with send: true once the user approves.",
|
|
168
|
+
effect: "submit",
|
|
169
|
+
input: object({ nonce: amount("the intent's nonce, from wallet_intents"), send: optional(flag("true signs and sends; leave out to preview")) }),
|
|
170
|
+
output: object({
|
|
171
|
+
intent: account(),
|
|
172
|
+
refund: amount("raw input units returned to the wallet"),
|
|
173
|
+
summary: list(text(), 16),
|
|
174
|
+
warnings: list(text(), 8),
|
|
175
|
+
sent: flag(),
|
|
176
|
+
signature: optional(text()),
|
|
177
|
+
next: optional(text()),
|
|
178
|
+
}),
|
|
179
|
+
run: async (ctx, input, call) => {
|
|
180
|
+
const signer = await signerOf(ctx);
|
|
181
|
+
const view = (await prepareCancel.run(ctx, { owner: signer.address, nonce: input.nonce, close: true }, call));
|
|
182
|
+
return sent(ctx, signer, view, input.send, call);
|
|
183
|
+
},
|
|
184
|
+
});
|
|
185
|
+
export const WALLET_ACTIONS = [walletSetup, walletBalance, walletSwap, walletIntents, walletCancel];
|
|
186
|
+
//# sourceMappingURL=wallet.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wallet.js","sourceRoot":"","sources":["../../../src/agent/wallet.ts"],"names":[],"mappings":"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"}
|