@txnlab/haystack-router 2.0.5 → 3.0.0
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/README.md +39 -1
- package/dist/{debug-HbNpLAoU.mjs → debug-CU-Ps4nm.mjs} +3 -4
- package/dist/{debug-HbNpLAoU.mjs.map → debug-CU-Ps4nm.mjs.map} +1 -1
- package/dist/index.d.mts +157 -54
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +211 -75
- package/dist/index.mjs.map +1 -1
- package/dist/{logger-DUVOA2Oo.mjs → logger-BelK6H0R.mjs} +17 -26
- package/dist/{logger-DUVOA2Oo.mjs.map → logger-BelK6H0R.mjs.map} +1 -1
- package/package.json +10 -10
package/README.md
CHANGED
|
@@ -26,7 +26,7 @@ TypeScript/JavaScript SDK for [Haystack Order Router](https://txnlab.gitbook.io/
|
|
|
26
26
|
npm install @txnlab/haystack-router algosdk
|
|
27
27
|
```
|
|
28
28
|
|
|
29
|
-
> **Note**: `algosdk` is a peer dependency and must be installed alongside `@txnlab/haystack-router`.
|
|
29
|
+
> **Note**: Requires Node.js 22 or later. `algosdk` is a peer dependency and must be installed alongside `@txnlab/haystack-router`.
|
|
30
30
|
|
|
31
31
|
## Quick Start
|
|
32
32
|
|
|
@@ -149,6 +149,41 @@ console.log('Input transaction ID:', inputTxId)
|
|
|
149
149
|
|
|
150
150
|
The `note` is applied only to the user-signed payment or asset transfer transaction (not pre-signed or middleware transactions). The transaction ID is available after calling `buildGroup()`, `sign()`, or `execute()`.
|
|
151
151
|
|
|
152
|
+
### Launch Tokens (Pre-Bonding)
|
|
153
|
+
|
|
154
|
+
API keys with launch-token access can swap any asset into or out of a HayLaunch token that is still on its bonding curve. Quote it like any other asset, as a `fixed-input` swap, and pass the same `slippage` you will execute with:
|
|
155
|
+
|
|
156
|
+
```typescript
|
|
157
|
+
const quote = await router.newQuote({
|
|
158
|
+
fromASAID: 31566704, // USDC
|
|
159
|
+
toASAID: launchTokenAssetId, // pre-bonding launch token
|
|
160
|
+
amount: 10_000_000,
|
|
161
|
+
slippage: 1, // same value as newSwap() below
|
|
162
|
+
address: activeAddress,
|
|
163
|
+
})
|
|
164
|
+
|
|
165
|
+
if (quote.launch) {
|
|
166
|
+
// quote.quote: launch tokens out (buy) or output asset (sell)
|
|
167
|
+
// quote.launch.bondingSurplus: bonding asset left in the wallet
|
|
168
|
+
// quote.launch.refund: bonding asset refunded when a buy completes bonding
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
const swap = await router.newSwap({
|
|
172
|
+
quote,
|
|
173
|
+
address: activeAddress,
|
|
174
|
+
signer: transactionSigner,
|
|
175
|
+
slippage: 1,
|
|
176
|
+
})
|
|
177
|
+
await swap.execute()
|
|
178
|
+
|
|
179
|
+
const summary = swap.getSummary()
|
|
180
|
+
// summary.outputAmount: launch tokens credited (buy)
|
|
181
|
+
// summary.inputAmount: launch tokens sold (sell)
|
|
182
|
+
// summary.launch: the curve call's ID, bonding amount and refund
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
Without `slippage`, a launch quote overstates the output by about the slippage; `newSwap()` logs a warning when the two don't match. Fixed-output launch buys and launch-token-to-launch-token swaps aren't supported yet and return a 400.
|
|
186
|
+
|
|
152
187
|
### Transaction Signing
|
|
153
188
|
|
|
154
189
|
The SDK supports both standard `algosdk.TransactionSigner` and ARC-1 compliant signer functions.
|
|
@@ -409,6 +444,7 @@ async newQuote(params: FetchQuoteParams): Promise<SwapQuote>
|
|
|
409
444
|
| `maxGroupSize` | Maximum transactions in atomic group | `number` | `16` |
|
|
410
445
|
| `maxDepth` | Maximum swap hops | `number` | `4` |
|
|
411
446
|
| `optIn` | Override auto opt-in behavior | `boolean` | `undefined` |
|
|
447
|
+
| `slippage` | Slippage % you will execute with, in [0, 100); required for accurate launch token quotes | `number` | `undefined` |
|
|
412
448
|
|
|
413
449
|
#### RouterClient.newSwap()
|
|
414
450
|
|
|
@@ -450,6 +486,8 @@ Plain object returned by [`newQuote()`](#routerclientnewquote). Extends the raw
|
|
|
450
486
|
| `quote` | Quoted amount (coerced to `bigint`) | `bigint` |
|
|
451
487
|
| `amount` | Original request amount | `bigint` |
|
|
452
488
|
| `address` | User address (if provided) | `string \| undefined` |
|
|
489
|
+
| `slippage` | Slippage sent with the quote request (if provided) | `number \| undefined` |
|
|
490
|
+
| `launch` | Bonding-curve details for a pre-bonding launch token (amounts as `bigint`) | `SwapLaunchQuote \| undefined` |
|
|
453
491
|
| `createdAt` | Timestamp when quote was created | `number` |
|
|
454
492
|
|
|
455
493
|
**All properties from API response:**
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import { t as Logger } from "./logger-
|
|
2
|
-
|
|
1
|
+
import { t as Logger } from "./logger-BelK6H0R.mjs";
|
|
3
2
|
//#region src/debug.ts
|
|
4
3
|
/**
|
|
5
4
|
* Debug utilities for swap execution failures
|
|
@@ -33,7 +32,7 @@ function logSwapExecutionFailure(context, error) {
|
|
|
33
32
|
}
|
|
34
33
|
});
|
|
35
34
|
}
|
|
36
|
-
|
|
37
35
|
//#endregion
|
|
38
36
|
export { logSwapExecutionFailure };
|
|
39
|
-
|
|
37
|
+
|
|
38
|
+
//# sourceMappingURL=debug-CU-Ps4nm.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"debug-
|
|
1
|
+
{"version":3,"file":"debug-CU-Ps4nm.mjs","names":[],"sources":["../src/debug.ts"],"sourcesContent":["/**\n * Debug utilities for swap execution failures\n * @internal\n */\n\nimport { Logger } from './logger'\nimport type { SwapQuote, FetchQuoteResponse } from './types'\n\n/**\n * Context for swap execution debugging\n */\nexport interface SwapExecutionContext {\n quote: SwapQuote | FetchQuoteResponse\n address: string\n slippage: number\n transactionCount: number\n middlewareCount: number\n groupSize: number\n}\n\n/**\n * Log detailed context when a swap execution fails\n * Only logs when debug level is enabled\n */\nexport function logSwapExecutionFailure(\n context: SwapExecutionContext,\n error: unknown,\n): void {\n Logger.debug('Swap execution failed', {\n error: error instanceof Error ? error.message : String(error),\n quote: {\n fromASAID: context.quote.fromASAID,\n toASAID: context.quote.toASAID,\n type: context.quote.type,\n amount:\n 'amount' in context.quote ? context.quote.amount.toString() : undefined,\n quote: context.quote.quote.toString(),\n requiredAppOptIns: context.quote.requiredAppOptIns,\n route: context.quote.route?.map((r) => ({\n percentage: r.percentage,\n path: r.path.map((p) => p.name).join(' → '),\n })),\n },\n swap: {\n address: context.address,\n slippage: context.slippage,\n transactionCount: context.transactionCount,\n middlewareCount: context.middlewareCount,\n groupSize: context.groupSize,\n },\n })\n}\n"],"mappings":";;;;;;;;;;AAwBA,SAAgB,wBACd,SACA,OACM;CACN,OAAO,MAAM,yBAAyB;EACpC,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;EAC5D,OAAO;GACL,WAAW,QAAQ,MAAM;GACzB,SAAS,QAAQ,MAAM;GACvB,MAAM,QAAQ,MAAM;GACpB,QACE,YAAY,QAAQ,QAAQ,QAAQ,MAAM,OAAO,SAAS,IAAI,KAAA;GAChE,OAAO,QAAQ,MAAM,MAAM,SAAS;GACpC,mBAAmB,QAAQ,MAAM;GACjC,OAAO,QAAQ,MAAM,OAAO,KAAK,OAAO;IACtC,YAAY,EAAE;IACd,MAAM,EAAE,KAAK,KAAK,MAAM,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK;GAC5C,EAAE;EACJ;EACA,MAAM;GACJ,SAAS,QAAQ;GACjB,UAAU,QAAQ;GAClB,kBAAkB,QAAQ;GAC1B,iBAAiB,QAAQ;GACzB,WAAW,QAAQ;EACrB;CACF,CAAC;AACH"}
|
package/dist/index.d.mts
CHANGED
|
@@ -1,51 +1,50 @@
|
|
|
1
1
|
import { ABIArgument, ABIMethod, ABIResult, Address, Algodv2, BoxReference, OnApplicationComplete, ResourceReference, SuggestedParams, Transaction, TransactionSigner, TransactionWithSigner } from "algosdk";
|
|
2
|
-
|
|
3
2
|
//#region src/constants.d.ts
|
|
4
3
|
/**
|
|
5
4
|
* Supported DEX protocols for swap routing
|
|
6
5
|
*/
|
|
7
|
-
declare enum Protocol {
|
|
6
|
+
export declare enum Protocol {
|
|
8
7
|
TinymanV2 = "TinymanV2",
|
|
9
8
|
Algofi = "Algofi",
|
|
10
9
|
Algomint = "Algomint",
|
|
11
10
|
Pact = "Pact",
|
|
12
11
|
Folks = "Folks",
|
|
13
|
-
TAlgo = "TAlgo"
|
|
12
|
+
TAlgo = "TAlgo"
|
|
14
13
|
}
|
|
15
14
|
/**
|
|
16
15
|
* Deprecated protocols that are automatically excluded from routing
|
|
17
16
|
*
|
|
18
17
|
* @internal
|
|
19
18
|
*/
|
|
20
|
-
declare const DEPRECATED_PROTOCOLS: readonly ["Humble", "Tinyman"];
|
|
19
|
+
export declare const DEPRECATED_PROTOCOLS: readonly ["Humble", "Tinyman"];
|
|
21
20
|
/** Default Algod node URI for mainnet */
|
|
22
|
-
declare const DEFAULT_ALGOD_URI = "https://mainnet-api.4160.nodely.dev/";
|
|
21
|
+
export declare const DEFAULT_ALGOD_URI = "https://mainnet-api.4160.nodely.dev/";
|
|
23
22
|
/** Default Algod node token (empty for public nodes) */
|
|
24
|
-
declare const DEFAULT_ALGOD_TOKEN = "";
|
|
23
|
+
export declare const DEFAULT_ALGOD_TOKEN = "";
|
|
25
24
|
/** Default Algod node port */
|
|
26
|
-
declare const DEFAULT_ALGOD_PORT = 443;
|
|
25
|
+
export declare const DEFAULT_ALGOD_PORT = 443;
|
|
27
26
|
/** Default Haystack Router API base URL */
|
|
28
|
-
declare const DEFAULT_API_BASE_URL = "https://hayrouter.txnlab.dev/api";
|
|
27
|
+
export declare const DEFAULT_API_BASE_URL = "https://hayrouter.txnlab.dev/api";
|
|
29
28
|
/** Default fee in basis points (0.10%) */
|
|
30
|
-
declare const DEFAULT_FEE_BPS = 10;
|
|
29
|
+
export declare const DEFAULT_FEE_BPS = 10;
|
|
31
30
|
/** Maximum allowed fee in basis points (3.00%) */
|
|
32
|
-
declare const MAX_FEE_BPS = 300;
|
|
31
|
+
export declare const MAX_FEE_BPS = 300;
|
|
33
32
|
/** Default maximum transaction group size */
|
|
34
|
-
declare const DEFAULT_MAX_GROUP_SIZE = 16;
|
|
33
|
+
export declare const DEFAULT_MAX_GROUP_SIZE = 16;
|
|
35
34
|
/** Default maximum routing depth (number of hops) */
|
|
36
|
-
declare const DEFAULT_MAX_DEPTH = 4;
|
|
35
|
+
export declare const DEFAULT_MAX_DEPTH = 4;
|
|
37
36
|
/** Default auto opt-in setting (automatic asset/app opt-in detection) */
|
|
38
|
-
declare const DEFAULT_AUTO_OPT_IN = false;
|
|
37
|
+
export declare const DEFAULT_AUTO_OPT_IN = false;
|
|
39
38
|
/** Default debug level (no debug logging) */
|
|
40
|
-
declare const DEFAULT_DEBUG_LEVEL: "none";
|
|
39
|
+
export declare const DEFAULT_DEBUG_LEVEL: "none";
|
|
41
40
|
/** Default number of rounds to wait for transaction confirmation */
|
|
42
|
-
declare const DEFAULT_CONFIRMATION_ROUNDS = 10;
|
|
41
|
+
export declare const DEFAULT_CONFIRMATION_ROUNDS = 10;
|
|
43
42
|
//#endregion
|
|
44
43
|
//#region src/types.d.ts
|
|
45
44
|
/**
|
|
46
45
|
* Configuration parameters for initializing RouterClient
|
|
47
46
|
*/
|
|
48
|
-
interface ConfigParams {
|
|
47
|
+
export interface ConfigParams {
|
|
49
48
|
/** API key for Haystack Router API (required) */
|
|
50
49
|
readonly apiKey: string;
|
|
51
50
|
/** Base URL for the Haystack Router API (default: https://hayrouter.txnlab.dev) */
|
|
@@ -77,18 +76,18 @@ interface ConfigParams {
|
|
|
77
76
|
*
|
|
78
77
|
* @internal
|
|
79
78
|
*/
|
|
80
|
-
type Config = Omit<Required<ConfigParams>, 'referrerAddress' | 'debugLevel'> & {
|
|
79
|
+
export type Config = Omit<Required<ConfigParams>, 'referrerAddress' | 'debugLevel'> & {
|
|
81
80
|
readonly referrerAddress: string | undefined;
|
|
82
81
|
readonly debugLevel: 'none' | 'info' | 'debug' | 'trace';
|
|
83
82
|
};
|
|
84
83
|
/**
|
|
85
84
|
* Swap quote type determining which amount is fixed
|
|
86
85
|
*/
|
|
87
|
-
type QuoteType = 'fixed-input' | 'fixed-output';
|
|
86
|
+
export type QuoteType = 'fixed-input' | 'fixed-output';
|
|
88
87
|
/**
|
|
89
88
|
* Parameters for requesting a swap quote from the Haystack Router API (raw API method)
|
|
90
89
|
*/
|
|
91
|
-
interface FetchQuoteParams {
|
|
90
|
+
export interface FetchQuoteParams {
|
|
92
91
|
/** Input asset ID */
|
|
93
92
|
readonly fromASAID: bigint | number;
|
|
94
93
|
/** Output asset ID */
|
|
@@ -107,6 +106,15 @@ interface FetchQuoteParams {
|
|
|
107
106
|
readonly optIn?: boolean;
|
|
108
107
|
/** Address of the account that will perform the swap (required if autoOptIn is enabled) */
|
|
109
108
|
readonly address?: string | null;
|
|
109
|
+
/**
|
|
110
|
+
* Slippage tolerance as a percentage (e.g., 1 for 1%), in [0, 100)
|
|
111
|
+
*
|
|
112
|
+
* Pass the same value you will pass to `newSwap()`. Quotes for pre-bonding
|
|
113
|
+
* HayLaunch tokens use it to price the bonding curve on the amount the route
|
|
114
|
+
* actually pays it; without it, those quotes overstate the output by about
|
|
115
|
+
* the slippage. Other quotes ignore it.
|
|
116
|
+
*/
|
|
117
|
+
readonly slippage?: number;
|
|
110
118
|
/**
|
|
111
119
|
* ⚠️ **ADVANCED USE ONLY - NON-COMPOSABLE SWAPS** ⚠️
|
|
112
120
|
*
|
|
@@ -138,7 +146,7 @@ interface FetchQuoteParams {
|
|
|
138
146
|
/**
|
|
139
147
|
* Asset information from the Haystack Router API
|
|
140
148
|
*/
|
|
141
|
-
interface Asset {
|
|
149
|
+
export interface Asset {
|
|
142
150
|
/** Asset ID */
|
|
143
151
|
readonly id: number;
|
|
144
152
|
/** Number of decimal places */
|
|
@@ -155,7 +163,7 @@ interface Asset {
|
|
|
155
163
|
/**
|
|
156
164
|
* Profit information for a swap
|
|
157
165
|
*/
|
|
158
|
-
interface Profit {
|
|
166
|
+
export interface Profit {
|
|
159
167
|
/** Profit amount in base units */
|
|
160
168
|
readonly amount: number;
|
|
161
169
|
/** The asset in which profit is denominated */
|
|
@@ -164,7 +172,7 @@ interface Profit {
|
|
|
164
172
|
/**
|
|
165
173
|
* A single step in a swap route path
|
|
166
174
|
*/
|
|
167
|
-
interface PathElement {
|
|
175
|
+
export interface PathElement {
|
|
168
176
|
/** Protocol name and fee tier */
|
|
169
177
|
readonly name: string;
|
|
170
178
|
/** Protocol class identifier */
|
|
@@ -177,7 +185,7 @@ interface PathElement {
|
|
|
177
185
|
/**
|
|
178
186
|
* A route with its percentage of the total swap amount
|
|
179
187
|
*/
|
|
180
|
-
interface Route {
|
|
188
|
+
export interface Route {
|
|
181
189
|
/** Percentage of total swap amount routed through this path */
|
|
182
190
|
readonly percentage: number;
|
|
183
191
|
/** The sequence of swaps in this route */
|
|
@@ -186,7 +194,7 @@ interface Route {
|
|
|
186
194
|
/**
|
|
187
195
|
* Quote from a specific DEX protocol
|
|
188
196
|
*/
|
|
189
|
-
interface DexQuote {
|
|
197
|
+
export interface DexQuote {
|
|
190
198
|
/** Protocol name and fee tier */
|
|
191
199
|
readonly name: string;
|
|
192
200
|
/** Protocol class */
|
|
@@ -197,16 +205,46 @@ interface DexQuote {
|
|
|
197
205
|
/**
|
|
198
206
|
* Encrypted transaction payload from the quote
|
|
199
207
|
*/
|
|
200
|
-
interface TxnPayload {
|
|
208
|
+
export interface TxnPayload {
|
|
201
209
|
/** Initialization vector for decryption */
|
|
202
210
|
readonly iv: string;
|
|
203
211
|
/** Encrypted transaction data */
|
|
204
212
|
readonly data: string;
|
|
205
213
|
}
|
|
214
|
+
/**
|
|
215
|
+
* Bonding-curve details for a quote that buys or sells a pre-bonding HayLaunch token
|
|
216
|
+
*
|
|
217
|
+
* Amounts are in base units of the bonding asset.
|
|
218
|
+
*/
|
|
219
|
+
export interface LaunchQuote {
|
|
220
|
+
/** `'buy'` when the launch token is the output, `'sell'` when it is the input */
|
|
221
|
+
readonly side: 'buy' | 'sell';
|
|
222
|
+
/** HayLaunch token number */
|
|
223
|
+
readonly tokenNum: number;
|
|
224
|
+
/** Asset the token is bonded in (0 for ALGO) */
|
|
225
|
+
readonly bondingTokenId: number;
|
|
226
|
+
/** Bonding asset expected to be left in the wallet after the trade */
|
|
227
|
+
readonly bondingSurplus: number;
|
|
228
|
+
/** Bonding asset refunded when a buy completes bonding (omitted otherwise) */
|
|
229
|
+
readonly refund?: number;
|
|
230
|
+
/** Whether a buy completes bonding (omitted otherwise) */
|
|
231
|
+
readonly graduates?: boolean;
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Normalized bonding-curve details on a SwapQuote, with amounts coerced to bigint
|
|
235
|
+
*/
|
|
236
|
+
export type SwapLaunchQuote = Omit<LaunchQuote, 'bondingSurplus' | 'refund' | 'graduates'> & {
|
|
237
|
+
/** Bonding asset expected to be left in the wallet after the trade */
|
|
238
|
+
readonly bondingSurplus: bigint;
|
|
239
|
+
/** Bonding asset refunded when a buy completes bonding (0n otherwise) */
|
|
240
|
+
readonly refund: bigint;
|
|
241
|
+
/** Whether a buy completes bonding */
|
|
242
|
+
readonly graduates: boolean;
|
|
243
|
+
};
|
|
206
244
|
/**
|
|
207
245
|
* Quote response from the Haystack Router API
|
|
208
246
|
*/
|
|
209
|
-
interface FetchQuoteResponse {
|
|
247
|
+
export interface FetchQuoteResponse {
|
|
210
248
|
/** The quoted output amount or input amount (depending on quote type) */
|
|
211
249
|
readonly quote: string | number;
|
|
212
250
|
/** Profit information for the swap */
|
|
@@ -241,13 +279,18 @@ interface FetchQuoteResponse {
|
|
|
241
279
|
readonly type: string;
|
|
242
280
|
/** Performance timing data */
|
|
243
281
|
readonly timing?: unknown;
|
|
282
|
+
/**
|
|
283
|
+
* Bonding-curve details, present only when one side is a pre-bonding HayLaunch token.
|
|
284
|
+
* For a buy, `quote` is launch tokens out; for a sell, it is the output asset.
|
|
285
|
+
*/
|
|
286
|
+
readonly launch?: LaunchQuote;
|
|
244
287
|
}
|
|
245
288
|
/**
|
|
246
289
|
* Enhanced quote result returned by RouterClient.newQuote()
|
|
247
290
|
*
|
|
248
291
|
* Extends the raw API response with additional metadata and type normalization.
|
|
249
292
|
*/
|
|
250
|
-
type SwapQuote = Omit<FetchQuoteResponse, 'quote'> & {
|
|
293
|
+
export type SwapQuote = Omit<FetchQuoteResponse, 'quote' | 'launch'> & {
|
|
251
294
|
/**
|
|
252
295
|
* The quoted output amount or input amount (coerced to bigint)
|
|
253
296
|
*
|
|
@@ -259,13 +302,17 @@ type SwapQuote = Omit<FetchQuoteResponse, 'quote'> & {
|
|
|
259
302
|
readonly amount: bigint;
|
|
260
303
|
/** The address parameter from the quote request (if provided) */
|
|
261
304
|
readonly address?: string;
|
|
305
|
+
/** The slippage sent with the quote request (if provided) */
|
|
306
|
+
readonly slippage?: number;
|
|
307
|
+
/** Bonding-curve details, present only when one side is a pre-bonding HayLaunch token */
|
|
308
|
+
readonly launch?: SwapLaunchQuote;
|
|
262
309
|
/** Timestamp when the quote was created (in milliseconds) */
|
|
263
310
|
readonly createdAt: number;
|
|
264
311
|
};
|
|
265
312
|
/**
|
|
266
313
|
* Transaction signature from the Haystack Router API
|
|
267
314
|
*/
|
|
268
|
-
interface Signature {
|
|
315
|
+
export interface Signature {
|
|
269
316
|
/** Signature type */
|
|
270
317
|
readonly type: 'logic_signature' | 'secret_key';
|
|
271
318
|
/** Signature data */
|
|
@@ -274,7 +321,7 @@ interface Signature {
|
|
|
274
321
|
/**
|
|
275
322
|
* Transaction data from the Haystack Router API
|
|
276
323
|
*/
|
|
277
|
-
interface SwapTransaction {
|
|
324
|
+
export interface SwapTransaction {
|
|
278
325
|
/** Base64-encoded transaction data */
|
|
279
326
|
readonly data: string;
|
|
280
327
|
/** Group ID for the transaction */
|
|
@@ -287,7 +334,7 @@ interface SwapTransaction {
|
|
|
287
334
|
/**
|
|
288
335
|
* Parameters for fetching executable swap transactions
|
|
289
336
|
*/
|
|
290
|
-
interface FetchSwapTxnsParams {
|
|
337
|
+
export interface FetchSwapTxnsParams {
|
|
291
338
|
/** Quote response from fetchQuote() or newQuote() */
|
|
292
339
|
readonly quote: FetchQuoteResponse | SwapQuote;
|
|
293
340
|
/** Algorand address that will sign the transactions */
|
|
@@ -300,7 +347,7 @@ interface FetchSwapTxnsParams {
|
|
|
300
347
|
*
|
|
301
348
|
* @internal
|
|
302
349
|
*/
|
|
303
|
-
interface FetchSwapTxnsBody {
|
|
350
|
+
export interface FetchSwapTxnsBody {
|
|
304
351
|
/** API key for authentication */
|
|
305
352
|
readonly apiKey: string;
|
|
306
353
|
/** Address of the account that will sign the transactions */
|
|
@@ -313,24 +360,49 @@ interface FetchSwapTxnsBody {
|
|
|
313
360
|
/**
|
|
314
361
|
* Response from fetching swap transactions
|
|
315
362
|
*/
|
|
316
|
-
interface FetchSwapTxnsResponse {
|
|
363
|
+
export interface FetchSwapTxnsResponse {
|
|
317
364
|
/** Array of transaction data */
|
|
318
365
|
readonly txns: SwapTransaction[];
|
|
319
366
|
}
|
|
367
|
+
/**
|
|
368
|
+
* Bonding-curve leg of an executed pre-bonding HayLaunch swap
|
|
369
|
+
*/
|
|
370
|
+
export interface LaunchSummary {
|
|
371
|
+
/** `'buy'` when the launch token was the output, `'sell'` when it was the input */
|
|
372
|
+
side: 'buy' | 'sell';
|
|
373
|
+
/** HayLaunch token number */
|
|
374
|
+
tokenNum: bigint;
|
|
375
|
+
/** Transaction ID of the curve buy or sell call */
|
|
376
|
+
curveTxnId: string;
|
|
377
|
+
/**
|
|
378
|
+
* Bonding asset that went through the curve, in base units: the payment into
|
|
379
|
+
* the curve on a buy, or the curve's payout on a sell. Undefined if it
|
|
380
|
+
* couldn't be determined.
|
|
381
|
+
*/
|
|
382
|
+
bondingAmount?: bigint;
|
|
383
|
+
/** Bonding asset refunded by a buy that completed bonding (0n otherwise) */
|
|
384
|
+
refund: bigint;
|
|
385
|
+
}
|
|
320
386
|
/**
|
|
321
387
|
* Summary of a swap transaction group after execution
|
|
322
388
|
*
|
|
323
389
|
* Contains the exact input/output amounts and total transaction fees.
|
|
324
390
|
* Only available after calling execute() on a SwapComposer instance.
|
|
325
391
|
*/
|
|
326
|
-
interface SwapSummary {
|
|
392
|
+
export interface SwapSummary {
|
|
327
393
|
/** Input asset ID (0 for ALGO) */
|
|
328
394
|
inputAssetId: bigint;
|
|
329
395
|
/** Output asset ID (0 for ALGO) */
|
|
330
396
|
outputAssetId: bigint;
|
|
331
|
-
/**
|
|
397
|
+
/**
|
|
398
|
+
* Exact input amount in base units, from the user-signed transaction.
|
|
399
|
+
* For a launch sell, the launch tokens sold.
|
|
400
|
+
*/
|
|
332
401
|
inputAmount: bigint;
|
|
333
|
-
/**
|
|
402
|
+
/**
|
|
403
|
+
* Exact output amount received in base units, from the inner transaction.
|
|
404
|
+
* For a launch buy, the launch tokens credited by the curve.
|
|
405
|
+
*/
|
|
334
406
|
outputAmount: bigint;
|
|
335
407
|
/** Quote type */
|
|
336
408
|
type: QuoteType;
|
|
@@ -338,19 +410,27 @@ interface SwapSummary {
|
|
|
338
410
|
totalFees: bigint;
|
|
339
411
|
/** Number of transactions in the group */
|
|
340
412
|
transactionCount: number;
|
|
341
|
-
/**
|
|
413
|
+
/**
|
|
414
|
+
* Transaction ID of the user-signed input transaction (payment/asset transfer).
|
|
415
|
+
* For a launch sell, the curve sell call.
|
|
416
|
+
*/
|
|
342
417
|
inputTxnId: string;
|
|
343
|
-
/**
|
|
418
|
+
/**
|
|
419
|
+
* Transaction ID of the app call containing the output transfer as an inner transaction.
|
|
420
|
+
* For a launch buy, the curve buy call.
|
|
421
|
+
*/
|
|
344
422
|
outputTxnId: string;
|
|
345
423
|
/** Address that sent the input asset (the user) */
|
|
346
424
|
inputSender: string;
|
|
347
|
-
/** Address that sent the output asset to the user */
|
|
425
|
+
/** Address that sent the output asset to the user (the HayLaunch app on a launch buy) */
|
|
348
426
|
outputSender: string;
|
|
427
|
+
/** Bonding-curve details, present only for a pre-bonding HayLaunch swap */
|
|
428
|
+
launch?: LaunchSummary;
|
|
349
429
|
}
|
|
350
430
|
/**
|
|
351
431
|
* Method call to be executed as part of the swap
|
|
352
432
|
*/
|
|
353
|
-
interface MethodCall {
|
|
433
|
+
export interface MethodCall {
|
|
354
434
|
/** The ID of the smart contract to call. Set this to 0 to indicate an application creation call. */
|
|
355
435
|
appID: number | bigint;
|
|
356
436
|
/** The method to call on the smart contract */
|
|
@@ -403,7 +483,7 @@ interface MethodCall {
|
|
|
403
483
|
/**
|
|
404
484
|
* Context provided to middleware shouldApply hook
|
|
405
485
|
*/
|
|
406
|
-
interface QuoteContext {
|
|
486
|
+
export interface QuoteContext {
|
|
407
487
|
/** Input asset ID (always bigint for precision and future-proofing) */
|
|
408
488
|
readonly fromASAID: bigint;
|
|
409
489
|
/** Output asset ID (always bigint for precision and future-proofing) */
|
|
@@ -420,7 +500,7 @@ interface QuoteContext {
|
|
|
420
500
|
/**
|
|
421
501
|
* Context provided to middleware hooks during swap composition
|
|
422
502
|
*/
|
|
423
|
-
interface SwapContext {
|
|
503
|
+
export interface SwapContext {
|
|
424
504
|
/** The quote result from newQuote() */
|
|
425
505
|
readonly quote: SwapQuote;
|
|
426
506
|
/** The address of the account performing the swap */
|
|
@@ -470,7 +550,7 @@ interface SwapContext {
|
|
|
470
550
|
* }
|
|
471
551
|
* ```
|
|
472
552
|
*/
|
|
473
|
-
interface SwapMiddleware {
|
|
553
|
+
export interface SwapMiddleware {
|
|
474
554
|
/** Unique identifier for the middleware */
|
|
475
555
|
readonly name: string;
|
|
476
556
|
/** Semantic version of the middleware */
|
|
@@ -619,7 +699,7 @@ interface SwapMiddleware {
|
|
|
619
699
|
/**
|
|
620
700
|
* Configuration options for AutoOptOutMiddleware
|
|
621
701
|
*/
|
|
622
|
-
interface AutoOptOutConfig {
|
|
702
|
+
export interface AutoOptOutConfig {
|
|
623
703
|
/**
|
|
624
704
|
* Array of asset IDs that should be excluded from automatic opt-out behavior
|
|
625
705
|
* @default []
|
|
@@ -653,7 +733,7 @@ interface AutoOptOutConfig {
|
|
|
653
733
|
* })
|
|
654
734
|
* ```
|
|
655
735
|
*/
|
|
656
|
-
declare class AutoOptOutMiddleware implements SwapMiddleware {
|
|
736
|
+
export declare class AutoOptOutMiddleware implements SwapMiddleware {
|
|
657
737
|
readonly name = "AutoOptOut";
|
|
658
738
|
readonly version = "1.0.0";
|
|
659
739
|
private readonly excludedAssets;
|
|
@@ -672,11 +752,11 @@ declare class AutoOptOutMiddleware implements SwapMiddleware {
|
|
|
672
752
|
* @param indexesToSign - Array of indexes indicating which transactions need signing
|
|
673
753
|
* @returns Array of signed transactions (may include nulls for ARC-1 compliant wallets)
|
|
674
754
|
*/
|
|
675
|
-
type SignerFunction = (txnGroup: Transaction[], indexesToSign: number[]) => Promise<(Uint8Array | null)[]>;
|
|
755
|
+
export type SignerFunction = (txnGroup: Transaction[], indexesToSign: number[]) => Promise<(Uint8Array | null)[]>;
|
|
676
756
|
/**
|
|
677
757
|
* Status of the SwapComposer transaction group lifecycle
|
|
678
758
|
*/
|
|
679
|
-
declare enum SwapComposerStatus {
|
|
759
|
+
export declare enum SwapComposerStatus {
|
|
680
760
|
/** The atomic group is still under construction. */
|
|
681
761
|
BUILDING = 0,
|
|
682
762
|
/** The atomic group has been finalized, but not yet signed. */
|
|
@@ -686,12 +766,12 @@ declare enum SwapComposerStatus {
|
|
|
686
766
|
/** The atomic group has been finalized, signed, and submitted to the network. */
|
|
687
767
|
SUBMITTED = 3,
|
|
688
768
|
/** The atomic group has been finalized, signed, submitted, and successfully committed to a block. */
|
|
689
|
-
COMMITTED = 4
|
|
769
|
+
COMMITTED = 4
|
|
690
770
|
}
|
|
691
771
|
/**
|
|
692
772
|
* Configuration for creating a SwapComposer instance
|
|
693
773
|
*/
|
|
694
|
-
interface SwapComposerConfig {
|
|
774
|
+
export interface SwapComposerConfig {
|
|
695
775
|
/** The quote response from fetchQuote() or newQuote() */
|
|
696
776
|
readonly quote: FetchQuoteResponse | SwapQuote;
|
|
697
777
|
/** The swap transactions from fetchSwapTransactions() */
|
|
@@ -727,7 +807,7 @@ interface SwapComposerConfig {
|
|
|
727
807
|
* .execute()
|
|
728
808
|
* ```
|
|
729
809
|
*/
|
|
730
|
-
declare class SwapComposer {
|
|
810
|
+
export declare class SwapComposer {
|
|
731
811
|
/** The ATC used to compose the group */
|
|
732
812
|
private atc;
|
|
733
813
|
/** The maximum size of an atomic transaction group. */
|
|
@@ -744,6 +824,7 @@ declare class SwapComposer {
|
|
|
744
824
|
private readonly note?;
|
|
745
825
|
private inputTransactionIndex?;
|
|
746
826
|
private outputTransactionIndex?;
|
|
827
|
+
private curveTransactionIndex?;
|
|
747
828
|
/** Summary data built incrementally during swap composition */
|
|
748
829
|
private summaryData?;
|
|
749
830
|
/**
|
|
@@ -961,6 +1042,21 @@ declare class SwapComposer {
|
|
|
961
1042
|
* Also initializes summaryData with input transaction details and output transaction ID
|
|
962
1043
|
*/
|
|
963
1044
|
private processSwapTransactions;
|
|
1045
|
+
/**
|
|
1046
|
+
* Finds the swap's input transaction: the user's payment or asset transfer
|
|
1047
|
+
* to the router app, whose address comes from the router's pre-signed app
|
|
1048
|
+
* calls. Falls back to the last user-signed transaction for groups without
|
|
1049
|
+
* a router app call.
|
|
1050
|
+
*/
|
|
1051
|
+
private findInputTransactionIndex;
|
|
1052
|
+
/**
|
|
1053
|
+
* For a launch quote, finds the user-signed curve buy or sell call and
|
|
1054
|
+
* records the curve leg in summaryData. On a sell, the input amount becomes
|
|
1055
|
+
* the launch tokens sold.
|
|
1056
|
+
*
|
|
1057
|
+
* @returns The curve call's index within the swap transactions, if found
|
|
1058
|
+
*/
|
|
1059
|
+
private initLaunchSummary;
|
|
964
1060
|
/**
|
|
965
1061
|
* Creates opt-in transactions for apps the user hasn't opted into yet
|
|
966
1062
|
*/
|
|
@@ -985,7 +1081,9 @@ declare class SwapComposer {
|
|
|
985
1081
|
* Extract the actual output amount from the confirmed output transaction's inner transactions
|
|
986
1082
|
*
|
|
987
1083
|
* Analyzes only the output transaction (last app call in the swap) to find the
|
|
988
|
-
* inner transaction that transfers the output asset to the user.
|
|
1084
|
+
* inner transaction that transfers the output asset to the user. On a launch
|
|
1085
|
+
* buy the output is a balance on the HayLaunch app, so it is read from the
|
|
1086
|
+
* curve buy call's return value instead.
|
|
989
1087
|
*/
|
|
990
1088
|
private extractActualOutputAmount;
|
|
991
1089
|
}
|
|
@@ -1019,7 +1117,7 @@ declare class SwapComposer {
|
|
|
1019
1117
|
* })
|
|
1020
1118
|
* ```
|
|
1021
1119
|
*/
|
|
1022
|
-
declare class RouterClient {
|
|
1120
|
+
export declare class RouterClient {
|
|
1023
1121
|
private readonly config;
|
|
1024
1122
|
private readonly algodClient;
|
|
1025
1123
|
private readonly middleware;
|
|
@@ -1060,6 +1158,7 @@ declare class RouterClient {
|
|
|
1060
1158
|
* - If true: API reduces maxGroupSize by 1 and includes opt-in (always included, even if not needed)
|
|
1061
1159
|
* - If false: No opt-in transaction included
|
|
1062
1160
|
* - If undefined: Falls back to `config.autoOptIn` behavior with account check (if `params.address` is provided)
|
|
1161
|
+
* @param params.slippage - Slippage tolerance as a percentage, in [0, 100). Pass the value you will execute with; required for accurate pre-bonding launch token quotes
|
|
1063
1162
|
* @returns A FetchQuoteResponse object with routing information
|
|
1064
1163
|
*
|
|
1065
1164
|
* @example
|
|
@@ -1130,6 +1229,7 @@ declare class RouterClient {
|
|
|
1130
1229
|
* @param params.maxDepth - The maximum depth (default: 4)
|
|
1131
1230
|
* @param params.address - The address of the account that will perform the swap (recommended when using `config.autoOptIn` or `params.optIn`)
|
|
1132
1231
|
* @param params.optIn - Whether to include asset opt-in transaction
|
|
1232
|
+
* @param params.slippage - Slippage tolerance as a percentage, in [0, 100). Pass the value you will execute with; required for accurate pre-bonding launch token quotes
|
|
1133
1233
|
* @returns A SwapQuote enhanced quote result
|
|
1134
1234
|
*
|
|
1135
1235
|
* @example
|
|
@@ -1213,6 +1313,10 @@ declare class RouterClient {
|
|
|
1213
1313
|
* Validates an Algorand address
|
|
1214
1314
|
*/
|
|
1215
1315
|
private validateAddress;
|
|
1316
|
+
/**
|
|
1317
|
+
* Validates a slippage percentage (0 <= slippage < 100)
|
|
1318
|
+
*/
|
|
1319
|
+
private validateSlippage;
|
|
1216
1320
|
/**
|
|
1217
1321
|
* Validates the fee in basis points (max 300 = 3.00%)
|
|
1218
1322
|
*/
|
|
@@ -1223,7 +1327,7 @@ declare class RouterClient {
|
|
|
1223
1327
|
/**
|
|
1224
1328
|
* HTTP error with status code and response data
|
|
1225
1329
|
*/
|
|
1226
|
-
declare class HTTPError extends Error {
|
|
1330
|
+
export declare class HTTPError extends Error {
|
|
1227
1331
|
status: number;
|
|
1228
1332
|
statusText: string;
|
|
1229
1333
|
data: unknown;
|
|
@@ -1240,7 +1344,6 @@ declare class HTTPError extends Error {
|
|
|
1240
1344
|
* @returns Parsed JSON response
|
|
1241
1345
|
* @throws HTTPError if the response status is not ok
|
|
1242
1346
|
*/
|
|
1243
|
-
declare function request<T>(url: string, options?: RequestInit): Promise<T>;
|
|
1347
|
+
export declare function request<T>(url: string, options?: RequestInit): Promise<T>;
|
|
1244
1348
|
//#endregion
|
|
1245
|
-
export { Asset, AutoOptOutConfig, AutoOptOutMiddleware, Config, ConfigParams, DEFAULT_ALGOD_PORT, DEFAULT_ALGOD_TOKEN, DEFAULT_ALGOD_URI, DEFAULT_API_BASE_URL, DEFAULT_AUTO_OPT_IN, DEFAULT_CONFIRMATION_ROUNDS, DEFAULT_DEBUG_LEVEL, DEFAULT_FEE_BPS, DEFAULT_MAX_DEPTH, DEFAULT_MAX_GROUP_SIZE, DEPRECATED_PROTOCOLS, DexQuote, FetchQuoteParams, FetchQuoteResponse, FetchSwapTxnsBody, FetchSwapTxnsParams, FetchSwapTxnsResponse, HTTPError, MAX_FEE_BPS, MethodCall, PathElement, Profit, Protocol, QuoteContext, QuoteType, Route, RouterClient, Signature, SignerFunction, SwapComposer, SwapComposerConfig, SwapComposerStatus, SwapContext, SwapMiddleware, SwapQuote, SwapSummary, SwapTransaction, TxnPayload, request };
|
|
1246
1349
|
//# sourceMappingURL=index.d.mts.map
|
package/dist/index.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/constants.ts","../src/types.ts","../src/middleware.ts","../src/composer.ts","../src/client.ts","../src/utils.ts"],"
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/constants.ts","../src/types.ts","../src/middleware.ts","../src/composer.ts","../src/client.ts","../src/utils.ts"],"mappings":"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"}
|