viem
Version:
123 lines • 5.21 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.serializeTransaction = void 0;
const transaction_js_1 = require("../../errors/transaction.js");
const concat_js_1 = require("../data/concat.js");
const trim_js_1 = require("../data/trim.js");
const toHex_js_1 = require("../encoding/toHex.js");
const toRlp_js_1 = require("../encoding/toRlp.js");
const assertTransaction_js_1 = require("./assertTransaction.js");
const getTransactionType_js_1 = require("./getTransactionType.js");
const serializeAccessList_js_1 = require("./serializeAccessList.js");
function serializeTransaction(transaction, signature) {
const type = (0, getTransactionType_js_1.getTransactionType)(transaction);
if (type === 'eip1559')
return serializeTransactionEIP1559(transaction, signature);
if (type === 'eip2930')
return serializeTransactionEIP2930(transaction, signature);
return serializeTransactionLegacy(transaction, signature);
}
exports.serializeTransaction = serializeTransaction;
function serializeTransactionEIP1559(transaction, signature) {
const { chainId, gas, nonce, to, value, maxFeePerGas, maxPriorityFeePerGas, accessList, data, } = transaction;
(0, assertTransaction_js_1.assertTransactionEIP1559)(transaction);
const serializedAccessList = (0, serializeAccessList_js_1.serializeAccessList)(accessList);
const serializedTransaction = [
(0, toHex_js_1.toHex)(chainId),
nonce ? (0, toHex_js_1.toHex)(nonce) : '0x',
maxPriorityFeePerGas ? (0, toHex_js_1.toHex)(maxPriorityFeePerGas) : '0x',
maxFeePerGas ? (0, toHex_js_1.toHex)(maxFeePerGas) : '0x',
gas ? (0, toHex_js_1.toHex)(gas) : '0x',
to ?? '0x',
value ? (0, toHex_js_1.toHex)(value) : '0x',
data ?? '0x',
serializedAccessList,
];
if (signature) {
const yParity = (() => {
if (signature.v === 0n)
return '0x';
if (signature.v === 1n)
return (0, toHex_js_1.toHex)(1);
return signature.v === 27n ? '0x' : (0, toHex_js_1.toHex)(1);
})();
serializedTransaction.push(yParity, (0, trim_js_1.trim)(signature.r), (0, trim_js_1.trim)(signature.s));
}
return (0, concat_js_1.concatHex)([
'0x02',
(0, toRlp_js_1.toRlp)(serializedTransaction),
]);
}
function serializeTransactionEIP2930(transaction, signature) {
const { chainId, gas, data, nonce, to, value, accessList, gasPrice } = transaction;
(0, assertTransaction_js_1.assertTransactionEIP2930)(transaction);
const serializedAccessList = (0, serializeAccessList_js_1.serializeAccessList)(accessList);
const serializedTransaction = [
(0, toHex_js_1.toHex)(chainId),
nonce ? (0, toHex_js_1.toHex)(nonce) : '0x',
gasPrice ? (0, toHex_js_1.toHex)(gasPrice) : '0x',
gas ? (0, toHex_js_1.toHex)(gas) : '0x',
to ?? '0x',
value ? (0, toHex_js_1.toHex)(value) : '0x',
data ?? '0x',
serializedAccessList,
];
if (signature) {
const yParity = (() => {
if (signature.v === 0n)
return '0x';
if (signature.v === 1n)
return (0, toHex_js_1.toHex)(1);
return signature.v === 27n ? '0x' : (0, toHex_js_1.toHex)(1);
})();
serializedTransaction.push(yParity, (0, trim_js_1.trim)(signature.r), (0, trim_js_1.trim)(signature.s));
}
return (0, concat_js_1.concatHex)([
'0x01',
(0, toRlp_js_1.toRlp)(serializedTransaction),
]);
}
function serializeTransactionLegacy(transaction, signature) {
const { chainId = 0, gas, data, nonce, to, value, gasPrice } = transaction;
(0, assertTransaction_js_1.assertTransactionLegacy)(transaction);
let serializedTransaction = [
nonce ? (0, toHex_js_1.toHex)(nonce) : '0x',
gasPrice ? (0, toHex_js_1.toHex)(gasPrice) : '0x',
gas ? (0, toHex_js_1.toHex)(gas) : '0x',
to ?? '0x',
value ? (0, toHex_js_1.toHex)(value) : '0x',
data ?? '0x',
];
if (signature) {
const v = (() => {
if (chainId > 0)
return BigInt(chainId * 2) + BigInt(35n + signature.v - 27n);
if (signature.v >= 35n) {
const inferredChainId = (signature.v - 35n) / 2n;
if (inferredChainId > 0)
return signature.v;
return 27n + (signature.v === 35n ? 0n : 1n);
}
const v = 27n + (signature.v === 27n ? 0n : 1n);
if (signature.v !== v)
throw new transaction_js_1.InvalidLegacyVError({ v: signature.v });
return v;
})();
serializedTransaction = [
...serializedTransaction,
(0, toHex_js_1.toHex)(v),
signature.r,
signature.s,
];
}
else if (chainId > 0) {
serializedTransaction = [
...serializedTransaction,
(0, toHex_js_1.toHex)(chainId),
'0x',
'0x',
];
}
return (0, toRlp_js_1.toRlp)(serializedTransaction);
}
//# sourceMappingURL=serializeTransaction.js.map