@intent-engine/client 0.1.23 → 0.1.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) 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 -140
  23. package/dist/src/client.js +16 -309
  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/intent-notifications.d.ts +13 -0
  29. package/dist/src/intent-notifications.js +106 -0
  30. package/dist/src/intent-notifications.js.map +1 -0
  31. package/dist/src/job-deliveries.d.ts +40 -0
  32. package/dist/src/job-deliveries.js +92 -0
  33. package/dist/src/job-deliveries.js.map +1 -0
  34. package/dist/src/job-memos.d.ts +16 -0
  35. package/dist/src/job-memos.js +51 -0
  36. package/dist/src/job-memos.js.map +1 -0
  37. package/dist/src/job-origins.d.ts +30 -0
  38. package/dist/src/job-origins.js +53 -0
  39. package/dist/src/job-origins.js.map +1 -0
  40. package/dist/src/job-proofs.d.ts +17 -0
  41. package/dist/src/job-proofs.js +54 -0
  42. package/dist/src/job-proofs.js.map +1 -0
  43. package/dist/src/job-scan.d.ts +20 -0
  44. package/dist/src/job-scan.js +70 -0
  45. package/dist/src/job-scan.js.map +1 -0
  46. package/dist/src/job-specs.d.ts +40 -0
  47. package/dist/src/job-specs.js +107 -0
  48. package/dist/src/job-specs.js.map +1 -0
  49. package/dist/src/jobs.d.ts +6 -77
  50. package/dist/src/jobs.js +6 -186
  51. package/dist/src/jobs.js.map +1 -1
  52. package/dist/src/memoized-transport.d.ts +4 -0
  53. package/dist/src/memoized-transport.js +66 -0
  54. package/dist/src/memoized-transport.js.map +1 -0
  55. package/dist/src/rpc-retry.d.ts +16 -0
  56. package/dist/src/rpc-retry.js +62 -0
  57. package/dist/src/rpc-retry.js.map +1 -0
  58. package/dist/src/rpc-shapes.d.ts +230 -0
  59. package/dist/src/rpc-shapes.js +2 -0
  60. package/dist/src/rpc-shapes.js.map +1 -0
  61. package/dist/src/rpc-transport.d.ts +6 -0
  62. package/dist/src/rpc-transport.js +236 -0
  63. package/dist/src/rpc-transport.js.map +1 -0
  64. package/dist/src/svm.js +83 -27
  65. package/dist/src/svm.js.map +1 -1
  66. package/dist/src/transaction-keys.d.ts +6 -0
  67. package/dist/src/transaction-keys.js +19 -0
  68. package/dist/src/transaction-keys.js.map +1 -0
  69. package/dist/src/transport.d.ts +7 -223
  70. package/dist/src/transport.js +6 -467
  71. package/dist/src/transport.js.map +1 -1
  72. package/package.json +16 -5
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intent-notifications.js","sourceRoot":"","sources":["../../src/intent-notifications.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import type { Address, Instruction, Signature, TransactionSigner } from "@solana/kit";
2
+ import type { Transport } from "./transport.js";
3
+ export type DeliverInput = {
4
+ worker: TransactionSigner;
5
+ intent: Address;
6
+ sha256: string;
7
+ url: string;
8
+ };
9
+ export type Delivery = {
10
+ intent: Address;
11
+ worker: Address;
12
+ sha256: string;
13
+ url: string;
14
+ signature: Signature;
15
+ slot: bigint;
16
+ blockTime: bigint | null;
17
+ };
18
+ export type DeliveryRecord = {
19
+ deliveries: Delivery[];
20
+ complete: boolean;
21
+ pages: number;
22
+ };
23
+ export type Announcement = {
24
+ sha256: string;
25
+ first: Delivery;
26
+ copies: number;
27
+ };
28
+ export declare class NotDeliverable extends Error {
29
+ readonly intent: Address;
30
+ constructor(intent: Address, reason: string);
31
+ }
32
+ export declare function deliveryInstructions(transport: Transport, input: DeliverInput): Promise<{
33
+ attestor: Address;
34
+ instructions: Instruction[];
35
+ }>;
36
+ export declare function deliveryRecord(transport: Transport, judge: Address, intent?: Address, pages?: number): Promise<DeliveryRecord>;
37
+ export declare function judgedDeliveries(transport: Transport, judge: Address, judged: ReadonlySet<Address>, floor: bigint | null, covered: () => Promise<boolean>, pages: number): Promise<DeliveryRecord>;
38
+ export declare function deliveriesOf(transport: Transport, judge: Address, intent?: Address): Promise<Delivery[]>;
39
+ export declare function firstDelivery(deliveries: readonly Delivery[], sha256: string): Delivery | null;
40
+ export declare function announcements(deliveries: readonly Delivery[]): Announcement[];
@@ -0,0 +1,92 @@
1
+ import { getTransferSolInstruction } from "@solana-program/system";
2
+ import { deliveryMemo, IntentStatus, DELIVERY_MEMO_PREFIX, parseDeliveryMemo } from "@intent-engine/core";
3
+ import { chainTime } from "./accounts.js";
4
+ import { memoInstruction } from "./job-memos.js";
5
+ import { historyCovers, openProofEscrows, proofAt } from "./job-proofs.js";
6
+ import { DELIVERY_PAGES, MEMOS_PER_TRANSACTION, scan } from "./job-scan.js";
7
+ import { PLAIN_HTTP_ON_PUBLIC, plainHttpOnPublic } from "./job-specs.js";
8
+ export class NotDeliverable extends Error {
9
+ intent;
10
+ constructor(intent, reason) {
11
+ super(`intent ${intent} ${reason}`);
12
+ this.name = "NotDeliverable";
13
+ this.intent = intent;
14
+ }
15
+ }
16
+ export async function deliveryInstructions(transport, input) {
17
+ const { worker, intent } = input;
18
+ const memo = deliveryMemo({ intent, sha256: input.sha256.toLowerCase(), url: input.url });
19
+ if (await plainHttpOnPublic(transport, input.url)) {
20
+ throw new RangeError(`the work url ${input.url} ${PLAIN_HTTP_ON_PUBLIC}`);
21
+ }
22
+ const [proof, now] = await Promise.all([proofAt(transport, intent), chainTime(transport)]);
23
+ if (proof === null) {
24
+ throw new NotDeliverable(intent, "is not a proof escrow: an AttestedResult intent that commits a spec hash");
25
+ }
26
+ if (proof.intent.status !== IntentStatus.Open || proof.intent.expiresAt <= now) {
27
+ throw new NotDeliverable(intent, "is no longer open");
28
+ }
29
+ const attestor = proof.params.attestor;
30
+ return {
31
+ attestor,
32
+ instructions: [memoInstruction(worker, memo), getTransferSolInstruction({ source: worker, destination: attestor, amount: 0n })],
33
+ };
34
+ }
35
+ export async function deliveryRecord(transport, judge, intent, pages = DELIVERY_PAGES) {
36
+ let proofs;
37
+ if (intent === undefined) {
38
+ proofs = await openProofEscrows(transport, judge, Number.POSITIVE_INFINITY);
39
+ }
40
+ else {
41
+ const proof = await proofAt(transport, intent);
42
+ proofs = proof !== null && proof.params.attestor === judge ? [proof] : [];
43
+ }
44
+ const [first] = proofs;
45
+ if (first === undefined) {
46
+ return { deliveries: [], complete: true, pages: 0 };
47
+ }
48
+ const judged = new Set(proofs.map(({ address }) => address));
49
+ const oldest = proofs.reduce((low, proof) => (proof.intent.createdAt < low.intent.createdAt ? proof : low), first);
50
+ const floor = oldest.intent.createdAt;
51
+ return judgedDeliveries(transport, judge, judged, floor, () => historyCovers(transport, oldest.address, floor), pages);
52
+ }
53
+ export async function judgedDeliveries(transport, judge, judged, floor, covered, pages) {
54
+ const scanned = await scan(transport, judge, { floor, memo: DELIVERY_MEMO_PREFIX, pages, covered });
55
+ const { transactions, complete } = scanned;
56
+ const deliveries = transactions.flatMap(({ signature, slot, blockTime, failed, memos, feePayer }) => failed || feePayer === undefined
57
+ ? []
58
+ : (memos ?? [])
59
+ .slice(0, MEMOS_PER_TRANSACTION)
60
+ .map(parseDeliveryMemo)
61
+ .flatMap((memo) => memo === null || !judged.has(memo.intent)
62
+ ? []
63
+ : [{ ...memo, worker: feePayer, signature: signature, slot, blockTime }]));
64
+ return { deliveries, complete: complete && !transactions.some(({ unread }) => unread === true), pages: scanned.pages };
65
+ }
66
+ export async function deliveriesOf(transport, judge, intent) {
67
+ return (await deliveryRecord(transport, judge, intent)).deliveries;
68
+ }
69
+ const earlier = (a, b) => a.slot < b.slot || (a.slot === b.slot && a.signature < b.signature);
70
+ export function firstDelivery(deliveries, sha256) {
71
+ let first = null;
72
+ for (const delivery of deliveries) {
73
+ if (delivery.sha256 === sha256 && (first === null || earlier(delivery, first))) {
74
+ first = delivery;
75
+ }
76
+ }
77
+ return first;
78
+ }
79
+ export function announcements(deliveries) {
80
+ const hashes = [...new Set(deliveries.map(({ sha256 }) => sha256))];
81
+ return hashes
82
+ .flatMap((sha256) => {
83
+ const first = firstDelivery(deliveries, sha256);
84
+ if (first === null) {
85
+ return [];
86
+ }
87
+ const others = new Set(deliveries.filter((d) => d.sha256 === sha256 && d.worker !== first.worker).map(({ worker }) => worker));
88
+ return [{ sha256, first, copies: others.size }];
89
+ })
90
+ .sort((a, b) => (earlier(a.first, b.first) ? -1 : earlier(b.first, a.first) ? 1 : 0));
91
+ }
92
+ //# sourceMappingURL=job-deliveries.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"job-deliveries.js","sourceRoot":"","sources":["../../src/job-deliveries.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { type Address, type Instruction, type TransactionSigner } from "@solana/kit";
2
+ import { type EngineTransaction } from "./transport.js";
3
+ export declare const RELEASE_MARK = " release:";
4
+ export type FollowUp = {
5
+ sha256: string;
6
+ release: string;
7
+ };
8
+ export declare function followUpMemo(sha256: string, release: string): string;
9
+ export declare function parseFollowUpMemo(text: string): FollowUp | null;
10
+ export declare function memosSignedBy(transaction: EngineTransaction, signer: Address): string[];
11
+ export declare function followUpOf(transactions: readonly EngineTransaction[], release: string, attestor: Address): (FollowUp & {
12
+ signature: string;
13
+ }) | null;
14
+ export declare function recordedDelivery(transactions: readonly EngineTransaction[], release: EngineTransaction, attestor: Address): string | null;
15
+ export declare function followUpInstructions(judge: TransactionSigner, intent: Address, sha256: string, release: string): Instruction[];
16
+ export declare function memoInstruction(signer: TransactionSigner, text: string): Instruction;
@@ -0,0 +1,51 @@
1
+ import { AccountRole } from "@solana/kit";
2
+ import { getTransferSolInstruction } from "@solana-program/system";
3
+ import { parseReleaseMemo, releaseMemo } from "@intent-engine/core";
4
+ import { MEMO_PROGRAM_ADDRESS } from "./transport.js";
5
+ export const RELEASE_MARK = " release:";
6
+ const BASE58_SIGNATURE = /^[1-9A-HJ-NP-Za-km-z]{32,88}$/;
7
+ export function followUpMemo(sha256, release) {
8
+ if (!BASE58_SIGNATURE.test(release)) {
9
+ throw new RangeError("a follow-up names its release by a base58 signature");
10
+ }
11
+ return `${releaseMemo(sha256)}${RELEASE_MARK}${release}`;
12
+ }
13
+ export function parseFollowUpMemo(text) {
14
+ const at = text.indexOf(RELEASE_MARK);
15
+ if (at < 0) {
16
+ return null;
17
+ }
18
+ const sha256 = parseReleaseMemo(text.slice(0, at));
19
+ const release = text.slice(at + RELEASE_MARK.length);
20
+ return sha256 === null || !BASE58_SIGNATURE.test(release) ? null : { sha256, release };
21
+ }
22
+ export function memosSignedBy(transaction, signer) {
23
+ return (transaction.memos ?? []).filter((_, i) => transaction.memoSigners?.[i]?.includes(signer) === true);
24
+ }
25
+ export function followUpOf(transactions, release, attestor) {
26
+ for (const transaction of transactions) {
27
+ if (transaction.failed || transaction.feePayer !== attestor) {
28
+ continue;
29
+ }
30
+ const found = (transaction.memos ?? []).map(parseFollowUpMemo).find((memo) => memo !== null && memo.release === release);
31
+ if (found !== undefined && found !== null) {
32
+ return { ...found, signature: transaction.signature };
33
+ }
34
+ }
35
+ return null;
36
+ }
37
+ export function recordedDelivery(transactions, release, attestor) {
38
+ const inline = memosSignedBy(release, attestor).map(parseReleaseMemo).find((hash) => hash !== null);
39
+ if (inline !== undefined) {
40
+ return inline;
41
+ }
42
+ return followUpOf(transactions, release.signature, attestor)?.sha256 ?? null;
43
+ }
44
+ export function followUpInstructions(judge, intent, sha256, release) {
45
+ return [memoInstruction(judge, followUpMemo(sha256, release)), getTransferSolInstruction({ source: judge, destination: intent, amount: 0n })];
46
+ }
47
+ export function memoInstruction(signer, text) {
48
+ const meta = { address: signer.address, role: AccountRole.READONLY_SIGNER, signer };
49
+ return { programAddress: MEMO_PROGRAM_ADDRESS, accounts: [meta], data: new TextEncoder().encode(text) };
50
+ }
51
+ //# sourceMappingURL=job-memos.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"job-memos.js","sourceRoot":"","sources":["../../src/job-memos.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import type { Address } from "@solana/kit";
2
+ import { type DeliveryRecord } from "./job-deliveries.js";
3
+ import type { EngineTransaction, Transport } from "./transport.js";
4
+ export type EscrowProof = {
5
+ attestor: Address;
6
+ specHash: string;
7
+ };
8
+ export type EscrowOrigin = {
9
+ intent: Address;
10
+ signature: string;
11
+ slot: bigint;
12
+ createdAt: bigint | null;
13
+ proof: EscrowProof | null;
14
+ };
15
+ export type EngineCall = {
16
+ data: Uint8Array;
17
+ accounts: Address[] | undefined;
18
+ inner: boolean;
19
+ };
20
+ export declare function engineCalls(transaction: EngineTransaction): EngineCall[];
21
+ export declare function creationProof(transaction: EngineTransaction, intent: Address): EscrowProof | null;
22
+ export declare function escrowOrigin(transport: Transport, intent: Address, pages?: number): Promise<EscrowOrigin | null>;
23
+ export declare function originDeliveries(transport: Transport, judge: Address, origin: EscrowOrigin, pages?: number): Promise<DeliveryRecord>;
24
+ export type Lifecycle = {
25
+ intent: Address;
26
+ createdAt: bigint | null;
27
+ from: bigint | null;
28
+ to: bigint;
29
+ };
30
+ export declare function lifecycleDeliveries(transport: Transport, judge: Address, lifecycle: Lifecycle, pages?: number): Promise<DeliveryRecord>;
@@ -0,0 +1,53 @@
1
+ import { decodeParams, getCreateIntentArgsDecoder, getCreateIntentByAgentDiscriminatorBytes, getCreateIntentDiscriminatorBytes, getCreateIntentSignedDiscriminatorBytes, Kind, } from "@intent-engine/core";
2
+ import { judgedDeliveries } from "./job-deliveries.js";
3
+ import { createdAtOf, createdIn, hex } from "./job-proofs.js";
4
+ import { DELIVERY_PAGES, scan } from "./job-scan.js";
5
+ const CREATE_DISCRIMINATORS = [
6
+ getCreateIntentDiscriminatorBytes(),
7
+ getCreateIntentByAgentDiscriminatorBytes(),
8
+ getCreateIntentSignedDiscriminatorBytes(),
9
+ ];
10
+ const DISCRIMINATOR_BYTES = 8;
11
+ export function engineCalls(transaction) {
12
+ return [
13
+ ...(transaction.called ?? []).map((data, i) => ({ data, accounts: transaction.calledAccounts?.[i], inner: false })),
14
+ ...transaction.emitted.map((data, i) => ({ data, accounts: transaction.emittedAccounts?.[i], inner: true })),
15
+ ];
16
+ }
17
+ const startsWith = (data, head) => data.length >= head.length && head.every((b, i) => data[i] === b);
18
+ export function creationProof(transaction, intent) {
19
+ for (const { data, accounts } of engineCalls(transaction)) {
20
+ if (!CREATE_DISCRIMINATORS.some((head) => startsWith(data, head)) || accounts === undefined || !accounts.includes(intent)) {
21
+ continue;
22
+ }
23
+ try {
24
+ const args = getCreateIntentArgsDecoder().decode(data, DISCRIMINATOR_BYTES);
25
+ const params = decodeParams(args.kind, Uint8Array.from(args.params));
26
+ return params.kind === Kind.AttestedResult ? { attestor: params.attestor, specHash: hex(params.specHash) } : null;
27
+ }
28
+ catch {
29
+ continue;
30
+ }
31
+ }
32
+ return null;
33
+ }
34
+ export async function escrowOrigin(transport, intent, pages = DELIVERY_PAGES) {
35
+ const floor = await createdAtOf(transport, intent);
36
+ const created = (transaction) => !transaction.failed && createdIn(transaction.emitted, intent);
37
+ const { transactions } = await scan(transport, intent, { floor, pages, until: created });
38
+ const tx = transactions.find(created);
39
+ return tx === undefined ? null : { intent, signature: tx.signature, slot: tx.slot, createdAt: floor ?? tx.blockTime, proof: creationProof(tx, intent) };
40
+ }
41
+ export async function originDeliveries(transport, judge, origin, pages = DELIVERY_PAGES) {
42
+ const { firstAvailableSlot } = transport;
43
+ const covered = async () => firstAvailableSlot !== undefined && (await firstAvailableSlot.call(transport)) <= origin.slot;
44
+ return judgedDeliveries(transport, judge, new Set([origin.intent]), origin.createdAt, covered, pages);
45
+ }
46
+ export async function lifecycleDeliveries(transport, judge, lifecycle, pages = DELIVERY_PAGES) {
47
+ const { firstAvailableSlot } = transport;
48
+ const { from, to } = lifecycle;
49
+ const covered = async () => from !== null && firstAvailableSlot !== undefined && (await firstAvailableSlot.call(transport)) <= from;
50
+ const record = await judgedDeliveries(transport, judge, new Set([lifecycle.intent]), lifecycle.createdAt, covered, pages);
51
+ return { ...record, deliveries: record.deliveries.filter(({ slot }) => (from === null || slot >= from) && slot <= to) };
52
+ }
53
+ //# sourceMappingURL=job-origins.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"job-origins.js","sourceRoot":"","sources":["../../src/job-origins.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { Address } from "@solana/kit";
2
+ import { type AttestedResultParams, type Intent } from "@intent-engine/core";
3
+ import type { Transport } from "./transport.js";
4
+ export declare const JOBS_LIMIT = 50;
5
+ export type Proof = {
6
+ address: Address;
7
+ intent: Intent;
8
+ params: AttestedResultParams;
9
+ };
10
+ export declare const hex: (bytes: Uint8Array) => string;
11
+ export declare function intentAt(transport: Transport, address: Address): Promise<Intent | null>;
12
+ export declare function proofAt(transport: Transport, address: Address): Promise<Proof | null>;
13
+ export declare function createdAtOf(transport: Transport, address: Address): Promise<bigint | null>;
14
+ export declare function openProofEscrows(transport: Transport, attestor?: Address, limit?: number): Promise<Proof[]>;
15
+ export declare const createdIn: (emitted: readonly Uint8Array[], intent: Address) => boolean;
16
+ export declare function creationSlotOf(transport: Transport, intent: Address, createdAt?: bigint): Promise<bigint | null>;
17
+ export declare function historyCovers(transport: Transport, intent: Address, createdAt?: bigint): Promise<boolean>;
@@ -0,0 +1,54 @@
1
+ import { decodeEvent, decodeParams, getIntentDecoder, getIntentDiscriminatorBytes, getIntentSize, INTENT_ENGINE_PROGRAM_ADDRESS, IntentStatus, Kind, } from "@intent-engine/core";
2
+ import { chainTime, createdAccount } from "./accounts.js";
3
+ import { scan } from "./job-scan.js";
4
+ export const JOBS_LIMIT = 50;
5
+ export const hex = (bytes) => Buffer.from(bytes).toString("hex");
6
+ function proofOf(address, intent) {
7
+ const params = decodeParams(intent.kind, Uint8Array.from(intent.params));
8
+ return params.kind === Kind.AttestedResult && params.specHash.some((b) => b !== 0) ? { address, intent, params } : null;
9
+ }
10
+ export async function intentAt(transport, address) {
11
+ const view = await createdAccount(transport, address);
12
+ const tag = getIntentDiscriminatorBytes();
13
+ if (view === null || view.owner !== INTENT_ENGINE_PROGRAM_ADDRESS || view.data.length !== getIntentSize() || !tag.every((b, i) => view.data[i] === b)) {
14
+ return null;
15
+ }
16
+ return getIntentDecoder().decode(view.data);
17
+ }
18
+ export async function proofAt(transport, address) {
19
+ const intent = await intentAt(transport, address);
20
+ return intent === null ? null : proofOf(address, intent);
21
+ }
22
+ export async function createdAtOf(transport, address) {
23
+ return (await intentAt(transport, address))?.createdAt ?? null;
24
+ }
25
+ export async function openProofEscrows(transport, attestor, limit = JOBS_LIMIT) {
26
+ const [accounts, now] = await Promise.all([transport.intents(), chainTime(transport)]);
27
+ return accounts
28
+ .map(({ address, data }) => proofOf(address, getIntentDecoder().decode(data)))
29
+ .filter((proof) => proof !== null &&
30
+ proof.intent.status === IntentStatus.Open &&
31
+ proof.intent.expiresAt > now &&
32
+ (attestor === undefined || proof.params.attestor === attestor))
33
+ .sort((a, b) => (a.intent.expiresAt === b.intent.expiresAt ? 0 : a.intent.expiresAt > b.intent.expiresAt ? -1 : 1))
34
+ .slice(0, limit);
35
+ }
36
+ export const createdIn = (emitted, intent) => emitted.some((data) => {
37
+ const event = decodeEvent(data);
38
+ return event?.name === "IntentCreated" && "intent" in event.fields && event.fields.intent === intent;
39
+ });
40
+ export async function creationSlotOf(transport, intent, createdAt) {
41
+ const floor = createdAt ?? (await createdAtOf(transport, intent));
42
+ const created = (transaction) => !transaction.failed && createdIn(transaction.emitted, intent);
43
+ const { transactions } = await scan(transport, intent, { floor, until: created });
44
+ return transactions.find(created)?.slot ?? null;
45
+ }
46
+ export async function historyCovers(transport, intent, createdAt) {
47
+ const { firstAvailableSlot } = transport;
48
+ if (firstAvailableSlot === undefined) {
49
+ return false;
50
+ }
51
+ const slot = await creationSlotOf(transport, intent, createdAt);
52
+ return slot !== null && (await firstAvailableSlot.call(transport)) <= slot;
53
+ }
54
+ //# sourceMappingURL=job-proofs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"job-proofs.js","sourceRoot":"","sources":["../../src/job-proofs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { Address } from "@solana/kit";
2
+ import { type EngineTransaction, type Transport } from "./transport.js";
3
+ export declare const DELIVERY_SCAN = 100;
4
+ export declare const DELIVERY_PAGES = 100;
5
+ export declare const SIGNATURE_PAGE = 1000;
6
+ export declare const MEMOS_PER_TRANSACTION = 8;
7
+ export type Scan = {
8
+ transactions: EngineTransaction[];
9
+ complete: boolean;
10
+ pages: number;
11
+ };
12
+ export type ScanOptions = {
13
+ floor?: bigint | null;
14
+ memo?: string;
15
+ pages?: number;
16
+ until?: (transaction: EngineTransaction) => boolean;
17
+ covered?: () => Promise<boolean>;
18
+ };
19
+ export declare function scan(transport: Transport, of: Address, options?: ScanOptions): Promise<Scan>;
20
+ export declare function transactionAt(transport: Transport, signature: string, of?: Address): Promise<EngineTransaction | null>;
@@ -0,0 +1,70 @@
1
+ import { TRANSACTION_FETCHES } from "./transport.js";
2
+ export const DELIVERY_SCAN = 100;
3
+ export const DELIVERY_PAGES = 100;
4
+ export const SIGNATURE_PAGE = 1000;
5
+ export const MEMOS_PER_TRANSACTION = 8;
6
+ const memoMatches = (memo, texts) => memo === undefined || texts.some((text) => text.includes(memo));
7
+ const reaches = (floor) => ({ blockTime }) => floor === null || blockTime === null || blockTime >= floor;
8
+ async function fallbackScan(transport, of, options) {
9
+ const { floor = null, memo, until, covered } = options;
10
+ const found = await transport.engineTransactions(DELIVERY_SCAN, of);
11
+ const within = found.filter(reaches(floor));
12
+ const transactions = [];
13
+ for (const transaction of within) {
14
+ if (transaction.failed || !memoMatches(memo, transaction.memos ?? [])) {
15
+ continue;
16
+ }
17
+ transactions.push(transaction);
18
+ if (until?.(transaction) === true) {
19
+ return { transactions, complete: true, pages: 1 };
20
+ }
21
+ }
22
+ if (within.length < found.length) {
23
+ return { transactions, complete: true, pages: 1 };
24
+ }
25
+ return { transactions, complete: found.length < DELIVERY_SCAN && (await covered?.()) === true, pages: 1 };
26
+ }
27
+ export async function scan(transport, of, options = {}) {
28
+ const { floor = null, memo, pages = DELIVERY_PAGES, until, covered } = options;
29
+ const { signaturesOf, transactionsOf } = transport;
30
+ if (signaturesOf === undefined || transactionsOf === undefined) {
31
+ return fallbackScan(transport, of, options);
32
+ }
33
+ const transactions = [];
34
+ let before;
35
+ let next;
36
+ for (let page = 1; page <= pages; page++) {
37
+ const listed = next ?? (await signaturesOf.call(transport, of, SIGNATURE_PAGE, before));
38
+ next = undefined;
39
+ const within = listed.filter(reaches(floor));
40
+ const wanted = within.filter((entry) => !entry.failed && memoMatches(memo, entry.memo === null ? [] : [entry.memo]));
41
+ for (let at = 0; at < wanted.length; at += TRANSACTION_FETCHES) {
42
+ for (const transaction of await transactionsOf.call(transport, wanted.slice(at, at + TRANSACTION_FETCHES))) {
43
+ transactions.push(transaction);
44
+ if (until?.(transaction) === true) {
45
+ return { transactions, complete: true, pages: page };
46
+ }
47
+ }
48
+ }
49
+ if (within.length < listed.length) {
50
+ return { transactions, complete: true, pages: page };
51
+ }
52
+ before = listed[listed.length - 1]?.signature;
53
+ if (listed.length < SIGNATURE_PAGE) {
54
+ const more = before === undefined ? [] : await signaturesOf.call(transport, of, SIGNATURE_PAGE, before);
55
+ if (more.length === 0) {
56
+ return { transactions, complete: (await covered?.()) === true, pages: page };
57
+ }
58
+ next = more;
59
+ }
60
+ }
61
+ return { transactions, complete: false, pages };
62
+ }
63
+ export async function transactionAt(transport, signature, of) {
64
+ const { transactionOf } = transport;
65
+ if (transactionOf !== undefined) {
66
+ return transactionOf.call(transport, signature);
67
+ }
68
+ return (await transport.engineTransactions(DELIVERY_SCAN, of)).find((transaction) => transaction.signature === signature) ?? null;
69
+ }
70
+ //# sourceMappingURL=job-scan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"job-scan.js","sourceRoot":"","sources":["../../src/job-scan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import type { Address } from "@solana/kit";
2
+ import { type Transport } from "./transport.js";
3
+ export declare const SPEC_SCAN = 10;
4
+ export declare const MAINNET_GENESIS_HASH = "5eykt4UsFv8P8NJdTREpY1vzqKqZKvdpKuc147dw2N9d";
5
+ export declare const DEVNET_GENESIS_HASH = "EtWTRABZaYq6iMfeYKouRu166VU2xqa1wcaWoxPkrZBG";
6
+ export declare const TESTNET_GENESIS_HASH = "4uhcVJyU9pJkvQyS88uRDiswHXSCkY3zQawwpjk2NsfY";
7
+ export declare const PUBLIC_GENESIS_HASHES: ReadonlySet<string>;
8
+ export declare const MAX_SPEC_BYTES = 1048576;
9
+ export declare const SPEC_TIMEOUT_MS = 10000;
10
+ export declare const PLAIN_HTTP_ON_PUBLIC = "is a plain http url, which a public cluster may not use";
11
+ export declare function plainHttpOnPublic(transport: Transport, url: string): Promise<boolean>;
12
+ export type Job = {
13
+ intent: Address;
14
+ owner: Address;
15
+ nonce: bigint;
16
+ attestor: Address;
17
+ specHash: string;
18
+ specUrl: string | null;
19
+ sells: bigint;
20
+ judgeFee: bigint;
21
+ inputMint: Address;
22
+ expiresAt: bigint;
23
+ };
24
+ export type Spec = {
25
+ url: string;
26
+ text: string;
27
+ sha256: string;
28
+ matches: boolean;
29
+ };
30
+ export type SpecFetch = (url: string, init: {
31
+ redirect: "error";
32
+ signal: AbortSignal;
33
+ }) => Promise<Response>;
34
+ export declare class SpecUnreadable extends Error {
35
+ readonly url: string;
36
+ constructor(url: string, reason: string);
37
+ }
38
+ export declare function specUrlOf(transport: Transport, intent: Address, createdAt?: bigint): Promise<string | null>;
39
+ export declare function jobsOf(transport: Transport, attestor?: Address): Promise<Job[]>;
40
+ export declare function readSpec(transport: Transport, get: SpecFetch, intent: Address): Promise<Spec | null>;