@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
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { AccountRole, getAddressDecoder, getBase16Decoder } from "@solana/kit";
|
|
3
|
+
import { attestedFillMessage, attestedProofMessage, buildFillAttested, decodeParams, feeBpsFor, findIntentPda, formatAmount, getIntentDecoder, IntentStatus, Kind, NATIVE_MINT, releaseMemo, signEd25519Instruction, splitFees, settlementWarnings, } from "@intent-engine/core";
|
|
4
|
+
import { chainTime, deliveryRecord, firstDelivery, loadConfig, MEMO_PROGRAM_ADDRESS, mintOf, tokenAccountIfMissing } from "@intent-engine/client";
|
|
5
|
+
import { TOKEN_NAMES } from "../../tokens.js";
|
|
6
|
+
import { define } from "../actions.js";
|
|
7
|
+
import { WRAPPED } from "../create.js";
|
|
8
|
+
import { tool } from "../names.js";
|
|
9
|
+
import { AgentRefusal } from "../problems.js";
|
|
10
|
+
import { InvalidInput, account, amount, flag, integer, list, object, optional, text } from "../schema.js";
|
|
11
|
+
import { preparedView } from "../shapes.js";
|
|
12
|
+
import { walletRecipient } from "../owner.js";
|
|
13
|
+
import { prepare } from "../prepare.js";
|
|
14
|
+
import { STATUS } from "../../accounts.js";
|
|
15
|
+
import { signerOf, sent, sha256Of } from "./guard.js";
|
|
16
|
+
import { notEarliest, DELIVERED_NEEDED, ATTEST_PAGES, MAX_ATTEST_PAGES, MAX_PAGES_INPUT, HISTORY_TOO_LONG, notAttestor } from "./delivery.js";
|
|
17
|
+
export const PAYEE_MOVED = "this wallet's token account for the escrowed token now belongs to someone else, so a release would not reach it; ask the payee for another wallet";
|
|
18
|
+
export const RELEASE_CHANGED = "this release differs from its preview: the payee, amount, result, fee or the escrow itself changed, or no approval was given; preview it again and show the user";
|
|
19
|
+
export const approvalOf = (message, memo = "") => createHash("sha256").update(message).update(memo).digest("hex").slice(0, 16);
|
|
20
|
+
export const walletAttest = define({
|
|
21
|
+
name: tool("wallet_attest"),
|
|
22
|
+
title: "Release an escrow as its attestor",
|
|
23
|
+
description: `As the attestor an escrow names, sign that it pays pay_to and settle it on chain from this server's wallet: the escrowed tokens, minus the engine fee and any partner fee, go to pay_to's token account, which this creates if needed. Use it when this server's wallet was named attestor of an intent made with ${tool("wallet_escrow")} and the work it pays for is done. A release cannot be undone. Without send it only previews and signs nothing; show the user the summary and, once they approve, call again with send: true and the approval the preview returned, which holds the send to exactly what was previewed.`,
|
|
24
|
+
effect: "submit",
|
|
25
|
+
input: object({
|
|
26
|
+
owner: account("the wallet that made the escrow"),
|
|
27
|
+
nonce: amount("the escrow intent's nonce"),
|
|
28
|
+
pay_to: account("the wallet to pay"),
|
|
29
|
+
result: optional(amount("the result to attest, between the intent's min_result and max_result; default min_result")),
|
|
30
|
+
delivered_sha256: optional(text(`the sha256, as 64 hex digits, of the work this release pays for; required for a proof escrow, whose release pays that work's earliest announcer; recorded in a memo this wallet signs with the release, so the payer can check what it receives with ${tool("wallet_receipt")}`)),
|
|
31
|
+
max_pages: optional(integer(1, MAX_ATTEST_PAGES, MAX_PAGES_INPUT)),
|
|
32
|
+
approval: optional(text("the approval the preview returned; needed with send")),
|
|
33
|
+
send: optional(flag("true signs the attestation and settles; leave out to preview")),
|
|
34
|
+
}),
|
|
35
|
+
output: object({
|
|
36
|
+
intent: account(),
|
|
37
|
+
pay_to: account(),
|
|
38
|
+
payee: account("pay_to's token account that receives the escrow"),
|
|
39
|
+
paid: text("whole tokens pay_to receives"),
|
|
40
|
+
fee: text("whole tokens kept as fees"),
|
|
41
|
+
result: amount(),
|
|
42
|
+
approval: text("pass it back with send: true; a send that would differ from this preview is refused"),
|
|
43
|
+
delivered_sha256: optional(text("the sha256 the release records")),
|
|
44
|
+
summary: list(text(), 8),
|
|
45
|
+
warnings: list(text(), 8),
|
|
46
|
+
sent: flag(),
|
|
47
|
+
signature: optional(text()),
|
|
48
|
+
next: optional(text()),
|
|
49
|
+
}),
|
|
50
|
+
run: async (ctx, input, call) => {
|
|
51
|
+
const signer = await signerOf(ctx);
|
|
52
|
+
const [intent] = await findIntentPda({ owner: input.owner, nonce: input.nonce });
|
|
53
|
+
const [view, { config }] = await Promise.all([ctx.transport.getAccount(intent), loadConfig(ctx.transport)]);
|
|
54
|
+
if (view === null) {
|
|
55
|
+
throw new AgentRefusal("NotFound", `no intent ${intent}; it was settled, cancelled and closed, or never made`);
|
|
56
|
+
}
|
|
57
|
+
const held = getIntentDecoder().decode(view.data);
|
|
58
|
+
const params = decodeParams(held.kind, Uint8Array.from(held.params));
|
|
59
|
+
if (params.kind !== Kind.AttestedResult) {
|
|
60
|
+
throw new AgentRefusal("KindMismatch", "this intent is not an attested escrow");
|
|
61
|
+
}
|
|
62
|
+
if (params.attestor !== signer.address) {
|
|
63
|
+
throw new AgentRefusal("Unauthorized", notAttestor(params.attestor));
|
|
64
|
+
}
|
|
65
|
+
if (held.status !== IntentStatus.Open) {
|
|
66
|
+
throw new AgentRefusal("InvalidTransition", `this escrow is ${STATUS[held.status] ?? "not open"}, so it can no longer be released`);
|
|
67
|
+
}
|
|
68
|
+
if (held.expiresAt <= (await chainTime(ctx.transport))) {
|
|
69
|
+
throw new AgentRefusal("IntentExpired", "this escrow has expired; its owner gets it back instead");
|
|
70
|
+
}
|
|
71
|
+
const result = input.result ?? params.minResult;
|
|
72
|
+
if (result < params.minResult || result > params.maxResult) {
|
|
73
|
+
throw new InvalidInput([{ path: "result", message: `must be between ${params.minResult} and ${params.maxResult}` }]);
|
|
74
|
+
}
|
|
75
|
+
await walletRecipient(ctx.transport, input.pay_to, "pay_to");
|
|
76
|
+
const token = await mintOf(ctx.transport, held.inputMint);
|
|
77
|
+
const payee = await tokenAccountIfMissing(ctx.transport, signer, input.pay_to, held.inputMint, token.tokenProgram);
|
|
78
|
+
if (payee.create.length === 0) {
|
|
79
|
+
const existing = await ctx.transport.getAccount(payee.address);
|
|
80
|
+
const holder = existing === null || existing.data.length < 64 ? null : getAddressDecoder().decode(existing.data.subarray(32, 64));
|
|
81
|
+
if (holder !== input.pay_to) {
|
|
82
|
+
throw new InvalidInput([{ path: "pay_to", message: PAYEE_MOVED }]);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
const amountIn = held.escrowed - held.filled;
|
|
86
|
+
const isProof = params.specHash.some((b) => b !== 0);
|
|
87
|
+
const settleAmount = amountIn - params.judgeFee;
|
|
88
|
+
const maxFeeBps = feeBpsFor(config, held.kind) + held.partnerBps;
|
|
89
|
+
const shares = splitFees(settleAmount, feeBpsFor(config, held.kind), held.partnerBps, held.partnerCutBps);
|
|
90
|
+
const treasury = shares.protocol > 0n
|
|
91
|
+
? await tokenAccountIfMissing(ctx.transport, signer, config.feeRecipient, held.inputMint, token.tokenProgram)
|
|
92
|
+
: { create: [] };
|
|
93
|
+
const partnerPaid = shares.partner > 0n;
|
|
94
|
+
const partner = partnerPaid ? await tokenAccountIfMissing(ctx.transport, signer, held.partner, held.inputMint, token.tokenProgram) : { create: [] };
|
|
95
|
+
const judge = isProof && params.judgeFee > 0n
|
|
96
|
+
? await tokenAccountIfMissing(ctx.transport, signer, signer.address, held.inputMint, token.tokenProgram)
|
|
97
|
+
: { create: [] };
|
|
98
|
+
const attestFields = {
|
|
99
|
+
domain: Uint8Array.from(config.domain),
|
|
100
|
+
intent,
|
|
101
|
+
payee: payee.address,
|
|
102
|
+
amountIn,
|
|
103
|
+
result,
|
|
104
|
+
filled: held.filled,
|
|
105
|
+
revision: held.revision,
|
|
106
|
+
maxFeeBps,
|
|
107
|
+
};
|
|
108
|
+
const message = isProof
|
|
109
|
+
? await attestedProofMessage(signer.address, { ...attestFields, specHash: params.specHash })
|
|
110
|
+
: await attestedFillMessage(signer.address, attestFields);
|
|
111
|
+
const settle = await buildFillAttested({
|
|
112
|
+
solver: signer,
|
|
113
|
+
owner: input.owner,
|
|
114
|
+
nonce: input.nonce,
|
|
115
|
+
inputMint: held.inputMint,
|
|
116
|
+
inputTokenProgram: token.tokenProgram,
|
|
117
|
+
payee: payee.address,
|
|
118
|
+
...(shares.protocol > 0n ? { feeRecipient: config.feeRecipient } : {}),
|
|
119
|
+
...(partnerPaid ? { partner: held.partner } : {}),
|
|
120
|
+
...(isProof && params.judgeFee > 0n ? { judge: signer.address } : {}),
|
|
121
|
+
amountIn,
|
|
122
|
+
result,
|
|
123
|
+
maxFeeBps,
|
|
124
|
+
});
|
|
125
|
+
const name = TOKEN_NAMES[held.inputMint] ?? held.inputMint;
|
|
126
|
+
const paid = formatAmount(shares.net, token.decimals);
|
|
127
|
+
const setup = [...payee.create, ...treasury.create, ...partner.create, ...judge.create];
|
|
128
|
+
const delivered = input.delivered_sha256 === undefined ? undefined : sha256Of(input.delivered_sha256, "delivered_sha256");
|
|
129
|
+
if (isProof && delivered === undefined) {
|
|
130
|
+
throw new InvalidInput([{ path: "delivered_sha256", message: DELIVERED_NEEDED }]);
|
|
131
|
+
}
|
|
132
|
+
if (delivered !== undefined && isProof) {
|
|
133
|
+
const record = await deliveryRecord(ctx.transport, signer.address, intent, input.max_pages ?? ATTEST_PAGES);
|
|
134
|
+
if (!record.complete) {
|
|
135
|
+
throw new AgentRefusal("HistoryTooLong", HISTORY_TOO_LONG);
|
|
136
|
+
}
|
|
137
|
+
const first = firstDelivery(record.deliveries, delivered);
|
|
138
|
+
if (first !== null && first.worker !== input.pay_to) {
|
|
139
|
+
throw new AgentRefusal("NotEarliestAnnouncer", notEarliest(first.worker, delivered));
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
const memoText = delivered === undefined ? "" : releaseMemo(delivered);
|
|
143
|
+
const memo = delivered === undefined
|
|
144
|
+
? []
|
|
145
|
+
: [{ programAddress: MEMO_PROGRAM_ADDRESS, accounts: [{ address: signer.address, role: AccountRole.READONLY_SIGNER, signer }], data: new TextEncoder().encode(memoText) }];
|
|
146
|
+
const approval = approvalOf(message, memoText);
|
|
147
|
+
if (input.send === true && input.approval !== approval) {
|
|
148
|
+
throw new AgentRefusal("ReleaseChanged", RELEASE_CHANGED);
|
|
149
|
+
}
|
|
150
|
+
const prepared = input.send === true
|
|
151
|
+
? preparedView(await prepare(ctx.transport, [...setup, await signEd25519Instruction(signer, message), settle, ...memo], signer.address))
|
|
152
|
+
: undefined;
|
|
153
|
+
const view2 = {
|
|
154
|
+
intent,
|
|
155
|
+
pay_to: input.pay_to,
|
|
156
|
+
payee: payee.address,
|
|
157
|
+
paid,
|
|
158
|
+
fee: formatAmount(shares.protocol + shares.partner, token.decimals),
|
|
159
|
+
result,
|
|
160
|
+
approval,
|
|
161
|
+
...(delivered === undefined ? {} : { delivered_sha256: delivered }),
|
|
162
|
+
summary: [
|
|
163
|
+
`Pays: ${paid} of ${name} to ${input.pay_to} from ${input.owner}'s escrow${held.inputMint === NATIVE_MINT ? WRAPPED : ""}`,
|
|
164
|
+
...(isProof && params.judgeFee > 0n ? [`Pays the judge: ${formatAmount(params.judgeFee, token.decimals)} of ${name} to this wallet, carved out of the escrow`] : []),
|
|
165
|
+
...(isProof ? [`Binds: the result to the committed spec ${getBase16Decoder().decode(params.specHash)}`] : []),
|
|
166
|
+
`Attests: result ${result}, signed by this server's wallet as the escrow's attestor`,
|
|
167
|
+
...(delivered === undefined ? [] : [`Records: the delivered work's sha256 ${delivered}, in a memo this wallet signs with the release`]),
|
|
168
|
+
...(payee.create.length === 0 ? [] : [`Setup: creates ${input.pay_to}'s ${name} account, paid by this wallet`]),
|
|
169
|
+
...(treasury.create.length === 0 ? [] : [`Setup: creates the engine treasury's ${name} account for the fee, paid by this wallet`]),
|
|
170
|
+
...(partner.create.length === 0 ? [] : [`Setup: creates the partner ${held.partner}'s ${name} account for its fee, paid by this wallet`]),
|
|
171
|
+
],
|
|
172
|
+
warnings: settlementWarnings(params),
|
|
173
|
+
prepared,
|
|
174
|
+
};
|
|
175
|
+
return sent(ctx, signer, view2, input.send, call);
|
|
176
|
+
},
|
|
177
|
+
});
|
|
178
|
+
//# sourceMappingURL=attest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attest.js","sourceRoot":"","sources":["../../../../src/agent/wallet/attest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/E,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,iBAAiB,EACjB,YAAY,EACZ,SAAS,EACT,aAAa,EACb,YAAY,EACZ,gBAAgB,EAChB,YAAY,EACZ,IAAI,EACJ,WAAW,EACX,WAAW,EACX,sBAAsB,EACtB,SAAS,EACT,kBAAkB,GACnB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,aAAa,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAClJ,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAqB,MAAM,EAAE,MAAM,eAAe,CAAC;AAE1D,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACnC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAC1G,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE9I,MAAM,CAAC,MAAM,WAAW,GAAG,mJAAmJ,CAAC;AAE/K,MAAM,CAAC,MAAM,eAAe,GAAG,kKAAkK,CAAC;AAElM,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,OAAmB,EAAE,IAAI,GAAG,EAAE,EAAU,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAEnJ,MAAM,CAAC,MAAM,YAAY,GAAG,MAAM,CAAC;IACjC,IAAI,EAAE,IAAI,CAAC,eAAe,CAAC;IAC3B,KAAK,EAAE,mCAAmC;IAC1C,WAAW,EAAE,qTAAqT,IAAI,CAAC,eAAe,CAAC,yRAAyR;IAChnB,MAAM,EAAE,QAAQ;IAChB,KAAK,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE,OAAO,CAAC,iCAAiC,CAAC;QACjD,KAAK,EAAE,MAAM,CAAC,2BAA2B,CAAC;QAC1C,MAAM,EAAE,OAAO,CAAC,mBAAmB,CAAC;QACpC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,0FAA0F,CAAC,CAAC;QACpH,gBAAgB,EAAE,QAAQ,CAAC,IAAI,CAAC,wPAAwP,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;QAClT,SAAS,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,gBAAgB,EAAE,eAAe,CAAC,CAAC;QAClE,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;QAC/E,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,8DAA8D,CAAC,CAAC;KACrF,CAAC;IACF,MAAM,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,OAAO,EAAE;QACjB,MAAM,EAAE,OAAO,EAAE;QACjB,KAAK,EAAE,OAAO,CAAC,iDAAiD,CAAC;QACjE,IAAI,EAAE,IAAI,CAAC,8BAA8B,CAAC;QAC1C,GAAG,EAAE,IAAI,CAAC,2BAA2B,CAAC;QACtC,MAAM,EAAE,MAAM,EAAE;QAChB,QAAQ,EAAE,IAAI,CAAC,qFAAqF,CAAC;QACrG,gBAAgB,EAAE,QAAQ,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;QAClE,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACxB,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACzB,IAAI,EAAE,IAAI,EAAE;QACZ,SAAS,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC;QAC3B,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC;KACvB,CAAC;IACF,GAAG,EAAE,KAAK,EAAE,GAAiB,EAAE,KAAK,EAAE,IAAU,EAAE,EAAE;QAClD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,aAAa,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;QACjF,MAAM,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QAC5G,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAClB,MAAM,IAAI,YAAY,CAAC,UAAU,EAAE,aAAa,MAAM,uDAAuD,CAAC,CAAC;QACjH,CAAC;QACD,MAAM,IAAI,GAAG,gBAAgB,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QACrE,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI,CAAC,cAAc,EAAE,CAAC;YACxC,MAAM,IAAI,YAAY,CAAC,cAAc,EAAE,uCAAuC,CAAC,CAAC;QAClF,CAAC;QACD,IAAI,MAAM,CAAC,QAAQ,KAAK,MAAM,CAAC,OAAO,EAAE,CAAC;YACvC,MAAM,IAAI,YAAY,CAAC,cAAc,EAAE,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;QACvE,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,KAAK,YAAY,CAAC,IAAI,EAAE,CAAC;YACtC,MAAM,IAAI,YAAY,CAAC,mBAAmB,EAAE,kBAAkB,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,UAAU,mCAAmC,CAAC,CAAC;QACtI,CAAC;QACD,IAAI,IAAI,CAAC,SAAS,IAAI,CAAC,MAAM,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;YACvD,MAAM,IAAI,YAAY,CAAC,eAAe,EAAE,yDAAyD,CAAC,CAAC;QACrG,CAAC;QACD,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,MAAM,CAAC,SAAS,CAAC;QAChD,IAAI,MAAM,GAAG,MAAM,CAAC,SAAS,IAAI,MAAM,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;YAC3D,MAAM,IAAI,YAAY,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,mBAAmB,MAAM,CAAC,SAAS,QAAQ,MAAM,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC;QACvH,CAAC;QACD,MAAM,eAAe,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC7D,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QAC1D,MAAM,KAAK,GAAG,MAAM,qBAAqB,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;QACnH,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9B,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC/D,MAAM,MAAM,GAAG,QAAQ,KAAK,IAAI,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,iBAAiB,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;YAClI,IAAI,MAAM,KAAK,KAAK,CAAC,MAAM,EAAE,CAAC;gBAC5B,MAAM,IAAI,YAAY,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;YACrE,CAAC;QACH,CAAC;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC;QAC7C,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;QACrD,MAAM,YAAY,GAAG,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;QAChD,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC;QACjE,MAAM,MAAM,GAAG,SAAS,CAAC,YAAY,EAAE,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QAC1G,MAAM,QAAQ,GACZ,MAAM,CAAC,QAAQ,GAAG,EAAE;YAClB,CAAC,CAAC,MAAM,qBAAqB,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,YAAY,CAAC;YAC7G,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;QACrB,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,GAAG,EAAE,CAAC;QACxC,MAAM,OAAO,GACX,WAAW,CAAC,CAAC,CAAC,MAAM,qBAAqB,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;QACtI,MAAM,KAAK,GACT,OAAO,IAAI,MAAM,CAAC,QAAQ,GAAG,EAAE;YAC7B,CAAC,CAAC,MAAM,qBAAqB,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,YAAY,CAAC;YACxG,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;QACrB,MAAM,YAAY,GAAG;YACnB,MAAM,EAAE,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;YACtC,MAAM;YACN,KAAK,EAAE,KAAK,CAAC,OAAO;YACpB,QAAQ;YACR,MAAM;YACN,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,SAAS;SACV,CAAC;QACF,MAAM,OAAO,GAAG,OAAO;YACrB,CAAC,CAAC,MAAM,oBAAoB,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,GAAG,YAAY,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC;YAC5F,CAAC,CAAC,MAAM,mBAAmB,CAAC,MAAM,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QAC5D,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC;YACrC,MAAM,EAAE,MAAM;YACd,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,iBAAiB,EAAE,KAAK,CAAC,YAAY;YACrC,KAAK,EAAE,KAAK,CAAC,OAAO;YACpB,GAAG,CAAC,MAAM,CAAC,QAAQ,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACtE,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACjD,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC,QAAQ,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACrE,QAAQ;YACR,MAAM;YACN,SAAS;SACV,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC;QAC3D,MAAM,IAAI,GAAG,YAAY,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;QACtD,MAAM,KAAK,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,GAAG,QAAQ,CAAC,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;QACxF,MAAM,SAAS,GAAG,KAAK,CAAC,gBAAgB,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,gBAAgB,EAAE,kBAAkB,CAAC,CAAC;QAC1H,IAAI,OAAO,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YACvC,MAAM,IAAI,YAAY,CAAC,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC;QACpF,CAAC;QACD,IAAI,SAAS,KAAK,SAAS,IAAI,OAAO,EAAE,CAAC;YACvC,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,SAAS,IAAI,YAAY,CAAC,CAAC;YAC5G,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;gBACrB,MAAM,IAAI,YAAY,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,CAAC;YAC7D,CAAC;YACD,MAAM,KAAK,GAAG,aAAa,CAAC,MAAM,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;YAC1D,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,EAAE,CAAC;gBACpD,MAAM,IAAI,YAAY,CAAC,sBAAsB,EAAE,WAAW,CAAC,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;YACvF,CAAC;QACH,CAAC;QACD,MAAM,QAAQ,GAAG,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;QACvE,MAAM,IAAI,GACR,SAAS,KAAK,SAAS;YACrB,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,oBAAoB,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,IAAI,EAAE,WAAW,CAAC,eAAe,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC/K,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAC/C,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,IAAI,KAAK,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YACvD,MAAM,IAAI,YAAY,CAAC,gBAAgB,EAAE,eAAe,CAAC,CAAC;QAC5D,CAAC;QACD,MAAM,QAAQ,GACZ,KAAK,CAAC,IAAI,KAAK,IAAI;YACjB,CAAC,CAAC,YAAY,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,GAAG,KAAK,EAAE,MAAM,sBAAsB,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;YACxI,CAAC,CAAC,SAAS,CAAC;QAChB,MAAM,KAAK,GAAG;YACZ,MAAM;YACN,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,KAAK,EAAE,KAAK,CAAC,OAAO;YACpB,IAAI;YACJ,GAAG,EAAE,YAAY,CAAC,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,QAAQ,CAAC;YACnE,MAAM;YACN,QAAQ;YACR,GAAG,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,SAAS,EAAE,CAAC;YACnE,OAAO,EAAE;gBACP,SAAS,IAAI,OAAO,IAAI,OAAO,KAAK,CAAC,MAAM,SAAS,KAAK,CAAC,KAAK,YAAY,IAAI,CAAC,SAAS,KAAK,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;gBAC1H,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC,QAAQ,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,mBAAmB,YAAY,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,OAAO,IAAI,2CAA2C,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACpK,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,2CAA2C,gBAAgB,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC7G,mBAAmB,MAAM,2DAA2D;gBACpF,GAAG,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,wCAAwC,SAAS,gDAAgD,CAAC,CAAC;gBACvI,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,kBAAkB,KAAK,CAAC,MAAM,MAAM,IAAI,+BAA+B,CAAC,CAAC;gBAC/G,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,wCAAwC,IAAI,2CAA2C,CAAC,CAAC;gBAClI,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,8BAA8B,IAAI,CAAC,OAAO,MAAM,IAAI,2CAA2C,CAAC,CAAC;aAC1I;YACD,QAAQ,EAAE,kBAAkB,CAAC,MAAM,CAAC;YACpC,QAAQ;SACT,CAAC;QACF,OAAO,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACpD,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export declare const VOTE_CHANGED = "this vote differs from its preview: the escrow, payee, result or delivered work changed, or no approval was given; preview it again and show the user";
|
|
2
|
+
export declare const NOT_A_MEMBER = "this server's wallet is not a member of the committee this escrow names, so it has no vote";
|
|
3
|
+
export declare const walletCommitteeVote: import("../actions.js").AnyAction;
|
|
4
|
+
export declare const walletCommitteeRelease: import("../actions.js").AnyAction;
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { getBase16Decoder } from "@solana/kit";
|
|
3
|
+
import { releaseMemo, signCommitteeVote } from "@intent-engine/core";
|
|
4
|
+
import { createClient, deliveryRecord, firstDelivery, NotSettleable, VoteRejected } from "@intent-engine/client";
|
|
5
|
+
import { define } from "../actions.js";
|
|
6
|
+
import { tool } from "../names.js";
|
|
7
|
+
import { AgentRefusal } from "../problems.js";
|
|
8
|
+
import { InvalidInput, account, amount, flag, integer, list, object, optional, text } from "../schema.js";
|
|
9
|
+
import { preparedView } from "../shapes.js";
|
|
10
|
+
import { prepare } from "../prepare.js";
|
|
11
|
+
import { signerOf, sent, sha256Of } from "./guard.js";
|
|
12
|
+
import { ATTEST_PAGES, DELIVERED_NEEDED, HISTORY_TOO_LONG, MAX_ATTEST_PAGES, MAX_PAGES_INPUT, notEarliest } from "./delivery.js";
|
|
13
|
+
import { RELEASE_CHANGED } from "./attest.js";
|
|
14
|
+
export const VOTE_CHANGED = "this vote differs from its preview: the escrow, payee, result or delivered work changed, or no approval was given; preview it again and show the user";
|
|
15
|
+
export const NOT_A_MEMBER = "this server's wallet is not a member of the committee this escrow names, so it has no vote";
|
|
16
|
+
const hex = (bytes) => getBase16Decoder().decode(bytes).toLowerCase();
|
|
17
|
+
const ballotInput = {
|
|
18
|
+
owner: account("the wallet that made the escrow"),
|
|
19
|
+
nonce: amount("the escrow intent's nonce"),
|
|
20
|
+
pay_to: account("the wallet the release pays"),
|
|
21
|
+
result: amount("the result the release attests, between the intent's min_result and max_result"),
|
|
22
|
+
delivered_sha256: text("the sha256, as 64 hex digits, of the work the release pays for; its earliest announcer must be pay_to"),
|
|
23
|
+
max_pages: optional(integer(1, MAX_ATTEST_PAGES, MAX_PAGES_INPUT)),
|
|
24
|
+
};
|
|
25
|
+
async function ballotOf(ctx, input) {
|
|
26
|
+
const client = createClient({ url: ctx.url ?? "", transport: ctx.transport });
|
|
27
|
+
const target = { owner: input.owner, nonce: input.nonce, payTo: input.pay_to, result: input.result };
|
|
28
|
+
let ballot;
|
|
29
|
+
try {
|
|
30
|
+
ballot = await client.committeeBallot(target);
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
if (error instanceof NotSettleable) {
|
|
34
|
+
throw new AgentRefusal("KindMismatch", error.message);
|
|
35
|
+
}
|
|
36
|
+
throw error;
|
|
37
|
+
}
|
|
38
|
+
const delivered = sha256Of(input.delivered_sha256, "delivered_sha256");
|
|
39
|
+
const record = await deliveryRecord(ctx.transport, ballot.committee.address, ballot.intent, input.max_pages ?? ATTEST_PAGES);
|
|
40
|
+
if (!record.complete) {
|
|
41
|
+
throw new AgentRefusal("HistoryTooLong", HISTORY_TOO_LONG);
|
|
42
|
+
}
|
|
43
|
+
const first = firstDelivery(record.deliveries, delivered);
|
|
44
|
+
if (first !== null && first.worker !== input.pay_to) {
|
|
45
|
+
throw new AgentRefusal("NotEarliestAnnouncer", notEarliest(first.worker, delivered));
|
|
46
|
+
}
|
|
47
|
+
return { client, target, ballot, delivered };
|
|
48
|
+
}
|
|
49
|
+
const ballotApproval = (ballot, delivered) => createHash("sha256").update(ballot.digest).update(releaseMemo(delivered)).digest("hex").slice(0, 16);
|
|
50
|
+
const ballotLines = (ballot, input, delivered) => [
|
|
51
|
+
`Releases: escrow ${ballot.intent} to ${input.pay_to} with result ${input.result}`,
|
|
52
|
+
`Pays for: the work with sha256 ${delivered}`,
|
|
53
|
+
`Judged by: committee ${ballot.committee.address}, any ${ballot.committee.threshold} of its ${ballot.committee.members.length} members`,
|
|
54
|
+
];
|
|
55
|
+
export const walletCommitteeVote = define({
|
|
56
|
+
name: tool("wallet_committee_vote"),
|
|
57
|
+
title: "Vote on a release as a committee member",
|
|
58
|
+
description: `As one member of the committee an escrow names, sign this server's vote that the escrow pays pay_to for the work with delivered_sha256. Nothing is sent: the release needs votes from the committee's threshold of members, which anyone then submits with ${tool("wallet_committee_release")}. Vote only after judging the work against the escrow's spec yourself. Without send it only previews and signs nothing; show the user the summary and, once they approve, call again with send: true and the approval the preview returned.`,
|
|
59
|
+
effect: "submit",
|
|
60
|
+
input: object({
|
|
61
|
+
...ballotInput,
|
|
62
|
+
approval: optional(text("the approval the preview returned; needed with send")),
|
|
63
|
+
send: optional(flag("true signs the vote; leave out to preview")),
|
|
64
|
+
}),
|
|
65
|
+
output: object({
|
|
66
|
+
intent: account(),
|
|
67
|
+
committee: account(),
|
|
68
|
+
approval: text(),
|
|
69
|
+
summary: list(text(), 8),
|
|
70
|
+
signed: flag(),
|
|
71
|
+
vote: optional(object({ member: account(), signature: text("the member's ed25519 signature as 128 hex digits") })),
|
|
72
|
+
next: optional(text()),
|
|
73
|
+
}),
|
|
74
|
+
run: async (ctx, input) => {
|
|
75
|
+
const signer = await signerOf(ctx);
|
|
76
|
+
const { ballot, delivered } = await ballotOf(ctx, input);
|
|
77
|
+
if (!ballot.committee.members.includes(signer.address)) {
|
|
78
|
+
throw new AgentRefusal("Unauthorized", NOT_A_MEMBER);
|
|
79
|
+
}
|
|
80
|
+
const approval = ballotApproval(ballot, delivered);
|
|
81
|
+
const shown = { intent: ballot.intent, committee: ballot.committee.address, approval, summary: ballotLines(ballot, input, delivered) };
|
|
82
|
+
if (input.send !== true) {
|
|
83
|
+
return { ...shown, signed: false, next: `call again with send: true and this approval to sign the vote, then pass it to ${tool("wallet_committee_release")}` };
|
|
84
|
+
}
|
|
85
|
+
if (input.approval !== approval) {
|
|
86
|
+
throw new AgentRefusal("ReleaseChanged", VOTE_CHANGED);
|
|
87
|
+
}
|
|
88
|
+
const vote = await signCommitteeVote(signer, ballot.digest);
|
|
89
|
+
return { ...shown, signed: true, vote: { member: vote.member, signature: hex(vote.signature) } };
|
|
90
|
+
},
|
|
91
|
+
});
|
|
92
|
+
export const walletCommitteeRelease = define({
|
|
93
|
+
name: tool("wallet_committee_release"),
|
|
94
|
+
title: "Release an escrow on its committee's votes",
|
|
95
|
+
description: `Submit the votes of a committee's members, gathered with ${tool("wallet_committee_vote")}, to release the escrow that names the committee; this server's wallet pays the fee and records the delivered work's sha256. Every vote is checked before anything is sent, and the release needs at least the committee's threshold of them. Without send it only previews; show the user the summary and, once they approve, call again with send: true and the approval the preview returned.`,
|
|
96
|
+
effect: "submit",
|
|
97
|
+
input: object({
|
|
98
|
+
...ballotInput,
|
|
99
|
+
votes: list(object({ member: account(), signature: text("the member's ed25519 signature as 128 hex digits") }), 8, "one vote per member, in any order", 1),
|
|
100
|
+
approval: optional(text("the approval the preview returned; needed with send")),
|
|
101
|
+
send: optional(flag("true submits the release; leave out to preview")),
|
|
102
|
+
}),
|
|
103
|
+
output: object({
|
|
104
|
+
intent: account(),
|
|
105
|
+
committee: account(),
|
|
106
|
+
signers: list(account(), 8),
|
|
107
|
+
approval: text(),
|
|
108
|
+
summary: list(text(), 8),
|
|
109
|
+
sent: flag(),
|
|
110
|
+
signature: optional(text()),
|
|
111
|
+
next: optional(text()),
|
|
112
|
+
}),
|
|
113
|
+
run: async (ctx, input, call) => {
|
|
114
|
+
const signer = await signerOf(ctx);
|
|
115
|
+
const { client, target, ballot, delivered } = await ballotOf(ctx, input);
|
|
116
|
+
const votes = input.votes.map((vote, i) => {
|
|
117
|
+
if (!/^[0-9a-fA-F]{128}$/.test(vote.signature)) {
|
|
118
|
+
throw new InvalidInput([{ path: `votes.${i}.signature`, message: "give the signature as 128 hex digits" }]);
|
|
119
|
+
}
|
|
120
|
+
return { member: vote.member, signature: Uint8Array.from(Buffer.from(vote.signature, "hex")) };
|
|
121
|
+
});
|
|
122
|
+
let release;
|
|
123
|
+
try {
|
|
124
|
+
release = await client.prepareCommitteeRelease({ ...target, solver: signer, votes, deliveredSha256: delivered });
|
|
125
|
+
}
|
|
126
|
+
catch (error) {
|
|
127
|
+
if (error instanceof VoteRejected) {
|
|
128
|
+
throw new AgentRefusal("SigMessage", error.message);
|
|
129
|
+
}
|
|
130
|
+
throw error;
|
|
131
|
+
}
|
|
132
|
+
const approval = ballotApproval(ballot, delivered);
|
|
133
|
+
if (input.send === true && input.approval !== approval) {
|
|
134
|
+
throw new AgentRefusal("ReleaseChanged", RELEASE_CHANGED);
|
|
135
|
+
}
|
|
136
|
+
if (input.send === true && release.setup.length > 0) {
|
|
137
|
+
await ctx.transport.send(release.setup, signer);
|
|
138
|
+
}
|
|
139
|
+
const prepared = input.send === true ? preparedView(await prepare(ctx.transport, release.instructions, signer.address)) : undefined;
|
|
140
|
+
const view = {
|
|
141
|
+
intent: release.intent,
|
|
142
|
+
committee: release.committee.address,
|
|
143
|
+
signers: release.signers,
|
|
144
|
+
approval,
|
|
145
|
+
summary: [
|
|
146
|
+
...ballotLines(ballot, input, delivered),
|
|
147
|
+
`Signed by: ${release.signers.length} of its members, ${release.signers.join(", ")}`,
|
|
148
|
+
`Pays the fee: this server's wallet ${signer.address}`,
|
|
149
|
+
],
|
|
150
|
+
prepared,
|
|
151
|
+
};
|
|
152
|
+
return sent(ctx, signer, view, input.send, call);
|
|
153
|
+
},
|
|
154
|
+
});
|
|
155
|
+
//# sourceMappingURL=committee.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"committee.js","sourceRoot":"","sources":["../../../../src/agent/wallet/committee.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAgB,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACrE,OAAO,EAAwB,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACvI,OAAO,EAAqB,MAAM,EAAE,MAAM,eAAe,CAAC;AAE1D,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACnC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAC1G,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjI,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,MAAM,CAAC,MAAM,YAAY,GAAG,uJAAuJ,CAAC;AAEpL,MAAM,CAAC,MAAM,YAAY,GAAG,4FAA4F,CAAC;AAEzH,MAAM,GAAG,GAAG,CAAC,KAAiB,EAAE,EAAE,CAAC,gBAAgB,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;AAElF,MAAM,WAAW,GAAG;IAClB,KAAK,EAAE,OAAO,CAAC,iCAAiC,CAAC;IACjD,KAAK,EAAE,MAAM,CAAC,2BAA2B,CAAC;IAC1C,MAAM,EAAE,OAAO,CAAC,6BAA6B,CAAC;IAC9C,MAAM,EAAE,MAAM,CAAC,gFAAgF,CAAC;IAChG,gBAAgB,EAAE,IAAI,CAAC,uGAAuG,CAAC;IAC/H,SAAS,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,gBAAgB,EAAE,eAAe,CAAC,CAAC;CACnE,CAAC;AAIF,KAAK,UAAU,QAAQ,CAAC,GAAiB,EAAE,KAAiB;IAC1D,MAAM,MAAM,GAAG,YAAY,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,IAAI,EAAE,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC;IAC9E,MAAM,MAAM,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;IACrG,IAAI,MAAuB,CAAC;IAC5B,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;IAChD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,aAAa,EAAE,CAAC;YACnC,MAAM,IAAI,YAAY,CAAC,cAAc,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QACxD,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;IACD,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,gBAAgB,EAAE,kBAAkB,CAAC,CAAC;IACvE,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,IAAI,YAAY,CAAC,CAAC;IAC7H,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;QACrB,MAAM,IAAI,YAAY,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,CAAC;IAC7D,CAAC;IACD,MAAM,KAAK,GAAG,aAAa,CAAC,MAAM,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;IAC1D,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,EAAE,CAAC;QACpD,MAAM,IAAI,YAAY,CAAC,sBAAsB,EAAE,WAAW,CAAC,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;IACvF,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;AAC/C,CAAC;AAED,MAAM,cAAc,GAAG,CAAC,MAAuB,EAAE,SAAiB,EAAE,EAAE,CACpE,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAEvG,MAAM,WAAW,GAAG,CAAC,MAAuB,EAAE,KAAiB,EAAE,SAAiB,EAAE,EAAE,CAAC;IACrF,oBAAoB,MAAM,CAAC,MAAM,OAAO,KAAK,CAAC,MAAM,gBAAgB,KAAK,CAAC,MAAM,EAAE;IAClF,kCAAkC,SAAS,EAAE;IAC7C,wBAAwB,MAAM,CAAC,SAAS,CAAC,OAAO,SAAS,MAAM,CAAC,SAAS,CAAC,SAAS,WAAW,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,UAAU;CACxI,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG,MAAM,CAAC;IACxC,IAAI,EAAE,IAAI,CAAC,uBAAuB,CAAC;IACnC,KAAK,EAAE,yCAAyC;IAChD,WAAW,EAAE,8PAA8P,IAAI,CAAC,0BAA0B,CAAC,6OAA6O;IACxhB,MAAM,EAAE,QAAQ;IAChB,KAAK,EAAE,MAAM,CAAC;QACZ,GAAG,WAAW;QACd,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;QAC/E,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC;KAClE,CAAC;IACF,MAAM,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,OAAO,EAAE;QACjB,SAAS,EAAE,OAAO,EAAE;QACpB,QAAQ,EAAE,IAAI,EAAE;QAChB,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACxB,MAAM,EAAE,IAAI,EAAE;QACd,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,kDAAkD,CAAC,EAAE,CAAC,CAAC;QAClH,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC;KACvB,CAAC;IACF,GAAG,EAAE,KAAK,EAAE,GAAiB,EAAE,KAAK,EAAE,EAAE;QACtC,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,CAAC;QACnC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACzD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;YACvD,MAAM,IAAI,YAAY,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;QACvD,CAAC;QACD,MAAM,QAAQ,GAAG,cAAc,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QACnD,MAAM,KAAK,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,CAAC,EAAE,CAAC;QACvI,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;YACxB,OAAO,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,kFAAkF,IAAI,CAAC,0BAA0B,CAAC,EAAE,EAAE,CAAC;QACjK,CAAC;QACD,IAAI,KAAK,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAChC,MAAM,IAAI,YAAY,CAAC,gBAAgB,EAAE,YAAY,CAAC,CAAC;QACzD,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QAC5D,OAAO,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC;IACnG,CAAC;CACF,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,sBAAsB,GAAG,MAAM,CAAC;IAC3C,IAAI,EAAE,IAAI,CAAC,0BAA0B,CAAC;IACtC,KAAK,EAAE,4CAA4C;IACnD,WAAW,EAAE,4DAA4D,IAAI,CAAC,uBAAuB,CAAC,kYAAkY;IACxe,MAAM,EAAE,QAAQ;IAChB,KAAK,EAAE,MAAM,CAAC;QACZ,GAAG,WAAW;QACd,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,kDAAkD,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,mCAAmC,EAAE,CAAC,CAAC;QAC1J,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;QAC/E,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;KACvE,CAAC;IACF,MAAM,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,OAAO,EAAE;QACjB,SAAS,EAAE,OAAO,EAAE;QACpB,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAC3B,QAAQ,EAAE,IAAI,EAAE;QAChB,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACxB,IAAI,EAAE,IAAI,EAAE;QACZ,SAAS,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC;QAC3B,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC;KACvB,CAAC;IACF,GAAG,EAAE,KAAK,EAAE,GAAiB,EAAE,KAAK,EAAE,IAAU,EAAE,EAAE;QAClD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,CAAC;QACnC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACzE,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;YACxC,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC/C,MAAM,IAAI,YAAY,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,YAAY,EAAE,OAAO,EAAE,sCAAsC,EAAE,CAAC,CAAC,CAAC;YAC9G,CAAC;YACD,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC;QACjG,CAAC,CAAC,CAAC;QACH,IAAI,OAAO,CAAC;QACZ,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,CAAC,CAAC;QACnH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,YAAY,EAAE,CAAC;gBAClC,MAAM,IAAI,YAAY,CAAC,YAAY,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;YACtD,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;QACD,MAAM,QAAQ,GAAG,cAAc,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QACnD,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,IAAI,KAAK,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YACvD,MAAM,IAAI,YAAY,CAAC,gBAAgB,EAAE,eAAe,CAAC,CAAC;QAC5D,CAAC;QACD,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpD,MAAM,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAClD,CAAC;QACD,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,YAAY,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACpI,MAAM,IAAI,GAAG;YACX,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,SAAS,EAAE,OAAO,CAAC,SAAS,CAAC,OAAO;YACpC,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,QAAQ;YACR,OAAO,EAAE;gBACP,GAAG,WAAW,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,CAAC;gBACxC,cAAc,OAAO,CAAC,OAAO,CAAC,MAAM,oBAAoB,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;gBACpF,sCAAsC,MAAM,CAAC,OAAO,EAAE;aACvD;YACD,QAAQ;SACT,CAAC;QACF,OAAO,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACnD,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare const walletDeliver: import("../actions.js").AnyAction;
|
|
2
|
+
export declare const notEarliest: (worker: string, sha256: string) => string;
|
|
3
|
+
export declare const notInSplit: (worker: string, sha256: string) => string;
|
|
4
|
+
export declare const DELIVERY_LIST: number;
|
|
5
|
+
export declare const DELIVERED_NEEDED = "a proof escrow pays the earliest announcer of the work it releases for, so give that work's sha256";
|
|
6
|
+
export declare const ATTEST_PAGES = 1000;
|
|
7
|
+
export declare const MAX_ATTEST_PAGES = 100000;
|
|
8
|
+
export declare const MAX_PAGES_INPUT = "pages of 1000 signatures of this wallet's history to read for announced work, listing every signature but fetching only announcements; default 1000; raise it when the release is refused because the record of announced work is incomplete";
|
|
9
|
+
export declare const HISTORY_TOO_LONG: string;
|
|
10
|
+
export declare const walletCheckDelivery: import("../actions.js").AnyAction;
|
|
11
|
+
export declare const checkDelivery: import("../actions.js").AnyAction;
|
|
12
|
+
export declare const prepareDeliver: import("../actions.js").AnyAction;
|
|
13
|
+
export declare const notAttestor: (attestor: string) => string;
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import { createNoopSigner, getBase16Decoder } from "@solana/kit";
|
|
2
|
+
import { decodeParams, getIntentDecoder, getIntentDiscriminatorBytes, getIntentSize, isMemoUrl, MEMO_URL_RULE, INTENT_ENGINE_PROGRAM_ADDRESS, IntentStatus, Kind, } from "@intent-engine/core";
|
|
3
|
+
import { announcements, chainTime, DELIVERY_PAGES, deliveryRecord, deliveryInstructions, MEMOS_PER_TRANSACTION, SIGNATURE_PAGE, } from "@intent-engine/client";
|
|
4
|
+
import { define } from "../actions.js";
|
|
5
|
+
import { tool } from "../names.js";
|
|
6
|
+
import { AgentRefusal } from "../problems.js";
|
|
7
|
+
import { InvalidInput, account, amount, flag, integer, list, object, optional, text } from "../schema.js";
|
|
8
|
+
import { preparedSchema, preparedView } from "../shapes.js";
|
|
9
|
+
import { prepare } from "../prepare.js";
|
|
10
|
+
import { signerOf, sent, sha256Of } from "./guard.js";
|
|
11
|
+
export const walletDeliver = define({
|
|
12
|
+
name: tool("wallet_deliver"),
|
|
13
|
+
title: "Announce delivered work to a judge",
|
|
14
|
+
description: `As a worker, tell the attestor of a proof escrow, such as one found with ${tool("find_jobs")}, that the work is done: this server's wallet sends one transaction with a memo naming the escrow, the work's sha256 and the url the attestor fetches it from, and a transfer of 0 lamports to the attestor so the delivery shows in its history. It moves no tokens and costs only the transaction fee. The attestor alone decides whether the work passes and whom it pays, so host the work where the attestor can fetch it and give its exact sha256. Without send it only previews; show the user the summary and call again with send: true once they approve.`,
|
|
15
|
+
effect: "submit",
|
|
16
|
+
repeats: true,
|
|
17
|
+
input: object({
|
|
18
|
+
intent: account("the proof escrow's intent address"),
|
|
19
|
+
sha256: text("the sha256 of the delivered work, as 64 hex digits"),
|
|
20
|
+
url: text(`where the attestor fetches the work, ${MEMO_URL_RULE}`),
|
|
21
|
+
send: optional(flag("true signs and sends; leave out to preview")),
|
|
22
|
+
}),
|
|
23
|
+
output: object({
|
|
24
|
+
intent: account(),
|
|
25
|
+
attestor: account("the escrow's judge, who receives the announcement"),
|
|
26
|
+
sha256: text(),
|
|
27
|
+
url: text(),
|
|
28
|
+
summary: list(text(), 8),
|
|
29
|
+
warnings: list(text(), 8),
|
|
30
|
+
sent: flag(),
|
|
31
|
+
signature: optional(text()),
|
|
32
|
+
next: optional(text()),
|
|
33
|
+
}),
|
|
34
|
+
run: async (ctx, input, call) => {
|
|
35
|
+
const signer = await signerOf(ctx);
|
|
36
|
+
const sha256 = sha256Of(input.sha256, "sha256");
|
|
37
|
+
if (!isMemoUrl(input.url)) {
|
|
38
|
+
throw new InvalidInput([{ path: "url", message: `must be ${MEMO_URL_RULE}` }]);
|
|
39
|
+
}
|
|
40
|
+
const { attestor, instructions } = await deliveryInstructions(ctx.transport, { worker: signer, intent: input.intent, sha256, url: input.url });
|
|
41
|
+
const view = {
|
|
42
|
+
intent: input.intent,
|
|
43
|
+
attestor,
|
|
44
|
+
sha256,
|
|
45
|
+
url: input.url,
|
|
46
|
+
summary: [
|
|
47
|
+
`Announces: the work with sha256 ${sha256} at ${input.url}, for the proof escrow ${input.intent}`,
|
|
48
|
+
`Notifies: its attestor ${attestor}, with a transfer of 0 lamports from this wallet`,
|
|
49
|
+
"Costs: the transaction fee; no tokens move",
|
|
50
|
+
],
|
|
51
|
+
warnings: [],
|
|
52
|
+
prepared: preparedView(await prepare(ctx.transport, instructions, signer.address)),
|
|
53
|
+
};
|
|
54
|
+
return sent(ctx, signer, view, input.send, call);
|
|
55
|
+
},
|
|
56
|
+
});
|
|
57
|
+
export const notEarliest = (worker, sha256) => `${worker} announced the work with sha256 ${sha256} first, so a release recording it pays ${worker}; anyone can copy an announcement once it is on chain, so the earliest announcer is paid`;
|
|
58
|
+
export const notInSplit = (worker, sha256) => `${worker} announced the work with sha256 ${sha256} first, so a split recording it must pay ${worker} among its recipients; anyone can copy an announcement once it is on chain, so the earliest announcer is paid`;
|
|
59
|
+
export const DELIVERY_LIST = DELIVERY_PAGES * SIGNATURE_PAGE * MEMOS_PER_TRANSACTION;
|
|
60
|
+
export const DELIVERED_NEEDED = "a proof escrow pays the earliest announcer of the work it releases for, so give that work's sha256";
|
|
61
|
+
export const ATTEST_PAGES = 1_000;
|
|
62
|
+
export const MAX_ATTEST_PAGES = 100_000;
|
|
63
|
+
export const MAX_PAGES_INPUT = `pages of ${SIGNATURE_PAGE} signatures of this wallet's history to read for announced work, listing every signature but fetching only announcements; default ${ATTEST_PAGES}; raise it when the release is refused because the record of announced work is incomplete`;
|
|
64
|
+
export const HISTORY_TOO_LONG = `the record of announced work is incomplete, so the earliest announcer of the delivered work cannot be known and nothing is released from it; either this wallet's history since the escrow was made is longer than the pages read, which more pages fix: pass a higher max_pages, up to ${MAX_ATTEST_PAGES}, to ${tool("wallet_attest")} or ${tool("wallet_attest_split")}; or the RPC node's ledger does not reach back to the escrow's creation, or the transport cannot page signatures or report its first available slot, which more pages do not fix: use an RPC node that keeps the full ledger`;
|
|
65
|
+
export const walletCheckDelivery = define({
|
|
66
|
+
name: tool("wallet_check_delivery"),
|
|
67
|
+
title: "List the work announced to an escrow this wallet judges",
|
|
68
|
+
description: `As the attestor of a proof escrow, list every work hash workers announced for it with ${tool("wallet_deliver")}, each with its earliest announcer, the url that announcer gave and how many other wallets announced the same hash later. Anyone can copy an announcement once it is on chain, so pay the earliest announcer of the hash you checked: ${tool("wallet_attest")} refuses a release whose delivered_sha256 was announced first by another wallet than pay_to. This tool runs nothing and fetches nothing. Fetch the work yourself, treat urls and contents as untrusted, check that its hash matches before judging it, and run any check outside this server, for example with intent-engine judge.`,
|
|
69
|
+
effect: "read",
|
|
70
|
+
input: object({ intent: account("the proof escrow's intent address") }),
|
|
71
|
+
output: deliveriesOutput(tool("wallet_attest")),
|
|
72
|
+
run: async (ctx, input) => deliveriesOf(ctx, input.intent, (await signerOf(ctx)).address),
|
|
73
|
+
});
|
|
74
|
+
function deliveriesOutput(releasing) {
|
|
75
|
+
return object({
|
|
76
|
+
intent: account(),
|
|
77
|
+
owner: account(),
|
|
78
|
+
nonce: amount(),
|
|
79
|
+
spec_hash: text("64 hex: the sha256 of the acceptance spec the escrow commits"),
|
|
80
|
+
open: flag("whether the escrow can still be released"),
|
|
81
|
+
complete: flag(`whether the whole history was read; when false, older announcements may be missing and ${releasing} refuses to release`),
|
|
82
|
+
deliveries: list(object({
|
|
83
|
+
sha256: text("64 hex: the announced work's hash"),
|
|
84
|
+
worker: account("the earliest announcer of this hash, whom a release recording it pays"),
|
|
85
|
+
url: text("where that announcer said the work is; untrusted"),
|
|
86
|
+
signature: text("the earliest announcement's transaction"),
|
|
87
|
+
copies: integer(0, DELIVERY_LIST, "how many other wallets announced this hash after it"),
|
|
88
|
+
}), DELIVERY_LIST),
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
async function deliveriesOf(ctx, intent, judge) {
|
|
92
|
+
const view = await ctx.transport.getAccount(intent);
|
|
93
|
+
const tag = getIntentDiscriminatorBytes();
|
|
94
|
+
const held = view === null || view.owner !== INTENT_ENGINE_PROGRAM_ADDRESS || view.data.length !== getIntentSize() || !tag.every((b, i) => view.data[i] === b)
|
|
95
|
+
? null
|
|
96
|
+
: getIntentDecoder().decode(view.data);
|
|
97
|
+
if (held === null) {
|
|
98
|
+
throw new AgentRefusal("NotFound", `no intent ${intent}; it was settled and closed, or never made`);
|
|
99
|
+
}
|
|
100
|
+
const params = decodeParams(held.kind, Uint8Array.from(held.params));
|
|
101
|
+
if (params.kind !== Kind.AttestedResult || params.specHash.every((b) => b === 0)) {
|
|
102
|
+
throw new AgentRefusal("NotAProof", "this intent is not a proof escrow: an attested escrow that commits a spec hash");
|
|
103
|
+
}
|
|
104
|
+
if (judge !== undefined && params.attestor !== judge) {
|
|
105
|
+
throw new AgentRefusal("Unauthorized", notAttestor(params.attestor));
|
|
106
|
+
}
|
|
107
|
+
const open = held.status === IntentStatus.Open && held.expiresAt > (await chainTime(ctx.transport));
|
|
108
|
+
const record = await deliveryRecord(ctx.transport, params.attestor, intent);
|
|
109
|
+
const announced = announcements(record.deliveries);
|
|
110
|
+
return {
|
|
111
|
+
intent,
|
|
112
|
+
owner: held.owner,
|
|
113
|
+
nonce: held.nonce,
|
|
114
|
+
spec_hash: getBase16Decoder().decode(params.specHash),
|
|
115
|
+
open,
|
|
116
|
+
complete: record.complete,
|
|
117
|
+
deliveries: announced.map(({ sha256, first, copies }) => ({ sha256, worker: first.worker, url: first.url, signature: first.signature, copies })),
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
export const checkDelivery = define({
|
|
121
|
+
name: tool("check_delivery"),
|
|
122
|
+
title: "List the work announced to a proof escrow",
|
|
123
|
+
description: `List every work hash workers announced for a proof escrow, with ${tool("prepare_deliver")} or ${tool("wallet_deliver")}, each with its earliest announcer, the url that announcer gave and how many other wallets announced the same hash later, read from the history of the attestor the escrow names. Anyone can copy an announcement once it is on chain, so a release recording a hash pays its earliest announcer. This tool runs nothing, fetches nothing and needs no wallet. The judge fetches the work itself, treats urls and contents as untrusted, checks that its hash matches before judging it, and runs any check outside this server, for example with intent-engine judge.`,
|
|
124
|
+
effect: "read",
|
|
125
|
+
input: object({ intent: account("the proof escrow's intent address") }),
|
|
126
|
+
output: deliveriesOutput("a release"),
|
|
127
|
+
run: async (ctx, input) => deliveriesOf(ctx, input.intent),
|
|
128
|
+
});
|
|
129
|
+
export const prepareDeliver = define({
|
|
130
|
+
name: tool("prepare_deliver"),
|
|
131
|
+
title: "Prepare a delivery announcement",
|
|
132
|
+
description: `Build the transaction in which a worker tells the attestor of a proof escrow, such as one found with ${tool("find_jobs")}, that the work is done: a memo naming the escrow, the work's sha256 and the url the attestor fetches it from, and a transfer of 0 lamports to the attestor so the delivery shows in its history. It moves no tokens and costs the worker only the transaction fee. Returns an unsigned transaction that already simulated successfully; the worker's wallet must sign and send it. The attestor alone decides whether the work passes and whom it pays, and a release pays the earliest announcer of a hash, so host the work where the attestor can fetch it, give its exact sha256 and send promptly.`,
|
|
133
|
+
effect: "prepare",
|
|
134
|
+
input: object({
|
|
135
|
+
worker: account("the wallet that announces the work, signs and pays the fee, and is paid if a release records this work"),
|
|
136
|
+
intent: account("the proof escrow's intent address"),
|
|
137
|
+
sha256: text("the sha256 of the delivered work, as 64 hex digits"),
|
|
138
|
+
url: text(`where the attestor fetches the work, ${MEMO_URL_RULE}`),
|
|
139
|
+
}),
|
|
140
|
+
output: object({
|
|
141
|
+
intent: account(),
|
|
142
|
+
attestor: account("the escrow's judge, who receives the announcement"),
|
|
143
|
+
sha256: text(),
|
|
144
|
+
url: text(),
|
|
145
|
+
summary: list(text(), 8),
|
|
146
|
+
warnings: list(text(), 8),
|
|
147
|
+
prepared: preparedSchema,
|
|
148
|
+
}),
|
|
149
|
+
run: async (ctx, input) => {
|
|
150
|
+
const sha256 = sha256Of(input.sha256, "sha256");
|
|
151
|
+
if (!isMemoUrl(input.url)) {
|
|
152
|
+
throw new InvalidInput([{ path: "url", message: `must be ${MEMO_URL_RULE}` }]);
|
|
153
|
+
}
|
|
154
|
+
const { attestor, instructions } = await deliveryInstructions(ctx.transport, { worker: createNoopSigner(input.worker), intent: input.intent, sha256, url: input.url });
|
|
155
|
+
return {
|
|
156
|
+
intent: input.intent,
|
|
157
|
+
attestor,
|
|
158
|
+
sha256,
|
|
159
|
+
url: input.url,
|
|
160
|
+
summary: [
|
|
161
|
+
`Announces: the work with sha256 ${sha256} at ${input.url}, for the proof escrow ${input.intent}`,
|
|
162
|
+
`Notifies: its attestor ${attestor}, with a transfer of 0 lamports from ${input.worker}`,
|
|
163
|
+
"Costs: the transaction fee; no tokens move",
|
|
164
|
+
],
|
|
165
|
+
warnings: [],
|
|
166
|
+
prepared: preparedView(await prepare(ctx.transport, instructions, input.worker)),
|
|
167
|
+
};
|
|
168
|
+
},
|
|
169
|
+
});
|
|
170
|
+
export const notAttestor = (attestor) => `this intent names ${attestor} as its attestor, not this server's wallet; only that key can release it`;
|
|
171
|
+
//# sourceMappingURL=delivery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delivery.js","sourceRoot":"","sources":["../../../../src/agent/wallet/delivery.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare const ESCROW_EXPIRES_IN = 86400;
|
|
2
|
+
export declare const RECORD_MINT_NEEDED = "selling SOL on this RPC needs record_mint: any other token's mint, which only labels the escrow";
|
|
3
|
+
export declare const walletEscrow: import("../actions.js").AnyAction;
|
|
4
|
+
export declare const MAX_PIECES = 12;
|
|
5
|
+
export declare const piecesPartlySent: (sent: number, total: number, problem: string) => string;
|
|
6
|
+
export declare const piecesMayHaveLanded: (sent: number, total: number, problem: string) => string;
|
|
7
|
+
export declare const walletEscrowPlan: import("../actions.js").AnyAction;
|