@vultisig/core-chain 2.8.0 → 2.9.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 +13 -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/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.map +1 -1
- package/dist/swap/quote/findSwapQuote.js +73 -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/package.json +6 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
# @vultisig/core-chain
|
|
2
2
|
|
|
3
|
+
## 2.9.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- [#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))
|
|
8
|
+
|
|
9
|
+
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.
|
|
10
|
+
- New exported helper `getNativeSwapMinAmountIn` (and `NATIVE_SWAP_MIN_OUTBOUND_FEE_MULTIPLIER`) so consumers can show the minimum proactively as the user types.
|
|
11
|
+
- 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.
|
|
12
|
+
- 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.
|
|
13
|
+
- The generic all-fail path now logs raw provider error messages so future sub-minimum wordings become data-driven instead of guessed.
|
|
14
|
+
- 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".
|
|
15
|
+
|
|
3
16
|
## 2.8.0
|
|
4
17
|
|
|
5
18
|
### Minor Changes
|
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"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { AccountCoin } from '@vultisig/core-chain/coin/AccountCoin';
|
|
2
|
+
import { getThorchainInboundAddress } from '../../../chains/cosmos/thor/getThorchainInboundAddress.js';
|
|
3
|
+
import { ThorchainPoolSummary } from '../../../chains/cosmos/thor/lp/pools.js';
|
|
4
|
+
import { NativeSwapChain } from '../NativeSwapChain.js';
|
|
5
|
+
/**
|
|
6
|
+
* Multiplier applied to the destination chain's `outbound_fee` to derive the
|
|
7
|
+
* minimum economically-viable swap output. A swap whose output barely covers
|
|
8
|
+
* the outbound fee is dust by the time it lands, so THORChain rejects it with
|
|
9
|
+
* no route. Requiring the output to clear ~2x the outbound fee keeps the
|
|
10
|
+
* proactive threshold conservative (we'd rather under-report the minimum than
|
|
11
|
+
* tell a user an amount is fine and then have the quote fail). Tunable.
|
|
12
|
+
*/
|
|
13
|
+
export declare const NATIVE_SWAP_MIN_OUTBOUND_FEE_MULTIPLIER = 2;
|
|
14
|
+
export type NativeSwapMinAmountIn = {
|
|
15
|
+
swapChain: NativeSwapChain;
|
|
16
|
+
/** Minimum input amount in the `from` coin's native base units (`from.decimals`). */
|
|
17
|
+
minAmountInBaseUnits: bigint;
|
|
18
|
+
/** Short human-readable minimum input for display, e.g. `"0.0042"`. */
|
|
19
|
+
minAmountInHuman: string;
|
|
20
|
+
/** Destination chain `outbound_fee`, in THORChain 1e8 units of the dest gas asset. */
|
|
21
|
+
outboundFeeBaseUnit: string;
|
|
22
|
+
/**
|
|
23
|
+
* Source chain `dust_threshold`, in THORChain 1e8 units of the source gas
|
|
24
|
+
* asset. `undefined` when the source chain is absent from `inbound_addresses`.
|
|
25
|
+
*/
|
|
26
|
+
dustThresholdBaseUnit?: string;
|
|
27
|
+
/**
|
|
28
|
+
* Which constraint produced the returned minimum: the destination
|
|
29
|
+
* outbound-fee economics (`'outbound'`) or the source-chain dust threshold
|
|
30
|
+
* (`'dust'`). Useful for instrumentation when diagnosing rejected swaps.
|
|
31
|
+
*/
|
|
32
|
+
binding: 'outbound' | 'dust';
|
|
33
|
+
};
|
|
34
|
+
type NativeSwapMinDeps = {
|
|
35
|
+
/** Injectable for tests. Defaults to the live thornode `inbound_addresses` fetch. */
|
|
36
|
+
fetchInboundAddresses?: typeof getThorchainInboundAddress;
|
|
37
|
+
/** Injectable for tests. Defaults to the live Midgard `/v2/pools` fetch (all statuses). */
|
|
38
|
+
fetchPools?: () => Promise<ThorchainPoolSummary[]>;
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* Compute the minimum input amount for a native (THORChain) swap. The minimum
|
|
42
|
+
* is the larger of two independent THORChain constraints:
|
|
43
|
+
*
|
|
44
|
+
* 1. Outbound economics — the swap OUTPUT must cover the destination chain's
|
|
45
|
+
* outbound fee (×BUFFER). We value that floor in RUNE via the dest
|
|
46
|
+
* gas-asset pool, then convert back to the `from` asset via its pool —
|
|
47
|
+
* `minIn = outbound_fee × BUFFER × price(destGas)/price(from)`.
|
|
48
|
+
* 2. Source dust threshold — THORChain rejects an INPUT below the source
|
|
49
|
+
* chain's `dust_threshold` ("amount less than dust threshold") before
|
|
50
|
+
* economics even apply (e.g. DOGE's threshold is ~1 DOGE). It is
|
|
51
|
+
* denominated in the source chain's gas asset and converted into the
|
|
52
|
+
* `from` asset (identity when `from` IS the gas asset).
|
|
53
|
+
*
|
|
54
|
+
* The returned minimum is `max(constraint1, constraint2)` so it holds whichever
|
|
55
|
+
* way the swap would be rejected. A spot-price conversion is sufficient because
|
|
56
|
+
* slippage is negligible at minimum sizes.
|
|
57
|
+
*
|
|
58
|
+
* Returns `null` (never throws) when the minimum can't be determined —
|
|
59
|
+
* MayaChain (CACAO economics differ), a destination chain absent from
|
|
60
|
+
* `inbound_addresses`, a missing pool, or any fetch error. Callers treat
|
|
61
|
+
* `null` as "no proactive signal" and fall back to provider errors.
|
|
62
|
+
*/
|
|
63
|
+
export declare const getNativeSwapMinAmountIn: ({ from, to, swapChain, }: {
|
|
64
|
+
from: AccountCoin;
|
|
65
|
+
to: AccountCoin;
|
|
66
|
+
swapChain: NativeSwapChain;
|
|
67
|
+
}, deps?: NativeSwapMinDeps) => Promise<NativeSwapMinAmountIn | null>;
|
|
68
|
+
export {};
|
|
69
|
+
//# sourceMappingURL=getNativeSwapMinAmountIn.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getNativeSwapMinAmountIn.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/chain/swap/native/minimum/getNativeSwapMinAmountIn.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,uCAAuC,CAAA;AAInE,OAAO,EAAE,0BAA0B,EAAE,MAAM,wDAAwD,CAAA;AACnG,OAAO,EAAqB,oBAAoB,EAAE,MAAM,sCAAsC,CAAA;AAE9F,OAAO,EAAE,eAAe,EAA+C,MAAM,oBAAoB,CAAA;AAEjG;;;;;;;GAOG;AACH,eAAO,MAAM,uCAAuC,IAAI,CAAA;AAQxD,MAAM,MAAM,qBAAqB,GAAG;IAClC,SAAS,EAAE,eAAe,CAAA;IAC1B,qFAAqF;IACrF,oBAAoB,EAAE,MAAM,CAAA;IAC5B,uEAAuE;IACvE,gBAAgB,EAAE,MAAM,CAAA;IACxB,sFAAsF;IACtF,mBAAmB,EAAE,MAAM,CAAA;IAC3B;;;OAGG;IACH,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B;;;;OAIG;IACH,OAAO,EAAE,UAAU,GAAG,MAAM,CAAA;CAC7B,CAAA;AAED,KAAK,iBAAiB,GAAG;IACvB,qFAAqF;IACrF,qBAAqB,CAAC,EAAE,OAAO,0BAA0B,CAAA;IACzD,2FAA2F;IAC3F,UAAU,CAAC,EAAE,MAAM,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAAA;CACnD,CAAA;AAgBD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,eAAO,MAAM,wBAAwB,GACnC,0BAIG;IACD,IAAI,EAAE,WAAW,CAAA;IACjB,EAAE,EAAE,WAAW,CAAA;IACf,SAAS,EAAE,eAAe,CAAA;CAC3B,EACD,OAAM,iBAAsB,KAC3B,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAsHtC,CAAA"}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import { toChainAmount } from '@vultisig/core-chain/amount/toChainAmount';
|
|
2
|
+
import { Chain } from '@vultisig/core-chain/Chain';
|
|
3
|
+
import { chainFeeCoin } from '@vultisig/core-chain/coin/chainFeeCoin';
|
|
4
|
+
import { isOneOf } from '@vultisig/lib-utils/array/isOneOf';
|
|
5
|
+
import { getThorchainInboundAddress } from '../../../chains/cosmos/thor/getThorchainInboundAddress.js';
|
|
6
|
+
import { getThorchainPools } from '../../../chains/cosmos/thor/lp/pools.js';
|
|
7
|
+
import { toNativeSwapAsset } from '../asset/toNativeSwapAsset.js';
|
|
8
|
+
import { nativeSwapChainIds, nativeSwapEnabledChains } from '../NativeSwapChain.js';
|
|
9
|
+
/**
|
|
10
|
+
* Multiplier applied to the destination chain's `outbound_fee` to derive the
|
|
11
|
+
* minimum economically-viable swap output. A swap whose output barely covers
|
|
12
|
+
* the outbound fee is dust by the time it lands, so THORChain rejects it with
|
|
13
|
+
* no route. Requiring the output to clear ~2x the outbound fee keeps the
|
|
14
|
+
* proactive threshold conservative (we'd rather under-report the minimum than
|
|
15
|
+
* tell a user an amount is fine and then have the quote fail). Tunable.
|
|
16
|
+
*/
|
|
17
|
+
export const NATIVE_SWAP_MIN_OUTBOUND_FEE_MULTIPLIER = 2;
|
|
18
|
+
/**
|
|
19
|
+
* THORChain reports every pool depth and the `inbound_addresses` `outbound_fee`
|
|
20
|
+
* in 1e8 base units regardless of the asset's native precision.
|
|
21
|
+
*/
|
|
22
|
+
const THORCHAIN_BASE_DECIMALS = 8;
|
|
23
|
+
const CACHE_TTL_MS = 5_000;
|
|
24
|
+
let inboundCache;
|
|
25
|
+
let poolsCache;
|
|
26
|
+
const cached = (entry, load) => {
|
|
27
|
+
if (entry && Date.now() - entry.at < CACHE_TTL_MS) {
|
|
28
|
+
return entry;
|
|
29
|
+
}
|
|
30
|
+
return { at: Date.now(), value: load() };
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Compute the minimum input amount for a native (THORChain) swap. The minimum
|
|
34
|
+
* is the larger of two independent THORChain constraints:
|
|
35
|
+
*
|
|
36
|
+
* 1. Outbound economics — the swap OUTPUT must cover the destination chain's
|
|
37
|
+
* outbound fee (×BUFFER). We value that floor in RUNE via the dest
|
|
38
|
+
* gas-asset pool, then convert back to the `from` asset via its pool —
|
|
39
|
+
* `minIn = outbound_fee × BUFFER × price(destGas)/price(from)`.
|
|
40
|
+
* 2. Source dust threshold — THORChain rejects an INPUT below the source
|
|
41
|
+
* chain's `dust_threshold` ("amount less than dust threshold") before
|
|
42
|
+
* economics even apply (e.g. DOGE's threshold is ~1 DOGE). It is
|
|
43
|
+
* denominated in the source chain's gas asset and converted into the
|
|
44
|
+
* `from` asset (identity when `from` IS the gas asset).
|
|
45
|
+
*
|
|
46
|
+
* The returned minimum is `max(constraint1, constraint2)` so it holds whichever
|
|
47
|
+
* way the swap would be rejected. A spot-price conversion is sufficient because
|
|
48
|
+
* slippage is negligible at minimum sizes.
|
|
49
|
+
*
|
|
50
|
+
* Returns `null` (never throws) when the minimum can't be determined —
|
|
51
|
+
* MayaChain (CACAO economics differ), a destination chain absent from
|
|
52
|
+
* `inbound_addresses`, a missing pool, or any fetch error. Callers treat
|
|
53
|
+
* `null` as "no proactive signal" and fall back to provider errors.
|
|
54
|
+
*/
|
|
55
|
+
export const getNativeSwapMinAmountIn = async ({ from, to, swapChain, }, deps = {}) => {
|
|
56
|
+
// MayaChain (CACAO-denominated economics) is intentionally out of scope for
|
|
57
|
+
// v1 — the THORChain minimum is the binding one for the reported repro.
|
|
58
|
+
if (swapChain !== Chain.THORChain) {
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
// Both legs must be THORChain-routable for the asset notation / chain codes
|
|
62
|
+
// below to resolve. Anything else has no native minimum to compute.
|
|
63
|
+
if (!isOneOf(to.chain, nativeSwapEnabledChains) || !isOneOf(from.chain, nativeSwapEnabledChains)) {
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
try {
|
|
67
|
+
const injected = deps.fetchInboundAddresses !== undefined || deps.fetchPools !== undefined;
|
|
68
|
+
const loadInbound = deps.fetchInboundAddresses ?? getThorchainInboundAddress;
|
|
69
|
+
const loadPools = deps.fetchPools ?? (() => getThorchainPools({ status: null }));
|
|
70
|
+
let inbound;
|
|
71
|
+
let pools;
|
|
72
|
+
if (injected) {
|
|
73
|
+
;
|
|
74
|
+
[inbound, pools] = await Promise.all([loadInbound(), loadPools()]);
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
inboundCache = cached(inboundCache, loadInbound);
|
|
78
|
+
poolsCache = cached(poolsCache, loadPools);
|
|
79
|
+
[inbound, pools] = await Promise.all([inboundCache.value, poolsCache.value]);
|
|
80
|
+
}
|
|
81
|
+
const destChainId = nativeSwapChainIds[to.chain];
|
|
82
|
+
const destInfo = inbound.find(info => info.chain === destChainId);
|
|
83
|
+
if (!destInfo) {
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
const outboundFee = Number(destInfo.outbound_fee);
|
|
87
|
+
if (!Number.isFinite(outboundFee) || outboundFee <= 0) {
|
|
88
|
+
return null;
|
|
89
|
+
}
|
|
90
|
+
const poolByAsset = new Map(pools.map(pool => [pool.asset.toUpperCase(), pool]));
|
|
91
|
+
// Price of one asset base unit in RUNE base units (both 1e8). RUNE = 1.
|
|
92
|
+
const priceInRune = (assetId) => {
|
|
93
|
+
const upper = assetId.toUpperCase();
|
|
94
|
+
if (upper === 'THOR.RUNE') {
|
|
95
|
+
return 1;
|
|
96
|
+
}
|
|
97
|
+
const pool = poolByAsset.get(upper);
|
|
98
|
+
if (!pool) {
|
|
99
|
+
return null;
|
|
100
|
+
}
|
|
101
|
+
const rune = Number(pool.runeDepth);
|
|
102
|
+
const asset = Number(pool.assetDepth);
|
|
103
|
+
if (!Number.isFinite(rune) || !Number.isFinite(asset) || asset <= 0) {
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
return rune / asset;
|
|
107
|
+
};
|
|
108
|
+
// `outbound_fee` is denominated in the destination chain's gas (fee) asset.
|
|
109
|
+
const destGasAssetId = `${destChainId}.${chainFeeCoin[to.chain].ticker}`;
|
|
110
|
+
const fromAssetId = toNativeSwapAsset(from);
|
|
111
|
+
const priceGas = priceInRune(destGasAssetId);
|
|
112
|
+
const priceFrom = priceInRune(fromAssetId);
|
|
113
|
+
if (priceGas === null || priceFrom === null || priceFrom <= 0) {
|
|
114
|
+
return null;
|
|
115
|
+
}
|
|
116
|
+
// Constraint 1 — outbound economics. The minimum output value (in RUNE) the
|
|
117
|
+
// input must clear, converted back to `from`.
|
|
118
|
+
const outboundMinInThorUnits = (outboundFee * NATIVE_SWAP_MIN_OUTBOUND_FEE_MULTIPLIER * priceGas) / priceFrom;
|
|
119
|
+
// Constraint 2 — source dust threshold. Denominated in the source chain's
|
|
120
|
+
// gas asset (1e8 thor units); convert into the `from` asset — identity when
|
|
121
|
+
// `from` IS the gas asset, otherwise via the source gas-asset pool. Absent
|
|
122
|
+
// source-chain inbound info or a zero threshold contributes nothing.
|
|
123
|
+
const fromChainId = nativeSwapChainIds[from.chain];
|
|
124
|
+
const fromInfo = inbound.find(info => info.chain === fromChainId);
|
|
125
|
+
const fromGasAssetId = `${fromChainId}.${chainFeeCoin[from.chain].ticker}`;
|
|
126
|
+
const dustThreshold = fromInfo ? Number(fromInfo.dust_threshold) : 0;
|
|
127
|
+
let dustMinInThorUnits = 0;
|
|
128
|
+
if (Number.isFinite(dustThreshold) && dustThreshold > 0) {
|
|
129
|
+
if (fromAssetId.toUpperCase() === fromGasAssetId.toUpperCase()) {
|
|
130
|
+
dustMinInThorUnits = dustThreshold;
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
const priceFromGas = priceInRune(fromGasAssetId);
|
|
134
|
+
if (priceFromGas !== null) {
|
|
135
|
+
dustMinInThorUnits = (dustThreshold * priceFromGas) / priceFrom;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
// The input must satisfy BOTH constraints — the binding one is the larger.
|
|
140
|
+
const minInThorUnits = Math.max(outboundMinInThorUnits, dustMinInThorUnits);
|
|
141
|
+
const minHuman = minInThorUnits / 10 ** THORCHAIN_BASE_DECIMALS;
|
|
142
|
+
if (!Number.isFinite(minHuman) || minHuman <= 0) {
|
|
143
|
+
return null;
|
|
144
|
+
}
|
|
145
|
+
// Full-precision base units (bigint via parseUnits) for exact comparison,
|
|
146
|
+
// plus a short rounded string for display.
|
|
147
|
+
const minHumanFixed = minHuman.toFixed(from.decimals);
|
|
148
|
+
const minAmountInBaseUnits = toChainAmount(minHumanFixed, from.decimals);
|
|
149
|
+
return {
|
|
150
|
+
swapChain,
|
|
151
|
+
minAmountInBaseUnits,
|
|
152
|
+
minAmountInHuman: formatMinForDisplay(minHuman),
|
|
153
|
+
outboundFeeBaseUnit: destInfo.outbound_fee,
|
|
154
|
+
dustThresholdBaseUnit: fromInfo?.dust_threshold,
|
|
155
|
+
binding: dustMinInThorUnits > outboundMinInThorUnits ? 'dust' : 'outbound',
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
catch {
|
|
159
|
+
return null;
|
|
160
|
+
}
|
|
161
|
+
};
|
|
162
|
+
/** Render the minimum with ~4 significant digits and no trailing zero noise. */
|
|
163
|
+
const formatMinForDisplay = (value) => {
|
|
164
|
+
const precise = value < 1 ? value.toPrecision(2) : value.toPrecision(4);
|
|
165
|
+
return String(Number(precise));
|
|
166
|
+
};
|
|
167
|
+
//# sourceMappingURL=getNativeSwapMinAmountIn.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getNativeSwapMinAmountIn.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/swap/native/minimum/getNativeSwapMinAmountIn.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"findSwapQuote.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/chain/swap/quote/findSwapQuote.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,uCAAuC,CAAA;AACnE,OAAO,EAAuB,gBAAgB,EAAE,MAAM,qCAAqC,CAAA;AAM3F,OAAO,EAAE,4BAA4B,EAAE,MAAM,gDAAgD,CAAA;AAG7F,OAAO,EAEL,sBAAsB,EACvB,MAAM,mEAAmE,CAAA;AAQ1E,OAAO,EAAE,yBAAyB,EAAE,MAAM,gDAAgD,CAAA;
|
|
1
|
+
{"version":3,"file":"findSwapQuote.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/chain/swap/quote/findSwapQuote.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,uCAAuC,CAAA;AACnE,OAAO,EAAuB,gBAAgB,EAAE,MAAM,qCAAqC,CAAA;AAM3F,OAAO,EAAE,4BAA4B,EAAE,MAAM,gDAAgD,CAAA;AAG7F,OAAO,EAEL,sBAAsB,EACvB,MAAM,mEAAmE,CAAA;AAQ1E,OAAO,EAAE,yBAAyB,EAAE,MAAM,gDAAgD,CAAA;AAe1F,OAAO,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAA;AAEzE,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAEvC;;;;8CAI8C;AAC9C,MAAM,MAAM,mBAAmB,GAAG;IAChC,MAAM,CAAC,EAAE,yBAAyB,CAAA;IAClC,OAAO,CAAC,EAAE,sBAAsB,CAAA;IAChC,KAAK,CAAC,EAAE,4BAA4B,CAAA;CACrC,CAAA;AAED,MAAM,MAAM,kBAAkB,GAAG,MAAM,CAAC,iBAAiB,EAAE,WAAW,CAAC,GAAG;IACxE,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,gBAAgB,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAAA;IAC1C,eAAe,CAAC,EAAE,mBAAmB,CAAA;CACtC,CAAA;AAED,KAAK,qBAAqB,GAAG,SAAS,GAAG,WAAW,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,GAAG,WAAW,GAAG,WAAW,CAAA;AA2D/G;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,yBAAyB,EAAE,SAAS,qBAAqB,EAQ5D,CAAA;AAkFV,eAAO,MAAM,aAAa,GAAU,oEAOjC,kBAAkB,KAAG,OAAO,CAAC,SAAS,CAiXxC,CAAA"}
|
|
@@ -13,6 +13,7 @@ import { getSwapKitQuote } from '@vultisig/core-chain/swap/general/swapkit/api/g
|
|
|
13
13
|
import { swapKitEnabledChains, swapKitSourceChains, } from '@vultisig/core-chain/swap/general/swapkit/SwapKitEnabledChains';
|
|
14
14
|
import { SwapKitAmountBelowMinimumError } from '@vultisig/core-chain/swap/general/swapkit/SwapKitErrors';
|
|
15
15
|
import { getNativeSwapQuote } from '@vultisig/core-chain/swap/native/api/getNativeSwapQuote';
|
|
16
|
+
import { getNativeSwapMinAmountIn, } from '@vultisig/core-chain/swap/native/minimum/getNativeSwapMinAmountIn';
|
|
16
17
|
import { nativeSwapChains, nativeSwapEnabledChainsRecord } from '@vultisig/core-chain/swap/native/NativeSwapChain';
|
|
17
18
|
import { getNativeSwapDecimals } from '@vultisig/core-chain/swap/native/utils/getNativeSwapDecimals';
|
|
18
19
|
import { NoSwapRoutesError } from '@vultisig/core-chain/swap/NoSwapRoutesError';
|
|
@@ -287,12 +288,37 @@ export const findSwapQuote = async ({ from, to, amount, referral, vultDiscountTi
|
|
|
287
288
|
return result;
|
|
288
289
|
};
|
|
289
290
|
const shouldPreferGeneralSwap = [from.chain, to.chain].every(chain => isChainOfKind(chain, 'evm')) && [from.id, to.id].some(v => v);
|
|
291
|
+
const generalFetchers = getGeneralFetchers();
|
|
292
|
+
const nativeFetchers = getNativeFetchers();
|
|
290
293
|
const fetchers = shouldPreferGeneralSwap
|
|
291
|
-
? [...
|
|
292
|
-
: [...
|
|
294
|
+
? [...generalFetchers, ...nativeFetchers]
|
|
295
|
+
: [...nativeFetchers, ...generalFetchers];
|
|
293
296
|
if (isEmpty(fetchers)) {
|
|
294
297
|
throw new NoSwapRoutesError();
|
|
295
298
|
}
|
|
299
|
+
// Proactive THORChain minimum (#604). Derived from the destination chain's
|
|
300
|
+
// `outbound_fee` and spot pool prices, this yields an actionable threshold
|
|
301
|
+
// instead of a generic "no route" for sub-minimum amounts. Computed only when
|
|
302
|
+
// a native protocol can route AND we actually need it (sole-family pre-flight
|
|
303
|
+
// or the all-fail path) — never on every quote — so valid swaps pay no extra
|
|
304
|
+
// network cost. Resolves to `null` when not determinable.
|
|
305
|
+
const computeNativeMin = () => matchingSwapChains.includes(Chain.THORChain)
|
|
306
|
+
? getNativeSwapMinAmountIn({ from, to, swapChain: Chain.THORChain })
|
|
307
|
+
: Promise.resolve(null);
|
|
308
|
+
// Eager short-circuit ONLY when THORChain is the *sole* possible route: no
|
|
309
|
+
// aggregators AND no MayaChain. We only compute a proactive minimum for
|
|
310
|
+
// THORChain (`computeNativeMin`), so if any other family can route — an
|
|
311
|
+
// aggregator (SwapKit/Chainflip) or MayaChain (its own, possibly lower
|
|
312
|
+
// minimum) — short-circuiting on THORChain's number would wrongly reject an
|
|
313
|
+
// amount they could fill. Multi-provider pairs let every provider run and
|
|
314
|
+
// only fall back to the computed minimum if they all fail. (#604, CodeRabbit)
|
|
315
|
+
const thorIsSoleRoute = generalFetchers.length === 0 && matchingSwapChains.length === 1 && matchingSwapChains[0] === Chain.THORChain;
|
|
316
|
+
if (thorIsSoleRoute) {
|
|
317
|
+
const nativeMin = await computeNativeMin();
|
|
318
|
+
if (nativeMin && amount < nativeMin.minAmountInBaseUnits) {
|
|
319
|
+
throw belowNativeMinimumError(nativeMin, from);
|
|
320
|
+
}
|
|
321
|
+
}
|
|
296
322
|
const settled = await Promise.allSettled(fetchers.map(async (fetcher) => {
|
|
297
323
|
const quote = await withTimeout(fetcher.fetch(), QUOTE_FETCH_TIMEOUT_MS);
|
|
298
324
|
return {
|
|
@@ -335,7 +361,23 @@ export const findSwapQuote = async ({ from, to, amount, referral, vultDiscountTi
|
|
|
335
361
|
lower.includes('amount too small') ||
|
|
336
362
|
lower.includes('below the minimum'));
|
|
337
363
|
};
|
|
364
|
+
// Native protocols halt trading per-chain (THORChain mimir `HALT<CHAIN>TRADING`,
|
|
365
|
+
// pool ragnarok, churn). The quote API then rejects EVERY amount with
|
|
366
|
+
// "trading is halted" — an operational state, not an amount problem. Detect it
|
|
367
|
+
// so we surface a "temporarily unavailable" message instead of the misleading
|
|
368
|
+
// generic "no route" (which reads like the pair is unsupported). Also match the
|
|
369
|
+
// "trading paused" wordings emitted by the THOR halt helpers in
|
|
370
|
+
// `chains/cosmos/thor/lp/halts.ts` (`global trading paused`,
|
|
371
|
+
// `<chain> chain trading paused`). (#604, CodeRabbit)
|
|
372
|
+
const isTradingHaltedMsg = (msg) => {
|
|
373
|
+
const lower = msg.toLowerCase();
|
|
374
|
+
return (lower.includes('halted') ||
|
|
375
|
+
lower.includes('trading halt') ||
|
|
376
|
+
lower.includes('trading paused') ||
|
|
377
|
+
lower.includes('trading is paused'));
|
|
378
|
+
};
|
|
338
379
|
const belowMinimumByProvider = new Map();
|
|
380
|
+
const haltedProviders = new Set();
|
|
339
381
|
for (let i = 0; i < settled.length; i++) {
|
|
340
382
|
const result = settled[i];
|
|
341
383
|
if (result.status !== 'rejected') {
|
|
@@ -356,6 +398,9 @@ export const findSwapQuote = async ({ from, to, amount, referral, vultDiscountTi
|
|
|
356
398
|
belowMinimumByProvider.set(providerName, msg);
|
|
357
399
|
}
|
|
358
400
|
}
|
|
401
|
+
if (isTradingHaltedMsg(msg)) {
|
|
402
|
+
haltedProviders.add(fetchers[i].providerName);
|
|
403
|
+
}
|
|
359
404
|
}
|
|
360
405
|
if (belowMinimumByProvider.size > 0) {
|
|
361
406
|
// Pick the message from the highest-preference provider that has one.
|
|
@@ -365,6 +410,22 @@ export const findSwapQuote = async ({ from, to, amount, referral, vultDiscountTi
|
|
|
365
410
|
: [...belowMinimumByProvider.values()][0];
|
|
366
411
|
throw new SwapError(SwapErrorCode.AmountBelowMinimum, `Amount below the minimum required by a swap provider. ${belowMinimumMessage}`);
|
|
367
412
|
}
|
|
413
|
+
// Trading-halt takes precedence over the speculative computed minimum and the
|
|
414
|
+
// generic fallback: when a native protocol reports a halt, NO amount can route,
|
|
415
|
+
// so telling the user to "increase the amount" would be actively misleading. A
|
|
416
|
+
// genuine provider-reported below-minimum (handled above) still wins, since
|
|
417
|
+
// that provider is responding and the amount is the actionable lever. (#604)
|
|
418
|
+
if (haltedProviders.size > 0) {
|
|
419
|
+
throw new SwapError(SwapErrorCode.TradingHalted, `This swap route is temporarily unavailable — trading is halted on ${[...haltedProviders].join(', ')}. Please try again later.`);
|
|
420
|
+
}
|
|
421
|
+
// No provider returned a parseable below-minimum hint. Before falling back to
|
|
422
|
+
// the generic "no route" message, check the proactively-computed THORChain
|
|
423
|
+
// minimum: providers reject sub-minimum swaps with wordings we can't reliably
|
|
424
|
+
// match, so the computed threshold is the authoritative signal here (#604).
|
|
425
|
+
const nativeMin = await computeNativeMin();
|
|
426
|
+
if (nativeMin && amount < nativeMin.minAmountInBaseUnits) {
|
|
427
|
+
throw belowNativeMinimumError(nativeMin, from);
|
|
428
|
+
}
|
|
368
429
|
const failedProviders = settled
|
|
369
430
|
.map((result, index) => {
|
|
370
431
|
if (result.status === 'fulfilled') {
|
|
@@ -373,6 +434,16 @@ export const findSwapQuote = async ({ from, to, amount, referral, vultDiscountTi
|
|
|
373
434
|
return fetchers[index].providerName;
|
|
374
435
|
})
|
|
375
436
|
.filter((providerName) => providerName !== null);
|
|
437
|
+
// Instrument the fallback (#604): the raw provider messages are the only way
|
|
438
|
+
// to learn which sub-minimum/error wordings still slip through. Logging them
|
|
439
|
+
// makes future classification data-driven instead of guessed.
|
|
440
|
+
const rawProviderErrors = settled
|
|
441
|
+
.map((result, index) => result.status === 'rejected'
|
|
442
|
+
? `${fetchers[index].providerName}: ${result.reason instanceof Error ? result.reason.message : String(result.reason)}`
|
|
443
|
+
: null)
|
|
444
|
+
.filter((entry) => entry !== null);
|
|
445
|
+
console.warn(`[findSwapQuote] no route for ${from.ticker} -> ${to.ticker}; raw provider errors: ${rawProviderErrors.join(' | ')}`);
|
|
376
446
|
throw new SwapError(SwapErrorCode.AllProvidersFailed, `No swap route found after trying ${failedProviders.join(', ')}.`);
|
|
377
447
|
};
|
|
448
|
+
const belowNativeMinimumError = (min, from) => new SwapError(SwapErrorCode.AmountBelowMinimum, `Amount is below the minimum for this swap. Minimum is ~${min.minAmountInHuman} ${from.ticker}. Please increase the amount.`);
|
|
378
449
|
//# sourceMappingURL=findSwapQuote.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"findSwapQuote.js","sourceRoot":"","sources":["../../../../../../packages/core/chain/swap/quote/findSwapQuote.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"findSwapQuote.js","sourceRoot":"","sources":["../../../../../../packages/core/chain/swap/quote/findSwapQuote.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"polkadot.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/chain/tx/broadcast/resolvers/polkadot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AAKvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"polkadot.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/chain/tx/broadcast/resolvers/polkadot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AAKvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AA6CjD,eAAO,MAAM,mBAAmB,EAAE,mBAAmB,CAAC,UAAU,CAAC,QAAQ,CAkCxE,CAAA"}
|
|
@@ -2,6 +2,39 @@ import { ensureHexPrefix } from '@vultisig/lib-utils/hex/ensureHexPrefix';
|
|
|
2
2
|
import { queryUrl } from '@vultisig/lib-utils/query/queryUrl';
|
|
3
3
|
import { polkadotRpcUrl } from '../../../chains/polkadot/client.js';
|
|
4
4
|
import { verifyBroadcastByHash } from '../verifyBroadcastByHash.js';
|
|
5
|
+
/**
|
|
6
|
+
* Substrate Pool errors that mean "this extrinsic is already in the pool /
|
|
7
|
+
* imported / banned because a peer just submitted it." In an MPC ceremony,
|
|
8
|
+
* the initiator and the joiner both broadcast the same signed extrinsic; the
|
|
9
|
+
* slower device hits exactly these messages while the tx is in fact already
|
|
10
|
+
* on chain. Treat them as idempotent successes — the alternative is showing
|
|
11
|
+
* the slower device a "Signing Error" screen for a transaction that did
|
|
12
|
+
* confirm. Fast path so we don't rely on `verifyBroadcastByHash`, which can't
|
|
13
|
+
* help on Polkadot until tx-status polling moves off the gated Subscan API.
|
|
14
|
+
*
|
|
15
|
+
* Substrate sources for the exact strings:
|
|
16
|
+
* substrate/client/transaction-pool/api/src/error.rs (AlreadyImported,
|
|
17
|
+
* TemporarilyBanned, NoTagsProvided, ImmediatelyDropped) and
|
|
18
|
+
* primitives/runtime/src/transaction_validity.rs (Stale).
|
|
19
|
+
*/
|
|
20
|
+
const idempotentBroadcastErrorPatterns = [
|
|
21
|
+
/already imported/i,
|
|
22
|
+
/already known/i,
|
|
23
|
+
/temporarily banned/i,
|
|
24
|
+
];
|
|
25
|
+
const isIdempotentBroadcastError = (text) => idempotentBroadcastErrorPatterns.some(pattern => pattern.test(text));
|
|
26
|
+
/**
|
|
27
|
+
* Substrate's JSON-RPC error shape is `{ code, message, data? }`. For
|
|
28
|
+
* `InvalidTransaction::*` rejections (code 1010) the `message` is the
|
|
29
|
+
* generic `"Invalid Transaction"` and the specific reason ("Transaction has
|
|
30
|
+
* a bad signature", "Transaction is outdated", "Inability to pay some fees",
|
|
31
|
+
* etc.) lives in `data`. Surfacing only `message` makes every failure look
|
|
32
|
+
* identical in the UI and strips the information we need to triage.
|
|
33
|
+
*/
|
|
34
|
+
const formatRpcError = ({ code, message, data }) => {
|
|
35
|
+
const head = message ?? `code ${code}`;
|
|
36
|
+
return data ? `${head}: ${data}` : head;
|
|
37
|
+
};
|
|
5
38
|
export const broadcastPolkadotTx = async ({ chain, tx }) => {
|
|
6
39
|
const hexWithPrefix = ensureHexPrefix(Buffer.from(tx.encoded).toString('hex'));
|
|
7
40
|
try {
|
|
@@ -14,7 +47,15 @@ export const broadcastPolkadotTx = async ({ chain, tx }) => {
|
|
|
14
47
|
},
|
|
15
48
|
});
|
|
16
49
|
if (response.error) {
|
|
17
|
-
|
|
50
|
+
// Slow device in an MPC peer race — the initiator (or any other peer)
|
|
51
|
+
// already submitted this exact tx; the node tells us with a Pool error
|
|
52
|
+
// (string usually in `message`) or, less commonly, an Invalid
|
|
53
|
+
// Transaction variant whose duplicate signal lives in `data`.
|
|
54
|
+
const errorText = `${response.error.message ?? ''} ${response.error.data ?? ''}`;
|
|
55
|
+
if (isIdempotentBroadcastError(errorText)) {
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
throw new Error(`Polkadot broadcast failed: ${formatRpcError(response.error)}`);
|
|
18
59
|
}
|
|
19
60
|
// Per JSON-RPC 2.0 a valid response must have exactly one of `result` /
|
|
20
61
|
// `error`. If both are missing (malformed gateway response, truncated
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"polkadot.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/tx/broadcast/resolvers/polkadot.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAA;AACzE,OAAO,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAA;AAE7D,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAA;AAEhE,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAA;AAOhE,MAAM,CAAC,MAAM,mBAAmB,GAA6C,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE;IACnG,MAAM,aAAa,GAAG,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAA;IAE9E,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAc,cAAc,EAAE;YAC3D,IAAI,EAAE;gBACJ,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,wBAAwB;gBAChC,MAAM,EAAE,CAAC,aAAa,CAAC;gBACvB,EAAE,EAAE,CAAC;aACN;SACF,CAAC,CAAA;QAEF,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;YACnB,MAAM,
|
|
1
|
+
{"version":3,"file":"polkadot.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/tx/broadcast/resolvers/polkadot.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAA;AACzE,OAAO,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAA;AAE7D,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAA;AAEhE,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAA;AAOhE;;;;;;;;;;;;;;GAcG;AACH,MAAM,gCAAgC,GAAsB;IAC1D,mBAAmB;IACnB,gBAAgB;IAChB,qBAAqB;CACtB,CAAA;AAED,MAAM,0BAA0B,GAAG,CAAC,IAAY,EAAW,EAAE,CAC3D,gCAAgC,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;AAEtE;;;;;;;GAOG;AACH,MAAM,cAAc,GAAG,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAoD,EAAU,EAAE;IAC3G,MAAM,IAAI,GAAG,OAAO,IAAI,QAAQ,IAAI,EAAE,CAAA;IACtC,OAAO,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAA;AACzC,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,mBAAmB,GAA6C,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE;IACnG,MAAM,aAAa,GAAG,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAA;IAE9E,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAc,cAAc,EAAE;YAC3D,IAAI,EAAE;gBACJ,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,wBAAwB;gBAChC,MAAM,EAAE,CAAC,aAAa,CAAC;gBACvB,EAAE,EAAE,CAAC;aACN;SACF,CAAC,CAAA;QAEF,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;YACnB,sEAAsE;YACtE,uEAAuE;YACvE,8DAA8D;YAC9D,8DAA8D;YAC9D,MAAM,SAAS,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,IAAI,QAAQ,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,EAAE,CAAA;YAChF,IAAI,0BAA0B,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC1C,OAAM;YACR,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,8BAA8B,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;QACjF,CAAC;QAED,wEAAwE;QACxE,sEAAsE;QACtE,qEAAqE;QACrE,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAAA;QACtF,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,qBAAqB,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAA;IACnD,CAAC;AACH,CAAC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"polkadot.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/chain/tx/status/resolvers/polkadot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,UAAU,EAAE,MAAM,4BAA4B,CAAA;AAK9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAgB9C,eAAO,MAAM,mBAAmB,EAAE,gBAAgB,CAAC,UAAU,CAAC,QAAQ,
|
|
1
|
+
{"version":3,"file":"polkadot.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/chain/tx/status/resolvers/polkadot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,UAAU,EAAE,MAAM,4BAA4B,CAAA;AAK9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAgB9C,eAAO,MAAM,mBAAmB,EAAE,gBAAgB,CAAC,UAAU,CAAC,QAAQ,CAyCrE,CAAA"}
|
|
@@ -8,11 +8,20 @@ export const getPolkadotTxStatus = async ({ hash }) => {
|
|
|
8
8
|
body: { hash },
|
|
9
9
|
}));
|
|
10
10
|
if (error || !response || response.code !== 0 || !response.data) {
|
|
11
|
-
|
|
11
|
+
// Subscan does not know this hash (or the API errored). Mark
|
|
12
|
+
// `isKnown: false` so the verify-by-hash safety net does NOT swallow
|
|
13
|
+
// the original broadcast error. Otherwise an `author_submitExtrinsic`
|
|
14
|
+
// rejection is silently reported as success and the UI shows a fake
|
|
15
|
+
// "done" with a hash that has no on-chain counterpart. Mirrors
|
|
16
|
+
// ripple.ts:25 / solana.ts:19.
|
|
17
|
+
return { status: 'pending', isKnown: false };
|
|
12
18
|
}
|
|
13
19
|
const { success, finalized, fee_used } = response.data;
|
|
14
20
|
if (!finalized) {
|
|
15
|
-
|
|
21
|
+
// Subscan has indexed the extrinsic but it is not finalized yet —
|
|
22
|
+
// genuinely in flight. This is the legitimate peer-race case where
|
|
23
|
+
// verify-by-hash should swallow the slower device's duplicate error.
|
|
24
|
+
return { status: 'pending', isKnown: true };
|
|
16
25
|
}
|
|
17
26
|
const feeCoin = chainFeeCoin[Chain.Polkadot];
|
|
18
27
|
const feeAmount = fee_used ?? response.data.fee;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"polkadot.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/tx/status/resolvers/polkadot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAc,MAAM,4BAA4B,CAAA;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,wCAAwC,CAAA;AACrE,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAA;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAA;AAI7D,MAAM,mBAAmB,GAAG,6DAA6D,CAAA;AAczF,MAAM,CAAC,MAAM,mBAAmB,GAA0C,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;IAC3F,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,MAAM,OAAO,CAC7C,QAAQ,CAA2B,mBAAmB,EAAE;QACtD,IAAI,EAAE,EAAE,IAAI,EAAE;KACf,CAAC,CACH,CAAA;IAED,IAAI,KAAK,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QAChE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAA;
|
|
1
|
+
{"version":3,"file":"polkadot.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/tx/status/resolvers/polkadot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAc,MAAM,4BAA4B,CAAA;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,wCAAwC,CAAA;AACrE,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAA;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAA;AAI7D,MAAM,mBAAmB,GAAG,6DAA6D,CAAA;AAczF,MAAM,CAAC,MAAM,mBAAmB,GAA0C,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;IAC3F,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,MAAM,OAAO,CAC7C,QAAQ,CAA2B,mBAAmB,EAAE;QACtD,IAAI,EAAE,EAAE,IAAI,EAAE;KACf,CAAC,CACH,CAAA;IAED,IAAI,KAAK,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QAChE,6DAA6D;QAC7D,qEAAqE;QACrE,sEAAsE;QACtE,oEAAoE;QACpE,+DAA+D;QAC/D,+BAA+B;QAC/B,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,CAAA;IAC9C,CAAC;IAED,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,QAAQ,CAAC,IAAI,CAAA;IAEtD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,kEAAkE;QAClE,mEAAmE;QACnE,qEAAqE;QACrE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;IAC7C,CAAC;IAED,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;IAC5C,MAAM,SAAS,GAAG,QAAQ,IAAI,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAA;IAC/C,MAAM,OAAO,GACX,SAAS,IAAI,IAAI,IAAI,SAAS,KAAK,EAAE;QACnC,CAAC,CAAC;YACE,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC;YAC5B,WAAW,EAAE,OAAO,CAAC,QAAQ;YAC7B,SAAS,EAAE,OAAO,CAAC,MAAM;SAC1B;QACH,CAAC,CAAC,SAAS,CAAA;IAEf,OAAO;QACL,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO;QACrC,OAAO;KACR,CAAA;AACH,CAAC,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vultisig/core-chain",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.9.0",
|
|
4
4
|
"description": "Blockchain chain logic shared across Vultisig clients",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -1430,6 +1430,11 @@
|
|
|
1430
1430
|
"import": "./dist/swap/native/asset/toNativeSwapAsset.js",
|
|
1431
1431
|
"default": "./dist/swap/native/asset/toNativeSwapAsset.js"
|
|
1432
1432
|
},
|
|
1433
|
+
"./swap/native/minimum/getNativeSwapMinAmountIn": {
|
|
1434
|
+
"types": "./dist/swap/native/minimum/getNativeSwapMinAmountIn.d.ts",
|
|
1435
|
+
"import": "./dist/swap/native/minimum/getNativeSwapMinAmountIn.js",
|
|
1436
|
+
"default": "./dist/swap/native/minimum/getNativeSwapMinAmountIn.js"
|
|
1437
|
+
},
|
|
1433
1438
|
"./swap/native/nativeSwapAffiliateConfig": {
|
|
1434
1439
|
"types": "./dist/swap/native/nativeSwapAffiliateConfig.d.ts",
|
|
1435
1440
|
"import": "./dist/swap/native/nativeSwapAffiliateConfig.js",
|