Commit 79f812d2 authored by smartcontracts's avatar smartcontracts Committed by GitHub

feat[smock]: Add support for hardhat 2.2.0 (#576)

* feat[smock]: Add support for hardhat 2.2.0

* refactor[smock]: Clean up some repeated code

* fix[smock]: Dynamically resolve TransactionExecutionError

* fix[smock]: Fix linting error

* fix[smock]: Use older ethers version

* fix[smock]: Minor hack for backwards compat

* chore[smock]: Add changeset
parent 5fbb1bf3
---
"@eth-optimism/smock": minor
---
Adds support for hardhat ^2.2.0, required because of move to ethereumjs-vm v5.
...@@ -28,15 +28,15 @@ ...@@ -28,15 +28,15 @@
"bn.js": "^5.2.0" "bn.js": "^5.2.0"
}, },
"devDependencies": { "devDependencies": {
"@nomiclabs/ethereumjs-vm": "4.2.2", "@nomiclabs/ethereumjs-vm": "^4.2.2",
"@nomiclabs/hardhat-ethers": "^2.0.2", "@nomiclabs/hardhat-ethers": "^2.0.2",
"@nomiclabs/hardhat-waffle": "^2.0.1", "@nomiclabs/hardhat-waffle": "^2.0.1",
"@types/lodash": "^4.14.161", "@types/lodash": "^4.14.161",
"chai": "^4.3.0", "chai": "^4.3.0",
"ethereum-waffle": "^3.3.0", "ethereum-waffle": "^3.3.0",
"ethers": "^5.0.32", "ethers": "^5.0.31",
"glob": "^7.1.6", "glob": "^7.1.6",
"hardhat": "^2.1.1", "hardhat": "^2.2.1",
"lodash": "^4.17.20", "lodash": "^4.17.20",
"prettier": "^2.2.1" "prettier": "^2.2.1"
} }
......
/* Imports: External */ /* Imports: External */
import { HardhatRuntimeEnvironment } from 'hardhat/types' import { HardhatRuntimeEnvironment } from 'hardhat/types'
import { HardhatNetworkProvider } from 'hardhat/internal/hardhat-network/provider/provider' import { HardhatNetworkProvider } from 'hardhat/internal/hardhat-network/provider/provider'
import { fromHexString, toHexString } from '@eth-optimism/core-utils'
/** /**
* Finds the "base" Ethereum provider of the current hardhat environment. * Finds the "base" Ethereum provider of the current hardhat environment.
...@@ -44,3 +45,35 @@ export const findBaseHardhatProvider = ( ...@@ -44,3 +45,35 @@ export const findBaseHardhatProvider = (
// https://github.com/nomiclabs/hardhat/blob/master/packages/hardhat-core/src/internal/hardhat-network/provider/provider.ts // https://github.com/nomiclabs/hardhat/blob/master/packages/hardhat-core/src/internal/hardhat-network/provider/provider.ts
return provider as any return provider as any
} }
/**
* Converts a string into the fancy new address thing that ethereumjs-vm v5 expects while also
* maintaining backwards compatibility with ethereumjs-vm v4.
* @param address String address to convert into the fancy new address type.
* @returns Fancified address.
*/
export const toFancyAddress = (address: string): any => {
const fancyAddress = fromHexString(address)
;(fancyAddress as any).buf = fromHexString(address)
;(fancyAddress as any).toString = (encoding?: any) => {
if (encoding === undefined) {
return address.toLowerCase()
} else {
return fromHexString(address).toString(encoding)
}
}
return fancyAddress
}
/**
* Same as toFancyAddress but in the opposite direction.
* @param fancyAddress Fancy address to turn into a string.
* @returns Way more boring address.
*/
export const fromFancyAddress = (fancyAddress: any): string => {
if (fancyAddress.buf) {
return toHexString(fancyAddress.buf)
} else {
return toHexString(fancyAddress)
}
}
/* Imports: External */ /* Imports: External */
import { TransactionExecutionError } from 'hardhat/internal/hardhat-network/provider/errors'
import { HardhatNetworkProvider } from 'hardhat/internal/hardhat-network/provider/provider' import { HardhatNetworkProvider } from 'hardhat/internal/hardhat-network/provider/provider'
import { decodeRevertReason } from 'hardhat/internal/hardhat-network/stack-traces/revert-reasons' import { decodeRevertReason } from 'hardhat/internal/hardhat-network/stack-traces/revert-reasons'
import { VmError } from '@nomiclabs/ethereumjs-vm/dist/exceptions' import { VmError } from '@nomiclabs/ethereumjs-vm/dist/exceptions'
import { toHexString, fromHexString } from '@eth-optimism/core-utils'
import BN from 'bn.js' import BN from 'bn.js'
// Handle hardhat ^2.2.0
let TransactionExecutionError: any
try {
// tslint:disable-next-line
TransactionExecutionError = require('hardhat/internal/hardhat-network/provider/errors')
.TransactionExecutionError
} catch (err) {
// tslint:disable-next-line
TransactionExecutionError = require('hardhat/internal/core/providers/errors')
.TransactionExecutionError
}
/* Imports: Internal */ /* Imports: Internal */
import { MockContract, SmockedVM } from './types' import { MockContract, SmockedVM } from './types'
import { fromFancyAddress, toFancyAddress } from '../common'
/** /**
* Checks to see if smock has been initialized already. Basically just checking to see if we've * Checks to see if smock has been initialized already. Basically just checking to see if we've
...@@ -52,7 +63,7 @@ const initializeSmock = (provider: HardhatNetworkProvider): void => { ...@@ -52,7 +63,7 @@ const initializeSmock = (provider: HardhatNetworkProvider): void => {
return return
} }
const target = toHexString(message.to).toLowerCase() const target = fromFancyAddress(message.to)
// Check if the target address is a smocked contract. // Check if the target address is a smocked contract.
if (!(target in vm._smockState.mocks)) { if (!(target in vm._smockState.mocks)) {
...@@ -77,7 +88,7 @@ const initializeSmock = (provider: HardhatNetworkProvider): void => { ...@@ -77,7 +88,7 @@ const initializeSmock = (provider: HardhatNetworkProvider): void => {
// later creates a contract at that address. Not sure how to handle this case. Very open to // later creates a contract at that address. Not sure how to handle this case. Very open to
// ideas. // ideas.
if (result.createdAddress) { if (result.createdAddress) {
const created = toHexString(result.createdAddress).toLowerCase() const created = fromFancyAddress(result.createdAddress)
if (created in vm._smockState.mocks) { if (created in vm._smockState.mocks) {
delete vm._smockState.mocks[created] delete vm._smockState.mocks[created]
} }
...@@ -92,7 +103,7 @@ const initializeSmock = (provider: HardhatNetworkProvider): void => { ...@@ -92,7 +103,7 @@ const initializeSmock = (provider: HardhatNetworkProvider): void => {
// contracts never create new sub-calls (meaning this `afterMessage` event corresponds directly // contracts never create new sub-calls (meaning this `afterMessage` event corresponds directly
// to a `beforeMessage` event emitted during a call to a smock contract). // to a `beforeMessage` event emitted during a call to a smock contract).
const message = vm._smockState.messages.pop() const message = vm._smockState.messages.pop()
const target = toHexString(message.to).toLowerCase() const target = fromFancyAddress(message.to)
// Not sure if this can ever actually happen? Just being safe. // Not sure if this can ever actually happen? Just being safe.
if (!(target in vm._smockState.mocks)) { if (!(target in vm._smockState.mocks)) {
...@@ -157,7 +168,7 @@ export const bindSmock = async ( ...@@ -157,7 +168,7 @@ export const bindSmock = async (
} }
const vm: SmockedVM = (provider as any)._node._vm const vm: SmockedVM = (provider as any)._node._vm
const pStateManager = vm.pStateManager const pStateManager = vm.pStateManager || vm.stateManager
// Add mock to our list of mocks currently attached to the VM. // Add mock to our list of mocks currently attached to the VM.
vm._smockState.mocks[mock.address.toLowerCase()] = mock vm._smockState.mocks[mock.address.toLowerCase()] = mock
...@@ -166,7 +177,7 @@ export const bindSmock = async ( ...@@ -166,7 +177,7 @@ export const bindSmock = async (
// Solidity will sometimes throw if it's calling something without code (I forget the exact // Solidity will sometimes throw if it's calling something without code (I forget the exact
// scenario that causes this throw). // scenario that causes this throw).
await pStateManager.putContractCode( await pStateManager.putContractCode(
fromHexString(mock.address), toFancyAddress(mock.address),
Buffer.from('00', 'hex') Buffer.from('00', 'hex')
) )
} }
...@@ -6,6 +6,9 @@ import { toHexString, fromHexString } from '@eth-optimism/core-utils' ...@@ -6,6 +6,9 @@ import { toHexString, fromHexString } from '@eth-optimism/core-utils'
/* Imports: Internal */ /* Imports: Internal */
import { import {
isArtifact, isArtifact,
isContract,
isContractFactory,
isInterface,
MockContract, MockContract,
MockContractFunction, MockContractFunction,
MockReturnValue, MockReturnValue,
...@@ -33,13 +36,19 @@ const makeContractInterfaceFromSpec = async ( ...@@ -33,13 +36,19 @@ const makeContractInterfaceFromSpec = async (
return spec.interface return spec.interface
} else if (spec instanceof ethers.utils.Interface) { } else if (spec instanceof ethers.utils.Interface) {
return spec return spec
} else if (isInterface(spec)) {
return spec as any
} else if (isContractFactory(spec)) {
return (spec as any).interface
} else if (isContract(spec)) {
return (spec as any).interface
} else if (isArtifact(spec)) { } else if (isArtifact(spec)) {
return new ethers.utils.Interface(spec.abi) return new ethers.utils.Interface(spec.abi)
} else if (typeof spec === 'string') { } else if (typeof spec === 'string') {
try { try {
return new ethers.utils.Interface(spec) return new ethers.utils.Interface(spec)
} catch (err) { } catch (err) {
return (await hre.ethers.getContractFactory(spec)).interface return (await (hre as any).ethers.getContractFactory(spec)).interface
} }
} else { } else {
return new ethers.utils.Interface(spec) return new ethers.utils.Interface(spec)
...@@ -150,7 +159,7 @@ export const smockit = async ( ...@@ -150,7 +159,7 @@ export const smockit = async (
const contract = new ethers.Contract( const contract = new ethers.Contract(
opts.address || makeRandomAddress(), opts.address || makeRandomAddress(),
await makeContractInterfaceFromSpec(spec), await makeContractInterfaceFromSpec(spec),
opts.provider || hre.ethers.provider // TODO: Probably check that this exists. opts.provider || (hre as any).ethers.provider // TODO: Probably check that this exists.
) as MockContract ) as MockContract
// Start by smocking the fallback. // Start by smocking the fallback.
......
...@@ -62,7 +62,11 @@ export interface SmockedVM { ...@@ -62,7 +62,11 @@ export interface SmockedVM {
on: (event: string, callback: Function) => void on: (event: string, callback: Function) => void
pStateManager: { stateManager?: {
putContractCode: (address: Buffer, code: Buffer) => Promise<void>
}
pStateManager?: {
putContractCode: (address: Buffer, code: Buffer) => Promise<void> putContractCode: (address: Buffer, code: Buffer) => Promise<void>
} }
} }
...@@ -90,6 +94,30 @@ export const isMockContract = (obj: any): obj is MockContract => { ...@@ -90,6 +94,30 @@ export const isMockContract = (obj: any): obj is MockContract => {
) )
} }
export const isInterface = (obj: any): boolean => {
return (
obj &&
obj.functions !== undefined &&
obj.errors !== undefined &&
obj.structs !== undefined &&
obj.events !== undefined &&
Array.isArray(obj.fragments)
)
}
export const isContract = (obj: any): boolean => {
return (
obj &&
obj.functions !== undefined &&
obj.estimateGas !== undefined &&
obj.callStatic !== undefined
)
}
export const isContractFactory = (obj: any): boolean => {
return obj && obj.interface !== undefined && obj.deploy !== undefined
}
export const isArtifact = (obj: any): obj is Artifact => { export const isArtifact = (obj: any): obj is Artifact => {
return ( return (
obj && obj &&
......
...@@ -6,7 +6,7 @@ import { fromHexString } from '@eth-optimism/core-utils' ...@@ -6,7 +6,7 @@ import { fromHexString } from '@eth-optimism/core-utils'
import { ModifiableContract, ModifiableContractFactory } from './types' import { ModifiableContract, ModifiableContractFactory } from './types'
import { getStorageLayout, getStorageSlots } from './storage' import { getStorageLayout, getStorageSlots } from './storage'
import { toHexString32 } from '../utils' import { toHexString32 } from '../utils'
import { findBaseHardhatProvider } from '../common' import { findBaseHardhatProvider, toFancyAddress } from '../common'
/** /**
* Creates a modifiable contract factory. * Creates a modifiable contract factory.
...@@ -29,10 +29,11 @@ export const smoddit = async ( ...@@ -29,10 +29,11 @@ export const smoddit = async (
} }
// Pull out a reference to the vm's state manager. // Pull out a reference to the vm's state manager.
const pStateManager = (provider as any)._node._vm.pStateManager const vm: any = (provider as any)._node._vm
const pStateManager = vm.pStateManager || vm.stateManager
const layout = await getStorageLayout(name) const layout = await getStorageLayout(name)
const factory = (await hre.ethers.getContractFactory( const factory = (await (hre as any).ethers.getContractFactory(
name, name,
signer signer
)) as ModifiableContractFactory )) as ModifiableContractFactory
...@@ -50,7 +51,7 @@ export const smoddit = async ( ...@@ -50,7 +51,7 @@ export const smoddit = async (
const slots = getStorageSlots(layout, storage) const slots = getStorageSlots(layout, storage)
for (const slot of slots) { for (const slot of slots) {
await pStateManager.putContractStorage( await pStateManager.putContractStorage(
fromHexString(contract.address), toFancyAddress(contract.address),
fromHexString(slot.hash.toLowerCase()), fromHexString(slot.hash.toLowerCase()),
fromHexString(slot.value) fromHexString(slot.value)
) )
...@@ -67,7 +68,7 @@ export const smoddit = async ( ...@@ -67,7 +68,7 @@ export const smoddit = async (
if ( if (
toHexString32( toHexString32(
await pStateManager.getContractStorage( await pStateManager.getContractStorage(
fromHexString(contract.address), toFancyAddress(contract.address),
fromHexString(slot.hash.toLowerCase()) fromHexString(slot.hash.toLowerCase())
) )
) !== slot.value ) !== slot.value
......
/* Imports: External */ /* Imports: External */
import { ethers } from 'hardhat' import hre from 'hardhat'
import { expect } from 'chai' import { expect } from 'chai'
import { toPlainObject } from 'lodash' import { toPlainObject } from 'lodash'
import { BigNumber } from 'ethers' import { BigNumber } from 'ethers'
...@@ -8,6 +8,8 @@ import { BigNumber } from 'ethers' ...@@ -8,6 +8,8 @@ import { BigNumber } from 'ethers'
import { MockContract, smockit } from '../../src' import { MockContract, smockit } from '../../src'
describe('[smock]: function manipulation tests', () => { describe('[smock]: function manipulation tests', () => {
const ethers = (hre as any).ethers
let mock: MockContract let mock: MockContract
beforeEach(async () => { beforeEach(async () => {
mock = await smockit('TestHelpers_BasicReturnContract') mock = await smockit('TestHelpers_BasicReturnContract')
......
/* Imports: External */ /* Imports: External */
import { ethers, artifacts } from 'hardhat' import hre from 'hardhat'
import { expect } from 'chai' import { expect } from 'chai'
/* Imports: Internal */ /* Imports: Internal */
import { smockit, isMockContract } from '../../src' import { smockit, isMockContract } from '../../src'
describe('[smock]: initialization tests', () => { describe('[smock]: initialization tests', () => {
const ethers = (hre as any).ethers
describe('initialization: ethers objects', () => { describe('initialization: ethers objects', () => {
it('should be able to create a SmockContract from an ethers ContractFactory', async () => { it('should be able to create a SmockContract from an ethers ContractFactory', async () => {
const spec = await ethers.getContractFactory('TestHelpers_EmptyContract') const spec = await ethers.getContractFactory('TestHelpers_EmptyContract')
...@@ -46,7 +48,7 @@ describe('[smock]: initialization tests', () => { ...@@ -46,7 +48,7 @@ describe('[smock]: initialization tests', () => {
}) })
it('should be able to create a SmockContract from a JSON contract artifact object', async () => { it('should be able to create a SmockContract from a JSON contract artifact object', async () => {
const artifact = await artifacts.readArtifact( const artifact = await hre.artifacts.readArtifact(
'TestHelpers_BasicReturnContract' 'TestHelpers_BasicReturnContract'
) )
const spec = artifact const spec = artifact
...@@ -56,7 +58,7 @@ describe('[smock]: initialization tests', () => { ...@@ -56,7 +58,7 @@ describe('[smock]: initialization tests', () => {
}) })
it('should be able to create a SmockContract from a JSON contract ABI object', async () => { it('should be able to create a SmockContract from a JSON contract ABI object', async () => {
const artifact = await artifacts.readArtifact( const artifact = await hre.artifacts.readArtifact(
'TestHelpers_BasicReturnContract' 'TestHelpers_BasicReturnContract'
) )
const spec = artifact.abi const spec = artifact.abi
...@@ -66,7 +68,7 @@ describe('[smock]: initialization tests', () => { ...@@ -66,7 +68,7 @@ describe('[smock]: initialization tests', () => {
}) })
it('should be able to create a SmockContract from a JSON contract ABI string', async () => { it('should be able to create a SmockContract from a JSON contract ABI string', async () => {
const artifact = await artifacts.readArtifact( const artifact = await hre.artifacts.readArtifact(
'TestHelpers_BasicReturnContract' 'TestHelpers_BasicReturnContract'
) )
const spec = JSON.stringify(artifact.abi) const spec = JSON.stringify(artifact.abi)
......
...@@ -305,6 +305,76 @@ ...@@ -305,6 +305,76 @@
patch-package "^6.2.2" patch-package "^6.2.2"
postinstall-postinstall "^2.1.0" postinstall-postinstall "^2.1.0"
"@ethereumjs/block@^3.2.0", "@ethereumjs/block@^3.2.1":
version "3.2.1"
resolved "https://registry.yarnpkg.com/@ethereumjs/block/-/block-3.2.1.tgz#c24c345e6dd6299efa4bed40979280b7dda96d3a"
integrity sha512-FCxo5KwwULne2A2Yuae4iaGGqSsRjwzXOlDhGalOFiBbLfP3hE04RHaHGw4c8vh1PfOrLauwi0dQNUBkOG3zIA==
dependencies:
"@ethereumjs/common" "^2.2.0"
"@ethereumjs/tx" "^3.1.3"
ethereumjs-util "^7.0.10"
merkle-patricia-tree "^4.1.0"
"@ethereumjs/blockchain@^5.2.1":
version "5.2.1"
resolved "https://registry.yarnpkg.com/@ethereumjs/blockchain/-/blockchain-5.2.1.tgz#83ed83647667265f1666f111caf065ef9d1e82b5"
integrity sha512-+hshP2qSOOFsiYvZCbaDQFG7jYTWafE8sfBi+pAsdhAHfP7BN7VLyob7qoQISgwS1s7NTR4c4+2t/woU9ahItw==
dependencies:
"@ethereumjs/block" "^3.2.0"
"@ethereumjs/common" "^2.2.0"
"@ethereumjs/ethash" "^1.0.0"
debug "^2.2.0"
ethereumjs-util "^7.0.9"
level-mem "^5.0.1"
lru-cache "^5.1.1"
rlp "^2.2.4"
semaphore-async-await "^1.5.1"
"@ethereumjs/common@^2.2.0":
version "2.2.0"
resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.2.0.tgz#850a3e3e594ee707ad8d44a11e8152fb62450535"
integrity sha512-PyQiTG00MJtBRkJmv46ChZL8u2XWxNBeAthznAUIUiefxPAXjbkuiCZOuncgJS34/XkMbNc9zMt/PlgKRBElig==
dependencies:
crc-32 "^1.2.0"
ethereumjs-util "^7.0.9"
"@ethereumjs/ethash@^1.0.0":
version "1.0.0"
resolved "https://registry.yarnpkg.com/@ethereumjs/ethash/-/ethash-1.0.0.tgz#4e77f85b37be1ade5393e8719bdabac3e796ddaa"
integrity sha512-iIqnGG6NMKesyOxv2YctB2guOVX18qMAWlj3QlZyrc+GqfzLqoihti+cVNQnyNxr7eYuPdqwLQOFuPe6g/uKjw==
dependencies:
"@types/levelup" "^4.3.0"
buffer-xor "^2.0.1"
ethereumjs-util "^7.0.7"
miller-rabin "^4.0.0"
"@ethereumjs/tx@^3.1.3":
version "3.1.3"
resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-3.1.3.tgz#0e4b0ccec2f12b1f0bbbb0e7542dd79d9ec25d87"
integrity sha512-DJBu6cbwYtiPTFeCUR8DF5p+PF0jxs+0rALJZiEcTz2tiRPIEkM72GEbrkGuqzENLCzBrJHT43O0DxSYTqeo+g==
dependencies:
"@ethereumjs/common" "^2.2.0"
ethereumjs-util "^7.0.10"
"@ethereumjs/vm@^5.3.2":
version "5.3.2"
resolved "https://registry.yarnpkg.com/@ethereumjs/vm/-/vm-5.3.2.tgz#b4d83a3d50a7ad22d6d412cc21bbde221b3e2871"
integrity sha512-QmCUQrW6xbhgEbQh9njue4kAJdM056C+ytBFUTF/kDYa3kNDm4Qxp9HUyTlt1OCSXvDhws0qqlh8+q+pmXpN7g==
dependencies:
"@ethereumjs/block" "^3.2.1"
"@ethereumjs/blockchain" "^5.2.1"
"@ethereumjs/common" "^2.2.0"
"@ethereumjs/tx" "^3.1.3"
async-eventemitter "^0.2.4"
core-js-pure "^3.0.1"
debug "^2.2.0"
ethereumjs-util "^7.0.10"
functional-red-black-tree "^1.0.1"
mcl-wasm "^0.7.1"
merkle-patricia-tree "^4.1.0"
rustbn.js "~0.2.0"
util.promisify "^1.0.1"
"@ethersproject/abi@5.0.0-beta.153": "@ethersproject/abi@5.0.0-beta.153":
version "5.0.0-beta.153" version "5.0.0-beta.153"
resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.0.0-beta.153.tgz#43a37172b33794e4562999f6e2d555b7599a8eee" resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.0.0-beta.153.tgz#43a37172b33794e4562999f6e2d555b7599a8eee"
...@@ -1479,7 +1549,7 @@ ...@@ -1479,7 +1549,7 @@
"@nodelib/fs.scandir" "2.1.4" "@nodelib/fs.scandir" "2.1.4"
fastq "^1.6.0" fastq "^1.6.0"
"@nomiclabs/ethereumjs-vm@4.2.2": "@nomiclabs/ethereumjs-vm@4.2.2", "@nomiclabs/ethereumjs-vm@^4.2.2":
version "4.2.2" version "4.2.2"
resolved "https://registry.yarnpkg.com/@nomiclabs/ethereumjs-vm/-/ethereumjs-vm-4.2.2.tgz#2f8817113ca0fb6c44c1b870d0a809f0e026a6cc" resolved "https://registry.yarnpkg.com/@nomiclabs/ethereumjs-vm/-/ethereumjs-vm-4.2.2.tgz#2f8817113ca0fb6c44c1b870d0a809f0e026a6cc"
integrity sha512-8WmX94mMcJaZ7/m7yBbyuS6B+wuOul+eF+RY9fBpGhNaUpyMR/vFIcDojqcWQ4Yafe1tMKY5LDu2yfT4NZgV4Q== integrity sha512-8WmX94mMcJaZ7/m7yBbyuS6B+wuOul+eF+RY9fBpGhNaUpyMR/vFIcDojqcWQ4Yafe1tMKY5LDu2yfT4NZgV4Q==
...@@ -2720,7 +2790,7 @@ assign-symbols@^1.0.0: ...@@ -2720,7 +2790,7 @@ assign-symbols@^1.0.0:
resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367"
integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=
async-eventemitter@^0.2.2: async-eventemitter@^0.2.2, async-eventemitter@^0.2.4:
version "0.2.4" version "0.2.4"
resolved "https://registry.yarnpkg.com/async-eventemitter/-/async-eventemitter-0.2.4.tgz#f5e7c8ca7d3e46aab9ec40a292baf686a0bafaca" resolved "https://registry.yarnpkg.com/async-eventemitter/-/async-eventemitter-0.2.4.tgz#f5e7c8ca7d3e46aab9ec40a292baf686a0bafaca"
integrity sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw== integrity sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw==
...@@ -4382,6 +4452,14 @@ cosmiconfig@^7.0.0: ...@@ -4382,6 +4452,14 @@ cosmiconfig@^7.0.0:
path-type "^4.0.0" path-type "^4.0.0"
yaml "^1.10.0" yaml "^1.10.0"
crc-32@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.0.tgz#cb2db6e29b88508e32d9dd0ec1693e7b41a18208"
integrity sha512-1uBwHxF+Y/4yF5G48fwnKq6QsIXheor3ZLPT80yGBV1oEUwpPojlEhQbWKVw1VwcTQyMGHK1/XMmTjmlsmTTGA==
dependencies:
exit-on-epipe "~1.0.1"
printj "~1.1.0"
create-ecdh@^4.0.0: create-ecdh@^4.0.0:
version "4.0.4" version "4.0.4"
resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e"
...@@ -5485,7 +5563,7 @@ ethereumjs-util@^5.0.0, ethereumjs-util@^5.0.1, ethereumjs-util@^5.1.1, ethereum ...@@ -5485,7 +5563,7 @@ ethereumjs-util@^5.0.0, ethereumjs-util@^5.0.1, ethereumjs-util@^5.1.1, ethereum
rlp "^2.0.0" rlp "^2.0.0"
safe-buffer "^5.1.1" safe-buffer "^5.1.1"
ethereumjs-util@^7.0.2, ethereumjs-util@^7.0.8: ethereumjs-util@^7.0.10, ethereumjs-util@^7.0.2, ethereumjs-util@^7.0.7, ethereumjs-util@^7.0.8, ethereumjs-util@^7.0.9:
version "7.0.10" version "7.0.10"
resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.0.10.tgz#5fb7b69fa1fda0acc59634cf39d6b0291180fc1f" resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.0.10.tgz#5fb7b69fa1fda0acc59634cf39d6b0291180fc1f"
integrity sha512-c/xThw6A+EAnej5Xk5kOzFzyoSnw0WX0tSlZ6pAsfGVvQj3TItaDg9b1+Fz1RJXA+y2YksKwQnuzgt1eY6LKzw== integrity sha512-c/xThw6A+EAnej5Xk5kOzFzyoSnw0WX0tSlZ6pAsfGVvQj3TItaDg9b1+Fz1RJXA+y2YksKwQnuzgt1eY6LKzw==
...@@ -5727,6 +5805,11 @@ execa@^5.0.0: ...@@ -5727,6 +5805,11 @@ execa@^5.0.0:
signal-exit "^3.0.3" signal-exit "^3.0.3"
strip-final-newline "^2.0.0" strip-final-newline "^2.0.0"
exit-on-epipe@~1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz#0bdd92e87d5285d267daa8171d0eb06159689692"
integrity sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw==
expand-brackets@^2.1.4: expand-brackets@^2.1.4:
version "2.1.4" version "2.1.4"
resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622"
...@@ -6736,6 +6819,57 @@ hardhat@^2.0.8, hardhat@^2.0.9, hardhat@^2.1.1, hardhat@^2.1.2: ...@@ -6736,6 +6819,57 @@ hardhat@^2.0.8, hardhat@^2.0.9, hardhat@^2.1.1, hardhat@^2.1.2:
uuid "^3.3.2" uuid "^3.3.2"
ws "^7.2.1" ws "^7.2.1"
hardhat@^2.2.1:
version "2.2.1"
resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.2.1.tgz#bef0031b994e3f60a88d428f2097195c58cf9ed2"
integrity sha512-8s7MtGXdh0NDwQKdlA8m8QdloVIN1+hv5aFpn0G5Ljj9vfNY9kUoc0a9pMboeGbd9WrS+XrZs5YlsPgQjaW/Tg==
dependencies:
"@ethereumjs/block" "^3.2.1"
"@ethereumjs/blockchain" "^5.2.1"
"@ethereumjs/common" "^2.2.0"
"@ethereumjs/tx" "^3.1.3"
"@ethereumjs/vm" "^5.3.2"
"@sentry/node" "^5.18.1"
"@solidity-parser/parser" "^0.11.0"
"@types/bn.js" "^5.1.0"
"@types/lru-cache" "^5.1.0"
abort-controller "^3.0.0"
adm-zip "^0.4.16"
ansi-escapes "^4.3.0"
chalk "^2.4.2"
chokidar "^3.4.0"
ci-info "^2.0.0"
debug "^4.1.1"
enquirer "^2.3.0"
env-paths "^2.2.0"
eth-sig-util "^2.5.2"
ethereum-cryptography "^0.1.2"
ethereumjs-abi "^0.6.8"
ethereumjs-util "^7.0.10"
find-up "^2.1.0"
fp-ts "1.19.3"
fs-extra "^7.0.1"
glob "^7.1.3"
immutable "^4.0.0-rc.12"
io-ts "1.10.4"
lodash "^4.17.11"
merkle-patricia-tree "^4.1.0"
mnemonist "^0.38.0"
mocha "^7.1.2"
node-fetch "^2.6.0"
qs "^6.7.0"
raw-body "^2.4.1"
resolve "1.17.0"
semver "^6.3.0"
slash "^3.0.0"
solc "0.7.3"
source-map-support "^0.5.13"
stacktrace-parser "^0.1.10"
"true-case-path" "^2.2.1"
tsort "0.0.1"
uuid "^3.3.2"
ws "^7.2.1"
has-ansi@^2.0.0: has-ansi@^2.0.0:
version "2.0.0" version "2.0.0"
resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
...@@ -8398,6 +8532,11 @@ match-all@^1.2.6: ...@@ -8398,6 +8532,11 @@ match-all@^1.2.6:
resolved "https://registry.yarnpkg.com/match-all/-/match-all-1.2.6.tgz#66d276ad6b49655551e63d3a6ee53e8be0566f8d" resolved "https://registry.yarnpkg.com/match-all/-/match-all-1.2.6.tgz#66d276ad6b49655551e63d3a6ee53e8be0566f8d"
integrity sha512-0EESkXiTkWzrQQntBu2uzKvLu6vVkUGz40nGPbSZuegcfE5UuSzNjLaIu76zJWuaT/2I3Z/8M06OlUOZLGwLlQ== integrity sha512-0EESkXiTkWzrQQntBu2uzKvLu6vVkUGz40nGPbSZuegcfE5UuSzNjLaIu76zJWuaT/2I3Z/8M06OlUOZLGwLlQ==
mcl-wasm@^0.7.1:
version "0.7.6"
resolved "https://registry.yarnpkg.com/mcl-wasm/-/mcl-wasm-0.7.6.tgz#c1789ebda5565d49b77d2ee195ff3e4d282f1554"
integrity sha512-cbRl3sUOkBeRY2hsM4t1EIln2TIdQBkSiTOqNTv/4Hu5KOECnMWCgjIf+a9Ebunyn22VKqkMF3zj6ejRzz7YBw==
md5.js@^1.3.4: md5.js@^1.3.4:
version "1.3.5" version "1.3.5"
resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f"
...@@ -8554,7 +8693,7 @@ merkle-patricia-tree@^2.1.2, merkle-patricia-tree@^2.3.2: ...@@ -8554,7 +8693,7 @@ merkle-patricia-tree@^2.1.2, merkle-patricia-tree@^2.3.2:
rlp "^2.0.0" rlp "^2.0.0"
semaphore ">=1.0.1" semaphore ">=1.0.1"
merkle-patricia-tree@^4.0.0: merkle-patricia-tree@^4.0.0, merkle-patricia-tree@^4.1.0:
version "4.1.0" version "4.1.0"
resolved "https://registry.yarnpkg.com/merkle-patricia-tree/-/merkle-patricia-tree-4.1.0.tgz#010636c4cfd68682df33a2e3186b7d0be7b98b9d" resolved "https://registry.yarnpkg.com/merkle-patricia-tree/-/merkle-patricia-tree-4.1.0.tgz#010636c4cfd68682df33a2e3186b7d0be7b98b9d"
integrity sha512-vmP1J7FwIpprFMVjjSMM1JAwFce85Q+tp0TYIedYv8qaMh2oLUZ3ETXn9wbgi9S6elySzKzGa+Ai6VNKGEwSlg== integrity sha512-vmP1J7FwIpprFMVjjSMM1JAwFce85Q+tp0TYIedYv8qaMh2oLUZ3ETXn9wbgi9S6elySzKzGa+Ai6VNKGEwSlg==
...@@ -10187,6 +10326,11 @@ prettier@^1.14.2, prettier@^1.16.4, prettier@^1.19.1: ...@@ -10187,6 +10326,11 @@ prettier@^1.14.2, prettier@^1.16.4, prettier@^1.19.1:
resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb" resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb"
integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew== integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==
printj@~1.1.0:
version "1.1.2"
resolved "https://registry.yarnpkg.com/printj/-/printj-1.1.2.tgz#d90deb2975a8b9f600fb3a1c94e3f4c53c78a222"
integrity sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ==
private@^0.1.6, private@^0.1.8: private@^0.1.6, private@^0.1.8:
version "0.1.8" version "0.1.8"
resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff"
...@@ -12605,7 +12749,7 @@ util-promisify@^2.1.0: ...@@ -12605,7 +12749,7 @@ util-promisify@^2.1.0:
dependencies: dependencies:
object.getownpropertydescriptors "^2.0.3" object.getownpropertydescriptors "^2.0.3"
util.promisify@^1.0.0: util.promisify@^1.0.0, util.promisify@^1.0.1:
version "1.1.1" version "1.1.1"
resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.1.1.tgz#77832f57ced2c9478174149cae9b96e9918cd54b" resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.1.1.tgz#77832f57ced2c9478174149cae9b96e9918cd54b"
integrity sha512-/s3UsZUrIfa6xDhr7zZhnE9SLQ5RIXyYfiVnMMyMDzOc8WhWN4Nbh36H842OyurKbCDAesZOJaVyvmSl6fhGQw== integrity sha512-/s3UsZUrIfa6xDhr7zZhnE9SLQ5RIXyYfiVnMMyMDzOc8WhWN4Nbh36H842OyurKbCDAesZOJaVyvmSl6fhGQw==
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment