@intent-engine/cli 0.1.22 → 0.1.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (175) hide show
  1. package/dist/src/admin-commands.d.ts +12 -0
  2. package/dist/src/admin-commands.js +140 -0
  3. package/dist/src/admin-commands.js.map +1 -0
  4. package/dist/src/agent/actions.d.ts +2 -0
  5. package/dist/src/agent/actions.js +1 -1
  6. package/dist/src/agent/actions.js.map +1 -1
  7. package/dist/src/agent/claims.js +13 -12
  8. package/dist/src/agent/claims.js.map +1 -1
  9. package/dist/src/agent/create.d.ts +1 -0
  10. package/dist/src/agent/create.js +18 -4
  11. package/dist/src/agent/create.js.map +1 -1
  12. package/dist/src/agent/mandate-agent.d.ts +2 -0
  13. package/dist/src/agent/mandate-agent.js +136 -0
  14. package/dist/src/agent/mandate-agent.js.map +1 -0
  15. package/dist/src/agent/mandate-grant.d.ts +2 -0
  16. package/dist/src/agent/mandate-grant.js +192 -0
  17. package/dist/src/agent/mandate-grant.js.map +1 -0
  18. package/dist/src/agent/mandate-revoke.d.ts +1 -0
  19. package/dist/src/agent/mandate-revoke.js +142 -0
  20. package/dist/src/agent/mandate-revoke.js.map +1 -0
  21. package/dist/src/agent/mandate-state.d.ts +33 -0
  22. package/dist/src/agent/mandate-state.js +85 -0
  23. package/dist/src/agent/mandate-state.js.map +1 -0
  24. package/dist/src/agent/mandate.d.ts +4 -26
  25. package/dist/src/agent/mandate.js +4 -479
  26. package/dist/src/agent/mandate.js.map +1 -1
  27. package/dist/src/agent/mcp.js +10 -5
  28. package/dist/src/agent/mcp.js.map +1 -1
  29. package/dist/src/agent/prepare.js +1 -1
  30. package/dist/src/agent/prepare.js.map +1 -1
  31. package/dist/src/agent/problems.d.ts +15 -1
  32. package/dist/src/agent/problems.js +38 -2
  33. package/dist/src/agent/problems.js.map +1 -1
  34. package/dist/src/agent/read.d.ts +13 -0
  35. package/dist/src/agent/read.js +56 -7
  36. package/dist/src/agent/read.js.map +1 -1
  37. package/dist/src/agent/registry.js +8 -2
  38. package/dist/src/agent/registry.js.map +1 -1
  39. package/dist/src/agent/relay.d.ts +2 -0
  40. package/dist/src/agent/relay.js +11 -3
  41. package/dist/src/agent/relay.js.map +1 -1
  42. package/dist/src/agent/sales.d.ts +29 -0
  43. package/dist/src/agent/sales.js +248 -0
  44. package/dist/src/agent/sales.js.map +1 -0
  45. package/dist/src/agent/signed-prepare.d.ts +1 -0
  46. package/dist/src/agent/signed-prepare.js +141 -0
  47. package/dist/src/agent/signed-prepare.js.map +1 -0
  48. package/dist/src/agent/signed-relay.d.ts +25 -0
  49. package/dist/src/agent/signed-relay.js +68 -0
  50. package/dist/src/agent/signed-relay.js.map +1 -0
  51. package/dist/src/agent/signed-submit.d.ts +2 -0
  52. package/dist/src/agent/signed-submit.js +137 -0
  53. package/dist/src/agent/signed-submit.js.map +1 -0
  54. package/dist/src/agent/signed-terms.d.ts +85 -0
  55. package/dist/src/agent/signed-terms.js +84 -0
  56. package/dist/src/agent/signed-terms.js.map +1 -0
  57. package/dist/src/agent/signed.d.ts +4 -13
  58. package/dist/src/agent/signed.js +4 -361
  59. package/dist/src/agent/signed.js.map +1 -1
  60. package/dist/src/agent/wallet/account.d.ts +4 -0
  61. package/dist/src/agent/wallet/account.js +84 -0
  62. package/dist/src/agent/wallet/account.js.map +1 -0
  63. package/dist/src/agent/wallet/attest.d.ts +4 -0
  64. package/dist/src/agent/wallet/attest.js +178 -0
  65. package/dist/src/agent/wallet/attest.js.map +1 -0
  66. package/dist/src/agent/wallet/delivery.d.ts +13 -0
  67. package/dist/src/agent/wallet/delivery.js +171 -0
  68. package/dist/src/agent/wallet/delivery.js.map +1 -0
  69. package/dist/src/agent/wallet/escrow.d.ts +7 -0
  70. package/dist/src/agent/wallet/escrow.js +164 -0
  71. package/dist/src/agent/wallet/escrow.js.map +1 -0
  72. package/dist/src/agent/wallet/fills.d.ts +27 -0
  73. package/dist/src/agent/wallet/fills.js +80 -0
  74. package/dist/src/agent/wallet/fills.js.map +1 -0
  75. package/dist/src/agent/wallet/guard.d.ts +57 -0
  76. package/dist/src/agent/wallet/guard.js +205 -0
  77. package/dist/src/agent/wallet/guard.js.map +1 -0
  78. package/dist/src/agent/wallet/offer.d.ts +50 -0
  79. package/dist/src/agent/wallet/offer.js +80 -0
  80. package/dist/src/agent/wallet/offer.js.map +1 -0
  81. package/dist/src/agent/wallet/receipt.d.ts +42 -0
  82. package/dist/src/agent/wallet/receipt.js +102 -0
  83. package/dist/src/agent/wallet/receipt.js.map +1 -0
  84. package/dist/src/agent/wallet/record.d.ts +31 -0
  85. package/dist/src/agent/wallet/record.js +178 -0
  86. package/dist/src/agent/wallet/record.js.map +1 -0
  87. package/dist/src/agent/wallet/releases.d.ts +40 -0
  88. package/dist/src/agent/wallet/releases.js +236 -0
  89. package/dist/src/agent/wallet/releases.js.map +1 -0
  90. package/dist/src/agent/wallet/split.d.ts +10 -0
  91. package/dist/src/agent/wallet/split.js +271 -0
  92. package/dist/src/agent/wallet/split.js.map +1 -0
  93. package/dist/src/agent/wallet/trade.d.ts +14 -0
  94. package/dist/src/agent/wallet/trade.js +243 -0
  95. package/dist/src/agent/wallet/trade.js.map +1 -0
  96. package/dist/src/agent/wallet/wait.d.ts +5 -0
  97. package/dist/src/agent/wallet/wait.js +99 -0
  98. package/dist/src/agent/wallet/wait.js.map +1 -0
  99. package/dist/src/agent/wallet.d.ts +18 -72
  100. package/dist/src/agent/wallet.js +26 -1216
  101. package/dist/src/agent/wallet.js.map +1 -1
  102. package/dist/src/arg-options.d.ts +333 -0
  103. package/dist/src/arg-options.js +310 -0
  104. package/dist/src/arg-options.js.map +1 -0
  105. package/dist/src/arg-usage.d.ts +7 -0
  106. package/dist/src/arg-usage.js +53 -0
  107. package/dist/src/arg-usage.js.map +1 -0
  108. package/dist/src/arg-values.d.ts +47 -0
  109. package/dist/src/arg-values.js +280 -0
  110. package/dist/src/arg-values.js.map +1 -0
  111. package/dist/src/args.d.ts +7 -487
  112. package/dist/src/args.js +89 -880
  113. package/dist/src/args.js.map +1 -1
  114. package/dist/src/artifact.d.ts +22 -0
  115. package/dist/src/artifact.js +89 -0
  116. package/dist/src/artifact.js.map +1 -0
  117. package/dist/src/check-process.d.ts +39 -0
  118. package/dist/src/check-process.js +338 -0
  119. package/dist/src/check-process.js.map +1 -0
  120. package/dist/src/command-builders.d.ts +37 -0
  121. package/dist/src/command-builders.js +216 -0
  122. package/dist/src/command-builders.js.map +1 -0
  123. package/dist/src/command-types.d.ts +227 -0
  124. package/dist/src/command-types.js +2 -0
  125. package/dist/src/command-types.js.map +1 -0
  126. package/dist/src/commands.d.ts +7 -43
  127. package/dist/src/commands.js +67 -426
  128. package/dist/src/commands.js.map +1 -1
  129. package/dist/src/event-feed.d.ts +13 -0
  130. package/dist/src/event-feed.js +46 -0
  131. package/dist/src/event-feed.js.map +1 -0
  132. package/dist/src/flow-commands.d.ts +8 -0
  133. package/dist/src/flow-commands.js +116 -0
  134. package/dist/src/flow-commands.js.map +1 -0
  135. package/dist/src/flows.d.ts +6 -0
  136. package/dist/src/flows.js +84 -10
  137. package/dist/src/flows.js.map +1 -1
  138. package/dist/src/job-commands.d.ts +9 -0
  139. package/dist/src/job-commands.js +89 -0
  140. package/dist/src/job-commands.js.map +1 -0
  141. package/dist/src/judge-errors.d.ts +12 -0
  142. package/dist/src/judge-errors.js +16 -0
  143. package/dist/src/judge-errors.js.map +1 -0
  144. package/dist/src/judge.d.ts +28 -0
  145. package/dist/src/judge.js +169 -0
  146. package/dist/src/judge.js.map +1 -0
  147. package/dist/src/main.d.ts +4 -1
  148. package/dist/src/main.js +26 -10
  149. package/dist/src/main.js.map +1 -1
  150. package/dist/src/order-builders.d.ts +10 -0
  151. package/dist/src/order-builders.js +172 -0
  152. package/dist/src/order-builders.js.map +1 -0
  153. package/dist/src/render.d.ts +1 -0
  154. package/dist/src/render.js +9 -0
  155. package/dist/src/render.js.map +1 -1
  156. package/dist/src/runtime.d.ts +22 -0
  157. package/dist/src/runtime.js +2 -0
  158. package/dist/src/runtime.js.map +1 -0
  159. package/dist/src/solve-commands.d.ts +25 -0
  160. package/dist/src/solve-commands.js +171 -0
  161. package/dist/src/solve-commands.js.map +1 -0
  162. package/dist/src/tokens.js +2 -1
  163. package/dist/src/tokens.js.map +1 -1
  164. package/dist/src/version.d.ts +1 -1
  165. package/dist/src/version.js +1 -1
  166. package/dist/src/wallet.d.ts +4 -1
  167. package/dist/src/wallet.js +25 -5
  168. package/dist/src/wallet.js.map +1 -1
  169. package/package.json +16 -7
  170. package/dist/src/events.d.ts +0 -8
  171. package/dist/src/events.js +0 -43
  172. package/dist/src/events.js.map +0 -1
  173. package/dist/src/transport.d.ts +0 -208
  174. package/dist/src/transport.js +0 -441
  175. package/dist/src/transport.js.map +0 -1
@@ -1,208 +0,0 @@
1
- import { type Address, type Base64EncodedWireTransaction, type Blockhash, type Instruction, type Signature, type TransactionSigner } from "@solana/kit";
2
- export type AccountView = {
3
- owner: Address;
4
- data: Uint8Array;
5
- lamports: bigint;
6
- executable?: boolean;
7
- };
8
- export type ProgramAccount = {
9
- address: Address;
10
- data: Uint8Array;
11
- };
12
- export type EngineTransaction = {
13
- signature: string;
14
- slot: bigint;
15
- blockTime: bigint | null;
16
- failed: boolean;
17
- emitted: Uint8Array[];
18
- memos?: string[];
19
- unread?: true;
20
- };
21
- export type Latest = {
22
- blockhash: Blockhash;
23
- lastValidBlockHeight: bigint;
24
- };
25
- export type Simulation = {
26
- err: string | null;
27
- logs: string[];
28
- unitsConsumed: bigint | null;
29
- accounts: (Uint8Array | null)[];
30
- };
31
- export interface Transport {
32
- getAccount(address: Address): Promise<AccountView | null>;
33
- getAccounts(addresses: readonly Address[]): Promise<(AccountView | null)[]>;
34
- warm?(addresses: readonly Address[]): Promise<void>;
35
- send(instructions: readonly Instruction[], payer: TransactionSigner): Promise<string>;
36
- latestBlockhash(): Promise<Latest>;
37
- sendWire(wire: Base64EncodedWireTransaction, latest: Latest): Promise<string>;
38
- submitWire(wire: Base64EncodedWireTransaction): Promise<string>;
39
- simulate(wire: Base64EncodedWireTransaction, watch?: readonly Address[]): Promise<Simulation>;
40
- genesisHash(): Promise<string>;
41
- intents(owner?: Address): Promise<ProgramAccount[]>;
42
- engineTransactions(limit: number, of?: Address): Promise<EngineTransaction[]>;
43
- recentFees(accounts: readonly Address[]): Promise<bigint[]>;
44
- budget(instructions: readonly Instruction[], feePayer: Address): Promise<Instruction[]>;
45
- airdrop(address: Address, lamports: bigint): Promise<string>;
46
- }
47
- type Pending<T> = {
48
- send(): Promise<T>;
49
- };
50
- type RawAccount = {
51
- owner: Address;
52
- data: readonly [string, string];
53
- lamports: bigint;
54
- executable: boolean;
55
- };
56
- export type RpcLike = {
57
- getMultipleAccounts(addresses: Address[], config: {
58
- encoding: "base64";
59
- }): Pending<{
60
- value: (RawAccount | null)[];
61
- }>;
62
- getAccountInfo(address: Address, config: {
63
- encoding: "base64";
64
- }): Pending<{
65
- value: {
66
- owner: Address;
67
- data: readonly [string, string];
68
- lamports: bigint;
69
- executable: boolean;
70
- } | null;
71
- }>;
72
- getLatestBlockhash(): Pending<{
73
- value: {
74
- blockhash: Blockhash;
75
- lastValidBlockHeight: bigint;
76
- };
77
- }>;
78
- sendTransaction(wire: Base64EncodedWireTransaction, config: {
79
- encoding: "base64";
80
- skipPreflight?: boolean;
81
- }): Pending<Signature>;
82
- simulateTransaction(wire: Base64EncodedWireTransaction, config: {
83
- encoding: "base64";
84
- sigVerify: false;
85
- replaceRecentBlockhash: true;
86
- accounts?: {
87
- addresses: Address[];
88
- encoding: "base64";
89
- };
90
- }): Pending<{
91
- value: {
92
- err: unknown;
93
- logs: readonly string[] | null;
94
- unitsConsumed?: bigint | undefined;
95
- accounts?: readonly ({
96
- data: readonly [string, string];
97
- } | null)[] | null;
98
- };
99
- }>;
100
- getSignatureStatuses(signatures: Signature[], config?: {
101
- searchTransactionHistory: boolean;
102
- }): Pending<{
103
- context: {
104
- slot: bigint;
105
- };
106
- value: readonly ({
107
- err: unknown;
108
- confirmationStatus: string | null;
109
- } | null)[];
110
- }>;
111
- getEpochInfo(): Pending<{
112
- blockHeight: bigint;
113
- absoluteSlot: bigint;
114
- }>;
115
- requestAirdrop(address: Address, lamports: bigint): Pending<Signature>;
116
- getRecentPrioritizationFees(addresses: readonly Address[]): Pending<readonly {
117
- prioritizationFee: bigint;
118
- }[]>;
119
- getGenesisHash(): Pending<string>;
120
- getProgramAccounts(program: Address, config: {
121
- encoding: "base64";
122
- filters: readonly ({
123
- dataSize: bigint;
124
- } | {
125
- memcmp: {
126
- offset: bigint;
127
- bytes: string;
128
- encoding: "base58";
129
- };
130
- })[];
131
- }): Pending<readonly {
132
- pubkey: Address;
133
- account: {
134
- data: readonly [string, string];
135
- };
136
- }[]>;
137
- getSignaturesForAddress(address: Address, config: {
138
- limit: number;
139
- }): Pending<readonly {
140
- signature: Signature;
141
- slot: bigint;
142
- blockTime: bigint | null;
143
- err: unknown;
144
- }[]>;
145
- getTransaction(signature: Signature, config: {
146
- encoding: "json";
147
- maxSupportedTransactionVersion: 0;
148
- commitment: "confirmed";
149
- }): Pending<{
150
- transaction: {
151
- message: {
152
- accountKeys: readonly Address[];
153
- instructions?: readonly {
154
- programIdIndex: number;
155
- data: string;
156
- }[];
157
- };
158
- };
159
- meta: {
160
- loadedAddresses?: {
161
- writable: readonly Address[];
162
- readonly: readonly Address[];
163
- };
164
- innerInstructions?: readonly {
165
- instructions: readonly {
166
- programIdIndex: number;
167
- data: string;
168
- }[];
169
- }[] | null;
170
- } | null;
171
- } | null>;
172
- };
173
- export declare const MEMO_PROGRAM_ADDRESS: Address;
174
- export declare const POLL_MS = 500;
175
- export declare const CONFIRM_POLLS = 360;
176
- export declare const RATE_LIMIT_ATTEMPTS = 6;
177
- export declare function rateLimited(error: unknown): boolean;
178
- export declare function patiently<T>(call: () => Promise<T>, wait?: (ms: number) => Promise<void>): Promise<T>;
179
- export declare class Charged extends Error {
180
- constructor(message: string);
181
- }
182
- export declare class FailedOnChain extends Charged {
183
- }
184
- export declare class BlockhashExpired extends Error {
185
- constructor(message: string);
186
- }
187
- export declare const neverLanded: (error: unknown) => boolean;
188
- export type SignatureWatch = (signature: Signature, signal: AbortSignal) => Promise<void>;
189
- export declare function signatureWatch(url: string): SignatureWatch;
190
- export declare function confirm(rpc: RpcLike, signature: Signature, lastValidBlockHeight: bigint, wait?: (ms: number) => Promise<void>, watch?: SignatureWatch): Promise<void>;
191
- export declare function confirmSent(rpc: RpcLike, signature: Signature, lastValidBlockHeight: bigint, wait?: (ms: number) => Promise<void>, watch?: SignatureWatch): Promise<void>;
192
- export declare const MULTIPLE_ACCOUNTS_LIMIT = 100;
193
- export declare const TRANSACTION_FETCHES = 4;
194
- export declare const KEPT_TRANSACTIONS = 256;
195
- export declare const unmemoized: (transport: Transport) => Transport;
196
- export declare function memoized(inner: Transport): Transport;
197
- export declare function rpcTransport(rpc: RpcLike, wait?: (ms: number) => Promise<void>, watch?: SignatureWatch): Transport;
198
- export type IntentChanges = {
199
- wait(seconds: number): Promise<ProgramAccount[] | null>;
200
- close(): void;
201
- };
202
- export type Notifications = (signal: AbortSignal) => Promise<AsyncIterable<unknown>>;
203
- export declare function socketUrl(url: string): string;
204
- export declare function intentNotifications(url: string): Notifications;
205
- export declare function changedAccount(note: unknown): ProgramAccount | null;
206
- export declare const RECONNECT_MS: readonly number[];
207
- export declare function changesFrom(notifications: Notifications, reconnect?: readonly number[]): IntentChanges;
208
- export {};
@@ -1,441 +0,0 @@
1
- import { inspect } from "node:util";
2
- import { appendTransactionMessageInstructions, createSolanaRpcSubscriptions, createTransactionMessage, getBase64EncodedWireTransaction, pipe, setTransactionMessageFeePayerSigner, setTransactionMessageLifetimeUsingBlockhash, signTransactionMessageWithSigners, getBase58Decoder, getBase58Encoder, } from "@solana/kit";
3
- import { getIntentDiscriminatorBytes, getIntentSize, INTENT_ENGINE_PROGRAM_ADDRESS } from "@intent-engine/core";
4
- export const MEMO_PROGRAM_ADDRESS = "MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr";
5
- export const POLL_MS = 500;
6
- export const CONFIRM_POLLS = 360;
7
- const INTENT_OWNER_OFFSET = 8n;
8
- const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
9
- export const RATE_LIMIT_ATTEMPTS = 6;
10
- export function rateLimited(error) {
11
- return error instanceof Error && !(error instanceof Charged) && /\b429\b/.test(error.message);
12
- }
13
- export async function patiently(call, wait = sleep) {
14
- for (let attempt = 1;; attempt++) {
15
- try {
16
- return await call();
17
- }
18
- catch (error) {
19
- if (!rateLimited(error) || attempt >= RATE_LIMIT_ATTEMPTS) {
20
- throw error;
21
- }
22
- await wait(POLL_MS * 2 ** attempt);
23
- }
24
- }
25
- }
26
- export class Charged extends Error {
27
- constructor(message) {
28
- super(message);
29
- this.name = "Charged";
30
- }
31
- }
32
- export class FailedOnChain extends Charged {
33
- }
34
- export class BlockhashExpired extends Error {
35
- constructor(message) {
36
- super(message);
37
- this.name = "BlockhashExpired";
38
- }
39
- }
40
- const withoutMark = ({ complete: _, ...found }) => found;
41
- export const neverLanded = (error) => error instanceof FailedOnChain || error instanceof BlockhashExpired;
42
- export function signatureWatch(url) {
43
- const subscriptions = createSolanaRpcSubscriptions(socketUrl(url));
44
- return async (signature, abortSignal) => {
45
- const notes = await subscriptions.signatureNotifications(signature, { commitment: "confirmed" }).subscribe({ abortSignal });
46
- const iterator = notes[Symbol.asyncIterator]();
47
- const next = await iterator.next();
48
- if (next.done === true) {
49
- throw new Error(`the signature subscription for ${signature} ended without a notification`);
50
- }
51
- const err = next.value.value?.err ?? null;
52
- if (err !== null) {
53
- throw new FailedOnChain(`transaction ${signature} failed: ${inspect(err)}`);
54
- }
55
- };
56
- }
57
- const never = new Promise(() => undefined);
58
- export async function confirm(rpc, signature, lastValidBlockHeight, wait = sleep, watch) {
59
- if (watch === undefined) {
60
- return polled(rpc, signature, lastValidBlockHeight, wait);
61
- }
62
- const controller = new AbortController();
63
- const heard = watch(signature, controller.signal).catch((error) => {
64
- if (error instanceof Charged) {
65
- throw error;
66
- }
67
- return never;
68
- });
69
- try {
70
- await Promise.race([heard, polled(rpc, signature, lastValidBlockHeight, wait, controller.signal)]);
71
- }
72
- finally {
73
- controller.abort();
74
- }
75
- }
76
- function settled(signature, status) {
77
- if (!status || (status.confirmationStatus !== "confirmed" && status.confirmationStatus !== "finalized")) {
78
- return false;
79
- }
80
- if (status.err !== null) {
81
- throw new FailedOnChain(`transaction ${signature} failed: ${inspect(status.err)}`);
82
- }
83
- return true;
84
- }
85
- export async function confirmSent(rpc, signature, lastValidBlockHeight, wait = sleep, watch) {
86
- try {
87
- await confirm(rpc, signature, lastValidBlockHeight, wait, watch);
88
- }
89
- catch (error) {
90
- if (error instanceof Charged || error instanceof BlockhashExpired) {
91
- throw error;
92
- }
93
- throw new Charged(`transaction ${signature} was sent but its confirmation could not be read (${error instanceof Error ? error.message : String(error)}); look the signature up before sending again`);
94
- }
95
- }
96
- async function polled(rpc, signature, lastValidBlockHeight, wait, stop) {
97
- for (let poll = 1; stop?.aborted !== true; poll++) {
98
- const [status] = (await patiently(() => rpc.getSignatureStatuses([signature]).send(), wait)).value;
99
- if (settled(signature, status)) {
100
- return;
101
- }
102
- const epoch = await patiently(() => rpc.getEpochInfo().send(), wait);
103
- if (epoch.blockHeight > lastValidBlockHeight) {
104
- const late = await patiently(() => rpc.getSignatureStatuses([signature], { searchTransactionHistory: true }).send(), wait);
105
- const [found] = late.value;
106
- if (settled(signature, found)) {
107
- return;
108
- }
109
- if (found) {
110
- throw new Charged(`transaction ${signature} landed but is not confirmed yet; look the signature up before sending again`);
111
- }
112
- if (late.context.slot >= epoch.absoluteSlot) {
113
- throw new BlockhashExpired(`transaction ${signature} expired before confirmation`);
114
- }
115
- }
116
- if (poll >= CONFIRM_POLLS) {
117
- throw new Charged(`transaction ${signature} was neither confirmed nor expired after ${CONFIRM_POLLS} checks; the node may be stuck, so look the signature up before sending again`);
118
- }
119
- await wait(POLL_MS);
120
- }
121
- }
122
- export const MULTIPLE_ACCOUNTS_LIMIT = 100;
123
- function viewOf(value) {
124
- return value === null
125
- ? null
126
- : { owner: value.owner, data: new Uint8Array(Buffer.from(value.data[0], "base64")), lamports: value.lamports, executable: value.executable };
127
- }
128
- export const TRANSACTION_FETCHES = 4;
129
- export const KEPT_TRANSACTIONS = 256;
130
- const MEMOIZED = Symbol("memoized");
131
- const UNDERLYING = Symbol("underlying");
132
- export const unmemoized = (transport) => transport[UNDERLYING] ?? transport;
133
- export function memoized(inner) {
134
- if (inner[MEMOIZED] === true) {
135
- return inner;
136
- }
137
- const seen = new Map();
138
- const keep = (address, pending) => {
139
- seen.set(address, pending);
140
- pending.catch(() => {
141
- if (seen.get(address) === pending) {
142
- seen.delete(address);
143
- }
144
- });
145
- return pending;
146
- };
147
- const getAccount = (address) => seen.get(address) ?? keep(address, inner.getAccount(address));
148
- const warm = async (addresses) => {
149
- const missing = [...new Set(addresses)].filter((address) => !seen.has(address));
150
- if (missing.length === 0) {
151
- return;
152
- }
153
- const fetched = inner.getAccounts(missing);
154
- missing.forEach((address, i) => keep(address, fetched.then((views) => views[i] ?? null)));
155
- await fetched;
156
- };
157
- const writing = (write) => async (...args) => {
158
- try {
159
- return await write(...args);
160
- }
161
- finally {
162
- seen.clear();
163
- }
164
- };
165
- return {
166
- ...inner,
167
- [MEMOIZED]: true,
168
- [UNDERLYING]: inner,
169
- getAccount,
170
- send: writing(inner.send),
171
- sendWire: writing(inner.sendWire),
172
- submitWire: writing(inner.submitWire),
173
- airdrop: writing(inner.airdrop),
174
- getAccounts: async (addresses) => {
175
- await warm(addresses);
176
- return Promise.all(addresses.map(getAccount));
177
- },
178
- warm,
179
- };
180
- }
181
- export function rpcTransport(rpc, wait, watch) {
182
- const fetched = new Map();
183
- return {
184
- async getAccount(address) {
185
- const { value } = await patiently(() => rpc.getAccountInfo(address, { encoding: "base64" }).send(), wait);
186
- return viewOf(value);
187
- },
188
- async getAccounts(addresses) {
189
- const found = [];
190
- for (let at = 0; at < addresses.length; at += MULTIPLE_ACCOUNTS_LIMIT) {
191
- const chunk = addresses.slice(at, at + MULTIPLE_ACCOUNTS_LIMIT);
192
- const { value } = await patiently(() => rpc.getMultipleAccounts([...chunk], { encoding: "base64" }).send(), wait);
193
- found.push(...chunk.map((_, i) => viewOf(value[i] ?? null)));
194
- }
195
- return found;
196
- },
197
- async send(instructions, payer) {
198
- const { value: latest } = await patiently(() => rpc.getLatestBlockhash().send(), wait);
199
- const message = pipe(createTransactionMessage({ version: 0 }), (m) => setTransactionMessageFeePayerSigner(payer, m), (m) => setTransactionMessageLifetimeUsingBlockhash(latest, m), (m) => appendTransactionMessageInstructions(instructions, m));
200
- const signed = await signTransactionMessageWithSigners(message);
201
- const wire = getBase64EncodedWireTransaction(signed);
202
- const signature = await patiently(() => rpc.sendTransaction(wire, { encoding: "base64" }).send(), wait);
203
- await confirmSent(rpc, signature, latest.lastValidBlockHeight, wait, watch);
204
- return signature;
205
- },
206
- async airdrop(address, lamports) {
207
- const { value: latest } = await patiently(() => rpc.getLatestBlockhash().send(), wait);
208
- const signature = await rpc.requestAirdrop(address, lamports).send();
209
- await confirmSent(rpc, signature, latest.lastValidBlockHeight, wait, watch);
210
- return signature;
211
- },
212
- async latestBlockhash() {
213
- const { value } = await patiently(() => rpc.getLatestBlockhash().send(), wait);
214
- return value;
215
- },
216
- async sendWire(wire, latest) {
217
- const signature = await patiently(() => rpc.sendTransaction(wire, { encoding: "base64" }).send(), wait);
218
- await confirmSent(rpc, signature, latest.lastValidBlockHeight, wait, watch);
219
- return signature;
220
- },
221
- async submitWire(wire) {
222
- return patiently(() => rpc.sendTransaction(wire, { encoding: "base64", skipPreflight: true }).send(), wait);
223
- },
224
- async simulate(wire, watch = []) {
225
- const { value } = await patiently(() => rpc
226
- .simulateTransaction(wire, {
227
- encoding: "base64",
228
- sigVerify: false,
229
- replaceRecentBlockhash: true,
230
- ...(watch.length === 0 ? {} : { accounts: { addresses: [...watch], encoding: "base64" } }),
231
- })
232
- .send(), wait);
233
- return {
234
- err: value.err === null ? null : inspect(value.err, { depth: null, breakLength: Infinity }),
235
- logs: [...(value.logs ?? [])],
236
- unitsConsumed: value.unitsConsumed ?? null,
237
- accounts: watch.map((_, i) => {
238
- const found = value.accounts?.[i];
239
- return found === null || found === undefined ? null : new Uint8Array(Buffer.from(found.data[0], "base64"));
240
- }),
241
- };
242
- },
243
- async genesisHash() {
244
- return patiently(() => rpc.getGenesisHash().send(), wait);
245
- },
246
- async recentFees(accounts) {
247
- const fees = await patiently(() => rpc.getRecentPrioritizationFees(accounts).send(), wait);
248
- return fees.map((f) => f.prioritizationFee);
249
- },
250
- async budget(instructions) {
251
- return [...instructions];
252
- },
253
- async engineTransactions(limit, of) {
254
- const signatures = await patiently(() => rpc.getSignaturesForAddress(of ?? INTENT_ENGINE_PROGRAM_ADDRESS, { limit }).send(), wait);
255
- const fetchOne = (entry) => {
256
- const known = fetched.get(entry.signature);
257
- if (known !== undefined) {
258
- fetched.delete(entry.signature);
259
- fetched.set(entry.signature, known);
260
- return known.then(withoutMark);
261
- }
262
- const pending = load(entry);
263
- fetched.set(entry.signature, pending);
264
- pending.then((found) => {
265
- if (!found.complete && fetched.get(entry.signature) === pending) {
266
- fetched.delete(entry.signature);
267
- }
268
- }, () => {
269
- if (fetched.get(entry.signature) === pending) {
270
- fetched.delete(entry.signature);
271
- }
272
- });
273
- return pending.then(withoutMark);
274
- };
275
- const load = async (entry) => {
276
- const tx = await patiently(() => rpc
277
- .getTransaction(entry.signature, {
278
- encoding: "json",
279
- maxSupportedTransactionVersion: 0,
280
- commitment: "confirmed",
281
- })
282
- .send(), wait);
283
- const keys = [
284
- ...(tx?.transaction.message.accountKeys ?? []),
285
- ...(tx?.meta?.loadedAddresses?.writable ?? []),
286
- ...(tx?.meta?.loadedAddresses?.readonly ?? []),
287
- ];
288
- const emitted = (tx?.meta?.innerInstructions ?? [])
289
- .flatMap((group) => group.instructions)
290
- .filter((ix) => keys[ix.programIdIndex] === INTENT_ENGINE_PROGRAM_ADDRESS)
291
- .map((ix) => Uint8Array.from(getBase58Encoder().encode(ix.data)));
292
- const memos = (tx?.transaction.message.instructions ?? [])
293
- .filter((ix) => keys[ix.programIdIndex] === MEMO_PROGRAM_ADDRESS)
294
- .map((ix) => new TextDecoder().decode(Uint8Array.from(getBase58Encoder().encode(ix.data))));
295
- return {
296
- signature: entry.signature,
297
- slot: entry.slot,
298
- blockTime: entry.blockTime,
299
- failed: entry.err !== null,
300
- emitted,
301
- ...(memos.length === 0 ? {} : { memos }),
302
- ...(tx?.meta === null || tx?.meta === undefined ? { unread: true } : {}),
303
- complete: tx?.meta !== null && tx?.meta !== undefined && entry.blockTime !== null,
304
- };
305
- };
306
- const found = [];
307
- for (let i = 0; i < signatures.length; i += TRANSACTION_FETCHES) {
308
- found.push(...(await Promise.all(signatures.slice(i, i + TRANSACTION_FETCHES).map(fetchOne))));
309
- }
310
- for (const old of fetched.keys()) {
311
- if (fetched.size <= KEPT_TRANSACTIONS) {
312
- break;
313
- }
314
- fetched.delete(old);
315
- }
316
- return found;
317
- },
318
- async intents(owner) {
319
- const found = await patiently(() => rpc
320
- .getProgramAccounts(INTENT_ENGINE_PROGRAM_ADDRESS, {
321
- encoding: "base64",
322
- filters: [
323
- { dataSize: BigInt(getIntentSize()) },
324
- {
325
- memcmp: {
326
- offset: 0n,
327
- bytes: getBase58Decoder().decode(getIntentDiscriminatorBytes()),
328
- encoding: "base58",
329
- },
330
- },
331
- ...(owner === undefined
332
- ? []
333
- : [{ memcmp: { offset: INTENT_OWNER_OFFSET, bytes: owner, encoding: "base58" } }]),
334
- ],
335
- })
336
- .send(), wait);
337
- return found.map(({ pubkey, account }) => ({
338
- address: pubkey,
339
- data: new Uint8Array(Buffer.from(account.data[0], "base64")),
340
- }));
341
- },
342
- };
343
- }
344
- export function socketUrl(url) {
345
- const parsed = new URL(url);
346
- parsed.protocol = parsed.protocol === "http:" ? "ws:" : "wss:";
347
- if (parsed.port === "8899") {
348
- parsed.port = "8900";
349
- }
350
- return parsed.toString();
351
- }
352
- export function intentNotifications(url) {
353
- const subscriptions = createSolanaRpcSubscriptions(socketUrl(url));
354
- return (abortSignal) => subscriptions
355
- .programNotifications(INTENT_ENGINE_PROGRAM_ADDRESS, {
356
- commitment: "confirmed",
357
- encoding: "base64",
358
- filters: [
359
- { dataSize: BigInt(getIntentSize()) },
360
- { memcmp: { offset: 0n, bytes: getBase58Decoder().decode(getIntentDiscriminatorBytes()), encoding: "base58" } },
361
- ],
362
- })
363
- .subscribe({ abortSignal });
364
- }
365
- export function changedAccount(note) {
366
- const value = note?.value;
367
- const data = value?.account?.data;
368
- if (typeof value?.pubkey !== "string" || !Array.isArray(data) || typeof data[0] !== "string") {
369
- return null;
370
- }
371
- return { address: value.pubkey, data: new Uint8Array(Buffer.from(data[0], "base64")) };
372
- }
373
- export const RECONNECT_MS = [1_000, 2_000, 5_000, 10_000, 30_000];
374
- function pause(ms, signal) {
375
- return new Promise((resolve) => {
376
- const stop = () => {
377
- clearTimeout(timer);
378
- resolve();
379
- };
380
- const timer = setTimeout(() => {
381
- signal.removeEventListener("abort", stop);
382
- resolve();
383
- }, ms);
384
- signal.addEventListener("abort", stop, { once: true });
385
- });
386
- }
387
- export function changesFrom(notifications, reconnect = RECONNECT_MS) {
388
- const controller = new AbortController();
389
- const pending = new Map();
390
- let wake;
391
- const drain = () => {
392
- const changed = [...pending].map(([address, data]) => ({ address, data }));
393
- pending.clear();
394
- return changed;
395
- };
396
- let failures = 0;
397
- const consume = async () => {
398
- const iterator = (await notifications(controller.signal))[Symbol.asyncIterator]();
399
- for (let next = await iterator.next(); next.done !== true; next = await iterator.next()) {
400
- failures = 0;
401
- const changed = changedAccount(next.value);
402
- if (changed !== null) {
403
- pending.set(changed.address, changed.data);
404
- wake?.();
405
- }
406
- }
407
- };
408
- const listen = async () => {
409
- while (!controller.signal.aborted) {
410
- await consume().catch(() => undefined);
411
- if (controller.signal.aborted) {
412
- return;
413
- }
414
- await pause(reconnect[Math.min(failures, reconnect.length - 1)] ?? 0, controller.signal);
415
- failures++;
416
- }
417
- };
418
- void listen();
419
- return {
420
- wait: (seconds) => new Promise((resolve) => {
421
- if (pending.size > 0) {
422
- resolve(drain());
423
- return;
424
- }
425
- const timer = setTimeout(() => {
426
- wake = undefined;
427
- resolve([]);
428
- }, seconds * 1000);
429
- wake = () => {
430
- clearTimeout(timer);
431
- wake = undefined;
432
- resolve(drain());
433
- };
434
- }),
435
- close: () => {
436
- wake?.();
437
- controller.abort();
438
- },
439
- };
440
- }
441
- //# sourceMappingURL=transport.js.map