Skip to content

Commit

Permalink
chore: use ethers 6
Browse files Browse the repository at this point in the history
  • Loading branch information
cryptodev-2s committed Jan 20, 2025
1 parent 08d7ed7 commit 6d0229b
Show file tree
Hide file tree
Showing 10 changed files with 227 additions and 475 deletions.
5 changes: 2 additions & 3 deletions lib/index.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
const { PollingBlockTracker } = require('@metamask/eth-block-tracker')
const { Web3Provider } = require('@ethersproject/providers')
const { Contract } = require('@ethersproject/contracts')
const { Contract, BrowserProvider } = require('ethers')
const Token = require('./token')
const abi = require('human-standard-token-abi')
const SafeEventEmitter = require('@metamask/safe-event-emitter').default
Expand Down Expand Up @@ -54,7 +53,7 @@ class TokenTracker extends SafeEventEmitter {
return new Contract(
tokenAddress,
abi,
new Web3Provider(this.provider),
new BrowserProvider(this.provider),
)
}

Expand Down
15 changes: 12 additions & 3 deletions lib/token.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
const BN = require('bn.js')
const { BigNumber } = require("@ethersproject/bignumber")
const util = require('./util')

/**
Expand All @@ -23,6 +22,16 @@ function _isInvalidBnInput (input, base) {
)
}

/**
* Converts a BigInt value to a BN instance.
*
* @param {BigInt} bigIntValue - The BigInt value to convert.
* @returns {BN} The BN instance representing the BigInt value.
*/
function _bigIntToBN(bigIntValue) {
return new BN(bigIntValue.toString());
}

class Token {

constructor ({
Expand Down Expand Up @@ -139,8 +148,8 @@ class Token {

if (result) {
let val = result
if (BigNumber.isBigNumber(result)) {
val = new BN(result.toString())
if (typeof result === 'bigint') {
val = _bigIntToBN(result)
}
this[key] = val
return val
Expand Down
8 changes: 4 additions & 4 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -38,13 +38,11 @@
"/lib"
],
"dependencies": {
"@ethersproject/bignumber": "^5.7.0",
"@ethersproject/contracts": "^5.7.0",
"@ethersproject/providers": "^5.7.2",
"@metamask/eth-block-tracker": "^11.0.3",
"@metamask/safe-event-emitter": "^3.0.0",
"bn.js": "^5.2.1",
"deep-equal": "^2.2.0",
"ethers": "^6.13.5",
"human-standard-token-abi": "^2.0.0"
},
"devDependencies": {
Expand Down Expand Up @@ -74,7 +72,9 @@
"ganache>secp256k1": true,
"ganache>utf-8-validate": true,
"ganache>@trufflesuite/uws-js-unofficial>bufferutil": false,
"ganache>@trufflesuite/uws-js-unofficial>utf-8-validate": false
"ganache>@trufflesuite/uws-js-unofficial>utf-8-validate": false,
"ethers>ws>bufferutil": false,
"ethers>ws>utf-8-validate": false
}
}
}
25 changes: 13 additions & 12 deletions test/helper.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,7 @@ const assert = require('assert').strict
const fs = require('fs')
const path = require('path')
const ganache = require('ganache')
const { Web3Provider } = require('@ethersproject/providers')
const { ContractFactory } = require('@ethersproject/contracts')
const { ContractFactory, BrowserProvider } = require('ethers')
const solc = require('solc')

const source = fs.readFileSync(path.resolve(__dirname, 'contracts/Token.sol')).toString();
Expand All @@ -13,29 +12,31 @@ const SimpleTokenDeployer = compiled.contracts[':SimpleToken']
const defaultQuantity = '100000000000000000000' // 100 x 10 ^ 18
async function setupSimpleTokenEnvironment ({ qty = defaultQuantity } = {}) {
const provider = ganache.provider()
const ethersProvider = new Web3Provider(provider)
const ethersProvider = new BrowserProvider(provider)

const addresses = await ethersProvider.listAccounts()
const accounts = await ethersProvider.listAccounts()
const addresses = accounts.map(account => account.address)
assert(addresses.length > 0, 'test network should be initialized with accounts')

const owner = addresses[0]
const abi = JSON.parse(SimpleTokenDeployer.interface)
const factory = new ContractFactory(abi, SimpleTokenDeployer.bytecode, ethersProvider.getSigner(owner))
const signer = await ethersProvider.getSigner(owner)
const factory = new ContractFactory(abi, SimpleTokenDeployer.bytecode, signer)

const token = await factory.deploy(qty)
const txHash = token.deployTransaction.hash
assert.ok(txHash, 'should have published the token and returned a transaction hash')
const contract = await factory.deploy(qty)
const { hash } = contract.deploymentTransaction()
assert.ok(hash, 'should have published the token and returned a transaction hash')

await token.deployed()
const receipt = await ethersProvider.getTransactionReceipt(txHash)
await contract.waitForDeployment()
const receipt = await ethersProvider.getTransactionReceipt(hash)

const tokenAddress = receipt.contractAddress
assert.ok(tokenAddress, 'should have a token address')

const balance = await token.balanceOf(owner)
const balance = await contract.balanceOf(owner)
assert.equal(balance.toString(), qty, 'owner should have all')

return { addresses, provider, token, tokenAddress }
return { addresses, provider, contract, tokenAddress }
}

module.exports = { setupSimpleTokenEnvironment }
29 changes: 17 additions & 12 deletions test/integration/human-standard-token.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,7 @@ const fs = require('fs')
const path = require('path')
const test = require('tape')
const ganache = require('ganache')
const { Web3Provider } = require('@ethersproject/providers')
const { ContractFactory } = require('@ethersproject/contracts')
const { ContractFactory, BrowserProvider } = require('ethers')
const solc = require('solc')
const TokenTracker = require('../../lib')

Expand All @@ -19,32 +18,38 @@ const EXPECTED_SYMBOL = 'EXP'
let addresses = []
let token, tokenAddress, tracked

const ethersProvider = new Web3Provider(provider)
const ethersProvider = new BrowserProvider(provider)

test('testrpc has addresses', function (t) {
ethersProvider.listAccounts()
.then((accounts) => {
addresses = accounts
addresses = accounts.map(account => account.address)
t.ok(accounts, 'loaded accounts')
t.end()
})
})

test('HumanStandardToken publishing token & checking balance', function (t) {
const abi = JSON.parse(HumanStandardDeployer.interface)
const factory = new ContractFactory(abi, HumanStandardDeployer.bytecode, ethersProvider.getSigner(addresses[0]))

factory.deploy('1000', 'DanBucks', '2', SET_SYMBOL, {
gasLimit: '3000000',
gasPrice: '875000000',
ethersProvider.getSigner(addresses[0])
.then((signer) => {
const factory = new ContractFactory(abi, HumanStandardDeployer.bytecode, signer)
return factory.deploy('1000', 'DanBucks', '2', SET_SYMBOL, {
gasLimit: '3000000',
gasPrice: '875000000',
})
})
.then((contract) => {
t.ok(contract.deployTransaction.hash, 'publishes a txHash')
return contract.deployed()
t.ok(contract.deploymentTransaction().hash, 'publishes a txHash')
return contract.waitForDeployment()
})
.then((deployedContract) => {
token = deployedContract
tokenAddress = token.address
return deployedContract.getAddress()
})
.then((address) => {
t.ok(address, 'should have an address')
tokenAddress = address
return token.balanceOf(addresses[0])
})
.then((balance) => {
Expand Down
18 changes: 9 additions & 9 deletions test/integration/simple-token.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,14 @@ const less = '10000000000000000000' // 100 x 10 ^ 17

test('StandardToken balances are tracked', function (t) {
let addresses
let token
let contract
let tokenAddress
let tokenTracker
let provider
setupSimpleTokenEnvironment()
.then((environment) => {
addresses = environment.addresses
token = environment.token
contract = environment.contract
tokenAddress = environment.tokenAddress
provider = environment.provider
tokenTracker = new TokenTracker({
Expand All @@ -40,7 +40,7 @@ test('StandardToken balances are tracked', function (t) {
.then(() => {
tracked = tokenTracker.serialize()[0]
t.equal(tracked.balance.toString(10), qty, 'initial balance loaded')
return token.transfer(addresses[1], less)
return contract.transfer(addresses[1], less)
})
.then((tx) => {
return provider.request({
Expand Down Expand Up @@ -79,11 +79,11 @@ test('StandardToken balances are tracked', function (t) {

test('StandardToken balance changes are emitted and symbol fetched', function (t) {
let addresses
let token
let contract
setupSimpleTokenEnvironment()
.then((environment) => {
addresses = environment.addresses
token = environment.token
contract = environment.contract
const { provider, tokenAddress } = environment
var tokenTracker = new TokenTracker({
userAddress: addresses[0],
Expand Down Expand Up @@ -114,7 +114,7 @@ test('StandardToken balance changes are emitted and symbol fetched', function (t
return new Promise((res, rej) => { setTimeout(res, 200) })
})
.then(() => {
return token.transfer(addresses[1], '100')
return contract.transfer(addresses[1], '100')
})
.catch((reason) => {
t.notOk(reason, 'should not throw an error')
Expand All @@ -125,12 +125,12 @@ test('StandardToken balance changes are emitted and symbol fetched', function (t

test('StandardToken non balance changes are not emitted', function (t) {
let addresses
let token
let contract
let tokenTracker
setupSimpleTokenEnvironment()
.then((environment) => {
addresses = environment.addresses
token = environment.token
contract = environment.contract
const { provider, tokenAddress } = environment
tokenTracker = new TokenTracker({
userAddress: addresses[0],
Expand Down Expand Up @@ -158,7 +158,7 @@ test('StandardToken non balance changes are not emitted', function (t) {
return new Promise((res, rej) => { setTimeout(res, 200) })
})
.then(() => {
return token.transfer(addresses[1], '0')
return contract.transfer(addresses[1], '0')
})
.then(() => {
var a = new Promise((res, rej) => { setTimeout(res, 200) })
Expand Down
37 changes: 21 additions & 16 deletions test/integration/token-precision.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,10 @@ const solc = require('solc')
const TokenTracker = require('../../lib')
const BN = require('bn.js')
const util = require('../../lib/util')
const { ContractFactory } = require('@ethersproject/contracts')
const { Web3Provider } = require('@ethersproject/providers')
const { ContractFactory, BrowserProvider } = require('ethers')

const provider = ganache.provider()
const ethersProvider = new Web3Provider(provider)
const ethersProvider = new BrowserProvider(provider)
let count = 0

const source = fs.readFileSync(path.resolve(__dirname, '..', 'contracts/ZeppelinToken.sol')).toString();
Expand All @@ -19,12 +18,12 @@ const compiled = solc.compile(source, 1)
const SimpleTokenDeployer = compiled.contracts[':TutorialToken']

let addresses = []
let tokenAddress, tracked
let token, tokenAddress, tracked

test('testrpc has addresses', function (t) {
ethersProvider.listAccounts()
.then((accounts) => {
addresses = accounts
addresses = accounts.map(account => account.address)
t.ok(accounts, 'loaded accounts')
t.end()
})
Expand Down Expand Up @@ -98,20 +97,26 @@ function generateTestWithParams(opts = {}) {
test(`Generated token precision test ${++count}`, function (t) {
const abi = JSON.parse(SimpleTokenDeployer.interface)
const owner = addresses[0]
const factory = new ContractFactory(abi, SimpleTokenDeployer.bytecode, ethersProvider.getSigner(owner))
ethersProvider.getSigner(owner).then((signer) => {
const factory = new ContractFactory(abi, SimpleTokenDeployer.bytecode, signer)

factory.deploy(qty, precision, {
gasLimit: 3000000,
gasPrice: 875000000
return factory.deploy(qty, precision, {
gasLimit: 3000000,
gasPrice: 875000000
})
})
.then((contract) => {
t.ok(contract.deploymentTransaction().hash, 'publishes a txHash')
return contract.waitForDeployment()
})
.then((token) => {
t.ok(token.deployTransaction.hash, 'publishes a txHash')
return token.deployed()
.then((deployedContract) => {
token = deployedContract
return deployedContract.getAddress()
})
.then((deployedToken) => {
t.ok(deployedToken.address, 'should have an address')
tokenAddress = deployedToken.address
return deployedToken.balanceOf(owner)
.then((address) => {
t.ok(address, 'should have an address')
tokenAddress = address
return token.balanceOf(owner)
})
.then((balance) => {
t.equal(balance.toString(), qty, 'owner should have all')
Expand Down
Loading

0 comments on commit 6d0229b

Please sign in to comment.