Skip to content

A minimal wrapper to make Ethers.js compatible with the Celo network

License

Notifications You must be signed in to change notification settings

ecobioca/celo-ethers-wrapper

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

21 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

celo-ethers-wrapper

A minimal wrapper to make Ethers.JS compatible with the Celo network.

Install

npm i @celo-tools/celo-ethers-wrapper

or

yarn add @celo-tools/celo-ethers-wrapper

Note this wrapper has Ethers v5 as a peer dependency. Your project must include a dependency on that as well.

Basic Usage

Connect to the network by creating a CeloProvider, which is based on JsonRpc-Provider:

import { CeloProvider } from '@celo-tools/celo-ethers-wrapper'

// Connecting to Alfajores testnet
const provider = new CeloProvider('https://alfajores-forno.celo-testnet.org')
await provider.ready

Note: for a more efficient provider based on StaticJsonRpcProvider you can use StaticCeloProvider instead.

Next, Create a CeloWallet, which is based on Wallet :

import { CeloWallet } from '@celo-tools/celo-ethers-wrapper'

const wallet = new CeloWallet(YOUR_PK, provider)

Use the provider or wallet to make calls or send transactions:

const txResponse = await wallet.sendTransaction({
    to: recipient,
    value: amountInWei,
  })
const txReceipt = await txResponse.wait()
console.info(`CELO transaction hash received: ${txReceipt.transactionHash}`)

Contract Interaction

CeloWallet can be used to send transactions.

Here's an example of sending cUSD with the StableToken contract. For interacting with contracts you need the ABI and address. Addresses for Celo core contracts can be found with the CLI's network:contracts command. The ABIs can be built from the solidity code or extracted in ContractKit's generated folder.

import { Contract, ethers, utils, providers } from 'ethers'

const stableToken = new ethers.Contract(address, abi, wallet)
console.info(`Sending ${amountInWei} cUSD`)
const txResponse: providers.TransactionResponse = await stableToken.transferWithComment(recipient, amountInWei, comment)
const txReceipt = await txResponse.wait()
console.info(`cUSD payment hash received: ${txReceipt.transactionHash}`)

Alternative gas fee currencies

The Celo network supports paying for transactions with the native asset (CELO) but also with the stable token (cUSD).

This wrapper currently has partial support for specifying feeCurrency in transactions.

const gasPrice = await wallet.getGasPrice(stableTokenAddress)
const gasLimit = await wallet.estimateGas(tx)

// Gas estimation doesn't currently work properly for non-CELO currencies
// The gas limit must be padded to increase tx success rate
// TODO: Investigate more efficient ways to handle this case
const adjustedGasLimit = gasLimit.mul(10)

const txResponse = await signer.sendTransaction({
  ...tx,
  gasPrice,
  gasLimit: adjustedGasLimit,
  feeCurrency: stableTokenAddress,
})

Examples

See the tests under /test for more detailed examples.

About

A minimal wrapper to make Ethers.js compatible with the Celo network

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • TypeScript 100.0%