docs: added AccessLists details (#1364).

This commit is contained in:
Richard Moore 2021-04-17 22:09:50 -04:00
parent ae0d5eb7c2
commit 25c3024a89
No known key found for this signature in database
GPG Key ID: 665176BE8E9DC651
4 changed files with 146 additions and 7 deletions

@ -8,15 +8,15 @@ to be run with the input of the transaction data.
_subsection: Creating Instances @<Contract--creating> _subsection: Creating Instances @<Contract--creating>
_property: new ethers.Contract(address, abi, signerOrProvider) @src<contracts:constructor.Contract> _property: new ethers.Contract(address, abi, signerOrProvider) @src<contracts:class.Contract>
_property: contract.attach(addressOrName) => [[Contract]] @<Contract-attach> @SRC<contracts:Contract.attach> _property: contract.attach(addressOrName) => [[Contract]] @<Contract-attach> @SRC<contracts:BaseContract.attach>
Returns a new instance of the **Contract** attached to a new Returns a new instance of the **Contract** attached to a new
address. This is useful if there are multiple similar or identical address. This is useful if there are multiple similar or identical
copies of a Contract on the network and you wish to interact with copies of a Contract on the network and you wish to interact with
each of them. each of them.
_property: contract.connect(providerOrSigner) => [[Contract]] @<Contract-connect> @SRC<contracts:Contract.connect> _property: contract.connect(providerOrSigner) => [[Contract]] @<Contract-connect> @SRC<contracts:BaseContract.connect>
Returns a new instance of the Contract, but connected to Returns a new instance of the Contract, but connected to
//providerOrSigner//. //providerOrSigner//.
@ -65,11 +65,11 @@ _subsection: Events @<Contract--events>
_property: contract.queryFilter(event [ , fromBlockOrBlockHash [ , toBlock ]) => Promise<Array<Event>> @<Contract-queryFilter> @SRC<contracts> _property: contract.queryFilter(event [ , fromBlockOrBlockHash [ , toBlock ]) => Promise<Array<Event>> @<Contract-queryFilter> @SRC<contracts>
Return Events that match the //event//. Return Events that match the //event//.
_property: contract.listenerCount([ event ]) => number @<Contract-listenerCount> @SRC<contracts:Contract.listenerCount> _property: contract.listenerCount([ event ]) => number @<Contract-listenerCount> @SRC<contracts:BaseContract.listenerCount>
Return the number of listeners that are subscribed to //event//. If Return the number of listeners that are subscribed to //event//. If
no event is provided, returns the total count of all events. no event is provided, returns the total count of all events.
_property: contract.listeners(event) => Array<Listener> @<Contract-listeners> @SRC<contracts:Contract.listeners> _property: contract.listeners(event) => Array<Listener> @<Contract-listeners> @SRC<contracts:BaseContract.listeners>
Return a list of listeners that are subscribed to //event//. Return a list of listeners that are subscribed to //event//.
_property: contract.off(event, listener) => this @<Contract-off> @SRC<contracts> _property: contract.off(event, listener) => this @<Contract-off> @SRC<contracts>
@ -82,7 +82,7 @@ _property: contract.once(event, listener) => this @<Contract-once> @SRC<contrac
Subscribe once to //event// calling //listener// when the event Subscribe once to //event// calling //listener// when the event
occurs. occurs.
_property: contract.removeAllListeners([ event ]) => this @<Contract-removeAllListeners> @SRC<contracts:Contract.removeAllListeners> _property: contract.removeAllListeners([ event ]) => this @<Contract-removeAllListeners> @SRC<contracts:BaseContract.removeAllListeners>
Unsubscribe all listeners for //event//. If no event is provided, Unsubscribe all listeners for //event//. If no event is provided,
all events are unsubscribed. all events are unsubscribed.

@ -202,7 +202,18 @@ The chain ID this transaction is authorized on, as specified by
If the chain ID is 0 will disable EIP-155 and the transaction will be valid If the chain ID is 0 will disable EIP-155 and the transaction will be valid
on any network. This can be **dangerous** and care should be taken, since it on any network. This can be **dangerous** and care should be taken, since it
allows transactions to be replayed on networks that were possibly not allows transactions to be replayed on networks that were possibly not
intended. intended. Intentionally-replayable transactions are also disabled by default
on recent versions of Geth and require configuration to enable.
_property: transactionRequest.type => null | number
The [[link-eip-2718]] type of this transaction envelope, or ``null``
for legacy transactions that do not have an envelope.
_property: transactionRequest.accessList => [[providers-AccessListish]]
The [[providers-AccessList]] to include in an [[link-eip-2930]] transaction, which will
include a ``type`` of ``1``.
_heading: TransactionResponse @<providers-TransactionResponse> @INHERIT<[[Transaction]]> _heading: TransactionResponse @<providers-TransactionResponse> @INHERIT<[[Transaction]]>
@ -241,6 +252,16 @@ the following properties:
- ``error.transactionHash`` - the hash of the transaction - ``error.transactionHash`` - the hash of the transaction
- ``error.receipt`` - the actual receipt, with the status of ``0`` - ``error.receipt`` - the actual receipt, with the status of ``0``
_property: transactionRequest.type => null | number
The [[link-eip-2718]] type of this transaction envelope, or ``null``
for legacy transactions that do not have an envelope.
_property: transactionRequest.accessList => [[providers-AccessList]]
The [[providers-AccessList]] included in an [[link-eip-2930]] transaction, which will
also have its ``type`` equal to ``1``.
_heading: TransactionReceipt @<providers-TransactionReceipt> _heading: TransactionReceipt @<providers-TransactionReceipt>
_property: receipt.to => string<[[address]]> _property: receipt.to => string<[[address]]>
@ -314,3 +335,110 @@ _property: receipt.status => boolean
The status of a transaction is 1 is successful or 0 if it was The status of a transaction is 1 is successful or 0 if it was
reverted. Only transactions included in blocks [post-Byzantium Hard Fork](link-eip-609) reverted. Only transactions included in blocks [post-Byzantium Hard Fork](link-eip-609)
have this property. have this property.
_subsection: Access Lists
An Access List is optional an includes a list of addresses and storage
slots for that address which should be //warmed// or pre-fetched for
use within the execution of this transaction. A //warmed// value has an
additional upfront cost to access, but is discounted throughout the code
execution for reading and writing.
_heading: AccessListish @<providers-AccessListish>
A looser description of an [[providers-AccessList]], which will be
converted internally using [accessListify](utils-accessListify).
It may be any of:
- any [[providers-AccessList]]
- an Array of 2-element Arrays, where the first element is the address
and second array is an array of storage keys
- an object, whose keys represent the addresses and each value is an
array of storage keys
When using the object form (the last option), the addresses and storage
slots will be sorted. If an explicit order for the access list is
required, one of the other forms must be used. Most developers
**do not** require explicit order.
_code: equivalent to the AccessList example below @lang<javascript>
// Option 1:
// AccessList
// see below
// Option 2:
// Array< [ Address, Array<Bytes32> ] >
[
[
"0x0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e",
[
"0x0000000000000000000000000000000000000000000000000000000000000004",
"0x0bcad17ecf260d6506c6b97768bdc2acfb6694445d27ffd3f9c1cfbee4a9bd6d"
]
],
[
"0x5FfC014343cd971B7eb70732021E26C35B744cc4",
[
"0x0000000000000000000000000000000000000000000000000000000000000001"
]
]
]
// <hide>
;
// </hide>
// Option 3:
// Record<Address, Array<Bytes32>>
// <hide>
(
// </hide>
{
"0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e": [
"0x0000000000000000000000000000000000000000000000000000000000000004",
"0x0bcad17ecf260d6506c6b97768bdc2acfb6694445d27ffd3f9c1cfbee4a9bd6d"
],
"0x5FfC014343cd971B7eb70732021E26C35B744cc4": [
"0x0000000000000000000000000000000000000000000000000000000000000001"
]
}
// <hide>
)
// </hide>
_heading: AccessList @<providers-AccessList>
An [[link-eip-2930]] transaction allows an optional **AccessList**
which causes a transaction to //warm// (i.e. pre-cache) another
addresses state and the specified storage keys.
This incurs an increased intrinsic cost for the transaction, but provides
discounts for storage and state access throughout the execution of the
transaction.
_code: example access list
// Array of objects with the form:
// {
// address: Address,
// storageKey: Array< DataHexString< 32 > >
// }
[
{
address: "0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e",
storageKeys: [
"0x0000000000000000000000000000000000000000000000000000000000000004",
"0x0bcad17ecf260d6506c6b97768bdc2acfb6694445d27ffd3f9c1cfbee4a9bd6d"
]
},
{
address: "0x5FfC014343cd971B7eb70732021E26C35B744cc4",
storageKeys: [
"0x0000000000000000000000000000000000000000000000000000000000000001"
]
}
]

@ -97,6 +97,15 @@ used to encode the chain ID into the serialized transaction.
_subsection: Functions @<transactions--functions> _subsection: Functions @<transactions--functions>
_property: ethers.utils.accessListify(anAcceslistish) => [[providers-AccessList]] @<utils-accessListify> @SRC<transactions:accessListify>
Normalizes the [[providers-AccessListish]] //anAccessListish// into
an [[providers-AccessList]].
This is useful for other utility functions which wish to remain
flexible as to the input parameter for access lists, such as
when creating a [[Signer]] which needs to manipulate a possibly
typed transaction envelope.
_property: ethers.utils.parseTransaction(aBytesLike) => [[Transaction]] @<utils-parseTransaction> @SRC<transactions:parse> _property: ethers.utils.parseTransaction(aBytesLike) => [[Transaction]] @<utils-parseTransaction> @SRC<transactions:parse>
Parses the transaction properties from a serialized transaction. Parses the transaction properties from a serialized transaction.

@ -260,6 +260,8 @@ module.exports = {
"link-eip-1577": { name: "EIP-1577", url: "https:/\/eips.ethereum.org/EIPS/eip-1577" }, "link-eip-1577": { name: "EIP-1577", url: "https:/\/eips.ethereum.org/EIPS/eip-1577" },
"link-eip-2098": { name: "EIP-2098", url: "https:/\/eips.ethereum.org/EIPS/eip-2098" }, "link-eip-2098": { name: "EIP-2098", url: "https:/\/eips.ethereum.org/EIPS/eip-2098" },
"link-eip-2304": { name: "EIP-2304", url: "https:/\/eips.ethereum.org/EIPS/eip-2304" }, "link-eip-2304": { name: "EIP-2304", url: "https:/\/eips.ethereum.org/EIPS/eip-2304" },
"link-eip-2718": { name: "EIP-2718", url: "https:/\/eips.ethereum.org/EIPS/eip-2718" },
"link-eip-2930": { name: "EIP-2930", url: "https:/\/eips.ethereum.org/EIPS/eip-2930" },
"link-bip-39": { name: "BIP-39", url: "https:/\/en.bitcoin.it/wiki/BIP_0039" }, "link-bip-39": { name: "BIP-39", url: "https:/\/en.bitcoin.it/wiki/BIP_0039" },
"link-bip-32": { name: "BIP-32", url: "https:/\/github.com/bitcoin/bips/blob/master/bip-0032.mediawiki" }, "link-bip-32": { name: "BIP-32", url: "https:/\/github.com/bitcoin/bips/blob/master/bip-0032.mediawiki" },
"link-bip-44": { name: "BIP-44", url: "https:/\/en.bitcoin.it/wiki/BIP_0044" }, "link-bip-44": { name: "BIP-44", url: "https:/\/en.bitcoin.it/wiki/BIP_0044" },