@vultisig/core-chain 2.9.0 → 2.10.1
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 +31 -0
- package/dist/chains/ton/api.d.ts +11 -0
- package/dist/chains/ton/api.d.ts.map +1 -1
- package/dist/chains/ton/api.js +44 -3
- package/dist/chains/ton/api.js.map +1 -1
- package/dist/coin/token/metadata/chains.d.ts +1 -1
- package/dist/coin/token/metadata/chains.d.ts.map +1 -1
- package/dist/coin/token/metadata/chains.js +1 -0
- package/dist/coin/token/metadata/chains.js.map +1 -1
- package/dist/coin/token/metadata/index.d.ts.map +1 -1
- package/dist/coin/token/metadata/index.js +2 -0
- package/dist/coin/token/metadata/index.js.map +1 -1
- package/dist/coin/token/metadata/resolvers/ton.d.ts +8 -0
- package/dist/coin/token/metadata/resolvers/ton.d.ts.map +1 -0
- package/dist/coin/token/metadata/resolvers/ton.js +10 -0
- package/dist/coin/token/metadata/resolvers/ton.js.map +1 -0
- package/dist/swap/general/cowswap/api/getCowSwapQuote.d.ts.map +1 -1
- package/dist/swap/general/cowswap/api/getCowSwapQuote.js +11 -2
- package/dist/swap/general/cowswap/api/getCowSwapQuote.js.map +1 -1
- package/dist/swap/general/cowswap/getCowSwapExplorerOrderUrl.d.ts +13 -0
- package/dist/swap/general/cowswap/getCowSwapExplorerOrderUrl.d.ts.map +1 -0
- package/dist/swap/general/cowswap/getCowSwapExplorerOrderUrl.js +28 -0
- package/dist/swap/general/cowswap/getCowSwapExplorerOrderUrl.js.map +1 -0
- package/dist/swap/general/cowswap/keysign/cowSwapKeysignData.d.ts +34 -0
- package/dist/swap/general/cowswap/keysign/cowSwapKeysignData.d.ts.map +1 -0
- package/dist/swap/general/cowswap/keysign/cowSwapKeysignData.js +33 -0
- package/dist/swap/general/cowswap/keysign/cowSwapKeysignData.js.map +1 -0
- package/dist/swap/general/cowswap/sign/buildCowSwapOrderTypedData.d.ts +112 -0
- package/dist/swap/general/cowswap/sign/buildCowSwapOrderTypedData.d.ts.map +1 -0
- package/dist/swap/general/cowswap/sign/buildCowSwapOrderTypedData.js +67 -0
- package/dist/swap/general/cowswap/sign/buildCowSwapOrderTypedData.js.map +1 -0
- package/dist/swap/general/lifi/api/getLifiSwapQuote.d.ts +5 -1
- package/dist/swap/general/lifi/api/getLifiSwapQuote.d.ts.map +1 -1
- package/dist/swap/general/lifi/api/getLifiSwapQuote.js +25 -9
- package/dist/swap/general/lifi/api/getLifiSwapQuote.js.map +1 -1
- package/dist/swap/general/lifi/config.d.ts +71 -0
- package/dist/swap/general/lifi/config.d.ts.map +1 -1
- package/dist/swap/general/lifi/config.js +66 -0
- package/dist/swap/general/lifi/config.js.map +1 -1
- package/dist/swap/quote/findSwapQuote.d.ts +9 -10
- package/dist/swap/quote/findSwapQuote.d.ts.map +1 -1
- package/dist/swap/quote/findSwapQuote.js +77 -87
- package/dist/swap/quote/findSwapQuote.js.map +1 -1
- package/dist/utils/getBlockExplorerUrl/index.js +2 -2
- package/dist/utils/getBlockExplorerUrl/index.js.map +1 -1
- package/package.json +21 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,36 @@
|
|
|
1
1
|
# @vultisig/core-chain
|
|
2
2
|
|
|
3
|
+
## 2.10.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [#617](https://github.com/vultisig/vultisig-sdk/pull/617) [`7145713`](https://github.com/vultisig/vultisig-sdk/commit/7145713992199f084d826f160cc20a4c445b14fb) Thanks [@rcoderdev](https://github.com/rcoderdev)! - Select swap quotes with a 1% provider preference band instead of hard native priority.
|
|
8
|
+
|
|
9
|
+
## 2.10.0
|
|
10
|
+
|
|
11
|
+
### Minor Changes
|
|
12
|
+
|
|
13
|
+
- [#618](https://github.com/vultisig/vultisig-sdk/pull/618) [`ddf0bf4`](https://github.com/vultisig/vultisig-sdk/commit/ddf0bf44cc38905370f60246b88503954b3e3418) Thanks [@gomesalexandre](https://github.com/gomesalexandre)! - feat(swap/lifi): consumer-supplied LI.FI integrator + apiUrl override
|
|
14
|
+
|
|
15
|
+
Adds `SwapAffiliateConfig.lifi: LifiAffiliateConfig` so consumers (e.g. Station via `vultisig/mcp-ts`) can redirect LI.FI affiliate fees to their own portal integrator instead of the SDK-default `vultisig-0`.
|
|
16
|
+
|
|
17
|
+
New surface:
|
|
18
|
+
- `LifiAffiliateConfig` type — `{ integratorName: string; apiUrl?: string }`
|
|
19
|
+
- `setupLifi(config?)` — global LI.FI SDK bootstrap; idempotent first-caller-wins. Consumers call this once at module boot to set both the global `integrator` and (optional) `apiUrl` proxy.
|
|
20
|
+
- `getLifiSwapQuote` now accepts an optional `lifiAffiliateConfig` and uses its `integratorName` as the per-call `integrator` in `getQuote(...)`, overriding the global default for THIS quote without mutating the module-level `lifiConfig`.
|
|
21
|
+
- `findSwapQuote` threads `affiliateConfig?.lifi` into `getLifiSwapQuote`.
|
|
22
|
+
|
|
23
|
+
No behaviour change for callers that don't supply a `lifi` config — `getLifiSwapQuote` still routes through the existing `vultisig-0` default.
|
|
24
|
+
|
|
25
|
+
- [#619](https://github.com/vultisig/vultisig-sdk/pull/619) [`c63c713`](https://github.com/vultisig/vultisig-sdk/commit/c63c713de30c847a98d3b73c8ba5b5a882c0699b) Thanks [@Ehsan-saradar](https://github.com/Ehsan-saradar)! - feat(ton): add jetton master token metadata discovery
|
|
26
|
+
|
|
27
|
+
Adds a TON token metadata resolver so pasting a jetton master address (`EQ.../UQ...`) auto-fills ticker, decimals, and logo — same UX as EVM/Solana/Tron custom token discovery.
|
|
28
|
+
- New `getJettonMasterInfo()` helper hits Toncenter v3 `/jetton/masters`, preferring the validated indexer `token_info` entry over on-chain TEP-64 `jetton_content`.
|
|
29
|
+
- Logo selection prefers Toncenter's `imgproxy.toncenter.com` variants (`_image_medium` → `_image_small` → `_image_big`) before the raw `image` URL. Many jetton issuers serve their PNG with `Cross-Origin-Resource-Policy: same-origin`, which browsers refuse to embed cross-origin; the proxied variants load reliably.
|
|
30
|
+
- `OtherChain.Ton` added to `chainsWithTokenMetadataDiscovery`; the new `getTonTokenMetadata` resolver is registered under the `ton` chain kind.
|
|
31
|
+
|
|
32
|
+
Unblocks vultisig/vultisig-windows#4029.
|
|
33
|
+
|
|
3
34
|
## 2.9.0
|
|
4
35
|
|
|
5
36
|
### Minor Changes
|
package/dist/chains/ton/api.d.ts
CHANGED
|
@@ -7,5 +7,16 @@ export declare const getJettonWalletAddress: (input: GetJettonWalletInput) => Pr
|
|
|
7
7
|
/** Fetches the balance of a specific jetton for a given owner address. */
|
|
8
8
|
export declare const getJettonBalance: (input: GetJettonWalletInput) => Promise<bigint>;
|
|
9
9
|
export declare const getTonWalletState: (address: string) => Promise<string>;
|
|
10
|
+
export type JettonMasterInfo = {
|
|
11
|
+
ticker: string;
|
|
12
|
+
decimals: number;
|
|
13
|
+
logo?: string;
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Fetches jetton master metadata (ticker, decimals, logo) from toncenter v3.
|
|
17
|
+
* Prefers Toncenter's validated indexer entry (`token_info` with `valid: true`),
|
|
18
|
+
* falling back to the on-chain TEP-64 `jetton_content` stored in the master.
|
|
19
|
+
*/
|
|
20
|
+
export declare const getJettonMasterInfo: (jettonMasterAddress: string) => Promise<JettonMasterInfo>;
|
|
10
21
|
export {};
|
|
11
22
|
//# sourceMappingURL=api.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/chain/chains/ton/api.ts"],"names":[],"mappings":"AAqBA,KAAK,oBAAoB,GAAG;IAC1B,YAAY,EAAE,MAAM,CAAA;IACpB,mBAAmB,EAAE,MAAM,CAAA;CAC5B,CAAA;
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/chain/chains/ton/api.ts"],"names":[],"mappings":"AAqBA,KAAK,oBAAoB,GAAG;IAC1B,YAAY,EAAE,MAAM,CAAA;IACpB,mBAAmB,EAAE,MAAM,CAAA;CAC5B,CAAA;AAeD,4FAA4F;AAC5F,eAAO,MAAM,sBAAsB,GAAU,OAAO,oBAAoB,KAAG,OAAO,CAAC,MAAM,CAUxF,CAAA;AAED,0EAA0E;AAC1E,eAAO,MAAM,gBAAgB,GAAU,OAAO,oBAAoB,KAAG,OAAO,CAAC,MAAM,CAKlF,CAAA;AAOD,eAAO,MAAM,iBAAiB,GAAU,SAAS,MAAM,KAAG,OAAO,CAAC,MAAM,CAKvE,CAAA;AA4CD,MAAM,MAAM,gBAAgB,GAAG;IAC7B,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,CAAC,EAAE,MAAM,CAAA;CACd,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,GAAU,qBAAqB,MAAM,KAAG,OAAO,CAAC,gBAAgB,CAsC/F,CAAA"}
|
package/dist/chains/ton/api.js
CHANGED
|
@@ -2,11 +2,16 @@ import { rootApiUrl } from '@vultisig/core-config';
|
|
|
2
2
|
import { queryUrl } from '@vultisig/lib-utils/query/queryUrl';
|
|
3
3
|
import { tonAddressToRaw } from './address.js';
|
|
4
4
|
const tonApiUrl = `${rootApiUrl}/ton`;
|
|
5
|
-
/**
|
|
5
|
+
/**
|
|
6
|
+
* Builds the Vultisig proxy jetton wallets query URL.
|
|
7
|
+
* The proxy expects `owner_id` + `jetton_master_id` (not `owner_address` / `jetton_address`).
|
|
8
|
+
* Using the wrong param names returns an empty array without an error, silently
|
|
9
|
+
* making every jetton balance call return 0 and every transfer fail with "no jetton wallet".
|
|
10
|
+
*/
|
|
6
11
|
const getJettonWalletsUrl = ({ ownerAddress, jettonMasterAddress }) => {
|
|
7
12
|
const rawOwner = tonAddressToRaw(ownerAddress);
|
|
8
13
|
const rawMaster = tonAddressToRaw(jettonMasterAddress);
|
|
9
|
-
return `${tonApiUrl}/v3/jetton/wallets?
|
|
14
|
+
return `${tonApiUrl}/v3/jetton/wallets?owner_id=${rawOwner}&jetton_master_id=${rawMaster}`;
|
|
10
15
|
};
|
|
11
16
|
/** Resolves the user-friendly jetton wallet address for a given owner and jetton master. */
|
|
12
17
|
export const getJettonWalletAddress = async (input) => {
|
|
@@ -22,11 +27,47 @@ export const getJettonWalletAddress = async (input) => {
|
|
|
22
27
|
export const getJettonBalance = async (input) => {
|
|
23
28
|
const response = await queryUrl(getJettonWalletsUrl(input));
|
|
24
29
|
const balance = response.jetton_wallets[0]?.balance;
|
|
25
|
-
return BigInt(balance
|
|
30
|
+
return BigInt(balance || '0');
|
|
26
31
|
};
|
|
27
32
|
export const getTonWalletState = async (address) => {
|
|
28
33
|
const url = `${tonApiUrl}/v3/addressInformation?address=${address}&use_v2=false`;
|
|
29
34
|
const response = await queryUrl(url);
|
|
30
35
|
return response.status;
|
|
31
36
|
};
|
|
37
|
+
/**
|
|
38
|
+
* Fetches jetton master metadata (ticker, decimals, logo) from toncenter v3.
|
|
39
|
+
* Prefers Toncenter's validated indexer entry (`token_info` with `valid: true`),
|
|
40
|
+
* falling back to the on-chain TEP-64 `jetton_content` stored in the master.
|
|
41
|
+
*/
|
|
42
|
+
export const getJettonMasterInfo = async (jettonMasterAddress) => {
|
|
43
|
+
const url = `${tonApiUrl}/v3/jetton/masters?address=${encodeURIComponent(jettonMasterAddress)}&limit=1`;
|
|
44
|
+
const response = await queryUrl(url);
|
|
45
|
+
const master = response.jetton_masters[0];
|
|
46
|
+
if (!master) {
|
|
47
|
+
throw new Error(`No jetton master found for ${jettonMasterAddress}`);
|
|
48
|
+
}
|
|
49
|
+
const nonEmpty = (value) => {
|
|
50
|
+
const trimmed = value?.trim();
|
|
51
|
+
return trimmed ? trimmed : undefined;
|
|
52
|
+
};
|
|
53
|
+
const indexed = response.metadata?.[master.address]?.token_info?.find(entry => entry.valid === true);
|
|
54
|
+
const content = master.jetton_content;
|
|
55
|
+
const ticker = nonEmpty(indexed?.symbol) ?? nonEmpty(content?.symbol);
|
|
56
|
+
if (!ticker) {
|
|
57
|
+
throw new Error(`Jetton master ${jettonMasterAddress} has no symbol`);
|
|
58
|
+
}
|
|
59
|
+
const decimalsRaw = indexed?.extra?.decimals ?? content?.decimals;
|
|
60
|
+
const parsedDecimals = decimalsRaw !== undefined ? parseInt(decimalsRaw, 10) : NaN;
|
|
61
|
+
const decimals = Number.isFinite(parsedDecimals) ? parsedDecimals : 9;
|
|
62
|
+
// Prefer Toncenter's imgproxy URLs: the original `image` URL often serves
|
|
63
|
+
// with `Cross-Origin-Resource-Policy: same-origin`, which browsers refuse
|
|
64
|
+
// to embed cross-origin. The `_image_*` variants are normalized PNGs from
|
|
65
|
+
// `imgproxy.toncenter.com` and load reliably in extension/desktop pages.
|
|
66
|
+
const logo = nonEmpty(indexed?.extra?._image_medium) ??
|
|
67
|
+
nonEmpty(indexed?.extra?._image_small) ??
|
|
68
|
+
nonEmpty(indexed?.extra?._image_big) ??
|
|
69
|
+
nonEmpty(indexed?.image) ??
|
|
70
|
+
nonEmpty(content?.image);
|
|
71
|
+
return { ticker, decimals, logo };
|
|
72
|
+
};
|
|
32
73
|
//# sourceMappingURL=api.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../../../../../packages/core/chain/chains/ton/api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAA;AAE7D,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAE3C,MAAM,SAAS,GAAG,GAAG,UAAU,MAAM,CAAA;AAqBrC
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../../../../../packages/core/chain/chains/ton/api.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { DeriveChainKind } from '@vultisig/core-chain/ChainKind';
|
|
2
2
|
import { OtherChain } from '../../../Chain.js';
|
|
3
|
-
export declare const chainsWithTokenMetadataDiscovery: readonly ("Arbitrum" | "Base" | "Blast" | "Optimism" | "Zksync" | "Mantle" | "Avalanche" | "CronosChain" | "BSC" | "Ethereum" | "Polygon" | "Hyperliquid" | "Sei" | "Cosmos" | "Osmosis" | "Dydx" | "Kujira" | "Terra" | "TerraClassic" | "Noble" | "Akash" | "THORChain" | "MayaChain" | OtherChain.Solana | OtherChain.Tron | OtherChain.Cardano)[];
|
|
3
|
+
export declare const chainsWithTokenMetadataDiscovery: readonly ("Arbitrum" | "Base" | "Blast" | "Optimism" | "Zksync" | "Mantle" | "Avalanche" | "CronosChain" | "BSC" | "Ethereum" | "Polygon" | "Hyperliquid" | "Sei" | "Cosmos" | "Osmosis" | "Dydx" | "Kujira" | "Terra" | "TerraClassic" | "Noble" | "Akash" | "THORChain" | "MayaChain" | OtherChain.Solana | OtherChain.Ton | OtherChain.Tron | OtherChain.Cardano)[];
|
|
4
4
|
export type ChainWithTokenMetadataDiscovery = (typeof chainsWithTokenMetadataDiscovery)[number];
|
|
5
5
|
export type ChainKindWithTokenMetadataDiscovery = DeriveChainKind<ChainWithTokenMetadataDiscovery>;
|
|
6
6
|
//# sourceMappingURL=chains.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chains.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/chain/coin/token/metadata/chains.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAA;AAEhE,OAAO,EAAyB,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAElE,eAAO,MAAM,gCAAgC,
|
|
1
|
+
{"version":3,"file":"chains.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/chain/coin/token/metadata/chains.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAA;AAEhE,OAAO,EAAyB,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAElE,eAAO,MAAM,gCAAgC,wWAOnC,CAAA;AAEV,MAAM,MAAM,+BAA+B,GAAG,CAAC,OAAO,gCAAgC,CAAC,CAAC,MAAM,CAAC,CAAA;AAE/F,MAAM,MAAM,mCAAmC,GAAG,eAAe,CAAC,+BAA+B,CAAC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chains.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/coin/token/metadata/chains.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAElE,MAAM,CAAC,MAAM,gCAAgC,GAAG;IAC9C,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC;IAC1B,UAAU,CAAC,MAAM;IACjB,UAAU,CAAC,IAAI;IACf,UAAU,CAAC,OAAO;IAClB,GAAG,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC;CACrB,CAAA"}
|
|
1
|
+
{"version":3,"file":"chains.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/coin/token/metadata/chains.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAElE,MAAM,CAAC,MAAM,gCAAgC,GAAG;IAC9C,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC;IAC1B,UAAU,CAAC,MAAM;IACjB,UAAU,CAAC,GAAG;IACd,UAAU,CAAC,IAAI;IACf,UAAU,CAAC,OAAO;IAClB,GAAG,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC;CACrB,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/chain/coin/token/metadata/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/chain/coin/token/metadata/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAA;AAiBlD,eAAO,MAAM,gBAAgB,EAAE,qBAM9B,CAAA"}
|
|
@@ -3,11 +3,13 @@ import { getCardanoTokenMetadata } from './resolvers/cardano.js';
|
|
|
3
3
|
import { getCosmosTokenMetadata } from './resolvers/cosmos.js';
|
|
4
4
|
import { getEvmTokenMetadata } from './resolvers/evm.js';
|
|
5
5
|
import { getSolanaTokenMetadata } from './resolvers/solana.js';
|
|
6
|
+
import { getTonTokenMetadata } from './resolvers/ton.js';
|
|
6
7
|
import { getTronTokenMetadata } from './resolvers/tron.js';
|
|
7
8
|
const resolvers = {
|
|
8
9
|
evm: getEvmTokenMetadata,
|
|
9
10
|
solana: getSolanaTokenMetadata,
|
|
10
11
|
cosmos: getCosmosTokenMetadata,
|
|
12
|
+
ton: getTonTokenMetadata,
|
|
11
13
|
tron: getTronTokenMetadata,
|
|
12
14
|
cardano: getCardanoTokenMetadata,
|
|
13
15
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/coin/token/metadata/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAA;AAI7D,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAA;AAC7D,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAA;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AACrD,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAA;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;AAEvD,MAAM,SAAS,GAA4E;IACzF,GAAG,EAAE,mBAAmB;IACxB,MAAM,EAAE,sBAAsB;IAC9B,MAAM,EAAE,sBAAsB;IAC9B,IAAI,EAAE,oBAAoB;IAC1B,OAAO,EAAE,uBAAuB;CACjC,CAAA;AAED,MAAM,CAAC,MAAM,gBAAgB,GAA0B,KAAK,EAAC,KAAK,EAAC,EAAE;IACnE,MAAM,SAAS,GAAG,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;IAE3C,MAAM,QAAQ,GAAG,SAAS,CAAC,SAAS,CAAC,CAAA;IAErC,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAA;AACxB,CAAC,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/coin/token/metadata/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAA;AAI7D,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAA;AAC7D,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAA;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AACrD,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAA;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;AAEvD,MAAM,SAAS,GAA4E;IACzF,GAAG,EAAE,mBAAmB;IACxB,MAAM,EAAE,sBAAsB;IAC9B,MAAM,EAAE,sBAAsB;IAC9B,GAAG,EAAE,mBAAmB;IACxB,IAAI,EAAE,oBAAoB;IAC1B,OAAO,EAAE,uBAAuB;CACjC,CAAA;AAED,MAAM,CAAC,MAAM,gBAAgB,GAA0B,KAAK,EAAC,KAAK,EAAC,EAAE;IACnE,MAAM,SAAS,GAAG,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;IAE3C,MAAM,QAAQ,GAAG,SAAS,CAAC,SAAS,CAAC,CAAA;IAErC,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAA;AACxB,CAAC,CAAA"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { OtherChain } from '@vultisig/core-chain/Chain';
|
|
2
|
+
import { TokenMetadataResolver } from '../resolver.js';
|
|
3
|
+
/**
|
|
4
|
+
* Resolves TON jetton metadata from the Toncenter v3 `/jetton/masters` endpoint.
|
|
5
|
+
* The `id` is the jetton master contract address (user-friendly EQ.../UQ... form).
|
|
6
|
+
*/
|
|
7
|
+
export declare const getTonTokenMetadata: TokenMetadataResolver<OtherChain.Ton>;
|
|
8
|
+
//# sourceMappingURL=ton.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ton.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/chain/coin/token/metadata/resolvers/ton.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AAGvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;AAEnD;;;GAGG;AACH,eAAO,MAAM,mBAAmB,EAAE,qBAAqB,CAAC,UAAU,CAAC,GAAG,CAIrE,CAAA"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { getJettonMasterInfo } from '@vultisig/core-chain/chains/ton/api';
|
|
2
|
+
/**
|
|
3
|
+
* Resolves TON jetton metadata from the Toncenter v3 `/jetton/masters` endpoint.
|
|
4
|
+
* The `id` is the jetton master contract address (user-friendly EQ.../UQ... form).
|
|
5
|
+
*/
|
|
6
|
+
export const getTonTokenMetadata = async ({ id }) => {
|
|
7
|
+
const { ticker, decimals, logo } = await getJettonMasterInfo(id);
|
|
8
|
+
return { ticker, decimals, logo };
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=ton.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ton.js","sourceRoot":"","sources":["../../../../../../../../packages/core/chain/coin/token/metadata/resolvers/ton.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAA;AAIzE;;;GAGG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAA0C,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;IACzF,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,MAAM,mBAAmB,CAAC,EAAE,CAAC,CAAA;IAEhE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAA;AACnC,CAAC,CAAA"}
|
|
@@ -1 +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,
|
|
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,CA+DlD"}
|
|
@@ -23,6 +23,15 @@ export async function getCowSwapQuote({ sellToken, buyToken, sellAmount, from, r
|
|
|
23
23
|
});
|
|
24
24
|
const { quote } = response;
|
|
25
25
|
const permitRequired = KNOWN_PERMIT_TOKENS[chainConfig.chainId]?.some(addr => addr.toLowerCase() === sellToken.toLowerCase());
|
|
26
|
+
// The CoW orderbook requires submitted orders to carry `feeAmount = 0` — the
|
|
27
|
+
// network/solver fee is folded into the price (taken from order surplus), not
|
|
28
|
+
// charged as a discrete field. A non-zero fee is rejected with
|
|
29
|
+
// `{"errorType":"NonZeroFee"}`. The quote returns the NET sellAmount plus a
|
|
30
|
+
// separate feeAmount, so we sell the GROSS amount (net + fee) with a zero fee:
|
|
31
|
+
// the solver recovers its cost from the surplus over `buyAmount`, which was
|
|
32
|
+
// quoted for the net amount. This value is signed AND submitted, so both stay
|
|
33
|
+
// consistent.
|
|
34
|
+
const grossSellAmount = (BigInt(quote.sellAmount) + BigInt(quote.feeAmount)).toString();
|
|
26
35
|
return {
|
|
27
36
|
dstAmount: quote.buyAmount,
|
|
28
37
|
provider: 'cowswap',
|
|
@@ -31,12 +40,12 @@ export async function getCowSwapQuote({ sellToken, buyToken, sellAmount, from, r
|
|
|
31
40
|
sellToken: quote.sellToken,
|
|
32
41
|
buyToken: quote.buyToken,
|
|
33
42
|
receiver,
|
|
34
|
-
sellAmount:
|
|
43
|
+
sellAmount: grossSellAmount,
|
|
35
44
|
buyAmount: quote.buyAmount,
|
|
36
45
|
validTo: quote.validTo,
|
|
37
46
|
appData,
|
|
38
47
|
appDataHash,
|
|
39
|
-
feeAmount:
|
|
48
|
+
feeAmount: '0',
|
|
40
49
|
kind: quote.kind,
|
|
41
50
|
partiallyFillable: quote.partiallyFillable,
|
|
42
51
|
sellTokenBalance: 'erc20',
|
|
@@ -1 +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,
|
|
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,6EAA6E;IAC7E,8EAA8E;IAC9E,+DAA+D;IAC/D,4EAA4E;IAC5E,+EAA+E;IAC/E,4EAA4E;IAC5E,8EAA8E;IAC9E,cAAc;IACd,MAAM,eAAe,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAA;IAEvF,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,eAAe;gBAC3B,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,OAAO;gBACP,WAAW;gBACX,SAAS,EAAE,GAAG;gBACd,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,13 @@
|
|
|
1
|
+
import { Chain } from '@vultisig/core-chain/Chain';
|
|
2
|
+
/**
|
|
3
|
+
* Link to a CowSwap order's page on CoW Explorer (keyed by the order UID).
|
|
4
|
+
*
|
|
5
|
+
* Used for the PENDING state, while the off-chain order is still being settled
|
|
6
|
+
* by solvers and there is no on-chain tx hash yet. Once the order is filled the
|
|
7
|
+
* consumer swaps this for the settlement tx's block-explorer link.
|
|
8
|
+
*/
|
|
9
|
+
export declare const getCowSwapExplorerOrderUrl: ({ chain, uid }: {
|
|
10
|
+
chain: Chain;
|
|
11
|
+
uid: string;
|
|
12
|
+
}) => string;
|
|
13
|
+
//# sourceMappingURL=getCowSwapExplorerOrderUrl.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getCowSwapExplorerOrderUrl.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/chain/swap/general/cowswap/getCowSwapExplorerOrderUrl.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAY,MAAM,4BAA4B,CAAA;AAW5D;;;;;;GAMG;AACH,eAAO,MAAM,0BAA0B,GAAI,gBAAgB;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,KAAG,MAU1F,CAAA"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { EvmChain } from '@vultisig/core-chain/Chain';
|
|
2
|
+
// CoW Explorer network path segments. Mainnet has no segment; the rest are the
|
|
3
|
+
// slugs CoW Explorer routes on (https://explorer.cow.fi/<segment>/orders/<uid>).
|
|
4
|
+
const cowExplorerNetworkSegment = {
|
|
5
|
+
[EvmChain.Ethereum]: '',
|
|
6
|
+
[EvmChain.Arbitrum]: 'arb1',
|
|
7
|
+
[EvmChain.Base]: 'base',
|
|
8
|
+
[EvmChain.Avalanche]: 'avax',
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* Link to a CowSwap order's page on CoW Explorer (keyed by the order UID).
|
|
12
|
+
*
|
|
13
|
+
* Used for the PENDING state, while the off-chain order is still being settled
|
|
14
|
+
* by solvers and there is no on-chain tx hash yet. Once the order is filled the
|
|
15
|
+
* consumer swaps this for the settlement tx's block-explorer link.
|
|
16
|
+
*/
|
|
17
|
+
export const getCowSwapExplorerOrderUrl = ({ chain, uid }) => {
|
|
18
|
+
const segment = cowExplorerNetworkSegment[chain];
|
|
19
|
+
// `undefined` (unsupported chain) is distinct from `''` (mainnet, no segment).
|
|
20
|
+
// Fail fast rather than silently aliasing an unknown chain to the Ethereum
|
|
21
|
+
// explorer route — CowSwap only ever routes on the chains mapped above.
|
|
22
|
+
if (segment === undefined) {
|
|
23
|
+
throw new Error(`CowSwap explorer URL is not supported for chain: ${chain}`);
|
|
24
|
+
}
|
|
25
|
+
const prefix = segment ? `/${segment}` : '';
|
|
26
|
+
return `https://explorer.cow.fi${prefix}/orders/${uid}`;
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=getCowSwapExplorerOrderUrl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getCowSwapExplorerOrderUrl.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/swap/general/cowswap/getCowSwapExplorerOrderUrl.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,QAAQ,EAAE,MAAM,4BAA4B,CAAA;AAE5D,+EAA+E;AAC/E,iFAAiF;AACjF,MAAM,yBAAyB,GAAmC;IAChE,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,EAAE;IACvB,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM;IAC3B,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM;IACvB,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM;CAC7B,CAAA;AAED;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,EAAE,KAAK,EAAE,GAAG,EAAiC,EAAU,EAAE;IAClG,MAAM,OAAO,GAAG,yBAAyB,CAAC,KAAK,CAAC,CAAA;IAChD,+EAA+E;IAC/E,2EAA2E;IAC3E,wEAAwE;IACxE,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,oDAAoD,KAAK,EAAE,CAAC,CAAA;IAC9E,CAAC;IACD,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;IAC3C,OAAO,0BAA0B,MAAM,WAAW,GAAG,EAAE,CAAA;AACzD,CAAC,CAAA"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { CowSwapOrder } from '../sign/buildCowSwapOrder.js';
|
|
2
|
+
/**
|
|
3
|
+
* Everything a consumer needs to (1) reconstruct the EIP-712 order digest to
|
|
4
|
+
* sign and (2) submit the signed order to the orderbook — carried inside the
|
|
5
|
+
* keysign payload so the off-chain CowSwap leg survives the round-trip through
|
|
6
|
+
* the MPC ceremony without a bespoke proto message.
|
|
7
|
+
*
|
|
8
|
+
* CowSwap orders are settled off-chain by solvers, so the keysign payload has
|
|
9
|
+
* no on-chain calldata to encode. Instead we serialize this into the
|
|
10
|
+
* `OneInchTransaction.data` field (provider `'cowswap'`) and the consumer
|
|
11
|
+
* decodes it after signing to call `submitCowSwapOrder`.
|
|
12
|
+
*/
|
|
13
|
+
export type CowSwapKeysignData = {
|
|
14
|
+
order: CowSwapOrder;
|
|
15
|
+
chainId: number;
|
|
16
|
+
apiBase: string;
|
|
17
|
+
/** The order owner / signer address (the vault's EVM address). */
|
|
18
|
+
from: string;
|
|
19
|
+
/** True when the sell token supports EIP-2612 permit (gasless approval). */
|
|
20
|
+
permitRequired?: boolean;
|
|
21
|
+
};
|
|
22
|
+
/** Marker prefix so a consumer can cheaply distinguish CowSwap order data from
|
|
23
|
+
* the hex calldata that other general-swap providers put in the same field. */
|
|
24
|
+
export declare const cowSwapKeysignDataPrefix = "cowswap-order:";
|
|
25
|
+
/** Serialize CowSwap order data for transport in the keysign payload's
|
|
26
|
+
* `OneInchTransaction.data` field. */
|
|
27
|
+
export declare const encodeCowSwapKeysignData: (data: CowSwapKeysignData) => string;
|
|
28
|
+
/** Recover CowSwap order data from a keysign payload's `data` field. Returns
|
|
29
|
+
* `null` for non-CowSwap (hex calldata) or malformed payloads so callers can
|
|
30
|
+
* branch without throwing. */
|
|
31
|
+
export declare const decodeCowSwapKeysignData: (data: string) => CowSwapKeysignData | null;
|
|
32
|
+
/** Cheap discriminator for the consumer's keysign branch. */
|
|
33
|
+
export declare const isCowSwapKeysignData: (data: string) => boolean;
|
|
34
|
+
//# sourceMappingURL=cowSwapKeysignData.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cowSwapKeysignData.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/chain/swap/general/cowswap/keysign/cowSwapKeysignData.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAExD;;;;;;;;;;GAUG;AACH,MAAM,MAAM,kBAAkB,GAAG;IAC/B,KAAK,EAAE,YAAY,CAAA;IACnB,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,kEAAkE;IAClE,IAAI,EAAE,MAAM,CAAA;IACZ,4EAA4E;IAC5E,cAAc,CAAC,EAAE,OAAO,CAAA;CACzB,CAAA;AAED;+EAC+E;AAC/E,eAAO,MAAM,wBAAwB,mBAAmB,CAAA;AAExD;sCACsC;AACtC,eAAO,MAAM,wBAAwB,GAAI,MAAM,kBAAkB,KAAG,MACd,CAAA;AAEtD;;8BAE8B;AAC9B,eAAO,MAAM,wBAAwB,GAAI,MAAM,MAAM,KAAG,kBAAkB,GAAG,IAuB5E,CAAA;AAED,6DAA6D;AAC7D,eAAO,MAAM,oBAAoB,GAAI,MAAM,MAAM,KAAG,OAAoD,CAAA"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { attempt } from '@vultisig/lib-utils/attempt';
|
|
2
|
+
/** Marker prefix so a consumer can cheaply distinguish CowSwap order data from
|
|
3
|
+
* the hex calldata that other general-swap providers put in the same field. */
|
|
4
|
+
export const cowSwapKeysignDataPrefix = 'cowswap-order:';
|
|
5
|
+
/** Serialize CowSwap order data for transport in the keysign payload's
|
|
6
|
+
* `OneInchTransaction.data` field. */
|
|
7
|
+
export const encodeCowSwapKeysignData = (data) => `${cowSwapKeysignDataPrefix}${JSON.stringify(data)}`;
|
|
8
|
+
/** Recover CowSwap order data from a keysign payload's `data` field. Returns
|
|
9
|
+
* `null` for non-CowSwap (hex calldata) or malformed payloads so callers can
|
|
10
|
+
* branch without throwing. */
|
|
11
|
+
export const decodeCowSwapKeysignData = (data) => {
|
|
12
|
+
if (!data.startsWith(cowSwapKeysignDataPrefix)) {
|
|
13
|
+
return null;
|
|
14
|
+
}
|
|
15
|
+
const json = data.slice(cowSwapKeysignDataPrefix.length);
|
|
16
|
+
const result = attempt(() => JSON.parse(json));
|
|
17
|
+
if (!('data' in result) || result.data == null || typeof result.data !== 'object') {
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
// Validate the decoded shape before handing it past the decode boundary — a
|
|
21
|
+
// malformed payload (missing/wrong-typed fields) must not slip through and
|
|
22
|
+
// fail later at sign/submit time.
|
|
23
|
+
const parsed = result.data;
|
|
24
|
+
const isValid = typeof parsed.chainId === 'number' &&
|
|
25
|
+
typeof parsed.apiBase === 'string' &&
|
|
26
|
+
typeof parsed.from === 'string' &&
|
|
27
|
+
parsed.order != null &&
|
|
28
|
+
typeof parsed.order === 'object';
|
|
29
|
+
return isValid ? parsed : null;
|
|
30
|
+
};
|
|
31
|
+
/** Cheap discriminator for the consumer's keysign branch. */
|
|
32
|
+
export const isCowSwapKeysignData = (data) => data.startsWith(cowSwapKeysignDataPrefix);
|
|
33
|
+
//# sourceMappingURL=cowSwapKeysignData.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cowSwapKeysignData.js","sourceRoot":"","sources":["../../../../../../../../packages/core/chain/swap/general/cowswap/keysign/cowSwapKeysignData.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAA;AAyBrD;+EAC+E;AAC/E,MAAM,CAAC,MAAM,wBAAwB,GAAG,gBAAgB,CAAA;AAExD;sCACsC;AACtC,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,IAAwB,EAAU,EAAE,CAC3E,GAAG,wBAAwB,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAA;AAEtD;;8BAE8B;AAC9B,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,IAAY,EAA6B,EAAE;IAClF,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,wBAAwB,CAAC,EAAE,CAAC;QAC/C,OAAO,IAAI,CAAA;IACb,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,wBAAwB,CAAC,MAAM,CAAC,CAAA;IACxD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAuB,CAAC,CAAA;IACpE,IAAI,CAAC,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,IAAI,IAAI,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAClF,OAAO,IAAI,CAAA;IACb,CAAC;IAED,4EAA4E;IAC5E,2EAA2E;IAC3E,kCAAkC;IAClC,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAA;IAC1B,MAAM,OAAO,GACX,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ;QAClC,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ;QAClC,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ;QAC/B,MAAM,CAAC,KAAK,IAAI,IAAI;QACpB,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,CAAA;IAElC,OAAO,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAA;AAChC,CAAC,CAAA;AAED,6DAA6D;AAC7D,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,IAAY,EAAW,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,wBAAwB,CAAC,CAAA"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { CowSwapOrder } from './buildCowSwapOrder.js';
|
|
2
|
+
import { Eip712Domain } from './buildEip712Domain.js';
|
|
3
|
+
/**
|
|
4
|
+
* EIP-712 field descriptors for the CoW Protocol (GPv2) `Order` struct.
|
|
5
|
+
*
|
|
6
|
+
* This list — names, types AND order — is consensus-critical: it must match
|
|
7
|
+
* `GPv2Order.TYPE_HASH` byte-for-byte or the orderbook rejects the signature.
|
|
8
|
+
* The canonical definition lives in GPv2's `GPv2Order.sol`
|
|
9
|
+
* (`Order(address sellToken,address buyToken,address receiver,uint256 sellAmount,
|
|
10
|
+
* uint256 buyAmount,uint32 validTo,bytes32 appData,uint256 feeAmount,string kind,
|
|
11
|
+
* bool partiallyFillable,string sellTokenBalance,string buyTokenBalance)`).
|
|
12
|
+
*
|
|
13
|
+
* NOTE: `kind`, `sellTokenBalance`, `buyTokenBalance` are EIP-712 `string`
|
|
14
|
+
* fields (hashed as keccak256 of their utf-8 bytes), NOT enums — the
|
|
15
|
+
* `'sell' | 'buy'` / `'erc20'` values flow through verbatim.
|
|
16
|
+
*/
|
|
17
|
+
export declare const cowSwapOrderEip712Fields: readonly [{
|
|
18
|
+
readonly name: "sellToken";
|
|
19
|
+
readonly type: "address";
|
|
20
|
+
}, {
|
|
21
|
+
readonly name: "buyToken";
|
|
22
|
+
readonly type: "address";
|
|
23
|
+
}, {
|
|
24
|
+
readonly name: "receiver";
|
|
25
|
+
readonly type: "address";
|
|
26
|
+
}, {
|
|
27
|
+
readonly name: "sellAmount";
|
|
28
|
+
readonly type: "uint256";
|
|
29
|
+
}, {
|
|
30
|
+
readonly name: "buyAmount";
|
|
31
|
+
readonly type: "uint256";
|
|
32
|
+
}, {
|
|
33
|
+
readonly name: "validTo";
|
|
34
|
+
readonly type: "uint32";
|
|
35
|
+
}, {
|
|
36
|
+
readonly name: "appData";
|
|
37
|
+
readonly type: "bytes32";
|
|
38
|
+
}, {
|
|
39
|
+
readonly name: "feeAmount";
|
|
40
|
+
readonly type: "uint256";
|
|
41
|
+
}, {
|
|
42
|
+
readonly name: "kind";
|
|
43
|
+
readonly type: "string";
|
|
44
|
+
}, {
|
|
45
|
+
readonly name: "partiallyFillable";
|
|
46
|
+
readonly type: "bool";
|
|
47
|
+
}, {
|
|
48
|
+
readonly name: "sellTokenBalance";
|
|
49
|
+
readonly type: "string";
|
|
50
|
+
}, {
|
|
51
|
+
readonly name: "buyTokenBalance";
|
|
52
|
+
readonly type: "string";
|
|
53
|
+
}];
|
|
54
|
+
declare const eip712DomainFields: readonly [{
|
|
55
|
+
readonly name: "name";
|
|
56
|
+
readonly type: "string";
|
|
57
|
+
}, {
|
|
58
|
+
readonly name: "version";
|
|
59
|
+
readonly type: "string";
|
|
60
|
+
}, {
|
|
61
|
+
readonly name: "chainId";
|
|
62
|
+
readonly type: "uint256";
|
|
63
|
+
}, {
|
|
64
|
+
readonly name: "verifyingContract";
|
|
65
|
+
readonly type: "address";
|
|
66
|
+
}];
|
|
67
|
+
/** The EIP-712 message body for a GPv2 `Order`. `appData` is the bytes32 hash
|
|
68
|
+
* of the appData JSON (NOT the JSON itself) — the orderbook re-derives and
|
|
69
|
+
* verifies it against the submitted `appData` string. */
|
|
70
|
+
export type CowSwapOrderEip712Message = {
|
|
71
|
+
sellToken: string;
|
|
72
|
+
buyToken: string;
|
|
73
|
+
receiver: string;
|
|
74
|
+
sellAmount: string;
|
|
75
|
+
buyAmount: string;
|
|
76
|
+
validTo: number;
|
|
77
|
+
appData: string;
|
|
78
|
+
feeAmount: string;
|
|
79
|
+
kind: string;
|
|
80
|
+
partiallyFillable: boolean;
|
|
81
|
+
sellTokenBalance: string;
|
|
82
|
+
buyTokenBalance: string;
|
|
83
|
+
};
|
|
84
|
+
/** Self-contained EIP-712 typed-data document, ready to JSON-stringify and feed
|
|
85
|
+
* to an `eth_signTypedData_v4` signer (the same shape WalletConnect / MetaMask
|
|
86
|
+
* accept). Includes `EIP712Domain` in `types` for spec-completeness; signers
|
|
87
|
+
* that build the domain separator separately simply omit it. */
|
|
88
|
+
export type CowSwapOrderTypedData = {
|
|
89
|
+
primaryType: 'Order';
|
|
90
|
+
domain: Eip712Domain;
|
|
91
|
+
types: {
|
|
92
|
+
EIP712Domain: typeof eip712DomainFields;
|
|
93
|
+
Order: typeof cowSwapOrderEip712Fields;
|
|
94
|
+
};
|
|
95
|
+
message: CowSwapOrderEip712Message;
|
|
96
|
+
};
|
|
97
|
+
type BuildCowSwapOrderTypedDataInput = {
|
|
98
|
+
order: CowSwapOrder;
|
|
99
|
+
chainId: number;
|
|
100
|
+
};
|
|
101
|
+
/**
|
|
102
|
+
* Build the `eth_signTypedData_v4` document for a CowSwap order.
|
|
103
|
+
*
|
|
104
|
+
* The resulting digest (EIP-712 hash of this document) is what the MPC ceremony
|
|
105
|
+
* signs; the 65-byte `r||s||v` signature is submitted to the orderbook alongside
|
|
106
|
+
* the order via `submitCowSwapOrder`. The order's `appDataHash` becomes the
|
|
107
|
+
* signed `appData` field — the orderbook verifies it matches the `appData`
|
|
108
|
+
* string in the submitted order.
|
|
109
|
+
*/
|
|
110
|
+
export declare const buildCowSwapOrderTypedData: ({ order, chainId, }: BuildCowSwapOrderTypedDataInput) => CowSwapOrderTypedData;
|
|
111
|
+
export {};
|
|
112
|
+
//# sourceMappingURL=buildCowSwapOrderTypedData.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buildCowSwapOrderTypedData.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/chain/swap/general/cowswap/sign/buildCowSwapOrderTypedData.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,EAAqB,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAErE;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAa3B,CAAA;AAEV,QAAA,MAAM,kBAAkB;;;;;;;;;;;;EAKd,CAAA;AAEV;;yDAEyD;AACzD,MAAM,MAAM,yBAAyB,GAAG;IACtC,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,MAAM,CAAA;IACZ,iBAAiB,EAAE,OAAO,CAAA;IAC1B,gBAAgB,EAAE,MAAM,CAAA;IACxB,eAAe,EAAE,MAAM,CAAA;CACxB,CAAA;AAED;;;gEAGgE;AAChE,MAAM,MAAM,qBAAqB,GAAG;IAClC,WAAW,EAAE,OAAO,CAAA;IACpB,MAAM,EAAE,YAAY,CAAA;IACpB,KAAK,EAAE;QACL,YAAY,EAAE,OAAO,kBAAkB,CAAA;QACvC,KAAK,EAAE,OAAO,wBAAwB,CAAA;KACvC,CAAA;IACD,OAAO,EAAE,yBAAyB,CAAA;CACnC,CAAA;AAED,KAAK,+BAA+B,GAAG;IACrC,KAAK,EAAE,YAAY,CAAA;IACnB,OAAO,EAAE,MAAM,CAAA;CAChB,CAAA;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,0BAA0B,GAAI,qBAGxC,+BAA+B,KAAG,qBAqBnC,CAAA"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { buildEip712Domain } from './buildEip712Domain.js';
|
|
2
|
+
/**
|
|
3
|
+
* EIP-712 field descriptors for the CoW Protocol (GPv2) `Order` struct.
|
|
4
|
+
*
|
|
5
|
+
* This list — names, types AND order — is consensus-critical: it must match
|
|
6
|
+
* `GPv2Order.TYPE_HASH` byte-for-byte or the orderbook rejects the signature.
|
|
7
|
+
* The canonical definition lives in GPv2's `GPv2Order.sol`
|
|
8
|
+
* (`Order(address sellToken,address buyToken,address receiver,uint256 sellAmount,
|
|
9
|
+
* uint256 buyAmount,uint32 validTo,bytes32 appData,uint256 feeAmount,string kind,
|
|
10
|
+
* bool partiallyFillable,string sellTokenBalance,string buyTokenBalance)`).
|
|
11
|
+
*
|
|
12
|
+
* NOTE: `kind`, `sellTokenBalance`, `buyTokenBalance` are EIP-712 `string`
|
|
13
|
+
* fields (hashed as keccak256 of their utf-8 bytes), NOT enums — the
|
|
14
|
+
* `'sell' | 'buy'` / `'erc20'` values flow through verbatim.
|
|
15
|
+
*/
|
|
16
|
+
export const cowSwapOrderEip712Fields = [
|
|
17
|
+
{ name: 'sellToken', type: 'address' },
|
|
18
|
+
{ name: 'buyToken', type: 'address' },
|
|
19
|
+
{ name: 'receiver', type: 'address' },
|
|
20
|
+
{ name: 'sellAmount', type: 'uint256' },
|
|
21
|
+
{ name: 'buyAmount', type: 'uint256' },
|
|
22
|
+
{ name: 'validTo', type: 'uint32' },
|
|
23
|
+
{ name: 'appData', type: 'bytes32' },
|
|
24
|
+
{ name: 'feeAmount', type: 'uint256' },
|
|
25
|
+
{ name: 'kind', type: 'string' },
|
|
26
|
+
{ name: 'partiallyFillable', type: 'bool' },
|
|
27
|
+
{ name: 'sellTokenBalance', type: 'string' },
|
|
28
|
+
{ name: 'buyTokenBalance', type: 'string' },
|
|
29
|
+
];
|
|
30
|
+
const eip712DomainFields = [
|
|
31
|
+
{ name: 'name', type: 'string' },
|
|
32
|
+
{ name: 'version', type: 'string' },
|
|
33
|
+
{ name: 'chainId', type: 'uint256' },
|
|
34
|
+
{ name: 'verifyingContract', type: 'address' },
|
|
35
|
+
];
|
|
36
|
+
/**
|
|
37
|
+
* Build the `eth_signTypedData_v4` document for a CowSwap order.
|
|
38
|
+
*
|
|
39
|
+
* The resulting digest (EIP-712 hash of this document) is what the MPC ceremony
|
|
40
|
+
* signs; the 65-byte `r||s||v` signature is submitted to the orderbook alongside
|
|
41
|
+
* the order via `submitCowSwapOrder`. The order's `appDataHash` becomes the
|
|
42
|
+
* signed `appData` field — the orderbook verifies it matches the `appData`
|
|
43
|
+
* string in the submitted order.
|
|
44
|
+
*/
|
|
45
|
+
export const buildCowSwapOrderTypedData = ({ order, chainId, }) => ({
|
|
46
|
+
primaryType: 'Order',
|
|
47
|
+
domain: buildEip712Domain(chainId),
|
|
48
|
+
types: {
|
|
49
|
+
EIP712Domain: eip712DomainFields,
|
|
50
|
+
Order: cowSwapOrderEip712Fields,
|
|
51
|
+
},
|
|
52
|
+
message: {
|
|
53
|
+
sellToken: order.sellToken,
|
|
54
|
+
buyToken: order.buyToken,
|
|
55
|
+
receiver: order.receiver,
|
|
56
|
+
sellAmount: order.sellAmount,
|
|
57
|
+
buyAmount: order.buyAmount,
|
|
58
|
+
validTo: order.validTo,
|
|
59
|
+
appData: order.appDataHash,
|
|
60
|
+
feeAmount: order.feeAmount,
|
|
61
|
+
kind: order.kind,
|
|
62
|
+
partiallyFillable: order.partiallyFillable,
|
|
63
|
+
sellTokenBalance: order.sellTokenBalance,
|
|
64
|
+
buyTokenBalance: order.buyTokenBalance,
|
|
65
|
+
},
|
|
66
|
+
});
|
|
67
|
+
//# sourceMappingURL=buildCowSwapOrderTypedData.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buildCowSwapOrderTypedData.js","sourceRoot":"","sources":["../../../../../../../../packages/core/chain/swap/general/cowswap/sign/buildCowSwapOrderTypedData.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAgB,MAAM,qBAAqB,CAAA;AAErE;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE;IACtC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE;IACrC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE;IACrC,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,SAAS,EAAE;IACvC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE;IACtC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE;IACnC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE;IACpC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE;IACtC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE;IAChC,EAAE,IAAI,EAAE,mBAAmB,EAAE,IAAI,EAAE,MAAM,EAAE;IAC3C,EAAE,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,QAAQ,EAAE;IAC5C,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,QAAQ,EAAE;CACnC,CAAA;AAEV,MAAM,kBAAkB,GAAG;IACzB,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE;IAChC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE;IACnC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE;IACpC,EAAE,IAAI,EAAE,mBAAmB,EAAE,IAAI,EAAE,SAAS,EAAE;CACtC,CAAA;AAuCV;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,EACzC,KAAK,EACL,OAAO,GACyB,EAAyB,EAAE,CAAC,CAAC;IAC7D,WAAW,EAAE,OAAO;IACpB,MAAM,EAAE,iBAAiB,CAAC,OAAO,CAAC;IAClC,KAAK,EAAE;QACL,YAAY,EAAE,kBAAkB;QAChC,KAAK,EAAE,wBAAwB;KAChC;IACD,OAAO,EAAE;QACP,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,OAAO,EAAE,KAAK,CAAC,WAAW;QAC1B,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,iBAAiB,EAAE,KAAK,CAAC,iBAAiB;QAC1C,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;QACxC,eAAe,EAAE,KAAK,CAAC,eAAe;KACvC;CACF,CAAC,CAAA"}
|