@vultisig/core-chain 2.8.0 → 2.10.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 +38 -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/SwapError.d.ts +2 -0
- package/dist/swap/SwapError.d.ts.map +1 -1
- package/dist/swap/SwapError.js +2 -0
- package/dist/swap/SwapError.js.map +1 -1
- 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/native/minimum/getNativeSwapMinAmountIn.d.ts +69 -0
- package/dist/swap/native/minimum/getNativeSwapMinAmountIn.d.ts.map +1 -0
- package/dist/swap/native/minimum/getNativeSwapMinAmountIn.js +167 -0
- package/dist/swap/native/minimum/getNativeSwapMinAmountIn.js.map +1 -0
- package/dist/swap/quote/findSwapQuote.d.ts +2 -0
- package/dist/swap/quote/findSwapQuote.d.ts.map +1 -1
- package/dist/swap/quote/findSwapQuote.js +74 -2
- package/dist/swap/quote/findSwapQuote.js.map +1 -1
- package/dist/tx/broadcast/resolvers/polkadot.d.ts.map +1 -1
- package/dist/tx/broadcast/resolvers/polkadot.js +42 -1
- package/dist/tx/broadcast/resolvers/polkadot.js.map +1 -1
- package/dist/tx/status/resolvers/polkadot.d.ts.map +1 -1
- package/dist/tx/status/resolvers/polkadot.js +11 -2
- package/dist/tx/status/resolvers/polkadot.js.map +1 -1
- package/dist/utils/getBlockExplorerUrl/index.js +2 -2
- package/dist/utils/getBlockExplorerUrl/index.js.map +1 -1
- package/package.json +11 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,43 @@
|
|
|
1
1
|
# @vultisig/core-chain
|
|
2
2
|
|
|
3
|
+
## 2.10.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- [#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
|
|
8
|
+
|
|
9
|
+
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`.
|
|
10
|
+
|
|
11
|
+
New surface:
|
|
12
|
+
- `LifiAffiliateConfig` type — `{ integratorName: string; apiUrl?: string }`
|
|
13
|
+
- `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.
|
|
14
|
+
- `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`.
|
|
15
|
+
- `findSwapQuote` threads `affiliateConfig?.lifi` into `getLifiSwapQuote`.
|
|
16
|
+
|
|
17
|
+
No behaviour change for callers that don't supply a `lifi` config — `getLifiSwapQuote` still routes through the existing `vultisig-0` default.
|
|
18
|
+
|
|
19
|
+
- [#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
|
|
20
|
+
|
|
21
|
+
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.
|
|
22
|
+
- New `getJettonMasterInfo()` helper hits Toncenter v3 `/jetton/masters`, preferring the validated indexer `token_info` entry over on-chain TEP-64 `jetton_content`.
|
|
23
|
+
- 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.
|
|
24
|
+
- `OtherChain.Ton` added to `chainsWithTokenMetadataDiscovery`; the new `getTonTokenMetadata` resolver is registered under the `ton` chain kind.
|
|
25
|
+
|
|
26
|
+
Unblocks vultisig/vultisig-windows#4029.
|
|
27
|
+
|
|
28
|
+
## 2.9.0
|
|
29
|
+
|
|
30
|
+
### Minor Changes
|
|
31
|
+
|
|
32
|
+
- [#610](https://github.com/vultisig/vultisig-sdk/pull/610) [`c87816b`](https://github.com/vultisig/vultisig-sdk/commit/c87816b6797e8237d7a94923025311e479e0c520) Thanks [@Ehsan-saradar](https://github.com/Ehsan-saradar)! - fix(swap): proactively detect below-minimum native swaps ([#604](https://github.com/vultisig/vultisig-sdk/issues/604))
|
|
33
|
+
|
|
34
|
+
Small cross-chain swaps below the economic minimum (e.g. ETH→BTC ~$2.81) no longer surface a misleading generic "No swap route found" error. `findSwapQuote` now computes the THORChain minimum up front from the destination chain's `outbound_fee` and spot pool prices, and surfaces an actionable `AmountBelowMinimum` error with the concrete threshold ("Minimum is ~0.012 ETH. Please increase the amount.") instead of relying on brittle provider error-string matching.
|
|
35
|
+
- New exported helper `getNativeSwapMinAmountIn` (and `NATIVE_SWAP_MIN_OUTBOUND_FEE_MULTIPLIER`) so consumers can show the minimum proactively as the user types.
|
|
36
|
+
- The computed minimum is now `max(outbound-fee minimum, source dust threshold)` — THORChain rejects an input below the source chain's `dust_threshold` ("amount less than dust threshold") before economics apply (e.g. DOGE's ~1 DOGE floor), so the threshold is included alongside the outbound-fee economics. The result exposes `dustThresholdBaseUnit` and `binding: 'outbound' | 'dust'` for diagnostics.
|
|
37
|
+
- Eager short-circuit only when a native protocol is the sole route family; multi-provider pairs still query every provider so an aggregator with a lower minimum is never blocked.
|
|
38
|
+
- The generic all-fail path now logs raw provider error messages so future sub-minimum wordings become data-driven instead of guessed.
|
|
39
|
+
- Trading-halt detection: when a native protocol rejects with "trading is halted" (THORChain mimir `HALT<CHAIN>TRADING`, pool ragnarok, churn) the pair fails for _every_ amount, so a new `TradingHalted` error surfaces "This swap route is temporarily unavailable — trading is halted on …" instead of the misleading generic "No swap route found" / "increase the amount".
|
|
40
|
+
|
|
3
41
|
## 2.8.0
|
|
4
42
|
|
|
5
43
|
### 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"}
|
package/dist/swap/SwapError.d.ts
CHANGED
|
@@ -7,6 +7,8 @@ export declare enum SwapErrorCode {
|
|
|
7
7
|
AmountBelowMinimum = "SWAP_AMOUNT_BELOW_MINIMUM",
|
|
8
8
|
/** All configured providers were attempted and all failed */
|
|
9
9
|
AllProvidersFailed = "SWAP_ALL_PROVIDERS_FAILED",
|
|
10
|
+
/** Trading for this pair is temporarily halted by the provider (not an amount problem) */
|
|
11
|
+
TradingHalted = "SWAP_TRADING_HALTED",
|
|
10
12
|
/** Caller passed invalid configuration (e.g. mixed-case THORName affiliateFeeAddress) */
|
|
11
13
|
InvalidConfig = "SWAP_INVALID_CONFIG"
|
|
12
14
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SwapError.d.ts","sourceRoot":"","sources":["../../../../../packages/core/chain/swap/SwapError.ts"],"names":[],"mappings":"AAAA,oBAAY,aAAa;IACvB,kFAAkF;IAClF,aAAa,yBAAyB;IACtC,kEAAkE;IAClE,cAAc,0BAA0B;IACxC,8FAA8F;IAC9F,kBAAkB,8BAA8B;IAChD,6DAA6D;IAC7D,kBAAkB,8BAA8B;IAChD,yFAAyF;IACzF,aAAa,wBAAwB;CACtC;AAED,qBAAa,SAAU,SAAQ,KAAK;aAIhB,IAAI,EAAE,aAAa;IAHrC,QAAQ,CAAC,IAAI,eAAc;gBAGT,IAAI,EAAE,aAAa,EACnC,OAAO,EAAE,MAAM;CAIlB"}
|
|
1
|
+
{"version":3,"file":"SwapError.d.ts","sourceRoot":"","sources":["../../../../../packages/core/chain/swap/SwapError.ts"],"names":[],"mappings":"AAAA,oBAAY,aAAa;IACvB,kFAAkF;IAClF,aAAa,yBAAyB;IACtC,kEAAkE;IAClE,cAAc,0BAA0B;IACxC,8FAA8F;IAC9F,kBAAkB,8BAA8B;IAChD,6DAA6D;IAC7D,kBAAkB,8BAA8B;IAChD,0FAA0F;IAC1F,aAAa,wBAAwB;IACrC,yFAAyF;IACzF,aAAa,wBAAwB;CACtC;AAED,qBAAa,SAAU,SAAQ,KAAK;aAIhB,IAAI,EAAE,aAAa;IAHrC,QAAQ,CAAC,IAAI,eAAc;gBAGT,IAAI,EAAE,aAAa,EACnC,OAAO,EAAE,MAAM;CAIlB"}
|
package/dist/swap/SwapError.js
CHANGED
|
@@ -8,6 +8,8 @@ export var SwapErrorCode;
|
|
|
8
8
|
SwapErrorCode["AmountBelowMinimum"] = "SWAP_AMOUNT_BELOW_MINIMUM";
|
|
9
9
|
/** All configured providers were attempted and all failed */
|
|
10
10
|
SwapErrorCode["AllProvidersFailed"] = "SWAP_ALL_PROVIDERS_FAILED";
|
|
11
|
+
/** Trading for this pair is temporarily halted by the provider (not an amount problem) */
|
|
12
|
+
SwapErrorCode["TradingHalted"] = "SWAP_TRADING_HALTED";
|
|
11
13
|
/** Caller passed invalid configuration (e.g. mixed-case THORName affiliateFeeAddress) */
|
|
12
14
|
SwapErrorCode["InvalidConfig"] = "SWAP_INVALID_CONFIG";
|
|
13
15
|
})(SwapErrorCode || (SwapErrorCode = {}));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SwapError.js","sourceRoot":"","sources":["../../../../../packages/core/chain/swap/SwapError.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,
|
|
1
|
+
{"version":3,"file":"SwapError.js","sourceRoot":"","sources":["../../../../../packages/core/chain/swap/SwapError.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,aAaX;AAbD,WAAY,aAAa;IACvB,kFAAkF;IAClF,uDAAsC,CAAA;IACtC,kEAAkE;IAClE,yDAAwC,CAAA;IACxC,8FAA8F;IAC9F,iEAAgD,CAAA;IAChD,6DAA6D;IAC7D,iEAAgD,CAAA;IAChD,0FAA0F;IAC1F,sDAAqC,CAAA;IACrC,yFAAyF;IACzF,sDAAqC,CAAA;AACvC,CAAC,EAbW,aAAa,KAAb,aAAa,QAaxB;AAED,MAAM,OAAO,SAAU,SAAQ,KAAK;IAIhB;IAHT,IAAI,GAAG,WAAW,CAAA;IAE3B,YACkB,IAAmB,EACnC,OAAe;QAEf,KAAK,CAAC,OAAO,CAAC,CAAA;QAHE,SAAI,GAAJ,IAAI,CAAe;IAIrC,CAAC;CACF"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { LifiAffiliateConfig } from '@vultisig/core-chain/swap/general/lifi/config';
|
|
1
2
|
import { LifiSwapEnabledChain } from '@vultisig/core-chain/swap/general/lifi/LifiSwapEnabledChains';
|
|
2
3
|
import { TransferDirection } from '@vultisig/lib-utils/TransferDirection';
|
|
3
4
|
import { AccountCoinKey } from '../../../../coin/AccountCoin.js';
|
|
@@ -7,6 +8,9 @@ type Input = Record<TransferDirection, AccountCoinKey<LifiSwapEnabledChain> & {
|
|
|
7
8
|
}> & {
|
|
8
9
|
amount: bigint;
|
|
9
10
|
affiliateBps?: number;
|
|
11
|
+
/** Consumer-supplied LI.FI integrator override. When omitted, falls back
|
|
12
|
+
* to the global `lifiConfig.integratorName` (vultisig-0 by default). */
|
|
13
|
+
lifiAffiliateConfig?: LifiAffiliateConfig;
|
|
10
14
|
};
|
|
11
15
|
/** @internal exported for unit tests only */
|
|
12
16
|
export declare const STABLE_TICKERS: ReadonlySet<string>;
|
|
@@ -16,6 +20,6 @@ export declare const isStablePair: (from: {
|
|
|
16
20
|
}, to: {
|
|
17
21
|
ticker?: string;
|
|
18
22
|
}) => boolean;
|
|
19
|
-
export declare const getLifiSwapQuote: ({ amount, affiliateBps, ...transfer }: Input) => Promise<GeneralSwapQuote>;
|
|
23
|
+
export declare const getLifiSwapQuote: ({ amount, affiliateBps, lifiAffiliateConfig, ...transfer }: Input) => Promise<GeneralSwapQuote>;
|
|
20
24
|
export {};
|
|
21
25
|
//# 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":"
|
|
1
|
+
{"version":3,"file":"getLifiSwapQuote.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/chain/swap/general/lifi/api/getLifiSwapQuote.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,mBAAmB,EAAyB,MAAM,+CAA+C,CAAA;AAC1G,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;IACrB;4EACwE;IACxE,mBAAmB,CAAC,EAAE,mBAAmB,CAAA;CAC1C,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;AAkG1D,eAAO,MAAM,gBAAgB,GAAU,4DAKpC,KAAK,KAAG,OAAO,CAAC,gBAAgB,CA8KlC,CAAA"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { getQuote } from '@lifi/sdk';
|
|
2
2
|
import { getChainKind } from '@vultisig/core-chain/ChainKind';
|
|
3
3
|
import { solanaConfig } from '@vultisig/core-chain/chains/solana/solanaConfig';
|
|
4
4
|
import { chainFeeCoin } from '@vultisig/core-chain/coin/chainFeeCoin';
|
|
5
|
-
import { lifiConfig } from '@vultisig/core-chain/swap/general/lifi/config';
|
|
5
|
+
import { lifiConfig, setupLifi } from '@vultisig/core-chain/swap/general/lifi/config';
|
|
6
6
|
import { lifiSwapChainId } from '@vultisig/core-chain/swap/general/lifi/LifiSwapEnabledChains';
|
|
7
7
|
import { shouldBePresent } from '@vultisig/lib-utils/assert/shouldBePresent';
|
|
8
8
|
import { match } from '@vultisig/lib-utils/match';
|
|
@@ -30,10 +30,13 @@ export const STABLE_TICKERS = new Set([
|
|
|
30
30
|
const isStableTicker = (ticker) => ticker !== undefined && STABLE_TICKERS.has(ticker.toUpperCase());
|
|
31
31
|
/** @internal exported for unit tests only */
|
|
32
32
|
export const isStablePair = (from, to) => isStableTicker(from.ticker) && isStableTicker(to.ticker);
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
33
|
+
/** Lazy bootstrap for callers that never invoked the public `setupLifi`
|
|
34
|
+
* — uses whatever defaults sit on `lifiConfig` (vultisig-0 + no apiUrl
|
|
35
|
+
* unless a consumer mutated them at module load). The public `setupLifi`
|
|
36
|
+
* exported from ../config is idempotent and short-circuits subsequent
|
|
37
|
+
* calls, so this is safe to call on every quote. */
|
|
38
|
+
const ensureLifiConfigured = memoize(() => {
|
|
39
|
+
setupLifi();
|
|
37
40
|
});
|
|
38
41
|
// Slippage tolerance baked into the LiFi-prebuilt swap tx. The
|
|
39
42
|
// returned `transactionRequest.data` is a fully-formed Solana / EVM
|
|
@@ -119,8 +122,8 @@ const resolveSwapFeeChain = (chainId, fallback) => {
|
|
|
119
122
|
}
|
|
120
123
|
return resolved;
|
|
121
124
|
};
|
|
122
|
-
export const getLifiSwapQuote = async ({ amount, affiliateBps, ...transfer }) => {
|
|
123
|
-
|
|
125
|
+
export const getLifiSwapQuote = async ({ amount, affiliateBps, lifiAffiliateConfig, ...transfer }) => {
|
|
126
|
+
ensureLifiConfigured();
|
|
124
127
|
const [fromChain, toChain] = [transfer.from, transfer.to].map(({ chain }) => lifiSwapChainId[chain]);
|
|
125
128
|
const [fromToken, toToken] = [transfer.from, transfer.to].map(({ id, chain }) => id ?? chainFeeCoin[chain].ticker);
|
|
126
129
|
const [fromAddress, toAddress] = [transfer.from, transfer.to].map(({ address }) => address);
|
|
@@ -136,6 +139,12 @@ export const getLifiSwapQuote = async ({ amount, affiliateBps, ...transfer }) =>
|
|
|
136
139
|
if (combinedCostBps > MAX_COMBINED_COST_BPS) {
|
|
137
140
|
console.warn(`[getLifiSwapQuote] affiliate + slippage combined cost exceeds ${MAX_COMBINED_COST_BPS}bps: ${combinedCostBps}bps`);
|
|
138
141
|
}
|
|
142
|
+
// Per-call integrator override — when the consumer supplied a
|
|
143
|
+
// `lifiAffiliateConfig` (e.g. Station via mcp-ts) the affiliate fee
|
|
144
|
+
// for THIS quote is tagged to their portal integrator instead of the
|
|
145
|
+
// SDK-default. Falls back to whatever `lifiConfig.integratorName`
|
|
146
|
+
// resolves to (vultisig-0 unless the consumer's setupLifi() ran first).
|
|
147
|
+
const integrator = lifiAffiliateConfig?.integratorName ?? lifiConfig.integratorName;
|
|
139
148
|
const quote = await getQuote({
|
|
140
149
|
fromChain,
|
|
141
150
|
toChain,
|
|
@@ -144,8 +153,15 @@ export const getLifiSwapQuote = async ({ amount, affiliateBps, ...transfer }) =>
|
|
|
144
153
|
fromAmount: amount.toString(),
|
|
145
154
|
fromAddress,
|
|
146
155
|
toAddress,
|
|
147
|
-
|
|
156
|
+
// NeOMakinG #618 r2 should-fix: explicit `undefined` only when affiliateBps
|
|
157
|
+
// is genuinely unset. `affiliateBps: 0` previously fell into the truthy-test
|
|
158
|
+
// and became `undefined`, which let LiFi's getQuote silently fall back to
|
|
159
|
+
// `_config.routeOptions?.fee` (see @lifi/sdk src/services/api.js: `params.fee
|
|
160
|
+
// ??= _config.routeOptions?.fee`). For a consumer that explicitly set 0,
|
|
161
|
+
// that's a silent non-zero fee. Now: 0 stays 0.
|
|
162
|
+
fee: affiliateBps !== undefined ? affiliateBps / 10000 : undefined,
|
|
148
163
|
slippage,
|
|
164
|
+
integrator,
|
|
149
165
|
});
|
|
150
166
|
const { transactionRequest, estimate } = quote;
|
|
151
167
|
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,
|
|
1
|
+
{"version":3,"file":"getLifiSwapQuote.js","sourceRoot":"","sources":["../../../../../../../../packages/core/chain/swap/general/lifi/api/getLifiSwapQuote.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SDK-default LI.FI integrator + (optional) API URL. Used when no consumer
|
|
3
|
+
* has called `setupLifi` with a custom config — affiliate fees on routes
|
|
4
|
+
* fetched with these defaults land in the `vultisig-0` portal bucket.
|
|
5
|
+
*
|
|
6
|
+
* Consumers (e.g. Station via vultisig/mcp-ts) override at module boot
|
|
7
|
+
* via `setupLifi({integratorName, apiUrl})` to redirect both the global
|
|
8
|
+
* LI.FI SDK init AND the per-call integrator tag.
|
|
9
|
+
*/
|
|
1
10
|
export declare const lifiConfig: {
|
|
2
11
|
integratorName: string;
|
|
12
|
+
apiUrl: string | undefined;
|
|
3
13
|
};
|
|
14
|
+
/**
|
|
15
|
+
* Per-CALL affiliate config for LI.FI. Consumer-supplied via
|
|
16
|
+
* `SwapAffiliateConfig.lifi`. Overrides the `integrator` tag on a single
|
|
17
|
+
* `getQuote` request so affiliate fees route to the consumer's LI.FI portal
|
|
18
|
+
* integrator instead of the SDK-default `vultisig-0`.
|
|
19
|
+
*
|
|
20
|
+
* NOTE: this type is INTENTIONALLY narrower than `LifiBootstrapConfig`.
|
|
21
|
+
* LI.FI's `getQuote` API does not accept a per-call `apiUrl` — the base URL
|
|
22
|
+
* is a property of the global SDK init. Including `apiUrl` here would
|
|
23
|
+
* silently mislead consumers who supply `lifi: { integratorName, apiUrl }`
|
|
24
|
+
* via `SwapAffiliateConfig` and expect the proxy to apply: it would not.
|
|
25
|
+
* For the proxy URL, consumers must call `setupLifi({integratorName, apiUrl})`
|
|
26
|
+
* at module boot — see `LifiBootstrapConfig`. (Ehsan-saradar #618 review.)
|
|
27
|
+
*/
|
|
28
|
+
export type LifiAffiliateConfig = {
|
|
29
|
+
integratorName: string;
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* Global LI.FI SDK bootstrap config. Strictly wider than `LifiAffiliateConfig`
|
|
33
|
+
* because `apiUrl` is meaningful here (passed to `@lifi/sdk`'s `createConfig`
|
|
34
|
+
* as the base URL for every request the LI.FI SDK makes after this point) and
|
|
35
|
+
* intentionally meaningless on the per-call surface.
|
|
36
|
+
*
|
|
37
|
+
* Consumers call `setupLifi(bootstrap)` once at module boot.
|
|
38
|
+
*/
|
|
39
|
+
export type LifiBootstrapConfig = {
|
|
40
|
+
integratorName: string;
|
|
41
|
+
apiUrl?: string;
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* Initialise the global LI.FI SDK config.
|
|
45
|
+
*
|
|
46
|
+
* Two call modes:
|
|
47
|
+
*
|
|
48
|
+
* 1. **Consumer bootstrap** (`setupLifi(config)` with a config arg):
|
|
49
|
+
* Always applies — re-invokes `createConfig` with the supplied
|
|
50
|
+
* integrator + apiUrl regardless of whether a prior lazy default-fallback
|
|
51
|
+
* already ran. This protects against an "ordering footgun" where a swap
|
|
52
|
+
* quote runs before the consumer's boot-time setup and the lazy path
|
|
53
|
+
* silently latches the `vultisig-0` default + drops the consumer's
|
|
54
|
+
* later apiUrl proxy. (Ehsan-saradar #618 review.)
|
|
55
|
+
*
|
|
56
|
+
* 2. **Lazy default** (`setupLifi()` with no arg, called from
|
|
57
|
+
* `ensureLifiConfigured` in `getLifiSwapQuote`): only runs once; idempotent
|
|
58
|
+
* no-op on every subsequent call. Falls back to whatever `lifiConfig`
|
|
59
|
+
* currently holds — `vultisig-0` + no apiUrl unless a consumer mutated
|
|
60
|
+
* them already.
|
|
61
|
+
*
|
|
62
|
+
* Net effect:
|
|
63
|
+
* - Consumer-before-lazy: consumer wins (the only `createConfig` call).
|
|
64
|
+
* - Lazy-before-consumer: lazy installs defaults, then the consumer's
|
|
65
|
+
* explicit call overwrites them via the explicit-bootstrap branch above.
|
|
66
|
+
* - Consumer-after-consumer: the latest consumer-bootstrap call overwrites
|
|
67
|
+
* `lifiConfig` and re-runs `createConfig` (last-writer wins). In practice
|
|
68
|
+
* consumers should only call this once. The `getLifiSwapQuote.integrator`
|
|
69
|
+
* test `'repeated calls re-run createConfig with each new config'` pins
|
|
70
|
+
* this contract. (Ehsan-saradar #618 r2.)
|
|
71
|
+
*/
|
|
72
|
+
export declare const setupLifi: (config?: LifiBootstrapConfig) => void;
|
|
73
|
+
/** @internal Test-only reset hook. Never call from production code. */
|
|
74
|
+
export declare const _resetLifiConfigForTest: () => void;
|
|
4
75
|
//# sourceMappingURL=config.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/chain/swap/general/lifi/config.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/chain/swap/general/lifi/config.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AACH,eAAO,MAAM,UAAU;;YAEA,MAAM,GAAG,SAAS;CACxC,CAAA;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,MAAM,mBAAmB,GAAG;IAChC,cAAc,EAAE,MAAM,CAAA;CACvB,CAAA;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,mBAAmB,GAAG;IAChC,cAAc,EAAE,MAAM,CAAA;IACtB,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB,CAAA;AAID;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,eAAO,MAAM,SAAS,GAAI,SAAS,mBAAmB,KAAG,IAmBxD,CAAA;AAED,uEAAuE;AACvE,eAAO,MAAM,uBAAuB,QAAO,IAI1C,CAAA"}
|
|
@@ -1,4 +1,70 @@
|
|
|
1
|
+
import { createConfig } from '@lifi/sdk';
|
|
2
|
+
/**
|
|
3
|
+
* SDK-default LI.FI integrator + (optional) API URL. Used when no consumer
|
|
4
|
+
* has called `setupLifi` with a custom config — affiliate fees on routes
|
|
5
|
+
* fetched with these defaults land in the `vultisig-0` portal bucket.
|
|
6
|
+
*
|
|
7
|
+
* Consumers (e.g. Station via vultisig/mcp-ts) override at module boot
|
|
8
|
+
* via `setupLifi({integratorName, apiUrl})` to redirect both the global
|
|
9
|
+
* LI.FI SDK init AND the per-call integrator tag.
|
|
10
|
+
*/
|
|
1
11
|
export const lifiConfig = {
|
|
2
12
|
integratorName: 'vultisig-0',
|
|
13
|
+
apiUrl: undefined,
|
|
14
|
+
};
|
|
15
|
+
let configured = false;
|
|
16
|
+
/**
|
|
17
|
+
* Initialise the global LI.FI SDK config.
|
|
18
|
+
*
|
|
19
|
+
* Two call modes:
|
|
20
|
+
*
|
|
21
|
+
* 1. **Consumer bootstrap** (`setupLifi(config)` with a config arg):
|
|
22
|
+
* Always applies — re-invokes `createConfig` with the supplied
|
|
23
|
+
* integrator + apiUrl regardless of whether a prior lazy default-fallback
|
|
24
|
+
* already ran. This protects against an "ordering footgun" where a swap
|
|
25
|
+
* quote runs before the consumer's boot-time setup and the lazy path
|
|
26
|
+
* silently latches the `vultisig-0` default + drops the consumer's
|
|
27
|
+
* later apiUrl proxy. (Ehsan-saradar #618 review.)
|
|
28
|
+
*
|
|
29
|
+
* 2. **Lazy default** (`setupLifi()` with no arg, called from
|
|
30
|
+
* `ensureLifiConfigured` in `getLifiSwapQuote`): only runs once; idempotent
|
|
31
|
+
* no-op on every subsequent call. Falls back to whatever `lifiConfig`
|
|
32
|
+
* currently holds — `vultisig-0` + no apiUrl unless a consumer mutated
|
|
33
|
+
* them already.
|
|
34
|
+
*
|
|
35
|
+
* Net effect:
|
|
36
|
+
* - Consumer-before-lazy: consumer wins (the only `createConfig` call).
|
|
37
|
+
* - Lazy-before-consumer: lazy installs defaults, then the consumer's
|
|
38
|
+
* explicit call overwrites them via the explicit-bootstrap branch above.
|
|
39
|
+
* - Consumer-after-consumer: the latest consumer-bootstrap call overwrites
|
|
40
|
+
* `lifiConfig` and re-runs `createConfig` (last-writer wins). In practice
|
|
41
|
+
* consumers should only call this once. The `getLifiSwapQuote.integrator`
|
|
42
|
+
* test `'repeated calls re-run createConfig with each new config'` pins
|
|
43
|
+
* this contract. (Ehsan-saradar #618 r2.)
|
|
44
|
+
*/
|
|
45
|
+
export const setupLifi = (config) => {
|
|
46
|
+
// Consumer-bootstrap branch — always applies, regardless of `configured`.
|
|
47
|
+
if (config) {
|
|
48
|
+
lifiConfig.integratorName = config.integratorName;
|
|
49
|
+
lifiConfig.apiUrl = config.apiUrl;
|
|
50
|
+
createConfig(config.apiUrl
|
|
51
|
+
? { integrator: config.integratorName, apiUrl: config.apiUrl }
|
|
52
|
+
: { integrator: config.integratorName });
|
|
53
|
+
configured = true;
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
// Lazy default branch — idempotent.
|
|
57
|
+
if (configured)
|
|
58
|
+
return;
|
|
59
|
+
const integrator = lifiConfig.integratorName;
|
|
60
|
+
const apiUrl = lifiConfig.apiUrl;
|
|
61
|
+
createConfig(apiUrl ? { integrator, apiUrl } : { integrator });
|
|
62
|
+
configured = true;
|
|
63
|
+
};
|
|
64
|
+
/** @internal Test-only reset hook. Never call from production code. */
|
|
65
|
+
export const _resetLifiConfigForTest = () => {
|
|
66
|
+
configured = false;
|
|
67
|
+
lifiConfig.integratorName = 'vultisig-0';
|
|
68
|
+
lifiConfig.apiUrl = undefined;
|
|
3
69
|
};
|
|
4
70
|
//# sourceMappingURL=config.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/swap/general/lifi/config.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,cAAc,EAAE,YAAY;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/swap/general/lifi/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAExC;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,cAAc,EAAE,YAAY;IAC5B,MAAM,EAAE,SAA+B;CACxC,CAAA;AAiCD,IAAI,UAAU,GAAG,KAAK,CAAA;AAEtB;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,MAA4B,EAAQ,EAAE;IAC9D,0EAA0E;IAC1E,IAAI,MAAM,EAAE,CAAC;QACX,UAAU,CAAC,cAAc,GAAG,MAAM,CAAC,cAAc,CAAA;QACjD,UAAU,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAA;QACjC,YAAY,CACV,MAAM,CAAC,MAAM;YACX,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE;YAC9D,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,cAAc,EAAE,CAC1C,CAAA;QACD,UAAU,GAAG,IAAI,CAAA;QACjB,OAAM;IACR,CAAC;IACD,oCAAoC;IACpC,IAAI,UAAU;QAAE,OAAM;IACtB,MAAM,UAAU,GAAG,UAAU,CAAC,cAAc,CAAA;IAC5C,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAA;IAChC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAA;IAC9D,UAAU,GAAG,IAAI,CAAA;AACnB,CAAC,CAAA;AAED,uEAAuE;AACvE,MAAM,CAAC,MAAM,uBAAuB,GAAG,GAAS,EAAE;IAChD,UAAU,GAAG,KAAK,CAAA;IAClB,UAAU,CAAC,cAAc,GAAG,YAAY,CAAA;IACxC,UAAU,CAAC,MAAM,GAAG,SAAS,CAAA;AAC/B,CAAC,CAAA"}
|