@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.
- package/dist/src/budget.d.ts +6 -4
- package/dist/src/budget.js +24 -9
- package/dist/src/budget.js.map +1 -1
- package/dist/src/client-errors.d.ts +28 -0
- package/dist/src/client-errors.js +55 -0
- package/dist/src/client-errors.js.map +1 -0
- package/dist/src/client-intents.d.ts +12 -0
- package/dist/src/client-intents.js +133 -0
- package/dist/src/client-intents.js.map +1 -0
- package/dist/src/client-reads.d.ts +7 -0
- package/dist/src/client-reads.js +61 -0
- package/dist/src/client-reads.js.map +1 -0
- package/dist/src/client-settle.d.ts +2 -0
- package/dist/src/client-settle.js +84 -0
- package/dist/src/client-settle.js.map +1 -0
- package/dist/src/client-types.d.ts +145 -0
- package/dist/src/client-types.js +9 -0
- package/dist/src/client-types.js.map +1 -0
- package/dist/src/client-watch.d.ts +4 -0
- package/dist/src/client-watch.js +97 -0
- package/dist/src/client-watch.js.map +1 -0
- package/dist/src/client.d.ts +4 -140
- package/dist/src/client.js +16 -309
- package/dist/src/client.js.map +1 -1
- package/dist/src/confirmation.d.ts +11 -0
- package/dist/src/confirmation.js +94 -0
- package/dist/src/confirmation.js.map +1 -0
- package/dist/src/intent-notifications.d.ts +13 -0
- package/dist/src/intent-notifications.js +106 -0
- package/dist/src/intent-notifications.js.map +1 -0
- package/dist/src/job-deliveries.d.ts +40 -0
- package/dist/src/job-deliveries.js +92 -0
- package/dist/src/job-deliveries.js.map +1 -0
- package/dist/src/job-memos.d.ts +16 -0
- package/dist/src/job-memos.js +51 -0
- package/dist/src/job-memos.js.map +1 -0
- package/dist/src/job-origins.d.ts +30 -0
- package/dist/src/job-origins.js +53 -0
- package/dist/src/job-origins.js.map +1 -0
- package/dist/src/job-proofs.d.ts +17 -0
- package/dist/src/job-proofs.js +54 -0
- package/dist/src/job-proofs.js.map +1 -0
- package/dist/src/job-scan.d.ts +20 -0
- package/dist/src/job-scan.js +70 -0
- package/dist/src/job-scan.js.map +1 -0
- package/dist/src/job-specs.d.ts +40 -0
- package/dist/src/job-specs.js +107 -0
- package/dist/src/job-specs.js.map +1 -0
- package/dist/src/jobs.d.ts +6 -77
- package/dist/src/jobs.js +6 -186
- package/dist/src/jobs.js.map +1 -1
- package/dist/src/memoized-transport.d.ts +4 -0
- package/dist/src/memoized-transport.js +66 -0
- package/dist/src/memoized-transport.js.map +1 -0
- package/dist/src/rpc-retry.d.ts +16 -0
- package/dist/src/rpc-retry.js +62 -0
- package/dist/src/rpc-retry.js.map +1 -0
- package/dist/src/rpc-shapes.d.ts +230 -0
- package/dist/src/rpc-shapes.js +2 -0
- package/dist/src/rpc-shapes.js.map +1 -0
- package/dist/src/rpc-transport.d.ts +6 -0
- package/dist/src/rpc-transport.js +236 -0
- package/dist/src/rpc-transport.js.map +1 -0
- package/dist/src/svm.js +83 -27
- package/dist/src/svm.js.map +1 -1
- package/dist/src/transaction-keys.d.ts +6 -0
- package/dist/src/transaction-keys.js +19 -0
- package/dist/src/transaction-keys.js.map +1 -0
- package/dist/src/transport.d.ts +7 -223
- package/dist/src/transport.js +6 -467
- package/dist/src/transport.js.map +1 -1
- package/package.json +16 -5
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { parseSpecMemo, remainingOf, SPEC_MEMO_PREFIX } from "@intent-engine/core";
|
|
3
|
+
import { createdIn, hex, openProofEscrows, proofAt } from "./job-proofs.js";
|
|
4
|
+
import { MEMOS_PER_TRANSACTION, scan } from "./job-scan.js";
|
|
5
|
+
import { TRANSACTION_FETCHES } from "./transport.js";
|
|
6
|
+
export const SPEC_SCAN = 10;
|
|
7
|
+
export const MAINNET_GENESIS_HASH = "5eykt4UsFv8P8NJdTREpY1vzqKqZKvdpKuc147dw2N9d";
|
|
8
|
+
export const DEVNET_GENESIS_HASH = "EtWTRABZaYq6iMfeYKouRu166VU2xqa1wcaWoxPkrZBG";
|
|
9
|
+
export const TESTNET_GENESIS_HASH = "4uhcVJyU9pJkvQyS88uRDiswHXSCkY3zQawwpjk2NsfY";
|
|
10
|
+
export const PUBLIC_GENESIS_HASHES = new Set([MAINNET_GENESIS_HASH, DEVNET_GENESIS_HASH, TESTNET_GENESIS_HASH]);
|
|
11
|
+
export const MAX_SPEC_BYTES = 1_048_576;
|
|
12
|
+
export const SPEC_TIMEOUT_MS = 10_000;
|
|
13
|
+
export const PLAIN_HTTP_ON_PUBLIC = "is a plain http url, which a public cluster may not use";
|
|
14
|
+
export async function plainHttpOnPublic(transport, url) {
|
|
15
|
+
let protocol;
|
|
16
|
+
try {
|
|
17
|
+
protocol = new URL(url).protocol;
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
return protocol === "http:" && PUBLIC_GENESIS_HASHES.has(await transport.genesisHash());
|
|
23
|
+
}
|
|
24
|
+
export class SpecUnreadable extends Error {
|
|
25
|
+
url;
|
|
26
|
+
constructor(url, reason) {
|
|
27
|
+
super(`the spec at ${url} ${reason}`);
|
|
28
|
+
this.name = "SpecUnreadable";
|
|
29
|
+
this.url = url;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
export async function specUrlOf(transport, intent, createdAt) {
|
|
33
|
+
const floor = createdAt ?? (await proofAt(transport, intent))?.intent.createdAt ?? null;
|
|
34
|
+
const created = (transaction) => !transaction.failed && createdIn(transaction.emitted, intent);
|
|
35
|
+
const { transactions } = await scan(transport, intent, { floor, memo: SPEC_MEMO_PREFIX, until: created });
|
|
36
|
+
const tx = transactions.find(created);
|
|
37
|
+
if (tx === undefined) {
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
const urls = new Set((tx.memos ?? [])
|
|
41
|
+
.slice(0, MEMOS_PER_TRANSACTION)
|
|
42
|
+
.map(parseSpecMemo)
|
|
43
|
+
.flatMap((memo) => (memo === null ? [] : [memo.url])));
|
|
44
|
+
return urls.size === 1 ? ([...urls][0] ?? null) : null;
|
|
45
|
+
}
|
|
46
|
+
export async function jobsOf(transport, attestor) {
|
|
47
|
+
const proofs = await openProofEscrows(transport, attestor);
|
|
48
|
+
const urls = [];
|
|
49
|
+
for (let at = 0; at < proofs.length; at += TRANSACTION_FETCHES) {
|
|
50
|
+
urls.push(...(await Promise.all(proofs.slice(at, at + TRANSACTION_FETCHES).map(({ address, intent }) => specUrlOf(transport, address, intent.createdAt)))));
|
|
51
|
+
}
|
|
52
|
+
return proofs.map(({ address, intent, params }, i) => ({
|
|
53
|
+
intent: address,
|
|
54
|
+
owner: intent.owner,
|
|
55
|
+
nonce: intent.nonce,
|
|
56
|
+
attestor: params.attestor,
|
|
57
|
+
specHash: hex(params.specHash),
|
|
58
|
+
specUrl: urls[i] ?? null,
|
|
59
|
+
sells: remainingOf(intent),
|
|
60
|
+
judgeFee: params.judgeFee,
|
|
61
|
+
inputMint: intent.inputMint,
|
|
62
|
+
expiresAt: intent.expiresAt,
|
|
63
|
+
}));
|
|
64
|
+
}
|
|
65
|
+
async function discarded(response) {
|
|
66
|
+
await response.body?.cancel().catch(() => undefined);
|
|
67
|
+
}
|
|
68
|
+
async function bounded(response, url) {
|
|
69
|
+
if (!response.ok) {
|
|
70
|
+
await discarded(response);
|
|
71
|
+
throw new SpecUnreadable(url, `answered ${response.status}`);
|
|
72
|
+
}
|
|
73
|
+
const declared = Number(response.headers.get("content-length") ?? "0");
|
|
74
|
+
if (declared > MAX_SPEC_BYTES) {
|
|
75
|
+
await discarded(response);
|
|
76
|
+
throw new SpecUnreadable(url, `is larger than ${MAX_SPEC_BYTES} bytes`);
|
|
77
|
+
}
|
|
78
|
+
const reader = response.body?.getReader();
|
|
79
|
+
const chunks = [];
|
|
80
|
+
let size = 0;
|
|
81
|
+
for (let next = await reader?.read(); next !== undefined && next.done !== true; next = await reader?.read()) {
|
|
82
|
+
size += next.value.length;
|
|
83
|
+
if (size > MAX_SPEC_BYTES) {
|
|
84
|
+
await reader?.cancel();
|
|
85
|
+
throw new SpecUnreadable(url, `is larger than ${MAX_SPEC_BYTES} bytes`);
|
|
86
|
+
}
|
|
87
|
+
chunks.push(next.value);
|
|
88
|
+
}
|
|
89
|
+
return Buffer.concat(chunks);
|
|
90
|
+
}
|
|
91
|
+
export async function readSpec(transport, get, intent) {
|
|
92
|
+
const proof = await proofAt(transport, intent);
|
|
93
|
+
if (proof === null) {
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
96
|
+
const url = await specUrlOf(transport, intent, proof.intent.createdAt);
|
|
97
|
+
if (url === null) {
|
|
98
|
+
return null;
|
|
99
|
+
}
|
|
100
|
+
if (await plainHttpOnPublic(transport, url)) {
|
|
101
|
+
throw new SpecUnreadable(url, PLAIN_HTTP_ON_PUBLIC);
|
|
102
|
+
}
|
|
103
|
+
const bytes = await bounded(await get(url, { redirect: "error", signal: AbortSignal.timeout(SPEC_TIMEOUT_MS) }), url);
|
|
104
|
+
const sha256 = createHash("sha256").update(bytes).digest("hex");
|
|
105
|
+
return { url, text: new TextDecoder().decode(bytes), sha256, matches: sha256 === hex(proof.params.specHash) };
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=job-specs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"job-specs.js","sourceRoot":"","sources":["../../src/job-specs.ts"],"names":[],"mappings":"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"}
|
package/dist/src/jobs.d.ts
CHANGED
|
@@ -1,77 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
export
|
|
5
|
-
export
|
|
6
|
-
export
|
|
7
|
-
export declare const MEMOS_PER_TRANSACTION = 8;
|
|
8
|
-
export declare const MAX_SPEC_BYTES = 1048576;
|
|
9
|
-
export declare const SPEC_TIMEOUT_MS = 10000;
|
|
10
|
-
export type Job = {
|
|
11
|
-
intent: Address;
|
|
12
|
-
owner: Address;
|
|
13
|
-
nonce: bigint;
|
|
14
|
-
attestor: Address;
|
|
15
|
-
specHash: string;
|
|
16
|
-
specUrl: string | null;
|
|
17
|
-
sells: bigint;
|
|
18
|
-
judgeFee: bigint;
|
|
19
|
-
inputMint: Address;
|
|
20
|
-
expiresAt: bigint;
|
|
21
|
-
};
|
|
22
|
-
export type Spec = {
|
|
23
|
-
url: string;
|
|
24
|
-
text: string;
|
|
25
|
-
sha256: string;
|
|
26
|
-
matches: boolean;
|
|
27
|
-
};
|
|
28
|
-
export type DeliverInput = {
|
|
29
|
-
worker: TransactionSigner;
|
|
30
|
-
intent: Address;
|
|
31
|
-
sha256: string;
|
|
32
|
-
url: string;
|
|
33
|
-
};
|
|
34
|
-
export type Delivery = {
|
|
35
|
-
intent: Address;
|
|
36
|
-
worker: Address;
|
|
37
|
-
sha256: string;
|
|
38
|
-
url: string;
|
|
39
|
-
signature: Signature;
|
|
40
|
-
slot: bigint;
|
|
41
|
-
blockTime: bigint | null;
|
|
42
|
-
};
|
|
43
|
-
export type Announcement = {
|
|
44
|
-
sha256: string;
|
|
45
|
-
first: Delivery;
|
|
46
|
-
copies: number;
|
|
47
|
-
};
|
|
48
|
-
export type SpecFetch = (url: string, init: {
|
|
49
|
-
redirect: "error";
|
|
50
|
-
signal: AbortSignal;
|
|
51
|
-
}) => Promise<Response>;
|
|
52
|
-
export declare class NotDeliverable extends Error {
|
|
53
|
-
readonly intent: Address;
|
|
54
|
-
constructor(intent: Address, reason: string);
|
|
55
|
-
}
|
|
56
|
-
export declare class SpecUnreadable extends Error {
|
|
57
|
-
readonly url: string;
|
|
58
|
-
constructor(url: string, reason: string);
|
|
59
|
-
}
|
|
60
|
-
type Proof = {
|
|
61
|
-
address: Address;
|
|
62
|
-
intent: Intent;
|
|
63
|
-
params: AttestedResultParams;
|
|
64
|
-
};
|
|
65
|
-
export declare function openProofEscrows(transport: Transport, attestor?: Address): Promise<Proof[]>;
|
|
66
|
-
export declare function specUrlOf(transport: Transport, intent: Address): Promise<string | null>;
|
|
67
|
-
export declare function jobsOf(transport: Transport, attestor?: Address): Promise<Job[]>;
|
|
68
|
-
export declare function readSpec(transport: Transport, get: SpecFetch, intent: Address): Promise<Spec | null>;
|
|
69
|
-
export declare function memoInstruction(signer: TransactionSigner, text: string): Instruction;
|
|
70
|
-
export declare function deliveryInstructions(transport: Transport, input: DeliverInput): Promise<{
|
|
71
|
-
attestor: Address;
|
|
72
|
-
instructions: Instruction[];
|
|
73
|
-
}>;
|
|
74
|
-
export declare function deliveriesOf(transport: Transport, judge: Address, intent?: Address): Promise<Delivery[]>;
|
|
75
|
-
export declare function firstDelivery(deliveries: readonly Delivery[], sha256: string): Delivery | null;
|
|
76
|
-
export declare function announcements(deliveries: readonly Delivery[]): Announcement[];
|
|
77
|
-
export {};
|
|
1
|
+
export { DELIVERY_PAGES, DELIVERY_SCAN, MEMOS_PER_TRANSACTION, type Scan, scan, type ScanOptions, SIGNATURE_PAGE, transactionAt, } from "./job-scan.js";
|
|
2
|
+
export { createdAtOf, creationSlotOf, historyCovers, intentAt, JOBS_LIMIT, openProofEscrows } from "./job-proofs.js";
|
|
3
|
+
export { DEVNET_GENESIS_HASH, type Job, jobsOf, MAINNET_GENESIS_HASH, MAX_SPEC_BYTES, PLAIN_HTTP_ON_PUBLIC, plainHttpOnPublic, PUBLIC_GENESIS_HASHES, readSpec, type Spec, type SpecFetch, SPEC_SCAN, SPEC_TIMEOUT_MS, SpecUnreadable, specUrlOf, TESTNET_GENESIS_HASH, } from "./job-specs.js";
|
|
4
|
+
export { type FollowUp, followUpInstructions, followUpMemo, followUpOf, memoInstruction, memosSignedBy, parseFollowUpMemo, recordedDelivery, RELEASE_MARK, } from "./job-memos.js";
|
|
5
|
+
export { type Announcement, announcements, type DeliverInput, deliveriesOf, type Delivery, deliveryInstructions, deliveryRecord, type DeliveryRecord, firstDelivery, NotDeliverable, } from "./job-deliveries.js";
|
|
6
|
+
export { creationProof, type EngineCall, engineCalls, escrowOrigin, type EscrowOrigin, type EscrowProof, type Lifecycle, lifecycleDeliveries, originDeliveries, } from "./job-origins.js";
|
package/dist/src/jobs.js
CHANGED
|
@@ -1,187 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
export const JOBS_LIMIT = 50;
|
|
8
|
-
export const SPEC_SCAN = 10;
|
|
9
|
-
export const DELIVERY_SCAN = 100;
|
|
10
|
-
export const MEMOS_PER_TRANSACTION = 8;
|
|
11
|
-
export const MAX_SPEC_BYTES = 1_048_576;
|
|
12
|
-
export const SPEC_TIMEOUT_MS = 10_000;
|
|
13
|
-
export class NotDeliverable extends Error {
|
|
14
|
-
intent;
|
|
15
|
-
constructor(intent, reason) {
|
|
16
|
-
super(`intent ${intent} ${reason}`);
|
|
17
|
-
this.name = "NotDeliverable";
|
|
18
|
-
this.intent = intent;
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
export class SpecUnreadable extends Error {
|
|
22
|
-
url;
|
|
23
|
-
constructor(url, reason) {
|
|
24
|
-
super(`the spec at ${url} ${reason}`);
|
|
25
|
-
this.name = "SpecUnreadable";
|
|
26
|
-
this.url = url;
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
const hex = (bytes) => Buffer.from(bytes).toString("hex");
|
|
30
|
-
function proofOf(address, intent) {
|
|
31
|
-
const params = decodeParams(intent.kind, Uint8Array.from(intent.params));
|
|
32
|
-
return params.kind === Kind.AttestedResult && params.specHash.some((b) => b !== 0) ? { address, intent, params } : null;
|
|
33
|
-
}
|
|
34
|
-
async function proofAt(transport, address) {
|
|
35
|
-
const view = await createdAccount(transport, address);
|
|
36
|
-
const tag = getIntentDiscriminatorBytes();
|
|
37
|
-
if (view === null || view.owner !== INTENT_ENGINE_PROGRAM_ADDRESS || view.data.length !== getIntentSize() || !tag.every((b, i) => view.data[i] === b)) {
|
|
38
|
-
return null;
|
|
39
|
-
}
|
|
40
|
-
return proofOf(address, getIntentDecoder().decode(view.data));
|
|
41
|
-
}
|
|
42
|
-
export async function openProofEscrows(transport, attestor) {
|
|
43
|
-
const [accounts, now] = await Promise.all([transport.intents(), chainTime(transport)]);
|
|
44
|
-
return accounts
|
|
45
|
-
.map(({ address, data }) => proofOf(address, getIntentDecoder().decode(data)))
|
|
46
|
-
.filter((proof) => proof !== null &&
|
|
47
|
-
proof.intent.status === IntentStatus.Open &&
|
|
48
|
-
proof.intent.expiresAt > now &&
|
|
49
|
-
(attestor === undefined || proof.params.attestor === attestor))
|
|
50
|
-
.sort((a, b) => (a.intent.expiresAt === b.intent.expiresAt ? 0 : a.intent.expiresAt > b.intent.expiresAt ? -1 : 1))
|
|
51
|
-
.slice(0, JOBS_LIMIT);
|
|
52
|
-
}
|
|
53
|
-
const createdIn = (emitted, intent) => emitted.some((data) => {
|
|
54
|
-
const event = decodeEvent(data);
|
|
55
|
-
return event?.name === "IntentCreated" && "intent" in event.fields && event.fields.intent === intent;
|
|
56
|
-
});
|
|
57
|
-
export async function specUrlOf(transport, intent) {
|
|
58
|
-
for (const tx of await transport.engineTransactions(SPEC_SCAN, intent, SPEC_MEMO_PREFIX)) {
|
|
59
|
-
if (tx.failed || !createdIn(tx.emitted, intent)) {
|
|
60
|
-
continue;
|
|
61
|
-
}
|
|
62
|
-
const urls = new Set((tx.memos ?? [])
|
|
63
|
-
.slice(0, MEMOS_PER_TRANSACTION)
|
|
64
|
-
.map(parseSpecMemo)
|
|
65
|
-
.flatMap((memo) => (memo === null ? [] : [memo.url])));
|
|
66
|
-
return urls.size === 1 ? ([...urls][0] ?? null) : null;
|
|
67
|
-
}
|
|
68
|
-
return null;
|
|
69
|
-
}
|
|
70
|
-
export async function jobsOf(transport, attestor) {
|
|
71
|
-
const proofs = await openProofEscrows(transport, attestor);
|
|
72
|
-
const urls = [];
|
|
73
|
-
for (let at = 0; at < proofs.length; at += TRANSACTION_FETCHES) {
|
|
74
|
-
urls.push(...(await Promise.all(proofs.slice(at, at + TRANSACTION_FETCHES).map(({ address }) => specUrlOf(transport, address)))));
|
|
75
|
-
}
|
|
76
|
-
return proofs.map(({ address, intent, params }, i) => ({
|
|
77
|
-
intent: address,
|
|
78
|
-
owner: intent.owner,
|
|
79
|
-
nonce: intent.nonce,
|
|
80
|
-
attestor: params.attestor,
|
|
81
|
-
specHash: hex(params.specHash),
|
|
82
|
-
specUrl: urls[i] ?? null,
|
|
83
|
-
sells: remainingOf(intent),
|
|
84
|
-
judgeFee: params.judgeFee,
|
|
85
|
-
inputMint: intent.inputMint,
|
|
86
|
-
expiresAt: intent.expiresAt,
|
|
87
|
-
}));
|
|
88
|
-
}
|
|
89
|
-
async function bounded(response, url) {
|
|
90
|
-
if (!response.ok) {
|
|
91
|
-
throw new SpecUnreadable(url, `answered ${response.status}`);
|
|
92
|
-
}
|
|
93
|
-
const declared = Number(response.headers.get("content-length") ?? "0");
|
|
94
|
-
if (declared > MAX_SPEC_BYTES) {
|
|
95
|
-
throw new SpecUnreadable(url, `is larger than ${MAX_SPEC_BYTES} bytes`);
|
|
96
|
-
}
|
|
97
|
-
const reader = response.body?.getReader();
|
|
98
|
-
const chunks = [];
|
|
99
|
-
let size = 0;
|
|
100
|
-
for (let next = await reader?.read(); next !== undefined && next.done !== true; next = await reader?.read()) {
|
|
101
|
-
size += next.value.length;
|
|
102
|
-
if (size > MAX_SPEC_BYTES) {
|
|
103
|
-
await reader?.cancel();
|
|
104
|
-
throw new SpecUnreadable(url, `is larger than ${MAX_SPEC_BYTES} bytes`);
|
|
105
|
-
}
|
|
106
|
-
chunks.push(next.value);
|
|
107
|
-
}
|
|
108
|
-
return Buffer.concat(chunks);
|
|
109
|
-
}
|
|
110
|
-
export async function readSpec(transport, get, intent) {
|
|
111
|
-
const proof = await proofAt(transport, intent);
|
|
112
|
-
if (proof === null) {
|
|
113
|
-
return null;
|
|
114
|
-
}
|
|
115
|
-
const url = await specUrlOf(transport, intent);
|
|
116
|
-
if (url === null) {
|
|
117
|
-
return null;
|
|
118
|
-
}
|
|
119
|
-
const bytes = await bounded(await get(url, { redirect: "error", signal: AbortSignal.timeout(SPEC_TIMEOUT_MS) }), url);
|
|
120
|
-
const sha256 = createHash("sha256").update(bytes).digest("hex");
|
|
121
|
-
return { url, text: new TextDecoder().decode(bytes), sha256, matches: sha256 === hex(proof.params.specHash) };
|
|
122
|
-
}
|
|
123
|
-
export function memoInstruction(signer, text) {
|
|
124
|
-
const meta = { address: signer.address, role: AccountRole.READONLY_SIGNER, signer };
|
|
125
|
-
return { programAddress: MEMO_PROGRAM_ADDRESS, accounts: [meta], data: new TextEncoder().encode(text) };
|
|
126
|
-
}
|
|
127
|
-
export async function deliveryInstructions(transport, input) {
|
|
128
|
-
const { worker, intent } = input;
|
|
129
|
-
const memo = deliveryMemo({ intent, sha256: input.sha256, url: input.url });
|
|
130
|
-
const [proof, now] = await Promise.all([proofAt(transport, intent), chainTime(transport)]);
|
|
131
|
-
if (proof === null) {
|
|
132
|
-
throw new NotDeliverable(intent, "is not a proof escrow: an AttestedResult intent that commits a spec hash");
|
|
133
|
-
}
|
|
134
|
-
if (proof.intent.status !== IntentStatus.Open || proof.intent.expiresAt <= now) {
|
|
135
|
-
throw new NotDeliverable(intent, "is no longer open");
|
|
136
|
-
}
|
|
137
|
-
const attestor = proof.params.attestor;
|
|
138
|
-
return {
|
|
139
|
-
attestor,
|
|
140
|
-
instructions: [memoInstruction(worker, memo), getTransferSolInstruction({ source: worker, destination: attestor, amount: 0n })],
|
|
141
|
-
};
|
|
142
|
-
}
|
|
143
|
-
export async function deliveriesOf(transport, judge, intent) {
|
|
144
|
-
let judged;
|
|
145
|
-
if (intent === undefined) {
|
|
146
|
-
judged = new Set((await openProofEscrows(transport, judge)).map(({ address }) => address));
|
|
147
|
-
}
|
|
148
|
-
else {
|
|
149
|
-
const proof = await proofAt(transport, intent);
|
|
150
|
-
judged = new Set(proof !== null && proof.params.attestor === judge ? [intent] : []);
|
|
151
|
-
}
|
|
152
|
-
if (judged.size === 0) {
|
|
153
|
-
return [];
|
|
154
|
-
}
|
|
155
|
-
return (await transport.engineTransactions(DELIVERY_SCAN, judge, DELIVERY_MEMO_PREFIX)).flatMap(({ signature, slot, blockTime, failed, memos, feePayer }) => failed || feePayer === undefined
|
|
156
|
-
? []
|
|
157
|
-
: (memos ?? [])
|
|
158
|
-
.slice(0, MEMOS_PER_TRANSACTION)
|
|
159
|
-
.map(parseDeliveryMemo)
|
|
160
|
-
.flatMap((memo) => memo === null || !judged.has(memo.intent)
|
|
161
|
-
? []
|
|
162
|
-
: [{ ...memo, worker: feePayer, signature: signature, slot, blockTime }]));
|
|
163
|
-
}
|
|
164
|
-
const earlier = (a, b) => a.slot < b.slot || (a.slot === b.slot && a.signature < b.signature);
|
|
165
|
-
export function firstDelivery(deliveries, sha256) {
|
|
166
|
-
let first = null;
|
|
167
|
-
for (const delivery of deliveries) {
|
|
168
|
-
if (delivery.sha256 === sha256 && (first === null || earlier(delivery, first))) {
|
|
169
|
-
first = delivery;
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
return first;
|
|
173
|
-
}
|
|
174
|
-
export function announcements(deliveries) {
|
|
175
|
-
const hashes = [...new Set(deliveries.map(({ sha256 }) => sha256))];
|
|
176
|
-
return hashes
|
|
177
|
-
.flatMap((sha256) => {
|
|
178
|
-
const first = firstDelivery(deliveries, sha256);
|
|
179
|
-
if (first === null) {
|
|
180
|
-
return [];
|
|
181
|
-
}
|
|
182
|
-
const others = new Set(deliveries.filter((d) => d.sha256 === sha256 && d.worker !== first.worker).map(({ worker }) => worker));
|
|
183
|
-
return [{ sha256, first, copies: others.size }];
|
|
184
|
-
})
|
|
185
|
-
.sort((a, b) => (earlier(a.first, b.first) ? -1 : earlier(b.first, a.first) ? 1 : 0));
|
|
186
|
-
}
|
|
1
|
+
export { DELIVERY_PAGES, DELIVERY_SCAN, MEMOS_PER_TRANSACTION, scan, SIGNATURE_PAGE, transactionAt, } from "./job-scan.js";
|
|
2
|
+
export { createdAtOf, creationSlotOf, historyCovers, intentAt, JOBS_LIMIT, openProofEscrows } from "./job-proofs.js";
|
|
3
|
+
export { DEVNET_GENESIS_HASH, jobsOf, MAINNET_GENESIS_HASH, MAX_SPEC_BYTES, PLAIN_HTTP_ON_PUBLIC, plainHttpOnPublic, PUBLIC_GENESIS_HASHES, readSpec, SPEC_SCAN, SPEC_TIMEOUT_MS, SpecUnreadable, specUrlOf, TESTNET_GENESIS_HASH, } from "./job-specs.js";
|
|
4
|
+
export { followUpInstructions, followUpMemo, followUpOf, memoInstruction, memosSignedBy, parseFollowUpMemo, recordedDelivery, RELEASE_MARK, } from "./job-memos.js";
|
|
5
|
+
export { announcements, deliveriesOf, deliveryInstructions, deliveryRecord, firstDelivery, NotDeliverable, } from "./job-deliveries.js";
|
|
6
|
+
export { creationProof, engineCalls, escrowOrigin, lifecycleDeliveries, originDeliveries, } from "./job-origins.js";
|
|
187
7
|
//# sourceMappingURL=jobs.js.map
|
package/dist/src/jobs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jobs.js","sourceRoot":"","sources":["../../src/jobs.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"jobs.js","sourceRoot":"","sources":["../../src/jobs.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,aAAa,EACb,qBAAqB,EAErB,IAAI,EAEJ,cAAc,EACd,aAAa,GACd,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,aAAa,EAAE,QAAQ,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACrH,OAAO,EACL,mBAAmB,EAEnB,MAAM,EACN,oBAAoB,EACpB,cAAc,EACd,oBAAoB,EACpB,iBAAiB,EACjB,qBAAqB,EACrB,QAAQ,EAGR,SAAS,EACT,eAAe,EACf,cAAc,EACd,SAAS,EACT,oBAAoB,GACrB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAEL,oBAAoB,EACpB,YAAY,EACZ,UAAU,EACV,eAAe,EACf,aAAa,EACb,iBAAiB,EACjB,gBAAgB,EAChB,YAAY,GACb,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAEL,aAAa,EAEb,YAAY,EAEZ,oBAAoB,EACpB,cAAc,EAEd,aAAa,EACb,cAAc,GACf,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,aAAa,EAEb,WAAW,EACX,YAAY,EAIZ,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
export function boundMembers(inner) {
|
|
2
|
+
const members = {};
|
|
3
|
+
for (let at = inner; at !== null && at !== Object.prototype; at = Object.getPrototypeOf(at)) {
|
|
4
|
+
for (const key of Reflect.ownKeys(at)) {
|
|
5
|
+
if (key === "constructor" || Object.prototype.hasOwnProperty.call(members, key)) {
|
|
6
|
+
continue;
|
|
7
|
+
}
|
|
8
|
+
const value = Reflect.get(inner, key);
|
|
9
|
+
members[key] = typeof value === "function" ? value.bind(inner) : value;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
return members;
|
|
13
|
+
}
|
|
14
|
+
const MEMOIZED = Symbol("memoized");
|
|
15
|
+
const UNDERLYING = Symbol("underlying");
|
|
16
|
+
export const unmemoized = (transport) => transport[UNDERLYING] ?? transport;
|
|
17
|
+
export function memoized(inner) {
|
|
18
|
+
if (inner[MEMOIZED] === true) {
|
|
19
|
+
return inner;
|
|
20
|
+
}
|
|
21
|
+
const members = boundMembers(inner);
|
|
22
|
+
const seen = new Map();
|
|
23
|
+
const keep = (address, pending) => {
|
|
24
|
+
seen.set(address, pending);
|
|
25
|
+
pending.catch(() => {
|
|
26
|
+
if (seen.get(address) === pending) {
|
|
27
|
+
seen.delete(address);
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
return pending;
|
|
31
|
+
};
|
|
32
|
+
const getAccount = (address) => seen.get(address) ?? keep(address, members.getAccount(address));
|
|
33
|
+
const warm = async (addresses) => {
|
|
34
|
+
const missing = [...new Set(addresses)].filter((address) => !seen.has(address));
|
|
35
|
+
if (missing.length === 0) {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
const fetched = members.getAccounts(missing);
|
|
39
|
+
missing.forEach((address, i) => keep(address, fetched.then((views) => views[i] ?? null)));
|
|
40
|
+
await fetched;
|
|
41
|
+
};
|
|
42
|
+
const writing = (write) => async (...args) => {
|
|
43
|
+
try {
|
|
44
|
+
return await write(...args);
|
|
45
|
+
}
|
|
46
|
+
finally {
|
|
47
|
+
seen.clear();
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
return {
|
|
51
|
+
...members,
|
|
52
|
+
[MEMOIZED]: true,
|
|
53
|
+
[UNDERLYING]: inner,
|
|
54
|
+
getAccount,
|
|
55
|
+
send: writing(members.send),
|
|
56
|
+
sendWire: writing(members.sendWire),
|
|
57
|
+
submitWire: writing(members.submitWire),
|
|
58
|
+
airdrop: writing(members.airdrop),
|
|
59
|
+
getAccounts: async (addresses) => {
|
|
60
|
+
await warm(addresses);
|
|
61
|
+
return Promise.all(addresses.map(getAccount));
|
|
62
|
+
},
|
|
63
|
+
warm,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=memoized-transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memoized-transport.js","sourceRoot":"","sources":["../../src/memoized-transport.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,YAAY,CAAmB,KAAQ;IACrD,MAAM,OAAO,GAAiC,EAAE,CAAC;IACjD,KAAK,IAAI,EAAE,GAAkB,KAAK,EAAE,EAAE,KAAK,IAAI,IAAI,EAAE,KAAK,MAAM,CAAC,SAAS,EAAE,EAAE,GAAG,MAAM,CAAC,cAAc,CAAC,EAAE,CAAkB,EAAE,CAAC;QAC5H,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;YACtC,IAAI,GAAG,KAAK,aAAa,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC;gBAChF,SAAS;YACX,CAAC;YACD,MAAM,KAAK,GAAY,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YAC/C,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QACzE,CAAC;IACH,CAAC;IACD,OAAO,OAAY,CAAC;AACtB,CAAC;AAED,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;AACpC,MAAM,UAAU,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;AAExC,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,SAAoB,EAAa,EAAE,CAC3D,SAA0C,CAAC,UAAU,CAAC,IAAI,SAAS,CAAC;AAEvE,MAAM,UAAU,QAAQ,CAAC,KAAgB;IACvC,IAAK,KAA+B,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE,CAAC;QACxD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IACpC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAwC,CAAC;IAC7D,MAAM,IAAI,GAAG,CAAC,OAAgB,EAAE,OAAoC,EAAE,EAAE;QACtE,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC3B,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE;YACjB,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,OAAO,EAAE,CAAC;gBAClC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACvB,CAAC;QACH,CAAC,CAAC,CAAC;QACH,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC;IACF,MAAM,UAAU,GAAG,CAAC,OAAgB,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;IACzG,MAAM,IAAI,GAAG,KAAK,EAAE,SAA6B,EAAE,EAAE;QACnD,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;QAChF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO;QACT,CAAC;QACD,MAAM,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAC7C,OAAO,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;QAC1F,MAAM,OAAO,CAAC;IAChB,CAAC,CAAC;IACF,MAAM,OAAO,GACX,CAAyB,KAAiC,EAAE,EAAE,CAC9D,KAAK,EAAE,GAAG,IAAO,EAAc,EAAE;QAC/B,IAAI,CAAC;YACH,OAAO,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;QAC9B,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,CAAC;IACH,CAAC,CAAC;IACJ,OAAO;QACL,GAAG,OAAO;QACV,CAAC,QAAQ,CAAC,EAAE,IAAI;QAChB,CAAC,UAAU,CAAC,EAAE,KAAK;QACnB,UAAU;QACV,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;QAC3B,QAAQ,EAAE,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC;QACnC,UAAU,EAAE,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC;QACvC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC;QACjC,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE;YAC/B,MAAM,IAAI,CAAC,SAAS,CAAC,CAAC;YACtB,OAAO,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;QAChD,CAAC;QACD,IAAI;KACQ,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export declare const POLL_MS = 500;
|
|
2
|
+
export declare const sleep: (ms: number) => Promise<void>;
|
|
3
|
+
export declare const RATE_LIMIT_ATTEMPTS = 6;
|
|
4
|
+
export declare function rateLimited(error: unknown): boolean;
|
|
5
|
+
export declare const MIN_CONTEXT_SLOT_NOT_REACHED = -32016;
|
|
6
|
+
export declare function behindMinSlot(error: unknown): boolean;
|
|
7
|
+
export declare function patiently<T>(call: () => Promise<T>, wait?: (ms: number) => Promise<void>): Promise<T>;
|
|
8
|
+
export declare class Charged extends Error {
|
|
9
|
+
constructor(message: string);
|
|
10
|
+
}
|
|
11
|
+
export declare class FailedOnChain extends Charged {
|
|
12
|
+
}
|
|
13
|
+
export declare class BlockhashExpired extends Error {
|
|
14
|
+
constructor(message: string);
|
|
15
|
+
}
|
|
16
|
+
export declare const neverLanded: (error: unknown) => boolean;
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { isSolanaError, SOLANA_ERROR__RPC__TRANSPORT_HTTP_ERROR } from "@solana/kit";
|
|
2
|
+
export const POLL_MS = 500;
|
|
3
|
+
export const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
4
|
+
export const RATE_LIMIT_ATTEMPTS = 6;
|
|
5
|
+
const CAUSE_DEPTH = 8;
|
|
6
|
+
function causes(error) {
|
|
7
|
+
const chain = [];
|
|
8
|
+
for (let link = error; link instanceof Error && chain.length < CAUSE_DEPTH; link = link.cause) {
|
|
9
|
+
chain.push(link);
|
|
10
|
+
}
|
|
11
|
+
return chain;
|
|
12
|
+
}
|
|
13
|
+
const said = (chain, text) => chain.some((link) => !isSolanaError(link) && text.test(link.message));
|
|
14
|
+
export function rateLimited(error) {
|
|
15
|
+
if (!(error instanceof Error) || error instanceof Charged) {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
const chain = causes(error);
|
|
19
|
+
for (const link of chain) {
|
|
20
|
+
if (isSolanaError(link, SOLANA_ERROR__RPC__TRANSPORT_HTTP_ERROR)) {
|
|
21
|
+
return link.context.statusCode === 429;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return said(chain, /\b429\b/);
|
|
25
|
+
}
|
|
26
|
+
export const MIN_CONTEXT_SLOT_NOT_REACHED = -32016;
|
|
27
|
+
export function behindMinSlot(error) {
|
|
28
|
+
if (!(error instanceof Error) || error instanceof Charged) {
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
const chain = causes(error);
|
|
32
|
+
return chain.some((link) => isSolanaError(link, MIN_CONTEXT_SLOT_NOT_REACHED)) || said(chain, /-32016\b|minimum context slot/i);
|
|
33
|
+
}
|
|
34
|
+
export async function patiently(call, wait = sleep) {
|
|
35
|
+
for (let attempt = 1;; attempt++) {
|
|
36
|
+
try {
|
|
37
|
+
return await call();
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
if (!(rateLimited(error) || behindMinSlot(error)) || attempt >= RATE_LIMIT_ATTEMPTS) {
|
|
41
|
+
throw error;
|
|
42
|
+
}
|
|
43
|
+
await wait(POLL_MS * 2 ** attempt);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
export class Charged extends Error {
|
|
48
|
+
constructor(message) {
|
|
49
|
+
super(message);
|
|
50
|
+
this.name = "Charged";
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
export class FailedOnChain extends Charged {
|
|
54
|
+
}
|
|
55
|
+
export class BlockhashExpired extends Error {
|
|
56
|
+
constructor(message) {
|
|
57
|
+
super(message);
|
|
58
|
+
this.name = "BlockhashExpired";
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
export const neverLanded = (error) => error instanceof FailedOnChain || error instanceof BlockhashExpired;
|
|
62
|
+
//# sourceMappingURL=rpc-retry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rpc-retry.js","sourceRoot":"","sources":["../../src/rpc-retry.ts"],"names":[],"mappings":"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"}
|