@intent-engine/cli 0.1.23 → 0.1.26
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/admin-commands.d.ts +12 -0
- package/dist/src/admin-commands.js +140 -0
- package/dist/src/admin-commands.js.map +1 -0
- package/dist/src/agent/actions.d.ts +2 -0
- package/dist/src/agent/actions.js +1 -1
- package/dist/src/agent/actions.js.map +1 -1
- package/dist/src/agent/claims.js +13 -12
- package/dist/src/agent/claims.js.map +1 -1
- package/dist/src/agent/create.d.ts +1 -0
- package/dist/src/agent/create.js +7 -3
- package/dist/src/agent/create.js.map +1 -1
- package/dist/src/agent/mandate-agent.d.ts +2 -0
- package/dist/src/agent/mandate-agent.js +136 -0
- package/dist/src/agent/mandate-agent.js.map +1 -0
- package/dist/src/agent/mandate-grant.d.ts +2 -0
- package/dist/src/agent/mandate-grant.js +192 -0
- package/dist/src/agent/mandate-grant.js.map +1 -0
- package/dist/src/agent/mandate-revoke.d.ts +1 -0
- package/dist/src/agent/mandate-revoke.js +142 -0
- package/dist/src/agent/mandate-revoke.js.map +1 -0
- package/dist/src/agent/mandate-state.d.ts +33 -0
- package/dist/src/agent/mandate-state.js +85 -0
- package/dist/src/agent/mandate-state.js.map +1 -0
- package/dist/src/agent/mandate.d.ts +4 -26
- package/dist/src/agent/mandate.js +4 -479
- package/dist/src/agent/mandate.js.map +1 -1
- package/dist/src/agent/mcp.js +7 -3
- package/dist/src/agent/mcp.js.map +1 -1
- package/dist/src/agent/prepare.js +1 -1
- package/dist/src/agent/prepare.js.map +1 -1
- package/dist/src/agent/problems.d.ts +13 -1
- package/dist/src/agent/problems.js +32 -1
- package/dist/src/agent/problems.js.map +1 -1
- package/dist/src/agent/read.d.ts +12 -0
- package/dist/src/agent/read.js +20 -6
- package/dist/src/agent/read.js.map +1 -1
- package/dist/src/agent/registry.js +6 -1
- package/dist/src/agent/registry.js.map +1 -1
- package/dist/src/agent/relay.d.ts +2 -0
- package/dist/src/agent/relay.js +11 -3
- package/dist/src/agent/relay.js.map +1 -1
- package/dist/src/agent/sales.d.ts +29 -0
- package/dist/src/agent/sales.js +248 -0
- package/dist/src/agent/sales.js.map +1 -0
- package/dist/src/agent/signed-prepare.d.ts +1 -0
- package/dist/src/agent/signed-prepare.js +141 -0
- package/dist/src/agent/signed-prepare.js.map +1 -0
- package/dist/src/agent/signed-relay.d.ts +25 -0
- package/dist/src/agent/signed-relay.js +68 -0
- package/dist/src/agent/signed-relay.js.map +1 -0
- package/dist/src/agent/signed-submit.d.ts +2 -0
- package/dist/src/agent/signed-submit.js +137 -0
- package/dist/src/agent/signed-submit.js.map +1 -0
- package/dist/src/agent/signed-terms.d.ts +85 -0
- package/dist/src/agent/signed-terms.js +84 -0
- package/dist/src/agent/signed-terms.js.map +1 -0
- package/dist/src/agent/signed.d.ts +4 -13
- package/dist/src/agent/signed.js +4 -361
- package/dist/src/agent/signed.js.map +1 -1
- package/dist/src/agent/wallet/account.d.ts +4 -0
- package/dist/src/agent/wallet/account.js +84 -0
- package/dist/src/agent/wallet/account.js.map +1 -0
- package/dist/src/agent/wallet/attest.d.ts +4 -0
- package/dist/src/agent/wallet/attest.js +178 -0
- package/dist/src/agent/wallet/attest.js.map +1 -0
- package/dist/src/agent/wallet/delivery.d.ts +13 -0
- package/dist/src/agent/wallet/delivery.js +171 -0
- package/dist/src/agent/wallet/delivery.js.map +1 -0
- package/dist/src/agent/wallet/escrow.d.ts +7 -0
- package/dist/src/agent/wallet/escrow.js +164 -0
- package/dist/src/agent/wallet/escrow.js.map +1 -0
- package/dist/src/agent/wallet/fills.d.ts +27 -0
- package/dist/src/agent/wallet/fills.js +80 -0
- package/dist/src/agent/wallet/fills.js.map +1 -0
- package/dist/src/agent/wallet/guard.d.ts +57 -0
- package/dist/src/agent/wallet/guard.js +205 -0
- package/dist/src/agent/wallet/guard.js.map +1 -0
- package/dist/src/agent/wallet/offer.d.ts +50 -0
- package/dist/src/agent/wallet/offer.js +80 -0
- package/dist/src/agent/wallet/offer.js.map +1 -0
- package/dist/src/agent/wallet/receipt.d.ts +42 -0
- package/dist/src/agent/wallet/receipt.js +102 -0
- package/dist/src/agent/wallet/receipt.js.map +1 -0
- package/dist/src/agent/wallet/record.d.ts +31 -0
- package/dist/src/agent/wallet/record.js +178 -0
- package/dist/src/agent/wallet/record.js.map +1 -0
- package/dist/src/agent/wallet/releases.d.ts +40 -0
- package/dist/src/agent/wallet/releases.js +236 -0
- package/dist/src/agent/wallet/releases.js.map +1 -0
- package/dist/src/agent/wallet/split.d.ts +10 -0
- package/dist/src/agent/wallet/split.js +271 -0
- package/dist/src/agent/wallet/split.js.map +1 -0
- package/dist/src/agent/wallet/trade.d.ts +14 -0
- package/dist/src/agent/wallet/trade.js +243 -0
- package/dist/src/agent/wallet/trade.js.map +1 -0
- package/dist/src/agent/wallet/wait.d.ts +5 -0
- package/dist/src/agent/wallet/wait.js +99 -0
- package/dist/src/agent/wallet/wait.js.map +1 -0
- package/dist/src/agent/wallet.d.ts +18 -73
- package/dist/src/agent/wallet.js +24 -1322
- package/dist/src/agent/wallet.js.map +1 -1
- package/dist/src/arg-options.d.ts +333 -0
- package/dist/src/arg-options.js +310 -0
- package/dist/src/arg-options.js.map +1 -0
- package/dist/src/arg-usage.d.ts +7 -0
- package/dist/src/arg-usage.js +53 -0
- package/dist/src/arg-usage.js.map +1 -0
- package/dist/src/arg-values.d.ts +47 -0
- package/dist/src/arg-values.js +280 -0
- package/dist/src/arg-values.js.map +1 -0
- package/dist/src/args.d.ts +7 -545
- package/dist/src/args.js +55 -923
- package/dist/src/args.js.map +1 -1
- package/dist/src/artifact.d.ts +22 -0
- package/dist/src/artifact.js +89 -0
- package/dist/src/artifact.js.map +1 -0
- package/dist/src/check-process.d.ts +39 -0
- package/dist/src/check-process.js +338 -0
- package/dist/src/check-process.js.map +1 -0
- package/dist/src/command-builders.d.ts +37 -0
- package/dist/src/command-builders.js +216 -0
- package/dist/src/command-builders.js.map +1 -0
- package/dist/src/command-types.d.ts +227 -0
- package/dist/src/command-types.js +2 -0
- package/dist/src/command-types.js.map +1 -0
- package/dist/src/commands.d.ts +7 -43
- package/dist/src/commands.js +60 -457
- package/dist/src/commands.js.map +1 -1
- package/dist/src/event-feed.d.ts +13 -0
- package/dist/src/event-feed.js +46 -0
- package/dist/src/event-feed.js.map +1 -0
- package/dist/src/flow-commands.d.ts +8 -0
- package/dist/src/flow-commands.js +116 -0
- package/dist/src/flow-commands.js.map +1 -0
- package/dist/src/flows.d.ts +6 -0
- package/dist/src/flows.js +84 -10
- package/dist/src/flows.js.map +1 -1
- package/dist/src/job-commands.d.ts +9 -0
- package/dist/src/job-commands.js +89 -0
- package/dist/src/job-commands.js.map +1 -0
- package/dist/src/judge-errors.d.ts +12 -0
- package/dist/src/judge-errors.js +16 -0
- package/dist/src/judge-errors.js.map +1 -0
- package/dist/src/judge.d.ts +11 -16
- package/dist/src/judge.js +120 -100
- package/dist/src/judge.js.map +1 -1
- package/dist/src/main.d.ts +4 -1
- package/dist/src/main.js +25 -9
- package/dist/src/main.js.map +1 -1
- package/dist/src/order-builders.d.ts +10 -0
- package/dist/src/order-builders.js +172 -0
- package/dist/src/order-builders.js.map +1 -0
- package/dist/src/render.d.ts +1 -0
- package/dist/src/render.js +9 -0
- package/dist/src/render.js.map +1 -1
- package/dist/src/runtime.d.ts +22 -0
- package/dist/src/runtime.js +2 -0
- package/dist/src/runtime.js.map +1 -0
- package/dist/src/solve-commands.d.ts +25 -0
- package/dist/src/solve-commands.js +171 -0
- package/dist/src/solve-commands.js.map +1 -0
- package/dist/src/tokens.js +2 -1
- package/dist/src/tokens.js.map +1 -1
- package/dist/src/version.d.ts +1 -1
- package/dist/src/version.js +1 -1
- package/dist/src/wallet.d.ts +4 -1
- package/dist/src/wallet.js +25 -5
- package/dist/src/wallet.js.map +1 -1
- package/package.json +16 -7
- package/dist/src/events.d.ts +0 -8
- package/dist/src/events.js +0 -43
- package/dist/src/events.js.map +0 -1
- package/dist/src/transport.d.ts +0 -208
- package/dist/src/transport.js +0 -441
- package/dist/src/transport.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"releases.js","sourceRoot":"","sources":["../../../../src/agent/wallet/releases.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export declare const SPLIT_FITS = 2;
|
|
2
|
+
export declare const SPLIT_FITS_WITH_TABLE = 4;
|
|
3
|
+
export declare const splitTooLarge: (size: number, recipients: number, withTable: boolean) => string;
|
|
4
|
+
export declare const RECORDS_SPLIT: (delivered: string) => string;
|
|
5
|
+
export declare const followUpFailed: (reason: string) => string;
|
|
6
|
+
export declare const SPLIT_WEIGHTS_WRONG = "the weights must be whole basis points that add up to 10000";
|
|
7
|
+
export declare const SPLIT_SIG_NEEDED = "every co-author must sign the split before send: true; preview returns the envelope each one signs";
|
|
8
|
+
export declare const SIGNATURE_PATTERN = "^[0-9a-fA-F]{128}$";
|
|
9
|
+
export declare const WARN_COAUTHORS = "every co-author must sign the exact split; a release pays only the recipients and weights they all signed";
|
|
10
|
+
export declare const walletAttestSplit: import("../actions.js").AnyAction;
|
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { AccountRole, getBase16Decoder, getBase16Encoder, signBytes } from "@solana/kit";
|
|
3
|
+
import { attestedSplitMessage, attestedSplitPreimage, buildEd25519BatchInstruction, buildFillAttestedSplit, decodeParams, feeBpsFor, findIntentPda, formatAmount, getIntentDecoder, INTENT_ENGINE_PROGRAM_ADDRESS, IntentStatus, Kind, MAX_SPLIT_RECIPIENTS, NATIVE_MINT, releaseMemo, splitCommit, splitFees, splitPayout, settlementWarnings, } from "@intent-engine/core";
|
|
4
|
+
import { decodeLookupTable } from "@intent-engine/solver";
|
|
5
|
+
import { chainTime, deliveryRecord, firstDelivery, followUpInstructions, followUpMemo, followUpOf, loadConfig, MEMO_PROGRAM_ADDRESS, mintOf, neverLanded, PACKET_DATA_SIZE, tokenAccountIfMissing, } from "@intent-engine/client";
|
|
6
|
+
import { execute } from "../../flows.js";
|
|
7
|
+
import { TOKEN_NAMES } from "../../tokens.js";
|
|
8
|
+
import { define } from "../actions.js";
|
|
9
|
+
import { WRAPPED } from "../create.js";
|
|
10
|
+
import { tool } from "../names.js";
|
|
11
|
+
import { AgentRefusal, problemOf } from "../problems.js";
|
|
12
|
+
import { InvalidInput, account, amount, choice, flag, integer, list, object, optional, text } from "../schema.js";
|
|
13
|
+
import { preparedView } from "../shapes.js";
|
|
14
|
+
import { walletRecipient } from "../owner.js";
|
|
15
|
+
import { prepare, transactionSize } from "../prepare.js";
|
|
16
|
+
import { STATUS } from "../../accounts.js";
|
|
17
|
+
import { WAIT_SCAN, signerOf, sent, sha256Of } from "./guard.js";
|
|
18
|
+
import { RELEASE_CHANGED, approvalOf } from "./attest.js";
|
|
19
|
+
import { notInSplit, DELIVERED_NEEDED, ATTEST_PAGES, MAX_ATTEST_PAGES, MAX_PAGES_INPUT, HISTORY_TOO_LONG, notAttestor } from "./delivery.js";
|
|
20
|
+
export const SPLIT_FITS = 2;
|
|
21
|
+
export const SPLIT_FITS_WITH_TABLE = 4;
|
|
22
|
+
export const splitTooLarge = (size, recipients, withTable) => `this ${recipients}-co-author split builds a ${size}-byte transaction without the delivery memo, over the ${PACKET_DATA_SIZE}-byte limit${withTable ? " even with the lookup table" : ""}; a release fits ${SPLIT_FITS} co-authors without a lookup table and ${SPLIT_FITS_WITH_TABLE} with one when their token accounts exist, and fewer when this wallet creates them in the same transaction${withTable ? ", so reduce recipients or pay the rest in a second release" : ", so pass lookup_table with the preview's lookup_accounts to fit more, or reduce recipients"}`;
|
|
23
|
+
export const RECORDS_SPLIT = (delivered) => `Records: the delivered work's sha256 ${delivered}, in a memo this wallet signs with the release, or in a follow-up transaction this wallet signs right after it when the release has no room for the memo`;
|
|
24
|
+
export const followUpFailed = (reason) => `the release landed, but the follow-up transaction that records the delivered work's sha256 failed, so the hash is not recorded on chain: ${reason}; to record it, call ${tool("wallet_record_delivery")} with the same owner and nonce, the delivered_sha256 as sha256 and this signature as release, which sends the memo in record_memo for ${tool("wallet_receipt")} to read`;
|
|
25
|
+
export const SPLIT_WEIGHTS_WRONG = "the weights must be whole basis points that add up to 10000";
|
|
26
|
+
export const SPLIT_SIG_NEEDED = "every co-author must sign the split before send: true; preview returns the envelope each one signs";
|
|
27
|
+
export const SIGNATURE_PATTERN = "^[0-9a-fA-F]{128}$";
|
|
28
|
+
export const WARN_COAUTHORS = "every co-author must sign the exact split; a release pays only the recipients and weights they all signed";
|
|
29
|
+
const coauthor = object({
|
|
30
|
+
wallet: account("the co-author's wallet"),
|
|
31
|
+
weight: integer(1, 10_000, "this co-author's share in basis points; all weights must add up to 10000"),
|
|
32
|
+
signature: optional(text("128 hex: this co-author's signature over the envelope the preview returned for this wallet; needed with send")),
|
|
33
|
+
});
|
|
34
|
+
const RECORDED_WHERE = ["release", "follow-up"];
|
|
35
|
+
const recordedWhere = {
|
|
36
|
+
json: {
|
|
37
|
+
anyOf: [{ type: "string", enum: [...RECORDED_WHERE] }, { type: "boolean", const: false }],
|
|
38
|
+
description: "where the sha256 was recorded: in a memo in the release, or in a follow-up transaction this wallet signed right after it because the release had no room for the memo; false when the follow-up failed, so the hash is not on chain",
|
|
39
|
+
},
|
|
40
|
+
read: (value, path) => (value === false ? false : choice(RECORDED_WHERE).read(value, path)),
|
|
41
|
+
};
|
|
42
|
+
export const walletAttestSplit = define({
|
|
43
|
+
name: tool("wallet_attest_split"),
|
|
44
|
+
title: "Release a proof escrow split among co-authors",
|
|
45
|
+
description: `As the attestor a proof escrow names, release it on chain divided among several co-authors by weight, from this server's wallet: the escrowed tokens, minus the engine fee, any partner fee and the judge fee, are split by the weights and paid to each co-author's token account, which this creates if needed. Every co-author must authorize the exact split: preview without send to get the digest and the envelope each wallet must sign, collect those signatures, then call again with send: true and each co-author's signature. Changing any recipient, weight or the result changes what everyone signs. The escrow must have been made with a spec_hash. 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.`,
|
|
46
|
+
effect: "submit",
|
|
47
|
+
input: object({
|
|
48
|
+
owner: account("the wallet that made the escrow"),
|
|
49
|
+
nonce: amount("the escrow intent's nonce"),
|
|
50
|
+
recipients: list(coauthor, MAX_SPLIT_RECIPIENTS, "the co-authors and their weighted shares, up to 8", 1),
|
|
51
|
+
result: optional(amount("the result to attest, between the intent's min_result and max_result; default min_result")),
|
|
52
|
+
lookup_table: optional(account("an address lookup table holding this split's lookup_accounts, to fit more co-authors under the transaction size limit; create one with the preview's lookup_accounts and pass it with send")),
|
|
53
|
+
delivered_sha256: optional(text(`the sha256, as 64 hex digits, of the work this release pays for; required, since a release recording it must include that work's earliest announcer among the recipients; recorded in a memo this wallet signs with the release, or right after it when the release has no room for the memo, so the payer can check what it receives with ${tool("wallet_receipt")}`)),
|
|
54
|
+
max_pages: optional(integer(1, MAX_ATTEST_PAGES, MAX_PAGES_INPUT)),
|
|
55
|
+
approval: optional(text("the approval the preview returned; needed with send")),
|
|
56
|
+
send: optional(flag("true signs the attestation and settles; leave out to preview")),
|
|
57
|
+
}),
|
|
58
|
+
output: object({
|
|
59
|
+
intent: account(),
|
|
60
|
+
digest: text("64 hex: the split digest every co-author and this wallet sign over"),
|
|
61
|
+
envelope: text("the one message every co-author and this wallet sign, as hex; collect each co-author's signature over it"),
|
|
62
|
+
lookup_accounts: list(account(), 24, "put these in an address lookup table (solana address-lookup-table create, then extend) and pass it as lookup_table to fit more co-authors"),
|
|
63
|
+
paid: list(object({ wallet: account(), weight: amount(), amount: text("whole tokens this co-author receives") }), MAX_SPLIT_RECIPIENTS),
|
|
64
|
+
net: text("whole tokens shared among the co-authors"),
|
|
65
|
+
fee: text("whole tokens kept as fees"),
|
|
66
|
+
result: amount(),
|
|
67
|
+
approval: text("pass it back with send: true; a send that would differ from this preview is refused"),
|
|
68
|
+
delivered_sha256: optional(text("the sha256 the release records")),
|
|
69
|
+
recorded: optional(recordedWhere),
|
|
70
|
+
follow_up_signature: optional(text("the follow-up transaction that records the sha256, when recorded is follow-up")),
|
|
71
|
+
record_memo: optional(text(`when recorded is false, the memo that records the sha256 for this release; ${tool("wallet_record_delivery")} sends it from this wallet with a zero transfer to the escrow`)),
|
|
72
|
+
summary: list(text(), 12),
|
|
73
|
+
warnings: list(text(), 8),
|
|
74
|
+
sent: flag(),
|
|
75
|
+
signature: optional(text()),
|
|
76
|
+
next: optional(text()),
|
|
77
|
+
}),
|
|
78
|
+
run: async (ctx, input, call) => {
|
|
79
|
+
const signer = await signerOf(ctx);
|
|
80
|
+
const [intent] = await findIntentPda({ owner: input.owner, nonce: input.nonce });
|
|
81
|
+
const [view, { config }] = await Promise.all([ctx.transport.getAccount(intent), loadConfig(ctx.transport)]);
|
|
82
|
+
if (view === null) {
|
|
83
|
+
throw new AgentRefusal("NotFound", `no intent ${intent}; it was settled, cancelled and closed, or never made`);
|
|
84
|
+
}
|
|
85
|
+
const held = getIntentDecoder().decode(view.data);
|
|
86
|
+
const params = decodeParams(held.kind, Uint8Array.from(held.params));
|
|
87
|
+
if (params.kind !== Kind.AttestedResult) {
|
|
88
|
+
throw new AgentRefusal("KindMismatch", "this intent is not an attested escrow");
|
|
89
|
+
}
|
|
90
|
+
if (!params.specHash.some((b) => b !== 0)) {
|
|
91
|
+
throw new AgentRefusal("NotAProof", "a split release needs an escrow made with a spec_hash");
|
|
92
|
+
}
|
|
93
|
+
if (params.attestor !== signer.address) {
|
|
94
|
+
throw new AgentRefusal("Unauthorized", notAttestor(params.attestor));
|
|
95
|
+
}
|
|
96
|
+
if (held.status !== IntentStatus.Open) {
|
|
97
|
+
throw new AgentRefusal("InvalidTransition", `this escrow is ${STATUS[held.status] ?? "not open"}, so it can no longer be released`);
|
|
98
|
+
}
|
|
99
|
+
if (held.expiresAt <= (await chainTime(ctx.transport))) {
|
|
100
|
+
throw new AgentRefusal("IntentExpired", "this escrow has expired; its owner gets it back instead");
|
|
101
|
+
}
|
|
102
|
+
const result = input.result ?? params.minResult;
|
|
103
|
+
if (result < params.minResult || result > params.maxResult) {
|
|
104
|
+
throw new InvalidInput([{ path: "result", message: `must be between ${params.minResult} and ${params.maxResult}` }]);
|
|
105
|
+
}
|
|
106
|
+
const weights = input.recipients.map((r) => r.weight);
|
|
107
|
+
if (weights.reduce((a, b) => a + b, 0) !== 10_000) {
|
|
108
|
+
throw new InvalidInput([{ path: "recipients", message: SPLIT_WEIGHTS_WRONG }]);
|
|
109
|
+
}
|
|
110
|
+
const wallets = input.recipients.map((r) => r.wallet);
|
|
111
|
+
for (const [i, r] of input.recipients.entries()) {
|
|
112
|
+
await walletRecipient(ctx.transport, r.wallet, `recipients.${i}.wallet`);
|
|
113
|
+
}
|
|
114
|
+
if (input.delivered_sha256 === undefined) {
|
|
115
|
+
throw new InvalidInput([{ path: "delivered_sha256", message: DELIVERED_NEEDED }]);
|
|
116
|
+
}
|
|
117
|
+
const delivered = sha256Of(input.delivered_sha256, "delivered_sha256");
|
|
118
|
+
const record = await deliveryRecord(ctx.transport, signer.address, intent, input.max_pages ?? ATTEST_PAGES);
|
|
119
|
+
if (!record.complete) {
|
|
120
|
+
throw new AgentRefusal("HistoryTooLong", HISTORY_TOO_LONG);
|
|
121
|
+
}
|
|
122
|
+
const first = firstDelivery(record.deliveries, delivered);
|
|
123
|
+
if (first !== null && !wallets.includes(first.worker)) {
|
|
124
|
+
throw new AgentRefusal("NotEarliestAnnouncer", notInSplit(first.worker, delivered));
|
|
125
|
+
}
|
|
126
|
+
const memoText = releaseMemo(delivered);
|
|
127
|
+
const memo = { programAddress: MEMO_PROGRAM_ADDRESS, accounts: [{ address: signer.address, role: AccountRole.READONLY_SIGNER, signer }], data: new TextEncoder().encode(memoText) };
|
|
128
|
+
const token = await mintOf(ctx.transport, held.inputMint);
|
|
129
|
+
const payees = await Promise.all(wallets.map((w) => tokenAccountIfMissing(ctx.transport, signer, w, held.inputMint, token.tokenProgram)));
|
|
130
|
+
const amountIn = held.escrowed - held.filled;
|
|
131
|
+
const settleAmount = amountIn - params.judgeFee;
|
|
132
|
+
const maxFeeBps = feeBpsFor(config, held.kind) + held.partnerBps;
|
|
133
|
+
const shares = splitFees(settleAmount, feeBpsFor(config, held.kind), held.partnerBps, held.partnerCutBps);
|
|
134
|
+
const payout = splitPayout(shares.net, weights);
|
|
135
|
+
const treasury = shares.protocol > 0n ? await tokenAccountIfMissing(ctx.transport, signer, config.feeRecipient, held.inputMint, token.tokenProgram) : { create: [] };
|
|
136
|
+
const partnerPaid = shares.partner > 0n;
|
|
137
|
+
const partner = partnerPaid ? await tokenAccountIfMissing(ctx.transport, signer, held.partner, held.inputMint, token.tokenProgram) : { create: [] };
|
|
138
|
+
const judge = params.judgeFee > 0n ? await tokenAccountIfMissing(ctx.transport, signer, signer.address, held.inputMint, token.tokenProgram) : { create: [] };
|
|
139
|
+
const splitHash = await splitCommit(wallets, weights);
|
|
140
|
+
const fields = {
|
|
141
|
+
domain: Uint8Array.from(config.domain),
|
|
142
|
+
intent,
|
|
143
|
+
amountIn,
|
|
144
|
+
result,
|
|
145
|
+
filled: held.filled,
|
|
146
|
+
revision: held.revision,
|
|
147
|
+
maxFeeBps,
|
|
148
|
+
specHash: params.specHash,
|
|
149
|
+
splitHash,
|
|
150
|
+
};
|
|
151
|
+
const message = await attestedSplitMessage(fields);
|
|
152
|
+
const digestHex = getBase16Decoder().decode(Uint8Array.from(createHash("sha256").update(await attestedSplitPreimage(fields)).digest()));
|
|
153
|
+
const settle = await buildFillAttestedSplit({
|
|
154
|
+
solver: signer,
|
|
155
|
+
owner: input.owner,
|
|
156
|
+
nonce: input.nonce,
|
|
157
|
+
inputMint: held.inputMint,
|
|
158
|
+
inputTokenProgram: token.tokenProgram,
|
|
159
|
+
recipients: wallets,
|
|
160
|
+
weights,
|
|
161
|
+
...(shares.protocol > 0n ? { feeRecipient: config.feeRecipient } : {}),
|
|
162
|
+
...(partnerPaid ? { partner: held.partner } : {}),
|
|
163
|
+
...(params.judgeFee > 0n ? { judge: signer.address } : {}),
|
|
164
|
+
amountIn,
|
|
165
|
+
result,
|
|
166
|
+
maxFeeBps,
|
|
167
|
+
});
|
|
168
|
+
const name = TOKEN_NAMES[held.inputMint] ?? held.inputMint;
|
|
169
|
+
const approval = approvalOf(message, memoText);
|
|
170
|
+
if (input.send === true && input.approval !== approval) {
|
|
171
|
+
throw new AgentRefusal("ReleaseChanged", RELEASE_CHANGED);
|
|
172
|
+
}
|
|
173
|
+
let batch;
|
|
174
|
+
if (input.send === true) {
|
|
175
|
+
const entries = input.recipients.map((r, i) => {
|
|
176
|
+
if (r.signature === undefined || !new RegExp(SIGNATURE_PATTERN).test(r.signature)) {
|
|
177
|
+
throw new InvalidInput([{ path: `recipients.${i}.signature`, message: SPLIT_SIG_NEEDED }]);
|
|
178
|
+
}
|
|
179
|
+
return { publicKey: r.wallet, signature: Uint8Array.from(getBase16Encoder().encode(r.signature)) };
|
|
180
|
+
});
|
|
181
|
+
const attestorSignature = new Uint8Array(await signBytes(signer.keyPair.privateKey, message));
|
|
182
|
+
batch = buildEd25519BatchInstruction({ entries: [...entries, { publicKey: signer.address, signature: attestorSignature }], message });
|
|
183
|
+
}
|
|
184
|
+
const setup = [...payees.flatMap((p) => p.create), ...treasury.create, ...partner.create, ...judge.create];
|
|
185
|
+
const invoked = new Set([INTENT_ENGINE_PROGRAM_ADDRESS, token.tokenProgram, signer.address]);
|
|
186
|
+
const lookupAccounts = [...new Set((settle.accounts ?? []).map((a) => a.address))].filter((a) => !invoked.has(a));
|
|
187
|
+
let tables;
|
|
188
|
+
if (input.send === true && input.lookup_table !== undefined) {
|
|
189
|
+
const view = await ctx.transport.getAccount(input.lookup_table);
|
|
190
|
+
if (view === null) {
|
|
191
|
+
throw new AgentRefusal("NotFound", `no lookup table ${input.lookup_table} on this cluster`);
|
|
192
|
+
}
|
|
193
|
+
tables = { [input.lookup_table]: decodeLookupTable(view.data) };
|
|
194
|
+
}
|
|
195
|
+
let prepared;
|
|
196
|
+
let followUp = false;
|
|
197
|
+
if (input.send === true && batch !== undefined) {
|
|
198
|
+
const sizeOf = async (ixs) => transactionSize(ctx.transport, await ctx.transport.budget(ixs, signer.address, tables), signer.address, tables);
|
|
199
|
+
const bare = [...setup, batch, settle];
|
|
200
|
+
followUp = (await sizeOf([...bare, memo])) > PACKET_DATA_SIZE;
|
|
201
|
+
if (followUp) {
|
|
202
|
+
const size = await sizeOf(bare);
|
|
203
|
+
if (size > PACKET_DATA_SIZE) {
|
|
204
|
+
throw new AgentRefusal("ReleaseTooLarge", splitTooLarge(size, input.recipients.length, input.lookup_table !== undefined));
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
prepared = preparedView(await prepare(ctx.transport, followUp ? bare : [...bare, memo], signer.address, tables));
|
|
208
|
+
}
|
|
209
|
+
const view2 = {
|
|
210
|
+
intent,
|
|
211
|
+
digest: digestHex,
|
|
212
|
+
envelope: getBase16Decoder().decode(message),
|
|
213
|
+
lookup_accounts: lookupAccounts,
|
|
214
|
+
paid: input.recipients.map((r, i) => ({
|
|
215
|
+
wallet: r.wallet,
|
|
216
|
+
weight: BigInt(r.weight),
|
|
217
|
+
amount: formatAmount(payout[i] ?? 0n, token.decimals),
|
|
218
|
+
})),
|
|
219
|
+
net: formatAmount(shares.net, token.decimals),
|
|
220
|
+
fee: formatAmount(shares.protocol + shares.partner + params.judgeFee, token.decimals),
|
|
221
|
+
result,
|
|
222
|
+
approval,
|
|
223
|
+
delivered_sha256: delivered,
|
|
224
|
+
summary: [
|
|
225
|
+
`Splits: ${formatAmount(shares.net, token.decimals)} of ${name} among ${input.recipients.length} co-authors from ${input.owner}'s escrow${held.inputMint === NATIVE_MINT ? WRAPPED : ""}`,
|
|
226
|
+
...input.recipients.map((r, i) => ` ${r.wallet}: ${r.weight} bps -> ${formatAmount(payout[i] ?? 0n, token.decimals)} of ${name}`),
|
|
227
|
+
...(params.judgeFee > 0n ? [`Pays the judge: ${formatAmount(params.judgeFee, token.decimals)} of ${name} to this wallet, carved out of the escrow`] : []),
|
|
228
|
+
`Binds: the result to the committed spec ${getBase16Decoder().decode(params.specHash)}`,
|
|
229
|
+
`Attests: result ${result}, signed by this server's wallet as the escrow's attestor`,
|
|
230
|
+
RECORDS_SPLIT(delivered),
|
|
231
|
+
...(setup.length === 0 ? [] : [`Setup: creates ${setup.length} token account(s), paid by this wallet`]),
|
|
232
|
+
],
|
|
233
|
+
warnings: [...settlementWarnings(params), WARN_COAUTHORS],
|
|
234
|
+
prepared,
|
|
235
|
+
};
|
|
236
|
+
const done = await sent(ctx, signer, view2, input.send, call);
|
|
237
|
+
if (!("signature" in done)) {
|
|
238
|
+
return done;
|
|
239
|
+
}
|
|
240
|
+
if (!followUp) {
|
|
241
|
+
return { ...done, recorded: "release" };
|
|
242
|
+
}
|
|
243
|
+
const unrecorded = (error) => ({
|
|
244
|
+
...done,
|
|
245
|
+
recorded: false,
|
|
246
|
+
record_memo: followUpMemo(delivered, done.signature),
|
|
247
|
+
next: followUpFailed(problemOf(error).hint),
|
|
248
|
+
});
|
|
249
|
+
let recording;
|
|
250
|
+
try {
|
|
251
|
+
recording = preparedView(await prepare(ctx.transport, followUpInstructions(signer, intent, delivered, done.signature), signer.address));
|
|
252
|
+
}
|
|
253
|
+
catch (error) {
|
|
254
|
+
return unrecorded(error);
|
|
255
|
+
}
|
|
256
|
+
try {
|
|
257
|
+
return { ...done, recorded: "follow-up", follow_up_signature: await execute(ctx.transport, recording, signer) };
|
|
258
|
+
}
|
|
259
|
+
catch (error) {
|
|
260
|
+
if (neverLanded(error)) {
|
|
261
|
+
return unrecorded(error);
|
|
262
|
+
}
|
|
263
|
+
const landed = await ctx.transport
|
|
264
|
+
.engineTransactions(WAIT_SCAN, intent)
|
|
265
|
+
.then((transactions) => followUpOf(transactions, done.signature, signer.address))
|
|
266
|
+
.catch(() => null);
|
|
267
|
+
return landed === null || landed.sha256 !== delivered ? unrecorded(error) : { ...done, recorded: "follow-up", follow_up_signature: landed.signature };
|
|
268
|
+
}
|
|
269
|
+
},
|
|
270
|
+
});
|
|
271
|
+
//# sourceMappingURL=split.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"split.js","sourceRoot":"","sources":["../../../../src/agent/wallet/split.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export declare const SWAP_FALLS_OVER = 120;
|
|
2
|
+
export declare const PAY_TO = "the wallet that receives what is bought, such as someone this wallet pays; default this wallet. This wallet pays for its token account if it has none";
|
|
3
|
+
export declare const walletSwap: import("../actions.js").AnyAction;
|
|
4
|
+
export declare const MAX_RECURRING = 12;
|
|
5
|
+
export declare const mayHaveLanded: (sent: number, times: number, problem: string) => string;
|
|
6
|
+
export declare const partlySent: (sent: number, times: number, problem: string) => string;
|
|
7
|
+
export declare const WARN_EARLY = "an order fills before its turn if a solver can already pay its start_receive";
|
|
8
|
+
export declare const NO_FALL = "must be more than 0, or the orders have no ask to fall";
|
|
9
|
+
export declare const MAX_EVERY: number;
|
|
10
|
+
export declare const walletRecurring: import("../actions.js").AnyAction;
|
|
11
|
+
export declare const walletAuction: import("../actions.js").AnyAction;
|
|
12
|
+
export declare const ESTIMATE_NEXT = "solvers pay the least an intent asks, so these fills show what owners asked and got, not the most a solver would pay; ask a minimum near receive_at_median, since a single fill can be staged by one party on both sides, or auction from a little above it down to the least the user accepts to find the price";
|
|
13
|
+
export declare const NO_FILLS: string;
|
|
14
|
+
export declare const walletEstimate: import("../actions.js").AnyAction;
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
import { formatAmount, formatTime, LONG_LIVED_SECONDS, WARN_LONG_LIVED } from "@intent-engine/core";
|
|
2
|
+
import { chainTime, mintOf } from "@intent-engine/client";
|
|
3
|
+
import { TOKEN_NAMES } from "../../tokens.js";
|
|
4
|
+
import { define } from "../actions.js";
|
|
5
|
+
import { MAX_EXPIRES_IN, MIN_EXPIRES_IN } from "../create.js";
|
|
6
|
+
import { tool } from "../names.js";
|
|
7
|
+
import { problemOf } from "../problems.js";
|
|
8
|
+
import { InvalidInput, account, amount, flag, integer, list, object, optional, text, time } from "../schema.js";
|
|
9
|
+
import { ESTIMATE_SCAN, ESTIMATE_FILLS, DEFAULT_EXPIRES_IN, LANDING_SECONDS, access, testCluster, mintNamed, raw, salesOf, checkSale, checkHour, refusedBeforeSending, } from "./guard.js";
|
|
10
|
+
import { offerFields, offerOutput, offered } from "./offer.js";
|
|
11
|
+
import { recentFills, bestOf, medianOf, openingAsk } from "./fills.js";
|
|
12
|
+
export const SWAP_FALLS_OVER = 120;
|
|
13
|
+
export const PAY_TO = "the wallet that receives what is bought, such as someone this wallet pays; default this wallet. This wallet pays for its token account if it has none";
|
|
14
|
+
export const walletSwap = define({
|
|
15
|
+
name: tool("wallet_swap"),
|
|
16
|
+
title: "Swap from the wallet",
|
|
17
|
+
description: `Sell an exact amount of one token for at least min_receive of another, from this server's wallet: the tokens are escrowed in an intent that a solver fills or that the wallet gets back. Solvers pay the least an intent asks, so by default the ask starts at start_receive, a little above the median of recent fills but at least a quarter above min_receive and at most twice it, and falls to min_receive over falls_over seconds (default ${SWAP_FALLS_OVER}): a solver takes it near the most it can pay. exact: true asks min_receive from the start instead. Amounts are whole tokens such as 0.05. Selling SOL wraps it first. Without send it only previews; show the user the summary, then call again with send: true and the start_receive the preview returned once they approve.`,
|
|
18
|
+
effect: "submit",
|
|
19
|
+
repeats: true,
|
|
20
|
+
input: object({
|
|
21
|
+
sell: text("SOL, TEST or a mint address"),
|
|
22
|
+
buy: text("SOL, TEST or a mint address"),
|
|
23
|
+
amount: text("whole tokens to sell, such as 0.05"),
|
|
24
|
+
min_receive: text("least whole tokens to receive for all of it"),
|
|
25
|
+
start_receive: optional(text("whole tokens asked when the offer lands; default a little above the median recent fill, between 1.25 and 2 times min_receive")),
|
|
26
|
+
falls_over: optional(integer(MIN_EXPIRES_IN, MAX_EXPIRES_IN, `seconds the ask takes to fall to min_receive; default ${SWAP_FALLS_OVER}`)),
|
|
27
|
+
exact: optional(flag("true asks min_receive from the start, with no falling ask")),
|
|
28
|
+
pay_to: optional(account(PAY_TO)),
|
|
29
|
+
expires_in: optional(integer(MIN_EXPIRES_IN, MAX_EXPIRES_IN, `least seconds the offer stays open once sent; default ${DEFAULT_EXPIRES_IN}`)),
|
|
30
|
+
send: optional(flag("true signs and sends; leave out to preview")),
|
|
31
|
+
}),
|
|
32
|
+
output: object({ ...offerFields, start_receive: optional(text("whole tokens asked when the offer lands; pass it back when sending")) }),
|
|
33
|
+
run: async (ctx, input, call) => {
|
|
34
|
+
let opening;
|
|
35
|
+
const result = await offered(ctx, call, input, async (sold, bought, now, inputMint, outputMint) => {
|
|
36
|
+
const amountIn = raw(input.amount, sold.decimals, "amount");
|
|
37
|
+
const floor = raw(input.min_receive, bought.decimals, "min_receive");
|
|
38
|
+
const expiresIn = BigInt(input.expires_in ?? DEFAULT_EXPIRES_IN);
|
|
39
|
+
const ask = input.exact === true
|
|
40
|
+
? floor
|
|
41
|
+
: input.start_receive === undefined
|
|
42
|
+
? openingAsk(await recentFills(ctx.transport, inputMint, outputMint), amountIn, floor)
|
|
43
|
+
: raw(input.start_receive, bought.decimals, "start_receive");
|
|
44
|
+
if (ask <= floor) {
|
|
45
|
+
return { order: { kind: "swap", amount_in: amountIn, min_out: floor }, expires_at: now + expiresIn + BigInt(LANDING_SECONDS) };
|
|
46
|
+
}
|
|
47
|
+
opening = formatAmount(ask, bought.decimals);
|
|
48
|
+
const start = now + BigInt(LANDING_SECONDS);
|
|
49
|
+
const falls = BigInt(input.falls_over ?? SWAP_FALLS_OVER);
|
|
50
|
+
return {
|
|
51
|
+
order: { kind: "dutch", amount_in: amountIn, start_out: ask, end_out: floor, start_time: start, end_time: start + falls },
|
|
52
|
+
expires_at: start + (expiresIn > falls ? expiresIn : falls),
|
|
53
|
+
};
|
|
54
|
+
});
|
|
55
|
+
return opening === undefined ? result : { ...result, start_receive: opening };
|
|
56
|
+
},
|
|
57
|
+
});
|
|
58
|
+
export const MAX_RECURRING = 12;
|
|
59
|
+
export const mayHaveLanded = (sent, times, problem) => `${sent} of ${times} orders were sent and the next may have landed too (${problem}); check ${tool("wallet_intents")} before sending any again, and do not repeat this call`;
|
|
60
|
+
export const partlySent = (sent, times, problem) => `${sent} of ${times} orders were sent; the next failed with ${problem}. To finish, schedule only the ${times - sent} remaining orders; do not repeat this call`;
|
|
61
|
+
export const WARN_EARLY = "an order fills before its turn if a solver can already pay its start_receive";
|
|
62
|
+
export const NO_FALL = "must be more than 0, or the orders have no ask to fall";
|
|
63
|
+
export const MAX_EVERY = 30 * 24 * 60 * 60;
|
|
64
|
+
export const walletRecurring = define({
|
|
65
|
+
name: tool("wallet_recurring"),
|
|
66
|
+
title: "Repeat a swap on a schedule",
|
|
67
|
+
description: `Sell the same amount of one token for another several times, every so many seconds, from this server's wallet, with no bot left running: all orders are sent now and escrowed now. Each order holds its ask at start_receive until its turn, then lets it fall to min_receive over falls_over seconds; it expires when the next one opens, or falls_over seconds after its own opening if that is later, and anyone can then return its escrow. An order fills before its turn if a solver can already pay start_receive, so set it above what solvers pay now to hold the orders. Any order can be cancelled with ${tool("wallet_cancel")}. Each order pays the create fee and rent, and the rent returns when it closes. Amounts are whole tokens per order. Without send it only previews; show the user the summary, then call again with send: true and the start_receive the preview returned once they approve.`,
|
|
68
|
+
effect: "submit",
|
|
69
|
+
repeats: true,
|
|
70
|
+
input: object({
|
|
71
|
+
sell: text("SOL, TEST or a mint address"),
|
|
72
|
+
buy: text("SOL, TEST or a mint address"),
|
|
73
|
+
amount: text("whole tokens each order sells, such as 0.05"),
|
|
74
|
+
min_receive: text("least whole tokens each order receives"),
|
|
75
|
+
every: integer(MIN_EXPIRES_IN, MAX_EVERY, "seconds between one order opening and the next"),
|
|
76
|
+
times: integer(2, MAX_RECURRING, "how many orders"),
|
|
77
|
+
start_receive: optional(text("whole tokens each order asks until and when it opens; default a little above the median recent fill, between 1.25 and 2 times min_receive")),
|
|
78
|
+
falls_over: optional(integer(MIN_EXPIRES_IN, MAX_EVERY, `seconds each order's ask takes to fall to min_receive; default ${SWAP_FALLS_OVER}`)),
|
|
79
|
+
pay_to: optional(account(PAY_TO)),
|
|
80
|
+
send: optional(flag("true signs and sends every order; leave out to preview")),
|
|
81
|
+
}),
|
|
82
|
+
output: object({
|
|
83
|
+
orders: list(object({ opens_at: time("when the order's ask starts to fall"), intent: optional(account()), nonce: optional(amount()), signature: optional(text()) }), MAX_RECURRING),
|
|
84
|
+
summary: list(text(), 24, "the whole plan, then the first order"),
|
|
85
|
+
warnings: list(text(), 16),
|
|
86
|
+
start_receive: text("whole tokens each order asks when it opens; pass it back when sending"),
|
|
87
|
+
sent: flag(),
|
|
88
|
+
next: optional(text()),
|
|
89
|
+
}),
|
|
90
|
+
run: async (ctx, input, call) => {
|
|
91
|
+
const wallet = access(ctx);
|
|
92
|
+
const inputMint = mintNamed(input.sell, wallet.url, "sell");
|
|
93
|
+
const outputMint = mintNamed(input.buy, wallet.url, "buy");
|
|
94
|
+
const [inputToken, outputToken, now] = await Promise.all([
|
|
95
|
+
mintOf(ctx.transport, inputMint),
|
|
96
|
+
mintOf(ctx.transport, outputMint),
|
|
97
|
+
chainTime(ctx.transport),
|
|
98
|
+
]);
|
|
99
|
+
const amountIn = raw(input.amount, inputToken.decimals, "amount");
|
|
100
|
+
const floor = raw(input.min_receive, outputToken.decimals, "min_receive");
|
|
101
|
+
const ask = input.start_receive === undefined
|
|
102
|
+
? openingAsk(await recentFills(ctx.transport, inputMint, outputMint), amountIn, floor)
|
|
103
|
+
: raw(input.start_receive, outputToken.decimals, "start_receive");
|
|
104
|
+
if (ask <= floor) {
|
|
105
|
+
throw new InvalidInput([
|
|
106
|
+
input.start_receive === undefined ? { path: "min_receive", message: NO_FALL } : { path: "start_receive", message: "must be more than min_receive, or the order has no ask to fall" },
|
|
107
|
+
]);
|
|
108
|
+
}
|
|
109
|
+
const sales = await salesOf(wallet, now);
|
|
110
|
+
checkSale(wallet.limits, inputMint, inputToken.decimals, amountIn, now, sales);
|
|
111
|
+
checkHour(wallet.limits, inputMint, inputToken.decimals, amountIn * BigInt(input.times), now, sales);
|
|
112
|
+
const falls = BigInt(input.falls_over ?? SWAP_FALLS_OVER);
|
|
113
|
+
const every = BigInt(input.every);
|
|
114
|
+
const life = falls > every ? falls : every;
|
|
115
|
+
const opens = Array.from({ length: input.times }, (_, k) => now + BigInt(LANDING_SECONDS) + every * BigInt(k));
|
|
116
|
+
const terms = (open) => () => ({
|
|
117
|
+
order: { kind: "dutch", amount_in: amountIn, start_out: ask, end_out: floor, start_time: open, end_time: open + falls },
|
|
118
|
+
expires_at: open + life,
|
|
119
|
+
});
|
|
120
|
+
const shown = { start_receive: formatAmount(ask, outputToken.decimals) };
|
|
121
|
+
const last = opens[opens.length - 1];
|
|
122
|
+
const first = (await offered(ctx, call, { ...input, send: input.send }, terms(opens[0])));
|
|
123
|
+
const sold = TOKEN_NAMES[inputMint] ?? inputMint;
|
|
124
|
+
const plan = [
|
|
125
|
+
`Plan: ${input.times} orders of ${formatAmount(amountIn, inputToken.decimals)} of ${sold}, ${formatAmount(amountIn * BigInt(input.times), inputToken.decimals)} of ${sold} in all, escrowed now`,
|
|
126
|
+
`Schedule: the orders open from ${formatTime(opens[0])} to ${formatTime(last)}; the last expires ${formatTime(last + life)}`,
|
|
127
|
+
...first["summary"],
|
|
128
|
+
];
|
|
129
|
+
const warned = first["warnings"];
|
|
130
|
+
const warnings = [
|
|
131
|
+
...warned,
|
|
132
|
+
WARN_EARLY,
|
|
133
|
+
...(last + life - now > LONG_LIVED_SECONDS && !warned.includes(WARN_LONG_LIVED) ? [WARN_LONG_LIVED] : []),
|
|
134
|
+
];
|
|
135
|
+
if (input.send !== true) {
|
|
136
|
+
return { orders: opens.map((opens_at) => ({ opens_at })), summary: plan, warnings, ...shown, sent: false, next: first["next"] };
|
|
137
|
+
}
|
|
138
|
+
const orders = [{ opens_at: opens[0], intent: first["intent"], nonce: first["nonce"], signature: first["signature"] }];
|
|
139
|
+
for (const open of opens.slice(1)) {
|
|
140
|
+
try {
|
|
141
|
+
const made = (await offered(ctx, call, { ...input, send: true }, terms(open)));
|
|
142
|
+
orders.push({ opens_at: open, intent: made["intent"], nonce: made["nonce"], signature: made["signature"] });
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
for (const undo of call.undo.splice(0)) {
|
|
146
|
+
undo();
|
|
147
|
+
}
|
|
148
|
+
const problem = problemOf(error);
|
|
149
|
+
return {
|
|
150
|
+
orders: [...orders, ...opens.slice(orders.length).map((opens_at) => ({ opens_at }))],
|
|
151
|
+
summary: plan,
|
|
152
|
+
warnings,
|
|
153
|
+
...shown,
|
|
154
|
+
sent: true,
|
|
155
|
+
next: refusedBeforeSending(error)
|
|
156
|
+
? partlySent(orders.length, input.times, `${problem.code}: ${problem.hint}`)
|
|
157
|
+
: mayHaveLanded(orders.length, input.times, `${problem.code}: ${problem.hint}`),
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
return { orders, summary: plan, warnings, ...shown, sent: true };
|
|
162
|
+
},
|
|
163
|
+
});
|
|
164
|
+
export const walletAuction = define({
|
|
165
|
+
name: tool("wallet_auction"),
|
|
166
|
+
title: "Auction from the wallet",
|
|
167
|
+
description: "Offer an exact amount of one token in a Dutch auction from this server's wallet: the least it accepts starts at start_receive once the offer lands, falls in a straight line to end_receive over falls_over seconds, then stays there until it expires, so a solver fills it as soon as the asked amount meets what it can pay. Amounts are whole tokens such as 0.05. Selling SOL wraps it first. Without send it only previews; show the user the summary and call again with send: true once they approve.",
|
|
168
|
+
effect: "submit",
|
|
169
|
+
repeats: true,
|
|
170
|
+
input: object({
|
|
171
|
+
sell: text("SOL, TEST or a mint address"),
|
|
172
|
+
buy: text("SOL, TEST or a mint address"),
|
|
173
|
+
amount: text("whole tokens to sell, such as 0.05"),
|
|
174
|
+
start_receive: text("whole tokens asked when the auction starts; at least end_receive"),
|
|
175
|
+
end_receive: text("least whole tokens accepted once the asked amount stops falling"),
|
|
176
|
+
falls_over: integer(MIN_EXPIRES_IN, MAX_EXPIRES_IN, "seconds the asked amount takes to fall from start_receive to end_receive"),
|
|
177
|
+
expires_in: optional(integer(MIN_EXPIRES_IN, MAX_EXPIRES_IN, `least seconds the offer stays open once sent, never less than falls_over; default ${DEFAULT_EXPIRES_IN}`)),
|
|
178
|
+
pay_to: optional(account(PAY_TO)),
|
|
179
|
+
send: optional(flag("true signs and sends; leave out to preview")),
|
|
180
|
+
}),
|
|
181
|
+
output: offerOutput,
|
|
182
|
+
run: async (ctx, input, call) => offered(ctx, call, input, (sold, bought, now) => {
|
|
183
|
+
const start = now + BigInt(LANDING_SECONDS);
|
|
184
|
+
return {
|
|
185
|
+
order: {
|
|
186
|
+
kind: "dutch",
|
|
187
|
+
amount_in: raw(input.amount, sold.decimals, "amount"),
|
|
188
|
+
start_out: raw(input.start_receive, bought.decimals, "start_receive"),
|
|
189
|
+
end_out: raw(input.end_receive, bought.decimals, "end_receive"),
|
|
190
|
+
start_time: start,
|
|
191
|
+
end_time: start + BigInt(input.falls_over),
|
|
192
|
+
},
|
|
193
|
+
expires_at: start + BigInt(Math.max(input.expires_in ?? DEFAULT_EXPIRES_IN, input.falls_over)),
|
|
194
|
+
};
|
|
195
|
+
}),
|
|
196
|
+
});
|
|
197
|
+
export const ESTIMATE_NEXT = "solvers pay the least an intent asks, so these fills show what owners asked and got, not the most a solver would pay; ask a minimum near receive_at_median, since a single fill can be staged by one party on both sides, or auction from a little above it down to the least the user accepts to find the price";
|
|
198
|
+
export const NO_FILLS = `no recent fill sold this token for that one; auction from a high ask down to the least the user accepts with ${tool("wallet_auction")} to find the price`;
|
|
199
|
+
export const walletEstimate = define({
|
|
200
|
+
name: tool("wallet_estimate"),
|
|
201
|
+
title: "Estimate a swap from recent fills",
|
|
202
|
+
description: `Estimate what selling an amount of one token for another gets now, from the rates of recent fills of the same pair on this cluster. It reads the engine's last ${ESTIMATE_SCAN} transactions and sends nothing. Use it before ${tool("wallet_swap")} or ${tool("wallet_auction")} to pick min_receive or the auction's start and end.`,
|
|
203
|
+
effect: "read",
|
|
204
|
+
input: object({
|
|
205
|
+
sell: text("SOL, TEST or a mint address"),
|
|
206
|
+
buy: text("SOL, TEST or a mint address"),
|
|
207
|
+
amount: text("whole tokens to sell, such as 0.05"),
|
|
208
|
+
}),
|
|
209
|
+
output: object({
|
|
210
|
+
fills: list(object({
|
|
211
|
+
sold: text("whole tokens of the sold token"),
|
|
212
|
+
received: text("whole tokens the owner received"),
|
|
213
|
+
at: optional(time("when the fill landed")),
|
|
214
|
+
signature: text(),
|
|
215
|
+
}), ESTIMATE_FILLS, "newest first"),
|
|
216
|
+
receive_at_best: optional(text("whole tokens amount would get at the best recent rate; one fill can be staged by its own two sides")),
|
|
217
|
+
receive_at_median: optional(text("whole tokens amount would get at the median recent rate")),
|
|
218
|
+
receive_at_latest: optional(text("whole tokens amount would get at the newest fill's rate")),
|
|
219
|
+
next: text(),
|
|
220
|
+
}),
|
|
221
|
+
run: async (ctx, input) => {
|
|
222
|
+
const wallet = await testCluster(ctx);
|
|
223
|
+
const inputMint = mintNamed(input.sell, wallet.url, "sell");
|
|
224
|
+
const outputMint = mintNamed(input.buy, wallet.url, "buy");
|
|
225
|
+
const [inputToken, outputToken] = await Promise.all([mintOf(ctx.transport, inputMint), mintOf(ctx.transport, outputMint)]);
|
|
226
|
+
const amount = raw(input.amount, inputToken.decimals, "amount");
|
|
227
|
+
const matching = await recentFills(ctx.transport, inputMint, outputMint);
|
|
228
|
+
const shown = matching.map((f) => ({
|
|
229
|
+
sold: formatAmount(f.amountIn, inputToken.decimals),
|
|
230
|
+
received: formatAmount(f.delivered, outputToken.decimals),
|
|
231
|
+
...(f.blockTime === null ? {} : { at: f.blockTime }),
|
|
232
|
+
signature: f.signature,
|
|
233
|
+
}));
|
|
234
|
+
const [latest] = matching;
|
|
235
|
+
if (latest === undefined) {
|
|
236
|
+
return { fills: shown, next: NO_FILLS };
|
|
237
|
+
}
|
|
238
|
+
const best = bestOf(matching) ?? latest;
|
|
239
|
+
const at = (f) => formatAmount((amount * f.delivered) / f.amountIn, outputToken.decimals);
|
|
240
|
+
return { fills: shown, receive_at_best: at(best), receive_at_median: at(medianOf(matching) ?? latest), receive_at_latest: at(latest), next: ESTIMATE_NEXT };
|
|
241
|
+
},
|
|
242
|
+
});
|
|
243
|
+
//# sourceMappingURL=trade.js.map
|