@intent-engine/client 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.
Files changed (99) hide show
  1. package/dist/src/accounts.d.ts +6 -0
  2. package/dist/src/accounts.js +15 -1
  3. package/dist/src/accounts.js.map +1 -1
  4. package/dist/src/budget.d.ts +6 -4
  5. package/dist/src/budget.js +24 -9
  6. package/dist/src/budget.js.map +1 -1
  7. package/dist/src/client-committee.d.ts +8 -0
  8. package/dist/src/client-committee.js +34 -0
  9. package/dist/src/client-committee.js.map +1 -0
  10. package/dist/src/client-errors.d.ts +33 -0
  11. package/dist/src/client-errors.js +65 -0
  12. package/dist/src/client-errors.js.map +1 -0
  13. package/dist/src/client-intents.d.ts +12 -0
  14. package/dist/src/client-intents.js +140 -0
  15. package/dist/src/client-intents.js.map +1 -0
  16. package/dist/src/client-reads.d.ts +7 -0
  17. package/dist/src/client-reads.js +61 -0
  18. package/dist/src/client-reads.js.map +1 -0
  19. package/dist/src/client-settle.d.ts +7 -0
  20. package/dist/src/client-settle.js +180 -0
  21. package/dist/src/client-settle.js.map +1 -0
  22. package/dist/src/client-types.d.ts +192 -0
  23. package/dist/src/client-types.js +9 -0
  24. package/dist/src/client-types.js.map +1 -0
  25. package/dist/src/client-watch.d.ts +4 -0
  26. package/dist/src/client-watch.js +97 -0
  27. package/dist/src/client-watch.js.map +1 -0
  28. package/dist/src/client.d.ts +5 -140
  29. package/dist/src/client.js +28 -309
  30. package/dist/src/client.js.map +1 -1
  31. package/dist/src/confirmation.d.ts +11 -0
  32. package/dist/src/confirmation.js +94 -0
  33. package/dist/src/confirmation.js.map +1 -0
  34. package/dist/src/index.d.ts +2 -0
  35. package/dist/src/index.js +2 -0
  36. package/dist/src/index.js.map +1 -1
  37. package/dist/src/intent-notifications.d.ts +13 -0
  38. package/dist/src/intent-notifications.js +106 -0
  39. package/dist/src/intent-notifications.js.map +1 -0
  40. package/dist/src/job-deliveries.d.ts +40 -0
  41. package/dist/src/job-deliveries.js +92 -0
  42. package/dist/src/job-deliveries.js.map +1 -0
  43. package/dist/src/job-memos.d.ts +17 -0
  44. package/dist/src/job-memos.js +64 -0
  45. package/dist/src/job-memos.js.map +1 -0
  46. package/dist/src/job-origins.d.ts +30 -0
  47. package/dist/src/job-origins.js +53 -0
  48. package/dist/src/job-origins.js.map +1 -0
  49. package/dist/src/job-proofs.d.ts +17 -0
  50. package/dist/src/job-proofs.js +54 -0
  51. package/dist/src/job-proofs.js.map +1 -0
  52. package/dist/src/job-scan.d.ts +20 -0
  53. package/dist/src/job-scan.js +70 -0
  54. package/dist/src/job-scan.js.map +1 -0
  55. package/dist/src/job-specs.d.ts +40 -0
  56. package/dist/src/job-specs.js +107 -0
  57. package/dist/src/job-specs.js.map +1 -0
  58. package/dist/src/jobs.d.ts +6 -77
  59. package/dist/src/jobs.js +6 -186
  60. package/dist/src/jobs.js.map +1 -1
  61. package/dist/src/memoized-transport.d.ts +4 -0
  62. package/dist/src/memoized-transport.js +66 -0
  63. package/dist/src/memoized-transport.js.map +1 -0
  64. package/dist/src/reputation.d.ts +53 -0
  65. package/dist/src/reputation.js +176 -0
  66. package/dist/src/reputation.js.map +1 -0
  67. package/dist/src/rpc-retry.d.ts +16 -0
  68. package/dist/src/rpc-retry.js +62 -0
  69. package/dist/src/rpc-retry.js.map +1 -0
  70. package/dist/src/rpc-shapes.d.ts +230 -0
  71. package/dist/src/rpc-shapes.js +2 -0
  72. package/dist/src/rpc-shapes.js.map +1 -0
  73. package/dist/src/rpc-transport.d.ts +6 -0
  74. package/dist/src/rpc-transport.js +236 -0
  75. package/dist/src/rpc-transport.js.map +1 -0
  76. package/dist/src/simple-orders.d.ts +24 -0
  77. package/dist/src/simple-orders.js +101 -0
  78. package/dist/src/simple-orders.js.map +1 -0
  79. package/dist/src/simple-tokens.d.ts +19 -0
  80. package/dist/src/simple-tokens.js +84 -0
  81. package/dist/src/simple-tokens.js.map +1 -0
  82. package/dist/src/simple-types.d.ts +111 -0
  83. package/dist/src/simple-types.js +2 -0
  84. package/dist/src/simple-types.js.map +1 -0
  85. package/dist/src/simple-work.d.ts +12 -0
  86. package/dist/src/simple-work.js +69 -0
  87. package/dist/src/simple-work.js.map +1 -0
  88. package/dist/src/simple.d.ts +6 -0
  89. package/dist/src/simple.js +53 -0
  90. package/dist/src/simple.js.map +1 -0
  91. package/dist/src/svm.js +83 -27
  92. package/dist/src/svm.js.map +1 -1
  93. package/dist/src/transaction-keys.d.ts +6 -0
  94. package/dist/src/transaction-keys.js +19 -0
  95. package/dist/src/transaction-keys.js.map +1 -0
  96. package/dist/src/transport.d.ts +7 -223
  97. package/dist/src/transport.js +6 -467
  98. package/dist/src/transport.js.map +1 -1
  99. package/package.json +17 -6
@@ -0,0 +1,236 @@
1
+ import { inspect } from "node:util";
2
+ import { appendTransactionMessageInstructions, createTransactionMessage, getBase64EncodedWireTransaction, pipe, setTransactionMessageFeePayerSigner, setTransactionMessageLifetimeUsingBlockhash, signTransactionMessageWithSigners, getBase58Decoder, getBase58Encoder, } from "@solana/kit";
3
+ import { getIntentDiscriminatorBytes, getIntentSize, INTENT_ENGINE_PROGRAM_ADDRESS } from "@intent-engine/core";
4
+ import { confirmSent } from "./confirmation.js";
5
+ import { patiently } from "./rpc-retry.js";
6
+ import { holdingsOf, keysAt, MEMO_PROGRAM_ADDRESS, signersAmong } from "./transaction-keys.js";
7
+ const INTENT_OWNER_OFFSET = 8n;
8
+ const withoutMark = ({ complete: _, ...found }) => found;
9
+ export const MULTIPLE_ACCOUNTS_LIMIT = 100;
10
+ function viewOf(value) {
11
+ return value === null
12
+ ? null
13
+ : { owner: value.owner, data: new Uint8Array(Buffer.from(value.data[0], "base64")), lamports: value.lamports, executable: value.executable };
14
+ }
15
+ export const TRANSACTION_FETCHES = 4;
16
+ export const KEPT_TRANSACTIONS = 256;
17
+ export function rpcTransport(rpc, wait, watch) {
18
+ const fetched = new Map();
19
+ let reached;
20
+ const atLeast = (floor) => {
21
+ const slot = floor === undefined || (reached !== undefined && reached > floor) ? reached : floor;
22
+ return slot === undefined ? {} : { minContextSlot: slot };
23
+ };
24
+ const confirmed = async (signature, lastValidBlockHeight) => {
25
+ const { slot } = await confirmSent(rpc, signature, lastValidBlockHeight, wait, watch);
26
+ if (slot !== undefined && (reached === undefined || slot > reached)) {
27
+ reached = slot;
28
+ }
29
+ return signature;
30
+ };
31
+ const read = (signature) => patiently(() => rpc
32
+ .getTransaction(signature, {
33
+ encoding: "json",
34
+ maxSupportedTransactionVersion: 0,
35
+ commitment: "confirmed",
36
+ })
37
+ .send(), wait);
38
+ const parsed = (entry, tx) => {
39
+ const keys = [
40
+ ...(tx?.transaction.message.accountKeys ?? []),
41
+ ...(tx?.meta?.loadedAddresses?.writable ?? []),
42
+ ...(tx?.meta?.loadedAddresses?.readonly ?? []),
43
+ ];
44
+ const inner = (tx?.meta?.innerInstructions ?? []).flatMap((group) => group.instructions).filter((ix) => keys[ix.programIdIndex] === INTENT_ENGINE_PROGRAM_ADDRESS);
45
+ const emitted = inner.map((ix) => Uint8Array.from(getBase58Encoder().encode(ix.data)));
46
+ const signing = tx?.transaction.message.header?.numRequiredSignatures ?? 0;
47
+ const memoInstructions = (tx?.transaction.message.instructions ?? []).filter((ix) => keys[ix.programIdIndex] === MEMO_PROGRAM_ADDRESS);
48
+ const memos = memoInstructions.map((ix) => new TextDecoder().decode(Uint8Array.from(getBase58Encoder().encode(ix.data))));
49
+ const memoSigners = memoInstructions.map((ix) => signersAmong(keys, ix.accounts ?? [], signing));
50
+ const feePayer = tx?.transaction.message.accountKeys[0];
51
+ const engineCalls = (tx?.transaction.message.instructions ?? []).filter((ix) => keys[ix.programIdIndex] === INTENT_ENGINE_PROGRAM_ADDRESS);
52
+ const called = engineCalls.map((ix) => Uint8Array.from(getBase58Encoder().encode(ix.data)));
53
+ const tokens = holdingsOf(keys, [...(tx?.meta?.preTokenBalances ?? []), ...(tx?.meta?.postTokenBalances ?? [])]);
54
+ return {
55
+ signature: entry.signature,
56
+ slot: entry.slot,
57
+ blockTime: entry.blockTime,
58
+ failed: entry.failed,
59
+ emitted,
60
+ ...(inner.length === 0 ? {} : { emittedAccounts: inner.map((ix) => keysAt(keys, ix.accounts ?? [])) }),
61
+ ...(memos.length === 0 ? {} : { memos, memoSigners }),
62
+ ...(feePayer === undefined ? {} : { feePayer }),
63
+ ...(called.length === 0 ? {} : { called, calledAccounts: engineCalls.map((ix) => keysAt(keys, ix.accounts ?? [])) }),
64
+ ...(tokens.length === 0 ? {} : { tokens }),
65
+ ...(tx?.meta === null || tx?.meta === undefined ? { unread: true } : {}),
66
+ complete: tx?.meta !== null && tx?.meta !== undefined && entry.blockTime !== null,
67
+ };
68
+ };
69
+ const load = async (entry) => parsed(entry, await read(entry.signature));
70
+ const fetchOne = (entry) => {
71
+ const known = fetched.get(entry.signature);
72
+ if (known !== undefined) {
73
+ fetched.delete(entry.signature);
74
+ fetched.set(entry.signature, known);
75
+ return known.then(withoutMark);
76
+ }
77
+ const pending = load(entry);
78
+ fetched.set(entry.signature, pending);
79
+ pending.then((found) => {
80
+ if (!found.complete && fetched.get(entry.signature) === pending) {
81
+ fetched.delete(entry.signature);
82
+ }
83
+ }, () => {
84
+ if (fetched.get(entry.signature) === pending) {
85
+ fetched.delete(entry.signature);
86
+ }
87
+ });
88
+ return pending.then(withoutMark);
89
+ };
90
+ const fetchAll = async (listed) => {
91
+ const found = [];
92
+ for (let i = 0; i < listed.length; i += TRANSACTION_FETCHES) {
93
+ found.push(...(await Promise.all(listed.slice(i, i + TRANSACTION_FETCHES).map(fetchOne))));
94
+ }
95
+ for (const old of fetched.keys()) {
96
+ if (fetched.size <= KEPT_TRANSACTIONS) {
97
+ break;
98
+ }
99
+ fetched.delete(old);
100
+ }
101
+ return found;
102
+ };
103
+ const firstBlock = rpc.getFirstAvailableBlock?.bind(rpc);
104
+ const listSignatures = async (of, limit, before) => {
105
+ const listed = await patiently(() => rpc.getSignaturesForAddress(of, { limit, ...(before === undefined ? {} : { before: before }), ...atLeast() }).send(), wait);
106
+ return listed.map((entry) => ({
107
+ signature: entry.signature,
108
+ slot: entry.slot,
109
+ blockTime: entry.blockTime,
110
+ failed: entry.err !== null,
111
+ memo: entry.memo ?? null,
112
+ }));
113
+ };
114
+ return {
115
+ async getAccount(address) {
116
+ const { value } = await patiently(() => rpc.getAccountInfo(address, { encoding: "base64", ...atLeast() }).send(), wait);
117
+ return viewOf(value);
118
+ },
119
+ async getAccounts(addresses) {
120
+ const found = [];
121
+ for (let at = 0; at < addresses.length; at += MULTIPLE_ACCOUNTS_LIMIT) {
122
+ const chunk = addresses.slice(at, at + MULTIPLE_ACCOUNTS_LIMIT);
123
+ const { value } = await patiently(() => rpc.getMultipleAccounts([...chunk], { encoding: "base64", ...atLeast() }).send(), wait);
124
+ found.push(...chunk.map((_, i) => viewOf(value[i] ?? null)));
125
+ }
126
+ return found;
127
+ },
128
+ async send(instructions, payer) {
129
+ const { value: latest } = await patiently(() => rpc.getLatestBlockhash().send(), wait);
130
+ const message = pipe(createTransactionMessage({ version: 0 }), (m) => setTransactionMessageFeePayerSigner(payer, m), (m) => setTransactionMessageLifetimeUsingBlockhash(latest, m), (m) => appendTransactionMessageInstructions(instructions, m));
131
+ const signed = await signTransactionMessageWithSigners(message);
132
+ const wire = getBase64EncodedWireTransaction(signed);
133
+ const signature = await patiently(() => rpc.sendTransaction(wire, { encoding: "base64" }).send(), wait);
134
+ return confirmed(signature, latest.lastValidBlockHeight);
135
+ },
136
+ async airdrop(address, lamports) {
137
+ const { value: latest } = await patiently(() => rpc.getLatestBlockhash().send(), wait);
138
+ const signature = await patiently(() => rpc.requestAirdrop(address, lamports).send(), wait);
139
+ return confirmed(signature, latest.lastValidBlockHeight);
140
+ },
141
+ async latestBlockhash() {
142
+ const { value } = await patiently(() => rpc.getLatestBlockhash().send(), wait);
143
+ return value;
144
+ },
145
+ async sendWire(wire, latest) {
146
+ const signature = await patiently(() => rpc.sendTransaction(wire, { encoding: "base64" }).send(), wait);
147
+ return confirmed(signature, latest.lastValidBlockHeight);
148
+ },
149
+ async submitWire(wire) {
150
+ return patiently(() => rpc.sendTransaction(wire, { encoding: "base64", skipPreflight: true }).send(), wait);
151
+ },
152
+ async simulate(wire, watch = []) {
153
+ const { value } = await patiently(() => rpc
154
+ .simulateTransaction(wire, {
155
+ encoding: "base64",
156
+ sigVerify: false,
157
+ replaceRecentBlockhash: true,
158
+ ...(watch.length === 0 ? {} : { accounts: { addresses: [...watch], encoding: "base64" } }),
159
+ })
160
+ .send(), wait);
161
+ return {
162
+ err: value.err === null ? null : inspect(value.err, { depth: null, breakLength: Infinity }),
163
+ logs: [...(value.logs ?? [])],
164
+ unitsConsumed: value.unitsConsumed ?? null,
165
+ accounts: watch.map((_, i) => {
166
+ const found = value.accounts?.[i];
167
+ return found === null || found === undefined ? null : new Uint8Array(Buffer.from(found.data[0], "base64"));
168
+ }),
169
+ };
170
+ },
171
+ async genesisHash() {
172
+ return patiently(() => rpc.getGenesisHash().send(), wait);
173
+ },
174
+ async recentFees(accounts) {
175
+ const fees = await patiently(() => rpc.getRecentPrioritizationFees(accounts).send(), wait);
176
+ return fees.map((f) => f.prioritizationFee);
177
+ },
178
+ async budget(instructions) {
179
+ return [...instructions];
180
+ },
181
+ async engineTransactions(limit, of, memo) {
182
+ const listed = await listSignatures(of ?? INTENT_ENGINE_PROGRAM_ADDRESS, limit);
183
+ return fetchAll(memo === undefined ? listed : listed.filter((entry) => (entry.memo ?? "").includes(memo)));
184
+ },
185
+ signaturesOf: (of, limit, before) => listSignatures(of, limit, before),
186
+ transactionsOf: (listed) => fetchAll(listed),
187
+ async transactionOf(signature) {
188
+ const tx = await read(signature);
189
+ if (tx === null) {
190
+ return null;
191
+ }
192
+ const failed = tx.meta !== null && tx.meta.err !== undefined && tx.meta.err !== null;
193
+ return withoutMark(parsed({ signature, slot: tx.slot ?? 0n, blockTime: tx.blockTime ?? null, failed, memo: null }, tx));
194
+ },
195
+ ...(firstBlock === undefined ? {} : { firstAvailableSlot: () => patiently(() => firstBlock().send(), wait) }),
196
+ async intents(owner, read) {
197
+ const least = atLeast(read?.minContextSlot);
198
+ const found = await patiently(async () => {
199
+ const response = await rpc
200
+ .getProgramAccounts(INTENT_ENGINE_PROGRAM_ADDRESS, {
201
+ encoding: "base64",
202
+ commitment: "confirmed",
203
+ filters: [
204
+ { dataSize: BigInt(getIntentSize()) },
205
+ {
206
+ memcmp: {
207
+ offset: 0n,
208
+ bytes: getBase58Decoder().decode(getIntentDiscriminatorBytes()),
209
+ encoding: "base58",
210
+ },
211
+ },
212
+ ...(owner === undefined
213
+ ? []
214
+ : [{ memcmp: { offset: INTENT_OWNER_OFFSET, bytes: owner, encoding: "base58" } }]),
215
+ ],
216
+ ...least,
217
+ ...(read === undefined ? {} : { withContext: true }),
218
+ })
219
+ .send();
220
+ if (!("context" in response)) {
221
+ return response;
222
+ }
223
+ if (least.minContextSlot !== undefined && response.context.slot < least.minContextSlot) {
224
+ throw new Error(`Minimum context slot has not been reached: the node read at slot ${response.context.slot}, below ${least.minContextSlot}`);
225
+ }
226
+ read?.onSlot?.(response.context.slot);
227
+ return response.value;
228
+ }, wait);
229
+ return found.map(({ pubkey, account }) => ({
230
+ address: pubkey,
231
+ data: new Uint8Array(Buffer.from(account.data[0], "base64")),
232
+ }));
233
+ },
234
+ };
235
+ }
236
+ //# sourceMappingURL=rpc-transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rpc-transport.js","sourceRoot":"","sources":["../../src/rpc-transport.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { Address, Signature, TransactionSigner } from "@solana/kit";
2
+ import { type Client, type ClientOptions } from "./client-types.js";
3
+ import type { LimitInput, PayForWorkInput, Preview, Sent, SwapInput } from "./simple-types.js";
4
+ export declare const ESCROW_EXPIRES_IN = 86400n;
5
+ export declare const PREVIEW_SIGNATURE: Signature;
6
+ export declare const RECORD_TOKEN_NEEDED = "paying in SOL off devnet needs recordToken: any other token, which only labels the escrow";
7
+ export type SimpleContext = {
8
+ url: string;
9
+ signer: TransactionSigner;
10
+ client: Client;
11
+ options: ClientOptions;
12
+ };
13
+ type Done = {
14
+ signature: Signature;
15
+ intent?: Address;
16
+ nonce?: bigint;
17
+ };
18
+ export declare function outcome(ctx: SimpleContext, preview: boolean | undefined, summary: string, act: (client: Client) => Promise<Done>): Promise<Sent | Preview>;
19
+ export declare function orderSends(ctx: SimpleContext): {
20
+ swap: (input: SwapInput) => Promise<Preview | Sent>;
21
+ limit: (input: LimitInput) => Promise<Preview | Sent>;
22
+ payForWork: (input: PayForWorkInput) => Promise<Preview | Sent>;
23
+ };
24
+ export {};
@@ -0,0 +1,101 @@
1
+ import { Kind, NATIVE_MINT } from "@intent-engine/core";
2
+ import { createClient } from "./client.js";
3
+ import { DEFAULT_EXPIRES_IN } from "./client-types.js";
4
+ import { boundMembers } from "./memoized-transport.js";
5
+ import { hexOf, mintOfToken, nameOfMint, secondsOf, specHashBytes, tokenAmount, wholeTokens } from "./simple-tokens.js";
6
+ export const ESCROW_EXPIRES_IN = 86400n;
7
+ export const PREVIEW_SIGNATURE = "1".repeat(64);
8
+ export const RECORD_TOKEN_NEEDED = "paying in SOL off devnet needs recordToken: any other token, which only labels the escrow";
9
+ function capturing(transport) {
10
+ const taken = [];
11
+ const refuse = async () => {
12
+ throw new Error("a preview sends nothing");
13
+ };
14
+ return {
15
+ taken,
16
+ transport: {
17
+ ...boundMembers(transport),
18
+ send: async (instructions) => {
19
+ taken.push(...instructions);
20
+ return PREVIEW_SIGNATURE;
21
+ },
22
+ sendWire: refuse,
23
+ submitWire: refuse,
24
+ airdrop: refuse,
25
+ },
26
+ };
27
+ }
28
+ export async function outcome(ctx, preview, summary, act) {
29
+ if (preview !== true) {
30
+ return { ...(await act(ctx.client)), summary };
31
+ }
32
+ const { transport, taken } = capturing(ctx.client.transport);
33
+ const { intent, nonce } = await act(createClient({ ...ctx.options, transport }));
34
+ return { summary, instructions: taken, ...(intent === undefined ? {} : { intent }), ...(nonce === undefined ? {} : { nonce }) };
35
+ }
36
+ async function pair(ctx, sell, buy) {
37
+ const inputMint = mintOfToken(sell, ctx.url);
38
+ const outputMint = mintOfToken(buy, ctx.url);
39
+ if (inputMint === outputMint) {
40
+ throw new RangeError("sell and buy name the same token");
41
+ }
42
+ const [sold, bought] = await Promise.all([ctx.client.mint(inputMint), ctx.client.mint(outputMint)]);
43
+ return { inputMint, outputMint, sold, bought };
44
+ }
45
+ function placed(ctx, params, inputMint, outputMint, expiresIn, specUrl) {
46
+ return (client) => client.createIntent({ signer: ctx.signer, params, inputMint, outputMint, expiresIn, ...(specUrl === undefined ? {} : { specUrl }) });
47
+ }
48
+ export function orderSends(ctx) {
49
+ const swap = async (input) => {
50
+ const { inputMint, outputMint, sold, bought } = await pair(ctx, input.sell, input.buy);
51
+ const amountIn = tokenAmount(input.amount, sold.decimals, "amount");
52
+ const minOut = tokenAmount(input.minReceive, bought.decimals, "minReceive");
53
+ const expiresIn = secondsOf(input.expiresIn, DEFAULT_EXPIRES_IN);
54
+ const summary = `Swap ${wholeTokens(amountIn, sold.decimals, inputMint)} for at least ${wholeTokens(minOut, bought.decimals, outputMint)}, open for ${expiresIn} seconds`;
55
+ return outcome(ctx, input.preview, summary, placed(ctx, { kind: Kind.SwapExactIn, amountIn, minOut }, inputMint, outputMint, expiresIn));
56
+ };
57
+ const limit = async (input) => {
58
+ const { inputMint, outputMint, sold, bought } = await pair(ctx, input.sell, input.buy);
59
+ const makeAmount = tokenAmount(input.amount, sold.decimals, "amount");
60
+ const price = tokenAmount(input.price, bought.decimals, "price");
61
+ const scale = 10n ** BigInt(sold.decimals);
62
+ const takeAmount = (makeAmount * price + scale - 1n) / scale;
63
+ const expiresIn = secondsOf(input.expiresIn, DEFAULT_EXPIRES_IN);
64
+ const summary = `Limit order: sell ${wholeTokens(makeAmount, sold.decimals, inputMint)} for at least ${wholeTokens(takeAmount, bought.decimals, outputMint)} (${input.price.trim()} ${nameOfMint(outputMint)} per ${nameOfMint(inputMint)}), open for ${expiresIn} seconds`;
65
+ return outcome(ctx, input.preview, summary, placed(ctx, { kind: Kind.LimitOrder, makeAmount, takeAmount }, inputMint, outputMint, expiresIn));
66
+ };
67
+ const recordMint = (paid, chosen) => {
68
+ if (chosen !== undefined) {
69
+ return mintOfToken(chosen, ctx.url);
70
+ }
71
+ if (paid !== NATIVE_MINT) {
72
+ return NATIVE_MINT;
73
+ }
74
+ try {
75
+ return mintOfToken("TEST", ctx.url);
76
+ }
77
+ catch {
78
+ throw new RangeError(RECORD_TOKEN_NEEDED);
79
+ }
80
+ };
81
+ const payForWork = async (input) => {
82
+ const inputMint = mintOfToken(input.token ?? "SOL", ctx.url);
83
+ const outputMint = recordMint(inputMint, input.recordToken);
84
+ if (inputMint === outputMint) {
85
+ throw new RangeError("recordToken must differ from the token paid");
86
+ }
87
+ const { decimals } = await ctx.client.mint(inputMint);
88
+ const amountIn = tokenAmount(input.amount, decimals, "amount");
89
+ const judgeFee = input.judgeFee === undefined ? 0n : tokenAmount(input.judgeFee, decimals, "judgeFee");
90
+ if (judgeFee >= amountIn) {
91
+ throw new RangeError("judgeFee must be below amount");
92
+ }
93
+ const specHash = specHashBytes(input.specHash);
94
+ const expiresIn = secondsOf(input.expiresIn, ESCROW_EXPIRES_IN);
95
+ const params = { kind: Kind.AttestedResult, amountIn, minResult: 1n, maxResult: 1n, attestor: input.judge, specHash, judgeFee };
96
+ const summary = `Pay ${wholeTokens(amountIn, decimals, inputMint)} for work judged by ${input.judge} against spec ${hexOf(specHash)}, judge fee ${wholeTokens(judgeFee, decimals, inputMint)}, open for ${expiresIn} seconds`;
97
+ return outcome(ctx, input.preview, summary, placed(ctx, params, inputMint, outputMint, expiresIn, input.specUrl));
98
+ };
99
+ return { swap, limit, payForWork };
100
+ }
101
+ //# sourceMappingURL=simple-orders.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"simple-orders.js","sourceRoot":"","sources":["../../src/simple-orders.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { type Address } from "@solana/kit";
2
+ export type Cluster = "devnet" | "testnet" | "mainnet" | "localnet";
3
+ export declare const CLUSTER_URLS: Readonly<Record<Cluster, string>>;
4
+ export declare const MAINNET_REFUSED = "this url serves mainnet; pass allowMainnet: true to connect to it";
5
+ export declare class MainnetNotAllowed extends Error {
6
+ readonly url: string;
7
+ constructor(url: string);
8
+ }
9
+ export declare function clusterUrl(options: {
10
+ cluster?: Cluster | undefined;
11
+ url?: string | undefined;
12
+ }): string;
13
+ export declare function mintOfToken(token: string, url: string): Address;
14
+ export declare const nameOfMint: (mint: Address) => string;
15
+ export declare function tokenAmount(text: string, decimals: number, field?: string): bigint;
16
+ export declare const wholeTokens: (raw: bigint, decimals: number, mint: Address) => string;
17
+ export declare function secondsOf(value: number | bigint | undefined, fallback: bigint): bigint;
18
+ export declare function specHashBytes(specHash: string | Uint8Array): Uint8Array;
19
+ export declare const hexOf: (bytes: Uint8Array) => string;
@@ -0,0 +1,84 @@
1
+ import { isAddress } from "@solana/kit";
2
+ import { DEVNET_TEST_MINT, formatAmount, NATIVE_MINT, parseAmount, tokenName } from "@intent-engine/core";
3
+ export const CLUSTER_URLS = {
4
+ devnet: "https://api.devnet.solana.com",
5
+ testnet: "https://api.testnet.solana.com",
6
+ mainnet: "https://api.mainnet-beta.solana.com",
7
+ localnet: "http://127.0.0.1:8899",
8
+ };
9
+ export const MAINNET_REFUSED = "this url serves mainnet; pass allowMainnet: true to connect to it";
10
+ export class MainnetNotAllowed extends Error {
11
+ url;
12
+ constructor(url) {
13
+ super(`${url}: ${MAINNET_REFUSED}`);
14
+ this.name = "MainnetNotAllowed";
15
+ this.url = url;
16
+ }
17
+ }
18
+ export function clusterUrl(options) {
19
+ if (options.url !== undefined && options.cluster !== undefined) {
20
+ throw new TypeError("pass cluster or url, not both");
21
+ }
22
+ if (options.url !== undefined) {
23
+ return options.url;
24
+ }
25
+ if (options.cluster === undefined || !(options.cluster in CLUSTER_URLS)) {
26
+ throw new TypeError(`pass url, or cluster as one of ${Object.keys(CLUSTER_URLS).join(", ")}`);
27
+ }
28
+ return CLUSTER_URLS[options.cluster];
29
+ }
30
+ export function mintOfToken(token, url) {
31
+ const name = token.trim();
32
+ if (name.toUpperCase() === "SOL") {
33
+ return NATIVE_MINT;
34
+ }
35
+ if (name.toUpperCase() === "TEST") {
36
+ if (url !== CLUSTER_URLS.devnet) {
37
+ throw new RangeError(`TEST names the devnet test token; on ${url} pass the token's mint address`);
38
+ }
39
+ return DEVNET_TEST_MINT;
40
+ }
41
+ if (!isAddress(name)) {
42
+ throw new RangeError(`${token} is not SOL, TEST or a token mint address`);
43
+ }
44
+ return name;
45
+ }
46
+ export const nameOfMint = (mint) => tokenName(mint) ?? mint;
47
+ export function tokenAmount(text, decimals, field = "amount") {
48
+ let raw;
49
+ try {
50
+ raw = parseAmount(text.trim(), decimals);
51
+ }
52
+ catch (error) {
53
+ throw new RangeError(`${field}: ${error instanceof Error ? error.message : String(error)}`);
54
+ }
55
+ if (raw === 0n) {
56
+ throw new RangeError(`${field}: ${text} must be more than 0`);
57
+ }
58
+ return raw;
59
+ }
60
+ export const wholeTokens = (raw, decimals, mint) => `${formatAmount(raw, decimals)} ${nameOfMint(mint)}`;
61
+ export function secondsOf(value, fallback) {
62
+ if (value === undefined) {
63
+ return fallback;
64
+ }
65
+ if (typeof value === "number" && !Number.isSafeInteger(value)) {
66
+ throw new RangeError(`expiresIn ${value} is not a whole number of seconds`);
67
+ }
68
+ return BigInt(value);
69
+ }
70
+ export function specHashBytes(specHash) {
71
+ if (typeof specHash !== "string") {
72
+ if (specHash.length !== 32) {
73
+ throw new RangeError("specHash must be 32 bytes");
74
+ }
75
+ return Uint8Array.from(specHash);
76
+ }
77
+ const hex = specHash.trim().toLowerCase();
78
+ if (!/^[0-9a-f]{64}$/.test(hex)) {
79
+ throw new RangeError("specHash must be a sha256 as 64 hex digits");
80
+ }
81
+ return Uint8Array.from(hex.match(/../g) ?? [], (pair) => Number.parseInt(pair, 16));
82
+ }
83
+ export const hexOf = (bytes) => Array.from(bytes, (b) => b.toString(16).padStart(2, "0")).join("");
84
+ //# sourceMappingURL=simple-tokens.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"simple-tokens.js","sourceRoot":"","sources":["../../src/simple-tokens.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,111 @@
1
+ import type { Address, Instruction, Signature, TransactionSigner } from "@solana/kit";
2
+ import type { Priority } from "./budget.js";
3
+ import type { Client, WatchCallback, WatchOptions } from "./client-types.js";
4
+ import type { Job } from "./jobs.js";
5
+ import type { Cluster } from "./simple-tokens.js";
6
+ import type { Transport } from "./transport.js";
7
+ export type ConnectOptions = ({
8
+ cluster: Cluster;
9
+ url?: undefined;
10
+ } | {
11
+ url: string;
12
+ cluster?: undefined;
13
+ }) & {
14
+ signer: TransactionSigner;
15
+ transport?: Transport;
16
+ priority?: Priority;
17
+ allowMainnet?: boolean;
18
+ };
19
+ export type Sent = {
20
+ signature: Signature;
21
+ intent?: Address;
22
+ nonce?: bigint;
23
+ summary: string;
24
+ };
25
+ export type Preview = {
26
+ summary: string;
27
+ instructions: Instruction[];
28
+ intent?: Address;
29
+ nonce?: bigint;
30
+ };
31
+ export type PreviewOption = {
32
+ preview?: boolean;
33
+ };
34
+ export type Outcome<I> = I extends {
35
+ preview: true;
36
+ } ? Preview : Sent;
37
+ export type Seconds = number | bigint;
38
+ export type SwapInput = PreviewOption & {
39
+ sell: string;
40
+ amount: string;
41
+ buy: string;
42
+ minReceive: string;
43
+ expiresIn?: Seconds;
44
+ };
45
+ export type LimitInput = PreviewOption & {
46
+ sell: string;
47
+ amount: string;
48
+ buy: string;
49
+ price: string;
50
+ expiresIn?: Seconds;
51
+ };
52
+ export type PayForWorkInput = PreviewOption & {
53
+ amount: string;
54
+ token?: string;
55
+ judge: Address;
56
+ specHash: string | Uint8Array;
57
+ specUrl?: string;
58
+ judgeFee?: string;
59
+ expiresIn?: Seconds;
60
+ recordToken?: string;
61
+ };
62
+ export type DeliverWorkInput = PreviewOption & {
63
+ escrow: Address;
64
+ sha256: string;
65
+ url: string;
66
+ };
67
+ export type ReleaseInput = PreviewOption & {
68
+ escrow: Address;
69
+ to: Address;
70
+ deliveredSha256: string;
71
+ result?: number | bigint;
72
+ };
73
+ export type CancelInput = PreviewOption & ({
74
+ escrow: Address;
75
+ intent?: undefined;
76
+ } | {
77
+ intent: Address;
78
+ escrow?: undefined;
79
+ });
80
+ export type HeldToken = {
81
+ token: string;
82
+ mint: Address;
83
+ account: Address;
84
+ amount: string;
85
+ };
86
+ export type WalletBalance = {
87
+ sol: string;
88
+ tokens: HeldToken[];
89
+ summary: string;
90
+ };
91
+ export type OpenWork = Job & {
92
+ amount: string;
93
+ fee: string;
94
+ token: string;
95
+ };
96
+ export type SimpleClient = {
97
+ readonly url: string;
98
+ readonly signer: TransactionSigner;
99
+ readonly client: Client;
100
+ balance(tokens?: readonly string[]): Promise<WalletBalance>;
101
+ swap<I extends SwapInput>(input: I): Promise<Outcome<I>>;
102
+ limit<I extends LimitInput>(input: I): Promise<Outcome<I>>;
103
+ payForWork<I extends PayForWorkInput>(input: I): Promise<Outcome<I>>;
104
+ findWork(filter?: {
105
+ judge?: Address;
106
+ }): Promise<OpenWork[]>;
107
+ deliver<I extends DeliverWorkInput>(input: I): Promise<Outcome<I>>;
108
+ release<I extends ReleaseInput>(input: I): Promise<Outcome<I>>;
109
+ cancel<I extends CancelInput>(input: I): Promise<Outcome<I>>;
110
+ watch(onChange: WatchCallback, signal: AbortSignal, filter?: WatchOptions): Promise<void>;
111
+ };
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=simple-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"simple-types.js","sourceRoot":"","sources":["../../src/simple-types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,12 @@
1
+ import { type Address } from "@solana/kit";
2
+ import { type SimpleContext } from "./simple-orders.js";
3
+ import type { CancelInput, DeliverWorkInput, OpenWork, ReleaseInput } from "./simple-types.js";
4
+ export declare const RELEASE_NEEDS_KEY_PAIR = "release signs the judge's verdict, so connect with a key pair signer";
5
+ export declare function workSends(ctx: SimpleContext): {
6
+ findWork: (filter?: {
7
+ judge?: Address;
8
+ }) => Promise<OpenWork[]>;
9
+ deliver: (input: DeliverWorkInput) => Promise<import("./simple-types.js").Preview | import("./simple-types.js").Sent>;
10
+ release: (input: ReleaseInput) => Promise<import("./simple-types.js").Preview | import("./simple-types.js").Sent>;
11
+ cancel: (input: CancelInput) => Promise<import("./simple-types.js").Preview | import("./simple-types.js").Sent>;
12
+ };