Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,17 +1,12 @@
/* External Imports */
import { ethers } from 'hardhat'
import { Contract } from 'ethers'

/* Internal Imports */
import { expect } from '../../../setup'
import { NON_ZERO_ADDRESS } from '../../../helpers'
import { NON_ZERO_ADDRESS, deploy } from '../../../helpers'

describe('Lib_OVMCodec', () => {
let Lib_OVMCodec: Contract
before(async () => {
Lib_OVMCodec = await (
await ethers.getContractFactory('TestLib_OVMCodec')
).deploy()
Lib_OVMCodec = await deploy('TestLib_OVMCodec')
})

describe('hashTransaction', () => {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
/* Internal Imports */
import { Lib_RLPReader_TEST_JSON } from '../../../data'
import { runJsonTest } from '../../../helpers'

Expand Down
Original file line number Diff line number Diff line change
@@ -1,20 +1,18 @@
/* External Imports */
import { ethers } from 'hardhat'
import { Contract } from 'ethers'

/* Internal Imports */
import { expect } from '../../../setup'
import { Lib_RLPWriter_TEST_JSON } from '../../../data'
import { deploy } from '../../../helpers'

const encode = async (Lib_RLPWriter: Contract, input: any): Promise<void> => {
if (Array.isArray(input)) {
const elements = await Promise.all(
input.map(async (el) => {
return encode(Lib_RLPWriter, el)
})
return Lib_RLPWriter.writeList(
await Promise.all(
input.map(async (el) => {
return encode(Lib_RLPWriter, el)
})
)
)

return Lib_RLPWriter.writeList(elements)
} else if (Number.isInteger(input)) {
return Lib_RLPWriter.writeUint(input)
} else {
Expand All @@ -25,9 +23,7 @@ const encode = async (Lib_RLPWriter: Contract, input: any): Promise<void> => {
describe('Lib_RLPWriter', () => {
let Lib_RLPWriter: Contract
before(async () => {
Lib_RLPWriter = await (
await ethers.getContractFactory('TestLib_RLPWriter')
).deploy()
Lib_RLPWriter = await deploy('TestLib_RLPWriter')
})

describe('Official Ethereum RLP Tests', () => {
Expand All @@ -50,14 +46,11 @@ describe('Lib_RLPWriter', () => {

describe('Use of library with other memory-modifying operations', () => {
it('should allow creation of a contract beforehand and still work', async () => {
const randomAddress = '0x1234123412341234123412341234123412341234'
const rlpEncodedRandomAddress =
'0x941234123412341234123412341234123412341234'
const encoded =
expect(
await Lib_RLPWriter.callStatic.writeAddressWithTaintedMemory(
randomAddress
'0x1234123412341234123412341234123412341234'
)
expect(encoded).to.eq(rlpEncodedRandomAddress)
).to.eq('0x941234123412341234123412341234123412341234')
})
})
})
Original file line number Diff line number Diff line change
@@ -1,16 +1,13 @@
/* External Imports */
import { ethers } from 'hardhat'
import { Contract } from 'ethers'
import { applyL1ToL2Alias, undoL1ToL2Alias } from '@eth-optimism/core-utils'

import { expect } from '../../../setup'
import { deploy } from '../../../helpers'

describe('AddressAliasHelper', () => {
let AddressAliasHelper: Contract
before(async () => {
AddressAliasHelper = await (
await ethers.getContractFactory('TestLib_AddressAliasHelper')
).deploy()
AddressAliasHelper = await deploy('TestLib_AddressAliasHelper')
})

describe('applyL1ToL2Alias', () => {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,21 +1,17 @@
/* External Imports */
import * as rlp from 'rlp'
import { ethers } from 'hardhat'
import { Contract } from 'ethers'
import { toHexString } from '@eth-optimism/core-utils'

/* Internal Imports */
import { expect } from '../../../setup'
import { TrieTestGenerator } from '../../../helpers'
import { deploy, TrieTestGenerator } from '../../../helpers'

const NODE_COUNTS = [1, 2, 32, 128]

describe('Lib_MerkleTrie', () => {
let Lib_MerkleTrie: Contract
before(async () => {
Lib_MerkleTrie = await (
await ethers.getContractFactory('TestLib_MerkleTrie')
).deploy()
Lib_MerkleTrie = await deploy('TestLib_MerkleTrie')
})

// Eth-foundation tests: https://github.com/ethereum/tests/tree/develop/TrieTests
Expand Down
Original file line number Diff line number Diff line change
@@ -1,19 +1,14 @@
/* External Imports */
import { ethers } from 'hardhat'
import { Contract } from 'ethers'

/* Internal Imports */
import { expect } from '../../../setup'
import { TrieTestGenerator } from '../../../helpers'
import { deploy, TrieTestGenerator } from '../../../helpers'

const NODE_COUNTS = [1, 2, 128]

describe('Lib_SecureMerkleTrie', () => {
let Lib_SecureMerkleTrie: Contract
before(async () => {
Lib_SecureMerkleTrie = await (
await ethers.getContractFactory('TestLib_SecureMerkleTrie')
).deploy()
Lib_SecureMerkleTrie = await deploy('TestLib_SecureMerkleTrie')
})

describe('verifyInclusionProof', () => {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,12 @@
import hre from 'hardhat'
import { Contract, ethers } from 'ethers'

import { expect } from '../../../setup'
import { deploy } from '../../../helpers'

describe('Lib_Buffer', () => {
let Lib_Buffer: Contract
beforeEach(async () => {
const Factory__Lib_Buffer = await hre.ethers.getContractFactory(
'TestLib_Buffer'
)
Lib_Buffer = await Factory__Lib_Buffer.deploy()
Lib_Buffer = await deploy('TestLib_Buffer')
})

describe('push(bytes32,bytes27)', () => {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
/* Internal Imports */
import { Lib_Bytes32Utils_TEST_JSON } from '../../../data'
import { runJsonTest } from '../../../helpers'

Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,8 @@
/* Internal Imports */
import { ethers } from 'hardhat'
import { Contract } from 'ethers'

/* External Imports */
import { Lib_BytesUtils_TEST_JSON } from '../../../data'
import { runJsonTest } from '../../../helpers'
import { expect } from '../../../setup'
import { Lib_BytesUtils_TEST_JSON } from '../../../data'
import { deploy, runJsonTest } from '../../../helpers'

describe('Lib_BytesUtils', () => {
describe('JSON tests', () => {
Expand All @@ -15,18 +12,17 @@ describe('Lib_BytesUtils', () => {
describe('Use of library with other memory-modifying operations', () => {
let TestLib_BytesUtils: Contract
before(async () => {
TestLib_BytesUtils = await (
await ethers.getContractFactory('TestLib_BytesUtils')
).deploy()
TestLib_BytesUtils = await deploy('TestLib_BytesUtils')
})

it('should allow creation of a contract beforehand and still work', async () => {
const slice = await TestLib_BytesUtils.callStatic.sliceWithTaintedMemory(
'0x123412341234',
0,
0
)
expect(slice).to.eq('0x')
expect(
await TestLib_BytesUtils.callStatic.sliceWithTaintedMemory(
'0x123412341234',
0,
0
)
).to.eq('0x')
})
})
})
Original file line number Diff line number Diff line change
@@ -1,25 +1,18 @@
/* External Imports */
import { ethers } from 'hardhat'
import { Contract, BigNumber } from 'ethers'
import { MerkleTree } from 'merkletreejs'
import { fromHexString, toHexString } from '@eth-optimism/core-utils'
import { smock, FakeContract } from '@defi-wonderland/smock'

/* Internal Imports */
import { expect } from '../../../setup'
import { NON_NULL_BYTES32 } from '../../../helpers'
import { deploy, NON_NULL_BYTES32 } from '../../../helpers'

const NODE_COUNTS = [
2, 3, 7, 9, 13, 63, 64, 123, 128, 129, 255, 1021, 1023, 1024,
]

const hash = (el: Buffer | string): Buffer => {
return Buffer.from(ethers.utils.keccak256(el).slice(2), 'hex')
}

const fillDefaultHashes = (elements: string[]): string[] => {
const makeMerkleTree = (elements: string[]): MerkleTree => {
const filled: string[] = []

for (let i = 0; i < Math.pow(2, Math.ceil(Math.log2(elements.length))); i++) {
if (i < elements.length) {
filled.push(elements[i])
Expand All @@ -28,17 +21,19 @@ const fillDefaultHashes = (elements: string[]): string[] => {
}
}

return filled
return new MerkleTree(
filled.map(fromHexString),
(el: Buffer | string): Buffer => {
return fromHexString(ethers.utils.keccak256(el))
}
)
}

describe('Lib_MerkleTree', () => {
let Lib_MerkleTree: Contract
let Fake__LibMerkleTree: FakeContract<Contract>
before(async () => {
Lib_MerkleTree = await (
await ethers.getContractFactory('TestLib_MerkleTree')
).deploy()

Lib_MerkleTree = await deploy('TestLib_MerkleTree')
Fake__LibMerkleTree = await smock.fake('TestLib_MerkleTree')
})

Expand Down Expand Up @@ -66,17 +61,13 @@ describe('Lib_MerkleTree', () => {
describe('when more than one element is provided', () => {
for (const size of NODE_COUNTS) {
it(`should generate the correct root when ${size} elements are provided`, async () => {
const elements = [...Array(size)].map((_, i) => {
return ethers.utils.keccak256(BigNumber.from(i).toHexString())
})

const bufs = fillDefaultHashes(elements).map((element) => {
return fromHexString(element)
})

const tree = new MerkleTree(bufs, hash)
const tree = makeMerkleTree(
[...Array(size)].map((_, i) => {
return ethers.utils.keccak256(BigNumber.from(i).toHexString())
})
)

expect(await Lib_MerkleTree.getMerkleRoot(bufs)).to.equal(
expect(await Lib_MerkleTree.getMerkleRoot(tree.getLeaves())).to.equal(
toHexString(tree.getRoot())
)
})
Expand Down Expand Up @@ -116,24 +107,6 @@ describe('Lib_MerkleTree', () => {
})
})

describe('when total elements is zero', () => {
const totalLeaves = 0

it('should revert', async () => {
await expect(
Lib_MerkleTree.verify(
ethers.constants.HashZero,
ethers.constants.HashZero,
0,
[],
totalLeaves
)
).to.be.revertedWith(
'Lib_MerkleTree: Total leaves must be greater than zero.'
)
})
})

describe('when an index is out of bounds', () => {
const totalLeaves = 1
const index = 2
Expand Down Expand Up @@ -187,26 +160,24 @@ describe('Lib_MerkleTree', () => {
describe('with valid proof for more than one element', () => {
for (const size of NODE_COUNTS) {
describe(`for a tree with ${size} total elements`, () => {
const elements = [...Array(size)].map((_, i) => {
return ethers.utils.keccak256(BigNumber.from(i).toHexString())
})

const bufs = fillDefaultHashes(elements).map((element) => {
return fromHexString(element)
})

const tree = new MerkleTree(bufs, hash)
const tree = makeMerkleTree(
[...Array(size)].map((_, i) => {
return ethers.utils.keccak256(BigNumber.from(i).toHexString())
})
)

for (let i = 0; i < size; i += Math.ceil(size / 8)) {
it(`should verify a proof for the ${i}(th/st/rd, whatever) element`, async () => {
const proof = tree.getProof(bufs[i], i).map((element) => {
return element.data
})
const proof = tree
.getProof(tree.getLeaves()[i], i)
.map((element) => {
return element.data
})

expect(
await Lib_MerkleTree.verify(
tree.getRoot(),
bufs[i],
tree.getLeaves()[i],
i,
proof,
size
Expand Down