@vultisig/core-chain 2.4.1 → 2.6.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.
Files changed (69) hide show
  1. package/CHANGELOG.md +58 -0
  2. package/dist/chains/cosmos/account/getCosmosAccountInfo.d.ts.map +1 -1
  3. package/dist/chains/cosmos/account/getCosmosAccountInfo.js +41 -5
  4. package/dist/chains/cosmos/account/getCosmosAccountInfo.js.map +1 -1
  5. package/dist/coin/price/resolveTokenPriceId.d.ts +24 -0
  6. package/dist/coin/price/resolveTokenPriceId.d.ts.map +1 -0
  7. package/dist/coin/price/resolveTokenPriceId.js +31 -0
  8. package/dist/coin/price/resolveTokenPriceId.js.map +1 -0
  9. package/dist/swap/NoSwapRoutesError.d.ts +2 -1
  10. package/dist/swap/NoSwapRoutesError.d.ts.map +1 -1
  11. package/dist/swap/NoSwapRoutesError.js +3 -2
  12. package/dist/swap/NoSwapRoutesError.js.map +1 -1
  13. package/dist/swap/SwapError.d.ts +18 -0
  14. package/dist/swap/SwapError.d.ts.map +1 -0
  15. package/dist/swap/SwapError.js +22 -0
  16. package/dist/swap/SwapError.js.map +1 -0
  17. package/dist/swap/general/GeneralSwapProvider.d.ts +1 -1
  18. package/dist/swap/general/GeneralSwapProvider.d.ts.map +1 -1
  19. package/dist/swap/general/GeneralSwapProvider.js +2 -1
  20. package/dist/swap/general/GeneralSwapProvider.js.map +1 -1
  21. package/dist/swap/general/GeneralSwapQuote.d.ts +24 -0
  22. package/dist/swap/general/GeneralSwapQuote.d.ts.map +1 -1
  23. package/dist/swap/general/cowswap/api/getCowSwapOrderStatus.d.ts +9 -0
  24. package/dist/swap/general/cowswap/api/getCowSwapOrderStatus.d.ts.map +1 -0
  25. package/dist/swap/general/cowswap/api/getCowSwapOrderStatus.js +11 -0
  26. package/dist/swap/general/cowswap/api/getCowSwapOrderStatus.js.map +1 -0
  27. package/dist/swap/general/cowswap/api/getCowSwapQuote.d.ts +14 -0
  28. package/dist/swap/general/cowswap/api/getCowSwapQuote.d.ts.map +1 -0
  29. package/dist/swap/general/cowswap/api/getCowSwapQuote.js +51 -0
  30. package/dist/swap/general/cowswap/api/getCowSwapQuote.js.map +1 -0
  31. package/dist/swap/general/cowswap/api/submitCowSwapOrder.d.ts +12 -0
  32. package/dist/swap/general/cowswap/api/submitCowSwapOrder.d.ts.map +1 -0
  33. package/dist/swap/general/cowswap/api/submitCowSwapOrder.js +17 -0
  34. package/dist/swap/general/cowswap/api/submitCowSwapOrder.js.map +1 -0
  35. package/dist/swap/general/cowswap/config.d.ts +18 -0
  36. package/dist/swap/general/cowswap/config.d.ts.map +1 -0
  37. package/dist/swap/general/cowswap/config.js +83 -0
  38. package/dist/swap/general/cowswap/config.js.map +1 -0
  39. package/dist/swap/general/cowswap/permit/buildEip2612Permit.d.ts +39 -0
  40. package/dist/swap/general/cowswap/permit/buildEip2612Permit.d.ts.map +1 -0
  41. package/dist/swap/general/cowswap/permit/buildEip2612Permit.js +32 -0
  42. package/dist/swap/general/cowswap/permit/buildEip2612Permit.js.map +1 -0
  43. package/dist/swap/general/cowswap/sign/buildCowSwapOrder.d.ts +31 -0
  44. package/dist/swap/general/cowswap/sign/buildCowSwapOrder.d.ts.map +1 -0
  45. package/dist/swap/general/cowswap/sign/buildCowSwapOrder.js +45 -0
  46. package/dist/swap/general/cowswap/sign/buildCowSwapOrder.js.map +1 -0
  47. package/dist/swap/general/cowswap/sign/buildEip712Domain.d.ts +9 -0
  48. package/dist/swap/general/cowswap/sign/buildEip712Domain.d.ts.map +1 -0
  49. package/dist/swap/general/cowswap/sign/buildEip712Domain.js +11 -0
  50. package/dist/swap/general/cowswap/sign/buildEip712Domain.js.map +1 -0
  51. package/dist/swap/general/cowswap/types.d.ts +31 -0
  52. package/dist/swap/general/cowswap/types.d.ts.map +1 -0
  53. package/dist/swap/general/cowswap/types.js +2 -0
  54. package/dist/swap/general/cowswap/types.js.map +1 -0
  55. package/dist/swap/general/lifi/api/getLifiSwapQuote.d.ts +11 -1
  56. package/dist/swap/general/lifi/api/getLifiSwapQuote.d.ts.map +1 -1
  57. package/dist/swap/general/lifi/api/getLifiSwapQuote.js +34 -2
  58. package/dist/swap/general/lifi/api/getLifiSwapQuote.js.map +1 -1
  59. package/dist/swap/keysign/getSwapDestinationAddress.d.ts.map +1 -1
  60. package/dist/swap/keysign/getSwapDestinationAddress.js +8 -0
  61. package/dist/swap/keysign/getSwapDestinationAddress.js.map +1 -1
  62. package/dist/swap/native/api/getNativeSwapQuote.d.ts.map +1 -1
  63. package/dist/swap/native/api/getNativeSwapQuote.js +1 -2
  64. package/dist/swap/native/api/getNativeSwapQuote.js.map +1 -1
  65. package/dist/swap/quote/findSwapQuote.d.ts +1 -1
  66. package/dist/swap/quote/findSwapQuote.d.ts.map +1 -1
  67. package/dist/swap/quote/findSwapQuote.js +35 -5
  68. package/dist/swap/quote/findSwapQuote.js.map +1 -1
  69. package/package.json +51 -2
package/CHANGELOG.md CHANGED
@@ -1,5 +1,63 @@
1
1
  # @vultisig/core-chain
2
2
 
3
+ ## 2.6.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [#584](https://github.com/vultisig/vultisig-sdk/pull/584) [`a13c644`](https://github.com/vultisig/vultisig-sdk/commit/a13c644be796a7bf10dc0ab426ac888b9e962585) Thanks [@gomesalexandre](https://github.com/gomesalexandre)! - feat(cowswap): add CowSwap RFQ as swap provider for same-chain EVM trades (phase 1 sdk scaffold)
8
+
9
+ New `cowswap` module under `packages/core/chain/swap/general/cowswap/`:
10
+ - `config.ts` - chain configs (Ethereum, Arbitrum, Base, Avalanche), static EIP-2612 permit allowlist, app code / affiliate constants
11
+ - `types.ts` - CowSwap API response types
12
+ - `sign/buildCowSwapOrder.ts` - builds the EIP-712 CowSwap order struct; exports `buildCowSwapAppData` and `keccak256Hex` (uses viem)
13
+ - `sign/buildEip712Domain.ts` - EIP-712 domain for GPv2 settlement contract
14
+ - `api/getCowSwapQuote.ts` - POSTs to `/api/v1/quote`, returns `GeneralSwapQuote` with new `cowswap_order` tx arm
15
+ - `api/submitCowSwapOrder.ts` - POSTs signed order to `/api/v1/orders`
16
+ - `api/getCowSwapOrderStatus.ts` - polls order status
17
+ - `permit/buildEip2612Permit.ts` - builds EIP-2612 permit typed data for permit-eligible sell tokens
18
+
19
+ `GeneralSwapTx` union extended with `cowswap_order` arm.
20
+ `GeneralSwapProvider` extended with `'cowswap'`.
21
+ CowSwap is intentionally NOT registered as a live `findSwapQuote` fetcher (nor in
22
+ `aggregatorPreferenceOrder`) in phase 1 — the consumer build/sign path is wired in phase 2.
23
+ All `matchRecordUnion` call-sites over `GeneralSwapTx` updated for exhaustiveness.
24
+
25
+ No live fetcher registration, no mcp-ts wiring, no app UI changes. Consumer (mcp-ts) is responsible for USD threshold gating in phase 2.
26
+
27
+ - [#584](https://github.com/vultisig/vultisig-sdk/pull/584) [`a13c644`](https://github.com/vultisig/vultisig-sdk/commit/a13c644be796a7bf10dc0ab426ac888b9e962585) Thanks [@gomesalexandre](https://github.com/gomesalexandre)! - ## New
28
+ - Polkadot Asset Hub USDT (asset_id 1984) + USDC (asset_id 1337) token registry ([#562](https://github.com/vultisig/vultisig-sdk/issues/562))
29
+ - Polkadot `pallet_assets.Account` balance resolver for Asset Hub tokens - replaces placeholder 0n guard ([#563](https://github.com/vultisig/vultisig-sdk/issues/563))
30
+ - Tron native send `data` field (proto field 12) for THORChain memos + exchange deposit memos; `BuildTronSendOptions` and `BuildTrc20TransferOptions` gain optional `data?: Uint8Array` field ([#559](https://github.com/vultisig/vultisig-sdk/issues/559))
31
+
32
+ ## Fixed
33
+ - Tron TRC-20 fee estimate now subtracts sender's available energy before charging TRX ([#556](https://github.com/vultisig/vultisig-sdk/issues/556))
34
+ - Tron native send free bandwidth check prevents spurious fee charge when bandwidth is available ([#555](https://github.com/vultisig/vultisig-sdk/issues/555))
35
+
36
+ ### Patch Changes
37
+
38
+ - [#602](https://github.com/vultisig/vultisig-sdk/pull/602) [`5bb56a4`](https://github.com/vultisig/vultisig-sdk/commit/5bb56a4daba8b896626c54fabd94fd6c9a35320e) Thanks [@gomesalexandre](https://github.com/gomesalexandre)! - `getCosmosAccountInfo` now retries against a registered fallback LCD when the primary endpoint fails. Without this, a single-provider degradation (e.g. `terra-classic-lcd.publicnode.com` outage on 2026-05-28) hard-failed every cosmos signing surface that touches this code path — there was no recovery.
39
+
40
+ Fallback URLs per chain (Polkachu mirrors where available; Hexxagon for `TerraClassic` since polkachu has no Terra Classic endpoint, verified 2026-05-28). Chains not in the map preserve fail-closed behaviour.
41
+
42
+ Parallel to vultiagent-app#1017 (app-side fix) + mcp-ts#266 (mcp-side fix).
43
+
44
+ - [#592](https://github.com/vultisig/vultisig-sdk/pull/592) [`c4b4560`](https://github.com/vultisig/vultisig-sdk/commit/c4b45604f043700068aaf1c3c1a1ecad5c8a874f) Thanks [@gomesalexandre](https://github.com/gomesalexandre)! - lifi: tighten slippage to 0.3% for stablecoin pairs (USDC/USDT/DAI/...), keep 1% for volatile pairs
45
+
46
+ - [#596](https://github.com/vultisig/vultisig-sdk/pull/596) [`880cde0`](https://github.com/vultisig/vultisig-sdk/commit/880cde00a5978e8a4dff2cf8adb627059e4af5bf) Thanks [@gomesalexandre](https://github.com/gomesalexandre)! - Remove i18next dependency from `getNativeSwapQuote` — the lone `t()` call was the only i18next usage in the entire chain package, and consuming apps that don't initialize i18next (or initialize it without a Backend plugin) crash with `Cannot read property 'reload' of undefined` whenever code touches the SDK swap path. Replaced with a plain English fallback string. Drops i18next from `dependencies`.
47
+
48
+ - [#593](https://github.com/vultisig/vultisig-sdk/pull/593) [`5d11cf3`](https://github.com/vultisig/vultisig-sdk/commit/5d11cf3bfb81aba929fe8e81bb77e7aebff15129) Thanks [@gomesalexandre](https://github.com/gomesalexandre)! - refactor(swap): typed SwapError class with stable codes at findSwapQuote throw sites - enables instanceof checks instead of message string matching
49
+
50
+ ## 2.5.0
51
+
52
+ ### Minor Changes
53
+
54
+ - [#587](https://github.com/vultisig/vultisig-sdk/pull/587) [`8932aff`](https://github.com/vultisig/vultisig-sdk/commit/8932afffbdd57112b9b8e59ac2e909e1654f54a3) Thanks [@gomesalexandre](https://github.com/gomesalexandre)! - ## Added
55
+ - `resolveTokenPriceId(chain, denomOrAddress?)` helper in `@vultisig/core-chain/coin/price/resolveTokenPriceId` - pure synchronous lookup against the SDK's curated registry (`chainFeeCoin` + `knownTokensIndex`) that returns a CoinGecko priceProviderId for a chain's native coin or a known token by address/denom. Returns `undefined` when no registry entry exists so callers can fall back to other resolution paths. Phase 1 of registry-driven cross-chain price resolution (refs vultisig/mcp-ts#255).
56
+
57
+ ### Patch Changes
58
+
59
+ - [#591](https://github.com/vultisig/vultisig-sdk/pull/591) [`88cd323`](https://github.com/vultisig/vultisig-sdk/commit/88cd3235ea463112d378d5e5a2c32aacabe08ab0) Thanks [@gomesalexandre](https://github.com/gomesalexandre)! - add 30s per-fetcher timeout guard to findSwapQuote — a hanging provider no longer stalls the whole allSettled fan-out
60
+
3
61
  ## 2.4.1
4
62
 
5
63
  ### Patch Changes
@@ -1 +1 @@
1
- {"version":3,"file":"getCosmosAccountInfo.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/chain/chains/cosmos/account/getCosmosAccountInfo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAA;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAA;AAsEhE,eAAO,MAAM,oBAAoB,GAAU,oBAAoB,YAAY,CAAC,WAAW,CAAC;;;;;;EAgCvF,CAAA"}
1
+ {"version":3,"file":"getCosmosAccountInfo.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/chain/chains/cosmos/account/getCosmosAccountInfo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,WAAW,EAAE,MAAM,4BAA4B,CAAA;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAA;AAyGhE,eAAO,MAAM,oBAAoB,GAAU,oBAAoB,YAAY,CAAC,WAAW,CAAC;;;;;;EAgCvF,CAAA"}
@@ -1,3 +1,4 @@
1
+ import { Chain } from '@vultisig/core-chain/Chain';
1
2
  import { getCosmosClient } from '@vultisig/core-chain/chains/cosmos/client';
2
3
  import { cosmosRpcUrl } from '@vultisig/core-chain/chains/cosmos/cosmosRpcUrl';
3
4
  import { queryUrl } from '@vultisig/lib-utils/query/queryUrl';
@@ -23,19 +24,54 @@ const parseLcdAccount = (resp) => {
23
24
  // LCD uses a different infra path (REST vs Tendermint RPC), supports
24
25
  // extended account types (vesting, module wrappers) via JSON shape parsing,
25
26
  // and gives us a second chance before we ship a doomed tx.
26
- const fetchAccountViaLcd = async (chain, address) => {
27
- const base = cosmosRpcUrl[chain];
28
- if (!base)
29
- return null;
27
+ //
28
+ // SamYap timeout report (vultiagent-app#1017, 2026-05-28): the primary LCD
29
+ // for Terra Classic (terra-classic-lcd.publicnode.com) was degraded for
30
+ // hours, causing every cosmos signing surface that touches this code path
31
+ // to hard-fail. The single-URL design had no recovery. Add a fallback URL
32
+ // per chain so a publicnode degradation doesn't take out signing entirely.
33
+ //
34
+ // Polkachu mirrors per cosmos chain. Hexxagon for columbus-5 since polkachu
35
+ // has no Terra Classic endpoint (verified 2026-05-28 — see
36
+ // vultiagent-app#1017 + mcp-ts#266). Keys are the chain id used by
37
+ // cosmos-sdk; chains not in this map have no fallback (degrade fail-closed
38
+ // behaviour preserved).
39
+ const COSMOS_LCD_FALLBACK_URLS = {
40
+ [Chain.Cosmos]: 'https://cosmos-api.polkachu.com',
41
+ [Chain.Osmosis]: 'https://osmosis-api.polkachu.com',
42
+ [Chain.Kujira]: 'https://kujira-api.polkachu.com',
43
+ [Chain.Terra]: 'https://terra-api.polkachu.com',
44
+ [Chain.TerraClassic]: 'https://lcd.terra-classic.hexxagon.io',
45
+ [Chain.THORChain]: 'https://thorchain-api.polkachu.com',
46
+ [Chain.Noble]: 'https://noble-api.polkachu.com',
47
+ [Chain.Dydx]: 'https://dydx-api.polkachu.com',
48
+ [Chain.Akash]: 'https://akash-api.polkachu.com',
49
+ };
50
+ const tryLcd = async (base, address) => {
30
51
  try {
31
52
  const resp = await queryUrl(`${base}/cosmos/auth/v1beta1/accounts/${address}`);
32
53
  return parseLcdAccount(resp);
33
54
  }
34
55
  catch {
35
- // 404 (account not found) or transient LCD error — caller decides.
36
56
  return null;
37
57
  }
38
58
  };
59
+ const fetchAccountViaLcd = async (chain, address) => {
60
+ const base = cosmosRpcUrl[chain];
61
+ if (!base)
62
+ return null;
63
+ const primary = await tryLcd(base, address);
64
+ if (primary)
65
+ return primary;
66
+ // Primary failed (network / 5xx / shape mismatch). Try the registered
67
+ // fallback for this chain. Both-failed surfaces as null and the caller
68
+ // ships with sequence:0 default — same legacy behaviour, but only after
69
+ // we've actually exhausted both endpoints.
70
+ const fallback = COSMOS_LCD_FALLBACK_URLS[chain];
71
+ if (!fallback)
72
+ return null;
73
+ return tryLcd(fallback, address);
74
+ };
39
75
  export const getCosmosAccountInfo = async ({ chain, address }) => {
40
76
  const client = await getCosmosClient(chain);
41
77
  const [accountInfo, block] = await Promise.all([client.getAccount(address), client.getBlock()]);
@@ -1 +1 @@
1
- {"version":3,"file":"getCosmosAccountInfo.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/chains/cosmos/account/getCosmosAccountInfo.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"getCosmosAccountInfo.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/chains/cosmos/account/getCosmosAccountInfo.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { Chain } from '../../Chain.js';
2
+ /**
3
+ * Resolve a token's CoinGecko price-provider id from the SDK's curated
4
+ * registry. Pure synchronous lookup, no I/O.
5
+ *
6
+ * - When `denomOrAddress` is omitted, empty, or whitespace-only, returns the
7
+ * native chain coin's priceProviderId from chainFeeCoin (e.g.
8
+ * resolveTokenPriceId('Ethereum') -> 'ethereum').
9
+ * - When `denomOrAddress` is provided, it is trimmed and lowercased, then
10
+ * looked up in knownTokensIndex[chain]. The lookup is case-insensitive (the
11
+ * index stores all keys lowercased) and tolerant of incidental surrounding
12
+ * whitespace from upstream string sources. Note: lowercasing is locale-
13
+ * independent (String.prototype.toLowerCase, not toLocaleLowerCase) and the
14
+ * index keys are built with the same call, so the build/lookup casing is
15
+ * always symmetric.
16
+ *
17
+ * Returns `undefined` if no registry entry exists — never guesses or
18
+ * fabricates an id. The caller decides whether to fall back to CoinGecko
19
+ * search, DeFiLlama, or surface a `price_unavailable` to the user.
20
+ *
21
+ * Referenced by vultisig/mcp-ts#255 — registry-driven price resolution.
22
+ */
23
+ export declare function resolveTokenPriceId(chain: Chain, denomOrAddress?: string): string | undefined;
24
+ //# sourceMappingURL=resolveTokenPriceId.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolveTokenPriceId.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/chain/coin/price/resolveTokenPriceId.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAIxC;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,KAAK,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAM7F"}
@@ -0,0 +1,31 @@
1
+ import { chainFeeCoin } from '../chainFeeCoin.js';
2
+ import { knownTokensIndex } from '../knownTokens/index.js';
3
+ /**
4
+ * Resolve a token's CoinGecko price-provider id from the SDK's curated
5
+ * registry. Pure synchronous lookup, no I/O.
6
+ *
7
+ * - When `denomOrAddress` is omitted, empty, or whitespace-only, returns the
8
+ * native chain coin's priceProviderId from chainFeeCoin (e.g.
9
+ * resolveTokenPriceId('Ethereum') -> 'ethereum').
10
+ * - When `denomOrAddress` is provided, it is trimmed and lowercased, then
11
+ * looked up in knownTokensIndex[chain]. The lookup is case-insensitive (the
12
+ * index stores all keys lowercased) and tolerant of incidental surrounding
13
+ * whitespace from upstream string sources. Note: lowercasing is locale-
14
+ * independent (String.prototype.toLowerCase, not toLocaleLowerCase) and the
15
+ * index keys are built with the same call, so the build/lookup casing is
16
+ * always symmetric.
17
+ *
18
+ * Returns `undefined` if no registry entry exists — never guesses or
19
+ * fabricates an id. The caller decides whether to fall back to CoinGecko
20
+ * search, DeFiLlama, or surface a `price_unavailable` to the user.
21
+ *
22
+ * Referenced by vultisig/mcp-ts#255 — registry-driven price resolution.
23
+ */
24
+ export function resolveTokenPriceId(chain, denomOrAddress) {
25
+ const normalized = denomOrAddress?.trim().toLowerCase();
26
+ if (!normalized) {
27
+ return chainFeeCoin[chain]?.priceProviderId || undefined;
28
+ }
29
+ return knownTokensIndex[chain]?.[normalized]?.priceProviderId || undefined;
30
+ }
31
+ //# sourceMappingURL=resolveTokenPriceId.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolveTokenPriceId.js","sourceRoot":"","sources":["../../../../../../packages/core/chain/coin/price/resolveTokenPriceId.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAEjD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAY,EAAE,cAAuB;IACvE,MAAM,UAAU,GAAG,cAAc,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;IACvD,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,YAAY,CAAC,KAAK,CAAC,EAAE,eAAe,IAAI,SAAS,CAAA;IAC1D,CAAC;IACD,OAAO,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,eAAe,IAAI,SAAS,CAAA;AAC5E,CAAC"}
@@ -1,4 +1,5 @@
1
- export declare class NoSwapRoutesError extends Error {
1
+ import { SwapError } from './SwapError.js';
2
+ export declare class NoSwapRoutesError extends SwapError {
2
3
  constructor();
3
4
  }
4
5
  //# sourceMappingURL=NoSwapRoutesError.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"NoSwapRoutesError.d.ts","sourceRoot":"","sources":["../../../../../packages/core/chain/swap/NoSwapRoutesError.ts"],"names":[],"mappings":"AAAA,qBAAa,iBAAkB,SAAQ,KAAK;;CAI3C"}
1
+ {"version":3,"file":"NoSwapRoutesError.d.ts","sourceRoot":"","sources":["../../../../../packages/core/chain/swap/NoSwapRoutesError.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAiB,MAAM,aAAa,CAAA;AAEtD,qBAAa,iBAAkB,SAAQ,SAAS;;CAI/C"}
@@ -1,6 +1,7 @@
1
- export class NoSwapRoutesError extends Error {
1
+ import { SwapError, SwapErrorCode } from './SwapError.js';
2
+ export class NoSwapRoutesError extends SwapError {
2
3
  constructor() {
3
- super(`No swap routes found.`);
4
+ super(SwapErrorCode.NoRoutesFound, `No swap routes found.`);
4
5
  }
5
6
  }
6
7
  //# sourceMappingURL=NoSwapRoutesError.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"NoSwapRoutesError.js","sourceRoot":"","sources":["../../../../../packages/core/chain/swap/NoSwapRoutesError.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IAC1C;QACE,KAAK,CAAC,uBAAuB,CAAC,CAAA;IAChC,CAAC;CACF"}
1
+ {"version":3,"file":"NoSwapRoutesError.js","sourceRoot":"","sources":["../../../../../packages/core/chain/swap/NoSwapRoutesError.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAEtD,MAAM,OAAO,iBAAkB,SAAQ,SAAS;IAC9C;QACE,KAAK,CAAC,aAAa,CAAC,aAAa,EAAE,uBAAuB,CAAC,CAAA;IAC7D,CAAC;CACF"}
@@ -0,0 +1,18 @@
1
+ export declare enum SwapErrorCode {
2
+ /** No swap provider supports this chain pair - swap cannot be attempted at all */
3
+ NoRoutesFound = "SWAP_NO_ROUTES_FOUND",
4
+ /** Amount is below the dust threshold of one or more providers */
5
+ AmountTooSmall = "SWAP_AMOUNT_TOO_SMALL",
6
+ /** Amount is below a provider's minimum but above dust - provider surfaced an explicit min */
7
+ AmountBelowMinimum = "SWAP_AMOUNT_BELOW_MINIMUM",
8
+ /** All configured providers were attempted and all failed */
9
+ AllProvidersFailed = "SWAP_ALL_PROVIDERS_FAILED",
10
+ /** Caller passed invalid configuration (e.g. mixed-case THORName affiliateFeeAddress) */
11
+ InvalidConfig = "SWAP_INVALID_CONFIG"
12
+ }
13
+ export declare class SwapError extends Error {
14
+ readonly code: SwapErrorCode;
15
+ readonly name = "SwapError";
16
+ constructor(code: SwapErrorCode, message: string);
17
+ }
18
+ //# sourceMappingURL=SwapError.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SwapError.d.ts","sourceRoot":"","sources":["../../../../../packages/core/chain/swap/SwapError.ts"],"names":[],"mappings":"AAAA,oBAAY,aAAa;IACvB,kFAAkF;IAClF,aAAa,yBAAyB;IACtC,kEAAkE;IAClE,cAAc,0BAA0B;IACxC,8FAA8F;IAC9F,kBAAkB,8BAA8B;IAChD,6DAA6D;IAC7D,kBAAkB,8BAA8B;IAChD,yFAAyF;IACzF,aAAa,wBAAwB;CACtC;AAED,qBAAa,SAAU,SAAQ,KAAK;aAIhB,IAAI,EAAE,aAAa;IAHrC,QAAQ,CAAC,IAAI,eAAc;gBAGT,IAAI,EAAE,aAAa,EACnC,OAAO,EAAE,MAAM;CAIlB"}
@@ -0,0 +1,22 @@
1
+ export var SwapErrorCode;
2
+ (function (SwapErrorCode) {
3
+ /** No swap provider supports this chain pair - swap cannot be attempted at all */
4
+ SwapErrorCode["NoRoutesFound"] = "SWAP_NO_ROUTES_FOUND";
5
+ /** Amount is below the dust threshold of one or more providers */
6
+ SwapErrorCode["AmountTooSmall"] = "SWAP_AMOUNT_TOO_SMALL";
7
+ /** Amount is below a provider's minimum but above dust - provider surfaced an explicit min */
8
+ SwapErrorCode["AmountBelowMinimum"] = "SWAP_AMOUNT_BELOW_MINIMUM";
9
+ /** All configured providers were attempted and all failed */
10
+ SwapErrorCode["AllProvidersFailed"] = "SWAP_ALL_PROVIDERS_FAILED";
11
+ /** Caller passed invalid configuration (e.g. mixed-case THORName affiliateFeeAddress) */
12
+ SwapErrorCode["InvalidConfig"] = "SWAP_INVALID_CONFIG";
13
+ })(SwapErrorCode || (SwapErrorCode = {}));
14
+ export class SwapError extends Error {
15
+ code;
16
+ name = 'SwapError';
17
+ constructor(code, message) {
18
+ super(message);
19
+ this.code = code;
20
+ }
21
+ }
22
+ //# sourceMappingURL=SwapError.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SwapError.js","sourceRoot":"","sources":["../../../../../packages/core/chain/swap/SwapError.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,aAWX;AAXD,WAAY,aAAa;IACvB,kFAAkF;IAClF,uDAAsC,CAAA;IACtC,kEAAkE;IAClE,yDAAwC,CAAA;IACxC,8FAA8F;IAC9F,iEAAgD,CAAA;IAChD,6DAA6D;IAC7D,iEAAgD,CAAA;IAChD,yFAAyF;IACzF,sDAAqC,CAAA;AACvC,CAAC,EAXW,aAAa,KAAb,aAAa,QAWxB;AAED,MAAM,OAAO,SAAU,SAAQ,KAAK;IAIhB;IAHT,IAAI,GAAG,WAAW,CAAA;IAE3B,YACkB,IAAmB,EACnC,OAAe;QAEf,KAAK,CAAC,OAAO,CAAC,CAAA;QAHE,SAAI,GAAJ,IAAI,CAAe;IAIrC,CAAC;CACF"}
@@ -1,4 +1,4 @@
1
- export declare const generalSwapProviders: readonly ["1inch", "li.fi", "kyber", "swapkit"];
1
+ export declare const generalSwapProviders: readonly ["1inch", "li.fi", "kyber", "swapkit", "cowswap"];
2
2
  export type GeneralSwapProvider = (typeof generalSwapProviders)[number];
3
3
  export declare const generalSwapProviderName: Record<GeneralSwapProvider, string>;
4
4
  //# sourceMappingURL=GeneralSwapProvider.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"GeneralSwapProvider.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/chain/swap/general/GeneralSwapProvider.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,oBAAoB,iDAAkD,CAAA;AAEnF,MAAM,MAAM,mBAAmB,GAAG,CAAC,OAAO,oBAAoB,CAAC,CAAC,MAAM,CAAC,CAAA;AAEvE,eAAO,MAAM,uBAAuB,EAAE,MAAM,CAAC,mBAAmB,EAAE,MAAM,CAKvE,CAAA"}
1
+ {"version":3,"file":"GeneralSwapProvider.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/chain/swap/general/GeneralSwapProvider.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,oBAAoB,4DAA6D,CAAA;AAE9F,MAAM,MAAM,mBAAmB,GAAG,CAAC,OAAO,oBAAoB,CAAC,CAAC,MAAM,CAAC,CAAA;AAEvE,eAAO,MAAM,uBAAuB,EAAE,MAAM,CAAC,mBAAmB,EAAE,MAAM,CAMvE,CAAA"}
@@ -1,8 +1,9 @@
1
- export const generalSwapProviders = ['1inch', 'li.fi', 'kyber', 'swapkit'];
1
+ export const generalSwapProviders = ['1inch', 'li.fi', 'kyber', 'swapkit', 'cowswap'];
2
2
  export const generalSwapProviderName = {
3
3
  '1inch': '1Inch',
4
4
  'li.fi': 'LI.FI',
5
5
  kyber: 'KyberSwap',
6
6
  swapkit: 'SwapKit',
7
+ cowswap: 'CowSwap',
7
8
  };
8
9
  //# sourceMappingURL=GeneralSwapProvider.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"GeneralSwapProvider.js","sourceRoot":"","sources":["../../../../../../packages/core/chain/swap/general/GeneralSwapProvider.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,CAAU,CAAA;AAInF,MAAM,CAAC,MAAM,uBAAuB,GAAwC;IAC1E,OAAO,EAAE,OAAO;IAChB,OAAO,EAAE,OAAO;IAChB,KAAK,EAAE,WAAW;IAClB,OAAO,EAAE,SAAS;CACnB,CAAA"}
1
+ {"version":3,"file":"GeneralSwapProvider.js","sourceRoot":"","sources":["../../../../../../packages/core/chain/swap/general/GeneralSwapProvider.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,CAAU,CAAA;AAI9F,MAAM,CAAC,MAAM,uBAAuB,GAAwC;IAC1E,OAAO,EAAE,OAAO;IAChB,OAAO,EAAE,OAAO;IAChB,KAAK,EAAE,WAAW;IAClB,OAAO,EAAE,SAAS;IAClB,OAAO,EAAE,SAAS;CACnB,CAAA"}
@@ -1,4 +1,6 @@
1
1
  import { SwapFee } from '@vultisig/core-chain/swap/SwapFee';
2
+ import { CowSwapTokenBalance } from './cowswap/sign/buildCowSwapOrder.js';
3
+ import { CowSwapOrderKind } from './cowswap/types.js';
2
4
  import { GeneralSwapProvider } from './GeneralSwapProvider.js';
3
5
  export type GeneralSwapTx = {
4
6
  evm: {
@@ -25,6 +27,28 @@ export type GeneralSwapTx = {
25
27
  inboundAddress?: string;
26
28
  swapId?: string;
27
29
  };
30
+ } | {
31
+ cowswap_order: {
32
+ sellToken: string;
33
+ buyToken: string;
34
+ receiver: string;
35
+ sellAmount: string;
36
+ buyAmount: string;
37
+ validTo: number;
38
+ appData: string;
39
+ appDataHash: string;
40
+ feeAmount: string;
41
+ kind: CowSwapOrderKind;
42
+ partiallyFillable: boolean;
43
+ sellTokenBalance: CowSwapTokenBalance;
44
+ buyTokenBalance: CowSwapTokenBalance;
45
+ chainId: number;
46
+ apiBase: string;
47
+ /** Set to true when the sellToken supports EIP-2612 permit. When true
48
+ * the signing flow should build and include a permit signature alongside
49
+ * the order signature, avoiding a separate ERC-20 approve transaction. */
50
+ permitRequired?: true;
51
+ };
28
52
  };
29
53
  export type GeneralSwapQuote = {
30
54
  dstAmount: string;
@@ -1 +1 @@
1
- {"version":3,"file":"GeneralSwapQuote.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/chain/swap/general/GeneralSwapQuote.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,mCAAmC,CAAA;AAE3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAE3D,MAAM,MAAM,aAAa,GACrB;IACE,GAAG,EAAE;QACH,IAAI,EAAE,MAAM,CAAA;QACZ,EAAE,EAAE,MAAM,CAAA;QACV,IAAI,EAAE,MAAM,CAAA;QACZ,KAAK,EAAE,MAAM,CAAA;QACb,QAAQ,CAAC,EAAE,MAAM,CAAA;QACjB,YAAY,CAAC,EAAE,OAAO,CAAA;KACvB,CAAA;CACF,GACD;IACE,MAAM,EAAE;QACN,IAAI,EAAE,MAAM,CAAA;QACZ,UAAU,EAAE,MAAM,CAAA;QAClB,OAAO,EAAE,OAAO,CAAA;KACjB,CAAA;CACF,GACD;IACE,QAAQ,EAAE;QACR,EAAE,EAAE,MAAM,CAAA;QACV,MAAM,EAAE,MAAM,CAAA;QACd,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,SAAS,CAAC,EAAE,UAAU,CAAA;QACtB,cAAc,CAAC,EAAE,MAAM,CAAA;QACvB,MAAM,CAAC,EAAE,MAAM,CAAA;KAChB,CAAA;CACF,CAAA;AAEL,MAAM,MAAM,gBAAgB,GAAG;IAC7B,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,mBAAmB,CAAA;IAC7B,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,EAAE,EAAE,aAAa,CAAA;CAClB,CAAA"}
1
+ {"version":3,"file":"GeneralSwapQuote.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/chain/swap/general/GeneralSwapQuote.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,mCAAmC,CAAA;AAE3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAA;AACtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAE3D,MAAM,MAAM,aAAa,GACrB;IACE,GAAG,EAAE;QACH,IAAI,EAAE,MAAM,CAAA;QACZ,EAAE,EAAE,MAAM,CAAA;QACV,IAAI,EAAE,MAAM,CAAA;QACZ,KAAK,EAAE,MAAM,CAAA;QACb,QAAQ,CAAC,EAAE,MAAM,CAAA;QACjB,YAAY,CAAC,EAAE,OAAO,CAAA;KACvB,CAAA;CACF,GACD;IACE,MAAM,EAAE;QACN,IAAI,EAAE,MAAM,CAAA;QACZ,UAAU,EAAE,MAAM,CAAA;QAClB,OAAO,EAAE,OAAO,CAAA;KACjB,CAAA;CACF,GACD;IACE,QAAQ,EAAE;QACR,EAAE,EAAE,MAAM,CAAA;QACV,MAAM,EAAE,MAAM,CAAA;QACd,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,SAAS,CAAC,EAAE,UAAU,CAAA;QACtB,cAAc,CAAC,EAAE,MAAM,CAAA;QACvB,MAAM,CAAC,EAAE,MAAM,CAAA;KAChB,CAAA;CACF,GACD;IACE,aAAa,EAAE;QACb,SAAS,EAAE,MAAM,CAAA;QACjB,QAAQ,EAAE,MAAM,CAAA;QAChB,QAAQ,EAAE,MAAM,CAAA;QAChB,UAAU,EAAE,MAAM,CAAA;QAClB,SAAS,EAAE,MAAM,CAAA;QACjB,OAAO,EAAE,MAAM,CAAA;QACf,OAAO,EAAE,MAAM,CAAA;QACf,WAAW,EAAE,MAAM,CAAA;QACnB,SAAS,EAAE,MAAM,CAAA;QACjB,IAAI,EAAE,gBAAgB,CAAA;QACtB,iBAAiB,EAAE,OAAO,CAAA;QAC1B,gBAAgB,EAAE,mBAAmB,CAAA;QACrC,eAAe,EAAE,mBAAmB,CAAA;QACpC,OAAO,EAAE,MAAM,CAAA;QACf,OAAO,EAAE,MAAM,CAAA;QACf;;kFAE0E;QAC1E,cAAc,CAAC,EAAE,IAAI,CAAA;KACtB,CAAA;CACF,CAAA;AAEL,MAAM,MAAM,gBAAgB,GAAG;IAC7B,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,mBAAmB,CAAA;IAC7B,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,EAAE,EAAE,aAAa,CAAA;CAClB,CAAA"}
@@ -0,0 +1,9 @@
1
+ import { CowSwapOrderStatusResponse } from '../types.js';
2
+ type GetCowSwapOrderStatusInput = {
3
+ apiBase: string;
4
+ uid: string;
5
+ };
6
+ /** GET /api/v1/orders/{uid} — poll order status. */
7
+ export declare function getCowSwapOrderStatus({ apiBase, uid, }: GetCowSwapOrderStatusInput): Promise<CowSwapOrderStatusResponse>;
8
+ export {};
9
+ //# sourceMappingURL=getCowSwapOrderStatus.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getCowSwapOrderStatus.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/chain/swap/general/cowswap/api/getCowSwapOrderStatus.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,0BAA0B,EAAE,MAAM,UAAU,CAAA;AAErD,KAAK,0BAA0B,GAAG;IAChC,OAAO,EAAE,MAAM,CAAA;IACf,GAAG,EAAE,MAAM,CAAA;CACZ,CAAA;AAED,oDAAoD;AACpD,wBAAsB,qBAAqB,CAAC,EAC1C,OAAO,EACP,GAAG,GACJ,EAAE,0BAA0B,GAAG,OAAO,CAAC,0BAA0B,CAAC,CAUlE"}
@@ -0,0 +1,11 @@
1
+ import { queryUrl } from '@vultisig/lib-utils/query/queryUrl';
2
+ /** GET /api/v1/orders/{uid} — poll order status. */
3
+ export async function getCowSwapOrderStatus({ apiBase, uid, }) {
4
+ const raw = await queryUrl(`${apiBase}/api/v1/orders/${uid}`);
5
+ return {
6
+ status: raw.status,
7
+ txHash: raw.txHash,
8
+ executedBuyAmount: raw.executedBuyAmount,
9
+ };
10
+ }
11
+ //# sourceMappingURL=getCowSwapOrderStatus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getCowSwapOrderStatus.js","sourceRoot":"","sources":["../../../../../../../../packages/core/chain/swap/general/cowswap/api/getCowSwapOrderStatus.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAA;AAS7D,oDAAoD;AACpD,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,EAC1C,OAAO,EACP,GAAG,GACwB;IAC3B,MAAM,GAAG,GAAG,MAAM,QAAQ,CACxB,GAAG,OAAO,kBAAkB,GAAG,EAAE,CAClC,CAAA;IAED,OAAO;QACL,MAAM,EAAE,GAAG,CAAC,MAA8C;QAC1D,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,iBAAiB,EAAE,GAAG,CAAC,iBAAiB;KACzC,CAAA;AACH,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { GeneralSwapQuote } from '../../GeneralSwapQuote.js';
2
+ import { CowSwapChainConfig } from '../config.js';
3
+ type GetCowSwapQuoteInput = {
4
+ sellToken: string;
5
+ buyToken: string;
6
+ sellAmount: bigint;
7
+ from: string;
8
+ receiver: string;
9
+ chainConfig: CowSwapChainConfig;
10
+ affiliateBps?: number;
11
+ };
12
+ export declare function getCowSwapQuote({ sellToken, buyToken, sellAmount, from, receiver, chainConfig, affiliateBps, }: GetCowSwapQuoteInput): Promise<GeneralSwapQuote>;
13
+ export {};
14
+ //# sourceMappingURL=getCowSwapQuote.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getCowSwapQuote.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/chain/swap/general/cowswap/api/getCowSwapQuote.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AACzD,OAAO,EAGL,kBAAkB,EAEnB,MAAM,WAAW,CAAA;AAiBlB,KAAK,oBAAoB,GAAG;IAC1B,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;IAChB,WAAW,EAAE,kBAAkB,CAAA;IAC/B,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB,CAAA;AAED,wBAAsB,eAAe,CAAC,EACpC,SAAS,EACT,QAAQ,EACR,UAAU,EACV,IAAI,EACJ,QAAQ,EACR,WAAW,EACX,YAAY,GACb,EAAE,oBAAoB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAqDlD"}
@@ -0,0 +1,51 @@
1
+ import { queryUrl } from '@vultisig/lib-utils/query/queryUrl';
2
+ import { COWSWAP_DEFAULT_AFFILIATE_BPS, COWSWAP_FEE_RECIPIENT, KNOWN_PERMIT_TOKENS, } from '../config.js';
3
+ import { buildCowSwapAppData, keccak256Hex } from '../sign/buildCowSwapOrder.js';
4
+ export async function getCowSwapQuote({ sellToken, buyToken, sellAmount, from, receiver, chainConfig, affiliateBps, }) {
5
+ const bps = affiliateBps ?? COWSWAP_DEFAULT_AFFILIATE_BPS;
6
+ const appData = buildCowSwapAppData(bps, COWSWAP_FEE_RECIPIENT);
7
+ const appDataHash = keccak256Hex(appData);
8
+ const body = {
9
+ sellToken: sellToken.toLowerCase(),
10
+ buyToken: buyToken.toLowerCase(),
11
+ sellAmountBeforeFee: sellAmount.toString(),
12
+ from: from.toLowerCase(),
13
+ receiver: receiver.toLowerCase(),
14
+ kind: 'sell',
15
+ signingScheme: 'eip712',
16
+ partiallyFillable: false,
17
+ appData,
18
+ appDataHash,
19
+ };
20
+ const response = await queryUrl(`${chainConfig.apiBase}/api/v1/quote`, {
21
+ method: 'POST',
22
+ body,
23
+ });
24
+ const { quote } = response;
25
+ const permitRequired = KNOWN_PERMIT_TOKENS[chainConfig.chainId]?.some(addr => addr.toLowerCase() === sellToken.toLowerCase());
26
+ return {
27
+ dstAmount: quote.buyAmount,
28
+ provider: 'cowswap',
29
+ tx: {
30
+ cowswap_order: {
31
+ sellToken: quote.sellToken,
32
+ buyToken: quote.buyToken,
33
+ receiver,
34
+ sellAmount: quote.sellAmount,
35
+ buyAmount: quote.buyAmount,
36
+ validTo: quote.validTo,
37
+ appData,
38
+ appDataHash,
39
+ feeAmount: quote.feeAmount,
40
+ kind: quote.kind,
41
+ partiallyFillable: quote.partiallyFillable,
42
+ sellTokenBalance: 'erc20',
43
+ buyTokenBalance: 'erc20',
44
+ chainId: chainConfig.chainId,
45
+ apiBase: chainConfig.apiBase,
46
+ ...(permitRequired ? { permitRequired: true } : {}),
47
+ },
48
+ },
49
+ };
50
+ }
51
+ //# sourceMappingURL=getCowSwapQuote.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getCowSwapQuote.js","sourceRoot":"","sources":["../../../../../../../../packages/core/chain/swap/general/cowswap/api/getCowSwapQuote.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAA;AAG7D,OAAO,EACL,6BAA6B,EAC7B,qBAAqB,EAErB,mBAAmB,GACpB,MAAM,WAAW,CAAA;AAClB,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AA0B7E,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,EACpC,SAAS,EACT,QAAQ,EACR,UAAU,EACV,IAAI,EACJ,QAAQ,EACR,WAAW,EACX,YAAY,GACS;IACrB,MAAM,GAAG,GAAG,YAAY,IAAI,6BAA6B,CAAA;IACzD,MAAM,OAAO,GAAG,mBAAmB,CAAC,GAAG,EAAE,qBAAqB,CAAC,CAAA;IAC/D,MAAM,WAAW,GAAG,YAAY,CAAC,OAAO,CAAC,CAAA;IAEzC,MAAM,IAAI,GAAwB;QAChC,SAAS,EAAE,SAAS,CAAC,WAAW,EAAE;QAClC,QAAQ,EAAE,QAAQ,CAAC,WAAW,EAAE;QAChC,mBAAmB,EAAE,UAAU,CAAC,QAAQ,EAAE;QAC1C,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE;QACxB,QAAQ,EAAE,QAAQ,CAAC,WAAW,EAAE;QAChC,IAAI,EAAE,MAAM;QACZ,aAAa,EAAE,QAAQ;QACvB,iBAAiB,EAAE,KAAK;QACxB,OAAO;QACP,WAAW;KACZ,CAAA;IAED,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAA0B,GAAG,WAAW,CAAC,OAAO,eAAe,EAAE;QAC9F,MAAM,EAAE,MAAM;QACd,IAAI;KACL,CAAC,CAAA;IAEF,MAAM,EAAE,KAAK,EAAE,GAAG,QAAQ,CAAA;IAE1B,MAAM,cAAc,GAAG,mBAAmB,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,IAAI,CACnE,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,SAAS,CAAC,WAAW,EAAE,CACvD,CAAA;IAED,OAAO;QACL,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,QAAQ,EAAE,SAAS;QACnB,EAAE,EAAE;YACF,aAAa,EAAE;gBACb,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,QAAQ;gBACR,UAAU,EAAE,KAAK,CAAC,UAAU;gBAC5B,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,OAAO;gBACP,WAAW;gBACX,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,iBAAiB,EAAE,KAAK,CAAC,iBAAiB;gBAC1C,gBAAgB,EAAE,OAAO;gBACzB,eAAe,EAAE,OAAO;gBACxB,OAAO,EAAE,WAAW,CAAC,OAAO;gBAC5B,OAAO,EAAE,WAAW,CAAC,OAAO;gBAC5B,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACpD;SACF;KACF,CAAA;AACH,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { CowSwapOrder } from '../sign/buildCowSwapOrder.js';
2
+ type SubmitCowSwapOrderInput = {
3
+ apiBase: string;
4
+ order: CowSwapOrder;
5
+ signature: string;
6
+ from: string;
7
+ };
8
+ /** POST /api/v1/orders — submit a signed CowSwap order.
9
+ * Returns the orderUid assigned by the API. */
10
+ export declare function submitCowSwapOrder({ apiBase, order, signature, from, }: SubmitCowSwapOrderInput): Promise<string>;
11
+ export {};
12
+ //# sourceMappingURL=submitCowSwapOrder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"submitCowSwapOrder.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/chain/swap/general/cowswap/api/submitCowSwapOrder.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAExD,KAAK,uBAAuB,GAAG;IAC7B,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,YAAY,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAED;+CAC+C;AAC/C,wBAAsB,kBAAkB,CAAC,EACvC,OAAO,EACP,KAAK,EACL,SAAS,EACT,IAAI,GACL,EAAE,uBAAuB,GAAG,OAAO,CAAC,MAAM,CAAC,CAc3C"}
@@ -0,0 +1,17 @@
1
+ import { queryUrl } from '@vultisig/lib-utils/query/queryUrl';
2
+ /** POST /api/v1/orders — submit a signed CowSwap order.
3
+ * Returns the orderUid assigned by the API. */
4
+ export async function submitCowSwapOrder({ apiBase, order, signature, from, }) {
5
+ const body = {
6
+ ...order,
7
+ signature,
8
+ signingScheme: 'eip712',
9
+ from: from.toLowerCase(),
10
+ };
11
+ const orderUid = await queryUrl(`${apiBase}/api/v1/orders`, {
12
+ method: 'POST',
13
+ body,
14
+ });
15
+ return orderUid;
16
+ }
17
+ //# sourceMappingURL=submitCowSwapOrder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"submitCowSwapOrder.js","sourceRoot":"","sources":["../../../../../../../../packages/core/chain/swap/general/cowswap/api/submitCowSwapOrder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAA;AAW7D;+CAC+C;AAC/C,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,EACvC,OAAO,EACP,KAAK,EACL,SAAS,EACT,IAAI,GACoB;IACxB,MAAM,IAAI,GAAG;QACX,GAAG,KAAK;QACR,SAAS;QACT,aAAa,EAAE,QAAQ;QACvB,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE;KACzB,CAAA;IAED,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAS,GAAG,OAAO,gBAAgB,EAAE;QAClE,MAAM,EAAE,MAAM;QACd,IAAI;KACL,CAAC,CAAA;IAEF,OAAO,QAAQ,CAAA;AACjB,CAAC"}
@@ -0,0 +1,18 @@
1
+ export declare const cowSwapSupportedChains: readonly ["Ethereum", "Arbitrum", "Base", "Avalanche"];
2
+ export type CowSwapSupportedChain = (typeof cowSwapSupportedChains)[number];
3
+ export declare const COW_SETTLEMENT_ADDRESS = "0x9008D19f58AAbD9eD0D60971565AA8510560ab41";
4
+ export declare const COW_VAULT_RELAYER_ADDRESS = "0xC92E8bdf79f0507f65a392b0ab4667716BFE0110";
5
+ export type CowSwapChainConfig = {
6
+ apiBase: string;
7
+ settlementContract: string;
8
+ vaultRelayer: string;
9
+ chainId: number;
10
+ };
11
+ export declare const cowSwapChainConfig: Record<CowSwapSupportedChain, CowSwapChainConfig>;
12
+ export declare const KNOWN_PERMIT_TOKENS: Record<number, string[]>;
13
+ export declare const COWSWAP_APP_CODE = "vultisig";
14
+ export declare const COWSWAP_APP_VERSION = "0.1.0";
15
+ export declare const COWSWAP_DEFAULT_AFFILIATE_BPS = 50;
16
+ export declare const COWSWAP_FEE_RECIPIENT = "0x8E247a480449c84a5fDD25974A8501f3EFa4ABb9";
17
+ export declare const COWSWAP_VALID_TO_SECONDS: number;
18
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/chain/swap/general/cowswap/config.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,sBAAsB,wDAAqF,CAAA;AAExH,MAAM,MAAM,qBAAqB,GAAG,CAAC,OAAO,sBAAsB,CAAC,CAAC,MAAM,CAAC,CAAA;AAG3E,eAAO,MAAM,sBAAsB,+CAA+C,CAAA;AAClF,eAAO,MAAM,yBAAyB,+CAA+C,CAAA;AAErF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,OAAO,EAAE,MAAM,CAAA;IACf,kBAAkB,EAAE,MAAM,CAAA;IAC1B,YAAY,EAAE,MAAM,CAAA;IACpB,OAAO,EAAE,MAAM,CAAA;CAChB,CAAA;AAED,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,qBAAqB,EAAE,kBAAkB,CAyBhF,CAAA;AAqBD,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAqBxD,CAAA;AAED,eAAO,MAAM,gBAAgB,aAAa,CAAA;AAC1C,eAAO,MAAM,mBAAmB,UAAU,CAAA;AAK1C,eAAO,MAAM,6BAA6B,KAAK,CAAA;AAG/C,eAAO,MAAM,qBAAqB,+CAA+C,CAAA;AAGjF,eAAO,MAAM,wBAAwB,QAAU,CAAA"}