You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
111 lines
4.2 KiB
111 lines
4.2 KiB
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
const ethereumjs_util_1 = require("ethereumjs-util");
|
|
const _1 = require(".");
|
|
class TransactionFactory {
|
|
// It is not possible to instantiate a TransactionFactory object.
|
|
constructor() { }
|
|
/**
|
|
* Create a transaction from a `txData` object
|
|
*
|
|
* @param txData - The transaction data. The `type` field will determine which transaction type is returned (if undefined, creates a legacy transaction)
|
|
* @param txOptions - Options to pass on to the constructor of the transaction
|
|
*/
|
|
static fromTxData(txData, txOptions = {}) {
|
|
if (!('type' in txData) || txData.type === undefined) {
|
|
// Assume legacy transaction
|
|
return _1.Transaction.fromTxData(txData, txOptions);
|
|
}
|
|
else {
|
|
const txType = new ethereumjs_util_1.BN((0, ethereumjs_util_1.toBuffer)(txData.type)).toNumber();
|
|
if (txType === 0) {
|
|
return _1.Transaction.fromTxData(txData, txOptions);
|
|
}
|
|
else if (txType === 1) {
|
|
return _1.AccessListEIP2930Transaction.fromTxData(txData, txOptions);
|
|
}
|
|
else if (txType === 2) {
|
|
return _1.FeeMarketEIP1559Transaction.fromTxData(txData, txOptions);
|
|
}
|
|
else {
|
|
throw new Error(`Tx instantiation with type ${txType} not supported`);
|
|
}
|
|
}
|
|
}
|
|
/**
|
|
* This method tries to decode serialized data.
|
|
*
|
|
* @param data - The data Buffer
|
|
* @param txOptions - The transaction options
|
|
*/
|
|
static fromSerializedData(data, txOptions = {}) {
|
|
if (data[0] <= 0x7f) {
|
|
// Determine the type.
|
|
let EIP;
|
|
switch (data[0]) {
|
|
case 1:
|
|
EIP = 2930;
|
|
break;
|
|
case 2:
|
|
EIP = 1559;
|
|
break;
|
|
default:
|
|
throw new Error(`TypedTransaction with ID ${data[0]} unknown`);
|
|
}
|
|
if (EIP === 1559) {
|
|
return _1.FeeMarketEIP1559Transaction.fromSerializedTx(data, txOptions);
|
|
}
|
|
else {
|
|
// EIP === 2930
|
|
return _1.AccessListEIP2930Transaction.fromSerializedTx(data, txOptions);
|
|
}
|
|
}
|
|
else {
|
|
return _1.Transaction.fromSerializedTx(data, txOptions);
|
|
}
|
|
}
|
|
/**
|
|
* When decoding a BlockBody, in the transactions field, a field is either:
|
|
* A Buffer (a TypedTransaction - encoded as TransactionType || rlp(TransactionPayload))
|
|
* A Buffer[] (Legacy Transaction)
|
|
* This method returns the right transaction.
|
|
*
|
|
* @param data - A Buffer or Buffer[]
|
|
* @param txOptions - The transaction options
|
|
*/
|
|
static fromBlockBodyData(data, txOptions = {}) {
|
|
if (Buffer.isBuffer(data)) {
|
|
return this.fromSerializedData(data, txOptions);
|
|
}
|
|
else if (Array.isArray(data)) {
|
|
// It is a legacy transaction
|
|
return _1.Transaction.fromValuesArray(data, txOptions);
|
|
}
|
|
else {
|
|
throw new Error('Cannot decode transaction: unknown type input');
|
|
}
|
|
}
|
|
/**
|
|
* This helper method allows one to retrieve the class which matches the transactionID
|
|
* If transactionID is undefined, returns the legacy transaction class.
|
|
* @deprecated - This method is deprecated and will be removed on the next major release
|
|
* @param transactionID
|
|
* @param _common - This option is not used
|
|
*/
|
|
static getTransactionClass(transactionID = 0, _common) {
|
|
const legacyTxn = transactionID == 0 || (transactionID >= 0x80 && transactionID <= 0xff);
|
|
if (legacyTxn) {
|
|
return _1.Transaction;
|
|
}
|
|
switch (transactionID) {
|
|
case 1:
|
|
return _1.AccessListEIP2930Transaction;
|
|
case 2:
|
|
return _1.FeeMarketEIP1559Transaction;
|
|
default:
|
|
throw new Error(`TypedTransaction with ID ${transactionID} unknown`);
|
|
}
|
|
}
|
|
}
|
|
exports.default = TransactionFactory;
|
|
//# sourceMappingURL=transactionFactory.js.map
|