@intent-engine/client 0.0.0-stage → 0.1.21

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.
@@ -0,0 +1,251 @@
1
+ import { createSolanaRpc } from "@solana/kit";
2
+ import { attestedProofMessage, buildCancelIntent, buildCreateIntent, buildFillAttested, decodeEvent, decodeParams, escrowAmount, feeBpsFor, findAssociatedTokenAddress, findIntentPda, getIntentDecoder, IntentStatus, Kind, NATIVE_MINT, nextFreeNonce, signEd25519Instruction, splitFees, TOKEN_PROGRAM_ADDRESS, } from "@intent-engine/core";
3
+ import { getCloseAccountInstruction } from "@solana-program/token";
4
+ import { chainTime, createdAccount, loadConfig, loadIntent, loadUser, MissingAccount, mintOf } from "./accounts.js";
5
+ import { budgeted, simulated } from "./budget.js";
6
+ import { explain } from "./errors.js";
7
+ import { initUserIfMissing, tokenAccountIfMissing, wrapIfShort } from "./setup.js";
8
+ import { changesFrom, intentNotifications, pause, rpcTransport, signatureWatch, } from "./transport.js";
9
+ export const DEFAULT_EXPIRES_IN = 3600n;
10
+ export const HISTORY_LIMIT = 100;
11
+ export const WATCH_POLL_MS = 2_000;
12
+ export const WATCH_WAIT_SECONDS = 10;
13
+ export class NoFreeNonce extends Error {
14
+ owner;
15
+ constructor(owner) {
16
+ super(`every nonce in the window of ${owner} is used; advance the nonce window first`);
17
+ this.name = "NoFreeNonce";
18
+ this.owner = owner;
19
+ }
20
+ }
21
+ export class NotSettleable extends Error {
22
+ intent;
23
+ constructor(intent, reason) {
24
+ super(`intent ${intent} ${reason}`);
25
+ this.name = "NotSettleable";
26
+ this.intent = intent;
27
+ }
28
+ }
29
+ function nonceAfter(owner, user) {
30
+ if (user === null) {
31
+ return 0n;
32
+ }
33
+ const next = nextFreeNonce(user);
34
+ if (next === null) {
35
+ throw new NoFreeNonce(owner);
36
+ }
37
+ return next;
38
+ }
39
+ const decoded = ({ address, data }) => ({ address, intent: getIntentDecoder().decode(data) });
40
+ export function createClient(options) {
41
+ const { url, priority = 0n, pollMs = WATCH_POLL_MS, resyncSeconds = WATCH_WAIT_SECONDS } = options;
42
+ const transport = options.transport ?? rpcTransport(createSolanaRpc(url), undefined, signatureWatch(url));
43
+ const notifications = options.notifications ?? (options.transport === undefined ? intentNotifications(url) : undefined);
44
+ const watch = async (onChange, signal, filter = {}) => {
45
+ if (signal.aborted) {
46
+ return;
47
+ }
48
+ const seen = new Map();
49
+ const fresh = (accounts) => accounts.flatMap((account) => {
50
+ const view = decoded(account);
51
+ if (filter.owner !== undefined && view.intent.owner !== filter.owner) {
52
+ return [];
53
+ }
54
+ const key = Buffer.from(account.data).toString("base64");
55
+ if (seen.get(account.address) === key) {
56
+ return [];
57
+ }
58
+ seen.set(account.address, key);
59
+ return [view];
60
+ });
61
+ const report = (changed, closed) => {
62
+ if ((changed.length > 0 || closed.length > 0) && !signal.aborted) {
63
+ onChange(changed, closed);
64
+ }
65
+ };
66
+ const sync = async () => {
67
+ const accounts = await transport.intents(filter.owner).catch(() => null);
68
+ if (accounts === null) {
69
+ return;
70
+ }
71
+ const present = new Set(accounts.map(({ address }) => address));
72
+ const changed = fresh(accounts);
73
+ const closed = [...seen.keys()].filter((address) => !present.has(address));
74
+ for (const address of closed) {
75
+ seen.delete(address);
76
+ }
77
+ report(changed, closed);
78
+ };
79
+ if (notifications === undefined) {
80
+ while (!signal.aborted) {
81
+ await sync();
82
+ await pause(pollMs, signal);
83
+ }
84
+ return;
85
+ }
86
+ const changes = changesFrom(notifications);
87
+ const stop = () => changes.close();
88
+ signal.addEventListener("abort", stop, { once: true });
89
+ try {
90
+ await sync();
91
+ let synced = Date.now();
92
+ while (!signal.aborted) {
93
+ report(fresh((await changes.wait(resyncSeconds)) ?? []), []);
94
+ if (!signal.aborted && Date.now() - synced >= resyncSeconds * 1000) {
95
+ await sync();
96
+ synced = Date.now();
97
+ }
98
+ }
99
+ }
100
+ finally {
101
+ signal.removeEventListener("abort", stop);
102
+ changes.close();
103
+ }
104
+ };
105
+ const config = async () => (await loadConfig(transport)).config;
106
+ const send = async (instructions, signer) => (await transport.send(await budgeted(transport, priority, instructions, signer.address), signer));
107
+ const mints = new Map();
108
+ const mint = (address) => {
109
+ const known = mints.get(address);
110
+ if (known !== undefined) {
111
+ return known;
112
+ }
113
+ const loading = mintOf(transport, address).then(({ decimals, tokenProgram }) => ({ decimals, tokenProgram }));
114
+ mints.set(address, loading);
115
+ loading.catch(() => mints.delete(address));
116
+ return loading;
117
+ };
118
+ const createIntent = async (input) => {
119
+ const { signer, params, inputMint, outputMint } = input;
120
+ const owner = signer.address;
121
+ const [settings, sell, buy, user] = await Promise.all([config(), mint(inputMint), mint(outputMint), loadUser(transport, owner)]);
122
+ const nonce = input.nonce ?? nonceAfter(owner, user);
123
+ const expiresAt = input.expiresAt ?? (await chainTime(transport)) + (input.expiresIn ?? DEFAULT_EXPIRES_IN);
124
+ const recipient = input.receiver ?? owner;
125
+ const receiver = await tokenAccountIfMissing(transport, signer, recipient, outputMint, buy.tokenProgram);
126
+ const wrap = await wrapIfShort(transport, signer, inputMint, sell.tokenProgram, escrowAmount(params));
127
+ const create = await buildCreateIntent({
128
+ owner: signer,
129
+ treasury: settings.feeRecipient,
130
+ maxCreateFee: settings.createFee,
131
+ maxBounty: settings.crankBounty,
132
+ nonce,
133
+ params,
134
+ expiresAt,
135
+ inputMint,
136
+ outputMint,
137
+ inputTokenProgram: sell.tokenProgram,
138
+ outputTokenProgram: buy.tokenProgram,
139
+ ...(recipient === owner ? {} : { receiver: receiver.address, receiverAuthority: recipient }),
140
+ });
141
+ const register = await initUserIfMissing(user, signer);
142
+ const signature = await send([...register, ...receiver.create, ...wrap.instructions, create], signer);
143
+ const [intent] = await findIntentPda({ owner, nonce });
144
+ return { signature, intent, nonce };
145
+ };
146
+ const cancel = async (signer, nonce) => {
147
+ const { intent } = await loadIntent(transport, signer.address, nonce);
148
+ const { tokenProgram } = await mint(intent.inputMint);
149
+ const refund = await tokenAccountIfMissing(transport, signer, signer.address, intent.inputMint, tokenProgram);
150
+ return send([...refund.create, await buildCancelIntent({ owner: signer, nonce, inputMint: intent.inputMint, tokenProgram })], signer);
151
+ };
152
+ const unwrap = async (signer) => {
153
+ const account = await findAssociatedTokenAddress({ owner: signer.address, mint: NATIVE_MINT, tokenProgram: TOKEN_PROGRAM_ADDRESS });
154
+ if ((await createdAccount(transport, account)) === null) {
155
+ return null;
156
+ }
157
+ return send([getCloseAccountInstruction({ account, destination: signer.address, owner: signer })], signer);
158
+ };
159
+ const history = async (intent, limit = HISTORY_LIMIT) => (await transport.engineTransactions(limit, intent))
160
+ .filter(({ failed }) => !failed)
161
+ .flatMap(({ signature, slot, emitted }) => emitted
162
+ .map((data) => decodeEvent(data))
163
+ .filter((event) => event !== null && "intent" in event.fields && event.fields.intent === intent)
164
+ .reverse()
165
+ .map((event) => ({ ...event, signature: signature, slot })));
166
+ const settleProof = async (input) => {
167
+ const { judge, owner, nonce, payTo, result } = input;
168
+ const payer = input.payer ?? judge;
169
+ const [{ address, intent: held }, settings] = await Promise.all([loadIntent(transport, owner, nonce), config()]);
170
+ const params = decodeParams(held.kind, Uint8Array.from(held.params));
171
+ if (params.kind !== Kind.AttestedResult) {
172
+ throw new NotSettleable(address, "is not an AttestedResult intent");
173
+ }
174
+ if (params.specHash.every((b) => b === 0)) {
175
+ throw new NotSettleable(address, "commits no spec hash, so it is not a proof intent");
176
+ }
177
+ if (held.status !== IntentStatus.Open) {
178
+ throw new NotSettleable(address, "is not open");
179
+ }
180
+ if (params.attestor !== judge.address) {
181
+ throw new NotSettleable(address, `names ${params.attestor} as its judge, not ${judge.address}`);
182
+ }
183
+ const { tokenProgram } = await mint(held.inputMint);
184
+ const account = (wallet) => tokenAccountIfMissing(transport, payer, wallet, held.inputMint, tokenProgram);
185
+ const amountIn = held.escrowed - held.filled;
186
+ const kindBps = feeBpsFor(settings, held.kind);
187
+ const maxFeeBps = kindBps + held.partnerBps;
188
+ const shares = splitFees(amountIn - params.judgeFee, kindBps, held.partnerBps, held.partnerCutBps);
189
+ const feeRecipient = shares.protocol > 0n ? settings.feeRecipient : undefined;
190
+ const partner = shares.partner > 0n ? held.partner : undefined;
191
+ const paidJudge = params.judgeFee > 0n ? judge.address : undefined;
192
+ const payee = await account(payTo);
193
+ const others = await Promise.all([feeRecipient, partner, paidJudge].filter((wallet) => wallet !== undefined).map(account));
194
+ const fields = { amountIn, result, maxFeeBps };
195
+ const message = await attestedProofMessage(judge.address, {
196
+ ...fields,
197
+ domain: Uint8Array.from(settings.domain),
198
+ intent: address,
199
+ payee: payee.address,
200
+ filled: held.filled,
201
+ revision: held.revision,
202
+ specHash: params.specHash,
203
+ });
204
+ const settle = await buildFillAttested({
205
+ ...fields,
206
+ solver: judge,
207
+ owner,
208
+ nonce,
209
+ inputMint: held.inputMint,
210
+ inputTokenProgram: tokenProgram,
211
+ payee: payee.address,
212
+ ...(feeRecipient === undefined ? {} : { feeRecipient }),
213
+ ...(partner === undefined ? {} : { partner }),
214
+ ...(paidJudge === undefined ? {} : { judge: paidJudge }),
215
+ });
216
+ const setup = [payee, ...others].flatMap(({ create }) => create);
217
+ return send([...setup, await signEd25519Instruction(judge, message), settle], payer);
218
+ };
219
+ return {
220
+ url,
221
+ transport,
222
+ config,
223
+ intent: async (owner, nonce) => {
224
+ try {
225
+ return await loadIntent(transport, owner, nonce);
226
+ }
227
+ catch (error) {
228
+ if (error instanceof MissingAccount) {
229
+ return null;
230
+ }
231
+ throw error;
232
+ }
233
+ },
234
+ intents: async (filter = {}) => (await transport.intents(filter.owner))
235
+ .map(decoded)
236
+ .filter(({ intent }) => filter.status === undefined || intent.status === filter.status),
237
+ history,
238
+ nextNonce: async (owner) => nonceAfter(owner, await loadUser(transport, owner)),
239
+ simulate: async (instructions, signer) => simulated(transport, await budgeted(transport, priority, instructions, signer.address), signer.address),
240
+ send,
241
+ watch,
242
+ explain,
243
+ mint,
244
+ chainTime: () => chainTime(transport),
245
+ createIntent,
246
+ cancel,
247
+ unwrap,
248
+ settleProof,
249
+ };
250
+ }
251
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export type EngineError = {
2
+ code: number;
3
+ name: string;
4
+ message: string;
5
+ };
6
+ export declare const ENGINE_ERRORS: ReadonlyMap<number, EngineError>;
7
+ export declare function explain(error: unknown): EngineError | null;
@@ -0,0 +1,57 @@
1
+ import { INTENT_ENGINE_PROGRAM_ADDRESS } from "@intent-engine/core";
2
+ import idl from "@intent-engine/core/idl.json" with { type: "json" };
3
+ const words = (name) => name.replace(/([a-z0-9])([A-Z])/g, "$1 $2").toLowerCase();
4
+ export const ENGINE_ERRORS = new Map(idl.errors.map(({ code, name, msg }) => [code, { code, name, message: msg ?? words(name) }]));
5
+ const ENGINE_FAILED = new RegExp(`Program ${INTENT_ENGINE_PROGRAM_ADDRESS} failed: custom program error: 0x([0-9a-f]+)`, "i");
6
+ const PROGRAM_FAILED = /Program \w{32,44} failed: custom program error: 0x[0-9a-f]+/i;
7
+ const CUSTOM_HEX = /custom program error: 0x([0-9a-f]+)/i;
8
+ const CUSTOM_DECIMAL = /\bCustom\W{1,3}(\d+)/;
9
+ const CAUSE_DEPTH = 8;
10
+ function codeInText(text) {
11
+ const engine = ENGINE_FAILED.exec(text);
12
+ if (engine !== null) {
13
+ return Number.parseInt(engine[1] ?? "", 16);
14
+ }
15
+ if (PROGRAM_FAILED.test(text)) {
16
+ return null;
17
+ }
18
+ const hex = CUSTOM_HEX.exec(text);
19
+ if (hex !== null) {
20
+ return Number.parseInt(hex[1] ?? "", 16);
21
+ }
22
+ const decimal = CUSTOM_DECIMAL.exec(text);
23
+ return decimal === null ? null : Number(decimal[1]);
24
+ }
25
+ function codeOf(error, depth) {
26
+ if (depth > CAUSE_DEPTH || error === null || error === undefined) {
27
+ return null;
28
+ }
29
+ if (typeof error === "string") {
30
+ return codeInText(error);
31
+ }
32
+ if (typeof error !== "object") {
33
+ return null;
34
+ }
35
+ const carried = error;
36
+ for (const code of [carried.context?.code, carried.code]) {
37
+ if (typeof code === "number" && ENGINE_ERRORS.has(code)) {
38
+ return code;
39
+ }
40
+ }
41
+ const texts = [
42
+ ...(typeof carried.message === "string" ? [carried.message] : []),
43
+ ...(Array.isArray(carried.logs) ? carried.logs.filter((line) => typeof line === "string") : []),
44
+ ];
45
+ for (const text of texts) {
46
+ const code = codeInText(text);
47
+ if (code !== null) {
48
+ return code;
49
+ }
50
+ }
51
+ return codeOf(carried.cause, depth + 1);
52
+ }
53
+ export function explain(error) {
54
+ const code = codeOf(error, 0);
55
+ return code === null ? null : (ENGINE_ERRORS.get(code) ?? null);
56
+ }
57
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export * from "./accounts.js";
2
+ export * from "./budget.js";
3
+ export * from "./client.js";
4
+ export * from "./errors.js";
5
+ export * from "./setup.js";
6
+ export * from "./transport.js";
@@ -0,0 +1,7 @@
1
+ export * from "./accounts.js";
2
+ export * from "./budget.js";
3
+ export * from "./client.js";
4
+ export * from "./errors.js";
5
+ export * from "./setup.js";
6
+ export * from "./transport.js";
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { type Address, type Instruction, type TransactionSigner } from "@solana/kit";
2
+ import { type NonceWindow } from "./accounts.js";
3
+ import type { Transport } from "./transport.js";
4
+ export type Owner = Address | TransactionSigner;
5
+ export declare function initUserIfMissing(user: NonceWindow | null, owner: Owner): Promise<Instruction[]>;
6
+ export declare function tokenAccountIfMissing(transport: Transport, payer: TransactionSigner, owner: Address, mint: Address, tokenProgram: Address): Promise<{
7
+ address: Address;
8
+ create: Instruction[];
9
+ }>;
10
+ export type Wrap = {
11
+ instructions: Instruction[];
12
+ lamports: bigint;
13
+ };
14
+ export declare function wrapIfShort(transport: Transport, owner: Owner, mint: Address, tokenProgram: Address, needed: bigint): Promise<Wrap>;
@@ -0,0 +1,39 @@
1
+ import { createNoopSigner } from "@solana/kit";
2
+ import { getTransferSolInstruction } from "@solana-program/system";
3
+ import { getCreateAssociatedTokenIdempotentInstructionAsync, getSyncNativeInstruction, getTokenDecoder } from "@solana-program/token";
4
+ import { buildInitUser, findAssociatedTokenAddress, NATIVE_MINT, TOKEN_PROGRAM_ADDRESS } from "@intent-engine/core";
5
+ import { createdAccount } from "./accounts.js";
6
+ const signerOf = (owner) => (typeof owner === "string" ? createNoopSigner(owner) : owner);
7
+ const addressOf = (owner) => (typeof owner === "string" ? owner : owner.address);
8
+ export async function initUserIfMissing(user, owner) {
9
+ return user === null ? [await buildInitUser({ owner: signerOf(owner) })] : [];
10
+ }
11
+ export async function tokenAccountIfMissing(transport, payer, owner, mint, tokenProgram) {
12
+ const address = await findAssociatedTokenAddress({ owner, mint, tokenProgram });
13
+ const create = (await createdAccount(transport, address)) === null
14
+ ? [await getCreateAssociatedTokenIdempotentInstructionAsync({ payer, owner, mint, tokenProgram })]
15
+ : [];
16
+ return { address, create };
17
+ }
18
+ export async function wrapIfShort(transport, owner, mint, tokenProgram, needed) {
19
+ if (mint !== NATIVE_MINT || tokenProgram !== TOKEN_PROGRAM_ADDRESS) {
20
+ return { instructions: [], lamports: 0n };
21
+ }
22
+ const holder = addressOf(owner);
23
+ const account = await findAssociatedTokenAddress({ owner: holder, mint, tokenProgram });
24
+ const view = await createdAccount(transport, account);
25
+ const held = view === null ? 0n : getTokenDecoder().decode(view.data).amount;
26
+ if (held >= needed) {
27
+ return { instructions: [], lamports: 0n };
28
+ }
29
+ const payer = signerOf(owner);
30
+ return {
31
+ instructions: [
32
+ ...(view === null ? [await getCreateAssociatedTokenIdempotentInstructionAsync({ payer, owner: holder, mint, tokenProgram })] : []),
33
+ getTransferSolInstruction({ source: payer, destination: account, amount: needed - held }),
34
+ getSyncNativeInstruction({ account }),
35
+ ],
36
+ lamports: needed - held,
37
+ };
38
+ }
39
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/setup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { type LiteSVM } from "litesvm";
2
+ import type { Transport } from "./transport.js";
3
+ export type SvmTransportOptions = {
4
+ genesisHash?: string;
5
+ };
6
+ export declare const SVM_GENESIS_HASH = "11111111111111111111111111111111";
7
+ export declare function svmTransport(svm: LiteSVM, options?: SvmTransportOptions): Transport;
@@ -0,0 +1,96 @@
1
+ import { appendTransactionMessageInstructions, createTransactionMessage, getBase64Encoder, getCompiledTransactionMessageDecoder, getSignatureFromTransaction, getTransactionDecoder, lamports, pipe, setTransactionMessageFeePayerSigner, signTransactionMessageWithSigners, } from "@solana/kit";
2
+ import { getIntentDecoder, getIntentDiscriminatorBytes, INTENT_ENGINE_PROGRAM_ADDRESS } from "@intent-engine/core";
3
+ import { FailedTransactionMetadata } from "litesvm";
4
+ export const SVM_GENESIS_HASH = "11111111111111111111111111111111";
5
+ const decodeWire = (wire) => getTransactionDecoder().decode(getBase64Encoder().encode(wire));
6
+ export function svmTransport(svm, options = {}) {
7
+ const seen = new Set();
8
+ const tag = getIntentDiscriminatorBytes();
9
+ const engineData = (address) => {
10
+ const account = svm.getAccount(address);
11
+ return account.exists && account.programAddress === INTENT_ENGINE_PROGRAM_ADDRESS ? new Uint8Array(account.data) : null;
12
+ };
13
+ const history = [];
14
+ const landed = (tx) => {
15
+ const result = svm.sendTransaction(tx);
16
+ if (result instanceof FailedTransactionMetadata) {
17
+ throw new Error(`${String(result.err())}\n${result.meta().logs().join("\n")}`);
18
+ }
19
+ const keys = getCompiledTransactionMessageDecoder().decode(tx.messageBytes).staticAccounts;
20
+ for (const address of keys) {
21
+ const data = engineData(address);
22
+ if (data !== null && tag.every((b, i) => data[i] === b)) {
23
+ seen.add(address);
24
+ }
25
+ }
26
+ const signature = getSignatureFromTransaction(tx);
27
+ const clock = svm.getClock();
28
+ history.unshift({
29
+ touched: new Set(keys),
30
+ found: {
31
+ signature,
32
+ slot: clock.slot,
33
+ blockTime: clock.unixTimestamp,
34
+ failed: false,
35
+ emitted: result
36
+ .innerInstructions()
37
+ .flat()
38
+ .map((inner) => inner.instruction())
39
+ .filter((ix) => keys[ix.programIdIndex()] === INTENT_ENGINE_PROGRAM_ADDRESS)
40
+ .map((ix) => new Uint8Array(ix.data())),
41
+ },
42
+ });
43
+ return signature;
44
+ };
45
+ const getAccount = async (address) => {
46
+ const account = svm.getAccount(address);
47
+ return account.exists
48
+ ? { owner: account.programAddress, data: new Uint8Array(account.data), lamports: account.lamports, executable: account.executable }
49
+ : null;
50
+ };
51
+ return {
52
+ getAccount,
53
+ getAccounts: async (addresses) => Promise.all(addresses.map(getAccount)),
54
+ send: async (instructions, payer) => {
55
+ svm.expireBlockhash();
56
+ const message = pipe(createTransactionMessage({ version: 0 }), (m) => setTransactionMessageFeePayerSigner(payer, m), (m) => svm.setTransactionMessageLifetimeUsingLatestBlockhash(m), (m) => appendTransactionMessageInstructions(instructions, m));
57
+ return landed(await signTransactionMessageWithSigners(message));
58
+ },
59
+ latestBlockhash: async () => ({ blockhash: svm.latestBlockhash(), lastValidBlockHeight: 0n }),
60
+ sendWire: async (wire) => landed(decodeWire(wire)),
61
+ submitWire: async (wire) => landed(decodeWire(wire)),
62
+ simulate: async (wire, watch = []) => {
63
+ const tx = decodeWire(wire);
64
+ const unsigned = Object.fromEntries(Object.entries(tx.signatures).map(([signer, signature]) => [signer, signature ?? new Uint8Array(64)]));
65
+ svm.withSigverify(false).withBlockhashCheck(false);
66
+ const result = svm.simulateTransaction({ ...tx, signatures: unsigned });
67
+ svm.withSigverify(true).withBlockhashCheck(true);
68
+ const meta = result.meta();
69
+ return {
70
+ err: result instanceof FailedTransactionMetadata ? String(result.err()) : null,
71
+ logs: meta.logs(),
72
+ unitsConsumed: meta.computeUnitsConsumed(),
73
+ accounts: watch.map(() => null),
74
+ };
75
+ },
76
+ genesisHash: async () => options.genesisHash ?? SVM_GENESIS_HASH,
77
+ intents: async (owner) => {
78
+ const found = [];
79
+ for (const address of seen) {
80
+ const data = engineData(address);
81
+ if (data !== null && (owner === undefined || getIntentDecoder().decode(data).owner === owner)) {
82
+ found.push({ address, data });
83
+ }
84
+ }
85
+ return found;
86
+ },
87
+ engineTransactions: async (limit, of = INTENT_ENGINE_PROGRAM_ADDRESS) => history.filter(({ touched }) => touched.has(of)).slice(0, limit).map(({ found }) => found),
88
+ recentFees: async () => [],
89
+ budget: async (instructions) => [...instructions],
90
+ airdrop: async (address, amount) => {
91
+ svm.airdrop(address, lamports(amount));
92
+ return `airdrop-${address}-${amount}`;
93
+ },
94
+ };
95
+ }
96
+ //# sourceMappingURL=svm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"svm.js","sourceRoot":"","sources":["../../src/svm.ts"],"names":[],"mappings":"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"}