This migration guide focuses on migrating web3.js version 1.2.9 to ethers.js v5.
In ethers, a provider provides an abstraction for a connection to the Ethereum Network. It can be used to issue read only queries and send signed state changing transactions to the Ethereum Network.
var Web3 = require('web3');
var web3 = new Web3('http://localhost:8545');
var ethers = require('ethers');
const url = "http://127.0.0.1:8545";
const provider = new ethers.providers.JsonRpcProvider(url);
Connecting to Ethereum: Metamask
const web3 = new Web3(Web3.givenProvider);
const provider = new ethers.providers.Web3Provider(window.ethereum);
In ethers, a signer is an abstraction of an Ethereum Account. It can be used to sign messages and transactions and send signed transactions to the Ethereum Network.
In web3, an account can be used to sign messages and transactions.
const account = web3.eth.accounts.create();
const signer = ethers.Wallet.createRandom();
const signer = provider.getSigner();
signature = web3.eth.accounts.sign('Some data', privateKey)
signature = await signer.signMessage('Some data')
A contract object is an abstraction of a smart contract on the Ethereum Network. It allows for easy interaction with the smart contract.
const contract = new web3.eth.Contract(abi);
contract.deploy({
data: bytecode,
arguments: ["my string"]
})
.send({
from: "0x12598d2Fd88B420ED571beFDA8dD112624B5E730",
gas: 150000,
gasPrice: "30000000000000"
}), function(error, transactionHash){ ... })
.then(function(newContract){
console.log('new contract', newContract.options.address)
});
const signer = provider.getSigner();
const factory = new ethers.ContractFactory(abi, bytecode, signer);
const contract = await factory.deploy("hello world");
console.log('contract address', contract.address);
await contract.deployTransaction.wait();
Interacting with a Contract
const contract = new web3.eth.Contract(abi, contractAddress);
contract.methods.getValue().call();
contract.methods.changeValue(42).send({from: ....})
.on('receipt', function(){
...
});
const contract = new ethers.Contract(contractAddress, abi, provider);
const value = await contract.getValue();
const contract = new ethers.Contract(contractAddress, abi, signer);
const tx = await contract.changeValue(33);
const receipt = await tx.wait();
Overloaded functions are functions that have the same name but different parameter types.
In ethers, the syntax to call an overloaded contract function is different from the non-overloaded function. This section shows the differences between web3 and ethers when calling overloaded functions.
See issue #407 for more details.
message = await contract.methods.getMessage('nice').call();
const abi = [
"function getMessage(string) public view returns (string)",
"function getMessage() public view returns (string)"
]
const contract = new ethers.Contract(address, abi, signer);
message = await contract['getMessage(string)']('nice');
Convert to BigNumber:
web3.utils.toBN('123456');
ethers.BigNumber.from(123456)
ethers.BigNumber.from("123456")
ethers.BigNumber.from("0x1e240")
Computing Keccak256 hash of a UTF-8 string in web3 and ethers:
web3.utils.sha3('hello world');
web3.utils.keccak256('hello world');
ethers.utils.id('hello world')
ethers.utils.keccak256('0x4242')