@trezor/connect
Version:
High-level javascript interface for Trezor hardware wallet.
133 lines • 5.11 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.ethereumSignTxEIP1559 = exports.ethereumSignTx = exports.serializeEthereumTx = exports.getCommonForChain = void 0;
const common_1 = require("@ethereumjs/common");
const tx_1 = require("@ethereumjs/tx");
const constants_1 = require("../../constants");
const formatUtils_1 = require("../../utils/formatUtils");
const splitString = (str, len) => {
if (str == null) {
return ['', ''];
}
const first = str.slice(0, len);
const second = str.slice(len);
return [first, second];
};
const processTxRequest = async (typedCall, request, data, chain_id) => {
if (!request.data_length) {
let v = request.signature_v;
const r = request.signature_r;
const s = request.signature_s;
if (v == null || r == null || s == null) {
throw constants_1.ERRORS.TypedError('Runtime', 'processTxRequest: Unexpected request');
}
if (chain_id && v <= 1) {
v += 2 * chain_id + 35;
}
return Promise.resolve({
v: `0x${v.toString(16)}`,
r: `0x${r}`,
s: `0x${s}`,
});
}
const [first, rest] = splitString(data, request.data_length * 2);
const response = await typedCall('EthereumTxAck', 'EthereumTxRequest', { data_chunk: first });
return processTxRequest(typedCall, response.message, rest, chain_id);
};
const deepHexPrefix = (0, formatUtils_1.deepTransform)(formatUtils_1.addHexPrefix);
const getCommonForChain = (chainId) => {
if (common_1.Common.isSupportedChainId(BigInt(chainId)))
return new common_1.Common({ chain: chainId });
if (chainId === 61)
return common_1.Common.custom({ name: 'ethereum-classic', networkId: 1, chainId: 61 }, { baseChain: common_1.Chain.Mainnet, hardfork: common_1.Hardfork.Petersburg });
return common_1.Common.custom({ chainId });
};
exports.getCommonForChain = getCommonForChain;
const serializeEthereumTx = (tx, signature, isLegacy) => {
const txData = deepHexPrefix({
...tx,
...signature,
to: tx.to || undefined,
type: isLegacy ? 0 : 2,
...(isLegacy
? {
gasPrice: tx.gasPrice,
maxFeePerGas: undefined,
maxPriorityFeePerGas: undefined,
}
: {
gasPrice: undefined,
maxFeePerGas: tx.maxFeePerGas,
maxPriorityFeePerGas: tx.maxPriorityFeePerGas,
}),
});
const txOptions = {
common: (0, exports.getCommonForChain)(tx.chainId),
};
const ethTx = tx_1.TransactionFactory.fromTxData(txData, txOptions);
return `0x${Buffer.from(ethTx.serialize()).toString('hex')}`;
};
exports.serializeEthereumTx = serializeEthereumTx;
const stripLeadingZeroes = (str) => {
while (/^00/.test(str)) {
str = str.slice(2);
}
return str;
};
const ethereumSignTx = async (typedCall, address_n, to, value, gas_limit, gas_price, nonce, chain_id, chunkify, data, tx_type, definitions) => {
const length = data == null ? 0 : data.length / 2;
const [first, rest] = splitString(data, 1024 * 2);
let message = {
address_n,
chain_id,
nonce: stripLeadingZeroes(nonce),
gas_price: stripLeadingZeroes(gas_price),
gas_limit: stripLeadingZeroes(gas_limit),
to: to || undefined,
value: stripLeadingZeroes(value),
definitions,
chunkify,
};
if (length !== 0) {
message = {
...message,
data_length: length,
data_initial_chunk: first,
};
}
if (tx_type !== null) {
message = {
...message,
tx_type,
};
}
const response = await typedCall('EthereumSignTx', 'EthereumTxRequest', message);
return processTxRequest(typedCall, response.message, rest, chain_id);
};
exports.ethereumSignTx = ethereumSignTx;
const ethereumSignTxEIP1559 = async (typedCall, address_n, to, value, gas_limit, max_gas_fee, max_priority_fee, nonce, chain_id, chunkify, data, access_list, definitions) => {
const length = data == null ? 0 : data.length / 2;
const [first, rest] = splitString(data, 1024 * 2);
const message = {
address_n,
nonce: stripLeadingZeroes(nonce),
max_gas_fee: stripLeadingZeroes(max_gas_fee),
max_priority_fee: stripLeadingZeroes(max_priority_fee),
gas_limit: stripLeadingZeroes(gas_limit),
to: to || undefined,
value: stripLeadingZeroes(value),
data_length: length,
data_initial_chunk: first,
chain_id,
access_list: (access_list || []).map(a => ({
address: a.address,
storage_keys: a.storageKeys,
})),
definitions,
chunkify,
};
const response = await typedCall('EthereumSignTxEIP1559', 'EthereumTxRequest', message);
return processTxRequest(typedCall, response.message, rest);
};
exports.ethereumSignTxEIP1559 = ethereumSignTxEIP1559;
//# sourceMappingURL=ethereumSignTx.js.map