@intent-engine/client 0.1.26 → 0.1.28

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 (50) 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/client-claims.d.ts +15 -0
  5. package/dist/src/client-claims.js +38 -0
  6. package/dist/src/client-claims.js.map +1 -0
  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 +5 -0
  11. package/dist/src/client-errors.js +10 -0
  12. package/dist/src/client-errors.js.map +1 -1
  13. package/dist/src/client-intents.js +9 -2
  14. package/dist/src/client-intents.js.map +1 -1
  15. package/dist/src/client-settle.d.ts +7 -2
  16. package/dist/src/client-settle.js +155 -59
  17. package/dist/src/client-settle.js.map +1 -1
  18. package/dist/src/client-types.d.ts +51 -1
  19. package/dist/src/client-types.js.map +1 -1
  20. package/dist/src/client.d.ts +4 -2
  21. package/dist/src/client.js +18 -2
  22. package/dist/src/client.js.map +1 -1
  23. package/dist/src/index.d.ts +2 -0
  24. package/dist/src/index.js +2 -0
  25. package/dist/src/index.js.map +1 -1
  26. package/dist/src/job-memos.d.ts +2 -1
  27. package/dist/src/job-memos.js +18 -5
  28. package/dist/src/job-memos.js.map +1 -1
  29. package/dist/src/jobs.d.ts +1 -1
  30. package/dist/src/jobs.js +1 -1
  31. package/dist/src/jobs.js.map +1 -1
  32. package/dist/src/reputation.d.ts +53 -0
  33. package/dist/src/reputation.js +176 -0
  34. package/dist/src/reputation.js.map +1 -0
  35. package/dist/src/simple-orders.d.ts +24 -0
  36. package/dist/src/simple-orders.js +101 -0
  37. package/dist/src/simple-orders.js.map +1 -0
  38. package/dist/src/simple-tokens.d.ts +19 -0
  39. package/dist/src/simple-tokens.js +84 -0
  40. package/dist/src/simple-tokens.js.map +1 -0
  41. package/dist/src/simple-types.d.ts +111 -0
  42. package/dist/src/simple-types.js +2 -0
  43. package/dist/src/simple-types.js.map +1 -0
  44. package/dist/src/simple-work.d.ts +12 -0
  45. package/dist/src/simple-work.js +69 -0
  46. package/dist/src/simple-work.js.map +1 -0
  47. package/dist/src/simple.d.ts +6 -0
  48. package/dist/src/simple.js +53 -0
  49. package/dist/src/simple.js.map +1 -0
  50. package/package.json +3 -3
@@ -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":"AAAA,OAAO,EAAgB,SAAS,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAI1G,MAAM,CAAC,MAAM,YAAY,GAAsC;IAC7D,MAAM,EAAE,+BAA+B;IACvC,OAAO,EAAE,gCAAgC;IACzC,OAAO,EAAE,qCAAqC;IAC9C,QAAQ,EAAE,uBAAuB;CAClC,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG,mEAAmE,CAAC;AAEnG,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IACjC,GAAG,CAAS;IAErB,YAAY,GAAW;QACrB,KAAK,CAAC,GAAG,GAAG,KAAK,eAAe,EAAE,CAAC,CAAC;QACpC,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;QAChC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;IACjB,CAAC;CACF;AAED,MAAM,UAAU,UAAU,CAAC,OAAoE;IAC7F,IAAI,OAAO,CAAC,GAAG,KAAK,SAAS,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QAC/D,MAAM,IAAI,SAAS,CAAC,+BAA+B,CAAC,CAAC;IACvD,CAAC;IACD,IAAI,OAAO,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;QAC9B,OAAO,OAAO,CAAC,GAAG,CAAC;IACrB,CAAC;IACD,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,IAAI,CAAC,CAAC,OAAO,CAAC,OAAO,IAAI,YAAY,CAAC,EAAE,CAAC;QACxE,MAAM,IAAI,SAAS,CAAC,kCAAkC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChG,CAAC;IACD,OAAO,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAa,EAAE,GAAW;IACpD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC1B,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,KAAK,EAAE,CAAC;QACjC,OAAO,WAAW,CAAC;IACrB,CAAC;IACD,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,MAAM,EAAE,CAAC;QAClC,IAAI,GAAG,KAAK,YAAY,CAAC,MAAM,EAAE,CAAC;YAChC,MAAM,IAAI,UAAU,CAAC,wCAAwC,GAAG,gCAAgC,CAAC,CAAC;QACpG,CAAC;QACD,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IACD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,UAAU,CAAC,GAAG,KAAK,2CAA2C,CAAC,CAAC;IAC5E,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,IAAa,EAAU,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;AAE7E,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,QAAgB,EAAE,KAAK,GAAG,QAAQ;IAC1E,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,QAAQ,CAAC,CAAC;IAC3C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,UAAU,CAAC,GAAG,KAAK,KAAK,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC9F,CAAC;IACD,IAAI,GAAG,KAAK,EAAE,EAAE,CAAC;QACf,MAAM,IAAI,UAAU,CAAC,GAAG,KAAK,KAAK,IAAI,sBAAsB,CAAC,CAAC;IAChE,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,GAAW,EAAE,QAAgB,EAAE,IAAa,EAAU,EAAE,CAAC,GAAG,YAAY,CAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;AAE1I,MAAM,UAAU,SAAS,CAAC,KAAkC,EAAE,QAAgB;IAC5E,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9D,MAAM,IAAI,UAAU,CAAC,aAAa,KAAK,mCAAmC,CAAC,CAAC;IAC9E,CAAC;IACD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,QAA6B;IACzD,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACjC,IAAI,QAAQ,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;YAC3B,MAAM,IAAI,UAAU,CAAC,2BAA2B,CAAC,CAAC;QACpD,CAAC;QACD,OAAO,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACnC,CAAC;IACD,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC1C,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,UAAU,CAAC,4CAA4C,CAAC,CAAC;IACrE,CAAC;IACD,OAAO,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;AACtF,CAAC;AAED,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,KAAiB,EAAU,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC"}
@@ -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
+ };
@@ -0,0 +1,69 @@
1
+ import { isKeyPairSigner } from "@solana/kit";
2
+ import { formatAmount, isSha256Hex } from "@intent-engine/core";
3
+ import { NotSettleable } from "./client-errors.js";
4
+ import { intentAt } from "./jobs.js";
5
+ import { outcome } from "./simple-orders.js";
6
+ import { nameOfMint, wholeTokens } from "./simple-tokens.js";
7
+ export const RELEASE_NEEDS_KEY_PAIR = "release signs the judge's verdict, so connect with a key pair signer";
8
+ export function workSends(ctx) {
9
+ const held = async (address) => {
10
+ const intent = await intentAt(ctx.client.transport, address);
11
+ if (intent === null) {
12
+ throw new NotSettleable(address, "is not an intent account of the engine");
13
+ }
14
+ return { intent, mint: await ctx.client.mint(intent.inputMint) };
15
+ };
16
+ const findWork = async (filter = {}) => {
17
+ const jobs = await ctx.client.jobs(filter.judge === undefined ? {} : { attestor: filter.judge });
18
+ return Promise.all(jobs.map(async (job) => {
19
+ const { decimals } = await ctx.client.mint(job.inputMint);
20
+ return { ...job, amount: formatAmount(job.sells, decimals), fee: formatAmount(job.judgeFee, decimals), token: nameOfMint(job.inputMint) };
21
+ }));
22
+ };
23
+ const deliver = async (input) => {
24
+ if (!isSha256Hex(input.sha256.trim().toLowerCase())) {
25
+ throw new RangeError("sha256 must be 64 hex digits");
26
+ }
27
+ const sha256 = input.sha256.trim().toLowerCase();
28
+ const summary = `Deliver work ${sha256} at ${input.url} for escrow ${input.escrow}`;
29
+ return outcome(ctx, input.preview, summary, async (client) => ({
30
+ signature: await client.deliver({ worker: ctx.signer, intent: input.escrow, sha256, url: input.url }),
31
+ }));
32
+ };
33
+ const release = async (input) => {
34
+ const judge = ctx.signer;
35
+ if (!isKeyPairSigner(judge)) {
36
+ throw new TypeError(RELEASE_NEEDS_KEY_PAIR);
37
+ }
38
+ const { intent, mint } = await held(input.escrow);
39
+ const result = BigInt(input.result ?? 1n);
40
+ const summary = `Release escrow ${input.escrow} holding ${wholeTokens(intent.escrowed - intent.filled, mint.decimals, intent.inputMint)} to ${input.to} for work ${input.deliveredSha256.toLowerCase()}`;
41
+ return outcome(ctx, input.preview, summary, async (client) => ({
42
+ signature: await client.settleProof({
43
+ judge,
44
+ owner: intent.owner,
45
+ nonce: intent.nonce,
46
+ payTo: input.to,
47
+ result,
48
+ deliveredSha256: input.deliveredSha256,
49
+ }),
50
+ intent: input.escrow,
51
+ nonce: intent.nonce,
52
+ }));
53
+ };
54
+ const cancel = async (input) => {
55
+ const address = input.escrow ?? input.intent;
56
+ const { intent, mint } = await held(address);
57
+ if (intent.owner !== ctx.signer.address) {
58
+ throw new RangeError(`intent ${address} belongs to ${intent.owner}, not to ${ctx.signer.address}`);
59
+ }
60
+ const summary = `Cancel ${address} and return ${wholeTokens(intent.escrowed - intent.filled, mint.decimals, intent.inputMint)} to ${ctx.signer.address}`;
61
+ return outcome(ctx, input.preview, summary, async (client) => ({
62
+ signature: await client.cancel(ctx.signer, intent.nonce),
63
+ intent: address,
64
+ nonce: intent.nonce,
65
+ }));
66
+ };
67
+ return { findWork, deliver, release, cancel };
68
+ }
69
+ //# sourceMappingURL=simple-work.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"simple-work.js","sourceRoot":"","sources":["../../src/simple-work.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { ConnectOptions, SimpleClient } from "./simple-types.js";
2
+ export type { CancelInput, ConnectOptions, DeliverWorkInput, HeldToken, LimitInput, OpenWork, Outcome, PayForWorkInput, Preview, ReleaseInput, Seconds, Sent, SimpleClient, SwapInput, WalletBalance, } from "./simple-types.js";
3
+ export { ESCROW_EXPIRES_IN, PREVIEW_SIGNATURE, RECORD_TOKEN_NEEDED } from "./simple-orders.js";
4
+ export { RELEASE_NEEDS_KEY_PAIR } from "./simple-work.js";
5
+ export { type Cluster, CLUSTER_URLS, clusterUrl, MAINNET_REFUSED, MainnetNotAllowed, mintOfToken, tokenAmount, } from "./simple-tokens.js";
6
+ export declare function connect(options: ConnectOptions): Promise<SimpleClient>;
@@ -0,0 +1,53 @@
1
+ import { formatAmount, NATIVE_MINT } from "@intent-engine/core";
2
+ import { createClient } from "./client.js";
3
+ import { MAINNET_GENESIS_HASH } from "./jobs.js";
4
+ import { orderSends } from "./simple-orders.js";
5
+ import { CLUSTER_URLS, clusterUrl, MainnetNotAllowed, mintOfToken, nameOfMint, wholeTokens } from "./simple-tokens.js";
6
+ import { workSends } from "./simple-work.js";
7
+ export { ESCROW_EXPIRES_IN, PREVIEW_SIGNATURE, RECORD_TOKEN_NEEDED } from "./simple-orders.js";
8
+ export { RELEASE_NEEDS_KEY_PAIR } from "./simple-work.js";
9
+ export { CLUSTER_URLS, clusterUrl, MAINNET_REFUSED, MainnetNotAllowed, mintOfToken, tokenAmount, } from "./simple-tokens.js";
10
+ const SOL_DECIMALS = 9;
11
+ export async function connect(options) {
12
+ const url = clusterUrl(options);
13
+ const { signer } = options;
14
+ const clientOptions = {
15
+ url,
16
+ ...(options.transport === undefined ? {} : { transport: options.transport }),
17
+ ...(options.priority === undefined ? {} : { priority: options.priority }),
18
+ };
19
+ const client = createClient(clientOptions);
20
+ if (options.allowMainnet !== true && (await client.transport.genesisHash()) === MAINNET_GENESIS_HASH) {
21
+ throw new MainnetNotAllowed(url);
22
+ }
23
+ const ctx = { url, signer, client, options: clientOptions };
24
+ const { swap, limit, payForWork } = orderSends(ctx);
25
+ const { findWork, deliver, release, cancel } = workSends(ctx);
26
+ const balance = async (tokens) => {
27
+ const named = tokens ?? (url === CLUSTER_URLS.devnet ? ["SOL", "TEST"] : ["SOL"]);
28
+ const mints = [...new Set(named.map((token) => mintOfToken(token, url)))];
29
+ const { sol, tokens: held } = await client.balances(signer.address, mints);
30
+ const listed = held.map(({ mint, account, amount, decimals }) => ({
31
+ token: nameOfMint(mint),
32
+ mint,
33
+ account,
34
+ amount: formatAmount(amount, decimals),
35
+ }));
36
+ const summary = [
37
+ `${wholeTokens(sol, SOL_DECIMALS, NATIVE_MINT)} in ${signer.address}`,
38
+ ...held.map(({ mint, amount, decimals }) => `${wholeTokens(amount, decimals, mint)}${mint === NATIVE_MINT ? " wrapped" : ""}`),
39
+ ].join(", ");
40
+ return { sol: formatAmount(sol, SOL_DECIMALS), tokens: listed, summary };
41
+ };
42
+ const send = { swap, limit, payForWork, deliver, release, cancel };
43
+ return {
44
+ url,
45
+ signer,
46
+ client,
47
+ balance,
48
+ ...send,
49
+ findWork,
50
+ watch: (onChange, signal, filter = { owner: signer.address }) => client.watch(onChange, signal, filter),
51
+ };
52
+ }
53
+ //# sourceMappingURL=simple.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"simple.js","sourceRoot":"","sources":["../../src/simple.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@intent-engine/client",
3
- "version": "0.1.26",
3
+ "version": "0.1.28",
4
4
  "description": "Runtime client for the intent engine on Solana: transport, confirmation, account readers and intent notifications",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
@@ -37,8 +37,8 @@
37
37
  "dependencies": {
38
38
  "@solana-program/system": "0.14.1",
39
39
  "@solana-program/token": "0.16.1",
40
- "@solana/kit": "^8.4.0",
41
- "@intent-engine/core": "0.1.26"
40
+ "@solana/kit": "8.4.0",
41
+ "@intent-engine/core": "0.1.28"
42
42
  },
43
43
  "peerDependencies": {
44
44
  "litesvm": "^1.5.0"