Skip to content
Draft
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
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,6 @@ networks/ethereum/node1/*
test-logs
output-logs
/matter-labs-tests/matter-test-output.log

dev-chain-*
# DS_Store
.DS_Store
10 changes: 10 additions & 0 deletions matter-labs-tests/.env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
NODE_COUNT=
GETH_NODE_BIN_DIR=
KITCHEN_SINK_NODE_BIN_DIR=
KITCHEN_SINK_ETH_RPC_BIN=

GETH_NODE_PORT=
KITCHEN_SINK_NODE_PORT=
KITCHEN_SINK_ETH_RPC_PORT=
GENESIS_JSON_DIR=
CONTRACT_FILTERS=
23 changes: 19 additions & 4 deletions matter-labs-tests/.gitignore
Original file line number Diff line number Diff line change
@@ -1,6 +1,24 @@
node_modules

# environment setup
.env

# contract artifacts

abi/*
!abi/.gitkeep

evm/*
!evm/.gitkeep

pvm/*
!pvm/.gitkeep

geth-db/*
!geth-db/.gitkeep

diff-test-output.json

# Hardhat files
/cache
/artifacts
Expand All @@ -15,7 +33,4 @@ node_modules

# solidity-coverage files
/coverage
/coverage.json

# Hardhat Ignition default folder for deployments against a local node
ignition/deployments/chain-31337
/coverage.json
32 changes: 24 additions & 8 deletions matter-labs-tests/README.md
Original file line number Diff line number Diff line change
@@ -1,13 +1,29 @@
# Sample Hardhat Project
# Revive Differential Tests

This project demonstrates a basic Hardhat use case. It comes with a sample contract, a test for that contract, and a Hardhat Ignition module that deploys that contract.
## Summary

Try running some of the following tasks:
Test Suite for testing PVM compatability with EVM

# .env.example
NODE_COUNT=1
GETH_NODE_BIN_DIR=path_to_local_geth_binary
KITCHEN_SINK_NODE_BIN_DIR=path_to_local_substrate-node_binary
KITCHEN_SINK_ETH_RPC_BIN=path_to_local_substrate-node_eth_rpc

GETH_NODE_PORT=8845
KITCHEN_SINK_NODE_PORT=9944
KITCHEN_SINK_ETH_RPC_PORT=8545
GENESIS_JSON_DIR=path_to_your_genesis.json
CONTRACT_FILTERS=multidimensional,0_topics_0_bytes

# Getting Started

```shell
npx hardhat help
npx hardhat test
REPORT_GAS=true npx hardhat test
npx hardhat node
npx hardhat ignition deploy ./ignition/modules/Lock.ts
npm install --force

npm run update-submodule

npm run compile

npm run differential-tests
```
File renamed without changes.
123 changes: 123 additions & 0 deletions matter-labs-tests/compileContracts.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
import { compile, SolcOutput } from '@parity/revive'
import { format } from 'prettier'
import { parseArgs } from 'node:util'
import solc from 'solc'
import { readdirSync, readFileSync, writeFileSync } from 'fs'
import { basename, join } from 'path'

import dotenv from 'dotenv';
dotenv.config();

import { fileURLToPath } from 'url';
import { dirname } from 'path';
import { getMatterLabsFilePaths } from './utils/matterLabsHelpers'
import { Metadata } from './types'

const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);

type CompileInput = Parameters<typeof compile>[0]

const {
values: { filter, solcOnly },
} = parseArgs({
args: process.argv.slice(2),
options: {
filter: {
type: 'string',
short: 'f',
},
solcOnly: {
type: 'boolean',
short: 's',
},
},
})

function evmCompile(sources: CompileInput) {
const input = {
language: 'Solidity',
sources,
settings: {
outputSelection: {
'*': {
'*': ['*'],
},
},
},
}

return solc.compile(JSON.stringify(input))
}

console.log('Compiling contracts...')

const contractsDirectory = 'contracts/era-compiler-tests/solidity/simple';
const rootDir = join(__dirname, '.')
const contractsDir = join(rootDir, contractsDirectory)
const abiDir = join(rootDir, 'abi')
const pvmDir = join(rootDir, 'pvm')
const evmDir = join(rootDir, 'evm')

const input = readdirSync(contractsDir)
.filter((f) => f.endsWith('.sol'))
.filter((f) => !filter || f.includes(filter))

const filePaths: { filePath: string, metadata: Metadata }[] = [];

const filters = process.env.CONTRACT_FILTERS?.split(',') || [];
await getMatterLabsFilePaths(contractsDir, filePaths, filters);

for (const data of filePaths) {
const file = data.filePath;

const lastSlashIndex = file.lastIndexOf('/');
const lastSegment = file.substring(0, lastSlashIndex);
const fileDirInfo = lastSegment.split('/').pop() || '';

console.log(`🔨 Compiling ${file}...`)
const fileName = basename(file, '.sol')
const input = {
[fileName]: { content: readFileSync(file, 'utf8') },
}

if (!solcOnly) {
console.log('Compiling with revive...')
const reviveOut = await compile(input, { bin: 'resolc' })

for (const contracts of Object.values(reviveOut.contracts)) {
console.log("contracts----", contracts)
for (let [name, contract] of Object.entries(contracts)) {
console.log(`📜 Add PVM contract ${name}`)
writeFileSync(
join(pvmDir, `${fileDirInfo}:${fileName}:${name}.polkavm`),
Buffer.from(contract.evm.bytecode.object, 'hex')
)
}
}
}

console.log(`Compile with solc ${file}`)
const evmOut = JSON.parse(evmCompile(input)) as SolcOutput

for (const contracts of Object.values(evmOut.contracts)) {
for (const [name, contract] of Object.entries(contracts)) {
console.log(`📜 Add EVM contract ${name}`)
writeFileSync(
join(evmDir, `${fileDirInfo}:${fileName}:${name}.bin`),
Buffer.from(contract.evm.bytecode.object, 'hex')
)

const abi = contract.abi
const abiName = `${name}Abi`
writeFileSync(join(abiDir, `${fileDirInfo}:${fileName}:${name}.json`), JSON.stringify(abi, null, 2))

writeFileSync(
join(abiDir, `${fileDirInfo}:${fileName}:${name}.ts`),
await format(`export const ${abiName} = ${JSON.stringify(abi, null, 2)} as const`, {
parser: 'typescript',
})
)
}
}
}
Loading