@paraspell/sdk 12.9.7 → 12.10.0-rc.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 CHANGED
@@ -47,7 +47,7 @@ npm install | pnpm add | yarn add @paraspell/sdk
47
47
 
48
48
  ### Install Swap extension
49
49
 
50
- If you plan to [do Swap XCMs](https://paraspell.github.io/docs/sdk/xcmPallet.html#swap) you can install Swap package which allows you to do cross-chain swaps on popular Polkadot, Kusama, Paseo, Westend exchanges. Only available in PAPI version of SDK.
50
+ If you plan to [do Swap XCMs](https://paraspell.github.io/docs/sdk/xcmPallet.html#swap) you can install Swap package which allows you to do cross-chain swaps on popular Polkadot, Kusama, Paseo, Westend exchanges. Now available in all JS client versions of SDK.
51
51
 
52
52
  > [!IMPORTANT]
53
53
  > - ⚠️ **WebAssembly (Wasm) must be enabled in your project** because of the Hydration SDK (One of the exchanges implemented in XCM Router). Wasm can be enabled either through the web application configuration or through the appropriate plugin.
@@ -87,11 +87,14 @@ import * as paraspell from '@paraspell/sdk'
87
87
  ## Implementation
88
88
 
89
89
  > [!NOTE]
90
+ > - You can now pass signer directly into sender parameter
90
91
  > - The local transfers now have additional builder parameter called keepAlive
91
92
  > - Transact is here! Find out more: https://paraspell.github.io/docs/sdk/xcmPallet.html#transact
92
93
  >
93
94
  > **Latest news:**
94
- > - Swap is here! Find out more: https://paraspell.github.io/docs/sdk/getting-started.html#install-swap-extension
95
+ > - V12 > V13 Migration guide: https://paraspell.github.io/docs/migration/v12-to-v13.html
96
+ > - Swap package is now available on every XCM SDK version: https://paraspell.github.io/docs/sdk/getting-started.html#install-swap-extension
97
+ > - abstractDecimals is now turned on by default!
95
98
 
96
99
  ### Sending XCM
97
100
  For full documentation on XCM Transfers head over to [official documentation](https://paraspell.github.io/docs/sdk/xcmPallet.html).
@@ -103,15 +106,15 @@ const builder = Builder(/*chain api/builder_config/ws_url_string/ws_url_array -
103
106
  .from(TSubstrateChain)
104
107
  .to(TChain /*,customParaId - optional*/ | Location object /*Only works for PolkadotXCM pallet*/)
105
108
  .currency({id: currencyID, amount: amount} | {symbol: currencySymbol, amount: amount /*Use "ALL" to transfer everything*/} | {symbol: Native('currencySymbol'), amount: amount /*Use "ALL" to transfer everything*/} | {symbol: Foreign('currencySymbol'), amount: amount /*Use "ALL" to transfer everything*/} | {symbol: ForeignAbstract('currencySymbol'), amount: amount /*Use "ALL" to transfer everything*/} | {location: AssetLocationString, amount: amount /*Use "ALL" to transfer everything*/ | AssetLocationJson, amount: amount /*Use "ALL" to transfer everything*/} | {location: Override('Custom Location'), amount: amount /*Use "ALL" to transfer everything*/} | [{currencySelection /*for example symbol: symbol or id: id, or location: location*/, amount: amount /*Use "ALL" to transfer everything*/}, {currencySelection}, ..])
106
- .address(address | Location object /*If you are sending through xTokens, you need to pass the destination and address Location in one object (x2)*/)
107
- .senderAddress(address | PAPI_SIGNER) // - OPTIONAL but strongly recommended as it is automatically ignored when not needed - Used when origin is AssetHub with feeAsset or when sending to AssetHub to prevent asset traps by auto-swapping to DOT to have DOT ED.
109
+ .recipient(address | Location object /*If you are sending through xTokens, you need to pass the destination and address Location in one object (x2)*/)
110
+ .sender(address | PAPI_SIGNER) // - OPTIONAL but strongly recommended as it is automatically ignored when not needed - Used when origin is AssetHub with feeAsset or when sending to AssetHub to prevent asset traps by auto-swapping to DOT to have DOT ED.
108
111
  /*.ahAddress(ahAddress) - OPTIONAL - used when origin is EVM chain and XCM goes through AssetHub (Multihop transfer where we are unable to convert Key20 to ID32 address eg. origin: Moonbeam & destination: Ethereum (Multihop goes from Moonbeam > AssetHub > BridgeHub > Ethereum)
109
112
  .feeAsset({symbol: 'symbol'} || {id: 'id'} || {location: 'location'}) // Optional parameter used when multiasset is provided or when origin is AssetHub - so user can pay in fees different than DOT
110
113
  .xcmVersion(Version.V3/V4/V5) //Optional parameter for manual override of XCM Version used in call
111
114
  .customPallet('Pallet','pallet_function') //Optional parameter for manual override of XCM Pallet and function used in call (If they are named differently on some chain but syntax stays the same). Both pallet name and function required. Pallet name must be CamelCase, function name snake_case.*/
112
115
 
113
116
  const tx = await builder.build()
114
- // Or if you use signers in senderAddress:
117
+ // Or if you use signers in sender:
115
118
  // await builder.signAndSubmit() - Signs and submits the transaction; returns TX hash for tracking
116
119
 
117
120
  //Make sure to disconnect the API after it is no longer used (eg, after a transaction)
@@ -124,9 +127,9 @@ const builder = Builder()
124
127
  .to('Polkadot')
125
128
  .currency({
126
129
  symbol: 'DOT',
127
- amount: '1000000000'
130
+ amount: '1'
128
131
  })
129
- .address(address)
132
+ .recipient(address)
130
133
 
131
134
  const tx = await builder.build()
132
135
 
@@ -142,7 +145,7 @@ const builder = Builder(/*chain api/builder_config/ws_url_string/ws_url_array -
142
145
  .from(TSubstrateChain)
143
146
  .to(TChain) //Has to be the same as the origin (from)
144
147
  .currency({id: currencyID, amount: amount /*Use "ALL" to transfer everything*/} | {symbol: currencySymbol, amount: amount /*Use "ALL" to transfer everything*/} | {symbol: Native('currencySymbol'), amount: amount /*Use "ALL" to transfer everything*/} | {symbol: Foreign('currencySymbol'), amount: amount /*Use "ALL" to transfer everything*/} | {symbol: ForeignAbstract('currencySymbol'), amount: amount /*Use "ALL" to transfer everything*/} | {location: AssetLocationString, amount: amount /*Use "ALL" to transfer everything*/ | AssetLocationJson, amount: amount /*Use "ALL" to transfer everything*/} | {location: Override('Custom Location'), amount: amount /*Use "ALL" to transfer everything*/} | [{currencySelection /*for example symbol: symbol or id: id, or location: location*/, amount: amount /*Use "ALL" to transfer everything*/}, {currencySelection}, ..])
145
- .address(address)
148
+ .recipient(address)
146
149
  /* .keepAlive(bool) - Optional: Allows draining the account below the existential deposit. */
147
150
 
148
151
  const tx = await builder.build()
@@ -157,9 +160,9 @@ const builder = Builder()
157
160
  .to('Hydration')
158
161
  .currency({
159
162
  symbol: 'DOT',
160
- amount: '1000000000'
163
+ amount: '1'
161
164
  })
162
- .address(address)
165
+ .recipient(address)
163
166
 
164
167
  const tx = await builder.build()
165
168
 
@@ -175,12 +178,12 @@ const builder = Builder(/*client | builder_config | ws_url | [ws_url, ws_url,..]
175
178
  .from(TSubstrateChain) // 'AssetHubPolkadot' | 'Hydration' | 'Moonbeam' | 'Polkadot' | ... https://paraspell.github.io/docs/sdk/AssetPallet.html#import-chains-as-types
176
179
  .to(TChain) // Has to be same as origin (from)
177
180
  .currency({id: currencyID, amount: amount /*Use "ALL" to transfer everything*/} | {symbol: currencySymbol, amount: amount /*Use "ALL" to transfer everything*/} | {symbol: Native('currencySymbol'), amount: amount /*Use "ALL" to transfer everything*/} | {symbol: Foreign('currencySymbol'), amount: amount /*Use "ALL" to transfer everything*/} | {symbol: ForeignAbstract('currencySymbol'), amount: amount /*Use "ALL" to transfer everything*/} | {location: AssetLocationString, amount: amount /*Use "ALL" to transfer everything*/ | AssetLocationJson, amount: amount /*Use "ALL" to transfer everything*/} | {location: Override('Custom Location'), amount: amount /*Use "ALL" to transfer everything*/})
178
- .senderAddress(senderAddress | PAPI SIGNER)
179
- .address(address)
181
+ .sender(sender | PAPI SIGNER)
182
+ .recipient(address)
180
183
  .transact(hex, /* originType, TWeight - Optional */)
181
184
 
182
185
  const tx = await builder.build()
183
- // Or if you use signers in senderAddress:
186
+ // Or if you use signers in sender:
184
187
  // await builder.signAndSubmit() - Signs and submits the transaction; returns TX hash for tracking
185
188
 
186
189
  //Disconnect API after TX
@@ -194,20 +197,21 @@ const builder = Builder(/*client | builder_config |ws_url | [ws_url, ws_url,..]
194
197
  .from(TSubstrateChain) // 'AssetHubPolkadot' | 'Hydration' | 'Moonbeam' | 'Polkadot' | ... https://paraspell.github.io/docs/sdk/AssetPallet.html#import-chains-as-types
195
198
  .to(TChain /*,customParaId - optional*/ | Location object /*Only works for PolkadotXCM pallet*/) //'AssetHubPolkadot' | 'Hydration' | 'Moonbeam' | 'Polkadot' | ... https://paraspell.github.io/docs/sdk/AssetPallet.html#import-chains-as-types
196
199
  .currency({id: currencyID, amount: amount /*Use "ALL" to transfer everything*/} | {symbol: currencySymbol, amount: amount /*Use "ALL" to transfer everything*/} | {symbol: Native('currencySymbol'), amount: amount /*Use "ALL" to transfer everything*/} | {symbol: Foreign('currencySymbol'), amount: amount /*Use "ALL" to transfer everything*/} | {symbol: ForeignAbstract('currencySymbol'), amount: amount /*Use "ALL" to transfer everything*/} | {location: AssetLocationString, amount: amount /*Use "ALL" to transfer everything*/ | AssetLocationJson, amount: amount /*Use "ALL" to transfer everything*/} | {location: Override('Custom Location'), amount: amount /*Use "ALL" to transfer everything*/})
197
- .address(address | Location object /*If you are sending through xTokens, you need to pass the destination and address location in one object (x2)*/)
198
- .senderAddress(address | PAPI_SIGNER /*Only in PAPI SDK*/ | {address, PJS_SIGNER} /*Only in PJS SDK*/) // - OPTIONAL but strongly recommended as it is automatically ignored when not needed - Used when origin is AssetHub/Hydration with feeAsset or when sending to AssetHub to prevent asset traps by auto-swapping to DOT to have DOT ED.
200
+ .recipient(address | Location object /*If you are sending through xTokens, you need to pass the destination and address location in one object (x2)*/)
201
+ .sender(address | PAPI_SIGNER /*Only in PAPI SDK*/ | {address, PJS_SIGNER} /*Only in PJS SDK*/) // - OPTIONAL but strongly recommended as it is automatically ignored when not needed - Used when origin is AssetHub/Hydration with feeAsset or when sending to AssetHub to prevent asset traps by auto-swapping to DOT to have DOT ED.
199
202
  .swap({
200
203
  currencyTo: {id: currencyID, amount: amount /*Use "ALL" to transfer everything*/} | {symbol: currencySymbol, amount: amount /*Use "ALL" to transfer everything*/} | {symbol: Native('currencySymbol'), amount: amount /*Use "ALL" to transfer everything*/} | {symbol: Foreign('currencySymbol'), amount: amount /*Use "ALL" to transfer everything*/} | {symbol: ForeignAbstract('currencySymbol'), amount: amount /*Use "ALL" to transfer everything*/} | {location: AssetLocationString, amount: amount /*Use "ALL" to transfer everything*/ | AssetLocationJson, amount: amount /*Use "ALL" to transfer everything*/} | {location: Override('Custom Location'), amount: amount /*Use "ALL" to transfer everything*/}
201
204
  // exchange: ['AssetHubPolkadotDex'], - Optional parameter - 'HydrationDex' | 'AcalaDex' | 'AssetHubPolkadotDex' | ...
202
205
  // slippage: 1, - Optional - 1 by default
203
- // evmSenderAddress: '0x000', - Optional parameter when origin CHAIN is EVM based (Required with evmSigner)
206
+ // evmsender: '0x000', - Optional parameter when origin CHAIN is EVM based (Required with evmSigner)
204
207
  // evmSigner: Signer, - Optional parameter when origin CHAIN is EVM based (Required with evmInjectorAddress)
205
208
  // onStatusChange: (event) => void - Optional parameter for callback events when sender address is supplied as signer
206
209
  })
207
210
 
208
211
  const tx = await builder.buildAll()
209
- // Or if you use signers in senderAddress:
210
- // await builder.signAndSubmit() - Signs and submits the transaction; returns TX hash for tracking
212
+ // Or if you use signers in sender:
213
+ // await builder.signAndSubmit() - Signs and submits the transaction (only working in 1click scenarios); returns TX hash for tracking
214
+ // await builder.signAndSubmitAll() - Signs and submits transactions (required in 2click scenarios); returns array of TX hashes for tracking
211
215
 
212
216
  // Make sure to disconnect API after it is no longer used (eg. after transaction)
213
217
  await builder.disconnect()
@@ -226,12 +230,12 @@ const result = await Builder(/*chain api/builder_config/ws_url_string/ws_url_arr
226
230
  currencyTo: CURRENCY_SPEC, //Reffer to currency spec options above
227
231
  // exchange: ['AssetHubPolkadotDex'], - Optional parameter - 'HydrationDex' | 'AcalaDex' | 'AssetHubPolkadotDex' | ...
228
232
  // slippage: 1, - Optional - 1 by default
229
- // evmSenderAddress: '0x000', - Optional parameter when origin CHAIN is EVM based (Required with evmSigner)
233
+ // evmsender: '0x000', - Optional parameter when origin CHAIN is EVM based (Required with evmSigner)
230
234
  // evmSigner: Signer, - Optional parameter when origin CHAIN is EVM based (Required with evmInjectorAddress)
231
235
  // onStatusChange: (event) => void - Optional parameter for callback events when sender address is supplied as signer
232
236
  })*/
233
- .address(ADDRESS)
234
- .senderAddress(address | PAPI_SIGNER)
237
+ .recipient(ADDRESS)
238
+ .sender(address | PAPI_SIGNER)
235
239
  .dryRun()
236
240
 
237
241
  //Check Parachain for DryRun support - returns true/false
@@ -249,8 +253,8 @@ const result = await Builder(/*chain api/builder_config/ws_url_string/ws_url_arr
249
253
  .to(TChain)
250
254
  .currency({id: currencyID, amount: amount /*Use "ALL" to transfer everything*/} | {symbol: currencySymbol, amount: amount /*Use "ALL" to transfer everything*/} | {symbol: Native('currencySymbol'), amount: amount /*Use "ALL" to transfer everything*/} | {symbol: Foreign('currencySymbol'), amount: amount /*Use "ALL" to transfer everything*/} | {symbol: ForeignAbstract('currencySymbol'), amount: amount /*Use "ALL" to transfer everything*/} | {location: AssetLocationString, amount: amount /*Use "ALL" to transfer everything*/ | AssetLocationJson, amount: amount /*Use "ALL" to transfer everything*/} | {location: Override('Custom Location'), amount: amount /*Use "ALL" to transfer everything*/} | {[{currencySelection, isFeeAsset?: true /* for example symbol: symbol or id: id, or Location: Location*/, amount: amount /*Use "ALL" to transfer everything*/}]})
251
255
  /*.feeAsset(CURRENCY) - Optional parameter when origin === AssetHubPolkadot and TX is supposed to be paid in same fee asset as selected currency.*/
252
- .address(ADDRESS)
253
- .senderAddress(address | PAPI_SIGNER)
256
+ .recipient(ADDRESS)
257
+ .sender(address | PAPI_SIGNER)
254
258
  .dryRunPreview(/*{ mintFeeAssets: true } - false by default - Mints fee assets also, if user does not have enough to cover fees on origin.*/)
255
259
  ```
256
260
 
@@ -261,13 +265,13 @@ const builder = Builder(/*chain api/builder_config/ws_url_string/ws_url_array -
261
265
  .from(TSubstrateChain) //Ensure, that origin chain is the same in all batched XCM Calls.
262
266
  .to(TChain2) //Any compatible Parachain
263
267
  .currency({currencySelection, amount}) //Currency to transfer - options as in scenarios above
264
- .address(address | Location object)
268
+ .recipient(address | Location object)
265
269
  .addToBatch()
266
270
 
267
271
  .from(TSubstrateChain) //Ensure, that origin chain is the same in all batched XCM Calls.
268
272
  .to(TChain3) //Any compatible Parachain
269
273
  .currency({currencySelection, amount}) //Currency to transfer - options as in scenarios above
270
- .address(address | Location object)
274
+ .recipient(address | Location object)
271
275
  .addToBatch()
272
276
 
273
277
  const tx = await builder.buildBatch({
@@ -287,7 +291,7 @@ const builder = Builder(/*chain api/builder_config/ws_url_string/ws_url_array -
287
291
  .claimfrom(TSubstrateChain)
288
292
  .currency({id: currencyID, amount: amount /*Use "ALL" to transfer everything*/} | {symbol: currencySymbol, amount: amount /*Use "ALL" to transfer everything*/} | {symbol: Native('currencySymbol'), amount: amount /*Use "ALL" to transfer everything*/} | {symbol: Foreign('currencySymbol'), amount: amount /*Use "ALL" to transfer everything*/} | {symbol: ForeignAbstract('currencySymbol'), amount: amount /*Use "ALL" to transfer everything*/} | {location: AssetLocationString, amount: amount /*Use "ALL" to transfer everything*/ | AssetLocationJson, amount: amount /*Use "ALL" to transfer everything*/} | [{currencySelection /*for example symbol: symbol or id: id, or location: location*/, amount: amount /*Use "ALL" to transfer everything*/}, {currencySelection}, ..]
289
293
  )
290
- .address(address | Location object)
294
+ .recipient(address | Location object)
291
295
  /*.xcmVersion(Version.V3) Optional parameter, by default chain specific version. XCM Version ENUM if a different XCM version is needed (Supported V3 & V4 & V5). Requires importing Version enum.*/
292
296
 
293
297
  const tx = await builder.build()
@@ -312,11 +316,11 @@ const builder = await Builder({
312
316
  .from(TSubstrateChain)
313
317
  .to(TChain)
314
318
  .currency({id: currencyID, amount: amount /*Use "ALL" to transfer everything*/} | {symbol: currencySymbol, amount: amount /*Use "ALL" to transfer everything*/} | {symbol: Native('currencySymbol'), amount: amount /*Use "ALL" to transfer everything*/} | {symbol: Foreign('currencySymbol'), amount: amount /*Use "ALL" to transfer everything*/} | {symbol: ForeignAbstract('currencySymbol'), amount: amount /*Use "ALL" to transfer everything*/} | {location: AssetLocationString, amount: amount /*Use "ALL" to transfer everything*/ | AssetLocationJson, amount: amount /*Use "ALL" to transfer everything*/} | {location: Override('Custom Location'), amount: amount /*Use "ALL" to transfer everything*/} | [{currencySelection, isFeeAsset?: true /* for example symbol: symbol or id: id, or Location: Location*/, amount: amount /*Use "ALL" to transfer everything*/}])
315
- .address(address) //You can also use prederived accounts - //Alice, //Bob... //Alith, //Balthathar...
316
- .senderAddress(address | PAPI_SIGNER) //You can also use prederived accounts //Alice, //Bob... //Alith, //Balthathar...
319
+ .recipient(address) //You can also use prederived accounts - //Alice, //Bob... //Alith, //Balthathar...
320
+ .sender(address | PAPI_SIGNER) //You can also use prederived accounts //Alice, //Bob... //Alith, //Balthathar...
317
321
 
318
322
  const tx = await builder.build()
319
- //Or if you use prederived account as senderAddress:
323
+ //Or if you use prederived account as sender:
320
324
  //await builder.signAndSubmit()
321
325
 
322
326
  //Disconnect API after TX
@@ -338,12 +342,12 @@ const fee = await Builder(/*chain api/builder_config/ws_url_string/ws_url_array
338
342
  currencyTo: CURRENCY_SPEC, //Reffer to currency spec options above
339
343
  // exchange: ['AssetHubPolkadotDex'], - Optional parameter - 'HydrationDex' | 'AcalaDex' | 'AssetHubPolkadotDex' | ...
340
344
  // slippage: 1, - Optional - 1 by default
341
- // evmSenderAddress: '0x000', - Optional parameter when origin CHAIN is EVM based (Required with evmSigner)
345
+ // evmsender: '0x000', - Optional parameter when origin CHAIN is EVM based (Required with evmSigner)
342
346
  // evmSigner: Signer, - Optional parameter when origin CHAIN is EVM based (Required with evmInjectorAddress)
343
347
  // onStatusChange: (event) => void - Optional parameter for callback events when sender address is supplied as signer
344
348
  })*/
345
- .address(RECIPIENT_ADDRESS)
346
- .senderAddress(address | PAPI_SIGNER)
349
+ .recipient(RECIPIENT_ADDRESS)
350
+ .sender(address | PAPI_SIGNER)
347
351
  .getXcmFee(/*{disableFallback: true / false}*/) //Fallback is optional. When fallback is disabled, you only get notified of a DryRun error, but no Payment info query fallback is performed. Payment info is still performed if Origin or Destination chain do not support DryRun out of the box.
348
352
  ```
349
353
 
@@ -355,8 +359,8 @@ const fee = await Builder(/*chain api/builder_config/ws_url_string/ws_url_array
355
359
  .to(TChain)
356
360
  .currency(CURRENCY_SPEC)
357
361
  /*.feeAsset(CURRENCY) - Optional parameter when origin === AssetHubPolkadot and TX is supposed to be paid in the same fee asset as selected currency.*/
358
- .address(RECIPIENT_ADDRESS)
359
- .senderAddress(address | PAPI_SIGNER)
362
+ .recipient(RECIPIENT_ADDRESS)
363
+ .sender(address | PAPI_SIGNER)
360
364
  .getOriginXcmFee(/*{disableFallback: true / false}*/) //Fallback is optional. When fallback is disabled, you only get notified of a DryRun error, but no Payment info query fallback is performed. Payment info is still performed if Origin do not support DryRun out of the box.
361
365
  ```
362
366
 
@@ -367,8 +371,8 @@ const info = await Builder(/*chain api/builder_config/ws_url_string/ws_url_array
367
371
  .to(TChain)
368
372
  .currency(CURRENCY_SPEC)
369
373
  /*.feeAsset(CURRENCY) - Optional parameter when origin === AssetHubPolkadot and TX is supposed to be paid in the same fee asset as selected currency.*/
370
- .address(RECIPIENT_ADDRESS)
371
- .senderAddress(address | PAPI_SIGNER)
374
+ .recipient(RECIPIENT_ADDRESS)
375
+ .sender(address | PAPI_SIGNER)
372
376
  .getTransferInfo()
373
377
  ```
374
378
 
@@ -383,12 +387,12 @@ const transferable = await Builder(/*chain api/builder_config/ws_url_string/ws_u
383
387
  currencyTo: CURRENCY_SPEC, //Reffer to currency spec options above
384
388
  // exchange: ['AssetHubPolkadotDex'], - Optional parameter - 'HydrationDex' | 'AcalaDex' | 'AssetHubPolkadotDex' | ...
385
389
  // slippage: 1, - Optional - 1 by default
386
- // evmSenderAddress: '0x000', - Optional parameter when origin CHAIN is EVM based (Required with evmSigner)
390
+ // evmsender: '0x000', - Optional parameter when origin CHAIN is EVM based (Required with evmSigner)
387
391
  // evmSigner: Signer, - Optional parameter when origin CHAIN is EVM based (Required with evmInjectorAddress)
388
392
  // onStatusChange: (event) => void - Optional parameter for callback events when sender address is supplied as signer
389
393
  })*/
390
- .address(RECIPIENT_ADDRESS)
391
- .senderAddress(address | PAPI_SIGNER)
394
+ .recipient(RECIPIENT_ADDRESS)
395
+ .sender(address | PAPI_SIGNER)
392
396
  .getTransferableAmount()
393
397
  ```
394
398
 
@@ -403,12 +407,12 @@ const transferable = await Builder(/*chain api/builder_config/ws_url_string/ws_u
403
407
  currencyTo: CURRENCY_SPEC, //Reffer to currency spec options above
404
408
  // exchange: ['AssetHubPolkadotDex'], - Optional parameter - 'HydrationDex' | 'AcalaDex' | 'AssetHubPolkadotDex' | ...
405
409
  // slippage: 1, - Optional - 1 by default
406
- // evmSenderAddress: '0x000', - Optional parameter when origin CHAIN is EVM based (Required with evmSigner)
410
+ // evmsender: '0x000', - Optional parameter when origin CHAIN is EVM based (Required with evmSigner)
407
411
  // evmSigner: Signer, - Optional parameter when origin CHAIN is EVM based (Required with evmInjectorAddress)
408
412
  // onStatusChange: (event) => void - Optional parameter for callback events when sender address is supplied as signer
409
413
  })*/
410
- .address(RECIPIENT_ADDRESS)
411
- .senderAddress(address | PAPI_SIGNER)
414
+ .recipient(RECIPIENT_ADDRESS)
415
+ .sender(address | PAPI_SIGNER)
412
416
  .getMinTransferableAmount()
413
417
  ```
414
418
 
@@ -419,8 +423,8 @@ const receivable = await Builder(/*chain api/builder_config/ws_url_string/ws_url
419
423
  .to(TChain)
420
424
  .currency(CURRENCY_SPEC)
421
425
  /*.feeAsset(CURRENCY) - Optional parameter when origin === AssetHubPolkadot and TX is supposed to be paid in the same fee asset as selected currency.*/
422
- .address(RECIPIENT_ADDRESS)
423
- .senderAddress(address | PAPI_SIGNER)
426
+ .recipient(RECIPIENT_ADDRESS)
427
+ .sender(address | PAPI_SIGNER)
424
428
  .getReceivableAmount()
425
429
  ```
426
430
 
@@ -431,8 +435,8 @@ const ed = await Builder(/*chain api/builder_config/ws_url_string/ws_url_array -
431
435
  .to(TChain)
432
436
  .currency(CURRENCY_SPEC)
433
437
  /*.feeAsset(CURRENCY) - Optional parameter when origin === AssetHubPolkadot and TX is supposed to be paid in the same fee asset as selected currency.*/
434
- .address(RECIPIENT_ADDRESS)
435
- .senderAddress(address | PAPI_SIGNER)
438
+ .recipient(RECIPIENT_ADDRESS)
439
+ .sender(address | PAPI_SIGNER)
436
440
  .verifyEdOnDestination()
437
441
  ```
438
442
 
@@ -443,13 +447,13 @@ const result = await Builder(/*chain api/builder_config/ws_url_string/ws_url_arr
443
447
  .from(TSubstrateChain) //'AssetHubPolkadot' | 'Hydration' | 'Moonbeam' | 'Polkadot' | ... https://paraspell.github.io/docs/sdk/AssetPallet.html#import-chains-as-types
444
448
  .to(TChain) //'AssetHubPolkadot' | 'Hydration' | 'Moonbeam' | 'Polkadot' | ... https://paraspell.github.io/docs/sdk/AssetPallet.html#import-chains-as-types
445
449
  .currency(CURRENCY_SPEC)
446
- .address(RECIPIENT_ADDRESS)
447
- .senderAddress(SENDER_ADDRESS)
450
+ .recipient(RECIPIENT_ADDRESS)
451
+ .sender(SENDER_ADDRESS)
448
452
  .swap({
449
453
  currencyTo: CURRENCY_SPEC,
450
454
  // exchange: ['AssetHubPolkadotDex'], - Optional parameter - 'HydrationDex' | 'AcalaDex' | 'AssetHubPolkadotDex' | ...
451
455
  // slippage: 1, - Optional - 1 by default
452
- // evmSenderAddress: '0x000', - Optional parameter when origin CHAIN is EVM based (Required with evmSigner)
456
+ // evmsender: '0x000', - Optional parameter when origin CHAIN is EVM based (Required with evmSigner)
453
457
  // evmSigner: Signer, - Optional parameter when origin CHAIN is EVM based (Required with evmInjectorAddress)
454
458
  // onStatusChange: (event) => void - Optional parameter for callback events when sender address is supplied as signer
455
459
  })
@@ -487,11 +491,12 @@ import { convertSs58 } from "@paraspell/sdk";
487
491
  let result = convertSs58(ADDRESS, TChain) // returns converted address in string
488
492
  ```
489
493
 
490
- ### Asset queries
494
+ ### Asset queries:
495
+
491
496
  For full documentation with output examples of asset queries, head over to [official documentation](https://paraspell.github.io/docs/sdk/AssetPallet.html).
492
497
 
493
498
  ```ts
494
- import { getSupportedDestinations, getFeeAssets, getAssetsObject, getAssetId, getRelayChainSymbol, getNativeAssets, getNativeAssets, getOtherAssets, getAllAssetsSymbols, hasSupportForAsset, getAssetDecimals, getParaId, getTChain, getAssetLocation, CHAINS, findAssetInfo, findAssetInfoOrThrow } from '@paraspell/sdk'
499
+ import { getSupportedDestinations, getFeeAssets, getAssetsObject, getRelayChainSymbol, getNativeAssets, getNativeAssets, getOtherAssets, getAllAssetsSymbols, getParaId, getTChain, getAssetLocation, CHAINS, findAssetInfo, findAssetInfoOrThrow } from '@paraspell/sdk'
495
500
 
496
501
  //Get chains that support the specific asset related to origin
497
502
  getSupportedDestinations(TChain, CURRENCY)
@@ -514,9 +519,6 @@ getAssetLocation(TChain, { symbol: symbol } | { id: assetId })
514
519
  // Retrieve assets object from assets.json for a particular chain, including information about native and foreign assets
515
520
  getAssetsObject(TChain)
516
521
 
517
- // Retrieve foreign assetId for a particular chain and asset symbol
518
- getAssetId(TChain, ASSET_SYMBOL)
519
-
520
522
  // Retrieve the symbol of the relay chain for a particular chain. Either "DOT" or "KSM"
521
523
  getRelayChainSymbol(TChain)
522
524
 
@@ -529,12 +531,6 @@ getOtherAssets(TChain)
529
531
  // Retrieve string array of all asset symbols. (native and foreign assets are merged into a single array)
530
532
  getAllAssetsSymbols(TChain)
531
533
 
532
- // Check if a chain supports a particular asset. (Both native and foreign assets are searched). Returns boolean
533
- hasSupportForAsset(TChain, ASSET_SYMBOL)
534
-
535
- // Get decimals for specific asset
536
- getAssetDecimals(TChain, ASSET_SYMBOL)
537
-
538
534
  // Get specific chain id
539
535
  getParaId(TChain)
540
536
 
@@ -579,6 +575,8 @@ console.log(SUPPORTED_PALLETS)
579
575
 
580
576
  - Run end-to-end tests using `pnpm test:e2e`
581
577
 
578
+ - Run swap end-to-end tests using `pnpm test:e2e:swap`
579
+
582
580
  - Run full end-to-end tests using `pnpm test:e2e:chopsticks`
583
581
 
584
582
  - Run all core tests and checks using `pnpm runAll`
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import * as _paraspell_sdk_core from '@paraspell/sdk-core';
2
- import { TApiOrUrl, TEvmChainFrom, TSwapEvent as TSwapEvent$1, Foreign, ForeignAbstract, Native, Override, findAssetInfo, getAllAssetsSymbols, getAssetDecimals, getAssetId, getAssets, getAssetsObject, getExistentialDeposit, getNativeAssetSymbol, getNativeAssets, getOtherAssets, getRelayChainSymbol, getSupportedAssets, getTChain, hasSupportForAsset, isChainEvm, TSubstrateChain, TEvmBuilderOptions, TChain, TCurrencyInputWithAmount, TBuilderOptions, GeneralBuilder as GeneralBuilder$1, TSendBaseOptions, TGetXcmFeeBaseOptions, TCreateBaseSwapXcmOptions } from '@paraspell/sdk-core';
2
+ import { TApiOrUrl, TEvmChainFrom, TSwapEvent as TSwapEvent$1, Foreign, ForeignAbstract, Native, Override, findAssetInfo, getAllAssetsSymbols, getAssetDecimals, getAssetId, getAssets, getAssetsObject, getExistentialDeposit, getNativeAssetSymbol, getNativeAssets, getOtherAssets, getRelayChainSymbol, getSupportedAssets, getTChain, hasSupportForAsset, isChainEvm, TSubstrateChain, TEvmBuilderOptions, TChain, TCurrencyInputWithAmount, TBuilderOptions, GeneralBuilder as GeneralBuilder$1, TTransferBaseOptions, TGetXcmFeeBaseOptions, TCreateBaseSwapXcmOptions } from '@paraspell/sdk-core';
3
3
  export * from '@paraspell/sdk-core';
4
4
  import * as polkadot_api from 'polkadot-api';
5
5
  import { PolkadotClient, UnsafeTransaction, PolkadotSigner } from 'polkadot-api';
@@ -22,20 +22,11 @@ declare const getBalance: (options: _paraspell_sdk_core.TGetBalanceCommonOptions
22
22
  } & {
23
23
  api?: TPapiApiOrUrl;
24
24
  }) => Promise<bigint>;
25
- /**
26
- * Claims assets from a parachain.
27
- *
28
- * @returns An extrinsic representing the claim transaction.
29
- */
30
- declare const claimAssets: (options: _paraspell_sdk_core.TAssetClaimOptionsBase & {
31
- api?: TPapiApiOrUrl;
32
- }) => Promise<TPapiTransaction>;
33
25
 
34
26
  declare const assets_Foreign: typeof Foreign;
35
27
  declare const assets_ForeignAbstract: typeof ForeignAbstract;
36
28
  declare const assets_Native: typeof Native;
37
29
  declare const assets_Override: typeof Override;
38
- declare const assets_claimAssets: typeof claimAssets;
39
30
  declare const assets_findAssetInfo: typeof findAssetInfo;
40
31
  declare const assets_getAllAssetsSymbols: typeof getAllAssetsSymbols;
41
32
  declare const assets_getAssetDecimals: typeof getAssetDecimals;
@@ -58,7 +49,6 @@ declare namespace assets {
58
49
  assets_ForeignAbstract as ForeignAbstract,
59
50
  assets_Native as Native,
60
51
  assets_Override as Override,
61
- assets_claimAssets as claimAssets,
62
52
  assets_findAssetInfo as findAssetInfo,
63
53
  assets_getAllAssetsSymbols as getAllAssetsSymbols,
64
54
  assets_getAssetDecimals as getAssetDecimals,
@@ -113,8 +103,8 @@ declare class EvmBuilderCore<TApi, TRes, TSigner, T extends Partial<TEvmBuilderO
113
103
  * @param address - The Polkadot address to receive the transfer.
114
104
  * @returns An instance of EvmBuilder
115
105
  */
116
- address(address: string): EvmBuilderCore<TApi, TRes, TSigner, T & {
117
- address: string;
106
+ recipient(address: string): EvmBuilderCore<TApi, TRes, TSigner, T & {
107
+ recipient: string;
118
108
  }>;
119
109
  /**
120
110
  * Sets the asset hub address. This is used for transfers that go through the Asset Hub.
@@ -149,7 +139,7 @@ declare class EvmBuilderCore<TApi, TRes, TSigner, T extends Partial<TEvmBuilderO
149
139
  * @returns A new Builder instance.
150
140
  */
151
141
  declare const Builder: (api?: TBuilderOptions<TPapiApiOrUrl>) => GeneralBuilder$1<PolkadotClient, TPapiTransaction, PolkadotSigner, object>;
152
- type GeneralBuilder<T extends Partial<TSendBaseOptions<TPapiApi, TPapiTransaction, TPapiSigner>> = object> = GeneralBuilder$1<PolkadotClient, TPapiTransaction, PolkadotSigner, T>;
142
+ type GeneralBuilder<T extends Partial<TTransferBaseOptions<TPapiApi, TPapiTransaction, TPapiSigner>> = object> = GeneralBuilder$1<PolkadotClient, TPapiTransaction, PolkadotSigner, T>;
153
143
  declare const EvmBuilder: (api?: TBuilderOptions<TPapiApiOrUrl>) => EvmBuilderCore<unknown, unknown, unknown, {
154
144
  api: _paraspell_sdk_core.IPolkadotApi<PolkadotClient, TPapiTransaction, PolkadotSigner>;
155
145
  }>;
@@ -198,5 +188,5 @@ declare const createChainClient: (chain: TSubstrateChain, api?: TBuilderOptions<
198
188
  declare const checkAndConvertToNumberOrBigInt: (input: string) => number | bigint;
199
189
  declare const transform: (obj: any) => any;
200
190
 
201
- export { Builder, EvmBuilder, assets, checkAndConvertToNumberOrBigInt, claimAssets, convertSs58, createChainClient, dryRun, dryRunOrigin, getBalance, getBridgeStatus, getOriginXcmFee, getParaEthTransferFees, getXcmFee, handleSwapExecuteTransfer, transform, transfer as xcmPallet };
191
+ export { Builder, EvmBuilder, assets, checkAndConvertToNumberOrBigInt, convertSs58, createChainClient, dryRun, dryRunOrigin, getBalance, getBridgeStatus, getOriginXcmFee, getParaEthTransferFees, getXcmFee, handleSwapExecuteTransfer, transform, transfer as xcmPallet };
202
192
  export type { GeneralBuilder, TEvmChainFromPapi, TPapiApi, TPapiApiOrUrl, TPapiSigner, TPapiTransaction, TSwapEvent };
package/dist/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { getNativeAssetSymbol, getOtherAssets, isSenderSigner, getEvmPrivateKeyHex, NumberFormatError, createClientCache, MAX_CLIENTS, EXTENSION_MS, createClientPoolHelpers, InvalidAddressError, BatchMode, isConfig, findNativeAssetInfoOrThrow, getChainProviders, DEFAULT_TTL_MS, resolveChainApi, isExternalChain, Parents, findAssetInfoOrThrow, hasXcmPaymentApiSupport, replaceBigInt, getAssetsObject, RuntimeApiUnavailableError, wrapTxBypass, localizeLocation, isAssetXcEqual, addXcmVersionHeader, RELAY_LOCATION, getRelayChainOf, isRelayChain, padValueBy, isAssetEqual, createChainClient as createChainClient$1, getBalance as getBalance$1, claimAssets as claimAssets$1, Foreign, ForeignAbstract, Native, Override, findAssetInfo, getAllAssetsSymbols, getAssetDecimals, getAssetId, getAssets, getExistentialDeposit, getNativeAssets, getRelayChainSymbol, getSupportedAssets, getTChain, hasSupportForAsset, isChainEvm, convertSs58 as convertSs58$1, transferMoonbeamEvm, validateAddress, transferMoonbeamToEth, Builder as Builder$1, handleSwapExecuteTransfer as handleSwapExecuteTransfer$1, getBridgeStatus as getBridgeStatus$1, getParaEthTransferFees as getParaEthTransferFees$1, getXcmFee as getXcmFee$1, dryRun as dryRun$1, dryRunOrigin as dryRunOrigin$1, getOriginXcmFee as getOriginXcmFee$1 } from '@paraspell/sdk-core';
1
+ import { getNativeAssetSymbol, getOtherAssets, isSenderSigner, getEvmPrivateKeyHex, NumberFormatError, createClientCache, MAX_CLIENTS, EXTENSION_MS, createClientPoolHelpers, InvalidAddressError, BatchMode, isConfig, findNativeAssetInfoOrThrow, getChainProviders, DEFAULT_TTL_MS, resolveChainApi, isExternalChain, Parents, findAssetInfoOrThrow, hasXcmPaymentApiSupport, replaceBigInt, getAssetsObject, RuntimeApiUnavailableError, wrapTxBypass, localizeLocation, isAssetXcEqual, addXcmVersionHeader, RELAY_LOCATION, getRelayChainOf, isRelayChain, padValueBy, isAssetEqual, SubmitTransactionError, createChainClient as createChainClient$1, getBalance as getBalance$1, Foreign, ForeignAbstract, Native, Override, findAssetInfo, getAllAssetsSymbols, getAssetDecimals, getAssetId, getAssets, getExistentialDeposit, getNativeAssets, getRelayChainSymbol, getSupportedAssets, getTChain, hasSupportForAsset, isChainEvm, convertSs58 as convertSs58$1, transferMoonbeamEvm, validateAddress, transferMoonbeamToEth, Builder as Builder$1, handleSwapExecuteTransfer as handleSwapExecuteTransfer$1, getBridgeStatus as getBridgeStatus$1, getParaEthTransferFees as getParaEthTransferFees$1, getXcmFee as getXcmFee$1, dryRun as dryRun$1, dryRunOrigin as dryRunOrigin$1, getOriginXcmFee as getOriginXcmFee$1 } from '@paraspell/sdk-core';
2
2
  export * from '@paraspell/sdk-core';
3
3
  import { secp256k1 } from '@noble/curves/secp256k1.js';
4
4
  import { keccak_256 } from '@noble/hashes/sha3.js';
@@ -1044,13 +1044,13 @@ var PapiApi = /*#__PURE__*/function () {
1044
1044
  return _regenerator().w(function (_context9) {
1045
1045
  while (1) switch (_context9.n) {
1046
1046
  case 0:
1047
- api = new PapiApi();
1047
+ api = new PapiApi(isConfig(this._config) ? this._config : undefined);
1048
1048
  _context9.n = 1;
1049
1049
  return api.init(chain);
1050
1050
  case 1:
1051
1051
  return _context9.a(2, api);
1052
1052
  }
1053
- }, _callee9);
1053
+ }, _callee9, this);
1054
1054
  }));
1055
1055
  function createApiForChain(_x15) {
1056
1056
  return _createApiForChain.apply(this, arguments);
@@ -1099,7 +1099,7 @@ var PapiApi = /*#__PURE__*/function () {
1099
1099
  isCustomAsset: true,
1100
1100
  asset: findAssetInfoOrThrow(chain, {
1101
1101
  id: assetId
1102
- }, null)
1102
+ })
1103
1103
  });
1104
1104
  }
1105
1105
  }, _callee0, this);
@@ -1785,6 +1785,39 @@ var PapiApi = /*#__PURE__*/function () {
1785
1785
  }
1786
1786
  return signAndSubmit;
1787
1787
  }()
1788
+ }, {
1789
+ key: "signAndSubmitFinalized",
1790
+ value: function () {
1791
+ var _signAndSubmitFinalized = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee19(tx, sender) {
1792
+ var signer;
1793
+ return _regenerator().w(function (_context19) {
1794
+ while (1) switch (_context19.n) {
1795
+ case 0:
1796
+ signer = isSenderSigner(sender) ? sender : createDevSigner(sender);
1797
+ return _context19.a(2, new Promise(function (resolve, reject) {
1798
+ tx.signSubmitAndWatch(signer).subscribe({
1799
+ next: function next(event) {
1800
+ if (event.type === 'finalized' || event.type === 'txBestBlocksState' && event.found) {
1801
+ if (!event.ok) {
1802
+ reject(new SubmitTransactionError(JSON.stringify(event.dispatchError.value)));
1803
+ } else {
1804
+ resolve(event.txHash);
1805
+ }
1806
+ }
1807
+ },
1808
+ error: function error(_error) {
1809
+ reject(_error instanceof Error ? _error : new SubmitTransactionError(String(_error)));
1810
+ }
1811
+ });
1812
+ }));
1813
+ }
1814
+ }, _callee19);
1815
+ }));
1816
+ function signAndSubmitFinalized(_x37, _x38) {
1817
+ return _signAndSubmitFinalized.apply(this, arguments);
1818
+ }
1819
+ return signAndSubmitFinalized;
1820
+ }()
1788
1821
  }]);
1789
1822
  }();
1790
1823
 
@@ -1825,12 +1858,6 @@ var findFailingEvent = function findFailingEvent(result) {
1825
1858
  * @returns The asset balance as a bigint.
1826
1859
  */
1827
1860
  var getBalance = createPapiApiCall(getBalance$1);
1828
- /**
1829
- * Claims assets from a parachain.
1830
- *
1831
- * @returns An extrinsic representing the claim transaction.
1832
- */
1833
- var claimAssets = createPapiApiCall(claimAssets$1);
1834
1861
 
1835
1862
  var assets = /*#__PURE__*/Object.freeze({
1836
1863
  __proto__: null,
@@ -1838,7 +1865,6 @@ var assets = /*#__PURE__*/Object.freeze({
1838
1865
  ForeignAbstract: ForeignAbstract,
1839
1866
  Native: Native,
1840
1867
  Override: Override,
1841
- claimAssets: claimAssets,
1842
1868
  findAssetInfo: findAssetInfo,
1843
1869
  getAllAssetsSymbols: getAllAssetsSymbols,
1844
1870
  getAssetDecimals: getAssetDecimals,
@@ -1910,10 +1936,10 @@ var EvmBuilderCore = /*#__PURE__*/function () {
1910
1936
  * @returns An instance of EvmBuilder
1911
1937
  */
1912
1938
  }, {
1913
- key: "address",
1914
- value: function address(_address) {
1939
+ key: "recipient",
1940
+ value: function recipient(address) {
1915
1941
  return new EvmBuilderCore(_objectSpread2(_objectSpread2({}, this._options), {}, {
1916
- address: _address
1942
+ recipient: address
1917
1943
  }));
1918
1944
  }
1919
1945
  /**
@@ -1951,12 +1977,12 @@ var EvmBuilderCore = /*#__PURE__*/function () {
1951
1977
  key: "build",
1952
1978
  value: (function () {
1953
1979
  var _build = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {
1954
- var _this$_options, from, to, address, api;
1980
+ var _this$_options, from, to, recipient, api;
1955
1981
  return _regenerator().w(function (_context) {
1956
1982
  while (1) switch (_context.n) {
1957
1983
  case 0:
1958
- _this$_options = this._options, from = _this$_options.from, to = _this$_options.to, address = _this$_options.address, api = _this$_options.api;
1959
- validateAddress(api, address, to);
1984
+ _this$_options = this._options, from = _this$_options.from, to = _this$_options.to, recipient = _this$_options.recipient, api = _this$_options.api;
1985
+ validateAddress(api, recipient, to);
1960
1986
  if (!(from === 'Moonbeam' && to === 'Ethereum')) {
1961
1987
  _context.n = 1;
1962
1988
  break;
@@ -2075,4 +2101,4 @@ var transfer = /*#__PURE__*/Object.freeze({
2075
2101
  handleSwapExecuteTransfer: handleSwapExecuteTransfer
2076
2102
  });
2077
2103
 
2078
- export { Builder, EvmBuilder, assets, checkAndConvertToNumberOrBigInt, claimAssets, convertSs58, createChainClient, dryRun, dryRunOrigin, getBalance, getBridgeStatus, getOriginXcmFee, getParaEthTransferFees, getXcmFee, handleSwapExecuteTransfer, _transform as transform, transfer as xcmPallet };
2104
+ export { Builder, EvmBuilder, assets, checkAndConvertToNumberOrBigInt, convertSs58, createChainClient, dryRun, dryRunOrigin, getBalance, getBridgeStatus, getOriginXcmFee, getParaEthTransferFees, getXcmFee, handleSwapExecuteTransfer, _transform as transform, transfer as xcmPallet };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@paraspell/sdk",
3
- "version": "12.9.7",
3
+ "version": "12.10.0-rc.0",
4
4
  "description": "SDK for ParaSpell XCM/XCMP tool for developers",
5
5
  "repository": {
6
6
  "type": "git",
@@ -28,7 +28,7 @@
28
28
  "@polkadot-labs/hdkd": "^0.0.27",
29
29
  "@polkadot-labs/hdkd-helpers": "^0.0.28",
30
30
  "viem": "2.47.1",
31
- "@paraspell/sdk-core": "12.9.7"
31
+ "@paraspell/sdk-core": "12.10.0-rc.0"
32
32
  },
33
33
  "peerDependencies": {
34
34
  "polkadot-api": ">= 1.23.3 < 2"
@@ -63,6 +63,7 @@
63
63
  "test:watch": "vitest",
64
64
  "runAll": "pnpm compile && pnpm format:write && pnpm lint && pnpm test",
65
65
  "test:e2e": "vitest run --config ./vitest.config.e2e.ts --sequence.concurrent",
66
- "test:e2e:chopsticks": "vitest run --config ./vitest.config.chopsticks.e2e.ts"
66
+ "test:e2e:chopsticks": "vitest run --config ./vitest.config.chopsticks.e2e.ts",
67
+ "test:e2e:swap": "vitest run --config ./vitest.config.swap.e2e.ts --sequence.concurrent"
67
68
  }
68
69
  }