viem
Version:
110 lines (103 loc) • 3.37 kB
text/typescript
import {
InvalidAddressError,
type InvalidAddressErrorType,
} from '../../errors/address.js'
import { BaseError, type BaseErrorType } from '../../errors/base.js'
import {
InvalidChainIdError,
type InvalidChainIdErrorType,
} from '../../errors/chain.js'
import {
FeeCapTooHighError,
type FeeCapTooHighErrorType,
TipAboveFeeCapError,
type TipAboveFeeCapErrorType,
} from '../../errors/node.js'
import type { ErrorType } from '../../errors/utils.js'
import type {
TransactionSerializableEIP1559,
TransactionSerializableEIP2930,
TransactionSerializableLegacy,
} from '../../types/transaction.js'
import { type IsAddressErrorType, isAddress } from '../address/isAddress.js'
export type AssertTransactionEIP1559ErrorType =
| BaseErrorType
| IsAddressErrorType
| InvalidAddressErrorType
| InvalidChainIdErrorType
| FeeCapTooHighErrorType
| TipAboveFeeCapErrorType
| ErrorType
export function assertTransactionEIP1559(
transaction: TransactionSerializableEIP1559,
) {
const { chainId, maxPriorityFeePerGas, gasPrice, maxFeePerGas, to } =
transaction
if (chainId <= 0) throw new InvalidChainIdError({ chainId })
if (to && !isAddress(to)) throw new InvalidAddressError({ address: to })
if (gasPrice)
throw new BaseError(
'`gasPrice` is not a valid EIP-1559 Transaction attribute.',
)
if (maxFeePerGas && maxFeePerGas > 2n ** 256n - 1n)
throw new FeeCapTooHighError({ maxFeePerGas })
if (
maxPriorityFeePerGas &&
maxFeePerGas &&
maxPriorityFeePerGas > maxFeePerGas
)
throw new TipAboveFeeCapError({ maxFeePerGas, maxPriorityFeePerGas })
}
export type AssertTransactionEIP2930ErrorType =
| BaseErrorType
| IsAddressErrorType
| InvalidAddressErrorType
| InvalidChainIdErrorType
| FeeCapTooHighErrorType
| ErrorType
export function assertTransactionEIP2930(
transaction: TransactionSerializableEIP2930,
) {
const { chainId, maxPriorityFeePerGas, gasPrice, maxFeePerGas, to } =
transaction
if (chainId <= 0) throw new InvalidChainIdError({ chainId })
if (to && !isAddress(to)) throw new InvalidAddressError({ address: to })
if (maxPriorityFeePerGas || maxFeePerGas)
throw new BaseError(
'`maxFeePerGas`/`maxPriorityFeePerGas` is not a valid EIP-2930 Transaction attribute.',
)
if (gasPrice && gasPrice > 2n ** 256n - 1n)
throw new FeeCapTooHighError({ maxFeePerGas: gasPrice })
}
export type AssertTransactionLegacyErrorType =
| BaseErrorType
| IsAddressErrorType
| InvalidAddressErrorType
| InvalidChainIdErrorType
| FeeCapTooHighErrorType
| ErrorType
export function assertTransactionLegacy(
transaction: TransactionSerializableLegacy,
) {
const {
chainId,
maxPriorityFeePerGas,
gasPrice,
maxFeePerGas,
to,
accessList,
} = transaction
if (to && !isAddress(to)) throw new InvalidAddressError({ address: to })
if (typeof chainId !== 'undefined' && chainId <= 0)
throw new InvalidChainIdError({ chainId })
if (maxPriorityFeePerGas || maxFeePerGas)
throw new BaseError(
'`maxFeePerGas`/`maxPriorityFeePerGas` is not a valid Legacy Transaction attribute.',
)
if (gasPrice && gasPrice > 2n ** 256n - 1n)
throw new FeeCapTooHighError({ maxFeePerGas: gasPrice })
if (accessList)
throw new BaseError(
'`accessList` is not a valid Legacy Transaction attribute.',
)
}