@ledgerhq/hw-app-eth 7.0.0-next.0 → 7.0.0-nightly.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/.turbo/turbo-build.log +1 -1
- package/.unimportedrc.json +35 -3
- package/CHANGELOG.md +21 -5
- package/README.md +2 -1
- package/lib/Eth.d.ts.map +1 -1
- package/lib/Eth.js +1 -0
- package/lib/Eth.js.map +1 -1
- package/lib/modules/Uniswap/constants.d.ts +24 -0
- package/lib/modules/Uniswap/constants.d.ts.map +1 -0
- package/lib/modules/Uniswap/constants.js +59 -0
- package/lib/modules/Uniswap/constants.js.map +1 -0
- package/lib/modules/Uniswap/decoders.d.ts +3 -0
- package/lib/modules/Uniswap/decoders.d.ts.map +1 -0
- package/lib/modules/Uniswap/decoders.js +46 -0
- package/lib/modules/Uniswap/decoders.js.map +1 -0
- package/lib/modules/Uniswap/index.d.ts +44 -0
- package/lib/modules/Uniswap/index.d.ts.map +1 -0
- package/lib/modules/Uniswap/index.js +143 -0
- package/lib/modules/Uniswap/index.js.map +1 -0
- package/lib/modules/Uniswap/types.d.ts +3 -0
- package/lib/modules/Uniswap/types.d.ts.map +1 -0
- package/lib/modules/Uniswap/types.js +3 -0
- package/lib/modules/Uniswap/types.js.map +1 -0
- package/lib/services/ledger/index.d.ts.map +1 -1
- package/lib/services/ledger/index.js +20 -5
- package/lib/services/ledger/index.js.map +1 -1
- package/lib/services/types.d.ts +1 -0
- package/lib/services/types.d.ts.map +1 -1
- package/lib/utils.js +1 -1
- package/lib/utils.js.map +1 -1
- package/lib-es/Eth.d.ts.map +1 -1
- package/lib-es/Eth.js +1 -0
- package/lib-es/Eth.js.map +1 -1
- package/lib-es/modules/Uniswap/constants.d.ts +24 -0
- package/lib-es/modules/Uniswap/constants.d.ts.map +1 -0
- package/lib-es/modules/Uniswap/constants.js +56 -0
- package/lib-es/modules/Uniswap/constants.js.map +1 -0
- package/lib-es/modules/Uniswap/decoders.d.ts +3 -0
- package/lib-es/modules/Uniswap/decoders.d.ts.map +1 -0
- package/lib-es/modules/Uniswap/decoders.js +43 -0
- package/lib-es/modules/Uniswap/decoders.js.map +1 -0
- package/lib-es/modules/Uniswap/index.d.ts +44 -0
- package/lib-es/modules/Uniswap/index.d.ts.map +1 -0
- package/lib-es/modules/Uniswap/index.js +137 -0
- package/lib-es/modules/Uniswap/index.js.map +1 -0
- package/lib-es/modules/Uniswap/types.d.ts +3 -0
- package/lib-es/modules/Uniswap/types.d.ts.map +1 -0
- package/lib-es/modules/Uniswap/types.js +2 -0
- package/lib-es/modules/Uniswap/types.js.map +1 -0
- package/lib-es/services/ledger/index.d.ts.map +1 -1
- package/lib-es/services/ledger/index.js +20 -5
- package/lib-es/services/ledger/index.js.map +1 -1
- package/lib-es/services/types.d.ts +1 -0
- package/lib-es/services/types.d.ts.map +1 -1
- package/lib-es/utils.js +1 -1
- package/lib-es/utils.js.map +1 -1
- package/package.json +10 -5
- package/src/Eth.ts +1 -0
- package/src/modules/Uniswap/constants.ts +60 -0
- package/src/modules/Uniswap/decoders.ts +62 -0
- package/src/modules/Uniswap/index.ts +168 -0
- package/src/modules/Uniswap/types.ts +14 -0
- package/src/services/ledger/index.ts +22 -5
- package/src/services/types.ts +2 -0
- package/src/utils.ts +1 -1
- package/tests/Eth.unit.test.ts +65 -3
- package/tests/Uniswap/decoders.unit.test.ts +101 -0
- package/tests/Uniswap/index.unit.test.ts +188 -0
- package/tests/fixtures/utils.ts +8 -1
- package/tests/ledgerService.unit.test.ts +113 -19
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
import { log } from "@ledgerhq/logs";
|
|
11
|
+
import { utils } from "ethers";
|
|
12
|
+
import { byContractAddressAndChainId, findERC20SignaturesInfo } from "../../services/ledger/erc20";
|
|
13
|
+
import { UniswapDecoders } from "./decoders";
|
|
14
|
+
import { SWAP_COMMANDS, UNISWAP_EXECUTE_SELECTOR, UNISWAP_UNIVERSAL_ROUTER_ADDRESS, UNISWAP_COMMANDS, } from "./constants";
|
|
15
|
+
/**
|
|
16
|
+
* @ignore for external documentation
|
|
17
|
+
*
|
|
18
|
+
* Indicates if the given calldata is supported by the Uniswap plugin
|
|
19
|
+
* applying some basic checks and testing some assumptions
|
|
20
|
+
* specific to the Uniswap plugin internals
|
|
21
|
+
*
|
|
22
|
+
* @param {`0x${string}`} calldata
|
|
23
|
+
* @param {string | undefined} to
|
|
24
|
+
* @param {number} chainId
|
|
25
|
+
* @param {CommandsAndTokens} commandsAndTokens
|
|
26
|
+
* @returns {boolean}
|
|
27
|
+
*/
|
|
28
|
+
export const isSupported = (calldata, to, chainId, commandsAndTokens) => {
|
|
29
|
+
const selector = calldata.slice(0, 10);
|
|
30
|
+
const contractAddress = to === null || to === void 0 ? void 0 : to.toLowerCase();
|
|
31
|
+
if (selector !== UNISWAP_EXECUTE_SELECTOR ||
|
|
32
|
+
contractAddress !== UNISWAP_UNIVERSAL_ROUTER_ADDRESS ||
|
|
33
|
+
!commandsAndTokens.length) {
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
let endingAsset;
|
|
37
|
+
for (let i = 0; i < commandsAndTokens.length; i++) {
|
|
38
|
+
const [command, tokens] = commandsAndTokens[i];
|
|
39
|
+
if (!command)
|
|
40
|
+
return false;
|
|
41
|
+
if (!SWAP_COMMANDS.includes(command))
|
|
42
|
+
continue;
|
|
43
|
+
const poolVersion = command.slice(0, 2);
|
|
44
|
+
if (endingAsset &&
|
|
45
|
+
// Chained swaps should work as a pipe regarding the traded assets:
|
|
46
|
+
// The last asset of swap 1 should be the first asset of swap 2
|
|
47
|
+
// and the same pool version should be used for both swaps
|
|
48
|
+
(endingAsset.asset !== tokens[0] || endingAsset.poolVersion !== poolVersion)) {
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
endingAsset = {
|
|
53
|
+
poolVersion,
|
|
54
|
+
asset: tokens[tokens.length - 1],
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return true;
|
|
59
|
+
};
|
|
60
|
+
/**
|
|
61
|
+
* @ignore for external documentation
|
|
62
|
+
*
|
|
63
|
+
* Provides a list of commands and associated tokens for a given Uniswap calldata
|
|
64
|
+
*
|
|
65
|
+
* @param {`0x${string}`} calldata
|
|
66
|
+
* @param {number} chainId
|
|
67
|
+
* @returns {CommandsAndTokens}
|
|
68
|
+
*/
|
|
69
|
+
export const getCommandsAndTokensFromUniswapCalldata = (calldata, chainId) => {
|
|
70
|
+
try {
|
|
71
|
+
const [commands, inputs] = new utils.Interface([
|
|
72
|
+
"function execute(bytes calldata commands, bytes[] calldata inputs, uint256 deadline) external payable",
|
|
73
|
+
]).decodeFunctionData("execute", calldata);
|
|
74
|
+
const commandsBuffer = Buffer.from(commands.slice(2), "hex");
|
|
75
|
+
return commandsBuffer.reduce((acc, curr, i) => {
|
|
76
|
+
const commandName = UNISWAP_COMMANDS[`0x${curr.toString(16).padStart(2, "0")}`];
|
|
77
|
+
if (!commandName)
|
|
78
|
+
return [...acc, [undefined, []]];
|
|
79
|
+
const commandDecoder = UniswapDecoders[commandName];
|
|
80
|
+
return [...acc, [commandName, commandDecoder(inputs[i], chainId)]];
|
|
81
|
+
}, []);
|
|
82
|
+
}
|
|
83
|
+
catch (e) {
|
|
84
|
+
log("Uniswap", "Error decoding Uniswap calldata", e);
|
|
85
|
+
return [];
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
/**
|
|
89
|
+
* @ignore for external documentation
|
|
90
|
+
*
|
|
91
|
+
* Returns the necessary APDUs to load the Uniswap plugin
|
|
92
|
+
* and the token descriptors for a transaction
|
|
93
|
+
*
|
|
94
|
+
* @param {Transaction} transaction
|
|
95
|
+
* @param {number} chainId
|
|
96
|
+
* @param {LoadConfig} userConfig
|
|
97
|
+
* @returns {Promise<{ pluginData?: Buffer; tokenDescriptors?: Buffer[] }>}
|
|
98
|
+
*/
|
|
99
|
+
export const loadInfosForUniswap = (transaction, chainId, userConfig) => __awaiter(void 0, void 0, void 0, function* () {
|
|
100
|
+
const selector = transaction.data.slice(0, 10);
|
|
101
|
+
const commandsAndTokens = getCommandsAndTokensFromUniswapCalldata(transaction.data, chainId);
|
|
102
|
+
if (!isSupported(selector, transaction.to, chainId, commandsAndTokens)) {
|
|
103
|
+
return {};
|
|
104
|
+
}
|
|
105
|
+
const tokenDescriptorsPromises = Promise.all(commandsAndTokens.flatMap(([, tokens]) => tokens.map((token) => __awaiter(void 0, void 0, void 0, function* () {
|
|
106
|
+
var _a;
|
|
107
|
+
const erc20SignaturesBlob = yield findERC20SignaturesInfo(userConfig || {}, chainId);
|
|
108
|
+
return (_a = byContractAddressAndChainId(token, chainId, erc20SignaturesBlob)) === null || _a === void 0 ? void 0 : _a.data;
|
|
109
|
+
}))));
|
|
110
|
+
const tokenDescriptors = yield tokenDescriptorsPromises.then(descriptors => descriptors.filter((descriptor) => !!descriptor));
|
|
111
|
+
const pluginName = "Uniswap";
|
|
112
|
+
// 1 byte for the length of the plugin name
|
|
113
|
+
const lengthBuff = Buffer.alloc(1);
|
|
114
|
+
lengthBuff.writeUIntBE(pluginName.length, 0, 1);
|
|
115
|
+
// dynamic length bytes for the plugin name
|
|
116
|
+
const pluginNameBuff = Buffer.from(pluginName);
|
|
117
|
+
// 20 bytes for the contract address
|
|
118
|
+
const contractAddressBuff = Buffer.from(UNISWAP_UNIVERSAL_ROUTER_ADDRESS.slice(2), "hex");
|
|
119
|
+
// 4 bytes for the selector
|
|
120
|
+
const selectorBuff = Buffer.from(UNISWAP_EXECUTE_SELECTOR.slice(2), "hex");
|
|
121
|
+
// 70 bytes for the signature
|
|
122
|
+
const signature = Buffer.from(
|
|
123
|
+
// Signature is hardcoded as it would create issues by being in the CAL ethereum.json file
|
|
124
|
+
"3044022014391e8f355867a57fe88f6a5a4dbcb8bf8f888a9db3ff3449caf72d120396bd02200c13d9c3f79400fe0aa0434ac54d59b79503c9964a4abc3e8cd22763e0242935", "hex");
|
|
125
|
+
const pluginData = Buffer.concat([
|
|
126
|
+
lengthBuff,
|
|
127
|
+
pluginNameBuff,
|
|
128
|
+
contractAddressBuff,
|
|
129
|
+
selectorBuff,
|
|
130
|
+
signature,
|
|
131
|
+
]);
|
|
132
|
+
return {
|
|
133
|
+
pluginData,
|
|
134
|
+
tokenDescriptors,
|
|
135
|
+
};
|
|
136
|
+
});
|
|
137
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/modules/Uniswap/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export type UniswapSupportedCommand = "V2_SWAP_EXACT_IN" | "V2_SWAP_EXACT_OUT" | "V3_SWAP_EXACT_IN" | "V3_SWAP_EXACT_OUT" | "WRAP_ETH" | "UNWRAP_ETH" | "PERMIT2_PERMIT" | "PERMIT2_TRANSFER_FROM" | "PERMIT2_PERMIT_BATCH" | "PERMIT2_TRANSFER_FROM_BATCH" | "PAY_PORTION";
|
|
2
|
+
export type CommandsAndTokens = [UniswapSupportedCommand | undefined, `0x${string}`[]][];
|
|
3
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/modules/Uniswap/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,uBAAuB,GAC/B,kBAAkB,GAClB,mBAAmB,GACnB,kBAAkB,GAClB,mBAAmB,GACnB,UAAU,GACV,YAAY,GACZ,gBAAgB,GAChB,uBAAuB,GACvB,sBAAsB,GACtB,6BAA6B,GAC7B,aAAa,CAAC;AAElB,MAAM,MAAM,iBAAiB,GAAG,CAAC,uBAAuB,GAAG,SAAS,EAAE,KAAK,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/modules/Uniswap/types.ts"],"names":[],"mappings":""}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/ledger/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/ledger/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAkC,2BAA2B,EAAc,MAAM,UAAU,CAAC;;AA0OnG,wBAIiC"}
|
|
@@ -7,14 +7,15 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
7
7
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
8
|
});
|
|
9
9
|
};
|
|
10
|
-
|
|
10
|
+
import { utils } from "ethers";
|
|
11
11
|
import { log } from "@ledgerhq/logs";
|
|
12
|
-
import { Interface } from "@ethersproject/abi";
|
|
13
12
|
import { signDomainResolution, signAddressResolution, } from "@ledgerhq/domain-service/signers/index";
|
|
13
|
+
import { decodeTxInfo, tokenSelectors, nftSelectors, mergeResolutions } from "../../utils";
|
|
14
|
+
import { UNISWAP_UNIVERSAL_ROUTER_ADDRESS } from "../../modules/Uniswap/constants";
|
|
14
15
|
import { byContractAddressAndChainId, findERC20SignaturesInfo } from "./erc20";
|
|
16
|
+
import { loadInfosForUniswap } from "../../modules/Uniswap";
|
|
15
17
|
import { loadInfosForContractMethod } from "./contracts";
|
|
16
18
|
import { getNFTInfo, loadNftPlugin } from "./nfts";
|
|
17
|
-
import { decodeTxInfo, tokenSelectors, nftSelectors, mergeResolutions } from "../../utils";
|
|
18
19
|
/**
|
|
19
20
|
* @ignore for external documentation
|
|
20
21
|
*
|
|
@@ -74,7 +75,9 @@ const loadNanoAppPlugins = (contractAddress, selector, decodedTx, chainIdTruncat
|
|
|
74
75
|
log("ethereum", "no NFT plugin payload for selector " + selector + " and address " + contractAddress);
|
|
75
76
|
}
|
|
76
77
|
}
|
|
77
|
-
|
|
78
|
+
// Uniswap has its own way of working, so we need to handle it separately
|
|
79
|
+
// This will prevent an error if we add Uniswap to the CAL service
|
|
80
|
+
if (shouldResolve.externalPlugins && contractAddress !== UNISWAP_UNIVERSAL_ROUTER_ADDRESS) {
|
|
78
81
|
const contractMethodInfos = yield loadInfosForContractMethod(contractAddress, selector, chainIdTruncated, loadConfig);
|
|
79
82
|
if (contractMethodInfos) {
|
|
80
83
|
const { plugin, payload, signature, erc20OfInterest, abi } = contractMethodInfos;
|
|
@@ -83,7 +86,7 @@ const loadNanoAppPlugins = (contractAddress, selector, decodedTx, chainIdTruncat
|
|
|
83
86
|
resolution.externalPlugin.push({ payload, signature });
|
|
84
87
|
}
|
|
85
88
|
if (erc20OfInterest && erc20OfInterest.length && abi) {
|
|
86
|
-
const contract = new Interface(abi);
|
|
89
|
+
const contract = new utils.Interface(abi);
|
|
87
90
|
const args = contract.parseTransaction(decodedTx).args;
|
|
88
91
|
for (const path of erc20OfInterest) {
|
|
89
92
|
const erc20ContractAddress = path.split(".").reduce((value, seg) => {
|
|
@@ -96,6 +99,7 @@ const loadNanoAppPlugins = (contractAddress, selector, decodedTx, chainIdTruncat
|
|
|
96
99
|
nft: false,
|
|
97
100
|
externalPlugins: false,
|
|
98
101
|
token: true, // enforcing resolution of tokens for external plugins that need info on assets (e.g. for a swap)
|
|
102
|
+
uniswapV3: false,
|
|
99
103
|
});
|
|
100
104
|
resolution = mergeResolutions([resolution, externalPluginResolution]);
|
|
101
105
|
}
|
|
@@ -105,6 +109,16 @@ const loadNanoAppPlugins = (contractAddress, selector, decodedTx, chainIdTruncat
|
|
|
105
109
|
log("ethereum", "no infos for selector " + selector);
|
|
106
110
|
}
|
|
107
111
|
}
|
|
112
|
+
if (shouldResolve.uniswapV3) {
|
|
113
|
+
const { pluginData, tokenDescriptors } = yield loadInfosForUniswap(decodedTx, chainIdTruncated);
|
|
114
|
+
if (pluginData && tokenDescriptors) {
|
|
115
|
+
resolution.externalPlugin.push({
|
|
116
|
+
payload: pluginData.toString("hex"),
|
|
117
|
+
signature: "",
|
|
118
|
+
});
|
|
119
|
+
resolution.erc20Tokens.push(...tokenDescriptors.map(d => d.toString("hex")));
|
|
120
|
+
}
|
|
121
|
+
}
|
|
108
122
|
return resolution;
|
|
109
123
|
});
|
|
110
124
|
/**
|
|
@@ -125,6 +139,7 @@ const resolveTransaction = (rawTxHex, loadConfig, resolutionConfig) => __awaiter
|
|
|
125
139
|
token: resolutionConfig.erc20 && tokenSelectors.includes(selector),
|
|
126
140
|
nft: resolutionConfig.nft && nftSelectors.includes(selector),
|
|
127
141
|
externalPlugins: resolutionConfig.externalPlugins,
|
|
142
|
+
uniswapV3: resolutionConfig.uniswapV3,
|
|
128
143
|
};
|
|
129
144
|
const pluginsResolution = yield loadNanoAppPlugins(contractAddress, selector, decodedTx, chainIdTruncated, loadConfig, shouldResolve);
|
|
130
145
|
if (pluginsResolution) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/services/ledger/index.ts"],"names":[],"mappings":";;;;;;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/services/ledger/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -26,6 +26,7 @@ export type ResolutionConfig = {
|
|
|
26
26
|
externalPlugins?: boolean;
|
|
27
27
|
erc20?: boolean;
|
|
28
28
|
domains?: DomainDescriptor[];
|
|
29
|
+
uniswapV3?: boolean;
|
|
29
30
|
};
|
|
30
31
|
export type LedgerEthTransactionService = {
|
|
31
32
|
resolveTransaction: (rawTxHex: string, loadConfig: LoadConfig, resolutionConfig: ResolutionConfig) => Promise<LedgerEthTransactionResolution>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/services/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,IAAI,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAC7F,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACrB,MAAM,wCAAwC,CAAC;AAEhD,MAAM,MAAM,8BAA8B,GAAG;IAE3C,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAE3B,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAEpB,cAAc,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAE9D,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAEtB,OAAO,EAAE,gBAAgB,EAAE,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IAEvB,kBAAkB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAInC,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAG9B,YAAY,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC;IAC1B,mBAAmB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAE7B,GAAG,CAAC,EAAE,OAAO,CAAC;IAEd,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B,KAAK,CAAC,EAAE,OAAO,CAAC;IAEhB,OAAO,CAAC,EAAE,gBAAgB,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/services/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,IAAI,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAC7F,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACrB,MAAM,wCAAwC,CAAC;AAEhD,MAAM,MAAM,8BAA8B,GAAG;IAE3C,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAE3B,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAEpB,cAAc,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAE9D,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAEtB,OAAO,EAAE,gBAAgB,EAAE,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IAEvB,kBAAkB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAInC,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAG9B,YAAY,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC;IAC1B,mBAAmB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAE7B,GAAG,CAAC,EAAE,OAAO,CAAC;IAEd,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B,KAAK,CAAC,EAAE,OAAO,CAAC;IAEhB,OAAO,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAE7B,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG;IACxC,kBAAkB,EAAE,CAClB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,UAAU,EACtB,gBAAgB,EAAE,gBAAgB,KAC/B,OAAO,CAAC,8BAA8B,CAAC,CAAC;IAC7C,oBAAoB,EAAE,OAAO,oBAAoB,CAAC;IAClD,qBAAqB,EAAE,OAAO,qBAAqB,CAAC;CACrD,CAAC"}
|
package/lib-es/utils.js
CHANGED
|
@@ -59,7 +59,7 @@ export const decodeTxInfo = (rawTx) => {
|
|
|
59
59
|
data: rlpDecoded[5],
|
|
60
60
|
to: rlpDecoded[3],
|
|
61
61
|
// Default to 1 for non EIP 155 txs
|
|
62
|
-
chainId: rlpTx.length > 6 ? rlpTx[6] : Buffer.from("
|
|
62
|
+
chainId: rlpTx.length > 6 ? rlpTx[6] : Buffer.from("01", "hex"),
|
|
63
63
|
};
|
|
64
64
|
}
|
|
65
65
|
const chainIdSrc = decodedTx.chainId;
|
package/lib-es/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ledgerhq/hw-app-eth",
|
|
3
|
-
"version": "7.0.0-
|
|
3
|
+
"version": "7.0.0-nightly.1",
|
|
4
4
|
"description": "Ledger Hardware Wallet Ethereum Application API",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"Ledger",
|
|
@@ -31,14 +31,14 @@
|
|
|
31
31
|
"axios": "1.7.7",
|
|
32
32
|
"bignumber.js": "^9.1.2",
|
|
33
33
|
"semver": "^7.3.5",
|
|
34
|
-
"@ledgerhq/cryptoassets-evm-signatures": "^14.0.0-
|
|
35
|
-
"@ledgerhq/domain-service": "^1.2.6-
|
|
34
|
+
"@ledgerhq/cryptoassets-evm-signatures": "^14.0.0-nightly.1",
|
|
35
|
+
"@ledgerhq/domain-service": "^1.2.6-nightly.1",
|
|
36
36
|
"@ledgerhq/errors": "^6.19.1",
|
|
37
|
-
"@ledgerhq/evm-tools": "^1.2.3-
|
|
37
|
+
"@ledgerhq/evm-tools": "^1.2.3-nightly.1",
|
|
38
38
|
"@ledgerhq/hw-transport": "^6.31.4",
|
|
39
39
|
"@ledgerhq/hw-transport-mocker": "^6.29.4",
|
|
40
40
|
"@ledgerhq/logs": "^6.12.0",
|
|
41
|
-
"@ledgerhq/types-live": "^6.52.0-
|
|
41
|
+
"@ledgerhq/types-live": "^6.52.0-nightly.1"
|
|
42
42
|
},
|
|
43
43
|
"gitHead": "dd0dea64b58e5a9125c8a422dcffd29e5ef6abec",
|
|
44
44
|
"devDependencies": {
|
|
@@ -53,6 +53,11 @@
|
|
|
53
53
|
"ts-jest": "^29.1.1",
|
|
54
54
|
"ts-node": "^10.4.0"
|
|
55
55
|
},
|
|
56
|
+
"overrides": {
|
|
57
|
+
"@ethersproject/providers": {
|
|
58
|
+
"ws": "7.5.10"
|
|
59
|
+
}
|
|
60
|
+
},
|
|
56
61
|
"scripts": {
|
|
57
62
|
"clean": "rimraf lib lib-es",
|
|
58
63
|
"build": "tsc && tsc -m ES6 --outDir lib-es",
|
package/src/Eth.ts
CHANGED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { UniswapSupportedCommand } from "./types";
|
|
2
|
+
|
|
3
|
+
export const UNISWAP_UNIVERSAL_ROUTER_ADDRESS = "0x3fc91a3afd70395cd496c647d5a6cc9d4b2b7fad";
|
|
4
|
+
export const UNISWAP_EXECUTE_SELECTOR = "0x3593564c";
|
|
5
|
+
|
|
6
|
+
export const WETH_PER_CHAIN_ID = {
|
|
7
|
+
// Ethereum Mainnet
|
|
8
|
+
1: "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",
|
|
9
|
+
// Ethereum Goerli
|
|
10
|
+
5: "0xB4FBF271143F4FBf7B91A5ded31805e42b2208d6",
|
|
11
|
+
// Ethereum Sepolia
|
|
12
|
+
11155111: "0xfFf9976782d46CC05630D1f6eBAb18b2324d6B14",
|
|
13
|
+
// Arbitrum One
|
|
14
|
+
42161: "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",
|
|
15
|
+
// Arbitrum Goerli
|
|
16
|
+
421613: "0xe39Ab88f8A4777030A534146A9Ca3B52bd5D43A3",
|
|
17
|
+
// Avalanche C-Chain
|
|
18
|
+
43114: "0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7",
|
|
19
|
+
// BSC
|
|
20
|
+
56: "0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c",
|
|
21
|
+
// Base
|
|
22
|
+
8453: "0x4200000000000000000000000000000000000006",
|
|
23
|
+
// Base Goerli
|
|
24
|
+
84531: "0x44D627f900da8AdaC7561bD73aA745F132450798",
|
|
25
|
+
// Blast
|
|
26
|
+
23888: "0x4300000000000000000000000000000000000004",
|
|
27
|
+
// Celo
|
|
28
|
+
42220: new Error("Celo isn't supporting wrapping Eth"),
|
|
29
|
+
// Celo Alfajores
|
|
30
|
+
44787: new Error("Celo Alfajores isn't supporting wrapping Eth"),
|
|
31
|
+
// Optimism
|
|
32
|
+
10: "0x4200000000000000000000000000000000000006",
|
|
33
|
+
// Optimism Goerli
|
|
34
|
+
420: "0x4200000000000000000000000000000000000006",
|
|
35
|
+
// Polygon
|
|
36
|
+
137: "0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270",
|
|
37
|
+
// Polygon Mumbai
|
|
38
|
+
80001: "0x9c3C9283D3e44854697Cd22D3Faa240Cfb032889",
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
export const UNISWAP_COMMANDS: Record<`0x${string}`, UniswapSupportedCommand> = {
|
|
42
|
+
"0x08": "V2_SWAP_EXACT_IN",
|
|
43
|
+
"0x09": "V2_SWAP_EXACT_OUT",
|
|
44
|
+
"0x00": "V3_SWAP_EXACT_IN",
|
|
45
|
+
"0x01": "V3_SWAP_EXACT_OUT",
|
|
46
|
+
"0x0b": "WRAP_ETH",
|
|
47
|
+
"0x0c": "UNWRAP_ETH",
|
|
48
|
+
"0x0a": "PERMIT2_PERMIT",
|
|
49
|
+
"0x0d": "PERMIT2_TRANSFER_FROM",
|
|
50
|
+
"0x02": "PERMIT2_PERMIT_BATCH",
|
|
51
|
+
"0x03": "PERMIT2_TRANSFER_FROM_BATCH",
|
|
52
|
+
"0x06": "PAY_PORTION",
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
export const SWAP_COMMANDS: Partial<UniswapSupportedCommand>[] = [
|
|
56
|
+
"V2_SWAP_EXACT_IN",
|
|
57
|
+
"V2_SWAP_EXACT_OUT",
|
|
58
|
+
"V3_SWAP_EXACT_IN",
|
|
59
|
+
"V3_SWAP_EXACT_OUT",
|
|
60
|
+
] as const;
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { utils } from "ethers";
|
|
2
|
+
import { WETH_PER_CHAIN_ID } from "./constants";
|
|
3
|
+
import { UniswapSupportedCommand } from "./types";
|
|
4
|
+
|
|
5
|
+
const swapV2Decoder = (input: `0x${string}`): `0x${string}`[] => {
|
|
6
|
+
const [, , , addresses] = utils.defaultAbiCoder.decode(
|
|
7
|
+
["address", "uint256", "uint256", "address[]", "bool"],
|
|
8
|
+
input,
|
|
9
|
+
);
|
|
10
|
+
|
|
11
|
+
return addresses.map(address => address.toLowerCase());
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
const swapV3Decoder = (input: `0x${string}`): `0x${string}`[] => {
|
|
15
|
+
const [, , , path] = utils.defaultAbiCoder.decode(
|
|
16
|
+
["address", "uint256", "uint256", "bytes", "bool"],
|
|
17
|
+
input,
|
|
18
|
+
);
|
|
19
|
+
// Path is at least 43 bytes long for 2 times 20B addresses + 3B fee in between
|
|
20
|
+
// Example for the pattern pattern: 20B address + 3B fee + 20B address
|
|
21
|
+
// more addresses can be included after another 3B space
|
|
22
|
+
const pathBuffer = Buffer.from(path.slice(2), "hex");
|
|
23
|
+
|
|
24
|
+
const tokens: `0x${string}`[] = [];
|
|
25
|
+
let i = 0;
|
|
26
|
+
while (i < pathBuffer.length) {
|
|
27
|
+
tokens.push(
|
|
28
|
+
`0x${pathBuffer
|
|
29
|
+
.subarray(i, i + 20)
|
|
30
|
+
.toString("hex")
|
|
31
|
+
.toLowerCase()}`,
|
|
32
|
+
);
|
|
33
|
+
// Skip 20B address + 3B fee
|
|
34
|
+
i += 23;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
return tokens;
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
const wrapEthDecoder = (input: `0x${string}`, chainId: number | string): `0x${string}`[] => {
|
|
41
|
+
const contract = WETH_PER_CHAIN_ID[chainId];
|
|
42
|
+
return contract instanceof Error ? [] : [contract.toLowerCase()];
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
const noDecoder = () => [];
|
|
46
|
+
|
|
47
|
+
export const UniswapDecoders: Record<
|
|
48
|
+
UniswapSupportedCommand,
|
|
49
|
+
(input: `0x${string}`, chainId: number | string) => `0x${string}`[]
|
|
50
|
+
> = {
|
|
51
|
+
V2_SWAP_EXACT_IN: swapV2Decoder,
|
|
52
|
+
V2_SWAP_EXACT_OUT: swapV2Decoder,
|
|
53
|
+
V3_SWAP_EXACT_IN: swapV3Decoder,
|
|
54
|
+
V3_SWAP_EXACT_OUT: swapV3Decoder,
|
|
55
|
+
WRAP_ETH: wrapEthDecoder,
|
|
56
|
+
UNWRAP_ETH: wrapEthDecoder,
|
|
57
|
+
PERMIT2_PERMIT: noDecoder,
|
|
58
|
+
PERMIT2_TRANSFER_FROM: noDecoder,
|
|
59
|
+
PERMIT2_PERMIT_BATCH: noDecoder,
|
|
60
|
+
PERMIT2_TRANSFER_FROM_BATCH: noDecoder,
|
|
61
|
+
PAY_PORTION: noDecoder,
|
|
62
|
+
};
|