@vultisig/core-chain 2.5.0 → 2.7.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 +64 -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/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 +34 -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/general/swapkit/SwapKitErrors.d.ts +17 -0
- package/dist/swap/general/swapkit/SwapKitErrors.d.ts.map +1 -0
- package/dist/swap/general/swapkit/SwapKitErrors.js +22 -0
- package/dist/swap/general/swapkit/SwapKitErrors.js.map +1 -0
- package/dist/swap/general/swapkit/SwapKitProviders.d.ts +38 -0
- package/dist/swap/general/swapkit/SwapKitProviders.d.ts.map +1 -0
- package/dist/swap/general/swapkit/SwapKitProviders.js +134 -0
- package/dist/swap/general/swapkit/SwapKitProviders.js.map +1 -0
- package/dist/swap/general/swapkit/api/getSwapKitQuote.d.ts.map +1 -1
- package/dist/swap/general/swapkit/api/getSwapKitQuote.js +19 -5
- package/dist/swap/general/swapkit/api/getSwapKitQuote.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 +31 -5
- package/dist/swap/quote/findSwapQuote.js.map +1 -1
- package/dist/swap/utils/getSwapExplorerUrl/index.d.ts +35 -0
- package/dist/swap/utils/getSwapExplorerUrl/index.d.ts.map +1 -0
- package/dist/swap/utils/getSwapExplorerUrl/index.js +53 -0
- package/dist/swap/utils/getSwapExplorerUrl/index.js.map +1 -0
- package/package.json +61 -2
|
@@ -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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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Chain } from '@vultisig/core-chain/Chain';
|
|
2
|
+
/** No SwapKit provider returned an eligible route for the requested swap. */
|
|
3
|
+
export declare class SwapKitNoEligibleRoutesError extends Error {
|
|
4
|
+
constructor();
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* The SwapKit pair is structurally supported (per the cached `/providers`
|
|
8
|
+
* snapshot) but no route was returned — i.e. the amount is below the provider
|
|
9
|
+
* minimum. Synthetic: never decoded from a SwapKit response, only raised by
|
|
10
|
+
* `getSwapKitQuote` after the pair cross-check. Mirrors vultisig-ios #4418.
|
|
11
|
+
*/
|
|
12
|
+
export declare class SwapKitAmountBelowMinimumError extends Error {
|
|
13
|
+
readonly fromChain: Chain;
|
|
14
|
+
readonly toChain: Chain;
|
|
15
|
+
constructor(fromChain: Chain, toChain: Chain);
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=SwapKitErrors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SwapKitErrors.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/chain/swap/general/swapkit/SwapKitErrors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAA;AAElD,6EAA6E;AAC7E,qBAAa,4BAA6B,SAAQ,KAAK;;CAItD;AAED;;;;;GAKG;AACH,qBAAa,8BAA+B,SAAQ,KAAK;IAErD,QAAQ,CAAC,SAAS,EAAE,KAAK;IACzB,QAAQ,CAAC,OAAO,EAAE,KAAK;gBADd,SAAS,EAAE,KAAK,EAChB,OAAO,EAAE,KAAK;CAI1B"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/** No SwapKit provider returned an eligible route for the requested swap. */
|
|
2
|
+
export class SwapKitNoEligibleRoutesError extends Error {
|
|
3
|
+
constructor() {
|
|
4
|
+
super('SwapKit returned no eligible routes.');
|
|
5
|
+
}
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* The SwapKit pair is structurally supported (per the cached `/providers`
|
|
9
|
+
* snapshot) but no route was returned — i.e. the amount is below the provider
|
|
10
|
+
* minimum. Synthetic: never decoded from a SwapKit response, only raised by
|
|
11
|
+
* `getSwapKitQuote` after the pair cross-check. Mirrors vultisig-ios #4418.
|
|
12
|
+
*/
|
|
13
|
+
export class SwapKitAmountBelowMinimumError extends Error {
|
|
14
|
+
fromChain;
|
|
15
|
+
toChain;
|
|
16
|
+
constructor(fromChain, toChain) {
|
|
17
|
+
super(`SwapKit amount below provider minimum for ${fromChain} -> ${toChain}.`);
|
|
18
|
+
this.fromChain = fromChain;
|
|
19
|
+
this.toChain = toChain;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=SwapKitErrors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SwapKitErrors.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/swap/general/swapkit/SwapKitErrors.ts"],"names":[],"mappings":"AAEA,6EAA6E;AAC7E,MAAM,OAAO,4BAA6B,SAAQ,KAAK;IACrD;QACE,KAAK,CAAC,sCAAsC,CAAC,CAAA;IAC/C,CAAC;CACF;AAED;;;;;GAKG;AACH,MAAM,OAAO,8BAA+B,SAAQ,KAAK;IAE5C;IACA;IAFX,YACW,SAAgB,EAChB,OAAc;QAEvB,KAAK,CAAC,6CAA6C,SAAS,OAAO,OAAO,GAAG,CAAC,CAAA;QAHrE,cAAS,GAAT,SAAS,CAAO;QAChB,YAAO,GAAP,OAAO,CAAO;IAGzB,CAAC;CACF"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { SwapKitEnabledChain, SwapKitSourceChain } from '@vultisig/core-chain/swap/general/swapkit/SwapKitEnabledChains';
|
|
2
|
+
/**
|
|
3
|
+
* Providers handled by the dedicated native THORChain/MayaChain path, never via
|
|
4
|
+
* SwapKit aggregation. Filtered out of both route selection and the pair-support
|
|
5
|
+
* cross-check so a native-only provider can't make a pair look SwapKit-routable.
|
|
6
|
+
*/
|
|
7
|
+
export declare const swapKitExcludedProviders: Set<string>;
|
|
8
|
+
export declare const normalizeSwapKitProvider: (provider: string) => string;
|
|
9
|
+
export type SwapKitProviderInfo = {
|
|
10
|
+
provider: string;
|
|
11
|
+
enabledChainIds: string[];
|
|
12
|
+
};
|
|
13
|
+
/** Test-only: clear the in-memory `/providers` snapshot. */
|
|
14
|
+
export declare const resetSwapKitProvidersCache: () => void;
|
|
15
|
+
/**
|
|
16
|
+
* Fetches and caches SwapKit's `/providers` snapshot. The snapshot rarely changes
|
|
17
|
+
* and is only needed on the unhappy path, so a coarse TTL is enough. On any
|
|
18
|
+
* failure returns an empty list, which callers treat as "unknown" (fail-open).
|
|
19
|
+
*/
|
|
20
|
+
export declare const getSwapKitProviders: () => Promise<SwapKitProviderInfo[]>;
|
|
21
|
+
/**
|
|
22
|
+
* SwapKit collapses "amount below provider minimum" and "pair not supported" into
|
|
23
|
+
* the same `noRoutesFound` 404, so the envelope alone can't disambiguate them.
|
|
24
|
+
* Cross-check the cached `/providers` snapshot: if a single non-excluded provider
|
|
25
|
+
* enables BOTH chains, the pair is structurally supported, so a no-route result
|
|
26
|
+
* must be amount-related. Mirrors vultisig-ios #4418.
|
|
27
|
+
*
|
|
28
|
+
* Intersection on a SINGLE provider (not a union across providers): a provider
|
|
29
|
+
* that enables both chains is far likelier to actually route between them than
|
|
30
|
+
* two providers each covering one side. Fails open (returns `true`) when the
|
|
31
|
+
* snapshot is unavailable — degrading to "amount too small" beats a misleading
|
|
32
|
+
* "no route" message.
|
|
33
|
+
*/
|
|
34
|
+
export declare const isSwapKitPairSupported: ({ from, to, }: {
|
|
35
|
+
from: SwapKitSourceChain;
|
|
36
|
+
to: SwapKitEnabledChain;
|
|
37
|
+
}) => Promise<boolean>;
|
|
38
|
+
//# sourceMappingURL=SwapKitProviders.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SwapKitProviders.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/chain/swap/general/swapkit/SwapKitProviders.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,gEAAgE,CAAA;AAGxH;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,aAKnC,CAAA;AAEF,eAAO,MAAM,wBAAwB,GAAI,UAAU,MAAM,KAAG,MACN,CAAA;AAiCtD,MAAM,MAAM,mBAAmB,GAAG;IAChC,QAAQ,EAAE,MAAM,CAAA;IAChB,eAAe,EAAE,MAAM,EAAE,CAAA;CAC1B,CAAA;AAiBD,4DAA4D;AAC5D,eAAO,MAAM,0BAA0B,YAEtC,CAAA;AAwBD;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,QAAa,OAAO,CAAC,mBAAmB,EAAE,CAsCzE,CAAA;AAED;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,sBAAsB,GAAU,eAG1C;IACD,IAAI,EAAE,kBAAkB,CAAA;IACxB,EAAE,EAAE,mBAAmB,CAAA;CACxB,KAAG,OAAO,CAAC,OAAO,CAelB,CAAA"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { Chain } from '@vultisig/core-chain/Chain';
|
|
2
|
+
import { getSwapKitConfig } from '@vultisig/core-chain/swap/general/swapkit/config';
|
|
3
|
+
import { attempt } from '@vultisig/lib-utils/attempt';
|
|
4
|
+
/**
|
|
5
|
+
* Providers handled by the dedicated native THORChain/MayaChain path, never via
|
|
6
|
+
* SwapKit aggregation. Filtered out of both route selection and the pair-support
|
|
7
|
+
* cross-check so a native-only provider can't make a pair look SwapKit-routable.
|
|
8
|
+
*/
|
|
9
|
+
export const swapKitExcludedProviders = new Set([
|
|
10
|
+
'THORCHAIN',
|
|
11
|
+
'THORCHAIN_STREAMING',
|
|
12
|
+
'MAYACHAIN',
|
|
13
|
+
'MAYACHAIN_STREAMING',
|
|
14
|
+
]);
|
|
15
|
+
export const normalizeSwapKitProvider = (provider) => provider.trim().toUpperCase().replace(/[-\s]/g, '_');
|
|
16
|
+
/**
|
|
17
|
+
* Chain → SwapKit `enabledChainIds` token as returned by `/providers`. EVM chains
|
|
18
|
+
* use their numeric EVM chain id; non-EVM chains use SwapKit's named id. This is a
|
|
19
|
+
* DISTINCT id-space from `swapKitChainId` (the asset-prefix used in `/v3/quote`).
|
|
20
|
+
*/
|
|
21
|
+
const swapKitProviderChainId = {
|
|
22
|
+
[Chain.Ethereum]: '1',
|
|
23
|
+
[Chain.Arbitrum]: '42161',
|
|
24
|
+
[Chain.Avalanche]: '43114',
|
|
25
|
+
[Chain.Base]: '8453',
|
|
26
|
+
[Chain.BSC]: '56',
|
|
27
|
+
[Chain.Optimism]: '10',
|
|
28
|
+
[Chain.Polygon]: '137',
|
|
29
|
+
[Chain.Solana]: 'solana',
|
|
30
|
+
[Chain.Bitcoin]: 'bitcoin',
|
|
31
|
+
[Chain.BitcoinCash]: 'bitcoincash',
|
|
32
|
+
[Chain.Dogecoin]: 'dogecoin',
|
|
33
|
+
[Chain.Litecoin]: 'litecoin',
|
|
34
|
+
[Chain.Ripple]: 'ripple',
|
|
35
|
+
[Chain.Ton]: 'ton',
|
|
36
|
+
[Chain.Tron]: '728126428',
|
|
37
|
+
[Chain.Zcash]: 'zcash',
|
|
38
|
+
[Chain.Cardano]: 'cardano',
|
|
39
|
+
[Chain.Cosmos]: 'cosmos',
|
|
40
|
+
[Chain.Dash]: 'dash',
|
|
41
|
+
[Chain.Kujira]: 'kaiyo-1',
|
|
42
|
+
[Chain.MayaChain]: 'mayachain-mainnet-v1',
|
|
43
|
+
[Chain.Sui]: 'sui',
|
|
44
|
+
[Chain.THORChain]: 'thorchain-1',
|
|
45
|
+
};
|
|
46
|
+
const PROVIDERS_CACHE_TTL_MS = 10 * 60 * 1000;
|
|
47
|
+
// Short timeout so a stalled /providers call fails open fast instead of dragging
|
|
48
|
+
// out the no-route classification path (the outer findSwapQuote per-fetcher
|
|
49
|
+
// timeout would also catch it, but much later).
|
|
50
|
+
const PROVIDERS_FETCH_TIMEOUT_MS = 5_000;
|
|
51
|
+
let providersCache = null;
|
|
52
|
+
/** Test-only: clear the in-memory `/providers` snapshot. */
|
|
53
|
+
export const resetSwapKitProvidersCache = () => {
|
|
54
|
+
providersCache = null;
|
|
55
|
+
};
|
|
56
|
+
const parseProviders = (data) => {
|
|
57
|
+
const list = Array.isArray(data) ? data : [];
|
|
58
|
+
return list.flatMap(entry => {
|
|
59
|
+
if (typeof entry !== 'object' || entry === null) {
|
|
60
|
+
return [];
|
|
61
|
+
}
|
|
62
|
+
const { provider, enabledChainIds } = entry;
|
|
63
|
+
if (typeof provider !== 'string' || !Array.isArray(enabledChainIds)) {
|
|
64
|
+
return [];
|
|
65
|
+
}
|
|
66
|
+
return [
|
|
67
|
+
{
|
|
68
|
+
provider,
|
|
69
|
+
enabledChainIds: enabledChainIds.filter((id) => typeof id === 'string'),
|
|
70
|
+
},
|
|
71
|
+
];
|
|
72
|
+
});
|
|
73
|
+
};
|
|
74
|
+
/**
|
|
75
|
+
* Fetches and caches SwapKit's `/providers` snapshot. The snapshot rarely changes
|
|
76
|
+
* and is only needed on the unhappy path, so a coarse TTL is enough. On any
|
|
77
|
+
* failure returns an empty list, which callers treat as "unknown" (fail-open).
|
|
78
|
+
*/
|
|
79
|
+
export const getSwapKitProviders = async () => {
|
|
80
|
+
const { apiKey, baseUrl } = getSwapKitConfig();
|
|
81
|
+
if (providersCache &&
|
|
82
|
+
providersCache.baseUrl === baseUrl &&
|
|
83
|
+
Date.now() - providersCache.fetchedAt < PROVIDERS_CACHE_TTL_MS) {
|
|
84
|
+
return providersCache.providers;
|
|
85
|
+
}
|
|
86
|
+
const trimmedApiKey = apiKey?.trim();
|
|
87
|
+
const result = await attempt(async () => {
|
|
88
|
+
const controller = new AbortController();
|
|
89
|
+
const timeoutId = setTimeout(() => controller.abort(), PROVIDERS_FETCH_TIMEOUT_MS);
|
|
90
|
+
try {
|
|
91
|
+
const response = await fetch(`${baseUrl.replace(/\/$/, '')}/providers`, {
|
|
92
|
+
headers: trimmedApiKey ? { 'x-api-key': trimmedApiKey } : {},
|
|
93
|
+
signal: controller.signal,
|
|
94
|
+
});
|
|
95
|
+
if (!response.ok) {
|
|
96
|
+
throw new Error(`SwapKit providers request failed (${response.status})`);
|
|
97
|
+
}
|
|
98
|
+
return parseProviders(await response.json());
|
|
99
|
+
}
|
|
100
|
+
finally {
|
|
101
|
+
clearTimeout(timeoutId);
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
if ('error' in result) {
|
|
105
|
+
return [];
|
|
106
|
+
}
|
|
107
|
+
providersCache = { baseUrl, providers: result.data, fetchedAt: Date.now() };
|
|
108
|
+
return result.data;
|
|
109
|
+
};
|
|
110
|
+
/**
|
|
111
|
+
* SwapKit collapses "amount below provider minimum" and "pair not supported" into
|
|
112
|
+
* the same `noRoutesFound` 404, so the envelope alone can't disambiguate them.
|
|
113
|
+
* Cross-check the cached `/providers` snapshot: if a single non-excluded provider
|
|
114
|
+
* enables BOTH chains, the pair is structurally supported, so a no-route result
|
|
115
|
+
* must be amount-related. Mirrors vultisig-ios #4418.
|
|
116
|
+
*
|
|
117
|
+
* Intersection on a SINGLE provider (not a union across providers): a provider
|
|
118
|
+
* that enables both chains is far likelier to actually route between them than
|
|
119
|
+
* two providers each covering one side. Fails open (returns `true`) when the
|
|
120
|
+
* snapshot is unavailable — degrading to "amount too small" beats a misleading
|
|
121
|
+
* "no route" message.
|
|
122
|
+
*/
|
|
123
|
+
export const isSwapKitPairSupported = async ({ from, to, }) => {
|
|
124
|
+
const providers = await getSwapKitProviders();
|
|
125
|
+
if (providers.length === 0) {
|
|
126
|
+
return true;
|
|
127
|
+
}
|
|
128
|
+
const fromId = swapKitProviderChainId[from];
|
|
129
|
+
const toId = swapKitProviderChainId[to];
|
|
130
|
+
return providers.some(({ provider, enabledChainIds }) => !swapKitExcludedProviders.has(normalizeSwapKitProvider(provider)) &&
|
|
131
|
+
enabledChainIds.includes(fromId) &&
|
|
132
|
+
enabledChainIds.includes(toId));
|
|
133
|
+
};
|
|
134
|
+
//# sourceMappingURL=SwapKitProviders.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SwapKitProviders.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/swap/general/swapkit/SwapKitProviders.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getSwapKitQuote.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/chain/swap/general/swapkit/api/getSwapKitQuote.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,uCAAuC,CAAA;AAEnE,OAAO,EAAE,gBAAgB,EAAiB,MAAM,oDAAoD,CAAA;AAEpG,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,gEAAgE,CAAA;
|
|
1
|
+
{"version":3,"file":"getSwapKitQuote.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/chain/swap/general/swapkit/api/getSwapKitQuote.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,uCAAuC,CAAA;AAEnE,OAAO,EAAE,gBAAgB,EAAiB,MAAM,oDAAoD,CAAA;AAEpG,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,gEAAgE,CAAA;AAYxH,OAAO,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAA;AAGzE,KAAK,KAAK,GAAG,MAAM,CAAC,iBAAiB,EAAE,WAAW,CAAC,mBAAmB,CAAC,CAAC,GAAG;IACzE,IAAI,EAAE,WAAW,CAAC,kBAAkB,CAAC,CAAA;IACrC,MAAM,EAAE,MAAM,CAAA;IACd,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,kEAAkE;IAClE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,CAAA;AAgqBD,eAAO,MAAM,eAAe,GAAU,+CAMnC,KAAK,KAAG,OAAO,CAAC,gBAAgB,CA0ClC,CAAA"}
|