2022-04-11 17:14:19 -04:00
var _ _classPrivateFieldSet = ( this && this . _ _classPrivateFieldSet ) || function ( receiver , state , value , kind , f ) {
if ( kind === "m" ) throw new TypeError ( "Private method is not writable" ) ;
if ( kind === "a" && ! f ) throw new TypeError ( "Private accessor was defined without a setter" ) ;
if ( typeof state === "function" ? receiver !== state || ! f : ! state . has ( receiver ) ) throw new TypeError ( "Cannot write private member to an object whose class did not declare it" ) ;
return ( kind === "a" ? f . call ( receiver , value ) : f ? f . value = value : state . set ( receiver , value ) ) , value ;
} ;
var _ _classPrivateFieldGet = ( this && this . _ _classPrivateFieldGet ) || function ( receiver , state , kind , f ) {
if ( kind === "a" && ! f ) throw new TypeError ( "Private accessor was defined without a getter" ) ;
if ( typeof state === "function" ? receiver !== state || ! f : ! state . has ( receiver ) ) throw new TypeError ( "Cannot read private member from an object whose class did not declare it" ) ;
return kind === "m" ? f : kind === "a" ? f . call ( receiver ) : f ? f . value : state . get ( receiver ) ;
} ;
var _Transaction _props ;
import { getAddress } from "@ethersproject/address" ;
2022-04-17 03:13:04 -04:00
import { arrayify , concat , hexlify , zeroPadValue } from "@ethersproject/bytes" ;
2022-04-11 17:14:19 -04:00
import { keccak256 } from "@ethersproject/crypto" ;
import { toArray } from "@ethersproject/math" ;
import { getStore , setStore } from "@ethersproject/properties" ;
2022-04-17 03:13:04 -04:00
import { decodeRlp , encodeRlp } from "@ethersproject/rlp" ;
2022-04-11 17:14:19 -04:00
import { Signature } from "@ethersproject/signing-key" ;
import { accessListify } from "./accesslist.js" ;
2022-04-17 03:13:04 -04:00
import { recoverAddress } from "./address.js" ;
2022-04-11 17:14:19 -04:00
import { logger } from "./logger.js" ;
const BN _0 = BigInt ( 0 ) ;
2022-04-17 03:13:04 -04:00
const BN _2 = BigInt ( 2 ) ;
const BN _27 = BigInt ( 27 ) ;
const BN _28 = BigInt ( 28 ) ;
const BN _35 = BigInt ( 35 ) ;
const BN _MAX _UINT = BigInt ( "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" ) ;
function handleAddress ( value ) {
if ( value === "0x" ) {
return null ;
}
return getAddress ( value ) ;
}
function handleData ( value , param ) {
try {
return hexlify ( value ) ;
}
catch ( error ) {
return logger . throwArgumentError ( "invalid data" , param , value ) ;
}
}
function handleAccessList ( value , param ) {
try {
return accessListify ( value ) ;
}
catch ( error ) {
return logger . throwArgumentError ( "invalid accessList" , param , value ) ;
}
}
function handleNumber ( _value , param ) {
if ( _value === "0x" ) {
return 0 ;
}
return logger . getNumber ( _value , param ) ;
}
function handleUint ( _value , param ) {
if ( _value === "0x" ) {
return BN _0 ;
}
const value = logger . getBigInt ( _value , param ) ;
if ( value > BN _MAX _UINT ) {
logger . throwArgumentError ( "value exceeds uint size" , param , value ) ;
}
return value ;
}
2022-04-11 17:14:19 -04:00
function formatNumber ( _value , name ) {
const value = logger . getBigInt ( _value , "value" ) ;
const result = toArray ( value ) ;
if ( result . length > 32 ) {
logger . throwArgumentError ( ` value too large ` , ` tx. ${ name } ` , value ) ;
}
return result ;
}
function formatAccessList ( value ) {
return accessListify ( value ) . map ( ( set ) => [ set . address , set . storageKeys ] ) ;
}
function _parseLegacy ( data ) {
2022-04-17 03:13:04 -04:00
const fields = decodeRlp ( data ) ;
if ( ! Array . isArray ( fields ) || ( fields . length !== 9 && fields . length !== 6 ) ) {
return logger . throwArgumentError ( "invalid field count for legacy transaction" , "data" , data ) ;
}
const tx = {
type : 0 ,
nonce : handleNumber ( fields [ 0 ] , "nonce" ) ,
gasPrice : handleUint ( fields [ 1 ] , "gasPrice" ) ,
gasLimit : handleUint ( fields [ 2 ] , "gasLimit" ) ,
to : handleAddress ( fields [ 3 ] ) ,
value : handleUint ( fields [ 4 ] , "value" ) ,
data : handleData ( fields [ 5 ] , "dta" ) ,
chainId : BN _0
} ;
// Legacy unsigned transaction
if ( fields . length === 6 ) {
return tx ;
}
const v = handleUint ( fields [ 6 ] , "v" ) ;
const r = handleUint ( fields [ 7 ] , "r" ) ;
const s = handleUint ( fields [ 8 ] , "s" ) ;
if ( r === BN _0 && s === BN _0 ) {
// EIP-155 unsigned transaction
tx . chainId = v ;
}
else {
// Compute the EIP-155 chain ID (or 0 for legacy)
let chainId = ( v - BN _35 ) / BN _2 ;
if ( chainId < BN _0 ) {
chainId = BN _0 ;
}
tx . chainId = chainId ;
// Signed Legacy Transaction
if ( chainId === BN _0 && ( v < BN _27 || v > BN _28 ) ) {
logger . throwArgumentError ( "non-canonical legacy v" , "v" , fields [ 6 ] ) ;
}
tx . signature = Signature . from ( {
r : zeroPadValue ( fields [ 7 ] , 32 ) ,
s : zeroPadValue ( fields [ 8 ] , 32 ) ,
v
} ) ;
tx . hash = keccak256 ( data ) ;
}
return tx ;
2022-04-11 17:14:19 -04:00
}
function _serializeLegacy ( tx , sig ) {
const fields = [
formatNumber ( tx . nonce || 0 , "nonce" ) ,
formatNumber ( tx . gasPrice || 0 , "gasPrice" ) ,
formatNumber ( tx . gasLimit || 0 , "gasLimit" ) ,
( ( tx . to != null ) ? getAddress ( tx . to ) : "0x" ) ,
formatNumber ( tx . value || 0 , "value" ) ,
( tx . data || "0x" ) ,
] ;
let chainId = BN _0 ;
if ( tx . chainId != null ) {
// A chainId was provided; if non-zero we'll use EIP-155
chainId = logger . getBigInt ( tx . chainId , "tx.chainId" ) ;
// We have a chainId in the tx and an EIP-155 v in the signature,
// make sure they agree with each other
if ( sig && sig . networkV != null && sig . legacyChainId !== chainId ) {
logger . throwArgumentError ( "tx.chainId/sig.v mismatch" , "sig" , sig ) ;
}
}
else if ( sig ) {
// No chainId provided, but the signature is signing with EIP-155; derive chainId
const legacy = sig . legacyChainId ;
if ( legacy != null ) {
chainId = legacy ;
}
}
// Requesting an unsigned transaction
if ( ! sig ) {
// We have an EIP-155 transaction (chainId was specified and non-zero)
if ( chainId !== BN _0 ) {
fields . push ( toArray ( chainId ) ) ;
fields . push ( "0x" ) ;
fields . push ( "0x" ) ;
}
return encodeRlp ( fields ) ;
}
// We pushed a chainId and null r, s on for hashing only; remove those
let v = BigInt ( 27 + sig . yParity ) ;
if ( chainId !== BN _0 ) {
v = Signature . getChainIdV ( chainId , sig . v ) ;
}
else if ( BigInt ( sig . v ) !== v ) {
logger . throwArgumentError ( "tx.chainId/sig.v mismatch" , "sig" , sig ) ;
}
fields . push ( toArray ( v ) ) ;
fields . push ( toArray ( sig . r ) ) ;
fields . push ( toArray ( sig . s ) ) ;
return encodeRlp ( fields ) ;
}
2022-04-17 03:13:04 -04:00
function _parseEipSignature ( tx , fields , serialize ) {
let yParity ;
try {
yParity = handleNumber ( fields [ 0 ] , "yParity" ) ;
if ( yParity !== 0 && yParity !== 1 ) {
throw new Error ( "bad yParity" ) ;
}
}
catch ( error ) {
return logger . throwArgumentError ( "invalid yParity" , "yParity" , fields [ 0 ] ) ;
}
const r = zeroPadValue ( fields [ 1 ] , 32 ) ;
const s = zeroPadValue ( fields [ 2 ] , 32 ) ;
const signature = Signature . from ( { r , s , yParity } ) ;
tx . signature = signature ;
}
2022-04-11 17:14:19 -04:00
function _parseEip1559 ( data ) {
2022-04-17 03:13:04 -04:00
const fields = decodeRlp ( logger . getBytes ( data ) . slice ( 1 ) ) ;
if ( ! Array . isArray ( fields ) || ( fields . length !== 9 && fields . length !== 12 ) ) {
logger . throwArgumentError ( "invalid field count for transaction type: 2" , "data" , hexlify ( data ) ) ;
}
const maxPriorityFeePerGas = handleUint ( fields [ 2 ] , "maxPriorityFeePerGas" ) ;
const maxFeePerGas = handleUint ( fields [ 3 ] , "maxFeePerGas" ) ;
const tx = {
type : 2 ,
chainId : handleUint ( fields [ 0 ] , "chainId" ) ,
nonce : handleNumber ( fields [ 1 ] , "nonce" ) ,
maxPriorityFeePerGas : maxPriorityFeePerGas ,
maxFeePerGas : maxFeePerGas ,
gasPrice : null ,
gasLimit : handleUint ( fields [ 4 ] , "gasLimit" ) ,
to : handleAddress ( fields [ 5 ] ) ,
value : handleUint ( fields [ 6 ] , "value" ) ,
data : handleData ( fields [ 7 ] , "data" ) ,
accessList : handleAccessList ( fields [ 8 ] , "accessList" ) ,
} ;
// Unsigned EIP-1559 Transaction
if ( fields . length === 9 ) {
return tx ;
}
tx . hash = keccak256 ( data ) ;
_parseEipSignature ( tx , fields . slice ( 9 ) , _serializeEip1559 ) ;
return tx ;
2022-04-11 17:14:19 -04:00
}
function _serializeEip1559 ( tx , sig ) {
const fields = [
formatNumber ( tx . chainId || 0 , "chainId" ) ,
formatNumber ( tx . nonce || 0 , "nonce" ) ,
formatNumber ( tx . maxPriorityFeePerGas || 0 , "maxPriorityFeePerGas" ) ,
formatNumber ( tx . maxFeePerGas || 0 , "maxFeePerGas" ) ,
formatNumber ( tx . gasLimit || 0 , "gasLimit" ) ,
( ( tx . to != null ) ? getAddress ( tx . to ) : "0x" ) ,
formatNumber ( tx . value || 0 , "value" ) ,
( tx . data || "0x" ) ,
( formatAccessList ( tx . accessList || [ ] ) )
] ;
if ( sig ) {
fields . push ( formatNumber ( sig . yParity , "yParity" ) ) ;
fields . push ( toArray ( sig . r ) ) ;
fields . push ( toArray ( sig . s ) ) ;
}
return concat ( [ "0x02" , encodeRlp ( fields ) ] ) ;
}
function _parseEip2930 ( data ) {
2022-04-17 03:13:04 -04:00
const fields = decodeRlp ( logger . getBytes ( data ) . slice ( 1 ) ) ;
if ( ! Array . isArray ( fields ) || ( fields . length !== 8 && fields . length !== 11 ) ) {
logger . throwArgumentError ( "invalid field count for transaction type: 1" , "data" , hexlify ( data ) ) ;
}
const tx = {
type : 1 ,
chainId : handleUint ( fields [ 0 ] , "chainId" ) ,
nonce : handleNumber ( fields [ 1 ] , "nonce" ) ,
gasPrice : handleUint ( fields [ 2 ] , "gasPrice" ) ,
gasLimit : handleUint ( fields [ 3 ] , "gasLimit" ) ,
to : handleAddress ( fields [ 4 ] ) ,
value : handleUint ( fields [ 5 ] , "value" ) ,
data : handleData ( fields [ 6 ] , "data" ) ,
accessList : handleAccessList ( fields [ 7 ] , "accessList" )
} ;
// Unsigned EIP-2930 Transaction
if ( fields . length === 8 ) {
return tx ;
}
tx . hash = keccak256 ( data ) ;
_parseEipSignature ( tx , fields . slice ( 8 ) , _serializeEip2930 ) ;
return tx ;
2022-04-11 17:14:19 -04:00
}
function _serializeEip2930 ( tx , sig ) {
const fields = [
formatNumber ( tx . chainId || 0 , "chainId" ) ,
formatNumber ( tx . nonce || 0 , "nonce" ) ,
formatNumber ( tx . gasPrice || 0 , "gasPrice" ) ,
formatNumber ( tx . gasLimit || 0 , "gasLimit" ) ,
( ( tx . to != null ) ? getAddress ( tx . to ) : "0x" ) ,
formatNumber ( tx . value || 0 , "value" ) ,
( tx . data || "0x" ) ,
( formatAccessList ( tx . accessList || [ ] ) )
] ;
if ( sig ) {
fields . push ( formatNumber ( sig . yParity , "recoveryParam" ) ) ;
fields . push ( toArray ( sig . r ) ) ;
fields . push ( toArray ( sig . s ) ) ;
}
return concat ( [ "0x01" , encodeRlp ( fields ) ] ) ;
}
export class Transaction {
constructor ( ) {
_Transaction _props . set ( this , void 0 ) ;
_ _classPrivateFieldSet ( this , _Transaction _props , {
type : null ,
to : null ,
nonce : 0 ,
gasLimit : BigInt ( 0 ) ,
gasPrice : null ,
maxPriorityFeePerGas : null ,
maxFeePerGas : null ,
data : "0x" ,
value : BigInt ( 0 ) ,
chainId : BigInt ( 0 ) ,
sig : null ,
accessList : null
} , "f" ) ;
}
// A type of null indicates the type will be populated automatically
get type ( ) { return getStore ( _ _classPrivateFieldGet ( this , _Transaction _props , "f" ) , "type" ) ; }
get typeName ( ) {
switch ( this . type ) {
case 0 : return "legacy" ;
case 1 : return "eip-2930" ;
case 2 : return "eip-1559" ;
}
return null ;
}
set type ( value ) {
switch ( value ) {
case null :
setStore ( _ _classPrivateFieldGet ( this , _Transaction _props , "f" ) , "type" , null ) ;
break ;
case 0 :
case "legacy" :
setStore ( _ _classPrivateFieldGet ( this , _Transaction _props , "f" ) , "type" , 0 ) ;
break ;
case 1 :
case "berlin" :
case "eip-2930" :
setStore ( _ _classPrivateFieldGet ( this , _Transaction _props , "f" ) , "type" , 1 ) ;
break ;
case 2 :
case "london" :
case "eip-1559" :
setStore ( _ _classPrivateFieldGet ( this , _Transaction _props , "f" ) , "type" , 2 ) ;
break ;
default :
throw new Error ( ` unsupported transaction type ` ) ;
}
}
get to ( ) { return getStore ( _ _classPrivateFieldGet ( this , _Transaction _props , "f" ) , "to" ) ; }
set to ( value ) {
setStore ( _ _classPrivateFieldGet ( this , _Transaction _props , "f" ) , "to" , ( value == null ) ? null : getAddress ( value ) ) ;
}
get nonce ( ) { return getStore ( _ _classPrivateFieldGet ( this , _Transaction _props , "f" ) , "nonce" ) ; }
set nonce ( value ) { setStore ( _ _classPrivateFieldGet ( this , _Transaction _props , "f" ) , "nonce" , logger . getNumber ( value , "value" ) ) ; }
get gasLimit ( ) { return getStore ( _ _classPrivateFieldGet ( this , _Transaction _props , "f" ) , "gasLimit" ) ; }
set gasLimit ( value ) { setStore ( _ _classPrivateFieldGet ( this , _Transaction _props , "f" ) , "gasLimit" , logger . getBigInt ( value ) ) ; }
2022-04-17 03:13:04 -04:00
get gasPrice ( ) {
const value = getStore ( _ _classPrivateFieldGet ( this , _Transaction _props , "f" ) , "gasPrice" ) ;
if ( value == null && ( this . type === 0 || this . type === 1 ) ) {
return BN _0 ;
}
return value ;
}
2022-04-11 17:14:19 -04:00
set gasPrice ( value ) {
2022-04-17 03:13:04 -04:00
setStore ( _ _classPrivateFieldGet ( this , _Transaction _props , "f" ) , "gasPrice" , ( value == null ) ? null : logger . getBigInt ( value , "gasPrice" ) ) ;
}
get maxPriorityFeePerGas ( ) {
const value = getStore ( _ _classPrivateFieldGet ( this , _Transaction _props , "f" ) , "maxPriorityFeePerGas" ) ;
if ( value == null && this . type === 2 ) {
return BN _0 ;
}
return value ;
2022-04-11 17:14:19 -04:00
}
set maxPriorityFeePerGas ( value ) {
2022-04-17 03:13:04 -04:00
setStore ( _ _classPrivateFieldGet ( this , _Transaction _props , "f" ) , "maxPriorityFeePerGas" , ( value == null ) ? null : logger . getBigInt ( value , "maxPriorityFeePerGas" ) ) ;
}
get maxFeePerGas ( ) {
const value = getStore ( _ _classPrivateFieldGet ( this , _Transaction _props , "f" ) , "maxFeePerGas" ) ;
if ( value == null && this . type === 2 ) {
return BN _0 ;
}
return value ;
2022-04-11 17:14:19 -04:00
}
set maxFeePerGas ( value ) {
2022-04-17 03:13:04 -04:00
setStore ( _ _classPrivateFieldGet ( this , _Transaction _props , "f" ) , "maxFeePerGas" , ( value == null ) ? null : logger . getBigInt ( value , "maxFeePerGas" ) ) ;
2022-04-11 17:14:19 -04:00
}
get data ( ) { return getStore ( _ _classPrivateFieldGet ( this , _Transaction _props , "f" ) , "data" ) ; }
set data ( value ) { setStore ( _ _classPrivateFieldGet ( this , _Transaction _props , "f" ) , "data" , hexlify ( value ) ) ; }
get value ( ) { return getStore ( _ _classPrivateFieldGet ( this , _Transaction _props , "f" ) , "value" ) ; }
set value ( value ) {
2022-04-17 03:13:04 -04:00
setStore ( _ _classPrivateFieldGet ( this , _Transaction _props , "f" ) , "value" , logger . getBigInt ( value , "value" ) ) ;
2022-04-11 17:14:19 -04:00
}
get chainId ( ) { return getStore ( _ _classPrivateFieldGet ( this , _Transaction _props , "f" ) , "chainId" ) ; }
set chainId ( value ) { setStore ( _ _classPrivateFieldGet ( this , _Transaction _props , "f" ) , "chainId" , logger . getBigInt ( value ) ) ; }
get signature ( ) { return getStore ( _ _classPrivateFieldGet ( this , _Transaction _props , "f" ) , "sig" ) || null ; }
set signature ( value ) {
setStore ( _ _classPrivateFieldGet ( this , _Transaction _props , "f" ) , "sig" , ( value == null ) ? null : Signature . from ( value ) ) ;
}
2022-04-17 03:13:04 -04:00
get accessList ( ) {
const value = getStore ( _ _classPrivateFieldGet ( this , _Transaction _props , "f" ) , "accessList" ) || null ;
if ( value == null && ( this . type === 1 || this . type === 2 ) ) {
return [ ] ;
}
return value ;
}
2022-04-11 17:14:19 -04:00
set accessList ( value ) {
setStore ( _ _classPrivateFieldGet ( this , _Transaction _props , "f" ) , "accessList" , ( value == null ) ? null : accessListify ( value ) ) ;
}
get hash ( ) {
if ( this . signature == null ) {
throw new Error ( "cannot hash unsigned transaction; maybe you meant .unsignedHash" ) ;
}
return keccak256 ( this . serialized ) ;
}
get unsignedHash ( ) {
return keccak256 ( this . unsignedSerialized ) ;
}
get from ( ) {
if ( this . signature == null ) {
return null ;
}
2022-04-17 03:13:04 -04:00
return recoverAddress ( this . unsignedSerialized , this . signature ) ;
2022-04-11 17:14:19 -04:00
}
get fromPublicKey ( ) {
if ( this . signature == null ) {
return null ;
}
// use ecrecover
return "" ;
}
isSigned ( ) {
return this . signature != null ;
}
get serialized ( ) {
if ( this . signature == null ) {
throw new Error ( "cannot serialize unsigned transaction; maybe you meant .unsignedSerialized" ) ;
}
const types = this . inferTypes ( ) ;
if ( types . length !== 1 ) {
throw new Error ( "cannot determine transaction type; specify type manually" ) ;
}
switch ( types [ 0 ] ) {
case 0 :
return _serializeLegacy ( this , this . signature ) ;
case 1 :
return _serializeEip2930 ( this , this . signature ) ;
case 2 :
return _serializeEip1559 ( this , this . signature ) ;
}
throw new Error ( "unsupported type" ) ;
}
get unsignedSerialized ( ) {
const types = this . inferTypes ( ) ;
if ( types . length !== 1 ) {
throw new Error ( "cannot determine transaction type; specify type manually" ) ;
}
switch ( types [ 0 ] ) {
case 0 :
return _serializeLegacy ( this ) ;
case 1 :
return _serializeEip2930 ( this ) ;
case 2 :
return _serializeEip1559 ( this ) ;
}
throw new Error ( "unsupported type" ) ;
}
// Validates properties and lists possible types this transaction adheres to
inferTypes ( ) {
// Checks that there are no conflicting properties set
const hasGasPrice = this . gasPrice != null ;
const hasFee = ( this . maxFeePerGas != null || this . maxPriorityFeePerGas != null ) ;
const hasAccessList = ( this . accessList != null ) ;
//if (hasGasPrice && hasFee) {
// throw new Error("transaction cannot have gasPrice and maxFeePerGas");
//}
2022-04-17 03:13:04 -04:00
if ( this . maxFeePerGas != null && this . maxPriorityFeePerGas != null ) {
2022-04-11 17:14:19 -04:00
if ( this . maxFeePerGas < this . maxPriorityFeePerGas ) {
throw new Error ( "priorityFee cannot be more than maxFee" ) ;
}
}
//if (this.type === 2 && hasGasPrice) {
// throw new Error("eip-1559 transaction cannot have gasPrice");
//}
if ( ( this . type === 0 || this . type === 1 ) && hasFee ) {
throw new Error ( "transaction type cannot have maxFeePerGas or maxPriorityFeePerGas" ) ;
}
if ( this . type === 0 && hasAccessList ) {
throw new Error ( "legacy transaction cannot have accessList" ) ;
}
const types = [ ] ;
// Explicit type
if ( this . type != null ) {
types . push ( this . type ) ;
}
else {
if ( hasFee ) {
types . push ( 2 ) ;
}
else if ( hasGasPrice ) {
types . push ( 1 ) ;
if ( ! hasAccessList ) {
types . push ( 0 ) ;
}
}
else if ( hasAccessList ) {
types . push ( 1 ) ;
types . push ( 2 ) ;
}
else {
types . push ( 0 ) ;
types . push ( 1 ) ;
types . push ( 2 ) ;
}
}
types . sort ( ) ;
return types ;
}
2022-04-17 03:13:04 -04:00
isLegacy ( ) { return ( this . type === 0 ) ; }
isBerlin ( ) { return ( this . type === 1 ) ; }
isLondon ( ) { return ( this . type === 2 ) ; }
2022-04-11 17:14:19 -04:00
clone ( ) {
return Transaction . from ( this ) ;
}
freeze ( ) {
if ( _ _classPrivateFieldGet ( this , _Transaction _props , "f" ) . sig ) {
_ _classPrivateFieldGet ( this , _Transaction _props , "f" ) . sig = ( _ _classPrivateFieldGet ( this , _Transaction _props , "f" ) . sig . clone ( ) . freeze ( ) ) ;
}
if ( _ _classPrivateFieldGet ( this , _Transaction _props , "f" ) . accessList ) {
_ _classPrivateFieldGet ( this , _Transaction _props , "f" ) . accessList = Object . freeze ( _ _classPrivateFieldGet ( this , _Transaction _props , "f" ) . accessList . map ( ( set ) => {
Object . freeze ( set . storageKeys ) ;
return Object . freeze ( set ) ;
} ) ) ;
}
Object . freeze ( _ _classPrivateFieldGet ( this , _Transaction _props , "f" ) ) ;
return this ;
}
isFrozen ( ) {
return Object . isFrozen ( _ _classPrivateFieldGet ( this , _Transaction _props , "f" ) ) ;
}
static from ( tx ) {
if ( typeof ( tx ) === "string" ) {
const payload = arrayify ( tx ) ;
if ( payload [ 0 ] >= 0x7f ) { // @TODO: > vs >= ??
return Transaction . from ( _parseLegacy ( payload ) ) ;
}
switch ( payload [ 0 ] ) {
2022-04-17 03:13:04 -04:00
case 1 : return Transaction . from ( _parseEip2930 ( payload ) ) ;
case 2 : return Transaction . from ( _parseEip1559 ( payload ) ) ;
2022-04-11 17:14:19 -04:00
}
throw new Error ( "unsupported transaction type" ) ;
}
const result = new Transaction ( ) ;
if ( tx . type != null ) {
result . type = tx . type ;
}
if ( tx . to != null ) {
result . to = tx . to ;
}
if ( tx . nonce != null ) {
result . nonce = tx . nonce ;
}
if ( tx . gasLimit != null ) {
result . gasLimit = tx . gasLimit ;
}
if ( tx . gasPrice != null ) {
result . gasPrice = tx . gasPrice ;
}
if ( tx . maxPriorityFeePerGas != null ) {
result . maxPriorityFeePerGas = tx . maxPriorityFeePerGas ;
}
if ( tx . maxFeePerGas != null ) {
result . maxFeePerGas = tx . maxFeePerGas ;
}
if ( tx . data != null ) {
result . data = tx . data ;
}
if ( tx . value != null ) {
result . value = tx . value ;
}
if ( tx . chainId != null ) {
result . chainId = tx . chainId ;
}
if ( tx . signature != null ) {
result . signature = Signature . from ( tx . signature ) ;
}
if ( tx . accessList != null ) {
result . accessList = tx . accessList ;
}
2022-04-19 04:50:19 -04:00
if ( tx . hash != null ) {
2022-04-17 03:13:04 -04:00
if ( result . isSigned ( ) ) {
if ( result . hash !== tx . hash ) {
throw new Error ( "hash mismatch" ) ;
}
}
else {
throw new Error ( "unsigned transaction cannot have a hashs" ) ;
}
}
2022-04-19 04:50:19 -04:00
if ( tx . from != null ) {
2022-04-17 03:13:04 -04:00
if ( result . isSigned ( ) ) {
if ( result . from . toLowerCase ( ) !== ( tx . from || "" ) . toLowerCase ( ) ) {
throw new Error ( "from mismatch" ) ;
}
}
else {
throw new Error ( "unsigned transaction cannot have a from" ) ;
}
}
2022-04-11 17:14:19 -04:00
return result ;
}
}
_Transaction _props = new WeakMap ( ) ;
//# sourceMappingURL=transaction.js.map