-
Notifications
You must be signed in to change notification settings - Fork 5.5k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
27587eb
commit 46b6bfa
Showing
1 changed file
with
121 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,121 @@ | ||
--- | ||
eip: 2831 | ||
title: Transaction Replacement Message Type | ||
author: Gregory Markou (@GregTheGreek) | ||
discussions-to: [eth magicians](https://ethereum-magicians.org/t/eip-2831-transaction-replacement-message-type/4448) | ||
status: Draft | ||
type: Standards Track | ||
category: Interface | ||
created: 2020-07-26 | ||
requires: 1193 | ||
--- | ||
|
||
## Summary | ||
|
||
An extension to the JavaScript Ethereum Proider API ([EIP-1193](https://eips.ethereum.org/EIPS/eip-1193)) this creates a new message type in the event a transaction replacement occurs. | ||
|
||
## Abstract | ||
|
||
Exert from EIP-1193 | ||
> A common convention in the Ethereum web application ("dapp") ecosystem is for key management software ("wallets") to expose their API via a JavaScript object in the web page. | ||
This object is called "the Provider". | ||
|
||
Many ingenious developments have been made by wallet developers to improve the overall user experience while interacting with the Ethereum blockchain. One specific innovation was the tx replacement, offering users the ability to effectively cancel a previously sent transaction. | ||
|
||
Transaction replacement is not a new concept, but unfortunately causes major user experience problems for dapp developers as the replaced transaction is near impossible to track. | ||
|
||
This EIP formalizes a way for both providers and dapp developers to track transaction replacements seamlessly. | ||
|
||
This specification does not cover how one would utilize the transaction replacement message. | ||
|
||
## Specification | ||
|
||
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in [RFC-2119](https://www.ietf.org/rfc/rfc2119.txt). | ||
|
||
> Comments like this are non-normative. | ||
### Definitions | ||
|
||
_This section is non-normative._ | ||
|
||
- Provider | ||
- A JavaScript object made available to a consumer, that provides access to Ethereum by means of a Client. | ||
- Client | ||
- An endpoint that receives Remote Procedure Call (RPC) requests from the Provider, and returns their results. | ||
- Wallet | ||
- An end-user application that manages private keys, performs signing operations, and acts as a middleware between the Provider and the Client. | ||
- Remote Procedure Call (RPC) | ||
- A Remote Procedure Call (RPC), is any request submitted to a Provider for some procedure that is to be processed by a Provider, its Wallet, or its Client. | ||
- Transaction Replacement | ||
- Submitting a transaction with both: the same nonce and a 10% increase in the gas price, of a previous transaction which a user no longer wishes to send. This must occur before the original transaction is included in the blockchain. | ||
|
||
### Interface | ||
|
||
The `data` parameter contains two values: `oldTx` and `newTx`,the transaction hash that's being superseded and the transaction hash of the successor, respectively. | ||
|
||
```JavaScript | ||
interface TxReplacement extends ProviderMessage { | ||
readonly type: 'tx_replacement'; | ||
readonly data: { | ||
readonly oldTx: string; | ||
readonly newTx: string; | ||
}; | ||
} | ||
``` | ||
|
||
## Rationale | ||
|
||
The purpose of `tx_replacement` is to provide a user experience improvement to both wallet users and dapp developers. It can be implemented without breaking changes and leverages the existing framework set out by EIP-1193. | ||
|
||
## Backwards Compatibility | ||
|
||
Many Providers adopted EIP-1193, as this EIP extends the arbitrary `message` event, there should be no breaking changes. All providers that do not support the new `tx_replacement` message should either I) Ignore the message or II) Provide some error to the user (Out of scope). | ||
|
||
## Implementations | ||
|
||
At the time of writing, no projects have working implementations. | ||
|
||
## References | ||
|
||
- [Web3.js issue with metamask tx cancel](https://github.com/ethereum/web3.js/issues/3585) | ||
- [Browser doesn't know when a transaction is replace](https://github.com/MetaMask/metamask-extension/issues/3347) | ||
|
||
## Copyright | ||
|
||
Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). | ||
|
||
## Appendix I: Consumer-Facing API Documentation | ||
|
||
|
||
## Appendix II: Examples | ||
|
||
These examples assume a web browser environment. | ||
|
||
```javascript | ||
// Most Providers are available as window.ethereum on page load. | ||
// This is only a convention, not a standard, and may not be the case in practice. | ||
// Please consult the Provider implementation's documentation. | ||
const ethereum = window.ethereum; | ||
|
||
ethereum.on('message', (message) => { | ||
if (message.type === 'tx_replacement') { | ||
const { oldTx, newTx } = message.data; | ||
console.log(`Tx ${oldTx} was cancelled, the new hash is ${newTx}`) | ||
} | ||
}); | ||
|
||
const transactionParameters = { ... } // Fill in parameters | ||
|
||
ethereum | ||
.request({ | ||
method: 'eth_sendTransaction', | ||
params: [transactionParameters], | ||
}) | ||
.then((txHash) => { | ||
console.log(`Transaction hash ${txHash}`) | ||
}) | ||
.catch((error) => { | ||
console.error(`Error sending transaction: ${error.code}: ${error.message}`); | ||
}); | ||
|
||
``` |