@vultisig/core-chain 1.3.1 → 1.4.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 +61 -0
- package/dist/chains/evm/contract/universalRouter/decode.d.ts +12 -0
- package/dist/chains/evm/contract/universalRouter/decode.d.ts.map +1 -0
- package/dist/chains/evm/contract/universalRouter/decode.js +333 -0
- package/dist/chains/evm/contract/universalRouter/decode.js.map +1 -0
- package/dist/chains/evm/contract/universalRouter/opcodes.d.ts +39 -0
- package/dist/chains/evm/contract/universalRouter/opcodes.d.ts.map +1 -0
- package/dist/chains/evm/contract/universalRouter/opcodes.js +39 -0
- package/dist/chains/evm/contract/universalRouter/opcodes.js.map +1 -0
- package/dist/chains/evm/contract/universalRouter/types.d.ts +24 -0
- package/dist/chains/evm/contract/universalRouter/types.d.ts.map +1 -0
- package/dist/chains/evm/contract/universalRouter/types.js +2 -0
- package/dist/chains/evm/contract/universalRouter/types.js.map +1 -0
- package/dist/chains/solana/client.d.ts.map +1 -1
- package/dist/chains/solana/client.js +1 -3
- package/dist/chains/solana/client.js.map +1 -1
- package/dist/coin/balance/resolvers/bittensor.d.ts.map +1 -1
- package/dist/coin/balance/resolvers/bittensor.js +16 -6
- package/dist/coin/balance/resolvers/bittensor.js.map +1 -1
- package/dist/publicKey/ecdsa/derivePublicKey.d.ts.map +1 -1
- package/dist/publicKey/ecdsa/derivePublicKey.js +6 -0
- package/dist/publicKey/ecdsa/derivePublicKey.js.map +1 -1
- package/dist/security/blockaid/tx/simulation/api/core.d.ts.map +1 -1
- package/dist/security/blockaid/tx/simulation/api/core.js +30 -29
- package/dist/security/blockaid/tx/simulation/api/core.js.map +1 -1
- package/dist/swap/general/kyber/api/quote.d.ts +2 -2
- package/dist/swap/general/kyber/api/quote.d.ts.map +1 -1
- package/dist/swap/general/kyber/api/quote.js +6 -4
- package/dist/swap/general/kyber/api/quote.js.map +1 -1
- package/dist/swap/general/kyber/api/route.d.ts +2 -2
- package/dist/swap/general/kyber/api/route.d.ts.map +1 -1
- package/dist/swap/general/kyber/api/route.js +3 -3
- package/dist/swap/general/kyber/api/route.js.map +1 -1
- package/dist/swap/general/kyber/api/tx.d.ts +4 -4
- package/dist/swap/general/kyber/api/tx.d.ts.map +1 -1
- package/dist/swap/general/kyber/api/tx.js +23 -3
- package/dist/swap/general/kyber/api/tx.js.map +1 -1
- package/dist/swap/general/kyber/config.d.ts +8 -0
- package/dist/swap/general/kyber/config.d.ts.map +1 -1
- package/dist/swap/general/kyber/config.js +10 -0
- package/dist/swap/general/kyber/config.js.map +1 -1
- package/dist/swap/quote/findSwapQuote.js +2 -2
- package/dist/swap/quote/findSwapQuote.js.map +1 -1
- package/dist/tx/broadcast/resolvers/bittensor.d.ts.map +1 -1
- package/dist/tx/broadcast/resolvers/bittensor.js +5 -3
- package/dist/tx/broadcast/resolvers/bittensor.js.map +1 -1
- package/dist/tx/broadcast/resolvers/cardano.d.ts.map +1 -1
- package/dist/tx/broadcast/resolvers/cardano.js +4 -1
- package/dist/tx/broadcast/resolvers/cardano.js.map +1 -1
- package/dist/tx/broadcast/resolvers/cosmos.d.ts.map +1 -1
- package/dist/tx/broadcast/resolvers/cosmos.js +9 -3
- package/dist/tx/broadcast/resolvers/cosmos.js.map +1 -1
- package/dist/tx/broadcast/resolvers/evm.d.ts.map +1 -1
- package/dist/tx/broadcast/resolvers/evm.js +7 -3
- package/dist/tx/broadcast/resolvers/evm.js.map +1 -1
- package/dist/tx/broadcast/resolvers/polkadot.d.ts.map +1 -1
- package/dist/tx/broadcast/resolvers/polkadot.js +25 -10
- package/dist/tx/broadcast/resolvers/polkadot.js.map +1 -1
- package/dist/tx/broadcast/resolvers/qbtc.d.ts.map +1 -1
- package/dist/tx/broadcast/resolvers/qbtc.js +12 -4
- package/dist/tx/broadcast/resolvers/qbtc.js.map +1 -1
- package/dist/tx/broadcast/resolvers/ripple.d.ts.map +1 -1
- package/dist/tx/broadcast/resolvers/ripple.js +22 -5
- package/dist/tx/broadcast/resolvers/ripple.js.map +1 -1
- package/dist/tx/broadcast/resolvers/solana.d.ts.map +1 -1
- package/dist/tx/broadcast/resolvers/solana.js +13 -7
- package/dist/tx/broadcast/resolvers/solana.js.map +1 -1
- package/dist/tx/broadcast/resolvers/sui.d.ts.map +1 -1
- package/dist/tx/broadcast/resolvers/sui.js +12 -4
- package/dist/tx/broadcast/resolvers/sui.js.map +1 -1
- package/dist/tx/broadcast/resolvers/ton.d.ts.map +1 -1
- package/dist/tx/broadcast/resolvers/ton.js +8 -3
- package/dist/tx/broadcast/resolvers/ton.js.map +1 -1
- package/dist/tx/broadcast/resolvers/tron.d.ts.map +1 -1
- package/dist/tx/broadcast/resolvers/tron.js +16 -10
- package/dist/tx/broadcast/resolvers/tron.js.map +1 -1
- package/dist/tx/broadcast/resolvers/utxo.d.ts.map +1 -1
- package/dist/tx/broadcast/resolvers/utxo.js +4 -1
- package/dist/tx/broadcast/resolvers/utxo.js.map +1 -1
- package/dist/tx/broadcast/verifyBroadcastByHash.d.ts +29 -0
- package/dist/tx/broadcast/verifyBroadcastByHash.d.ts.map +1 -0
- package/dist/tx/broadcast/verifyBroadcastByHash.js +35 -0
- package/dist/tx/broadcast/verifyBroadcastByHash.js.map +1 -0
- package/package.json +21 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,66 @@
|
|
|
1
1
|
# @vultisig/core-chain
|
|
2
2
|
|
|
3
|
+
## 1.4.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [#342](https://github.com/vultisig/vultisig-sdk/pull/342) [`77410fb`](https://github.com/vultisig/vultisig-sdk/commit/77410fb28f53dd558f05e5634aadba6a9547ee0f) Thanks [@Ehsan-saradar](https://github.com/Ehsan-saradar)! - fix(security/blockaid): pair swap diffs across all asset diffs in EVM simulations
|
|
8
|
+
|
|
9
|
+
`parseBlockaidEvmSimulation` previously destructured only `assetDiffs[0]` and `assetDiffs[1]`. For router-mediated flows like `permitAndCall`, Blockaid returns three diffs with the user's `in` side at `assetDiffs[2]` and an empty intermediate leg at `assetDiffs[1]`, causing the parser to bail and the simulation hero to render nothing. The parser now scans all diffs for the user-side `out` and `in` legs (preferring an in-asset different from the out-asset), matching the iOS `BlockaidSimulationParser` behaviour.
|
|
10
|
+
|
|
11
|
+
## 1.4.0
|
|
12
|
+
|
|
13
|
+
### Minor Changes
|
|
14
|
+
|
|
15
|
+
- [#309](https://github.com/vultisig/vultisig-sdk/pull/309) [`6f1f8b2`](https://github.com/vultisig/vultisig-sdk/commit/6f1f8b2d9a69b8542da776f69fbddba6eb35bd3e) Thanks [@Ehsan-saradar](https://github.com/Ehsan-saradar)! - feat(chain): Uniswap Universal Router command decoder
|
|
16
|
+
|
|
17
|
+
Decodes `execute(bytes commands, bytes[] inputs, uint256 deadline)` calldata into an aggregate swap intent (from token, to token, amount in, amount out min). Exposed at `@vultisig/core-chain/chains/evm/contract/universalRouter/{decode,opcodes,types}`.
|
|
18
|
+
|
|
19
|
+
Covers V2 / V3 / V4 swaps (exact-in and exact-out), WRAP_ETH and UNWRAP_WETH framing, split-route aggregation across identical pairs, and the CONTRACT_BALANCE sentinel. Unknown opcodes (Permit2, sweep, transfer) are skipped rather than rejected so the router's usual bundling doesn't drop the whole decode.
|
|
20
|
+
|
|
21
|
+
Returns `null` for non-Universal-Router calldata. Native ETH is represented by the zero address — callers should translate to the chain's fee coin when displaying.
|
|
22
|
+
|
|
23
|
+
### Patch Changes
|
|
24
|
+
|
|
25
|
+
- [#325](https://github.com/vultisig/vultisig-sdk/pull/325) [`ef2ffbe`](https://github.com/vultisig/vultisig-sdk/commit/ef2ffbecf5f2b3af69172d34f3fda25055f4e112) Thanks [@realpaaao](https://github.com/realpaaao)! - fix(bittensor): drop polkadot dynamic import in balance resolver
|
|
26
|
+
|
|
27
|
+
The Bittensor balance resolver dynamically imported `@polkadot/util-crypto`
|
|
28
|
+
just to base58-decode an SS58 address, blake2_128-hash the pubkey, and
|
|
29
|
+
hex-encode it. In browser/extension bundles this dynamic import pulls in
|
|
30
|
+
a chunk that double-bundles BN.js; the second copy throws
|
|
31
|
+
`TypeError: Cannot assign to read only property 'toString' of object '#<o>'`
|
|
32
|
+
during module init, so every TAO balance fetch fails with no useful
|
|
33
|
+
network/console signal — the chain page only renders "Failed to load".
|
|
34
|
+
|
|
35
|
+
The resolver now uses the libraries already in `@vultisig/core-chain`'s
|
|
36
|
+
direct dependency set: `@noble/hashes` for `blake2b` and `bytesToHex`, and
|
|
37
|
+
`bs58` for the SS58 base58 decode. No polkadot, no `Buffer`, no dynamic
|
|
38
|
+
imports. Bittensor uses SS58 prefix 42 (1-byte network prefix + 32-byte
|
|
39
|
+
pubkey + 2-byte checksum = 35 bytes); we slice `[1, 33)` to recover the
|
|
40
|
+
pubkey, then build the storage key and call `state_getStorage` exactly
|
|
41
|
+
as before.
|
|
42
|
+
|
|
43
|
+
Behaviour for valid SS58 addresses is unchanged. Invalid-length
|
|
44
|
+
addresses now throw a clearer `Invalid SS58 address length` error
|
|
45
|
+
instead of a polkadot decoding error.
|
|
46
|
+
|
|
47
|
+
- [#302](https://github.com/vultisig/vultisig-sdk/pull/302) [`d9399c7`](https://github.com/vultisig/vultisig-sdk/commit/d9399c77a932f0ecc9a2e6acec5d8457aa199444) Thanks [@rcoderdev](https://github.com/rcoderdev)! - fix(chain): hash-verify broadcast errors on all chains
|
|
48
|
+
|
|
49
|
+
In MPC keysign every participating device broadcasts the same signed
|
|
50
|
+
transaction. When a peer wins the RPC race, the slower device gets an
|
|
51
|
+
"already known / duplicate / in mempool" error — the tx is on-chain, but
|
|
52
|
+
fragile per-chain error-string matching made the slower device fail the
|
|
53
|
+
signing flow anyway.
|
|
54
|
+
|
|
55
|
+
Broadcast resolvers now share a `verifyBroadcastByHash` safety net: on
|
|
56
|
+
any broadcast error, re-hash the signed output and check `getTxStatus`;
|
|
57
|
+
if the tx is pending or confirmed, swallow the error. Existing string
|
|
58
|
+
matches stay as a fast path to avoid an extra RPC roundtrip on the
|
|
59
|
+
common case. The five resolvers that previously had no duplicate
|
|
60
|
+
detection at all (Solana, Tron, Sui, Ripple, Polkadot) now tolerate
|
|
61
|
+
duplicate broadcasts; Polkadot additionally surfaces JSON-RPC errors
|
|
62
|
+
that were previously silently ignored.
|
|
63
|
+
|
|
3
64
|
## 1.3.1
|
|
4
65
|
|
|
5
66
|
### Patch Changes
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { UniversalRouterSwapIntent } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Decode Uniswap Universal Router `execute(...)` calldata into an aggregate
|
|
4
|
+
* swap intent (from token, to token, amount in, amount out minimum).
|
|
5
|
+
*
|
|
6
|
+
* Returns `null` for calldata that is not a Universal Router execute call or
|
|
7
|
+
* that contains no recognizable swap opcode. Unknown opcodes inside an
|
|
8
|
+
* otherwise valid execute call are skipped rather than rejected — the router
|
|
9
|
+
* frequently bundles Permit2/sweep/transfer commands around swaps.
|
|
10
|
+
*/
|
|
11
|
+
export declare const decodeUniversalRouterExecute: (calldata: string) => UniversalRouterSwapIntent | null;
|
|
12
|
+
//# sourceMappingURL=decode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decode.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/chain/chains/evm/contract/universalRouter/decode.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,yBAAyB,EAAE,MAAM,SAAS,CAAA;AAgSnD;;;;;;;;GAQG;AACH,eAAO,MAAM,4BAA4B,GACvC,UAAU,MAAM,KACf,yBAAyB,GAAG,IAwH9B,CAAA"}
|
|
@@ -0,0 +1,333 @@
|
|
|
1
|
+
import { AbiCoder, getBytes, hexlify, Interface } from 'ethers';
|
|
2
|
+
import { COMMAND_TYPE_MASK, CONTRACT_BALANCE_SENTINEL, NATIVE_TOKEN_ADDRESS, URCommand, V4Action, } from './opcodes.js';
|
|
3
|
+
/**
|
|
4
|
+
* Universal Router exposes two `execute` variants — one with a deadline and
|
|
5
|
+
* one without. Both take `(bytes commands, bytes[] inputs)` as the first two
|
|
6
|
+
* arguments, which is all we need to decode swap intent.
|
|
7
|
+
*/
|
|
8
|
+
const UR_ABI = [
|
|
9
|
+
'function execute(bytes commands, bytes[] inputs, uint256 deadline)',
|
|
10
|
+
'function execute(bytes commands, bytes[] inputs)',
|
|
11
|
+
];
|
|
12
|
+
const coder = AbiCoder.defaultAbiCoder();
|
|
13
|
+
const urInterface = new Interface(UR_ABI);
|
|
14
|
+
const normalize = (addr) => addr.toLowerCase();
|
|
15
|
+
const firstAddressInV3Path = (path) => {
|
|
16
|
+
const bytes = getBytes(path);
|
|
17
|
+
if (bytes.length < 20)
|
|
18
|
+
return '';
|
|
19
|
+
return normalize(hexlify(bytes.slice(0, 20)));
|
|
20
|
+
};
|
|
21
|
+
const lastAddressInV3Path = (path) => {
|
|
22
|
+
const bytes = getBytes(path);
|
|
23
|
+
if (bytes.length < 20)
|
|
24
|
+
return '';
|
|
25
|
+
return normalize(hexlify(bytes.slice(bytes.length - 20)));
|
|
26
|
+
};
|
|
27
|
+
const safeDecode = (fn) => {
|
|
28
|
+
try {
|
|
29
|
+
return fn();
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
const decodeV2Swap = (input, isExactOut) => {
|
|
36
|
+
const decoded = safeDecode(() => coder.decode(['address', 'uint256', 'uint256', 'address[]', 'bool'], input));
|
|
37
|
+
if (!decoded)
|
|
38
|
+
return null;
|
|
39
|
+
const [, amountA, amountB, path] = decoded;
|
|
40
|
+
if (!Array.isArray(path) || path.length < 2)
|
|
41
|
+
return null;
|
|
42
|
+
const fromToken = normalize(path[0]);
|
|
43
|
+
const toToken = normalize(path[path.length - 1]);
|
|
44
|
+
return isExactOut
|
|
45
|
+
? {
|
|
46
|
+
fromToken,
|
|
47
|
+
toToken,
|
|
48
|
+
amountIn: amountB,
|
|
49
|
+
amountOutMin: amountA,
|
|
50
|
+
isExactOut: true,
|
|
51
|
+
}
|
|
52
|
+
: {
|
|
53
|
+
fromToken,
|
|
54
|
+
toToken,
|
|
55
|
+
amountIn: amountA,
|
|
56
|
+
amountOutMin: amountB,
|
|
57
|
+
isExactOut: false,
|
|
58
|
+
};
|
|
59
|
+
};
|
|
60
|
+
const decodeV3Swap = (input, isExactOut) => {
|
|
61
|
+
const decoded = safeDecode(() => coder.decode(['address', 'uint256', 'uint256', 'bytes', 'bool'], input));
|
|
62
|
+
if (!decoded)
|
|
63
|
+
return null;
|
|
64
|
+
const [, amountA, amountB, path] = decoded;
|
|
65
|
+
const fromToken = firstAddressInV3Path(path);
|
|
66
|
+
const toToken = lastAddressInV3Path(path);
|
|
67
|
+
if (!fromToken || !toToken)
|
|
68
|
+
return null;
|
|
69
|
+
// V3 encodes the path in swap direction for exact-in, and reversed for
|
|
70
|
+
// exact-out (tokenOut first). Flip so that fromToken/toToken always match
|
|
71
|
+
// the user's perspective.
|
|
72
|
+
if (isExactOut) {
|
|
73
|
+
return {
|
|
74
|
+
fromToken: toToken,
|
|
75
|
+
toToken: fromToken,
|
|
76
|
+
amountIn: amountB,
|
|
77
|
+
amountOutMin: amountA,
|
|
78
|
+
isExactOut: true,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
return {
|
|
82
|
+
fromToken,
|
|
83
|
+
toToken,
|
|
84
|
+
amountIn: amountA,
|
|
85
|
+
amountOutMin: amountB,
|
|
86
|
+
isExactOut: false,
|
|
87
|
+
};
|
|
88
|
+
};
|
|
89
|
+
const POOL_KEY_TYPE = '(address currency0, address currency1, uint24 fee, int24 tickSpacing, address hooks)';
|
|
90
|
+
const PATH_KEY_TYPE = '(address intermediateCurrency, uint24 fee, int24 tickSpacing, address hooks, bytes hookData)';
|
|
91
|
+
const decodeV4ExactInSingle = (params) => {
|
|
92
|
+
const decoded = safeDecode(() => coder.decode([
|
|
93
|
+
`tuple(${POOL_KEY_TYPE} poolKey, bool zeroForOne, uint128 amountIn, uint128 amountOutMinimum, bytes hookData)`,
|
|
94
|
+
], params));
|
|
95
|
+
if (!decoded)
|
|
96
|
+
return null;
|
|
97
|
+
const [{ poolKey, zeroForOne, amountIn, amountOutMinimum }] = decoded;
|
|
98
|
+
const fromToken = normalize(zeroForOne ? poolKey.currency0 : poolKey.currency1);
|
|
99
|
+
const toToken = normalize(zeroForOne ? poolKey.currency1 : poolKey.currency0);
|
|
100
|
+
return {
|
|
101
|
+
fromToken,
|
|
102
|
+
toToken,
|
|
103
|
+
amountIn,
|
|
104
|
+
amountOutMin: amountOutMinimum,
|
|
105
|
+
isExactOut: false,
|
|
106
|
+
};
|
|
107
|
+
};
|
|
108
|
+
const decodeV4ExactIn = (params) => {
|
|
109
|
+
const decoded = safeDecode(() => coder.decode([
|
|
110
|
+
`tuple(address currencyIn, ${PATH_KEY_TYPE}[] path, uint128 amountIn, uint128 amountOutMinimum)`,
|
|
111
|
+
], params));
|
|
112
|
+
if (!decoded)
|
|
113
|
+
return null;
|
|
114
|
+
const [{ currencyIn, path, amountIn, amountOutMinimum }] = decoded;
|
|
115
|
+
if (!Array.isArray(path) || path.length === 0)
|
|
116
|
+
return null;
|
|
117
|
+
return {
|
|
118
|
+
fromToken: normalize(currencyIn),
|
|
119
|
+
toToken: normalize(path[path.length - 1].intermediateCurrency),
|
|
120
|
+
amountIn,
|
|
121
|
+
amountOutMin: amountOutMinimum,
|
|
122
|
+
isExactOut: false,
|
|
123
|
+
};
|
|
124
|
+
};
|
|
125
|
+
const decodeV4ExactOutSingle = (params) => {
|
|
126
|
+
const decoded = safeDecode(() => coder.decode([
|
|
127
|
+
`tuple(${POOL_KEY_TYPE} poolKey, bool zeroForOne, uint128 amountOut, uint128 amountInMaximum, bytes hookData)`,
|
|
128
|
+
], params));
|
|
129
|
+
if (!decoded)
|
|
130
|
+
return null;
|
|
131
|
+
const [{ poolKey, zeroForOne, amountOut, amountInMaximum }] = decoded;
|
|
132
|
+
const fromToken = normalize(zeroForOne ? poolKey.currency0 : poolKey.currency1);
|
|
133
|
+
const toToken = normalize(zeroForOne ? poolKey.currency1 : poolKey.currency0);
|
|
134
|
+
return {
|
|
135
|
+
fromToken,
|
|
136
|
+
toToken,
|
|
137
|
+
amountIn: amountInMaximum,
|
|
138
|
+
amountOutMin: amountOut,
|
|
139
|
+
isExactOut: true,
|
|
140
|
+
};
|
|
141
|
+
};
|
|
142
|
+
const decodeV4ExactOut = (params) => {
|
|
143
|
+
const decoded = safeDecode(() => coder.decode([
|
|
144
|
+
`tuple(address currencyOut, ${PATH_KEY_TYPE}[] path, uint128 amountOut, uint128 amountInMaximum)`,
|
|
145
|
+
], params));
|
|
146
|
+
if (!decoded)
|
|
147
|
+
return null;
|
|
148
|
+
const [{ currencyOut, path, amountOut, amountInMaximum }] = decoded;
|
|
149
|
+
if (!Array.isArray(path) || path.length === 0)
|
|
150
|
+
return null;
|
|
151
|
+
// For exact-out, the first PathKey's intermediateCurrency is the token the
|
|
152
|
+
// user spends; the path walks forward to currencyOut.
|
|
153
|
+
return {
|
|
154
|
+
fromToken: normalize(path[0].intermediateCurrency),
|
|
155
|
+
toToken: normalize(currencyOut),
|
|
156
|
+
amountIn: amountInMaximum,
|
|
157
|
+
amountOutMin: amountOut,
|
|
158
|
+
isExactOut: true,
|
|
159
|
+
};
|
|
160
|
+
};
|
|
161
|
+
const decodeV4SwapInput = (input) => {
|
|
162
|
+
const outer = safeDecode(() => coder.decode(['bytes', 'bytes[]'], input));
|
|
163
|
+
if (!outer)
|
|
164
|
+
return null;
|
|
165
|
+
const [actions, params] = outer;
|
|
166
|
+
const actionBytes = getBytes(actions);
|
|
167
|
+
if (actionBytes.length !== params.length)
|
|
168
|
+
return null;
|
|
169
|
+
// Walk actions in order; first swap action wins since V4 swaps only emit
|
|
170
|
+
// one per command in practice. Take-All/Settle-All surround it but don't
|
|
171
|
+
// change the aggregate intent.
|
|
172
|
+
for (let i = 0; i < actionBytes.length; i++) {
|
|
173
|
+
const action = actionBytes[i];
|
|
174
|
+
const payload = params[i];
|
|
175
|
+
if (action === V4Action.SWAP_EXACT_IN_SINGLE) {
|
|
176
|
+
const entry = decodeV4ExactInSingle(payload);
|
|
177
|
+
if (entry)
|
|
178
|
+
return entry;
|
|
179
|
+
}
|
|
180
|
+
else if (action === V4Action.SWAP_EXACT_IN) {
|
|
181
|
+
const entry = decodeV4ExactIn(payload);
|
|
182
|
+
if (entry)
|
|
183
|
+
return entry;
|
|
184
|
+
}
|
|
185
|
+
else if (action === V4Action.SWAP_EXACT_OUT_SINGLE) {
|
|
186
|
+
const entry = decodeV4ExactOutSingle(payload);
|
|
187
|
+
if (entry)
|
|
188
|
+
return entry;
|
|
189
|
+
}
|
|
190
|
+
else if (action === V4Action.SWAP_EXACT_OUT) {
|
|
191
|
+
const entry = decodeV4ExactOut(payload);
|
|
192
|
+
if (entry)
|
|
193
|
+
return entry;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
return null;
|
|
197
|
+
};
|
|
198
|
+
const decodeWrapEth = (input) => {
|
|
199
|
+
const decoded = safeDecode(() => coder.decode(['address', 'uint256'], input));
|
|
200
|
+
if (!decoded)
|
|
201
|
+
return null;
|
|
202
|
+
const [, amount] = decoded;
|
|
203
|
+
return amount;
|
|
204
|
+
};
|
|
205
|
+
/**
|
|
206
|
+
* Decode Uniswap Universal Router `execute(...)` calldata into an aggregate
|
|
207
|
+
* swap intent (from token, to token, amount in, amount out minimum).
|
|
208
|
+
*
|
|
209
|
+
* Returns `null` for calldata that is not a Universal Router execute call or
|
|
210
|
+
* that contains no recognizable swap opcode. Unknown opcodes inside an
|
|
211
|
+
* otherwise valid execute call are skipped rather than rejected — the router
|
|
212
|
+
* frequently bundles Permit2/sweep/transfer commands around swaps.
|
|
213
|
+
*/
|
|
214
|
+
export const decodeUniversalRouterExecute = (calldata) => {
|
|
215
|
+
if (!calldata || !calldata.startsWith('0x') || calldata.length < 10) {
|
|
216
|
+
return null;
|
|
217
|
+
}
|
|
218
|
+
const parsed = safeDecode(() => urInterface.parseTransaction({ data: calldata }));
|
|
219
|
+
if (!parsed || parsed.name !== 'execute')
|
|
220
|
+
return null;
|
|
221
|
+
const commandsHex = parsed.args[0];
|
|
222
|
+
const inputs = parsed.args[1];
|
|
223
|
+
const commands = getBytes(commandsHex);
|
|
224
|
+
if (commands.length !== inputs.length)
|
|
225
|
+
return null;
|
|
226
|
+
const swaps = [];
|
|
227
|
+
let wrapEthAmount = null;
|
|
228
|
+
let sawUnwrapWeth = false;
|
|
229
|
+
let sawKnownCommand = false;
|
|
230
|
+
for (let i = 0; i < commands.length; i++) {
|
|
231
|
+
const command = commands[i] & COMMAND_TYPE_MASK;
|
|
232
|
+
const input = inputs[i];
|
|
233
|
+
if (command === URCommand.V2_SWAP_EXACT_IN) {
|
|
234
|
+
sawKnownCommand = true;
|
|
235
|
+
const entry = decodeV2Swap(input, false);
|
|
236
|
+
if (entry)
|
|
237
|
+
swaps.push(entry);
|
|
238
|
+
}
|
|
239
|
+
else if (command === URCommand.V2_SWAP_EXACT_OUT) {
|
|
240
|
+
sawKnownCommand = true;
|
|
241
|
+
const entry = decodeV2Swap(input, true);
|
|
242
|
+
if (entry)
|
|
243
|
+
swaps.push(entry);
|
|
244
|
+
}
|
|
245
|
+
else if (command === URCommand.V3_SWAP_EXACT_IN) {
|
|
246
|
+
sawKnownCommand = true;
|
|
247
|
+
const entry = decodeV3Swap(input, false);
|
|
248
|
+
if (entry)
|
|
249
|
+
swaps.push(entry);
|
|
250
|
+
}
|
|
251
|
+
else if (command === URCommand.V3_SWAP_EXACT_OUT) {
|
|
252
|
+
sawKnownCommand = true;
|
|
253
|
+
const entry = decodeV3Swap(input, true);
|
|
254
|
+
if (entry)
|
|
255
|
+
swaps.push(entry);
|
|
256
|
+
}
|
|
257
|
+
else if (command === URCommand.WRAP_ETH) {
|
|
258
|
+
sawKnownCommand = true;
|
|
259
|
+
// Only the wrap that precedes the first swap matters for the user's
|
|
260
|
+
// input side; later wraps are intermediate routing.
|
|
261
|
+
if (swaps.length === 0) {
|
|
262
|
+
wrapEthAmount = decodeWrapEth(input);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
else if (command === URCommand.UNWRAP_WETH) {
|
|
266
|
+
sawKnownCommand = true;
|
|
267
|
+
sawUnwrapWeth = true;
|
|
268
|
+
}
|
|
269
|
+
else if (command === URCommand.V4_SWAP) {
|
|
270
|
+
sawKnownCommand = true;
|
|
271
|
+
const entry = decodeV4SwapInput(input);
|
|
272
|
+
if (entry)
|
|
273
|
+
swaps.push(entry);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
if (!sawKnownCommand || swaps.length === 0)
|
|
277
|
+
return null;
|
|
278
|
+
const first = swaps[0];
|
|
279
|
+
const last = swaps[swaps.length - 1];
|
|
280
|
+
// Uniswap's routing splits a single pair across several pool legs when that
|
|
281
|
+
// gives better execution. Each leg is its own swap command but they all
|
|
282
|
+
// share the same (fromToken, toToken). We detect that and sum amounts so
|
|
283
|
+
// the user sees their full trade — not just one leg's share.
|
|
284
|
+
const isSplitRoute = swaps.length > 1 &&
|
|
285
|
+
swaps.every(s => s.fromToken === first.fromToken && s.toToken === first.toToken);
|
|
286
|
+
let fromToken = first.fromToken;
|
|
287
|
+
let toToken = isSplitRoute ? first.toToken : last.toToken;
|
|
288
|
+
let amountIn = isSplitRoute
|
|
289
|
+
? swaps.reduce((sum, s) => sum + s.amountIn, 0n)
|
|
290
|
+
: first.amountIn;
|
|
291
|
+
const aggregatedAmountOutMin = isSplitRoute
|
|
292
|
+
? swaps.reduce((sum, s) => sum + s.amountOutMin, 0n)
|
|
293
|
+
: last.amountOutMin;
|
|
294
|
+
if (wrapEthAmount !== null) {
|
|
295
|
+
fromToken = NATIVE_TOKEN_ADDRESS;
|
|
296
|
+
// WRAP_ETH's amount is the user's total native input for the whole
|
|
297
|
+
// sequence. The first swap leg's amountIn/amountInMax only covers that
|
|
298
|
+
// leg (wrong when the swap is multi-hop or exact-out), so prefer the
|
|
299
|
+
// wrap amount whenever it isn't a "use router balance" sentinel.
|
|
300
|
+
if (wrapEthAmount !== CONTRACT_BALANCE_SENTINEL) {
|
|
301
|
+
amountIn = wrapEthAmount;
|
|
302
|
+
}
|
|
303
|
+
else if (amountIn === CONTRACT_BALANCE_SENTINEL) {
|
|
304
|
+
amountIn = wrapEthAmount;
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
if (sawUnwrapWeth) {
|
|
308
|
+
// UR emits UNWRAP_WETH for two different reasons and they have opposite
|
|
309
|
+
// meanings for the user-facing output token:
|
|
310
|
+
// 1. Output conversion: the final swap lands in WETH and UNWRAP_WETH
|
|
311
|
+
// converts it to native. The swap is effectively ERC20 → NATIVE.
|
|
312
|
+
// 2. Leftover refund: an exact-out flow wrapped too much ETH upfront
|
|
313
|
+
// and UNWRAP_WETH refunds the unused remainder as native. The swap
|
|
314
|
+
// output is still the last leg's ERC20 toToken.
|
|
315
|
+
// We distinguish them: a leftover refund only happens AFTER a WRAP_ETH,
|
|
316
|
+
// and only when the last swap's toToken is something OTHER than the
|
|
317
|
+
// wrapped-native token that was the router's working asset (= first
|
|
318
|
+
// swap's fromToken). If the last swap's toToken matches the wrapped
|
|
319
|
+
// native, it's an output conversion back to native.
|
|
320
|
+
const isLeftoverRefund = wrapEthAmount !== null && last.toToken !== first.fromToken;
|
|
321
|
+
if (!isLeftoverRefund) {
|
|
322
|
+
toToken = NATIVE_TOKEN_ADDRESS;
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
return {
|
|
326
|
+
fromToken,
|
|
327
|
+
toToken,
|
|
328
|
+
amountIn,
|
|
329
|
+
amountOutMin: aggregatedAmountOutMin,
|
|
330
|
+
isExactOut: last.isExactOut,
|
|
331
|
+
};
|
|
332
|
+
};
|
|
333
|
+
//# sourceMappingURL=decode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decode.js","sourceRoot":"","sources":["../../../../../../../../packages/core/chain/chains/evm/contract/universalRouter/decode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AAE/D,OAAO,EACL,iBAAiB,EACjB,yBAAyB,EACzB,oBAAoB,EACpB,SAAS,EACT,QAAQ,GACT,MAAM,WAAW,CAAA;AAGlB;;;;GAIG;AACH,MAAM,MAAM,GAAG;IACb,oEAAoE;IACpE,kDAAkD;CACnD,CAAA;AAED,MAAM,KAAK,GAAG,QAAQ,CAAC,eAAe,EAAE,CAAA;AACxC,MAAM,WAAW,GAAG,IAAI,SAAS,CAAC,MAAM,CAAC,CAAA;AAUzC,MAAM,SAAS,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAA;AAE9D,MAAM,oBAAoB,GAAG,CAAC,IAAY,EAAU,EAAE;IACpD,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAA;IAC5B,IAAI,KAAK,CAAC,MAAM,GAAG,EAAE;QAAE,OAAO,EAAE,CAAA;IAChC,OAAO,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAA;AAC/C,CAAC,CAAA;AAED,MAAM,mBAAmB,GAAG,CAAC,IAAY,EAAU,EAAE;IACnD,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAA;IAC5B,IAAI,KAAK,CAAC,MAAM,GAAG,EAAE;QAAE,OAAO,EAAE,CAAA;IAChC,OAAO,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,CAAA;AAC3D,CAAC,CAAA;AAED,MAAM,UAAU,GAAG,CAAI,EAAW,EAAY,EAAE;IAC9C,IAAI,CAAC;QACH,OAAO,EAAE,EAAE,CAAA;IACb,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC,CAAA;AAED,MAAM,YAAY,GAAG,CACnB,KAAa,EACb,UAAmB,EACD,EAAE;IACpB,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAC9B,KAAK,CAAC,MAAM,CACV,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,CAAC,EACtD,KAAK,CACN,CACF,CAAA;IACD,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAA;IACzB,MAAM,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,OAMlC,CAAA;IACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAA;IACxD,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;IACpC,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAA;IAChD,OAAO,UAAU;QACf,CAAC,CAAC;YACE,SAAS;YACT,OAAO;YACP,QAAQ,EAAE,OAAO;YACjB,YAAY,EAAE,OAAO;YACrB,UAAU,EAAE,IAAI;SACjB;QACH,CAAC,CAAC;YACE,SAAS;YACT,OAAO;YACP,QAAQ,EAAE,OAAO;YACjB,YAAY,EAAE,OAAO;YACrB,UAAU,EAAE,KAAK;SAClB,CAAA;AACP,CAAC,CAAA;AAED,MAAM,YAAY,GAAG,CACnB,KAAa,EACb,UAAmB,EACD,EAAE;IACpB,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAC9B,KAAK,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,KAAK,CAAC,CACxE,CAAA;IACD,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAA;IACzB,MAAM,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,OAMlC,CAAA;IACD,MAAM,SAAS,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAA;IAC5C,MAAM,OAAO,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAA;IACzC,IAAI,CAAC,SAAS,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAA;IACvC,uEAAuE;IACvE,0EAA0E;IAC1E,0BAA0B;IAC1B,IAAI,UAAU,EAAE,CAAC;QACf,OAAO;YACL,SAAS,EAAE,OAAO;YAClB,OAAO,EAAE,SAAS;YAClB,QAAQ,EAAE,OAAO;YACjB,YAAY,EAAE,OAAO;YACrB,UAAU,EAAE,IAAI;SACjB,CAAA;IACH,CAAC;IACD,OAAO;QACL,SAAS;QACT,OAAO;QACP,QAAQ,EAAE,OAAO;QACjB,YAAY,EAAE,OAAO;QACrB,UAAU,EAAE,KAAK;KAClB,CAAA;AACH,CAAC,CAAA;AAED,MAAM,aAAa,GACjB,sFAAsF,CAAA;AACxF,MAAM,aAAa,GACjB,8FAA8F,CAAA;AAEhG,MAAM,qBAAqB,GAAG,CAAC,MAAc,EAAoB,EAAE;IACjE,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAC9B,KAAK,CAAC,MAAM,CACV;QACE,SAAS,aAAa,wFAAwF;KAC/G,EACD,MAAM,CACP,CACF,CAAA;IACD,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAA;IACzB,MAAM,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,gBAAgB,EAAE,CAAC,GACzD,OAOC,CAAA;IACH,MAAM,SAAS,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;IAC/E,MAAM,OAAO,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;IAC7E,OAAO;QACL,SAAS;QACT,OAAO;QACP,QAAQ;QACR,YAAY,EAAE,gBAAgB;QAC9B,UAAU,EAAE,KAAK;KAClB,CAAA;AACH,CAAC,CAAA;AAED,MAAM,eAAe,GAAG,CAAC,MAAc,EAAoB,EAAE;IAC3D,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAC9B,KAAK,CAAC,MAAM,CACV;QACE,6BAA6B,aAAa,sDAAsD;KACjG,EACD,MAAM,CACP,CACF,CAAA;IACD,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAA;IACzB,MAAM,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,gBAAgB,EAAE,CAAC,GACtD,OAOC,CAAA;IACH,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAA;IAC1D,OAAO;QACL,SAAS,EAAE,SAAS,CAAC,UAAU,CAAC;QAChC,OAAO,EAAE,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,oBAAoB,CAAC;QAC9D,QAAQ;QACR,YAAY,EAAE,gBAAgB;QAC9B,UAAU,EAAE,KAAK;KAClB,CAAA;AACH,CAAC,CAAA;AAED,MAAM,sBAAsB,GAAG,CAAC,MAAc,EAAoB,EAAE;IAClE,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAC9B,KAAK,CAAC,MAAM,CACV;QACE,SAAS,aAAa,wFAAwF;KAC/G,EACD,MAAM,CACP,CACF,CAAA;IACD,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAA;IACzB,MAAM,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC,GACzD,OAOC,CAAA;IACH,MAAM,SAAS,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;IAC/E,MAAM,OAAO,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;IAC7E,OAAO;QACL,SAAS;QACT,OAAO;QACP,QAAQ,EAAE,eAAe;QACzB,YAAY,EAAE,SAAS;QACvB,UAAU,EAAE,IAAI;KACjB,CAAA;AACH,CAAC,CAAA;AAED,MAAM,gBAAgB,GAAG,CAAC,MAAc,EAAoB,EAAE;IAC5D,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAC9B,KAAK,CAAC,MAAM,CACV;QACE,8BAA8B,aAAa,sDAAsD;KAClG,EACD,MAAM,CACP,CACF,CAAA;IACD,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAA;IACzB,MAAM,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC,GACvD,OAOC,CAAA;IACH,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAA;IAC1D,2EAA2E;IAC3E,sDAAsD;IACtD,OAAO;QACL,SAAS,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC;QAClD,OAAO,EAAE,SAAS,CAAC,WAAW,CAAC;QAC/B,QAAQ,EAAE,eAAe;QACzB,YAAY,EAAE,SAAS;QACvB,UAAU,EAAE,IAAI;KACjB,CAAA;AACH,CAAC,CAAA;AAED,MAAM,iBAAiB,GAAG,CAAC,KAAa,EAAoB,EAAE;IAC5D,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAC5B,KAAK,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,KAAK,CAAC,CAC1C,CAAA;IACD,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAA;IACvB,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,GAAG,KAAsC,CAAA;IAChE,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAA;IACrC,IAAI,WAAW,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM;QAAE,OAAO,IAAI,CAAA;IAErD,yEAAyE;IACzE,yEAAyE;IACzE,+BAA+B;IAC/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5C,MAAM,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,CAAA;QAC7B,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;QACzB,IAAI,MAAM,KAAK,QAAQ,CAAC,oBAAoB,EAAE,CAAC;YAC7C,MAAM,KAAK,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAA;YAC5C,IAAI,KAAK;gBAAE,OAAO,KAAK,CAAA;QACzB,CAAC;aAAM,IAAI,MAAM,KAAK,QAAQ,CAAC,aAAa,EAAE,CAAC;YAC7C,MAAM,KAAK,GAAG,eAAe,CAAC,OAAO,CAAC,CAAA;YACtC,IAAI,KAAK;gBAAE,OAAO,KAAK,CAAA;QACzB,CAAC;aAAM,IAAI,MAAM,KAAK,QAAQ,CAAC,qBAAqB,EAAE,CAAC;YACrD,MAAM,KAAK,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAA;YAC7C,IAAI,KAAK;gBAAE,OAAO,KAAK,CAAA;QACzB,CAAC;aAAM,IAAI,MAAM,KAAK,QAAQ,CAAC,cAAc,EAAE,CAAC;YAC9C,MAAM,KAAK,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAA;YACvC,IAAI,KAAK;gBAAE,OAAO,KAAK,CAAA;QACzB,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AAED,MAAM,aAAa,GAAG,CAAC,KAAa,EAAiB,EAAE;IACrD,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAC9B,KAAK,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,SAAS,CAAC,EAAE,KAAK,CAAC,CAC5C,CAAA;IACD,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAA;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC,GAAG,OAAsC,CAAA;IACzD,OAAO,MAAM,CAAA;AACf,CAAC,CAAA;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAC1C,QAAgB,EACkB,EAAE;IACpC,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;QACpE,OAAO,IAAI,CAAA;IACb,CAAC;IAED,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,EAAE,CAC7B,WAAW,CAAC,gBAAgB,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CACjD,CAAA;IACD,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS;QAAE,OAAO,IAAI,CAAA;IAErD,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAW,CAAA;IAC5C,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAa,CAAA;IACzC,MAAM,QAAQ,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAA;IACtC,IAAI,QAAQ,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM;QAAE,OAAO,IAAI,CAAA;IAElD,MAAM,KAAK,GAAgB,EAAE,CAAA;IAC7B,IAAI,aAAa,GAAkB,IAAI,CAAA;IACvC,IAAI,aAAa,GAAG,KAAK,CAAA;IACzB,IAAI,eAAe,GAAG,KAAK,CAAA;IAE3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,iBAAiB,CAAA;QAC/C,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;QACvB,IAAI,OAAO,KAAK,SAAS,CAAC,gBAAgB,EAAE,CAAC;YAC3C,eAAe,GAAG,IAAI,CAAA;YACtB,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;YACxC,IAAI,KAAK;gBAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAC9B,CAAC;aAAM,IAAI,OAAO,KAAK,SAAS,CAAC,iBAAiB,EAAE,CAAC;YACnD,eAAe,GAAG,IAAI,CAAA;YACtB,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;YACvC,IAAI,KAAK;gBAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAC9B,CAAC;aAAM,IAAI,OAAO,KAAK,SAAS,CAAC,gBAAgB,EAAE,CAAC;YAClD,eAAe,GAAG,IAAI,CAAA;YACtB,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;YACxC,IAAI,KAAK;gBAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAC9B,CAAC;aAAM,IAAI,OAAO,KAAK,SAAS,CAAC,iBAAiB,EAAE,CAAC;YACnD,eAAe,GAAG,IAAI,CAAA;YACtB,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;YACvC,IAAI,KAAK;gBAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAC9B,CAAC;aAAM,IAAI,OAAO,KAAK,SAAS,CAAC,QAAQ,EAAE,CAAC;YAC1C,eAAe,GAAG,IAAI,CAAA;YACtB,oEAAoE;YACpE,oDAAoD;YACpD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACvB,aAAa,GAAG,aAAa,CAAC,KAAK,CAAC,CAAA;YACtC,CAAC;QACH,CAAC;aAAM,IAAI,OAAO,KAAK,SAAS,CAAC,WAAW,EAAE,CAAC;YAC7C,eAAe,GAAG,IAAI,CAAA;YACtB,aAAa,GAAG,IAAI,CAAA;QACtB,CAAC;aAAM,IAAI,OAAO,KAAK,SAAS,CAAC,OAAO,EAAE,CAAC;YACzC,eAAe,GAAG,IAAI,CAAA;YACtB,MAAM,KAAK,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAA;YACtC,IAAI,KAAK;gBAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAC9B,CAAC;IACH,CAAC;IAED,IAAI,CAAC,eAAe,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAA;IAEvD,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;IACtB,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IAEpC,4EAA4E;IAC5E,wEAAwE;IACxE,yEAAyE;IACzE,6DAA6D;IAC7D,MAAM,YAAY,GAChB,KAAK,CAAC,MAAM,GAAG,CAAC;QAChB,KAAK,CAAC,KAAK,CACT,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS,IAAI,CAAC,CAAC,OAAO,KAAK,KAAK,CAAC,OAAO,CACpE,CAAA;IAEH,IAAI,SAAS,GAAG,KAAK,CAAC,SAAS,CAAA;IAC/B,IAAI,OAAO,GAAG,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAA;IACzD,IAAI,QAAQ,GAAG,YAAY;QACzB,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC;QAChD,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAA;IAClB,MAAM,sBAAsB,GAAG,YAAY;QACzC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC;QACpD,CAAC,CAAC,IAAI,CAAC,YAAY,CAAA;IAErB,IAAI,aAAa,KAAK,IAAI,EAAE,CAAC;QAC3B,SAAS,GAAG,oBAAoB,CAAA;QAChC,mEAAmE;QACnE,uEAAuE;QACvE,qEAAqE;QACrE,iEAAiE;QACjE,IAAI,aAAa,KAAK,yBAAyB,EAAE,CAAC;YAChD,QAAQ,GAAG,aAAa,CAAA;QAC1B,CAAC;aAAM,IAAI,QAAQ,KAAK,yBAAyB,EAAE,CAAC;YAClD,QAAQ,GAAG,aAAa,CAAA;QAC1B,CAAC;IACH,CAAC;IAED,IAAI,aAAa,EAAE,CAAC;QAClB,wEAAwE;QACxE,6CAA6C;QAC7C,uEAAuE;QACvE,sEAAsE;QACtE,uEAAuE;QACvE,wEAAwE;QACxE,qDAAqD;QACrD,wEAAwE;QACxE,oEAAoE;QACpE,oEAAoE;QACpE,oEAAoE;QACpE,oDAAoD;QACpD,MAAM,gBAAgB,GACpB,aAAa,KAAK,IAAI,IAAI,IAAI,CAAC,OAAO,KAAK,KAAK,CAAC,SAAS,CAAA;QAC5D,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACtB,OAAO,GAAG,oBAAoB,CAAA;QAChC,CAAC;IACH,CAAC;IAED,OAAO;QACL,SAAS;QACT,OAAO;QACP,QAAQ;QACR,YAAY,EAAE,sBAAsB;QACpC,UAAU,EAAE,IAAI,CAAC,UAAU;KAC5B,CAAA;AACH,CAAC,CAAA"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Uniswap Universal Router command byte mask — the high bit is an "allow
|
|
3
|
+
* revert" flag, leaving the lower 6 bits as the command identifier.
|
|
4
|
+
*/
|
|
5
|
+
export declare const COMMAND_TYPE_MASK = 63;
|
|
6
|
+
/**
|
|
7
|
+
* Universal Router command opcodes we care about for aggregate swap intent.
|
|
8
|
+
* Source: https://github.com/Uniswap/universal-router/blob/main/contracts/libraries/Commands.sol
|
|
9
|
+
*/
|
|
10
|
+
export declare const URCommand: {
|
|
11
|
+
readonly V3_SWAP_EXACT_IN: 0;
|
|
12
|
+
readonly V3_SWAP_EXACT_OUT: 1;
|
|
13
|
+
readonly V2_SWAP_EXACT_IN: 8;
|
|
14
|
+
readonly V2_SWAP_EXACT_OUT: 9;
|
|
15
|
+
readonly WRAP_ETH: 11;
|
|
16
|
+
readonly UNWRAP_WETH: 12;
|
|
17
|
+
readonly V4_SWAP: 16;
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* V4 action opcodes encoded inside a V4_SWAP command's `actions` byte string.
|
|
21
|
+
* Source: https://github.com/Uniswap/v4-periphery/blob/main/src/libraries/Actions.sol
|
|
22
|
+
*/
|
|
23
|
+
export declare const V4Action: {
|
|
24
|
+
readonly SWAP_EXACT_IN_SINGLE: 6;
|
|
25
|
+
readonly SWAP_EXACT_IN: 7;
|
|
26
|
+
readonly SWAP_EXACT_OUT_SINGLE: 8;
|
|
27
|
+
readonly SWAP_EXACT_OUT: 9;
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* Sentinel address V4 and this decoder use to represent native ETH. Zero
|
|
31
|
+
* address matches the Currency.unwrap convention in v4-core.
|
|
32
|
+
*/
|
|
33
|
+
export declare const NATIVE_TOKEN_ADDRESS = "0x0000000000000000000000000000000000000000";
|
|
34
|
+
/**
|
|
35
|
+
* Sentinel sometimes passed as amountIn to signal "use the router's full
|
|
36
|
+
* balance of the input token". Shows up in both V3/V2 and V4 swaps.
|
|
37
|
+
*/
|
|
38
|
+
export declare const CONTRACT_BALANCE_SENTINEL: bigint;
|
|
39
|
+
//# sourceMappingURL=opcodes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opcodes.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/chain/chains/evm/contract/universalRouter/opcodes.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,iBAAiB,KAAO,CAAA;AAErC;;;GAGG;AACH,eAAO,MAAM,SAAS;;;;;;;;CAQZ,CAAA;AAEV;;;GAGG;AACH,eAAO,MAAM,QAAQ;;;;;CAKX,CAAA;AAEV;;;GAGG;AACH,eAAO,MAAM,oBAAoB,+CACa,CAAA;AAE9C;;;GAGG;AACH,eAAO,MAAM,yBAAyB,QAC1B,CAAA"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Uniswap Universal Router command byte mask — the high bit is an "allow
|
|
3
|
+
* revert" flag, leaving the lower 6 bits as the command identifier.
|
|
4
|
+
*/
|
|
5
|
+
export const COMMAND_TYPE_MASK = 0x3f;
|
|
6
|
+
/**
|
|
7
|
+
* Universal Router command opcodes we care about for aggregate swap intent.
|
|
8
|
+
* Source: https://github.com/Uniswap/universal-router/blob/main/contracts/libraries/Commands.sol
|
|
9
|
+
*/
|
|
10
|
+
export const URCommand = {
|
|
11
|
+
V3_SWAP_EXACT_IN: 0x00,
|
|
12
|
+
V3_SWAP_EXACT_OUT: 0x01,
|
|
13
|
+
V2_SWAP_EXACT_IN: 0x08,
|
|
14
|
+
V2_SWAP_EXACT_OUT: 0x09,
|
|
15
|
+
WRAP_ETH: 0x0b,
|
|
16
|
+
UNWRAP_WETH: 0x0c,
|
|
17
|
+
V4_SWAP: 0x10,
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* V4 action opcodes encoded inside a V4_SWAP command's `actions` byte string.
|
|
21
|
+
* Source: https://github.com/Uniswap/v4-periphery/blob/main/src/libraries/Actions.sol
|
|
22
|
+
*/
|
|
23
|
+
export const V4Action = {
|
|
24
|
+
SWAP_EXACT_IN_SINGLE: 0x06,
|
|
25
|
+
SWAP_EXACT_IN: 0x07,
|
|
26
|
+
SWAP_EXACT_OUT_SINGLE: 0x08,
|
|
27
|
+
SWAP_EXACT_OUT: 0x09,
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* Sentinel address V4 and this decoder use to represent native ETH. Zero
|
|
31
|
+
* address matches the Currency.unwrap convention in v4-core.
|
|
32
|
+
*/
|
|
33
|
+
export const NATIVE_TOKEN_ADDRESS = '0x0000000000000000000000000000000000000000';
|
|
34
|
+
/**
|
|
35
|
+
* Sentinel sometimes passed as amountIn to signal "use the router's full
|
|
36
|
+
* balance of the input token". Shows up in both V3/V2 and V4 swaps.
|
|
37
|
+
*/
|
|
38
|
+
export const CONTRACT_BALANCE_SENTINEL = 1n << 255n;
|
|
39
|
+
//# sourceMappingURL=opcodes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opcodes.js","sourceRoot":"","sources":["../../../../../../../../packages/core/chain/chains/evm/contract/universalRouter/opcodes.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,CAAA;AAErC;;;GAGG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,gBAAgB,EAAE,IAAI;IACtB,iBAAiB,EAAE,IAAI;IACvB,gBAAgB,EAAE,IAAI;IACtB,iBAAiB,EAAE,IAAI;IACvB,QAAQ,EAAE,IAAI;IACd,WAAW,EAAE,IAAI;IACjB,OAAO,EAAE,IAAI;CACL,CAAA;AAEV;;;GAGG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,oBAAoB,EAAE,IAAI;IAC1B,aAAa,EAAE,IAAI;IACnB,qBAAqB,EAAE,IAAI;IAC3B,cAAc,EAAE,IAAI;CACZ,CAAA;AAEV;;;GAGG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAC/B,4CAA4C,CAAA;AAE9C;;;GAGG;AACH,MAAM,CAAC,MAAM,yBAAyB,GACpC,EAAE,IAAI,IAAI,CAAA"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Aggregate swap intent extracted from a Uniswap Universal Router
|
|
3
|
+
* `execute(bytes commands, bytes[] inputs, ...)` calldata.
|
|
4
|
+
*
|
|
5
|
+
* Addresses are lowercase hex strings. Native ETH is represented by the zero
|
|
6
|
+
* address (see `NATIVE_TOKEN_ADDRESS`) — callers should translate that to the
|
|
7
|
+
* chain's fee coin when displaying.
|
|
8
|
+
*/
|
|
9
|
+
export type UniversalRouterSwapIntent = {
|
|
10
|
+
fromToken: string;
|
|
11
|
+
toToken: string;
|
|
12
|
+
/**
|
|
13
|
+
* For exact-in flows: the user-supplied amountIn.
|
|
14
|
+
* For exact-out flows: the amountInMax (upper bound the user authorized).
|
|
15
|
+
*/
|
|
16
|
+
amountIn: bigint;
|
|
17
|
+
/**
|
|
18
|
+
* For exact-in flows: the amountOutMin (floor the user accepted).
|
|
19
|
+
* For exact-out flows: the amountOut the user is swapping to.
|
|
20
|
+
*/
|
|
21
|
+
amountOutMin: bigint;
|
|
22
|
+
isExactOut: boolean;
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/chain/chains/evm/contract/universalRouter/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,MAAM,yBAAyB,GAAG;IACtC,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf;;;OAGG;IACH,QAAQ,EAAE,MAAM,CAAA;IAChB;;;OAGG;IACH,YAAY,EAAE,MAAM,CAAA;IACpB,UAAU,EAAE,OAAO,CAAA;CACpB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../../../../packages/core/chain/chains/evm/contract/universalRouter/types.ts"],"names":[],"mappings":""}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/chain/chains/solana/client.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAE5C,eAAO,MAAM,YAAY,QAA0B,CAAA;AAEnD,eAAO,MAAM,eAAe,
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/chain/chains/solana/client.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAE5C,eAAO,MAAM,YAAY,QAA0B,CAAA;AAEnD,eAAO,MAAM,eAAe,kBAA8C,CAAA"}
|
|
@@ -2,7 +2,5 @@ import { rootApiUrl } from '@vultisig/core-config';
|
|
|
2
2
|
import { memoize } from '@vultisig/lib-utils/memoize';
|
|
3
3
|
import { Connection } from '@solana/web3.js';
|
|
4
4
|
export const solanaRpcUrl = `${rootApiUrl}/solana/`;
|
|
5
|
-
export const getSolanaClient = memoize(() =>
|
|
6
|
-
return new Connection(solanaRpcUrl);
|
|
7
|
-
});
|
|
5
|
+
export const getSolanaClient = memoize(() => new Connection(solanaRpcUrl));
|
|
8
6
|
//# sourceMappingURL=client.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../../../../packages/core/chain/chains/solana/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAA;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAE5C,MAAM,CAAC,MAAM,YAAY,GAAG,GAAG,UAAU,UAAU,CAAA;AAEnD,MAAM,CAAC,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,EAAE
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../../../../packages/core/chain/chains/solana/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAA;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAE5C,MAAM,CAAC,MAAM,YAAY,GAAG,GAAG,UAAU,UAAU,CAAA;AAEnD,MAAM,CAAC,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,UAAU,CAAC,YAAY,CAAC,CAAC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bittensor.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/chain/coin/balance/resolvers/bittensor.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"bittensor.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/chain/coin/balance/resolvers/bittensor.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AA2BjD,eAAO,MAAM,uBAAuB,EAAE,mBAuCrC,CAAA"}
|
|
@@ -1,14 +1,24 @@
|
|
|
1
|
+
import { blake2b } from '@noble/hashes/blake2b';
|
|
2
|
+
import { bytesToHex } from '@noble/hashes/utils';
|
|
1
3
|
import { bittensorRpcUrl } from '@vultisig/core-chain/chains/bittensor/client';
|
|
2
4
|
import { queryUrl } from '@vultisig/lib-utils/query/queryUrl';
|
|
5
|
+
import bs58 from 'bs58';
|
|
3
6
|
// System.Account storage key prefix: twox128("System") ++ twox128("Account")
|
|
4
7
|
const systemAccountPrefix = '0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9';
|
|
8
|
+
const ss58AddressByteLength = 35;
|
|
9
|
+
const ss58PublicKeyOffset = 1;
|
|
10
|
+
const ss58PublicKeyEnd = 33;
|
|
11
|
+
const decodeSs58PublicKey = (address) => {
|
|
12
|
+
const decoded = bs58.decode(address);
|
|
13
|
+
if (decoded.length !== ss58AddressByteLength) {
|
|
14
|
+
throw new Error(`Invalid SS58 address length: expected ${ss58AddressByteLength} bytes, got ${decoded.length}`);
|
|
15
|
+
}
|
|
16
|
+
return decoded.slice(ss58PublicKeyOffset, ss58PublicKeyEnd);
|
|
17
|
+
};
|
|
5
18
|
export const getBittensorCoinBalance = async (input) => {
|
|
6
|
-
|
|
7
|
-
const
|
|
8
|
-
const
|
|
9
|
-
const pubkey = decodeAddress(input.address);
|
|
10
|
-
const hash = blake2AsHex(pubkey, 128).slice(2); // 16 bytes = 128 bits, remove 0x
|
|
11
|
-
const accountId = Buffer.from(pubkey).toString('hex');
|
|
19
|
+
const pubkey = decodeSs58PublicKey(input.address);
|
|
20
|
+
const hash = bytesToHex(blake2b(pubkey, { dkLen: 16 }));
|
|
21
|
+
const accountId = bytesToHex(pubkey);
|
|
12
22
|
const storageKey = systemAccountPrefix + hash + accountId;
|
|
13
23
|
const response = await queryUrl(bittensorRpcUrl, {
|
|
14
24
|
body: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bittensor.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/coin/balance/resolvers/bittensor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,8CAA8C,CAAA;AAC9E,OAAO,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAA;
|
|
1
|
+
{"version":3,"file":"bittensor.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/coin/balance/resolvers/bittensor.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"derivePublicKey.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/chain/publicKey/ecdsa/derivePublicKey.ts"],"names":[],"mappings":"AAGA,KAAK,oBAAoB,GAAG;IAC1B,aAAa,EAAE,MAAM,CAAA;IACrB,YAAY,EAAE,MAAM,CAAA;IACpB,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAED,eAAO,MAAM,eAAe,GAAI,wCAI7B,oBAAoB,KAAG,
|
|
1
|
+
{"version":3,"file":"derivePublicKey.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/chain/publicKey/ecdsa/derivePublicKey.ts"],"names":[],"mappings":"AAGA,KAAK,oBAAoB,GAAG;IAC1B,aAAa,EAAE,MAAM,CAAA;IACrB,YAAY,EAAE,MAAM,CAAA;IACpB,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAED,eAAO,MAAM,eAAe,GAAI,wCAI7B,oBAAoB,KAAG,MA4BzB,CAAA"}
|