@intent-engine/client 0.1.22 → 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.
Files changed (76) hide show
  1. package/dist/src/budget.d.ts +6 -4
  2. package/dist/src/budget.js +24 -9
  3. package/dist/src/budget.js.map +1 -1
  4. package/dist/src/client-errors.d.ts +28 -0
  5. package/dist/src/client-errors.js +55 -0
  6. package/dist/src/client-errors.js.map +1 -0
  7. package/dist/src/client-intents.d.ts +12 -0
  8. package/dist/src/client-intents.js +133 -0
  9. package/dist/src/client-intents.js.map +1 -0
  10. package/dist/src/client-reads.d.ts +7 -0
  11. package/dist/src/client-reads.js +61 -0
  12. package/dist/src/client-reads.js.map +1 -0
  13. package/dist/src/client-settle.d.ts +2 -0
  14. package/dist/src/client-settle.js +84 -0
  15. package/dist/src/client-settle.js.map +1 -0
  16. package/dist/src/client-types.d.ts +145 -0
  17. package/dist/src/client-types.js +9 -0
  18. package/dist/src/client-types.js.map +1 -0
  19. package/dist/src/client-watch.d.ts +4 -0
  20. package/dist/src/client-watch.js +97 -0
  21. package/dist/src/client-watch.js.map +1 -0
  22. package/dist/src/client.d.ts +4 -126
  23. package/dist/src/client.js +20 -299
  24. package/dist/src/client.js.map +1 -1
  25. package/dist/src/confirmation.d.ts +11 -0
  26. package/dist/src/confirmation.js +94 -0
  27. package/dist/src/confirmation.js.map +1 -0
  28. package/dist/src/index.d.ts +1 -0
  29. package/dist/src/index.js +1 -0
  30. package/dist/src/index.js.map +1 -1
  31. package/dist/src/intent-notifications.d.ts +13 -0
  32. package/dist/src/intent-notifications.js +106 -0
  33. package/dist/src/intent-notifications.js.map +1 -0
  34. package/dist/src/job-deliveries.d.ts +40 -0
  35. package/dist/src/job-deliveries.js +92 -0
  36. package/dist/src/job-deliveries.js.map +1 -0
  37. package/dist/src/job-memos.d.ts +16 -0
  38. package/dist/src/job-memos.js +51 -0
  39. package/dist/src/job-memos.js.map +1 -0
  40. package/dist/src/job-origins.d.ts +30 -0
  41. package/dist/src/job-origins.js +53 -0
  42. package/dist/src/job-origins.js.map +1 -0
  43. package/dist/src/job-proofs.d.ts +17 -0
  44. package/dist/src/job-proofs.js +54 -0
  45. package/dist/src/job-proofs.js.map +1 -0
  46. package/dist/src/job-scan.d.ts +20 -0
  47. package/dist/src/job-scan.js +70 -0
  48. package/dist/src/job-scan.js.map +1 -0
  49. package/dist/src/job-specs.d.ts +40 -0
  50. package/dist/src/job-specs.js +107 -0
  51. package/dist/src/job-specs.js.map +1 -0
  52. package/dist/src/jobs.d.ts +6 -0
  53. package/dist/src/jobs.js +7 -0
  54. package/dist/src/jobs.js.map +1 -0
  55. package/dist/src/memoized-transport.d.ts +4 -0
  56. package/dist/src/memoized-transport.js +66 -0
  57. package/dist/src/memoized-transport.js.map +1 -0
  58. package/dist/src/rpc-retry.d.ts +16 -0
  59. package/dist/src/rpc-retry.js +62 -0
  60. package/dist/src/rpc-retry.js.map +1 -0
  61. package/dist/src/rpc-shapes.d.ts +230 -0
  62. package/dist/src/rpc-shapes.js +2 -0
  63. package/dist/src/rpc-shapes.js.map +1 -0
  64. package/dist/src/rpc-transport.d.ts +6 -0
  65. package/dist/src/rpc-transport.js +236 -0
  66. package/dist/src/rpc-transport.js.map +1 -0
  67. package/dist/src/svm.d.ts +1 -1
  68. package/dist/src/svm.js +89 -21
  69. package/dist/src/svm.js.map +1 -1
  70. package/dist/src/transaction-keys.d.ts +6 -0
  71. package/dist/src/transaction-keys.js +19 -0
  72. package/dist/src/transaction-keys.js.map +1 -0
  73. package/dist/src/transport.d.ts +7 -221
  74. package/dist/src/transport.js +6 -464
  75. package/dist/src/transport.js.map +1 -1
  76. package/package.json +16 -5
@@ -1,12 +1,14 @@
1
1
  import { type Address, type Instruction } from "@solana/kit";
2
- import type { Simulation, Transport } from "./transport.js";
2
+ import { type LookupTables, type Simulation, type Transport } from "./transport.js";
3
3
  export type Priority = bigint | "auto";
4
4
  export declare const AUTO_PERCENTILE = 75n;
5
5
  export declare const AUTO_PRICE_CAP = 10000000n;
6
+ export declare const PACKET_DATA_SIZE = 1232;
6
7
  export declare function percentile(fees: readonly bigint[], rank: bigint): bigint;
7
8
  export declare function writableAccounts(instructions: readonly Instruction[]): Address[];
8
9
  export declare function priceOf(transport: Transport, priority: Priority, instructions: readonly Instruction[]): Promise<bigint>;
9
- export declare function simulated(transport: Transport, instructions: readonly Instruction[], feePayer: Address): Promise<Simulation>;
10
- export declare function unitsOf(transport: Transport, instructions: readonly Instruction[], feePayer: Address): Promise<bigint | null>;
11
- export declare function budgeted(transport: Transport, priority: Priority, instructions: readonly Instruction[], feePayer: Address): Promise<Instruction[]>;
10
+ export declare function transactionBytes(transport: Transport, instructions: readonly Instruction[], feePayer: Address, tables?: LookupTables): Promise<number>;
11
+ export declare function simulated(transport: Transport, instructions: readonly Instruction[], feePayer: Address, tables?: LookupTables): Promise<Simulation>;
12
+ export declare function unitsOf(transport: Transport, instructions: readonly Instruction[], feePayer: Address, tables?: LookupTables): Promise<bigint | null>;
13
+ export declare function budgeted(transport: Transport, priority: Priority, instructions: readonly Instruction[], feePayer: Address, tables?: LookupTables): Promise<Instruction[]>;
12
14
  export declare function withPriority(inner: Transport, priority: Priority): Transport;
@@ -1,7 +1,9 @@
1
- import { appendTransactionMessageInstructions, createTransactionMessage, getBase64EncodedWireTransaction, isWritableRole, partiallySignTransactionMessageWithSigners, pipe, setTransactionMessageFeePayer, setTransactionMessageLifetimeUsingBlockhash, } from "@solana/kit";
1
+ import { appendTransactionMessageInstructions, compileTransaction, compressTransactionMessageUsingAddressLookupTables, createTransactionMessage, getBase64EncodedWireTransaction, getTransactionEncoder, isWritableRole, pipe, setTransactionMessageFeePayer, setTransactionMessageLifetimeUsingBlockhash, } from "@solana/kit";
2
2
  import { COMPUTE_BUDGET_ADDRESS, computeUnitLimit, computeUnitPrice, headroom, MAX_COMPUTE_UNITS } from "@intent-engine/core";
3
+ import { boundMembers } from "./transport.js";
3
4
  export const AUTO_PERCENTILE = 75n;
4
5
  export const AUTO_PRICE_CAP = 10000000n;
6
+ export const PACKET_DATA_SIZE = 1_232;
5
7
  export function percentile(fees, rank) {
6
8
  const sorted = [...fees].sort((a, b) => Number(a - b));
7
9
  if (sorted.length === 0) {
@@ -28,28 +30,41 @@ export async function priceOf(transport, priority, instructions) {
28
30
  const suggested = percentile(await transport.recentFees(writableAccounts(instructions)), AUTO_PERCENTILE);
29
31
  return suggested < AUTO_PRICE_CAP ? suggested : AUTO_PRICE_CAP;
30
32
  }
31
- export async function simulated(transport, instructions, feePayer) {
33
+ async function compiled(transport, instructions, feePayer, tables) {
32
34
  const latest = await transport.latestBlockhash();
33
35
  const message = pipe(createTransactionMessage({ version: 0 }), (m) => setTransactionMessageFeePayer(feePayer, m), (m) => setTransactionMessageLifetimeUsingBlockhash(latest, m), (m) => appendTransactionMessageInstructions(instructions, m));
34
- return transport.simulate(getBase64EncodedWireTransaction(await partiallySignTransactionMessageWithSigners(message)));
36
+ const compressed = tables === undefined || Object.keys(tables).length === 0 ? message : compressTransactionMessageUsingAddressLookupTables(message, tables);
37
+ const built = compileTransaction(compressed);
38
+ const signatures = Object.fromEntries(Object.keys(built.signatures).map((signer) => [signer, new Uint8Array(64)]));
39
+ return { ...built, signatures };
35
40
  }
36
- export async function unitsOf(transport, instructions, feePayer) {
37
- const simulation = await simulated(transport, instructions, feePayer);
41
+ export async function transactionBytes(transport, instructions, feePayer, tables) {
42
+ return getTransactionEncoder().encode(await compiled(transport, instructions, feePayer, tables)).length;
43
+ }
44
+ export async function simulated(transport, instructions, feePayer, tables) {
45
+ return transport.simulate(getBase64EncodedWireTransaction(await compiled(transport, instructions, feePayer, tables)));
46
+ }
47
+ export async function unitsOf(transport, instructions, feePayer, tables) {
48
+ const simulation = await simulated(transport, instructions, feePayer, tables);
38
49
  return simulation.err === null ? simulation.unitsConsumed : null;
39
50
  }
40
- export async function budgeted(transport, priority, instructions, feePayer) {
51
+ export async function budgeted(transport, priority, instructions, feePayer, tables) {
41
52
  if (instructions.some((ix) => ix.programAddress === COMPUTE_BUDGET_ADDRESS)) {
42
53
  return [...instructions];
43
54
  }
44
55
  const price = await priceOf(transport, priority, instructions);
45
56
  const head = price > 0n ? [computeUnitPrice(price)] : [];
46
- const consumed = await unitsOf(transport, [...instructions, computeUnitLimit(MAX_COMPUTE_UNITS), ...head], feePayer);
57
+ const trial = [...instructions, computeUnitLimit(MAX_COMPUTE_UNITS), ...head];
58
+ if ((await transactionBytes(transport, trial, feePayer, tables)) > PACKET_DATA_SIZE) {
59
+ return trial;
60
+ }
61
+ const consumed = await unitsOf(transport, trial, feePayer, tables);
47
62
  return [...instructions, computeUnitLimit(consumed === null ? MAX_COMPUTE_UNITS : headroom(consumed)), ...head];
48
63
  }
49
64
  export function withPriority(inner, priority) {
50
- const budget = (instructions, feePayer) => budgeted(inner, priority, instructions, feePayer);
65
+ const budget = (instructions, feePayer, tables) => budgeted(inner, priority, instructions, feePayer, tables);
51
66
  return {
52
- ...inner,
67
+ ...boundMembers(inner),
53
68
  budget,
54
69
  send: async (instructions, payer) => inner.send(await budget(instructions, payer.address), payer),
55
70
  };
@@ -1 +1 @@
1
- {"version":3,"file":"budget.js","sourceRoot":"","sources":["../../src/budget.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"budget.js","sourceRoot":"","sources":["../../src/budget.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import type { Address } from "@solana/kit";
2
+ export declare class NoFreeNonce extends Error {
3
+ readonly owner: Address;
4
+ constructor(owner: Address);
5
+ }
6
+ export declare class NotSettleable extends Error {
7
+ readonly intent: Address;
8
+ constructor(intent: Address, reason: string);
9
+ }
10
+ export declare class NotFillable extends Error {
11
+ readonly intent: Address;
12
+ constructor(intent: Address, reason: string);
13
+ }
14
+ export declare class PayToNotWallet extends Error {
15
+ readonly payTo: Address;
16
+ readonly program: Address;
17
+ constructor(payTo: Address, program: Address);
18
+ }
19
+ export declare class PayeeMoved extends Error {
20
+ readonly payTo: Address;
21
+ readonly account: Address;
22
+ constructor(payTo: Address, account: Address);
23
+ }
24
+ export declare class EscrowExpired extends Error {
25
+ readonly intent: Address;
26
+ readonly expiresAt: bigint;
27
+ constructor(intent: Address, expiresAt: bigint);
28
+ }
@@ -0,0 +1,55 @@
1
+ export class NoFreeNonce extends Error {
2
+ owner;
3
+ constructor(owner) {
4
+ super(`every nonce in the window of ${owner} is used; advance the nonce window first`);
5
+ this.name = "NoFreeNonce";
6
+ this.owner = owner;
7
+ }
8
+ }
9
+ export class NotSettleable extends Error {
10
+ intent;
11
+ constructor(intent, reason) {
12
+ super(`intent ${intent} ${reason}`);
13
+ this.name = "NotSettleable";
14
+ this.intent = intent;
15
+ }
16
+ }
17
+ export class NotFillable extends Error {
18
+ intent;
19
+ constructor(intent, reason) {
20
+ super(`intent ${intent} ${reason}`);
21
+ this.name = "NotFillable";
22
+ this.intent = intent;
23
+ }
24
+ }
25
+ export class PayToNotWallet extends Error {
26
+ payTo;
27
+ program;
28
+ constructor(payTo, program) {
29
+ super(`payTo ${payTo} belongs to the program ${program}, not to a wallet, so nothing paid to it could be spent; give a wallet address`);
30
+ this.name = "PayToNotWallet";
31
+ this.payTo = payTo;
32
+ this.program = program;
33
+ }
34
+ }
35
+ export class PayeeMoved extends Error {
36
+ payTo;
37
+ account;
38
+ constructor(payTo, account) {
39
+ super(`the token account ${account} of payTo ${payTo} is no longer held by ${payTo} for this mint, so a release to it would not reach ${payTo}`);
40
+ this.name = "PayeeMoved";
41
+ this.payTo = payTo;
42
+ this.account = account;
43
+ }
44
+ }
45
+ export class EscrowExpired extends Error {
46
+ intent;
47
+ expiresAt;
48
+ constructor(intent, expiresAt) {
49
+ super(`intent ${intent} expired at ${expiresAt}; its owner gets it back instead`);
50
+ this.name = "EscrowExpired";
51
+ this.intent = intent;
52
+ this.expiresAt = expiresAt;
53
+ }
54
+ }
55
+ //# sourceMappingURL=client-errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-errors.js","sourceRoot":"","sources":["../../src/client-errors.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,WAAY,SAAQ,KAAK;IAC3B,KAAK,CAAU;IAExB,YAAY,KAAc;QACxB,KAAK,CAAC,gCAAgC,KAAK,0CAA0C,CAAC,CAAC;QACvF,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;QAC1B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;CACF;AAED,MAAM,OAAO,aAAc,SAAQ,KAAK;IAC7B,MAAM,CAAU;IAEzB,YAAY,MAAe,EAAE,MAAc;QACzC,KAAK,CAAC,UAAU,MAAM,IAAI,MAAM,EAAE,CAAC,CAAC;QACpC,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;QAC5B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;CACF;AAED,MAAM,OAAO,WAAY,SAAQ,KAAK;IAC3B,MAAM,CAAU;IAEzB,YAAY,MAAe,EAAE,MAAc;QACzC,KAAK,CAAC,UAAU,MAAM,IAAI,MAAM,EAAE,CAAC,CAAC;QACpC,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;QAC1B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;CACF;AAED,MAAM,OAAO,cAAe,SAAQ,KAAK;IAC9B,KAAK,CAAU;IACf,OAAO,CAAU;IAE1B,YAAY,KAAc,EAAE,OAAgB;QAC1C,KAAK,CAAC,SAAS,KAAK,2BAA2B,OAAO,gFAAgF,CAAC,CAAC;QACxI,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;QAC7B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;CACF;AAED,MAAM,OAAO,UAAW,SAAQ,KAAK;IAC1B,KAAK,CAAU;IACf,OAAO,CAAU;IAE1B,YAAY,KAAc,EAAE,OAAgB;QAC1C,KAAK,CAAC,qBAAqB,OAAO,aAAa,KAAK,yBAAyB,KAAK,sDAAsD,KAAK,EAAE,CAAC,CAAC;QACjJ,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;QACzB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;CACF;AAED,MAAM,OAAO,aAAc,SAAQ,KAAK;IAC7B,MAAM,CAAU;IAChB,SAAS,CAAS;IAE3B,YAAY,MAAe,EAAE,SAAiB;QAC5C,KAAK,CAAC,UAAU,MAAM,eAAe,SAAS,kCAAkC,CAAC,CAAC;QAClF,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;QAC5B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;CACF"}
@@ -0,0 +1,12 @@
1
+ import type { Address, TransactionSigner } from "@solana/kit";
2
+ import { type NonceWindow } from "./accounts.js";
3
+ import { type ClientContext, type CreatedIntent, type CreateIntentInput, type FillInput } from "./client-types.js";
4
+ export declare function nonceAfter(owner: Address, user: NonceWindow | null): bigint;
5
+ export declare function intentSends({ transport, send, mint, config }: ClientContext): {
6
+ createIntent: (input: CreateIntentInput) => Promise<CreatedIntent>;
7
+ cancel: (signer: TransactionSigner, nonce: bigint) => Promise<import("@solana/kit").Signature>;
8
+ unwrap: (signer: TransactionSigner) => Promise<import("@solana/kit").Signature | null>;
9
+ fill: (input: FillInput) => Promise<import("@solana/kit").Signature>;
10
+ expire: (cranker: TransactionSigner, owner: Address, nonce: bigint) => Promise<import("@solana/kit").Signature>;
11
+ close: (cranker: TransactionSigner, owner: Address, nonce: bigint) => Promise<import("@solana/kit").Signature>;
12
+ };
@@ -0,0 +1,133 @@
1
+ import { buildCancelIntent, buildCloseIntent, buildCreateIntent, buildExpireIntent, buildFillIntent, decodeParams, escrowAmount, feeBpsFor, findAssociatedTokenAddress, findIntentPda, IntentStatus, Kind, NATIVE_MINT, nextFreeNonce, remainingOf, requiredOut, specMemo, splitFees, TOKEN_PROGRAM_ADDRESS, } from "@intent-engine/core";
2
+ import { getCloseAccountInstruction } from "@solana-program/token";
3
+ import { chainTime, createdAccount, loadIntent, loadUser } from "./accounts.js";
4
+ import { NoFreeNonce, NotFillable } from "./client-errors.js";
5
+ import { DEFAULT_EXPIRES_IN, EXPIRES_IN_RANGE, MAX_EXPIRES_IN, MIN_EXPIRES_IN, SPEC_URL_NEEDS_PROOF, } from "./client-types.js";
6
+ import { memoInstruction, PLAIN_HTTP_ON_PUBLIC, plainHttpOnPublic } from "./jobs.js";
7
+ import { initUserIfMissing, tokenAccountIfMissing, wrapIfShort } from "./setup.js";
8
+ export function nonceAfter(owner, user) {
9
+ if (user === null) {
10
+ return 0n;
11
+ }
12
+ const next = nextFreeNonce(user);
13
+ if (next === null) {
14
+ throw new NoFreeNonce(owner);
15
+ }
16
+ return next;
17
+ }
18
+ export function intentSends({ transport, send, mint, config }) {
19
+ const createIntent = async (input) => {
20
+ const { signer, params, inputMint, outputMint } = input;
21
+ const owner = signer.address;
22
+ if (input.specUrl !== undefined && (params.kind !== Kind.AttestedResult || params.specHash.every((b) => b === 0))) {
23
+ throw new RangeError(SPEC_URL_NEEDS_PROOF);
24
+ }
25
+ if (input.expiresIn !== undefined && (input.expiresIn < MIN_EXPIRES_IN || input.expiresIn > MAX_EXPIRES_IN)) {
26
+ throw new RangeError(EXPIRES_IN_RANGE);
27
+ }
28
+ const published = input.specUrl === undefined ? [] : [memoInstruction(signer, specMemo(input.specUrl))];
29
+ if (input.specUrl !== undefined && (await plainHttpOnPublic(transport, input.specUrl))) {
30
+ throw new RangeError(`the spec url ${input.specUrl} ${PLAIN_HTTP_ON_PUBLIC}`);
31
+ }
32
+ const [settings, sell, buy, user] = await Promise.all([config(), mint(inputMint), mint(outputMint), loadUser(transport, owner)]);
33
+ const nonce = input.nonce ?? nonceAfter(owner, user);
34
+ const expiresAt = input.expiresAt ?? (await chainTime(transport)) + (input.expiresIn ?? DEFAULT_EXPIRES_IN);
35
+ const recipient = input.receiver ?? owner;
36
+ const receiver = await tokenAccountIfMissing(transport, signer, recipient, outputMint, buy.tokenProgram);
37
+ const wrap = await wrapIfShort(transport, signer, inputMint, sell.tokenProgram, escrowAmount(params));
38
+ const create = await buildCreateIntent({
39
+ owner: signer,
40
+ treasury: settings.feeRecipient,
41
+ maxCreateFee: settings.createFee,
42
+ maxBounty: settings.crankBounty,
43
+ nonce,
44
+ params,
45
+ expiresAt,
46
+ inputMint,
47
+ outputMint,
48
+ inputTokenProgram: sell.tokenProgram,
49
+ outputTokenProgram: buy.tokenProgram,
50
+ ...(recipient === owner ? {} : { receiver: receiver.address, receiverAuthority: recipient }),
51
+ });
52
+ const register = await initUserIfMissing(user, signer);
53
+ const signature = await send([...register, ...receiver.create, ...wrap.instructions, create, ...published], signer);
54
+ const [intent] = await findIntentPda({ owner, nonce });
55
+ return { signature, intent, nonce };
56
+ };
57
+ const cancel = async (signer, nonce) => {
58
+ const { intent } = await loadIntent(transport, signer.address, nonce);
59
+ const { tokenProgram } = await mint(intent.inputMint);
60
+ const refund = await tokenAccountIfMissing(transport, signer, signer.address, intent.inputMint, tokenProgram);
61
+ return send([...refund.create, await buildCancelIntent({ owner: signer, nonce, inputMint: intent.inputMint, tokenProgram })], signer);
62
+ };
63
+ const unwrap = async (signer) => {
64
+ const account = await findAssociatedTokenAddress({ owner: signer.address, mint: NATIVE_MINT, tokenProgram: TOKEN_PROGRAM_ADDRESS });
65
+ if ((await createdAccount(transport, account)) === null) {
66
+ return null;
67
+ }
68
+ return send([getCloseAccountInstruction({ account, destination: signer.address, owner: signer })], signer);
69
+ };
70
+ const fill = async (input) => {
71
+ const { solver, owner, nonce } = input;
72
+ const [{ address, intent: held }, settings] = await Promise.all([loadIntent(transport, owner, nonce), config()]);
73
+ if (held.status !== IntentStatus.Open) {
74
+ throw new NotFillable(address, "is not open");
75
+ }
76
+ const params = decodeParams(held.kind, Uint8Array.from(held.params));
77
+ if (params.kind === Kind.AttestedResult) {
78
+ throw new NotFillable(address, "is an AttestedResult intent, which only its judge settles");
79
+ }
80
+ const [sell, buy] = await Promise.all([mint(held.inputMint), mint(held.outputMint)]);
81
+ const amountIn = input.amountIn ?? remainingOf(held);
82
+ const amountOut = input.amountOut ?? requiredOut(params, amountIn, await chainTime(transport));
83
+ const kindBps = feeBpsFor(settings, held.kind);
84
+ const shares = splitFees(amountIn, kindBps, held.partnerBps, held.partnerCutBps);
85
+ const feeRecipient = shares.protocol > 0n ? settings.feeRecipient : undefined;
86
+ const partner = shares.partner > 0n ? held.partner : undefined;
87
+ const agent = held.agentFee > 0n ? held.rentPayer : undefined;
88
+ const paid = (wallet) => tokenAccountIfMissing(transport, solver, wallet, held.inputMint, sell.tokenProgram);
89
+ const [solverInput, solverOutput, ...payouts] = await Promise.all([
90
+ paid(solver.address),
91
+ tokenAccountIfMissing(transport, solver, solver.address, held.outputMint, buy.tokenProgram),
92
+ ...[feeRecipient, partner, agent].filter((wallet) => wallet !== undefined).map(paid),
93
+ ]);
94
+ const filled = await buildFillIntent({
95
+ solver,
96
+ owner,
97
+ nonce,
98
+ inputMint: held.inputMint,
99
+ outputMint: held.outputMint,
100
+ inputTokenProgram: sell.tokenProgram,
101
+ outputTokenProgram: buy.tokenProgram,
102
+ receiver: held.receiver,
103
+ solverInput: solverInput.address,
104
+ solverOutput: solverOutput.address,
105
+ ...(feeRecipient === undefined ? {} : { feeRecipient }),
106
+ ...(partner === undefined ? {} : { partner }),
107
+ ...(agent === undefined ? {} : { agent }),
108
+ mandate: held.mandate,
109
+ amountIn,
110
+ amountOut,
111
+ maxFeeBps: kindBps + held.partnerBps,
112
+ });
113
+ const setup = [solverInput, solverOutput, ...payouts].flatMap(({ create }) => create);
114
+ const wrap = input.route === undefined ? (await wrapIfShort(transport, solver, held.outputMint, buy.tokenProgram, amountOut)).instructions : [];
115
+ return send([...setup, ...wrap, ...(input.route ?? []), filled], solver);
116
+ };
117
+ const settling = async (cranker, owner, nonce) => {
118
+ const { intent } = await loadIntent(transport, owner, nonce);
119
+ const { tokenProgram } = await mint(intent.inputMint);
120
+ return { ref: { cranker, owner, nonce, inputMint: intent.inputMint, tokenProgram }, rentPayer: intent.rentPayer };
121
+ };
122
+ const expire = async (cranker, owner, nonce) => {
123
+ const { ref } = await settling(cranker, owner, nonce);
124
+ const refund = await tokenAccountIfMissing(transport, cranker, owner, ref.inputMint, ref.tokenProgram);
125
+ return send([...refund.create, await buildExpireIntent(ref)], cranker);
126
+ };
127
+ const close = async (cranker, owner, nonce) => {
128
+ const { ref, rentPayer } = await settling(cranker, owner, nonce);
129
+ return send([await buildCloseIntent({ ...ref, rentPayer })], cranker);
130
+ };
131
+ return { createIntent, cancel, unwrap, fill, expire, close };
132
+ }
133
+ //# sourceMappingURL=client-intents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-intents.js","sourceRoot":"","sources":["../../src/client-intents.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { Address } from "@solana/kit";
2
+ import { type Balances, type ClientContext, type Fill, type HistoryEvent } from "./client-types.js";
3
+ export declare function clientReads({ transport, mint }: ClientContext): {
4
+ history: (intent: Address, limit?: number) => Promise<HistoryEvent[]>;
5
+ fillOf: (intent: Address) => Promise<Fill | null>;
6
+ balances: (owner: Address, mints: readonly Address[]) => Promise<Balances>;
7
+ };
@@ -0,0 +1,61 @@
1
+ import { decodeEvent, findAssociatedTokenAddress, tokenName } from "@intent-engine/core";
2
+ import { createdAccount, tokenAmountOf } from "./accounts.js";
3
+ import { HISTORY_LIMIT } from "./client-types.js";
4
+ import { createdAtOf, recordedDelivery, scan } from "./jobs.js";
5
+ const FILL_EVENTS = new Set(["IntentFilled", "FillEnded"]);
6
+ function eventsIn(transactions, intent) {
7
+ return transactions
8
+ .filter(({ failed }) => !failed)
9
+ .flatMap(({ signature, slot, blockTime, emitted }) => emitted
10
+ .map((data) => decodeEvent(data))
11
+ .filter((event) => event !== null && "intent" in event.fields && event.fields.intent === intent)
12
+ .reverse()
13
+ .map((event) => ({ ...event, signature: signature, slot, blockTime })));
14
+ }
15
+ const fillIn = (intent) => (transaction) => eventsIn([transaction], intent).some(({ name }) => FILL_EVENTS.has(name));
16
+ export function clientReads({ transport, mint }) {
17
+ const history = async (intent, limit = HISTORY_LIMIT) => {
18
+ const transactions = await transport.engineTransactions(limit, intent);
19
+ return eventsIn(transactions, intent).map((event) => {
20
+ if (event.name !== "IntentAttested" && event.name !== "IntentSplit") {
21
+ return event;
22
+ }
23
+ const release = transactions.find(({ signature }) => signature === event.signature);
24
+ const recorded = release === undefined ? null : recordedDelivery(transactions, release, event.fields.attestor);
25
+ return recorded === null ? event : { ...event, deliveredSha256: recorded };
26
+ });
27
+ };
28
+ const fillOf = async (intent) => {
29
+ const floor = await createdAtOf(transport, intent);
30
+ const events = eventsIn((await scan(transport, intent, { floor, until: fillIn(intent) })).transactions, intent);
31
+ for (const event of events) {
32
+ const { signature, slot, blockTime } = event;
33
+ if (event.name === "IntentFilled") {
34
+ const { solver, delivered, required, fee, net } = event.fields;
35
+ return { steps: 1, solver, delivered, required, fee, net, signature, slot, blockTime };
36
+ }
37
+ if (event.name === "FillEnded") {
38
+ const begun = events.find((other) => other.name === "FillBegun" && other.signature === signature);
39
+ if (begun?.name === "FillBegun") {
40
+ const { solver, delivered, required } = event.fields;
41
+ return { steps: 2, solver, delivered, required, fee: begun.fields.fee, net: begun.fields.net, signature, slot, blockTime };
42
+ }
43
+ }
44
+ }
45
+ return null;
46
+ };
47
+ const balances = async (owner, mints) => {
48
+ const [wallet, tokens] = await Promise.all([
49
+ transport.getAccount(owner),
50
+ Promise.all(mints.map(async (address) => {
51
+ const { decimals, tokenProgram } = await mint(address);
52
+ const account = await findAssociatedTokenAddress({ owner, mint: address, tokenProgram });
53
+ const amount = tokenAmountOf((await createdAccount(transport, account))?.data ?? null) ?? 0n;
54
+ return { mint: address, name: tokenName(address), account, amount, decimals };
55
+ })),
56
+ ]);
57
+ return { sol: wallet?.lamports ?? 0n, tokens };
58
+ };
59
+ return { history, fillOf, balances };
60
+ }
61
+ //# sourceMappingURL=client-reads.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-reads.js","sourceRoot":"","sources":["../../src/client-reads.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { ClientContext, SettleProofInput } from "./client-types.js";
2
+ export declare function proofSettlement({ transport, send, mint, config }: ClientContext): (input: SettleProofInput) => Promise<import("@solana/kit").Signature>;
@@ -0,0 +1,84 @@
1
+ import { getAddressDecoder } from "@solana/kit";
2
+ import { attestedProofMessage, buildFillAttested, decodeParams, feeBpsFor, IntentStatus, isSha256Hex, Kind, releaseMemo, signEd25519Instruction, splitFees, } from "@intent-engine/core";
3
+ import { chainTime, createdAccount, loadIntent, SYSTEM_PROGRAM_ADDRESS } from "./accounts.js";
4
+ import { EscrowExpired, NotSettleable, PayeeMoved, PayToNotWallet } from "./client-errors.js";
5
+ import { memoInstruction } from "./jobs.js";
6
+ import { tokenAccountIfMissing } from "./setup.js";
7
+ export function proofSettlement({ transport, send, mint, config }) {
8
+ const settleProof = async (input) => {
9
+ const { judge, owner, nonce, payTo, result } = input;
10
+ const deliveredSha256 = input.deliveredSha256?.toLowerCase();
11
+ const payer = input.payer ?? judge;
12
+ if (deliveredSha256 !== undefined && !isSha256Hex(deliveredSha256)) {
13
+ throw new RangeError("deliveredSha256 must be 64 hex digits");
14
+ }
15
+ const [{ address, intent: held }, settings] = await Promise.all([loadIntent(transport, owner, nonce), config()]);
16
+ const params = decodeParams(held.kind, Uint8Array.from(held.params));
17
+ if (params.kind !== Kind.AttestedResult) {
18
+ throw new NotSettleable(address, "is not an AttestedResult intent");
19
+ }
20
+ if (params.specHash.every((b) => b === 0)) {
21
+ throw new NotSettleable(address, "commits no spec hash, so it is not a proof intent");
22
+ }
23
+ if (held.status !== IntentStatus.Open) {
24
+ throw new NotSettleable(address, "is not open");
25
+ }
26
+ if (params.attestor !== judge.address) {
27
+ throw new NotSettleable(address, `names ${params.attestor} as its judge, not ${judge.address}`);
28
+ }
29
+ if (held.expiresAt <= (await chainTime(transport))) {
30
+ throw new EscrowExpired(address, held.expiresAt);
31
+ }
32
+ const holder = await transport.getAccount(payTo);
33
+ if (holder !== null && holder.owner !== SYSTEM_PROGRAM_ADDRESS) {
34
+ throw new PayToNotWallet(payTo, holder.owner);
35
+ }
36
+ const { tokenProgram } = await mint(held.inputMint);
37
+ const account = (wallet) => tokenAccountIfMissing(transport, payer, wallet, held.inputMint, tokenProgram);
38
+ const amountIn = held.escrowed - held.filled;
39
+ const kindBps = feeBpsFor(settings, held.kind);
40
+ const maxFeeBps = kindBps + held.partnerBps;
41
+ const shares = splitFees(amountIn - params.judgeFee, kindBps, held.partnerBps, held.partnerCutBps);
42
+ const feeRecipient = shares.protocol > 0n ? settings.feeRecipient : undefined;
43
+ const partner = shares.partner > 0n ? held.partner : undefined;
44
+ const paidJudge = params.judgeFee > 0n ? judge.address : undefined;
45
+ const payee = await account(payTo);
46
+ if (payee.create.length === 0) {
47
+ const existing = await createdAccount(transport, payee.address);
48
+ const data = existing === null || existing.owner !== tokenProgram || existing.data.length < 64 ? null : existing.data;
49
+ if (data === null ||
50
+ getAddressDecoder().decode(data.subarray(0, 32)) !== held.inputMint ||
51
+ getAddressDecoder().decode(data.subarray(32, 64)) !== payTo) {
52
+ throw new PayeeMoved(payTo, payee.address);
53
+ }
54
+ }
55
+ const others = await Promise.all([feeRecipient, partner, paidJudge].filter((wallet) => wallet !== undefined).map(account));
56
+ const fields = { amountIn, result, maxFeeBps };
57
+ const message = await attestedProofMessage(judge.address, {
58
+ ...fields,
59
+ domain: Uint8Array.from(settings.domain),
60
+ intent: address,
61
+ payee: payee.address,
62
+ filled: held.filled,
63
+ revision: held.revision,
64
+ specHash: params.specHash,
65
+ });
66
+ const settle = await buildFillAttested({
67
+ ...fields,
68
+ solver: judge,
69
+ owner,
70
+ nonce,
71
+ inputMint: held.inputMint,
72
+ inputTokenProgram: tokenProgram,
73
+ payee: payee.address,
74
+ ...(feeRecipient === undefined ? {} : { feeRecipient }),
75
+ ...(partner === undefined ? {} : { partner }),
76
+ ...(paidJudge === undefined ? {} : { judge: paidJudge }),
77
+ });
78
+ const setup = [payee, ...others].flatMap(({ create }) => create);
79
+ const recorded = deliveredSha256 === undefined ? [] : [memoInstruction(judge, releaseMemo(deliveredSha256))];
80
+ return send([...setup, await signEd25519Instruction(judge, message), settle, ...recorded], payer);
81
+ };
82
+ return settleProof;
83
+ }
84
+ //# sourceMappingURL=client-settle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-settle.js","sourceRoot":"","sources":["../../src/client-settle.ts"],"names":[],"mappings":"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"}