From 6de5d051119c139645eed9f1f9bff9f0363029e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=ADn=20Volpe?= Date: Mon, 24 Jul 2023 19:33:22 +0200 Subject: [PATCH] Made the report look for many artifacts folders, test will still fail (bc they were not updated) --- packages/protocol/lib/bytecode.ts | 4 ++ .../protocol/lib/compatibility/ast-code.ts | 23 ++++++---- .../protocol/lib/compatibility/ast-layout.ts | 43 +++++++++++-------- .../protocol/lib/compatibility/ast-version.ts | 18 +++++--- packages/protocol/lib/compatibility/utils.ts | 8 ++-- packages/protocol/scripts/check-backward.ts | 10 +++-- 6 files changed, 66 insertions(+), 40 deletions(-) diff --git a/packages/protocol/lib/bytecode.ts b/packages/protocol/lib/bytecode.ts index 2a0dfe3603b..6afae135a3f 100644 --- a/packages/protocol/lib/bytecode.ts +++ b/packages/protocol/lib/bytecode.ts @@ -12,6 +12,10 @@ const CONTRACT_METADATA_REGEXPS = [ 'a165627a7a72305820.{64}0029', // 0.5.13 'a265627a7a72315820.{64}64736f6c6343.{6}0032', + + 'a264697066735822.{64}64736f6c6343.{6}0033', + + 'a264697066735822.{68}64736f6c6343.{6}0033' ] const GENERAL_METADATA_REGEXP = new RegExp( diff --git a/packages/protocol/lib/compatibility/ast-code.ts b/packages/protocol/lib/compatibility/ast-code.ts index ae8e71d5d69..ab82999a8de 100644 --- a/packages/protocol/lib/compatibility/ast-code.ts +++ b/packages/protocol/lib/compatibility/ast-code.ts @@ -251,12 +251,19 @@ function generateASTCompatibilityReport(oldContract: ZContract, oldArtifacts: Bu */ export function reportASTIncompatibilities( oldArtifacts: BuildArtifacts, - newArtifacts: BuildArtifacts): ASTCodeCompatibilityReport { - const reports = newArtifacts.listArtifacts() - .map((newArtifact) => { - const oldArtifact = oldArtifacts.getArtifactByName(newArtifact.contractName) - const oldZContract = oldArtifact ? makeZContract(oldArtifact) : null - return generateASTCompatibilityReport(oldZContract, oldArtifacts, makeZContract(newArtifact), newArtifacts) - }) - return mergeReports(reports) + newArtifactsSets: BuildArtifacts[]): ASTCodeCompatibilityReport { + + let out:ASTCodeCompatibilityReport[] = [] + for (const newArtifacts of newArtifactsSets){ + const reports = newArtifacts.listArtifacts() + .map((newArtifact) => { + const oldArtifact = oldArtifacts.getArtifactByName(newArtifact.contractName) + const oldZContract = oldArtifact ? makeZContract(oldArtifact) : null + return generateASTCompatibilityReport(oldZContract, oldArtifacts, makeZContract(newArtifact), newArtifacts) + }) + out = [...out, ...reports] + + } + + return mergeReports(out) } diff --git a/packages/protocol/lib/compatibility/ast-layout.ts b/packages/protocol/lib/compatibility/ast-layout.ts index 77c3edf5623..ec0fa1b738d 100644 --- a/packages/protocol/lib/compatibility/ast-layout.ts +++ b/packages/protocol/lib/compatibility/ast-layout.ts @@ -2,11 +2,11 @@ import { Contract as Web3Contract } from '@celo/connect'; import { Artifact, TypeInfo } from '@celo/protocol/lib/compatibility/internal'; import { BuildArtifacts, - compareStorageLayouts, - Contract as ZContract, - getStorageLayout, Operation, - StorageLayoutInfo + StorageLayoutInfo, + Contract as ZContract, + compareStorageLayouts, + getStorageLayout } from '@openzeppelin/upgrades'; const Web3 = require('web3') @@ -198,6 +198,7 @@ export const generateCompatibilityReport = (oldArtifact: Artifact, oldArtifacts const newLayout = getLayout(newArtifact, newArtifacts) const layoutReport = generateLayoutCompatibilityReport(oldLayout, newLayout) const structsReport = generateStructsCompatibilityReport(oldLayout, newLayout) + return { contract: newArtifact.contractName, compatible: layoutReport.compatible && structsReport.compatible, @@ -206,19 +207,25 @@ export const generateCompatibilityReport = (oldArtifact: Artifact, oldArtifacts } } -export const reportLayoutIncompatibilities = (oldArtifacts: BuildArtifacts, newArtifacts: BuildArtifacts): ASTStorageCompatibilityReport[] => { - return newArtifacts.listArtifacts().map((newArtifact) => { - const oldArtifact = oldArtifacts.getArtifactByName(newArtifact.contractName) - if (oldArtifact !== undefined) { - return generateCompatibilityReport(oldArtifact, oldArtifacts, newArtifact, newArtifacts) - } else { - // Generate an empty report for new contracts, which are, by definition, backwards - // compatible. - return { - contract: newArtifact.contractName, - compatible: true, - errors: [] +export const reportLayoutIncompatibilities = (oldArtifacts: BuildArtifacts, newArtifactsSets: BuildArtifacts[]): ASTStorageCompatibilityReport[] => { + let out: ASTStorageCompatibilityReport[] = [] + for (const newArtifacts of newArtifactsSets){ + const reports = newArtifacts.listArtifacts().map((newArtifact) => { + const oldArtifact = oldArtifacts.getArtifactByName(newArtifact.contractName) + if (oldArtifact !== undefined) { + return generateCompatibilityReport(oldArtifact, oldArtifacts, newArtifact, newArtifacts) + } else { + // Generate an empty report for new contracts, which are, by definition, backwards + // compatible. + return { + contract: newArtifact.contractName, + compatible: true, + errors: [] + } } - } - }) + }) + + out = [...out, ...reports] + } + return out } diff --git a/packages/protocol/lib/compatibility/ast-version.ts b/packages/protocol/lib/compatibility/ast-version.ts index f77785054a2..db246bb9234 100644 --- a/packages/protocol/lib/compatibility/ast-version.ts +++ b/packages/protocol/lib/compatibility/ast-version.ts @@ -11,12 +11,15 @@ const abi = require('ethereumjs-abi') * A mapping {contract name => {@link ContractVersion}}. */ export class ASTContractVersions { - static fromArtifacts = async (artifacts: BuildArtifacts): Promise=> { + static fromArtifacts = async (artifactsSet: BuildArtifacts[]): Promise=> { const contracts = {} - await Promise.all(artifacts.listArtifacts().filter(c => !isLibrary(c.contractName, artifacts)).map(async (artifact) => { - contracts[artifact.contractName] = await getContractVersion(artifact) - })) + for (const artifacts of artifactsSet){ + await Promise.all(artifacts.listArtifacts().filter(c => !isLibrary(c.contractName, [artifacts])).map(async (artifact) => { + contracts[artifact.contractName] = await getContractVersion(artifact) + })) + } + return new ASTContractVersions(contracts) } @@ -54,9 +57,9 @@ export async function getContractVersion(artifact: Artifact): Promise => { - const oldVersions = await ASTContractVersions.fromArtifacts(oldArtifacts) - const newVersions = await ASTContractVersions.fromArtifacts(newArtifacts) + static create = async (oldArtifacts: BuildArtifacts, newArtifactsSet: BuildArtifacts[], expectedVersionDeltas: ContractVersionDeltaIndex): Promise => { + const oldVersions = await ASTContractVersions.fromArtifacts([oldArtifacts]) + const newVersions = await ASTContractVersions.fromArtifacts(newArtifactsSet) const contracts = {} Object.keys(newVersions.contracts).map((contract:string) => { const versionDelta = expectedVersionDeltas[contract] === undefined ? ContractVersionDelta.fromChanges(false, false, false, false) : expectedVersionDeltas[contract] @@ -65,6 +68,7 @@ export class ASTContractVersionsChecker { }) return new ASTContractVersionsChecker(contracts) } + constructor(public readonly contracts: ContractVersionCheckerIndex) {} /** diff --git a/packages/protocol/lib/compatibility/utils.ts b/packages/protocol/lib/compatibility/utils.ts index df968c00abe..5482a3117eb 100644 --- a/packages/protocol/lib/compatibility/utils.ts +++ b/packages/protocol/lib/compatibility/utils.ts @@ -17,9 +17,9 @@ export class ASTBackwardReport { static create = ( oldArtifactsFolder: string, - newArtifactsFolder: string, + newArtifactsFolders: string[], oldArtifacts: BuildArtifacts, - newArtifacts: BuildArtifacts, + newArtifacts: BuildArtifacts[], exclude: RegExp, categorizer: Categorizer, logFunction: (msg: string) => void): ASTBackwardReport => { @@ -45,14 +45,14 @@ export class ASTBackwardReport { return new ASTBackwardReport( oldArtifactsFolder, - newArtifactsFolder, + newArtifactsFolders, exclude.toString(), versionedReport) } constructor( public readonly oldArtifactsFolder: string, - public readonly newArtifactsFolder: string, + public readonly newArtifactsFolder: string[], public readonly exclude: string, public readonly report: ASTDetailedVersionedReport ) {} diff --git a/packages/protocol/scripts/check-backward.ts b/packages/protocol/scripts/check-backward.ts index 66ad158bc05..df5b76b6358 100644 --- a/packages/protocol/scripts/check-backward.ts +++ b/packages/protocol/scripts/check-backward.ts @@ -51,6 +51,8 @@ const argv = yargs const oldArtifactsFolder = path.relative(process.cwd(), argv.old_contracts) const newArtifactsFolder = path.relative(process.cwd(), argv.new_contracts) +const newArtifactsFolder08 = path.relative(process.cwd(), argv.new_contracts + '-0.8') +const newArtifactsFolders = [newArtifactsFolder, newArtifactsFolder08] const out = (msg: string, force?: boolean): void => { if (force || !argv.quiet) { @@ -62,13 +64,15 @@ const outFile = argv.output_file ? argv.output_file : tmp.tmpNameSync({}) const exclude: RegExp = argv.exclude ? new RegExp(argv.exclude) : null const oldArtifacts = instantiateArtifacts(oldArtifactsFolder) const newArtifacts = instantiateArtifacts(newArtifactsFolder) +// console.log(newArtifactsFolder) +const newArtifacts08 = instantiateArtifacts(newArtifactsFolder08) try { const backward = ASTBackwardReport.create( oldArtifactsFolder, - newArtifactsFolder, + newArtifactsFolders, oldArtifacts, - newArtifacts, + [newArtifacts, newArtifacts08], exclude, new DefaultCategorizer(), out @@ -84,7 +88,7 @@ try { const doVersionCheck = async () => { const versionChecker = await ASTContractVersionsChecker.create( oldArtifacts, - newArtifacts, + [newArtifacts, newArtifacts08], backward.report.versionDeltas() ) const mismatches = versionChecker.excluding(exclude).mismatches()