@intent-engine/solver 0.1.36 → 0.1.38
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/bundle.d.ts +28 -0
- package/dist/src/bundle.js +49 -0
- package/dist/src/bundle.js.map +1 -0
- package/dist/src/flights.d.ts +26 -0
- package/dist/src/flights.js +48 -0
- package/dist/src/flights.js.map +1 -0
- package/dist/src/holds.d.ts +13 -0
- package/dist/src/holds.js +30 -0
- package/dist/src/holds.js.map +1 -0
- package/dist/src/index.d.ts +7 -0
- package/dist/src/index.js +7 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/inventory.d.ts +11 -0
- package/dist/src/inventory.js +33 -0
- package/dist/src/inventory.js.map +1 -0
- package/dist/src/jupiter.js +7 -1
- package/dist/src/jupiter.js.map +1 -1
- package/dist/src/market.d.ts +3 -0
- package/dist/src/market.js +13 -1
- package/dist/src/market.js.map +1 -1
- package/dist/src/net.d.ts +8 -0
- package/dist/src/net.js +24 -0
- package/dist/src/net.js.map +1 -0
- package/dist/src/plan.d.ts +10 -0
- package/dist/src/plan.js +16 -0
- package/dist/src/plan.js.map +1 -1
- package/dist/src/quote-cache.d.ts +19 -0
- package/dist/src/quote-cache.js +46 -0
- package/dist/src/quote-cache.js.map +1 -0
- package/dist/src/remember.d.ts +7 -0
- package/dist/src/remember.js +80 -0
- package/dist/src/remember.js.map +1 -0
- package/dist/src/solver.d.ts +16 -19
- package/dist/src/solver.js +303 -222
- package/dist/src/solver.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { Address, Base64EncodedWireTransaction, Blockhash, Instruction, TransactionSigner } from "@solana/kit";
|
|
2
|
+
import { type FillContext } from "./build.js";
|
|
3
|
+
import type { Plan } from "./plan.js";
|
|
4
|
+
export declare const badBundleSize: (value: number) => string;
|
|
5
|
+
export declare const bundleSizeFits: (value: number) => boolean;
|
|
6
|
+
export declare function withoutTip(plan: Plan, tipped: FillContext, solver: TransactionSigner, latest: {
|
|
7
|
+
blockhash: Blockhash;
|
|
8
|
+
lastValidBlockHeight: bigint;
|
|
9
|
+
}, tables: Readonly<Record<Address, Address[]>>, unitPrice: (instructions: readonly Instruction[]) => Promise<bigint>): Promise<{
|
|
10
|
+
context: FillContext;
|
|
11
|
+
probe: Base64EncodedWireTransaction;
|
|
12
|
+
} | {
|
|
13
|
+
bytes: number | null;
|
|
14
|
+
accounts: number;
|
|
15
|
+
}>;
|
|
16
|
+
export type Bundled<T, O> = {
|
|
17
|
+
item: T;
|
|
18
|
+
signature: string;
|
|
19
|
+
} | {
|
|
20
|
+
item: T;
|
|
21
|
+
error: string;
|
|
22
|
+
} | {
|
|
23
|
+
item: T;
|
|
24
|
+
refused: O;
|
|
25
|
+
};
|
|
26
|
+
export declare function sendBundles<T extends {
|
|
27
|
+
wire: Base64EncodedWireTransaction;
|
|
28
|
+
}, O extends object>(queue: readonly T[], size: number, sendBundle: (wires: readonly Base64EncodedWireTransaction[]) => Promise<string>, last: (item: T) => Promise<Base64EncodedWireTransaction | O>): Promise<Bundled<T, O>[]>;
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { accountsOf, bytesFit, compile, fillInstructions, locksFit, wireSize } from "./build.js";
|
|
2
|
+
import { MAX_BUNDLE } from "./jito.js";
|
|
3
|
+
export const badBundleSize = (value) => `bundle size must be an integer from 1 to ${MAX_BUNDLE}, not ${value}`;
|
|
4
|
+
export const bundleSizeFits = (value) => Number.isInteger(value) && value >= 1 && value <= MAX_BUNDLE;
|
|
5
|
+
export async function withoutTip(plan, tipped, solver, latest, tables, unitPrice) {
|
|
6
|
+
const bare = { ...tipped, tip: null, unitPrice: 0n };
|
|
7
|
+
const context = { ...bare, unitPrice: await unitPrice(await fillInstructions(plan, bare)) };
|
|
8
|
+
const instructions = await fillInstructions(plan, context);
|
|
9
|
+
const accounts = accountsOf(instructions, solver.address);
|
|
10
|
+
if (!locksFit(accounts)) {
|
|
11
|
+
return { bytes: null, accounts };
|
|
12
|
+
}
|
|
13
|
+
const probe = await compile(instructions, solver, latest, tables);
|
|
14
|
+
const bytes = wireSize(probe);
|
|
15
|
+
return bytesFit(bytes) ? { context, probe } : { bytes, accounts };
|
|
16
|
+
}
|
|
17
|
+
export async function sendBundles(queue, size, sendBundle, last) {
|
|
18
|
+
if (!bundleSizeFits(size)) {
|
|
19
|
+
throw new RangeError(badBundleSize(size));
|
|
20
|
+
}
|
|
21
|
+
const done = [];
|
|
22
|
+
for (let at = 0; at < queue.length; at += size) {
|
|
23
|
+
const bundle = queue.slice(at, at + size);
|
|
24
|
+
const wires = bundle.map((item) => item.wire);
|
|
25
|
+
for (let tail = bundle.at(-1); tail !== undefined; tail = bundle.at(-1)) {
|
|
26
|
+
const wire = await last(tail);
|
|
27
|
+
if (typeof wire === "string") {
|
|
28
|
+
wires[wires.length - 1] = wire;
|
|
29
|
+
break;
|
|
30
|
+
}
|
|
31
|
+
done.push({ item: tail, refused: wire });
|
|
32
|
+
bundle.pop();
|
|
33
|
+
wires.pop();
|
|
34
|
+
}
|
|
35
|
+
if (bundle.length === 0) {
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
try {
|
|
39
|
+
const signature = await sendBundle(wires);
|
|
40
|
+
done.push(...bundle.map((item) => ({ item, signature })));
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
44
|
+
done.push(...bundle.map((item) => ({ item, error: message })));
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return done;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=bundle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bundle.js","sourceRoot":"","sources":["../../src/bundle.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { Address } from "@solana/kit";
|
|
2
|
+
import { type Intent } from "@intent-engine/core";
|
|
3
|
+
import type { Backoff } from "./backoff.js";
|
|
4
|
+
import type { Hold } from "./holds.js";
|
|
5
|
+
export type Flight = {
|
|
6
|
+
until: bigint;
|
|
7
|
+
signature: string;
|
|
8
|
+
holds?: Hold;
|
|
9
|
+
intent?: Intent;
|
|
10
|
+
};
|
|
11
|
+
export type Landing = "landed" | "failed" | null;
|
|
12
|
+
export declare const FAILED_ON_CHAIN = "the fill was sent but failed on chain";
|
|
13
|
+
export declare function landings(flights: Map<Address, Flight>, now: bigint, listed: readonly {
|
|
14
|
+
address: Address;
|
|
15
|
+
intent: Intent;
|
|
16
|
+
}[], failedOnChain: (signature: string) => Promise<boolean>, held: Backoff): Promise<{
|
|
17
|
+
intent: Address;
|
|
18
|
+
error: string;
|
|
19
|
+
}[]>;
|
|
20
|
+
export declare function answered(flights: Map<Address, Flight>, listed: readonly {
|
|
21
|
+
address: Address;
|
|
22
|
+
intent: Intent;
|
|
23
|
+
}[], statuses: (signatures: readonly string[]) => Promise<readonly Landing[]>, held: Backoff): Promise<{
|
|
24
|
+
intent: Address;
|
|
25
|
+
error: string;
|
|
26
|
+
}[]>;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { IntentStatus } from "@intent-engine/core";
|
|
2
|
+
export const FAILED_ON_CHAIN = "the fill was sent but failed on chain";
|
|
3
|
+
export async function landings(flights, now, listed, failedOnChain, held) {
|
|
4
|
+
const failed = [];
|
|
5
|
+
for (const { address, intent } of listed) {
|
|
6
|
+
const flight = flights.get(address);
|
|
7
|
+
if (flight === undefined || flight.until > now) {
|
|
8
|
+
continue;
|
|
9
|
+
}
|
|
10
|
+
flights.delete(address);
|
|
11
|
+
if (intent.status !== IntentStatus.Open) {
|
|
12
|
+
continue;
|
|
13
|
+
}
|
|
14
|
+
const lost = await failedOnChain(flight.signature).catch(() => false);
|
|
15
|
+
if (lost) {
|
|
16
|
+
held.failed(address, intent);
|
|
17
|
+
failed.push({ intent: address, error: `${FAILED_ON_CHAIN}: ${flight.signature}` });
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return failed;
|
|
21
|
+
}
|
|
22
|
+
export async function answered(flights, listed, statuses, held) {
|
|
23
|
+
const asked = [...flights];
|
|
24
|
+
if (asked.length === 0) {
|
|
25
|
+
return [];
|
|
26
|
+
}
|
|
27
|
+
const found = await statuses(asked.map(([, flight]) => flight.signature)).catch(() => []);
|
|
28
|
+
const current = new Map(listed.map(({ address, intent }) => [address, intent]));
|
|
29
|
+
const failed = [];
|
|
30
|
+
asked.forEach(([address, flight], i) => {
|
|
31
|
+
const status = found[i];
|
|
32
|
+
if (status === "landed") {
|
|
33
|
+
flights.delete(address);
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
const intent = current.get(address) ?? flight.intent;
|
|
37
|
+
if (status !== "failed" || intent === undefined) {
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
flights.delete(address);
|
|
41
|
+
if (intent.status === IntentStatus.Open) {
|
|
42
|
+
held.failed(address, intent);
|
|
43
|
+
failed.push({ intent: address, error: `${FAILED_ON_CHAIN}: ${flight.signature}` });
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
return failed;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=flights.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flights.js","sourceRoot":"","sources":["../../src/flights.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Address } from "@solana/kit";
|
|
2
|
+
import { type Intent } from "@intent-engine/core";
|
|
3
|
+
import type { Flight } from "./flights.js";
|
|
4
|
+
export type Hold = {
|
|
5
|
+
account: Address;
|
|
6
|
+
amount: bigint;
|
|
7
|
+
};
|
|
8
|
+
export declare function unheld(live: bigint, held: bigint): bigint;
|
|
9
|
+
export declare function heldBy(flights: ReadonlyMap<Address, Flight>): (account: Address) => bigint;
|
|
10
|
+
export declare function releaseHolds(flights: Map<Address, Flight>, listed: readonly {
|
|
11
|
+
address: Address;
|
|
12
|
+
intent: Intent;
|
|
13
|
+
}[], full: boolean): void;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { IntentStatus } from "@intent-engine/core";
|
|
2
|
+
export function unheld(live, held) {
|
|
3
|
+
return live > held ? live - held : 0n;
|
|
4
|
+
}
|
|
5
|
+
export function heldBy(flights) {
|
|
6
|
+
return (account) => {
|
|
7
|
+
let total = 0n;
|
|
8
|
+
for (const flight of flights.values()) {
|
|
9
|
+
if (flight.holds?.account === account) {
|
|
10
|
+
total += flight.holds.amount;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
return total;
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
export function releaseHolds(flights, listed, full) {
|
|
17
|
+
const status = new Map(listed.map(({ address, intent }) => [address, intent.status]));
|
|
18
|
+
for (const [address, flight] of flights) {
|
|
19
|
+
if (flight.holds === undefined) {
|
|
20
|
+
continue;
|
|
21
|
+
}
|
|
22
|
+
const seen = status.get(address);
|
|
23
|
+
if (seen === IntentStatus.Open || (seen === undefined && !full)) {
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
const { holds: _, ...kept } = flight;
|
|
27
|
+
flights.set(address, kept);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=holds.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"holds.js","sourceRoot":"","sources":["../../src/holds.ts"],"names":[],"mappings":"AACA,OAAO,EAAe,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAKhE,MAAM,UAAU,MAAM,CAAC,IAAY,EAAE,IAAY;IAC/C,OAAO,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,OAAqC;IAC1D,OAAO,CAAC,OAAO,EAAE,EAAE;QACjB,IAAI,KAAK,GAAG,EAAE,CAAC;QACf,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YACtC,IAAI,MAAM,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,EAAE,CAAC;gBACtC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC;YAC/B,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,OAA6B,EAC7B,MAAuD,EACvD,IAAa;IAEb,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACtF,KAAK,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxC,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAC/B,SAAS;QACX,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACjC,IAAI,IAAI,KAAK,YAAY,CAAC,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAChE,SAAS;QACX,CAAC;QACD,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,MAAM,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC7B,CAAC;AACH,CAAC"}
|
package/dist/src/index.d.ts
CHANGED
|
@@ -1,8 +1,15 @@
|
|
|
1
1
|
export * from "./build.js";
|
|
2
|
+
export * from "./flights.js";
|
|
3
|
+
export * from "./bundle.js";
|
|
4
|
+
export * from "./holds.js";
|
|
5
|
+
export * from "./inventory.js";
|
|
2
6
|
export * from "./issue.js";
|
|
3
7
|
export * from "./jito.js";
|
|
4
8
|
export * from "./jupiter.js";
|
|
5
9
|
export * from "./lookup.js";
|
|
6
10
|
export * from "./market.js";
|
|
11
|
+
export * from "./net.js";
|
|
7
12
|
export * from "./plan.js";
|
|
13
|
+
export * from "./quote-cache.js";
|
|
14
|
+
export * from "./remember.js";
|
|
8
15
|
export * from "./solver.js";
|
package/dist/src/index.js
CHANGED
|
@@ -1,9 +1,16 @@
|
|
|
1
1
|
export * from "./build.js";
|
|
2
|
+
export * from "./flights.js";
|
|
3
|
+
export * from "./bundle.js";
|
|
4
|
+
export * from "./holds.js";
|
|
5
|
+
export * from "./inventory.js";
|
|
2
6
|
export * from "./issue.js";
|
|
3
7
|
export * from "./jito.js";
|
|
4
8
|
export * from "./jupiter.js";
|
|
5
9
|
export * from "./lookup.js";
|
|
6
10
|
export * from "./market.js";
|
|
11
|
+
export * from "./net.js";
|
|
7
12
|
export * from "./plan.js";
|
|
13
|
+
export * from "./quote-cache.js";
|
|
14
|
+
export * from "./remember.js";
|
|
8
15
|
export * from "./solver.js";
|
|
9
16
|
//# sourceMappingURL=index.js.map
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Address } from "@solana/kit";
|
|
2
|
+
import type { IssueRoute } from "./issue.js";
|
|
3
|
+
import type { Pricer } from "./market.js";
|
|
4
|
+
export type Holdings = (mint: Address) => Promise<bigint>;
|
|
5
|
+
export type Stock = Map<Address, {
|
|
6
|
+
start: bigint;
|
|
7
|
+
spent: bigint;
|
|
8
|
+
}>;
|
|
9
|
+
export declare function stockLeft(stock: Stock, account: Address, live: bigint): bigint;
|
|
10
|
+
export declare function spend(stock: Stock, account: Address, live: bigint, amount: bigint): void;
|
|
11
|
+
export declare function inventoryPricer(routes: readonly IssueRoute[], held: Holdings): Pricer;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export function stockLeft(stock, account, live) {
|
|
2
|
+
const held = stock.get(account);
|
|
3
|
+
if (held === undefined) {
|
|
4
|
+
return live;
|
|
5
|
+
}
|
|
6
|
+
const left = held.start - held.spent;
|
|
7
|
+
return left < live ? left : live;
|
|
8
|
+
}
|
|
9
|
+
export function spend(stock, account, live, amount) {
|
|
10
|
+
const held = stock.get(account) ?? { start: live, spent: 0n };
|
|
11
|
+
stock.set(account, { start: held.start, spent: held.spent + amount });
|
|
12
|
+
}
|
|
13
|
+
export function inventoryPricer(routes, held) {
|
|
14
|
+
for (const route of routes) {
|
|
15
|
+
if (route.out <= 0n || route.in <= 0n) {
|
|
16
|
+
throw new RangeError(`the inventory rate for ${route.outputMint} must be positive on both sides`);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return {
|
|
20
|
+
async quote(request) {
|
|
21
|
+
const route = routes.find((r) => r.inputMint === request.inputMint && r.outputMint === request.outputMint);
|
|
22
|
+
if (route === undefined) {
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
const amountOut = (request.amountIn * route.out) / route.in;
|
|
26
|
+
if ((await held(route.outputMint)) < amountOut) {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
return { amountIn: request.amountIn, amountOut, instructions: [], lookupTables: [], inventory: true };
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=inventory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inventory.js","sourceRoot":"","sources":["../../src/inventory.ts"],"names":[],"mappings":"AAQA,MAAM,UAAU,SAAS,CAAC,KAAY,EAAE,OAAgB,EAAE,IAAY;IACpE,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAChC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;IACrC,OAAO,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,KAAY,EAAE,OAAgB,EAAE,IAAY,EAAE,MAAc;IAChF,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;IAC9D,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG,MAAM,EAAE,CAAC,CAAC;AACxE,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAA6B,EAAE,IAAc;IAC3E,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,KAAK,CAAC,GAAG,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC;YACtC,MAAM,IAAI,UAAU,CAAC,0BAA0B,KAAK,CAAC,UAAU,iCAAiC,CAAC,CAAC;QACpG,CAAC;IACH,CAAC;IACD,OAAO;QACL,KAAK,CAAC,KAAK,CAAC,OAAqB;YAC/B,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,OAAO,CAAC,SAAS,IAAI,CAAC,CAAC,UAAU,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;YAC3G,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,OAAO,IAAI,CAAC;YACd,CAAC;YACD,MAAM,SAAS,GAAG,CAAC,OAAO,CAAC,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC;YAC5D,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,GAAG,SAAS,EAAE,CAAC;gBAC/C,OAAO,IAAI,CAAC;YACd,CAAC;YACD,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QACxG,CAAC;KACF,CAAC;AACJ,CAAC"}
|
package/dist/src/jupiter.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { AccountRole, address, getBase64Encoder } from "@solana/kit";
|
|
2
|
+
import { TOKEN_PROGRAMS } from "./build.js";
|
|
2
3
|
export const RATE_LIMITED = 429;
|
|
3
4
|
export const EXACT_IN = "ExactIn";
|
|
4
5
|
export class RateLimited extends Error {
|
|
@@ -21,6 +22,9 @@ export const ATA_CREATE_IDEMPOTENT = 1;
|
|
|
21
22
|
const ATA_PAYER = 0;
|
|
22
23
|
const ATA_WALLET = 2;
|
|
23
24
|
const ATA_MINT = 3;
|
|
25
|
+
const ATA_SYSTEM = 4;
|
|
26
|
+
const ATA_TOKEN_PROGRAM = 5;
|
|
27
|
+
const SYSTEM_PROGRAM = address("11111111111111111111111111111111");
|
|
24
28
|
function ownAccount(ix, request, what) {
|
|
25
29
|
const data = ix.data ?? new Uint8Array();
|
|
26
30
|
const kind = data.length === 0 ? ATA_CREATE : data[0];
|
|
@@ -29,7 +33,9 @@ function ownAccount(ix, request, what) {
|
|
|
29
33
|
if (!opens ||
|
|
30
34
|
ix.accounts?.[ATA_PAYER]?.address !== request.taker ||
|
|
31
35
|
ix.accounts?.[ATA_WALLET]?.address !== request.taker ||
|
|
32
|
-
(mint !== request.inputMint && mint !== request.outputMint)
|
|
36
|
+
(mint !== request.inputMint && mint !== request.outputMint) ||
|
|
37
|
+
ix.accounts?.[ATA_SYSTEM]?.address !== SYSTEM_PROGRAM ||
|
|
38
|
+
!TOKEN_PROGRAMS.some((program) => program === ix.accounts?.[ATA_TOKEN_PROGRAM]?.address)) {
|
|
33
39
|
throw new Error(`jupiter ${what} does more than open this solver's own token account for the traded mints`);
|
|
34
40
|
}
|
|
35
41
|
return ix;
|
package/dist/src/jupiter.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jupiter.js","sourceRoot":"","sources":["../../src/jupiter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAgB,OAAO,EAAE,gBAAgB,EAAoB,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"jupiter.js","sourceRoot":"","sources":["../../src/jupiter.ts"],"names":[],"mappings":"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"}
|
package/dist/src/market.d.ts
CHANGED
|
@@ -5,16 +5,19 @@ export type QuoteRequest = {
|
|
|
5
5
|
amountIn: bigint;
|
|
6
6
|
taker: Address;
|
|
7
7
|
maxAccounts?: number;
|
|
8
|
+
fresh?: boolean;
|
|
8
9
|
};
|
|
9
10
|
export type Quote = {
|
|
10
11
|
amountIn: bigint;
|
|
11
12
|
amountOut: bigint;
|
|
12
13
|
instructions: Instruction[];
|
|
13
14
|
lookupTables: Address[];
|
|
15
|
+
inventory?: boolean;
|
|
14
16
|
};
|
|
15
17
|
export interface Pricer {
|
|
16
18
|
quote(request: QuoteRequest): Promise<Quote | null>;
|
|
17
19
|
}
|
|
20
|
+
export declare function firstPricer(...pricers: readonly Pricer[]): Pricer;
|
|
18
21
|
export type FetchResponse = {
|
|
19
22
|
ok: boolean;
|
|
20
23
|
status: number;
|
package/dist/src/market.js
CHANGED
|
@@ -1,2 +1,14 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export function firstPricer(...pricers) {
|
|
2
|
+
return {
|
|
3
|
+
async quote(request) {
|
|
4
|
+
for (const pricer of pricers) {
|
|
5
|
+
const quote = await pricer.quote(request);
|
|
6
|
+
if (quote !== null) {
|
|
7
|
+
return quote;
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
return null;
|
|
11
|
+
},
|
|
12
|
+
};
|
|
13
|
+
}
|
|
2
14
|
//# sourceMappingURL=market.js.map
|
package/dist/src/market.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"market.js","sourceRoot":"","sources":["../../src/market.ts"],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"market.js","sourceRoot":"","sources":["../../src/market.ts"],"names":[],"mappings":"AAuBA,MAAM,UAAU,WAAW,CAAC,GAAG,OAA0B;IACvD,OAAO;QACL,KAAK,CAAC,KAAK,CAAC,OAAqB;YAC/B,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC7B,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBAC1C,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;oBACnB,OAAO,KAAK,CAAC;gBACf,CAAC;YACH,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Address } from "@solana/kit";
|
|
2
|
+
import type { Plan, SolValue } from "./plan.js";
|
|
3
|
+
export declare const NET_BELOW_FLOOR = "the fill's profit less its sol cost is below the profit floor";
|
|
4
|
+
export declare const netBelowFloor: (profit: bigint, cost: bigint, lamports: bigint, floor: bigint) => string;
|
|
5
|
+
export declare const badSolValue: (mint: Address) => string;
|
|
6
|
+
export declare function solValueFits(solValue: SolValue | undefined): string | null;
|
|
7
|
+
export declare function costIn(mint: Address, lamports: bigint, solValue: SolValue | undefined): bigint | null;
|
|
8
|
+
export declare function netShort(plan: Pick<Plan, "intent" | "profit">, floor: bigint, lamports: bigint, solValue: SolValue | undefined): string | null;
|
package/dist/src/net.js
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { NATIVE_MINT } from "@intent-engine/core";
|
|
2
|
+
export const NET_BELOW_FLOOR = "the fill's profit less its sol cost is below the profit floor";
|
|
3
|
+
export const netBelowFloor = (profit, cost, lamports, floor) => `${NET_BELOW_FLOOR}: profit ${profit} less a cost of ${cost} (${lamports} lamports) is below the floor of ${floor}`;
|
|
4
|
+
export const badSolValue = (mint) => `the sol value of ${mint} must be positive on both sides`;
|
|
5
|
+
export function solValueFits(solValue) {
|
|
6
|
+
for (const [mint, { raw, lamports }] of solValue ?? []) {
|
|
7
|
+
if (raw <= 0n || lamports <= 0n) {
|
|
8
|
+
return badSolValue(mint);
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
return null;
|
|
12
|
+
}
|
|
13
|
+
export function costIn(mint, lamports, solValue) {
|
|
14
|
+
if (mint === NATIVE_MINT) {
|
|
15
|
+
return lamports;
|
|
16
|
+
}
|
|
17
|
+
const value = solValue?.get(mint);
|
|
18
|
+
return value === undefined ? null : (lamports * value.raw + value.lamports - 1n) / value.lamports;
|
|
19
|
+
}
|
|
20
|
+
export function netShort(plan, floor, lamports, solValue) {
|
|
21
|
+
const cost = costIn(plan.intent.outputMint, lamports, solValue);
|
|
22
|
+
return cost === null || plan.profit - cost >= floor ? null : netBelowFloor(plan.profit, cost, lamports, floor);
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=net.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"net.js","sourceRoot":"","sources":["../../src/net.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAGlD,MAAM,CAAC,MAAM,eAAe,GAAG,+DAA+D,CAAC;AAE/F,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,MAAc,EAAE,IAAY,EAAE,QAAgB,EAAE,KAAa,EAAU,EAAE,CACrG,GAAG,eAAe,YAAY,MAAM,mBAAmB,IAAI,KAAK,QAAQ,oCAAoC,KAAK,EAAE,CAAC;AAEtH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,IAAa,EAAU,EAAE,CAAC,oBAAoB,IAAI,iCAAiC,CAAC;AAEhH,MAAM,UAAU,YAAY,CAAC,QAA8B;IACzD,KAAK,MAAM,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,IAAI,QAAQ,IAAI,EAAE,EAAE,CAAC;QACvD,IAAI,GAAG,IAAI,EAAE,IAAI,QAAQ,IAAI,EAAE,EAAE,CAAC;YAChC,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,IAAa,EAAE,QAAgB,EAAE,QAA8B;IACpF,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;QACzB,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,MAAM,KAAK,GAAG,QAAQ,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;IAClC,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,GAAG,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,QAAQ,GAAG,EAAE,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC;AACpG,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,IAAqC,EAAE,KAAa,EAAE,QAAgB,EAAE,QAA8B;IAC7H,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAChE,OAAO,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;AACjH,CAAC"}
|
package/dist/src/plan.d.ts
CHANGED
|
@@ -2,12 +2,22 @@ import type { Address } from "@solana/kit";
|
|
|
2
2
|
import { type Config, type FeeShares, type Intent, type IntentParams } from "@intent-engine/core";
|
|
3
3
|
import type { Pricer, Quote } from "./market.js";
|
|
4
4
|
export type Cycle = (mint: Address, amount: bigint) => Promise<Quote | null>;
|
|
5
|
+
export type SolValue = ReadonlyMap<Address, {
|
|
6
|
+
raw: bigint;
|
|
7
|
+
lamports: bigint;
|
|
8
|
+
}>;
|
|
5
9
|
export type Strategy = {
|
|
6
10
|
minProfit: ReadonlyMap<Address, bigint>;
|
|
7
11
|
maxFeeBps: number;
|
|
8
12
|
cycle?: Cycle;
|
|
9
13
|
routeAccounts?: number;
|
|
14
|
+
target?: ReadonlyMap<Address, bigint>;
|
|
15
|
+
patience?: number;
|
|
16
|
+
solValue?: SolValue;
|
|
10
17
|
};
|
|
18
|
+
export declare const DEFAULT_PATIENCE = 30;
|
|
19
|
+
export declare const WAITING_FOR_TARGET = "waiting for the profit target while the auction still falls";
|
|
20
|
+
export declare function awaitingTarget(params: IntentParams, outputMint: Address, profit: bigint, now: bigint, strategy: Strategy): string | null;
|
|
11
21
|
export type Payable = (draft: Pick<Plan, "intent" | "fees">) => Promise<string | null>;
|
|
12
22
|
export type Plan = {
|
|
13
23
|
address: Address;
|
package/dist/src/plan.js
CHANGED
|
@@ -1,4 +1,16 @@
|
|
|
1
1
|
import { decodeParamsLoose, feeBpsFor, INTENT_VERSION, IntentStatus, Kind, kindBit, PAUSE_FILL, remainingOf, requiredOut, splitFees, } from "@intent-engine/core";
|
|
2
|
+
export const DEFAULT_PATIENCE = 30;
|
|
3
|
+
export const WAITING_FOR_TARGET = "waiting for the profit target while the auction still falls";
|
|
4
|
+
export function awaitingTarget(params, outputMint, profit, now, strategy) {
|
|
5
|
+
const target = strategy.target?.get(outputMint);
|
|
6
|
+
if (params.kind !== Kind.DutchAuction || target === undefined || profit >= target) {
|
|
7
|
+
return null;
|
|
8
|
+
}
|
|
9
|
+
if (now + BigInt(strategy.patience ?? DEFAULT_PATIENCE) >= params.endTs) {
|
|
10
|
+
return null;
|
|
11
|
+
}
|
|
12
|
+
return `${WAITING_FOR_TARGET}: profit ${profit} is below the target ${target}`;
|
|
13
|
+
}
|
|
2
14
|
const skip = (reason) => ({ kind: "skip", reason });
|
|
3
15
|
export function standing(intent, config, now, strategy) {
|
|
4
16
|
if (intent.version !== INTENT_VERSION) {
|
|
@@ -63,6 +75,10 @@ export async function decide(address, intent, config, now, pricer, solver, strat
|
|
|
63
75
|
const arbitrage = strategy.cycle !== undefined && spread > 0n ? await strategy.cycle(intent.outputMint, spread) : null;
|
|
64
76
|
const gain = arbitrage !== null && arbitrage.amountIn <= spread && arbitrage.amountOut > arbitrage.amountIn ? arbitrage : null;
|
|
65
77
|
const profit = gain === null ? spread : spread - gain.amountIn + gain.amountOut;
|
|
78
|
+
const patient = awaitingTarget(params, intent.outputMint, profit, now, strategy);
|
|
79
|
+
if (patient !== null) {
|
|
80
|
+
return skip(patient);
|
|
81
|
+
}
|
|
66
82
|
if (profit < floor) {
|
|
67
83
|
return skip(`profit ${profit} is below ${floor}`);
|
|
68
84
|
}
|
package/dist/src/plan.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plan.js","sourceRoot":"","sources":["../../src/plan.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,iBAAiB,EAEjB,SAAS,EAGT,cAAc,EACd,YAAY,EACZ,IAAI,EACJ,OAAO,EACP,UAAU,EACV,WAAW,EACX,WAAW,EACX,SAAS,GACV,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"plan.js","sourceRoot":"","sources":["../../src/plan.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { Pricer, Quote } from "./market.js";
|
|
2
|
+
export type QuoteCache = {
|
|
3
|
+
ttlMs: number;
|
|
4
|
+
clock: () => number;
|
|
5
|
+
};
|
|
6
|
+
export type CacheStats = {
|
|
7
|
+
hits: number;
|
|
8
|
+
misses: number;
|
|
9
|
+
};
|
|
10
|
+
export type CachedPricer = Pricer & {
|
|
11
|
+
stats(): CacheStats;
|
|
12
|
+
};
|
|
13
|
+
export type CountingPricer = Pricer & {
|
|
14
|
+
count(): number;
|
|
15
|
+
};
|
|
16
|
+
export declare const fromCache: (quote: Quote) => boolean;
|
|
17
|
+
export declare const freshly: (pricer: Pricer) => Pricer;
|
|
18
|
+
export declare function countingPricer(pricer: Pricer): CountingPricer;
|
|
19
|
+
export declare function cachedPricer(pricer: Pricer, { ttlMs, clock }: QuoteCache): CachedPricer;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
const served = new WeakSet();
|
|
2
|
+
export const fromCache = (quote) => served.has(quote);
|
|
3
|
+
export const freshly = (pricer) => ({ quote: (request) => pricer.quote({ ...request, fresh: true }) });
|
|
4
|
+
const keyOf = (request) => [request.inputMint, request.outputMint, request.amountIn.toString(), request.taker, request.maxAccounts ?? ""].join(":");
|
|
5
|
+
export function countingPricer(pricer) {
|
|
6
|
+
let answered = 0;
|
|
7
|
+
return {
|
|
8
|
+
async quote(request) {
|
|
9
|
+
const quote = await pricer.quote(request);
|
|
10
|
+
answered += 1;
|
|
11
|
+
return quote;
|
|
12
|
+
},
|
|
13
|
+
count: () => answered,
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
export function cachedPricer(pricer, { ttlMs, clock }) {
|
|
17
|
+
const held = new Map();
|
|
18
|
+
const counts = { hits: 0, misses: 0 };
|
|
19
|
+
return {
|
|
20
|
+
stats: () => ({ ...counts }),
|
|
21
|
+
async quote(request) {
|
|
22
|
+
const key = keyOf(request);
|
|
23
|
+
const entry = held.get(key);
|
|
24
|
+
if (request.fresh !== true && entry !== undefined && clock() - entry.at < ttlMs) {
|
|
25
|
+
counts.hits += 1;
|
|
26
|
+
if (entry.quote === null) {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
const copy = { ...entry.quote };
|
|
30
|
+
served.add(copy);
|
|
31
|
+
return copy;
|
|
32
|
+
}
|
|
33
|
+
counts.misses += 1;
|
|
34
|
+
const quote = await pricer.quote(request);
|
|
35
|
+
const at = clock();
|
|
36
|
+
for (const [old, stored] of held) {
|
|
37
|
+
if (at - stored.at >= ttlMs) {
|
|
38
|
+
held.delete(old);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
held.set(key, { at, quote });
|
|
42
|
+
return quote;
|
|
43
|
+
},
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=quote-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quote-cache.js","sourceRoot":"","sources":["../../src/quote-cache.ts"],"names":[],"mappings":"AAUA,MAAM,MAAM,GAAG,IAAI,OAAO,EAAS,CAAC;AAEpC,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,KAAY,EAAW,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAEtE,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,MAAc,EAAU,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;AAEvH,MAAM,KAAK,GAAG,CAAC,OAAqB,EAAU,EAAE,CAC9C,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAE3H,MAAM,UAAU,cAAc,CAAC,MAAc;IAC3C,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,OAAO;QACL,KAAK,CAAC,KAAK,CAAC,OAAO;YACjB,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC1C,QAAQ,IAAI,CAAC,CAAC;YACd,OAAO,KAAK,CAAC;QACf,CAAC;QACD,KAAK,EAAE,GAAG,EAAE,CAAC,QAAQ;KACtB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,MAAc,EAAE,EAAE,KAAK,EAAE,KAAK,EAAc;IACvE,MAAM,IAAI,GAAG,IAAI,GAAG,EAA+C,CAAC;IACpE,MAAM,MAAM,GAAe,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;IAClD,OAAO;QACL,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,CAAC;QAC5B,KAAK,CAAC,KAAK,CAAC,OAAO;YACjB,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;YAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC5B,IAAI,OAAO,CAAC,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,EAAE,GAAG,KAAK,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC;gBAChF,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC;gBACjB,IAAI,KAAK,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;oBACzB,OAAO,IAAI,CAAC;gBACd,CAAC;gBACD,MAAM,IAAI,GAAG,EAAE,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;gBAChC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBACjB,OAAO,IAAI,CAAC;YACd,CAAC;YACD,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;YACnB,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC1C,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;YACnB,KAAK,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;gBACjC,IAAI,EAAE,GAAG,MAAM,CAAC,EAAE,IAAI,KAAK,EAAE,CAAC;oBAC5B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACnB,CAAC;YACH,CAAC;YACD,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;YAC7B,OAAO,KAAK,CAAC;QACf,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Chain } from "./solver.js";
|
|
2
|
+
export declare const CONFIG_TTL_MS = 30000;
|
|
3
|
+
export declare const BLOCKHASH_TTL_MS = 20000;
|
|
4
|
+
export type Remembering = Chain & {
|
|
5
|
+
forget(): void;
|
|
6
|
+
};
|
|
7
|
+
export declare function remembering(chain: Chain, clock?: () => number): Remembering;
|