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.

148 lines
5.6 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

import type * as AccessList from './AccessList.js'
import type * as Address from './Address.js'
import * as Authorization from './Authorization.js'
import type * as Errors from './Errors.js'
import * as Hex from './Hex.js'
import type { Compute } from './internal/types.js'
/** A Transaction Request that is generic to all transaction types, as defined in the [Execution API specification](https://github.com/ethereum/execution-apis/blob/4aca1d7a3e5aab24c8f6437131289ad386944eaa/src/schemas/transaction.yaml#L358-L423). */
export type TransactionRequest<
bigintType = bigint,
numberType = number,
type extends string = string,
> = Compute<{
/** EIP-2930 Access List. */
accessList?: AccessList.AccessList | undefined
/** EIP-7702 Authorization List. */
authorizationList?:
| Authorization.ListSigned<bigintType, numberType>
| undefined
/** Versioned hashes of blobs to be included in the transaction. */
blobVersionedHashes?: readonly Hex.Hex[]
/** Raw blob data. */
blobs?: readonly Hex.Hex[] | undefined
/** EIP-155 Chain ID. */
chainId?: numberType | undefined
/** Contract code or a hashed method call with encoded args */
data?: Hex.Hex | undefined
/** @alias `data` added for TransactionEnvelope - Transaction compatibility. */
input?: Hex.Hex | undefined
/** Sender of the transaction. */
from?: Address.Address | undefined
/** Gas provided for transaction execution */
gas?: bigintType | undefined
/** Base fee per gas. */
gasPrice?: bigintType | undefined
/** Maximum total fee per gas sender is willing to pay for blob gas (in wei). */
maxFeePerBlobGas?: bigintType | undefined
/** Total fee per gas in wei (gasPrice/baseFeePerGas + maxPriorityFeePerGas). */
maxFeePerGas?: bigintType | undefined
/** Max priority fee per gas (in wei). */
maxPriorityFeePerGas?: bigintType | undefined
/** Unique number identifying this transaction */
nonce?: bigintType | undefined
/** Transaction recipient */
to?: Address.Address | null | undefined
/** Transaction type */
type?: type | undefined
/** Value in wei sent with this transaction */
value?: bigintType | undefined
}>
/** RPC representation of a {@link ox#TransactionRequest.TransactionRequest}. */
export type Rpc = TransactionRequest<Hex.Hex, Hex.Hex, string>
/**
* Converts a {@link ox#TransactionRequest.TransactionRequest} to a {@link ox#TransactionRequest.Rpc}.
*
* @example
* ```ts twoslash
* import { TransactionRequest, Value } from 'ox'
*
* const request = TransactionRequest.toRpc({
* to: '0x0000000000000000000000000000000000000000',
* value: Value.fromEther('0.01'),
* })
* ```
*
* @example
* ### Using with a Provider
*
* You can use {@link ox#Provider.(from:function)} to instantiate an EIP-1193 Provider and
* send a transaction to the Wallet using the `eth_sendTransaction` method.
*
* ```ts twoslash
* import 'ox/window'
* import { Provider, TransactionRequest, Value } from 'ox'
*
* const provider = Provider.from(window.ethereum!)
*
* const request = TransactionRequest.toRpc({
* to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',
* value: Value.fromEther('0.01'),
* })
*
* const hash = await provider.request({ // [!code focus]
* method: 'eth_sendTransaction', // [!code focus]
* params: [request], // [!code focus]
* }) // [!code focus]
* ```
*
* @param request - The request to convert.
* @returns An RPC request.
*/
export function toRpc(request: TransactionRequest): Rpc {
const request_rpc: Rpc = {}
if (typeof request.accessList !== 'undefined')
request_rpc.accessList = request.accessList
if (typeof request.authorizationList !== 'undefined')
request_rpc.authorizationList = Authorization.toRpcList(
request.authorizationList,
)
if (typeof request.blobVersionedHashes !== 'undefined')
request_rpc.blobVersionedHashes = request.blobVersionedHashes
if (typeof request.blobs !== 'undefined') request_rpc.blobs = request.blobs
if (typeof request.chainId !== 'undefined')
request_rpc.chainId = Hex.fromNumber(request.chainId)
if (typeof request.data !== 'undefined') {
request_rpc.data = request.data
request_rpc.input = request.data
} else if (typeof request.input !== 'undefined') {
request_rpc.data = request.input
request_rpc.input = request.input
}
if (typeof request.from !== 'undefined') request_rpc.from = request.from
if (typeof request.gas !== 'undefined')
request_rpc.gas = Hex.fromNumber(request.gas)
if (typeof request.gasPrice !== 'undefined')
request_rpc.gasPrice = Hex.fromNumber(request.gasPrice)
if (typeof request.maxFeePerBlobGas !== 'undefined')
request_rpc.maxFeePerBlobGas = Hex.fromNumber(request.maxFeePerBlobGas)
if (typeof request.maxFeePerGas !== 'undefined')
request_rpc.maxFeePerGas = Hex.fromNumber(request.maxFeePerGas)
if (typeof request.maxPriorityFeePerGas !== 'undefined')
request_rpc.maxPriorityFeePerGas = Hex.fromNumber(
request.maxPriorityFeePerGas,
)
if (typeof request.maxPriorityFeePerGas !== 'undefined')
request_rpc.maxPriorityFeePerGas = Hex.fromNumber(
request.maxPriorityFeePerGas,
)
if (typeof request.nonce !== 'undefined')
request_rpc.nonce = Hex.fromNumber(request.nonce)
if (typeof request.to !== 'undefined') request_rpc.to = request.to
if (typeof request.type !== 'undefined') request_rpc.type = request.type
if (typeof request.value !== 'undefined')
request_rpc.value = Hex.fromNumber(request.value)
return request_rpc
}
export declare namespace toRpc {
export type ErrorType =
| Authorization.toRpcList.ErrorType
| Hex.fromNumber.ErrorType
| Errors.GlobalErrorType
}