@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.
- package/CHANGELOG.md +58 -0
- package/dist/chains/cosmos/account/getCosmosAccountInfo.d.ts.map +1 -1
- package/dist/chains/cosmos/account/getCosmosAccountInfo.js +41 -5
- package/dist/chains/cosmos/account/getCosmosAccountInfo.js.map +1 -1
- package/dist/coin/price/resolveTokenPriceId.d.ts +24 -0
- package/dist/coin/price/resolveTokenPriceId.d.ts.map +1 -0
- package/dist/coin/price/resolveTokenPriceId.js +31 -0
- package/dist/coin/price/resolveTokenPriceId.js.map +1 -0
- package/dist/swap/NoSwapRoutesError.d.ts +2 -1
- package/dist/swap/NoSwapRoutesError.d.ts.map +1 -1
- package/dist/swap/NoSwapRoutesError.js +3 -2
- package/dist/swap/NoSwapRoutesError.js.map +1 -1
- package/dist/swap/SwapError.d.ts +18 -0
- package/dist/swap/SwapError.d.ts.map +1 -0
- package/dist/swap/SwapError.js +22 -0
- package/dist/swap/SwapError.js.map +1 -0
- package/dist/swap/general/GeneralSwapProvider.d.ts +1 -1
- package/dist/swap/general/GeneralSwapProvider.d.ts.map +1 -1
- package/dist/swap/general/GeneralSwapProvider.js +2 -1
- package/dist/swap/general/GeneralSwapProvider.js.map +1 -1
- package/dist/swap/general/GeneralSwapQuote.d.ts +24 -0
- package/dist/swap/general/GeneralSwapQuote.d.ts.map +1 -1
- package/dist/swap/general/cowswap/api/getCowSwapOrderStatus.d.ts +9 -0
- package/dist/swap/general/cowswap/api/getCowSwapOrderStatus.d.ts.map +1 -0
- package/dist/swap/general/cowswap/api/getCowSwapOrderStatus.js +11 -0
- package/dist/swap/general/cowswap/api/getCowSwapOrderStatus.js.map +1 -0
- package/dist/swap/general/cowswap/api/getCowSwapQuote.d.ts +14 -0
- package/dist/swap/general/cowswap/api/getCowSwapQuote.d.ts.map +1 -0
- package/dist/swap/general/cowswap/api/getCowSwapQuote.js +51 -0
- package/dist/swap/general/cowswap/api/getCowSwapQuote.js.map +1 -0
- package/dist/swap/general/cowswap/api/submitCowSwapOrder.d.ts +12 -0
- package/dist/swap/general/cowswap/api/submitCowSwapOrder.d.ts.map +1 -0
- package/dist/swap/general/cowswap/api/submitCowSwapOrder.js +17 -0
- package/dist/swap/general/cowswap/api/submitCowSwapOrder.js.map +1 -0
- package/dist/swap/general/cowswap/config.d.ts +18 -0
- package/dist/swap/general/cowswap/config.d.ts.map +1 -0
- package/dist/swap/general/cowswap/config.js +83 -0
- package/dist/swap/general/cowswap/config.js.map +1 -0
- package/dist/swap/general/cowswap/permit/buildEip2612Permit.d.ts +39 -0
- package/dist/swap/general/cowswap/permit/buildEip2612Permit.d.ts.map +1 -0
- package/dist/swap/general/cowswap/permit/buildEip2612Permit.js +32 -0
- package/dist/swap/general/cowswap/permit/buildEip2612Permit.js.map +1 -0
- package/dist/swap/general/cowswap/sign/buildCowSwapOrder.d.ts +31 -0
- package/dist/swap/general/cowswap/sign/buildCowSwapOrder.d.ts.map +1 -0
- package/dist/swap/general/cowswap/sign/buildCowSwapOrder.js +45 -0
- package/dist/swap/general/cowswap/sign/buildCowSwapOrder.js.map +1 -0
- package/dist/swap/general/cowswap/sign/buildEip712Domain.d.ts +9 -0
- package/dist/swap/general/cowswap/sign/buildEip712Domain.d.ts.map +1 -0
- package/dist/swap/general/cowswap/sign/buildEip712Domain.js +11 -0
- package/dist/swap/general/cowswap/sign/buildEip712Domain.js.map +1 -0
- package/dist/swap/general/cowswap/types.d.ts +31 -0
- package/dist/swap/general/cowswap/types.d.ts.map +1 -0
- package/dist/swap/general/cowswap/types.js +2 -0
- package/dist/swap/general/cowswap/types.js.map +1 -0
- package/dist/swap/general/lifi/api/getLifiSwapQuote.d.ts +11 -1
- package/dist/swap/general/lifi/api/getLifiSwapQuote.d.ts.map +1 -1
- package/dist/swap/general/lifi/api/getLifiSwapQuote.js +34 -2
- package/dist/swap/general/lifi/api/getLifiSwapQuote.js.map +1 -1
- package/dist/swap/keysign/getSwapDestinationAddress.d.ts.map +1 -1
- package/dist/swap/keysign/getSwapDestinationAddress.js +8 -0
- package/dist/swap/keysign/getSwapDestinationAddress.js.map +1 -1
- package/dist/swap/native/api/getNativeSwapQuote.d.ts.map +1 -1
- package/dist/swap/native/api/getNativeSwapQuote.js +1 -2
- package/dist/swap/native/api/getNativeSwapQuote.js.map +1 -1
- package/dist/swap/quote/findSwapQuote.d.ts +1 -1
- package/dist/swap/quote/findSwapQuote.d.ts.map +1 -1
- package/dist/swap/quote/findSwapQuote.js +35 -5
- package/dist/swap/quote/findSwapQuote.js.map +1 -1
- 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,
|
|
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
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
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":"
|
|
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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NoSwapRoutesError.d.ts","sourceRoot":"","sources":["../../../../../packages/core/chain/swap/NoSwapRoutesError.ts"],"names":[],"mappings":"AAAA,qBAAa,iBAAkB,SAAQ,
|
|
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
|
-
|
|
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,
|
|
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,
|
|
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;
|
|
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"}
|