@intent-engine/cli 0.1.23 → 0.1.27
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/assets/viperjs-judge.sha256 +1 -0
- package/assets/viperjs-judge.wasm +0 -0
- package/dist/src/admin-commands.d.ts +13 -0
- package/dist/src/admin-commands.js +185 -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 +9 -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 +138 -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 +9 -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 +28 -1
- package/dist/src/agent/problems.js +47 -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 +8 -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/reputation.d.ts +4 -0
- package/dist/src/agent/reputation.js +127 -0
- package/dist/src/agent/reputation.js.map +1 -0
- 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 +138 -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 +69 -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/committee.d.ts +4 -0
- package/dist/src/agent/wallet/committee.js +155 -0
- package/dist/src/agent/wallet/committee.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 +245 -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 +19 -73
- package/dist/src/agent/wallet.js +30 -1322
- package/dist/src/agent/wallet.js.map +1 -1
- package/dist/src/arg-options.d.ts +405 -0
- package/dist/src/arg-options.js +361 -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 +60 -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 +284 -0
- package/dist/src/arg-values.js.map +1 -0
- package/dist/src/args.d.ts +7 -545
- package/dist/src/args.js +103 -926
- package/dist/src/args.js.map +1 -1
- package/dist/src/artifact.d.ts +28 -0
- package/dist/src/artifact.js +103 -0
- package/dist/src/artifact.js.map +1 -0
- package/dist/src/check-process.d.ts +46 -0
- package/dist/src/check-process.js +416 -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 +285 -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 +76 -457
- package/dist/src/commands.js.map +1 -1
- package/dist/src/committee-commands.d.ts +31 -0
- package/dist/src/committee-commands.js +167 -0
- package/dist/src/committee-commands.js.map +1 -0
- 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/host-judge.d.ts +11 -0
- package/dist/src/host-judge.js +120 -0
- package/dist/src/host-judge.js.map +1 -0
- 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 +25 -16
- package/dist/src/judge.js +179 -103
- package/dist/src/judge.js.map +1 -1
- package/dist/src/main.d.ts +5 -1
- package/dist/src/main.js +36 -9
- package/dist/src/main.js.map +1 -1
- package/dist/src/monitor-args.d.ts +11 -0
- package/dist/src/monitor-args.js +58 -0
- package/dist/src/monitor-args.js.map +1 -0
- package/dist/src/monitor-fills.d.ts +13 -0
- package/dist/src/monitor-fills.js +56 -0
- package/dist/src/monitor-fills.js.map +1 -0
- package/dist/src/monitor.d.ts +60 -0
- package/dist/src/monitor.js +295 -0
- package/dist/src/monitor.js.map +1 -0
- 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/reputation-commands.d.ts +8 -0
- package/dist/src/reputation-commands.js +20 -0
- package/dist/src/reputation-commands.js.map +1 -0
- 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/sandbox.d.ts +46 -0
- package/dist/src/sandbox.js +142 -0
- package/dist/src/sandbox.js.map +1 -0
- package/dist/src/solve-commands.d.ts +25 -0
- package/dist/src/solve-commands.js +175 -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/trust-args.d.ts +6 -0
- package/dist/src/trust-args.js +76 -0
- package/dist/src/trust-args.js.map +1 -0
- package/dist/src/version.d.ts +1 -1
- package/dist/src/version.js +1 -1
- package/dist/src/viper.d.ts +66 -0
- package/dist/src/viper.js +282 -0
- package/dist/src/viper.js.map +1 -0
- 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 +18 -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
package/dist/src/commands.js
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { announcements, chainTime, clusterDomain, createdAccount, deliveriesOf, deliveryInstructions, jobsOf, loadConfig, loadIntent, memoized, tokenAmountOf, tokenProgramOf, } from "@intent-engine/client";
|
|
1
|
+
import { buildAdvanceEpoch, buildAdvanceNonce, buildCancelIntent, buildCloseIntent, findIntentPda, findUserStatePda, findVaultPda, getUserStateDecoder, nextEpoch, } from "@intent-engine/core";
|
|
2
|
+
import { solverTableAccounts, tick } from "@intent-engine/solver";
|
|
3
|
+
import { clusterDomain, createdAccount, loadConfig, loadIntent, tokenAccountIfMissing, tokenProgramOf, } from "@intent-engine/client";
|
|
5
4
|
import { agentServer } from "./agent/mcp.js";
|
|
6
5
|
import { claimsOf } from "./agent/claims.js";
|
|
7
6
|
import { budgetOf } from "./agent/budget.js";
|
|
@@ -10,284 +9,25 @@ import { relayOf } from "./agent/relay.js";
|
|
|
10
9
|
import { usageOf } from "./args.js";
|
|
11
10
|
import { VERSION } from "./version.js";
|
|
12
11
|
import { balances, defaultMints, setup } from "./wallet.js";
|
|
13
|
-
import {
|
|
14
|
-
import { KIND_NAMES, KINDS, preparedView } from "./agent/shapes.js";
|
|
15
|
-
import { prepareCreate } from "./agent/create.js";
|
|
16
|
-
import { getMandate, prepareAgentCreate, prepareMandate, prepareRevokeMandate } from "./agent/mandate.js";
|
|
17
|
-
import { listIntents } from "./agent/read.js";
|
|
18
|
-
import { prepareSignedIntent, previewSignedIntent, submitSignedIntent } from "./agent/signed.js";
|
|
19
|
-
import { approval, ask, finish, FlowRefused, hasTokens, inRaw, NOT_SENT, perform, signMessage } from "./flows.js";
|
|
20
|
-
import { loadMandate } from "./agent/mandate.js";
|
|
21
|
-
import { RELAY_MAX_TTL } from "./args.js";
|
|
12
|
+
import { FlowRefused } from "./flows.js";
|
|
22
13
|
import { describeIntent, quoteOf, sameBytes } from "./accounts.js";
|
|
23
14
|
import { closing, crank, expiring } from "./crank.js";
|
|
24
|
-
import {
|
|
15
|
+
import { withPriority } from "./compute.js";
|
|
25
16
|
import { createTreasuryAccounts, intentInputMints, treasuryView } from "./treasury.js";
|
|
26
17
|
import { artifactSha256, judge } from "./judge.js";
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
}
|
|
18
|
+
import { adminCommand, previewed, showMintCap } from "./admin-commands.js";
|
|
19
|
+
import { jobCommand } from "./job-commands.js";
|
|
20
|
+
import { committeeCommand } from "./committee-commands.js";
|
|
21
|
+
import { reputationCommand } from "./reputation-commands.js";
|
|
22
|
+
import { engineEvents } from "./event-feed.js";
|
|
23
|
+
import { SOLVER_TABLE_NEXT, solverOptions } from "./solve-commands.js";
|
|
24
|
+
import { flowCommand } from "./flow-commands.js";
|
|
25
|
+
export { AUTHORITY_NEXT, configExists } from "./admin-commands.js";
|
|
26
|
+
export { NOT_RELEASED } from "./job-commands.js";
|
|
27
|
+
export { follow, followGap } from "./event-feed.js";
|
|
28
|
+
export { decodedChanges, ENV_JUPITER_KEY, IN_FLIGHT_SECONDS, JUPITER_DOMAIN, jupiterHost, REFRESH_AFTER_SECONDS, SOLVER_TABLE_NEXT, stillOpen, watchSolve, } from "./solve-commands.js";
|
|
35
29
|
export * from "./accounts.js";
|
|
36
30
|
export * from "./crank.js";
|
|
37
|
-
const SIGNED_FILE_VERSION = 1;
|
|
38
|
-
export const SOLVER_TABLE_NEXT = "put these in an address lookup table you own (solana address-lookup-table create, then extend with them) and pass it to solve with --lookup-table";
|
|
39
|
-
function relayAnything(signer, mint) {
|
|
40
|
-
return relayOf(signer, {
|
|
41
|
-
maxLamports: U64_MAX,
|
|
42
|
-
maxTtl: BigInt(RELAY_MAX_TTL),
|
|
43
|
-
perHour: Number.MAX_SAFE_INTEGER,
|
|
44
|
-
hourlyLamports: U64_MAX,
|
|
45
|
-
fees: new Map([[mint, 0n]]),
|
|
46
|
-
});
|
|
47
|
-
}
|
|
48
|
-
async function rawFlowInput(transport, flow, input, signer) {
|
|
49
|
-
if (flow === "approve" || flow === "revoke-approval") {
|
|
50
|
-
const mint = input["mint"];
|
|
51
|
-
return inRaw(transport, input, mint, mint);
|
|
52
|
-
}
|
|
53
|
-
if (flow === "mandate-use") {
|
|
54
|
-
if (!hasTokens(input)) {
|
|
55
|
-
return input;
|
|
56
|
-
}
|
|
57
|
-
const owner = input["owner"];
|
|
58
|
-
const id = input["id"] === undefined ? 0n : BigInt(input["id"]);
|
|
59
|
-
const { mandate } = await loadMandate(transport, owner, signer, id);
|
|
60
|
-
return inRaw(transport, input, mandate.inputMint, mandate.outputMint);
|
|
61
|
-
}
|
|
62
|
-
if (flow === "mandate-revoke") {
|
|
63
|
-
return input;
|
|
64
|
-
}
|
|
65
|
-
return inRaw(transport, input, input["input_mint"], input["output_mint"]);
|
|
66
|
-
}
|
|
67
|
-
function context(transport, relay = undefined) {
|
|
68
|
-
return { transport, relay, agent: undefined, claims: claimsOf() };
|
|
69
|
-
}
|
|
70
|
-
export const AUTHORITY_NEXT = "import transaction_base58 into the multisig as a proposal (its blockhash and fee payer are replaced there), or build one from instructions; it carries no compute budget so it can run from a vault";
|
|
71
|
-
function instructionView(ix) {
|
|
72
|
-
return {
|
|
73
|
-
program: ix.programAddress,
|
|
74
|
-
accounts: (ix.accounts ?? []).map((meta) => ({
|
|
75
|
-
address: meta.address,
|
|
76
|
-
signer: isSignerRole(meta.role),
|
|
77
|
-
writable: isWritableRole(meta.role),
|
|
78
|
-
})),
|
|
79
|
-
data: getBase64Decoder().decode(ix.data ?? new Uint8Array()),
|
|
80
|
-
};
|
|
81
|
-
}
|
|
82
|
-
const kindList = (mask) => KINDS.filter((kind) => (mask & kindBit(kind)) !== 0n)
|
|
83
|
-
.map((kind) => KIND_NAMES[kind])
|
|
84
|
-
.join(", ") || "none";
|
|
85
|
-
const pauseList = (flags) => [...((flags & PAUSE_CREATE) !== 0 ? ["creating"] : []), ...((flags & PAUSE_FILL) !== 0 ? ["filling"] : [])].join(" and ") ||
|
|
86
|
-
"nothing";
|
|
87
|
-
async function administer(transport, runtime, by, build, summary, extra = {}) {
|
|
88
|
-
if ("keypair" in by) {
|
|
89
|
-
const signer = await runtime.loadSigner(by.keypair);
|
|
90
|
-
const instructions = await build(signer);
|
|
91
|
-
const described = { ...extra, summary: summary(signer.address) };
|
|
92
|
-
if (!by.yes) {
|
|
93
|
-
const simulated = await prepare(transport, instructions, signer.address);
|
|
94
|
-
return { ...described, sent: false, units_consumed: simulated.unitsConsumed, next: NOT_SENT };
|
|
95
|
-
}
|
|
96
|
-
return { ...described, sent: true, signature: await transport.send(instructions, signer) };
|
|
97
|
-
}
|
|
98
|
-
const instructions = await build(createNoopSigner(by.authority));
|
|
99
|
-
const unbudgeted = { ...transport, budget: async (ixs) => [...ixs] };
|
|
100
|
-
const view = preparedView(await prepare(unbudgeted, instructions, by.authority));
|
|
101
|
-
return {
|
|
102
|
-
...extra,
|
|
103
|
-
summary: summary(by.authority),
|
|
104
|
-
unsigned: {
|
|
105
|
-
...view,
|
|
106
|
-
transaction_base58: getBase58Decoder().decode(getBase64Encoder().encode(view.transaction)),
|
|
107
|
-
instructions: instructions.map(instructionView),
|
|
108
|
-
next: AUTHORITY_NEXT,
|
|
109
|
-
},
|
|
110
|
-
};
|
|
111
|
-
}
|
|
112
|
-
async function engineEvents(transport, limit) {
|
|
113
|
-
return (await transport.engineTransactions(limit)).map((tx) => ({
|
|
114
|
-
signature: tx.signature,
|
|
115
|
-
slot: tx.slot,
|
|
116
|
-
blockTime: tx.blockTime,
|
|
117
|
-
failed: tx.failed,
|
|
118
|
-
events: tx.failed ? [] : tx.emitted.map(decodeEvent).filter((e) => e !== null),
|
|
119
|
-
}));
|
|
120
|
-
}
|
|
121
|
-
export const followGap = (limit) => `more than ${limit} engine transactions landed since the last poll, so some were not shown; raise --limit or lower --interval`;
|
|
122
|
-
export async function follow(transport, runtime, limit, interval, emit) {
|
|
123
|
-
let seen = new Set();
|
|
124
|
-
let shown = 0;
|
|
125
|
-
do {
|
|
126
|
-
const fetched = await engineEvents(transport, limit);
|
|
127
|
-
const fresh = fetched.filter((tx) => !seen.has(tx.signature)).reverse();
|
|
128
|
-
if (seen.size > 0 && fetched.length >= limit && fresh.length === fetched.length) {
|
|
129
|
-
emit({ gap: true, warning: followGap(limit) });
|
|
130
|
-
}
|
|
131
|
-
for (const tx of fresh) {
|
|
132
|
-
emit(tx);
|
|
133
|
-
shown++;
|
|
134
|
-
}
|
|
135
|
-
seen = new Set(fetched.map((tx) => tx.signature));
|
|
136
|
-
} while (await runtime.sleep(interval));
|
|
137
|
-
return shown;
|
|
138
|
-
}
|
|
139
|
-
export const IN_FLIGHT_SECONDS = 90n;
|
|
140
|
-
export const REFRESH_AFTER_SECONDS = 60n;
|
|
141
|
-
export function decodedChanges(changed) {
|
|
142
|
-
const intents = [];
|
|
143
|
-
const unreadable = [];
|
|
144
|
-
for (const { address, data } of changed) {
|
|
145
|
-
try {
|
|
146
|
-
intents.push({ address, intent: getIntentDecoder().decode(data) });
|
|
147
|
-
}
|
|
148
|
-
catch {
|
|
149
|
-
unreadable.push(address);
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
return { intents, unreadable };
|
|
153
|
-
}
|
|
154
|
-
export async function stillOpen(transport, intents) {
|
|
155
|
-
const views = await transport.getAccounts(intents);
|
|
156
|
-
return intents.filter((_, i) => {
|
|
157
|
-
const view = views[i];
|
|
158
|
-
return view !== null && view !== undefined && getIntentDecoder().decode(view.data).status === IntentStatus.Open;
|
|
159
|
-
});
|
|
160
|
-
}
|
|
161
|
-
export async function watchSolve(command, interval, runtime, emit) {
|
|
162
|
-
const transport = withPriority(runtime.transport(command.url), command.priority);
|
|
163
|
-
const options = await solverOptions(command, runtime, transport);
|
|
164
|
-
const chain = remembering(options.chain);
|
|
165
|
-
const live = {
|
|
166
|
-
...options,
|
|
167
|
-
chain,
|
|
168
|
-
send: command.jito === undefined ? async (wire) => ({ signature: await transport.submitWire(wire), confirmed: false }) : options.send,
|
|
169
|
-
};
|
|
170
|
-
const changes = runtime.intentChanges(command.url);
|
|
171
|
-
const inFlight = new Map();
|
|
172
|
-
const failing = new Map();
|
|
173
|
-
let scannedAt = null;
|
|
174
|
-
let acted = 0;
|
|
175
|
-
try {
|
|
176
|
-
for (let changed = []; changed !== null; changed = await changes.wait(interval)) {
|
|
177
|
-
const now = runtime.now();
|
|
178
|
-
const began = performance.now();
|
|
179
|
-
let full = false;
|
|
180
|
-
try {
|
|
181
|
-
full = changed.length === 0 || scannedAt === null || now - scannedAt >= BigInt(interval);
|
|
182
|
-
const decoded = full ? { intents: await chain.intents(), unreadable: [] } : decodedChanges(changed);
|
|
183
|
-
if (full) {
|
|
184
|
-
scannedAt = now;
|
|
185
|
-
}
|
|
186
|
-
if (decoded.unreadable.length > 0) {
|
|
187
|
-
emit({ at: now, scan: "changed", unreadable: decoded.unreadable });
|
|
188
|
-
}
|
|
189
|
-
const listed = decoded.intents;
|
|
190
|
-
for (const [intent, until] of inFlight) {
|
|
191
|
-
if (until <= now) {
|
|
192
|
-
inFlight.delete(intent);
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
const due = listed.filter(({ address }) => !inFlight.has(address));
|
|
196
|
-
const { filled, sent, failed } = await tick({ ...live, chain: { ...chain, intents: async () => due } });
|
|
197
|
-
for (const { intent } of sent) {
|
|
198
|
-
inFlight.set(intent, now + IN_FLIGHT_SECONDS);
|
|
199
|
-
}
|
|
200
|
-
if (filled.length + sent.length + failed.length > 0) {
|
|
201
|
-
emit({ at: now, scan: full ? "full" : "changed", ms: Math.round(performance.now() - began), filled, sent, failed });
|
|
202
|
-
acted += filled.length + sent.length;
|
|
203
|
-
}
|
|
204
|
-
for (const [intent, at] of failing) {
|
|
205
|
-
if (now - at >= REFRESH_AFTER_SECONDS * 10n) {
|
|
206
|
-
failing.delete(intent);
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
const open = await stillOpen(transport, failed.map((f) => f.intent));
|
|
210
|
-
const refresh = open.filter((intent) => {
|
|
211
|
-
const at = failing.get(intent);
|
|
212
|
-
return at === undefined || now - at >= REFRESH_AFTER_SECONDS;
|
|
213
|
-
});
|
|
214
|
-
if (refresh.length > 0) {
|
|
215
|
-
refresh.forEach((intent) => failing.set(intent, now));
|
|
216
|
-
chain.forget();
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
catch (error) {
|
|
220
|
-
chain.forget();
|
|
221
|
-
emit({ at: now, scan: full ? "full" : "changed", error: error instanceof Error ? error.message : String(error) });
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
|
-
}
|
|
225
|
-
finally {
|
|
226
|
-
changes.close();
|
|
227
|
-
}
|
|
228
|
-
return acted;
|
|
229
|
-
}
|
|
230
|
-
async function solverOptions(command, runtime, transport) {
|
|
231
|
-
const solver = await runtime.loadSigner(command.keypair);
|
|
232
|
-
let latest;
|
|
233
|
-
const chain = {
|
|
234
|
-
config: async () => (await loadConfig(transport)).config,
|
|
235
|
-
intents: async () => (await transport.intents()).map(({ address, data }) => ({ address, intent: getIntentDecoder().decode(data) })),
|
|
236
|
-
now: () => chainTime(transport),
|
|
237
|
-
tokenProgram: (mint) => tokenProgramOf(transport, mint),
|
|
238
|
-
exists: async (address) => (await createdAccount(transport, address)) !== null,
|
|
239
|
-
tokenAmount: async (address) => tokenAmountOf((await transport.getAccount(address))?.data ?? null) ?? 0n,
|
|
240
|
-
lookupTables: async (addresses) => {
|
|
241
|
-
const tables = {};
|
|
242
|
-
for (const address of addresses) {
|
|
243
|
-
const view = await transport.getAccount(address);
|
|
244
|
-
if (view === null) {
|
|
245
|
-
throw new Error(`lookup table ${address} does not exist`);
|
|
246
|
-
}
|
|
247
|
-
tables[address] = decodeLookupTable(view.data);
|
|
248
|
-
}
|
|
249
|
-
return tables;
|
|
250
|
-
},
|
|
251
|
-
blockhash: async () => {
|
|
252
|
-
latest = await transport.latestBlockhash();
|
|
253
|
-
return latest;
|
|
254
|
-
},
|
|
255
|
-
};
|
|
256
|
-
const bundle = command.jito === undefined ? undefined : jitoBundles({ url: command.jito, fetch: runtime.fetch });
|
|
257
|
-
return {
|
|
258
|
-
chain,
|
|
259
|
-
pricer: command.jupiter === undefined
|
|
260
|
-
? issuePricer(await Promise.all(command.issue.map(async (route) => ({ ...route, outputTokenProgram: await tokenProgramOf(transport, route.outputMint) }))))
|
|
261
|
-
: jupiterPricer({
|
|
262
|
-
baseUrl: command.jupiter,
|
|
263
|
-
fetch: runtime.fetch,
|
|
264
|
-
slippageBps: command.slippageBps,
|
|
265
|
-
maxAccounts: SOLVER_ROUTE_ACCOUNTS,
|
|
266
|
-
...(runtime.env[ENV_JUPITER_KEY] === undefined || !jupiterHost(command.jupiter)
|
|
267
|
-
? {}
|
|
268
|
-
: { apiKey: runtime.env[ENV_JUPITER_KEY] }),
|
|
269
|
-
...(command.routeProgram === undefined ? {} : { swapPrograms: new Set([command.routeProgram]) }),
|
|
270
|
-
}),
|
|
271
|
-
solver,
|
|
272
|
-
strategy: { minProfit: command.minProfit, maxFeeBps: command.maxFeeBps },
|
|
273
|
-
tip: command.tipLamports === 0n ? null : { account: tipAccount(runtime.entropy()), lamports: command.tipLamports },
|
|
274
|
-
lookupTables: command.lookupTables,
|
|
275
|
-
unitPrice: (instructions) => priceOf(transport, command.priority, instructions),
|
|
276
|
-
simulate: async (wire, watch) => {
|
|
277
|
-
const simulated = await transport.simulate(wire, watch);
|
|
278
|
-
return { err: simulated.err, unitsConsumed: simulated.unitsConsumed, balances: simulated.accounts.map(tokenAmountOf) };
|
|
279
|
-
},
|
|
280
|
-
send: async (wire) => {
|
|
281
|
-
if (bundle !== undefined) {
|
|
282
|
-
return { signature: await bundle([wire]), confirmed: false };
|
|
283
|
-
}
|
|
284
|
-
if (latest === undefined) {
|
|
285
|
-
throw new Error("no blockhash was fetched for this transaction");
|
|
286
|
-
}
|
|
287
|
-
return { signature: await transport.sendWire(wire, latest), confirmed: true };
|
|
288
|
-
},
|
|
289
|
-
};
|
|
290
|
-
}
|
|
291
31
|
export async function run(command, runtime) {
|
|
292
32
|
if (command.name === "help") {
|
|
293
33
|
return usageOf(command.verb);
|
|
@@ -316,11 +56,11 @@ export async function run(command, runtime) {
|
|
|
316
56
|
};
|
|
317
57
|
const wallet = command.wallet === null
|
|
318
58
|
? {}
|
|
319
|
-
: { wallet: { url: command.url, files: runtime, env: runtime.env, sleep: runtime.sleep, now: runtime.now, limits: walletGuard(command.wallet) } };
|
|
59
|
+
: { wallet: { url: command.url, files: runtime, env: runtime.env, sleep: runtime.sleep, now: runtime.now, limits: walletGuard(command.wallet, runtime.saleBook) } };
|
|
320
60
|
if (command.wallet !== null) {
|
|
321
61
|
transport.engineTransactions(ESTIMATE_SCAN).catch(() => undefined);
|
|
322
62
|
}
|
|
323
|
-
await runtime.serve(agentServer({ transport, relay, agent, claims: claimsOf(), ...wallet }));
|
|
63
|
+
await runtime.serve(agentServer({ transport, relay, agent, claims: claimsOf(), url: command.url, ...wallet }));
|
|
324
64
|
return null;
|
|
325
65
|
}
|
|
326
66
|
case "setup":
|
|
@@ -346,66 +86,68 @@ export async function run(command, runtime) {
|
|
|
346
86
|
}
|
|
347
87
|
case "cancel": {
|
|
348
88
|
const owner = await runtime.loadSigner(command.keypair);
|
|
349
|
-
const { intent } = await loadIntent(transport, owner.address, command.nonce);
|
|
350
|
-
const
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
89
|
+
const { address, intent } = await loadIntent(transport, owner.address, command.nonce);
|
|
90
|
+
const ref = { nonce: command.nonce, inputMint: intent.inputMint, tokenProgram: await tokenProgramOf(transport, intent.inputMint) };
|
|
91
|
+
const refund = await tokenAccountIfMissing(transport, owner, owner.address, intent.inputMint, ref.tokenProgram);
|
|
92
|
+
const instructions = [
|
|
93
|
+
...refund.create,
|
|
94
|
+
await buildCancelIntent({ ...ref, owner }),
|
|
95
|
+
...(command.close ? [await buildCloseIntent({ ...ref, owner: owner.address, cranker: owner, rentPayer: intent.rentPayer })] : []),
|
|
96
|
+
];
|
|
97
|
+
const summary = [
|
|
98
|
+
`Cancels intent ${address} (nonce ${command.nonce}); nobody can fill it afterwards`,
|
|
99
|
+
`Returns what is left in escrow to ${refund.address}, the owner's token account for ${intent.inputMint}`,
|
|
100
|
+
...(refund.create.length > 0 ? [`Creates ${refund.address} first, since it is missing; the owner pays its rent`] : []),
|
|
101
|
+
...(command.close ? [`Closes the intent in the same transaction and returns its rent and bounty to ${intent.rentPayer}, who paid them; it can no longer be read afterwards`] : []),
|
|
102
|
+
];
|
|
103
|
+
return previewed(transport, instructions, owner, { intent: address, summary }, command.yes);
|
|
357
104
|
}
|
|
358
105
|
case "expire": {
|
|
359
106
|
const cranker = await runtime.loadSigner(command.keypair);
|
|
360
107
|
const { address, intent } = await loadIntent(transport, command.owner, command.nonce);
|
|
361
|
-
|
|
108
|
+
const instructions = await expiring(transport, cranker, address, intent, "always", false);
|
|
109
|
+
const summary = [
|
|
110
|
+
`Expires intent ${address} (nonce ${command.nonce}) and returns what is left in escrow to its owner ${command.owner}`,
|
|
111
|
+
...(instructions.length > 1 ? [`Creates a token account for the owner to take the refund; ${cranker.address} pays its rent`] : []),
|
|
112
|
+
];
|
|
113
|
+
return previewed(transport, instructions, cranker, { intent: address, summary }, command.yes);
|
|
362
114
|
}
|
|
363
115
|
case "close": {
|
|
364
116
|
const payer = await runtime.loadSigner(command.keypair);
|
|
365
117
|
const { address, intent } = await loadIntent(transport, command.owner, command.nonce);
|
|
366
|
-
|
|
118
|
+
const instructions = await closing(transport, payer, address, intent, "always");
|
|
119
|
+
const summary = [
|
|
120
|
+
`Closes intent ${address} (nonce ${command.nonce}) and returns its rent; it can no longer be read afterwards`,
|
|
121
|
+
...(instructions.length > 1 ? [`Creates a token account for the owner to take what is left in escrow; ${payer.address} pays its rent`] : []),
|
|
122
|
+
];
|
|
123
|
+
return previewed(transport, instructions, payer, { intent: address, summary }, command.yes);
|
|
367
124
|
}
|
|
368
125
|
case "follow":
|
|
369
126
|
throw new FlowRefused("events --follow streams to the terminal and runs only from the command line");
|
|
127
|
+
case "monitor":
|
|
128
|
+
throw new FlowRefused("monitor watches the program from the command line only");
|
|
370
129
|
case "events": {
|
|
371
130
|
const transactions = await engineEvents(transport, command.limit);
|
|
372
131
|
const notable = transactions.reduce((n, tx) => n + tx.events.filter((e) => e.notable === true).length, 0);
|
|
373
132
|
return { notable, transactions };
|
|
374
133
|
}
|
|
375
134
|
case "jobs":
|
|
376
|
-
|
|
377
|
-
case "
|
|
378
|
-
|
|
379
|
-
const { intent, sha256, workUrl } = command;
|
|
380
|
-
const { attestor, instructions } = await deliveryInstructions(transport, { worker, intent, sha256, url: workUrl });
|
|
381
|
-
const shown = {
|
|
382
|
-
intent,
|
|
383
|
-
attestor,
|
|
384
|
-
summary: [
|
|
385
|
-
`Announces: the work with sha256 ${sha256} at ${workUrl}, for the proof escrow ${intent}`,
|
|
386
|
-
`Notifies: its judge ${attestor}, with a transfer of 0 lamports from ${worker.address}, which signs and pays the fee`,
|
|
387
|
-
],
|
|
388
|
-
};
|
|
389
|
-
if (!command.yes) {
|
|
390
|
-
const simulated = await prepare(transport, instructions, worker.address);
|
|
391
|
-
return { ...shown, sent: false, units_consumed: simulated.unitsConsumed, next: NOT_SENT };
|
|
392
|
-
}
|
|
393
|
-
return { ...shown, sent: true, signature: await transport.send(instructions, worker) };
|
|
394
|
-
}
|
|
135
|
+
case "deliver":
|
|
136
|
+
case "receipt":
|
|
137
|
+
case "record-delivery":
|
|
395
138
|
case "deliveries":
|
|
396
|
-
return
|
|
397
|
-
|
|
398
|
-
deliveries: announcements(await deliveriesOf(transport, command.attestor, command.intent)).map(({ sha256, first, copies }) => ({
|
|
399
|
-
sha256,
|
|
400
|
-
worker: first.worker,
|
|
401
|
-
url: first.url,
|
|
402
|
-
signature: first.signature,
|
|
403
|
-
slot: first.slot,
|
|
404
|
-
copies,
|
|
405
|
-
})),
|
|
406
|
-
};
|
|
407
|
-
case "judge":
|
|
139
|
+
return jobCommand(command, runtime, transport);
|
|
140
|
+
case "judge": {
|
|
408
141
|
return judge(command, runtime, transport);
|
|
142
|
+
}
|
|
143
|
+
case "committee-create":
|
|
144
|
+
case "committee-show":
|
|
145
|
+
case "committee-vote":
|
|
146
|
+
case "committee-release":
|
|
147
|
+
return committeeCommand(command, runtime, transport);
|
|
148
|
+
case "reputation":
|
|
149
|
+
case "feedback":
|
|
150
|
+
return reputationCommand(command, runtime, transport);
|
|
409
151
|
case "treasury": {
|
|
410
152
|
const view = await treasuryView(transport, command.mints ?? (await intentInputMints(transport)));
|
|
411
153
|
if (!command.create || command.keypair === undefined) {
|
|
@@ -426,69 +168,18 @@ export async function run(command, runtime) {
|
|
|
426
168
|
const cranker = await runtime.loadSigner(command.keypair);
|
|
427
169
|
return crank(transport, cranker, command.dryRun, command.fundAccounts);
|
|
428
170
|
}
|
|
429
|
-
case "init-config":
|
|
430
|
-
const [config] = await findConfigPda();
|
|
431
|
-
if ((await transport.getAccount(config)) !== null) {
|
|
432
|
-
throw new Error(configExists(config));
|
|
433
|
-
}
|
|
434
|
-
const domain = await clusterDomain(transport);
|
|
435
|
-
return administer(transport, runtime, command.by, async (authority) => [
|
|
436
|
-
await buildInitConfig({
|
|
437
|
-
authority,
|
|
438
|
-
domain,
|
|
439
|
-
guardian: command.guardian,
|
|
440
|
-
feeRecipient: command.feeRecipient,
|
|
441
|
-
enabledKinds: command.enabledKinds,
|
|
442
|
-
feeBps: command.feeBps,
|
|
443
|
-
paused: command.paused,
|
|
444
|
-
}),
|
|
445
|
-
], () => [
|
|
446
|
-
`Creates the engine config ${config} for this cluster (domain ${getBase58Decoder().decode(domain)}) with the signer as admin`,
|
|
447
|
-
`Guardian: ${command.guardian}`,
|
|
448
|
-
`Fee recipient: ${command.feeRecipient}`,
|
|
449
|
-
`Fee: ${command.feeBps} bps`,
|
|
450
|
-
`Enabled kinds: ${kindList(command.enabledKinds)}`,
|
|
451
|
-
`Paused: ${pauseList(command.paused)}`,
|
|
452
|
-
], { config, domain });
|
|
453
|
-
}
|
|
171
|
+
case "init-config":
|
|
454
172
|
case "raise-pause":
|
|
455
|
-
return administer(transport, runtime, command.by, async (authority) => [await buildRaisePause({ authority, flags: command.flags })], () => [`Pauses ${pauseList(command.flags)} for every intent until the admin lowers the pause`]);
|
|
456
173
|
case "lower-pause":
|
|
457
|
-
|
|
458
|
-
case "
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
fillDisabledKinds: c.fillDisabledKinds ?? config.fillDisabledKinds,
|
|
467
|
-
};
|
|
468
|
-
const changes = [
|
|
469
|
-
...(update.guardian === config.guardian ? [] : [`Guardian: ${config.guardian} -> ${update.guardian}`]),
|
|
470
|
-
...(update.feeRecipient === config.feeRecipient ? [] : [`Fee recipient: ${config.feeRecipient} -> ${update.feeRecipient}`]),
|
|
471
|
-
...(update.feeBps === config.feeBps ? [] : [`Fee: ${config.feeBps} -> ${update.feeBps} bps`]),
|
|
472
|
-
...(update.enabledKinds === config.enabledKinds
|
|
473
|
-
? []
|
|
474
|
-
: [`Enabled kinds: ${kindList(config.enabledKinds)} -> ${kindList(update.enabledKinds)}`]),
|
|
475
|
-
...(update.fillDisabledKinds === config.fillDisabledKinds
|
|
476
|
-
? []
|
|
477
|
-
: [`Fills stopped for: ${kindList(config.fillDisabledKinds)} -> ${kindList(update.fillDisabledKinds)}`]),
|
|
478
|
-
];
|
|
479
|
-
return administer(transport, runtime, command.by, async (admin) => [await buildUpdateConfig({ admin, update })], () => (changes.length === 0 ? ["Changes nothing: every setting already has the value given"] : changes), { update });
|
|
480
|
-
}
|
|
481
|
-
case "propose-admin": {
|
|
482
|
-
const { config } = await loadConfig(transport);
|
|
483
|
-
return administer(transport, runtime, command.by, async (admin) => [await buildProposeAdmin({ admin, pendingAdmin: command.pendingAdmin })], () => [
|
|
484
|
-
`Proposes ${command.pendingAdmin} as the next admin in place of ${config.admin}`,
|
|
485
|
-
"Nothing changes until that key accepts; a later proposal replaces this one",
|
|
486
|
-
]);
|
|
487
|
-
}
|
|
488
|
-
case "accept-admin": {
|
|
489
|
-
const { config } = await loadConfig(transport);
|
|
490
|
-
return administer(transport, runtime, command.by, async (pendingAdmin) => [await buildAcceptAdmin({ pendingAdmin })], (signer) => [`Makes ${signer} the admin in place of ${config.admin}`]);
|
|
491
|
-
}
|
|
174
|
+
case "update-config":
|
|
175
|
+
case "propose-admin":
|
|
176
|
+
case "accept-admin":
|
|
177
|
+
case "set-economics":
|
|
178
|
+
case "set-mint-cap":
|
|
179
|
+
case "set-caps-required":
|
|
180
|
+
return adminCommand(command, runtime, transport);
|
|
181
|
+
case "show-mint-cap":
|
|
182
|
+
return showMintCap(transport, command.mint);
|
|
492
183
|
case "advance-nonce": {
|
|
493
184
|
const owner = await runtime.loadSigner(command.keypair);
|
|
494
185
|
const ix = await buildAdvanceNonce({ owner, nonceBase: command.base });
|
|
@@ -496,83 +187,11 @@ export async function run(command, runtime) {
|
|
|
496
187
|
}
|
|
497
188
|
case "solve":
|
|
498
189
|
return tick(await solverOptions(command, runtime, transport));
|
|
499
|
-
case "
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
.join(", ");
|
|
505
|
-
return administer(transport, runtime, command.by, async (admin) => [await buildUpdateEconomics({ admin, economics: e })], () => [
|
|
506
|
-
`Crank bounty: ${config.crankBounty} -> ${e.crankBounty} lamports per intent`,
|
|
507
|
-
`Create fee: ${config.createFee} -> ${e.createFee} lamports per intent`,
|
|
508
|
-
`Partner cut: ${config.partnerCutBps} -> ${e.partnerCutBps} bps of each partner fee`,
|
|
509
|
-
`Kind fees: ${kindFees === "" ? "none; every kind pays the base fee" : kindFees}`,
|
|
510
|
-
]);
|
|
511
|
-
}
|
|
512
|
-
case "flow": {
|
|
513
|
-
const signer = await runtime.loadSigner(command.keypair);
|
|
514
|
-
const reading = memoized(transport);
|
|
515
|
-
const ctx = context(reading);
|
|
516
|
-
const raw = await rawFlowInput(reading, command.flow, command.input, signer.address);
|
|
517
|
-
switch (command.flow) {
|
|
518
|
-
case "create":
|
|
519
|
-
return perform(prepareCreate, ctx, { owner: signer.address, ...raw }, signer, command.yes);
|
|
520
|
-
case "mandate-grant":
|
|
521
|
-
return perform(prepareMandate, ctx, { owner: signer.address, ...raw }, signer, command.yes);
|
|
522
|
-
case "mandate-revoke":
|
|
523
|
-
return perform(prepareRevokeMandate, ctx, { owner: signer.address, ...raw }, signer, command.yes);
|
|
524
|
-
case "mandate-use":
|
|
525
|
-
return perform(prepareAgentCreate, ctx, { agent: signer.address, ...raw }, signer, command.yes);
|
|
526
|
-
case "approve":
|
|
527
|
-
case "revoke-approval": {
|
|
528
|
-
const input = raw;
|
|
529
|
-
return approval(transport, signer, input.mint, input.amount === undefined ? undefined : BigInt(input.amount), command.yes);
|
|
530
|
-
}
|
|
531
|
-
}
|
|
532
|
-
throw new FlowRefused(`unknown flow ${String(command.flow)}`);
|
|
533
|
-
}
|
|
534
|
-
case "lookup": {
|
|
535
|
-
const owner = command.input["owner"] ??
|
|
536
|
-
(command.keypair === undefined ? undefined : (await runtime.loadSigner(command.keypair)).address);
|
|
537
|
-
if (owner === undefined) {
|
|
538
|
-
throw new FlowRefused("name the owner with --owner or --keypair");
|
|
539
|
-
}
|
|
540
|
-
const action = command.lookup === "list" ? listIntents : getMandate;
|
|
541
|
-
return ask(action, context(transport), { ...command.input, owner });
|
|
542
|
-
}
|
|
543
|
-
case "signed-prepare": {
|
|
544
|
-
const owner = await runtime.loadSigner(command.keypair);
|
|
545
|
-
const input = await inRaw(transport, command.input, command.input["input_mint"], command.input["output_mint"]);
|
|
546
|
-
if (command.yes && (await runtime.readText(command.out).then(() => true, () => false))) {
|
|
547
|
-
throw new FlowRefused(`${command.out} already exists; choose another --out`);
|
|
548
|
-
}
|
|
549
|
-
const value = await ask(prepareSignedIntent, context(transport), { owner: owner.address, ...input });
|
|
550
|
-
if (!command.yes) {
|
|
551
|
-
return finish(transport, value, owner, false);
|
|
552
|
-
}
|
|
553
|
-
const signature = await signMessage(owner, value["message"]);
|
|
554
|
-
const shown = await finish(transport, value, owner, true);
|
|
555
|
-
await runtime.writeText(command.out, `${JSON.stringify({ version: SIGNED_FILE_VERSION, submit: value["submit"], signature }, null, 2)}\n`);
|
|
556
|
-
return { ...shown, saved: command.out };
|
|
557
|
-
}
|
|
558
|
-
case "signed-submit": {
|
|
559
|
-
const relayer = await runtime.loadSigner(command.keypair);
|
|
560
|
-
let saved;
|
|
561
|
-
try {
|
|
562
|
-
saved = JSON.parse(await runtime.readText(command.file));
|
|
563
|
-
}
|
|
564
|
-
catch {
|
|
565
|
-
throw new FlowRefused(`${command.file} is not a signed intent file`);
|
|
566
|
-
}
|
|
567
|
-
if (saved.version !== SIGNED_FILE_VERSION || saved.submit === undefined || typeof saved.signature !== "string") {
|
|
568
|
-
throw new FlowRefused(`${command.file} is not a signed intent file`);
|
|
569
|
-
}
|
|
570
|
-
const signed = { ...saved.submit, signature: saved.signature };
|
|
571
|
-
if (!command.yes) {
|
|
572
|
-
return { ...(await ask(previewSignedIntent, context(transport), signed)), sent: false, next: NOT_SENT };
|
|
573
|
-
}
|
|
574
|
-
return { ...(await ask(submitSignedIntent, context(transport, relayAnything(relayer, String(saved.submit["input_mint"]))), signed)), sent: true };
|
|
575
|
-
}
|
|
190
|
+
case "flow":
|
|
191
|
+
case "lookup":
|
|
192
|
+
case "signed-prepare":
|
|
193
|
+
case "signed-submit":
|
|
194
|
+
return flowCommand(command, runtime, transport);
|
|
576
195
|
case "advance-epoch": {
|
|
577
196
|
const owner = await runtime.loadSigner(command.keypair);
|
|
578
197
|
const [userState] = await findUserStatePda({ owner: owner.address });
|