@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
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { EvmChain } from '@vultisig/core-chain/Chain';
|
|
2
|
+
export const cowSwapSupportedChains = [EvmChain.Ethereum, EvmChain.Arbitrum, EvmChain.Base, EvmChain.Avalanche];
|
|
3
|
+
// CowSwap GPv2 contract addresses — same across all supported EVM chains.
|
|
4
|
+
export const COW_SETTLEMENT_ADDRESS = '0x9008D19f58AAbD9eD0D60971565AA8510560ab41';
|
|
5
|
+
export const COW_VAULT_RELAYER_ADDRESS = '0xC92E8bdf79f0507f65a392b0ab4667716BFE0110';
|
|
6
|
+
export const cowSwapChainConfig = {
|
|
7
|
+
[EvmChain.Ethereum]: {
|
|
8
|
+
apiBase: 'https://api.cow.fi/mainnet',
|
|
9
|
+
settlementContract: COW_SETTLEMENT_ADDRESS,
|
|
10
|
+
vaultRelayer: COW_VAULT_RELAYER_ADDRESS,
|
|
11
|
+
chainId: 1,
|
|
12
|
+
},
|
|
13
|
+
[EvmChain.Arbitrum]: {
|
|
14
|
+
apiBase: 'https://api.cow.fi/arbitrum_one',
|
|
15
|
+
settlementContract: COW_SETTLEMENT_ADDRESS,
|
|
16
|
+
vaultRelayer: COW_VAULT_RELAYER_ADDRESS,
|
|
17
|
+
chainId: 42161,
|
|
18
|
+
},
|
|
19
|
+
[EvmChain.Base]: {
|
|
20
|
+
apiBase: 'https://api.cow.fi/base',
|
|
21
|
+
settlementContract: COW_SETTLEMENT_ADDRESS,
|
|
22
|
+
vaultRelayer: COW_VAULT_RELAYER_ADDRESS,
|
|
23
|
+
chainId: 8453,
|
|
24
|
+
},
|
|
25
|
+
[EvmChain.Avalanche]: {
|
|
26
|
+
apiBase: 'https://api.cow.fi/avalanche',
|
|
27
|
+
settlementContract: COW_SETTLEMENT_ADDRESS,
|
|
28
|
+
vaultRelayer: COW_VAULT_RELAYER_ADDRESS,
|
|
29
|
+
chainId: 43114,
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
// Static allowlist of EIP-2612 permit-supporting tokens per chain.
|
|
33
|
+
// Tradeoff: an RPC-probe approach would be fully dynamic but requires an extra
|
|
34
|
+
// call per token per quote. Static list covers the vast majority of common
|
|
35
|
+
// pairs (USDC/USDT on all v1 chains) at zero overhead. Track additions
|
|
36
|
+
// as a follow-up when new permit tokens need support.
|
|
37
|
+
//
|
|
38
|
+
// IMPORTANT: every entry MUST implement the canonical EIP-2612 Permit struct
|
|
39
|
+
// (`owner,spender,value,nonce,deadline`). Tokens with a non-EIP-2612 permit, or
|
|
40
|
+
// no permit at all, are deliberately EXCLUDED — flagging them `permitRequired`
|
|
41
|
+
// would have Phase 2 build an EIP-2612 signature the token can't honor, and the
|
|
42
|
+
// CowSwap order would fail at settlement. On-chain `PERMIT_TYPEHASH()` /
|
|
43
|
+
// `DOMAIN_SEPARATOR()` verified 2026-05-28:
|
|
44
|
+
// - Ethereum DAI (0x6B17…) — Maker-style permit (holder,spender,nonce,expiry,
|
|
45
|
+
// allowed); typehash 0xea2aa0a1…, NOT EIP-2612. EXCLUDED.
|
|
46
|
+
// - Ethereum USDT (0xdAC1…) — no EIP-2612 permit (DOMAIN_SEPARATOR reverts).
|
|
47
|
+
// EXCLUDED.
|
|
48
|
+
// - Base DAI (0x50c5…) / Avalanche DAI.e (0xd586…) — bridged tokens with no
|
|
49
|
+
// EIP-2612 permit (DOMAIN_SEPARATOR reverts). EXCLUDED.
|
|
50
|
+
// - Arbitrum DAI (0xDA10…) — genuine EIP-2612 permit. KEPT.
|
|
51
|
+
export const KNOWN_PERMIT_TOKENS = {
|
|
52
|
+
// Ethereum
|
|
53
|
+
1: [
|
|
54
|
+
'0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48', // USDC
|
|
55
|
+
],
|
|
56
|
+
// Arbitrum
|
|
57
|
+
42161: [
|
|
58
|
+
'0xFF970A61A04b1cA14834A43f5dE4533eBDDB5CC8', // USDC.e
|
|
59
|
+
'0xaf88d065e77c8cC2239327C5EDb3A432268e5831', // USDC native
|
|
60
|
+
'0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9', // USDT
|
|
61
|
+
'0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1', // DAI (EIP-2612 on Arbitrum)
|
|
62
|
+
],
|
|
63
|
+
// Base
|
|
64
|
+
8453: [
|
|
65
|
+
'0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913', // USDC
|
|
66
|
+
],
|
|
67
|
+
// Avalanche
|
|
68
|
+
43114: [
|
|
69
|
+
'0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E', // USDC
|
|
70
|
+
'0x9702230A8Ea53601f5cD2dc00fDBc13d4dF4A8c7', // USDT
|
|
71
|
+
],
|
|
72
|
+
};
|
|
73
|
+
export const COWSWAP_APP_CODE = 'vultisig';
|
|
74
|
+
export const COWSWAP_APP_VERSION = '0.1.0';
|
|
75
|
+
// CowSwap partner fee BPS for affiliate revenue.
|
|
76
|
+
// Phase 2 (mcp-ts) will wire the consumer-level affiliateBps through.
|
|
77
|
+
// Phase 1 uses a fixed default matching the vultisig-0 baseline.
|
|
78
|
+
export const COWSWAP_DEFAULT_AFFILIATE_BPS = 50;
|
|
79
|
+
// Vultisig fee recipient address for CowSwap partner fees.
|
|
80
|
+
export const COWSWAP_FEE_RECIPIENT = '0x8E247a480449c84a5fDD25974A8501f3EFa4ABb9';
|
|
81
|
+
// Order validity window in seconds (15 minutes).
|
|
82
|
+
export const COWSWAP_VALID_TO_SECONDS = 15 * 60;
|
|
83
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/swap/general/cowswap/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAA;AAErD,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,SAAS,CAAU,CAAA;AAIxH,0EAA0E;AAC1E,MAAM,CAAC,MAAM,sBAAsB,GAAG,4CAA4C,CAAA;AAClF,MAAM,CAAC,MAAM,yBAAyB,GAAG,4CAA4C,CAAA;AASrF,MAAM,CAAC,MAAM,kBAAkB,GAAsD;IACnF,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;QACnB,OAAO,EAAE,4BAA4B;QACrC,kBAAkB,EAAE,sBAAsB;QAC1C,YAAY,EAAE,yBAAyB;QACvC,OAAO,EAAE,CAAC;KACX;IACD,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;QACnB,OAAO,EAAE,iCAAiC;QAC1C,kBAAkB,EAAE,sBAAsB;QAC1C,YAAY,EAAE,yBAAyB;QACvC,OAAO,EAAE,KAAK;KACf;IACD,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;QACf,OAAO,EAAE,yBAAyB;QAClC,kBAAkB,EAAE,sBAAsB;QAC1C,YAAY,EAAE,yBAAyB;QACvC,OAAO,EAAE,IAAI;KACd;IACD,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE;QACpB,OAAO,EAAE,8BAA8B;QACvC,kBAAkB,EAAE,sBAAsB;QAC1C,YAAY,EAAE,yBAAyB;QACvC,OAAO,EAAE,KAAK;KACf;CACF,CAAA;AAED,mEAAmE;AACnE,+EAA+E;AAC/E,2EAA2E;AAC3E,uEAAuE;AACvE,sDAAsD;AACtD,EAAE;AACF,6EAA6E;AAC7E,gFAAgF;AAChF,+EAA+E;AAC/E,gFAAgF;AAChF,yEAAyE;AACzE,4CAA4C;AAC5C,gFAAgF;AAChF,8DAA8D;AAC9D,+EAA+E;AAC/E,gBAAgB;AAChB,8EAA8E;AAC9E,4DAA4D;AAC5D,8DAA8D;AAC9D,MAAM,CAAC,MAAM,mBAAmB,GAA6B;IAC3D,WAAW;IACX,CAAC,EAAE;QACD,4CAA4C,EAAE,OAAO;KACtD;IACD,WAAW;IACX,KAAK,EAAE;QACL,4CAA4C,EAAE,SAAS;QACvD,4CAA4C,EAAE,cAAc;QAC5D,4CAA4C,EAAE,OAAO;QACrD,4CAA4C,EAAE,6BAA6B;KAC5E;IACD,OAAO;IACP,IAAI,EAAE;QACJ,4CAA4C,EAAE,OAAO;KACtD;IACD,YAAY;IACZ,KAAK,EAAE;QACL,4CAA4C,EAAE,OAAO;QACrD,4CAA4C,EAAE,OAAO;KACtD;CACF,CAAA;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,UAAU,CAAA;AAC1C,MAAM,CAAC,MAAM,mBAAmB,GAAG,OAAO,CAAA;AAE1C,iDAAiD;AACjD,sEAAsE;AACtE,iEAAiE;AACjE,MAAM,CAAC,MAAM,6BAA6B,GAAG,EAAE,CAAA;AAE/C,2DAA2D;AAC3D,MAAM,CAAC,MAAM,qBAAqB,GAAG,4CAA4C,CAAA;AAEjF,iDAAiD;AACjD,MAAM,CAAC,MAAM,wBAAwB,GAAG,EAAE,GAAG,EAAE,CAAA"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
export type Eip2612PermitMessage = {
|
|
2
|
+
owner: string;
|
|
3
|
+
spender: string;
|
|
4
|
+
value: string;
|
|
5
|
+
nonce: bigint;
|
|
6
|
+
deadline: bigint;
|
|
7
|
+
};
|
|
8
|
+
export type Eip2612PermitDomain = {
|
|
9
|
+
name: string;
|
|
10
|
+
version: string;
|
|
11
|
+
chainId: number;
|
|
12
|
+
verifyingContract: string;
|
|
13
|
+
};
|
|
14
|
+
export type Eip2612PermitTypedData = {
|
|
15
|
+
primaryType: 'Permit';
|
|
16
|
+
domain: Eip2612PermitDomain;
|
|
17
|
+
types: {
|
|
18
|
+
Permit: Array<{
|
|
19
|
+
name: string;
|
|
20
|
+
type: string;
|
|
21
|
+
}>;
|
|
22
|
+
};
|
|
23
|
+
message: Eip2612PermitMessage;
|
|
24
|
+
};
|
|
25
|
+
export type BuildEip2612PermitInput = {
|
|
26
|
+
tokenAddress: string;
|
|
27
|
+
tokenName: string;
|
|
28
|
+
chainId: number;
|
|
29
|
+
owner: string;
|
|
30
|
+
spender: string;
|
|
31
|
+
value: bigint;
|
|
32
|
+
nonce: bigint;
|
|
33
|
+
deadline: bigint;
|
|
34
|
+
};
|
|
35
|
+
/** Build EIP-2612 Permit typed data for a known-permit-token.
|
|
36
|
+
* The token must be in KNOWN_PERMIT_TOKENS for the chain — callers are
|
|
37
|
+
* responsible for checking eligibility before calling this function. */
|
|
38
|
+
export declare function buildEip2612Permit({ tokenAddress, tokenName, chainId, owner, spender, value, nonce, deadline, }: BuildEip2612PermitInput): Eip2612PermitTypedData;
|
|
39
|
+
//# sourceMappingURL=buildEip2612Permit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buildEip2612Permit.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/chain/swap/general/cowswap/permit/buildEip2612Permit.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,oBAAoB,GAAG;IACjC,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;IAEb,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;CACjB,CAAA;AAED,MAAM,MAAM,mBAAmB,GAAG;IAChC,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,iBAAiB,EAAE,MAAM,CAAA;CAC1B,CAAA;AAED,MAAM,MAAM,sBAAsB,GAAG;IACnC,WAAW,EAAE,QAAQ,CAAA;IACrB,MAAM,EAAE,mBAAmB,CAAA;IAC3B,KAAK,EAAE;QACL,MAAM,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAC9C,CAAA;IACD,OAAO,EAAE,oBAAoB,CAAA;CAC9B,CAAA;AAED,MAAM,MAAM,uBAAuB,GAAG;IACpC,YAAY,EAAE,MAAM,CAAA;IACpB,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;IAGb,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;CACjB,CAAA;AAUD;;wEAEwE;AACxE,wBAAgB,kBAAkB,CAAC,EACjC,YAAY,EACZ,SAAS,EACT,OAAO,EACP,KAAK,EACL,OAAO,EACP,KAAK,EACL,KAAK,EACL,QAAQ,GACT,EAAE,uBAAuB,GAAG,sBAAsB,CAoBlD"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
const PERMIT_TYPES = [
|
|
2
|
+
{ name: 'owner', type: 'address' },
|
|
3
|
+
{ name: 'spender', type: 'address' },
|
|
4
|
+
{ name: 'value', type: 'uint256' },
|
|
5
|
+
{ name: 'nonce', type: 'uint256' },
|
|
6
|
+
{ name: 'deadline', type: 'uint256' },
|
|
7
|
+
];
|
|
8
|
+
/** Build EIP-2612 Permit typed data for a known-permit-token.
|
|
9
|
+
* The token must be in KNOWN_PERMIT_TOKENS for the chain — callers are
|
|
10
|
+
* responsible for checking eligibility before calling this function. */
|
|
11
|
+
export function buildEip2612Permit({ tokenAddress, tokenName, chainId, owner, spender, value, nonce, deadline, }) {
|
|
12
|
+
return {
|
|
13
|
+
primaryType: 'Permit',
|
|
14
|
+
domain: {
|
|
15
|
+
name: tokenName,
|
|
16
|
+
version: '1',
|
|
17
|
+
chainId,
|
|
18
|
+
verifyingContract: tokenAddress,
|
|
19
|
+
},
|
|
20
|
+
types: {
|
|
21
|
+
Permit: PERMIT_TYPES,
|
|
22
|
+
},
|
|
23
|
+
message: {
|
|
24
|
+
owner: owner.toLowerCase(),
|
|
25
|
+
spender: spender.toLowerCase(),
|
|
26
|
+
value: value.toString(),
|
|
27
|
+
nonce,
|
|
28
|
+
deadline,
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=buildEip2612Permit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buildEip2612Permit.js","sourceRoot":"","sources":["../../../../../../../../packages/core/chain/swap/general/cowswap/permit/buildEip2612Permit.ts"],"names":[],"mappings":"AAsCA,MAAM,YAAY,GAAG;IACnB,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE;IAClC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE;IACpC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE;IAClC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE;IAClC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE;CACtC,CAAA;AAED;;wEAEwE;AACxE,MAAM,UAAU,kBAAkB,CAAC,EACjC,YAAY,EACZ,SAAS,EACT,OAAO,EACP,KAAK,EACL,OAAO,EACP,KAAK,EACL,KAAK,EACL,QAAQ,GACgB;IACxB,OAAO;QACL,WAAW,EAAE,QAAQ;QACrB,MAAM,EAAE;YACN,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,GAAG;YACZ,OAAO;YACP,iBAAiB,EAAE,YAAY;SAChC;QACD,KAAK,EAAE;YACL,MAAM,EAAE,YAAY;SACrB;QACD,OAAO,EAAE;YACP,KAAK,EAAE,KAAK,CAAC,WAAW,EAAE;YAC1B,OAAO,EAAE,OAAO,CAAC,WAAW,EAAE;YAC9B,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE;YACvB,KAAK;YACL,QAAQ;SACT;KACF,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { CowSwapOrderKind, CowSwapQuoteApiResponse } from '../types.js';
|
|
2
|
+
export type CowSwapTokenBalance = 'erc20' | 'external' | 'internal';
|
|
3
|
+
export type CowSwapOrder = {
|
|
4
|
+
sellToken: string;
|
|
5
|
+
buyToken: string;
|
|
6
|
+
receiver: string;
|
|
7
|
+
sellAmount: string;
|
|
8
|
+
buyAmount: string;
|
|
9
|
+
validTo: number;
|
|
10
|
+
appData: string;
|
|
11
|
+
appDataHash: string;
|
|
12
|
+
feeAmount: string;
|
|
13
|
+
kind: CowSwapOrderKind;
|
|
14
|
+
partiallyFillable: boolean;
|
|
15
|
+
sellTokenBalance: CowSwapTokenBalance;
|
|
16
|
+
buyTokenBalance: CowSwapTokenBalance;
|
|
17
|
+
};
|
|
18
|
+
export type BuildCowSwapOrderInput = {
|
|
19
|
+
quoteResponse: CowSwapQuoteApiResponse;
|
|
20
|
+
receiver: string;
|
|
21
|
+
affiliateBps?: number;
|
|
22
|
+
};
|
|
23
|
+
/** Canonical appData JSON for a given affiliate configuration. */
|
|
24
|
+
export declare function buildCowSwapAppData(affiliateBps: number, feeRecipient: string): string;
|
|
25
|
+
/** Compute keccak256 of an arbitrary string. Uses viem's battle-tested
|
|
26
|
+
* implementation rather than a hand-rolled one. Returns a 0x-prefixed
|
|
27
|
+
* 32-byte hex string. */
|
|
28
|
+
export declare function keccak256Hex(input: string): string;
|
|
29
|
+
/** Build a CowSwap Order struct from a quote API response. */
|
|
30
|
+
export declare function buildCowSwapOrder({ quoteResponse, receiver, affiliateBps }: BuildCowSwapOrderInput): CowSwapOrder;
|
|
31
|
+
//# sourceMappingURL=buildCowSwapOrder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buildCowSwapOrder.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/chain/swap/general/cowswap/sign/buildCowSwapOrder.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,UAAU,CAAA;AAEpE,MAAM,MAAM,mBAAmB,GAAG,OAAO,GAAG,UAAU,GAAG,UAAU,CAAA;AAEnE,MAAM,MAAM,YAAY,GAAG;IACzB,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,gBAAgB,CAAA;IACtB,iBAAiB,EAAE,OAAO,CAAA;IAC1B,gBAAgB,EAAE,mBAAmB,CAAA;IACrC,eAAe,EAAE,mBAAmB,CAAA;CACrC,CAAA;AAED,MAAM,MAAM,sBAAsB,GAAG;IACnC,aAAa,EAAE,uBAAuB,CAAA;IACtC,QAAQ,EAAE,MAAM,CAAA;IAChB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB,CAAA;AAED,kEAAkE;AAClE,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAWtF;AAED;;yBAEyB;AACzB,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAElD;AAED,8DAA8D;AAC9D,wBAAgB,iBAAiB,CAAC,EAAE,aAAa,EAAE,QAAQ,EAAE,YAAY,EAAE,EAAE,sBAAsB,GAAG,YAAY,CAuBjH"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { keccak256, stringToHex } from 'viem';
|
|
2
|
+
import { COWSWAP_APP_CODE, COWSWAP_APP_VERSION, COWSWAP_DEFAULT_AFFILIATE_BPS, COWSWAP_FEE_RECIPIENT, COWSWAP_VALID_TO_SECONDS, } from '../config.js';
|
|
3
|
+
/** Canonical appData JSON for a given affiliate configuration. */
|
|
4
|
+
export function buildCowSwapAppData(affiliateBps, feeRecipient) {
|
|
5
|
+
return JSON.stringify({
|
|
6
|
+
appCode: COWSWAP_APP_CODE,
|
|
7
|
+
version: COWSWAP_APP_VERSION,
|
|
8
|
+
metadata: {
|
|
9
|
+
partnerFee: {
|
|
10
|
+
bps: affiliateBps,
|
|
11
|
+
recipient: feeRecipient.toLowerCase(),
|
|
12
|
+
},
|
|
13
|
+
},
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
/** Compute keccak256 of an arbitrary string. Uses viem's battle-tested
|
|
17
|
+
* implementation rather than a hand-rolled one. Returns a 0x-prefixed
|
|
18
|
+
* 32-byte hex string. */
|
|
19
|
+
export function keccak256Hex(input) {
|
|
20
|
+
return keccak256(stringToHex(input));
|
|
21
|
+
}
|
|
22
|
+
/** Build a CowSwap Order struct from a quote API response. */
|
|
23
|
+
export function buildCowSwapOrder({ quoteResponse, receiver, affiliateBps }) {
|
|
24
|
+
const bps = affiliateBps ?? COWSWAP_DEFAULT_AFFILIATE_BPS;
|
|
25
|
+
const appData = buildCowSwapAppData(bps, COWSWAP_FEE_RECIPIENT);
|
|
26
|
+
const appDataHash = keccak256Hex(appData);
|
|
27
|
+
const validTo = Math.floor(Date.now() / 1000) + COWSWAP_VALID_TO_SECONDS;
|
|
28
|
+
const { quote } = quoteResponse;
|
|
29
|
+
return {
|
|
30
|
+
sellToken: quote.sellToken,
|
|
31
|
+
buyToken: quote.buyToken,
|
|
32
|
+
receiver,
|
|
33
|
+
sellAmount: quote.sellAmount,
|
|
34
|
+
buyAmount: quote.buyAmount,
|
|
35
|
+
validTo,
|
|
36
|
+
appData,
|
|
37
|
+
appDataHash,
|
|
38
|
+
feeAmount: quote.feeAmount,
|
|
39
|
+
kind: quote.kind,
|
|
40
|
+
partiallyFillable: quote.partiallyFillable,
|
|
41
|
+
sellTokenBalance: 'erc20',
|
|
42
|
+
buyTokenBalance: 'erc20',
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=buildCowSwapOrder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buildCowSwapOrder.js","sourceRoot":"","sources":["../../../../../../../../packages/core/chain/swap/general/cowswap/sign/buildCowSwapOrder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,MAAM,CAAA;AAE7C,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,6BAA6B,EAC7B,qBAAqB,EACrB,wBAAwB,GACzB,MAAM,WAAW,CAAA;AA2BlB,kEAAkE;AAClE,MAAM,UAAU,mBAAmB,CAAC,YAAoB,EAAE,YAAoB;IAC5E,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,OAAO,EAAE,gBAAgB;QACzB,OAAO,EAAE,mBAAmB;QAC5B,QAAQ,EAAE;YACR,UAAU,EAAE;gBACV,GAAG,EAAE,YAAY;gBACjB,SAAS,EAAE,YAAY,CAAC,WAAW,EAAE;aACtC;SACF;KACF,CAAC,CAAA;AACJ,CAAC;AAED;;yBAEyB;AACzB,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,OAAO,SAAS,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAA;AACtC,CAAC;AAED,8DAA8D;AAC9D,MAAM,UAAU,iBAAiB,CAAC,EAAE,aAAa,EAAE,QAAQ,EAAE,YAAY,EAA0B;IACjG,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;IACzC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,wBAAwB,CAAA;IAExE,MAAM,EAAE,KAAK,EAAE,GAAG,aAAa,CAAA;IAE/B,OAAO;QACL,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,QAAQ;QACR,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,OAAO;QACP,OAAO;QACP,WAAW;QACX,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,iBAAiB,EAAE,KAAK,CAAC,iBAAiB;QAC1C,gBAAgB,EAAE,OAAO;QACzB,eAAe,EAAE,OAAO;KACzB,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export type Eip712Domain = {
|
|
2
|
+
name: string;
|
|
3
|
+
version: string;
|
|
4
|
+
chainId: number;
|
|
5
|
+
verifyingContract: string;
|
|
6
|
+
};
|
|
7
|
+
/** Build the EIP-712 domain separator for CowSwap GPv2. */
|
|
8
|
+
export declare function buildEip712Domain(chainId: number): Eip712Domain;
|
|
9
|
+
//# sourceMappingURL=buildEip712Domain.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buildEip712Domain.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/chain/swap/general/cowswap/sign/buildEip712Domain.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,iBAAiB,EAAE,MAAM,CAAA;CAC1B,CAAA;AAED,2DAA2D;AAC3D,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,CAO/D"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { COW_SETTLEMENT_ADDRESS } from '../config.js';
|
|
2
|
+
/** Build the EIP-712 domain separator for CowSwap GPv2. */
|
|
3
|
+
export function buildEip712Domain(chainId) {
|
|
4
|
+
return {
|
|
5
|
+
name: 'Gnosis Protocol',
|
|
6
|
+
version: 'v2',
|
|
7
|
+
chainId,
|
|
8
|
+
verifyingContract: COW_SETTLEMENT_ADDRESS,
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=buildEip712Domain.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buildEip712Domain.js","sourceRoot":"","sources":["../../../../../../../../packages/core/chain/swap/general/cowswap/sign/buildEip712Domain.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAA;AASlD,2DAA2D;AAC3D,MAAM,UAAU,iBAAiB,CAAC,OAAe;IAC/C,OAAO;QACL,IAAI,EAAE,iBAAiB;QACvB,OAAO,EAAE,IAAI;QACb,OAAO;QACP,iBAAiB,EAAE,sBAAsB;KAC1C,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export type CowSwapOrderKind = 'sell' | 'buy';
|
|
2
|
+
/** Raw CowSwap quote object returned by POST /api/v1/quote */
|
|
3
|
+
export type CowSwapQuoteObject = {
|
|
4
|
+
sellToken: string;
|
|
5
|
+
buyToken: string;
|
|
6
|
+
receiver: string;
|
|
7
|
+
sellAmount: string;
|
|
8
|
+
buyAmount: string;
|
|
9
|
+
validTo: number;
|
|
10
|
+
appData: string;
|
|
11
|
+
feeAmount: string;
|
|
12
|
+
kind: CowSwapOrderKind;
|
|
13
|
+
partiallyFillable: boolean;
|
|
14
|
+
sellTokenBalance: string;
|
|
15
|
+
buyTokenBalance: string;
|
|
16
|
+
};
|
|
17
|
+
/** Full response envelope from POST /api/v1/quote */
|
|
18
|
+
export type CowSwapQuoteApiResponse = {
|
|
19
|
+
quote: CowSwapQuoteObject;
|
|
20
|
+
from: string;
|
|
21
|
+
expiration: string;
|
|
22
|
+
id: number;
|
|
23
|
+
};
|
|
24
|
+
/** Status returned by GET /api/v1/orders/{uid} */
|
|
25
|
+
export type CowSwapOrderStatus = 'open' | 'filled' | 'cancelled' | 'expired';
|
|
26
|
+
export type CowSwapOrderStatusResponse = {
|
|
27
|
+
status: CowSwapOrderStatus;
|
|
28
|
+
txHash?: string;
|
|
29
|
+
executedBuyAmount?: string;
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/chain/swap/general/cowswap/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,KAAK,CAAA;AAE7C,8DAA8D;AAC9D,MAAM,MAAM,kBAAkB,GAAG;IAC/B,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,gBAAgB,CAAA;IACtB,iBAAiB,EAAE,OAAO,CAAA;IAC1B,gBAAgB,EAAE,MAAM,CAAA;IACxB,eAAe,EAAE,MAAM,CAAA;CACxB,CAAA;AAED,qDAAqD;AACrD,MAAM,MAAM,uBAAuB,GAAG;IACpC,KAAK,EAAE,kBAAkB,CAAA;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,MAAM,CAAA;IAClB,EAAE,EAAE,MAAM,CAAA;CACX,CAAA;AAED,kDAAkD;AAClD,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,QAAQ,GAAG,WAAW,GAAG,SAAS,CAAA;AAE5E,MAAM,MAAM,0BAA0B,GAAG;IACvC,MAAM,EAAE,kBAAkB,CAAA;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,iBAAiB,CAAC,EAAE,MAAM,CAAA;CAC3B,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/swap/general/cowswap/types.ts"],"names":[],"mappings":""}
|
|
@@ -2,10 +2,20 @@ import { LifiSwapEnabledChain } from '@vultisig/core-chain/swap/general/lifi/Lif
|
|
|
2
2
|
import { TransferDirection } from '@vultisig/lib-utils/TransferDirection';
|
|
3
3
|
import { AccountCoinKey } from '../../../../coin/AccountCoin.js';
|
|
4
4
|
import { GeneralSwapQuote } from '../../GeneralSwapQuote.js';
|
|
5
|
-
type Input = Record<TransferDirection, AccountCoinKey<LifiSwapEnabledChain
|
|
5
|
+
type Input = Record<TransferDirection, AccountCoinKey<LifiSwapEnabledChain> & {
|
|
6
|
+
ticker?: string;
|
|
7
|
+
}> & {
|
|
6
8
|
amount: bigint;
|
|
7
9
|
affiliateBps?: number;
|
|
8
10
|
};
|
|
11
|
+
/** @internal exported for unit tests only */
|
|
12
|
+
export declare const STABLE_TICKERS: ReadonlySet<string>;
|
|
13
|
+
/** @internal exported for unit tests only */
|
|
14
|
+
export declare const isStablePair: (from: {
|
|
15
|
+
ticker?: string;
|
|
16
|
+
}, to: {
|
|
17
|
+
ticker?: string;
|
|
18
|
+
}) => boolean;
|
|
9
19
|
export declare const getLifiSwapQuote: ({ amount, affiliateBps, ...transfer }: Input) => Promise<GeneralSwapQuote>;
|
|
10
20
|
export {};
|
|
11
21
|
//# sourceMappingURL=getLifiSwapQuote.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getLifiSwapQuote.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/chain/swap/general/lifi/api/getLifiSwapQuote.ts"],"names":[],"mappings":"AAKA,OAAO,EAAmB,oBAAoB,EAAE,MAAM,8DAA8D,CAAA;AAKpH,OAAO,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAA;AAEzE,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AAGzD,KAAK,KAAK,GAAG,MAAM,CAAC,iBAAiB,EAAE,cAAc,CAAC,oBAAoB,CAAC,CAAC,GAAG;
|
|
1
|
+
{"version":3,"file":"getLifiSwapQuote.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/chain/swap/general/lifi/api/getLifiSwapQuote.ts"],"names":[],"mappings":"AAKA,OAAO,EAAmB,oBAAoB,EAAE,MAAM,8DAA8D,CAAA;AAKpH,OAAO,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAA;AAEzE,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AAGzD,KAAK,KAAK,GAAG,MAAM,CAAC,iBAAiB,EAAE,cAAc,CAAC,oBAAoB,CAAC,GAAG;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG;IACnG,MAAM,EAAE,MAAM,CAAA;IACd,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB,CAAA;AAKD,6CAA6C;AAC7C,eAAO,MAAM,cAAc,EAAE,WAAW,CAAC,MAAM,CAa7C,CAAA;AAKF,6CAA6C;AAC7C,eAAO,MAAM,YAAY,GAAI,MAAM;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,IAAI;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,KAAG,OACxB,CAAA;AA+F1D,eAAO,MAAM,gBAAgB,GAAU,uCAAuC,KAAK,KAAG,OAAO,CAAC,gBAAgB,CAgK7G,CAAA"}
|
|
@@ -9,6 +9,27 @@ import { match } from '@vultisig/lib-utils/match';
|
|
|
9
9
|
import { memoize } from '@vultisig/lib-utils/memoize';
|
|
10
10
|
import { mirrorRecord } from '@vultisig/lib-utils/record/mirrorRecord';
|
|
11
11
|
import { injectSolanaAtaIfMissing } from './injectSolanaAtaIfMissing.js';
|
|
12
|
+
// Stable-pair detection: tickers that commonly trade within a tight peg.
|
|
13
|
+
// DAI is included because on most DEXs DAI/USDC depth is comparable to
|
|
14
|
+
// USDC/USDT and the 0.3% ceiling is still safe headroom for MPC latency.
|
|
15
|
+
/** @internal exported for unit tests only */
|
|
16
|
+
export const STABLE_TICKERS = new Set([
|
|
17
|
+
'USDC',
|
|
18
|
+
'USDT',
|
|
19
|
+
'DAI',
|
|
20
|
+
'BUSD',
|
|
21
|
+
'TUSD',
|
|
22
|
+
'FRAX',
|
|
23
|
+
'USDP',
|
|
24
|
+
'GUSD',
|
|
25
|
+
'LUSD',
|
|
26
|
+
'USDD',
|
|
27
|
+
'FDUSD',
|
|
28
|
+
'PYUSD',
|
|
29
|
+
]);
|
|
30
|
+
const isStableTicker = (ticker) => ticker !== undefined && STABLE_TICKERS.has(ticker.toUpperCase());
|
|
31
|
+
/** @internal exported for unit tests only */
|
|
32
|
+
export const isStablePair = (from, to) => isStableTicker(from.ticker) && isStableTicker(to.ticker);
|
|
12
33
|
const setupLifi = memoize(() => {
|
|
13
34
|
createConfig({
|
|
14
35
|
integrator: lifiConfig.integratorName,
|
|
@@ -57,7 +78,15 @@ const setupLifi = memoize(() => {
|
|
|
57
78
|
// through the resolver, tracked at vultisig/vultisig-sdk#NEW — TODO
|
|
58
79
|
// open) lands as a clean diff rather than reshaping the function
|
|
59
80
|
// body. Codex Round 1b review feedback (vultisig-sdk#513 r1).
|
|
81
|
+
//
|
|
82
|
+
// Two tiers (vultisig-sdk#524):
|
|
83
|
+
// - stable pairs (USDC/USDT/DAI/...): 0.3% — well above typical
|
|
84
|
+
// concentrated-liquidity spread (0.02-0.05%) but avoids the 1%
|
|
85
|
+
// MEV surface on tight-peg operations.
|
|
86
|
+
// - volatile pairs: 1% — covers MPC ceremony latency (30-90s) where
|
|
87
|
+
// price can move >0.5% on thin pairs. See full rationale above.
|
|
60
88
|
const DEFAULT_LIFI_SLIPPAGE_TOLERANCE = 0.01;
|
|
89
|
+
const STABLE_PAIR_LIFI_SLIPPAGE_TOLERANCE = 0.003;
|
|
61
90
|
// Combined affiliate + slippage ceiling. Defensive guard so a high
|
|
62
91
|
// affiliateBps + the 1% slippage don't silently combine into a >3%
|
|
63
92
|
// effective cost on the user without anyone noticing. Logged-only,
|
|
@@ -95,12 +124,15 @@ export const getLifiSwapQuote = async ({ amount, affiliateBps, ...transfer }) =>
|
|
|
95
124
|
const [fromChain, toChain] = [transfer.from, transfer.to].map(({ chain }) => lifiSwapChainId[chain]);
|
|
96
125
|
const [fromToken, toToken] = [transfer.from, transfer.to].map(({ id, chain }) => id ?? chainFeeCoin[chain].ticker);
|
|
97
126
|
const [fromAddress, toAddress] = [transfer.from, transfer.to].map(({ address }) => address);
|
|
127
|
+
const slippage = isStablePair(transfer.from, transfer.to)
|
|
128
|
+
? STABLE_PAIR_LIFI_SLIPPAGE_TOLERANCE
|
|
129
|
+
: DEFAULT_LIFI_SLIPPAGE_TOLERANCE;
|
|
98
130
|
// Defensive: log when affiliate + slippage combined cost crosses the
|
|
99
131
|
// 3% ceiling. Today affiliateBps is typically 0 and slippage is 1%,
|
|
100
132
|
// so 100bps total — well under the ceiling — but a future bump to
|
|
101
133
|
// affiliateBps shouldn't silently combine into a >3% effective cost
|
|
102
134
|
// on the user without anyone noticing. NeOMakinG #513 r1.
|
|
103
|
-
const combinedCostBps = (affiliateBps ?? 0) +
|
|
135
|
+
const combinedCostBps = (affiliateBps ?? 0) + slippage * 10000;
|
|
104
136
|
if (combinedCostBps > MAX_COMBINED_COST_BPS) {
|
|
105
137
|
console.warn(`[getLifiSwapQuote] affiliate + slippage combined cost exceeds ${MAX_COMBINED_COST_BPS}bps: ${combinedCostBps}bps`);
|
|
106
138
|
}
|
|
@@ -113,7 +145,7 @@ export const getLifiSwapQuote = async ({ amount, affiliateBps, ...transfer }) =>
|
|
|
113
145
|
fromAddress,
|
|
114
146
|
toAddress,
|
|
115
147
|
fee: affiliateBps ? affiliateBps / 10000 : undefined,
|
|
116
|
-
slippage
|
|
148
|
+
slippage,
|
|
117
149
|
});
|
|
118
150
|
const { transactionRequest, estimate } = quote;
|
|
119
151
|
const chainKind = getChainKind(transfer.from.chain);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getLifiSwapQuote.js","sourceRoot":"","sources":["../../../../../../../../packages/core/chain/swap/general/lifi/api/getLifiSwapQuote.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,YAAY,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AAC3D,OAAO,EAAmB,YAAY,EAAE,MAAM,gCAAgC,CAAA;AAC9E,OAAO,EAAE,YAAY,EAAE,MAAM,iDAAiD,CAAA;AAC9E,OAAO,EAAE,YAAY,EAAE,MAAM,wCAAwC,CAAA;AACrE,OAAO,EAAE,UAAU,EAAE,MAAM,+CAA+C,CAAA;AAC1E,OAAO,EAAE,eAAe,EAAwB,MAAM,8DAA8D,CAAA;AACpH,OAAO,EAAE,eAAe,EAAE,MAAM,4CAA4C,CAAA;AAC5E,OAAO,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAA;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAA;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,yCAAyC,CAAA;AAKtE,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAA;AAOrE,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,EAAE;IAC7B,YAAY,CAAC;QACX,UAAU,EAAE,UAAU,CAAC,cAAc;KACtC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,+DAA+D;AAC/D,oEAAoE;AACpE,gEAAgE;AAChE,oEAAoE;AACpE,kEAAkE;AAClE,iEAAiE;AACjE,6DAA6D;AAC7D,kEAAkE;AAClE,8DAA8D;AAC9D,yDAAyD;AACzD,iEAAiE;AACjE,gEAAgE;AAChE,kEAAkE;AAClE,8DAA8D;AAC9D,+DAA+D;AAC/D,oDAAoD;AACpD,EAAE;AACF,iEAAiE;AACjE,iEAAiE;AACjE,kEAAkE;AAClE,oEAAoE;AACpE,sEAAsE;AACtE,mEAAmE;AACnE,8DAA8D;AAC9D,oDAAoD;AACpD,EAAE;AACF,2DAA2D;AAC3D,kEAAkE;AAClE,sEAAsE;AACtE,mEAAmE;AACnE,qEAAqE;AACrE,mEAAmE;AACnE,iEAAiE;AACjE,gEAAgE;AAChE,mEAAmE;AACnE,gEAAgE;AAChE,mEAAmE;AACnE,EAAE;AACF,6DAA6D;AAC7D,iEAAiE;AACjE,oEAAoE;AACpE,iEAAiE;AACjE,8DAA8D;AAC9D,MAAM,+BAA+B,GAAG,IAAI,CAAA;
|
|
1
|
+
{"version":3,"file":"getLifiSwapQuote.js","sourceRoot":"","sources":["../../../../../../../../packages/core/chain/swap/general/lifi/api/getLifiSwapQuote.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getSwapDestinationAddress.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/chain/swap/keysign/getSwapDestinationAddress.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,uCAAuC,CAAA;
|
|
1
|
+
{"version":3,"file":"getSwapDestinationAddress.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/chain/swap/keysign/getSwapDestinationAddress.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,uCAAuC,CAAA;AAInE,OAAO,EAAE,SAAS,EAAmB,MAAM,2CAA2C,CAAA;AAMtF,KAAK,8BAA8B,GAAG;IACpC,KAAK,EAAE,SAAS,CAAA;IAChB,QAAQ,EAAE,WAAW,CAAA;CACtB,CAAA;AAED,eAAO,MAAM,yBAAyB,GAAI,qBAAqB,8BAA8B,KAAG,MAoB5F,CAAA"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { isFeeCoin } from '@vultisig/core-chain/coin/utils/isFeeCoin';
|
|
2
|
+
import { COW_VAULT_RELAYER_ADDRESS } from '@vultisig/core-chain/swap/general/cowswap/config';
|
|
2
3
|
import { isOneOf } from '@vultisig/lib-utils/array/isOneOf';
|
|
3
4
|
import { matchRecordUnion } from '@vultisig/lib-utils/matchRecordUnion';
|
|
4
5
|
import { EvmChain } from '../../Chain.js';
|
|
@@ -7,6 +8,13 @@ export const getSwapDestinationAddress = ({ quote, fromCoin }) => matchRecordUni
|
|
|
7
8
|
evm: ({ to }) => to,
|
|
8
9
|
solana: () => '',
|
|
9
10
|
transfer: ({ to }) => to,
|
|
11
|
+
// CowSwap orders are settled by the solver network. The destination
|
|
12
|
+
// address used for ERC-20 allowance checks (build.ts spender) must be
|
|
13
|
+
// the GPv2VaultRelayer contract — NOT the settlement contract or empty
|
|
14
|
+
// string. An empty spender would propagate to getErc20Allowance and
|
|
15
|
+
// produce an invalid-address call. Same relayer address across all
|
|
16
|
+
// supported EVM chains.
|
|
17
|
+
cowswap_order: () => COW_VAULT_RELAYER_ADDRESS,
|
|
10
18
|
}),
|
|
11
19
|
native: quote => {
|
|
12
20
|
const isErc20 = isOneOf(fromCoin.chain, Object.values(EvmChain)) && !isFeeCoin(fromCoin);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getSwapDestinationAddress.js","sourceRoot":"","sources":["../../../../../../packages/core/chain/swap/keysign/getSwapDestinationAddress.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,2CAA2C,CAAA;
|
|
1
|
+
{"version":3,"file":"getSwapDestinationAddress.js","sourceRoot":"","sources":["../../../../../../packages/core/chain/swap/keysign/getSwapDestinationAddress.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,2CAA2C,CAAA;AACrE,OAAO,EAAE,yBAAyB,EAAE,MAAM,kDAAkD,CAAA;AAG5F,OAAO,EAAE,OAAO,EAAE,MAAM,mCAAmC,CAAA;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,sCAAsC,CAAA;AAEvE,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAOtC,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAkC,EAAU,EAAE,CACvG,gBAAgB,CAA0B,KAAK,CAAC,KAAK,EAAE;IACrD,OAAO,EAAE,KAAK,CAAC,EAAE,CACf,gBAAgB,CAAwB,KAAK,CAAC,EAAE,EAAE;QAChD,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE;QACnB,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE;QAChB,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE;QACxB,oEAAoE;QACpE,sEAAsE;QACtE,uEAAuE;QACvE,oEAAoE;QACpE,mEAAmE;QACnE,wBAAwB;QACxB,aAAa,EAAE,GAAG,EAAE,CAAC,yBAAyB;KAC/C,CAAC;IACJ,MAAM,EAAE,KAAK,CAAC,EAAE;QACd,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAA;QAExF,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,eAAe,CAAC,IAAI,QAAQ,CAAC,OAAO,CAAA;IAC7E,CAAC;CACF,CAAC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getNativeSwapQuote.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/chain/swap/native/api/getNativeSwapQuote.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,uCAAuC,CAAA;AAGnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAA;
|
|
1
|
+
{"version":3,"file":"getNativeSwapQuote.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/chain/swap/native/api/getNativeSwapQuote.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,uCAAuC,CAAA;AAGnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAA;AAIzE,OAAO,EAEL,eAAe,EAGhB,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAEpD,OAAO,EAAwB,yBAAyB,EAAE,MAAM,aAAa,CAAA;AAE7E,KAAK,uBAAuB,GAAG,MAAM,CAAC,iBAAiB,EAAE,WAAW,CAAC,GAAG;IACtE,SAAS,EAAE,eAAe,CAAA;IAC1B,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,qBAAqB,CAAC,EAAE,yBAAyB,CAAA;CAClD,CAAA;AAuED,eAAO,MAAM,kBAAkB,GAAU,8FAStC,uBAAuB,KAAG,OAAO,CAAC,eAAe,CAoFnD,CAAA"}
|
|
@@ -2,7 +2,6 @@ import { toChainAmount } from '@vultisig/core-chain/amount/toChainAmount';
|
|
|
2
2
|
import { Chain } from '@vultisig/core-chain/Chain';
|
|
3
3
|
import { isInError } from '@vultisig/lib-utils/error/isInError';
|
|
4
4
|
import { queryUrl } from '@vultisig/lib-utils/query/queryUrl';
|
|
5
|
-
import { t } from 'i18next';
|
|
6
5
|
import { chainFeeCoin } from '../../../coin/chainFeeCoin.js';
|
|
7
6
|
import { toNativeSwapAsset } from '../asset/toNativeSwapAsset.js';
|
|
8
7
|
import { nativeSwapApiBaseUrl, nativeSwapStreamingInterval, THORCHAIN_STREAMING_SLIPPAGE_THRESHOLD_BPS, } from '../NativeSwapChain.js';
|
|
@@ -33,7 +32,7 @@ const assertOkQuote = (result, from) => {
|
|
|
33
32
|
if ('error' in result) {
|
|
34
33
|
if (isInError(result.error, 'not enough asset to pay for fees')) {
|
|
35
34
|
const { ticker } = chainFeeCoin[from.chain];
|
|
36
|
-
throw new Error(
|
|
35
|
+
throw new Error(`Not enough ${ticker} to cover gas fees.`);
|
|
37
36
|
}
|
|
38
37
|
throw new Error(result.error);
|
|
39
38
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getNativeSwapQuote.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/swap/native/api/getNativeSwapQuote.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,2CAA2C,CAAA;AACzE,OAAO,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAA;AAElD,OAAO,EAAE,SAAS,EAAE,MAAM,qCAAqC,CAAA;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAA;
|
|
1
|
+
{"version":3,"file":"getNativeSwapQuote.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/swap/native/api/getNativeSwapQuote.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,2CAA2C,CAAA;AACzE,OAAO,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAA;AAElD,OAAO,EAAE,SAAS,EAAE,MAAM,qCAAqC,CAAA;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAA;AAG7D,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAA;AAC9D,OAAO,EACL,oBAAoB,EAEpB,2BAA2B,EAC3B,0CAA0C,GAC3C,MAAM,oBAAoB,CAAA;AAE3B,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAA;AACtE,OAAO,EAAE,oBAAoB,EAA6B,MAAM,aAAa,CAAA;AAiB7E,MAAM,iCAAiC,GAAG,CAAC,CAAA;AAE3C,MAAM,sBAAsB,GAAG,KAAK,EAAE,EACpC,SAAS,EACT,WAAW,EACX,SAAS,EACT,OAAO,EACP,WAAW,EACX,WAAW,EACX,iBAAiB,EACjB,iBAAiB,EACjB,YAAY,EACZ,QAAQ,EACR,qBAAqB,GAatB,EAAmE,EAAE;IACpE,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;QACjC,UAAU,EAAE,SAAS;QACrB,QAAQ,EAAE,OAAO;QACjB,MAAM,EAAE,WAAW,CAAC,QAAQ,EAAE;QAC9B,WAAW;QACX,kBAAkB,EAAE,MAAM,CAAC,iBAAiB,CAAC;QAC7C,GAAG,CAAC,iBAAiB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,kBAAkB,EAAE,MAAM,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7F,GAAG,CAAC,YAAY,KAAK,SAAS;YAC5B,CAAC,CAAC,oBAAoB,CAAC;gBACnB,SAAS;gBACT,QAAQ;gBACR,YAAY;gBACZ,MAAM,EAAE,qBAAqB;aAC9B,CAAC;YACJ,CAAC,CAAC,EAAE,CAAC;KACR,CAAC,CAAA;IAEF,MAAM,GAAG,GAAG,GAAG,WAAW,IAAI,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAA;IAEjD,OAAO,QAAQ,CAAyD,GAAG,CAAC,CAAA;AAC9E,CAAC,CAAA;AAED,MAAM,aAAa,GAAG,CACpB,MAA8D,EAC9D,IAAiB,EACQ,EAAE;IAC3B,IAAI,OAAO,IAAI,MAAM,EAAE,CAAC;QACtB,IAAI,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,kCAAkC,CAAC,EAAE,CAAC;YAChE,MAAM,EAAE,MAAM,EAAE,GAAG,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YAC3C,MAAM,IAAI,KAAK,CAAC,cAAc,MAAM,qBAAqB,CAAC,CAAA;QAC5D,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IAC/B,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,EAAE,EACvC,SAAS,EACT,WAAW,EACX,IAAI,EACJ,EAAE,EACF,MAAM,EACN,YAAY,EACZ,QAAQ,EACR,qBAAqB,GACG,EAA4B,EAAE;IACtD,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAA;IAE9E,MAAM,YAAY,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAA;IAEhD,MAAM,WAAW,GAAG,aAAa,CAAC,MAAM,EAAE,YAAY,CAAC,CAAA;IAEvD,MAAM,WAAW,GAAG,GAAG,oBAAoB,CAAC,SAAS,CAAC,aAAa,CAAA;IAEnE,IAAI,SAAS,KAAK,KAAK,CAAC,SAAS,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,MAAM,sBAAsB,CAAC;YAC1C,SAAS;YACT,WAAW;YACX,SAAS;YACT,OAAO;YACP,WAAW;YACX,WAAW;YACX,iBAAiB,EAAE,2BAA2B,CAAC,SAAS,CAAC;YACzD,YAAY;YACZ,QAAQ;YACR,qBAAqB;SACtB,CAAC,CAAA;QAEF,OAAO;YACL,GAAG,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC;YAC9B,SAAS;SACV,CAAA;IACH,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,sBAAsB,CAAC;QAC/C,SAAS;QACT,WAAW;QACX,SAAS;QACT,OAAO;QACP,WAAW;QACX,WAAW;QACX,iBAAiB,EAAE,2BAA2B,CAAC,SAAS,CAAC;QACzD,YAAY;QACZ,QAAQ;QACR,qBAAqB;KACtB,CAAC,CAAA;IAEF,MAAM,KAAK,GAAG,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,CAAA;IAE9C,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAA;IACrC,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,IAAI,0CAA0C,EAAE,CAAC;QACrF,OAAO,EAAE,GAAG,KAAK,EAAE,SAAS,EAAE,CAAA;IAChC,CAAC;IAED,MAAM,iBAAiB,GACrB,KAAK,CAAC,sBAAsB,KAAK,SAAS,IAAI,KAAK,CAAC,sBAAsB,GAAG,CAAC;QAC5E,CAAC,CAAC,KAAK,CAAC,sBAAsB;QAC9B,CAAC,CAAC,SAAS,CAAA;IAEf,IAAI,SAAkC,CAAA;IACtC,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,MAAM,sBAAsB,CAAC;YAChD,SAAS;YACT,WAAW;YACX,SAAS;YACT,OAAO;YACP,WAAW;YACX,WAAW;YACX,iBAAiB,EAAE,iCAAiC;YACpD,iBAAiB;YACjB,YAAY;YACZ,QAAQ;YACR,qBAAqB;SACtB,CAAC,CAAA;QACF,SAAS,GAAG,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,CAAA;IAC/C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,qFAAqF,EAAE,KAAK,CAAC,CAAA;QAC1G,OAAO,EAAE,GAAG,KAAK,EAAE,SAAS,EAAE,CAAA;IAChC,CAAC;IAED,IAAI,CAAC;QACH,IAAI,MAAM,CAAC,SAAS,CAAC,mBAAmB,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,EAAE,CAAC;YAC9E,OAAO,EAAE,GAAG,SAAS,EAAE,SAAS,EAAE,CAAA;QACpC,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,GAAG,KAAK,EAAE,SAAS,EAAE,CAAA;IAChC,CAAC;IAED,OAAO,EAAE,GAAG,KAAK,EAAE,SAAS,EAAE,CAAA;AAChC,CAAC,CAAA"}
|
|
@@ -21,7 +21,7 @@ export type FindSwapQuoteInput = Record<TransferDirection, AccountCoin> & {
|
|
|
21
21
|
vultDiscountTier?: VultDiscountTier | null;
|
|
22
22
|
affiliateConfig?: SwapAffiliateConfig;
|
|
23
23
|
};
|
|
24
|
-
type SwapQuoteProviderName = 'KyberSwap' | '1inch' | 'LiFi' | 'SwapKit' | 'THORChain' | 'MayaChain';
|
|
24
|
+
type SwapQuoteProviderName = 'CowSwap' | 'KyberSwap' | '1inch' | 'LiFi' | 'SwapKit' | 'THORChain' | 'MayaChain';
|
|
25
25
|
/**
|
|
26
26
|
* Declared preference order for AGGREGATOR ties — when two aggregators return
|
|
27
27
|
* identical `outputAmount`, the earlier entry wins. This makes the tie-break
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"findSwapQuote.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/chain/swap/quote/findSwapQuote.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,uCAAuC,CAAA;AACnE,OAAO,EAAuB,gBAAgB,EAAE,MAAM,qCAAqC,CAAA;
|
|
1
|
+
{"version":3,"file":"findSwapQuote.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/chain/swap/quote/findSwapQuote.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,uCAAuC,CAAA;AACnE,OAAO,EAAuB,gBAAgB,EAAE,MAAM,qCAAqC,CAAA;AAM3F,OAAO,EAAE,4BAA4B,EAAE,MAAM,gDAAgD,CAAA;AAG7F,OAAO,EAEL,sBAAsB,EACvB,MAAM,mEAAmE,CAAA;AAO1E,OAAO,EAAE,yBAAyB,EAAE,MAAM,gDAAgD,CAAA;AAW1F,OAAO,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAA;AAEzE,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAEvC;;;;8CAI8C;AAC9C,MAAM,MAAM,mBAAmB,GAAG;IAChC,MAAM,CAAC,EAAE,yBAAyB,CAAA;IAClC,OAAO,CAAC,EAAE,sBAAsB,CAAA;IAChC,KAAK,CAAC,EAAE,4BAA4B,CAAA;CACrC,CAAA;AAED,MAAM,MAAM,kBAAkB,GAAG,MAAM,CAAC,iBAAiB,EAAE,WAAW,CAAC,GAAG;IACxE,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,gBAAgB,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAAA;IAC1C,eAAe,CAAC,EAAE,mBAAmB,CAAA;CACtC,CAAA;AAED,KAAK,qBAAqB,GAAG,SAAS,GAAG,WAAW,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,GAAG,WAAW,GAAG,WAAW,CAAA;AA2D/G;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,yBAAyB,EAAE,SAAS,qBAAqB,EAQ5D,CAAA;AAkFV,eAAO,MAAM,aAAa,GAAU,oEAOjC,kBAAkB,KAAG,OAAO,CAAC,SAAS,CAkRxC,CAAA"}
|