Skip to content

Commit

Permalink
update script
Browse files Browse the repository at this point in the history
  • Loading branch information
mirooon committed Feb 21, 2025
1 parent e2b0ccf commit cf4d2be
Showing 1 changed file with 79 additions and 96 deletions.
175 changes: 79 additions & 96 deletions script/deploy/updateNetworkDeploymentFile.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,6 @@ import toml from 'toml' // make sure to install this: npm install toml
import { Address, PublicClient, createPublicClient, http } from 'viem'
import { getViemChainForNetworkName } from '../utils/viemScriptHelpers'

const contractsWithoutVersioning = ['DiamondCutFacet', 'DiamondLoupeFacet'] // TODO put more

const main = defineCommand({
meta: {
name: 'LIFI Diamond Deployment File Update',
Expand Down Expand Up @@ -132,14 +130,32 @@ const main = defineCommand({
onChainRegisteredFacetContractAddress,
network
)
const onChainRegisteredFacetContractName =
let onChainRegisteredFacetContractName =
onChainRegisteredFacetContractData.ContractName
if (!onChainRegisteredFacetContractName) {
// TODO try to verify contract
// if contract name is null it means that contract is not verified and script couldn't get the name from the explorer. Warn developer
consola.error(
`${onChainRegisteredFacetContractName}: Skipping... No contract name found. Probably not verified`
`No contract name found for registered facet contract with address ${onChainRegisteredFacetContractAddress} was found in explorer. Please verify contract`
)
continue
// now find if there is a name for this address in deploy log
const deployLogContractName = Object.keys(
networkDeployLogContracts
).find(
(name) =>
networkDeployLogContracts[name].toLowerCase() ===
onChainRegisteredFacetContractAddress.toLowerCase()
)
if (!deployLogContractName) {
consola.error(
`As contract with address ${onChainRegisteredFacetContractAddress} doesnt exist in deploy log. It cannot be added to deploy log but it should be added. Please verify contract and run script again.`
)
continue
} else {
consola.info(
`As contract with address ${onChainRegisteredFacetContractAddress} was found in deploy log (contract name: ${deployLogContractName}) it means that deploy log is up to date for this contract. Contract still needs to be verified`
)
onChainRegisteredFacetContractName = deployLogContractName
}
}

const deployLogContractAddress = networkDeployLogContracts[
Expand All @@ -149,83 +165,59 @@ const main = defineCommand({
onChainRegisteredFacetContractName
].toLowerCase()
: null
// fetching repo facet contract version

// Try to find the contract file in the src folder
const contractFilePath = findContractFile(
`src`,
'src',
onChainRegisteredFacetContractName
)
if (!contractFilePath) {
consola.error(
`${onChainRegisteredFacetContractName}: Contract ${onChainRegisteredFacetContractName} registered in the diamond but contract file couldn't be found in src/ folder.`
)
// try to find in archive
// Try to find in the archive folder
const contractFilePathInArchive = findContractFile(
`archive`,
'archive',
onChainRegisteredFacetContractName
)
if (contractFilePathInArchive) {
consola.error(
`but file found in archive/ folder. Please remove facet from diamond.`
`File found in archive/ folder. Please remove facet from diamond.`
)
}
continue
}

// Read the contract's source code
const contractSourceCode = fs.readFileSync(contractFilePath, 'utf8')
// Extract version from the source code using the custom tag
const repoVersion = extractVersion(contractSourceCode)
if (!repoVersion) {
consola.error(
`${onChainRegisteredFacetContractName}: Contract ${onChainRegisteredFacetContractName} registered in the diamond but no contract version found in ${contractFilePath}.`
)
continue
return null
}

consola.info(
`${onChainRegisteredFacetContractName}: Checking if ${onChainRegisteredFacetContractName} already exists in ${network}.json...`
)

const hasVersion = !contractsWithoutVersioning.includes(
onChainRegisteredFacetContractName
)
if (deployLogContractAddress) {
// contract with the same name exists in the config file
if (
deployLogContractAddress == onChainRegisteredFacetContractAddress
) {
// on chain registered deployed facet contract is the same contract as in deploy log
if (hasVersion) {
const deployLogFacetContractData = await fetchContractDetails(
baseUrl,
deployLogContractAddress,
network
)
console.log('here1.1')
const deployLogFacetContractVersion = extractVersion(
deployLogFacetContractData.SourceCode
)
console.log('here1.1')
if (deployLogFacetContractVersion == null) {
consola.error(
`Contract ${onChainRegisteredFacetContractName} registered in the diamond but no contract version found in ${contractFilePath}.`
)
continue
}
console.log('here1.1')
// need to only warn if there is newer version in the repo
if (repoVersion) {
const onChainRegisteredFacetContractVersion = extractVersion(
onChainRegisteredFacetContractData.SourceCode
)
console.log('here1.1')
if (onChainRegisteredFacetContractVersion == null) {
consola.error(
`Contract ${onChainRegisteredFacetContractName} registered in the diamond but no contract version found for address ${onChainRegisteredFacetContractAddress}.`
)
continue
}

// warn if there is newer version in the repo
if (
compareVersions(
isVersionNewer(
repoVersion,
onChainRegisteredFacetContractVersion
)
Expand All @@ -243,74 +235,71 @@ const main = defineCommand({
} else {
// on chain registered facet has different address than in deploy log
consola.error(
`Contract ${onChainRegisteredFacetContractName}: Invalid deploy log contract address`
`Contract ${onChainRegisteredFacetContractName}: Address mismatch`
)
consola.info(`Checking versions...`)
if (hasVersion) {
if (repoVersion) {
const deployLogFacetContractData = await fetchContractDetails(
baseUrl,
deployLogContractAddress,
network
)
console.log('here1.1')
const deployLogFacetContractVersion = extractVersion(
deployLogFacetContractData.SourceCode
)
console.log('here1.1')
if (deployLogFacetContractVersion == null) {
consola.error(
`Contract ${onChainRegisteredFacetContractName} registered in the diamond but no contract version found in ${contractFilePath}.`
)
continue
}
console.log('here1.1')
const onChainRegisteredFacetContractVersion = extractVersion(
onChainRegisteredFacetContractData.SourceCode
)
console.log('here1.1')
if (onChainRegisteredFacetContractVersion == null) {
consola.error(
`Contract ${onChainRegisteredFacetContractName} registered in the diamond but no contract version found for address ${onChainRegisteredFacetContractAddress}.`
)
continue
}

consola.log('dfsgdfgfdgfd')
consola.log(onChainRegisteredFacetContractVersion)
consola.log(deployLogFacetContractVersion)
if (
compareVersions(
isVersionNewer(
onChainRegisteredFacetContractVersion,
deployLogFacetContractVersion
)
) {
// warn if there is newer version in the repo
consola.warn(
`${onChainRegisteredFacetContractName}: Found newer version on chain for ${onChainRegisteredFacetContractName} contract. On chain registered facet contract address: ${onChainRegisteredFacetContractAddress} with version ${onChainRegisteredFacetContractVersion}, Deploy log version ${deployLogFacetContractVersion}. Updating deploy log ${onChainRegisteredFacetContractName} contract address. ${deployLogContractAddress} -> ${onChainRegisteredFacetContractAddress}`
`${onChainRegisteredFacetContractName}: Found newer version on chain for ${onChainRegisteredFacetContractName} contract. On chain registered facet contract address: ${onChainRegisteredFacetContractAddress} with version ${showVersion(
onChainRegisteredFacetContractVersion
)}, Deploy log contract address ${deployLogContractAddress} with version ${showVersion(
deployLogFacetContractVersion
)}. Updating deploy log ${onChainRegisteredFacetContractName} contract address. ${deployLogContractAddress} -> ${onChainRegisteredFacetContractAddress}`
)
networkDeployLogContracts[onChainRegisteredFacetContractName] =
onChainRegisteredFacetContractAddress // update deploy log
if (
compareVersions(
isVersionNewer(
repoVersion,
onChainRegisteredFacetContractVersion
)
) {
consola.warn(
`${onChainRegisteredFacetContractName}: There is newer version in the repo for ${onChainRegisteredFacetContractName} contract. Onchain version ${onChainRegisteredFacetContractVersion}, repo version ${repoVersion}`
`${onChainRegisteredFacetContractName}: There is newer version in the repo for ${onChainRegisteredFacetContractName} contract. Onchain version ${showVersion(
onChainRegisteredFacetContractVersion
)}, repo version ${showVersion(repoVersion)}`
)
}
} else if (
compareVersions(
isVersionNewer(
deployLogFacetContractVersion,
onChainRegisteredFacetContractVersion
)
) {
consola.error(
`${onChainRegisteredFacetContractName}: Found newer version on deploy log for ${onChainRegisteredFacetContractName} contract. On chain registered facet contract address: ${onChainRegisteredFacetContractAddress} with version ${onChainRegisteredFacetContractVersion}, Deploy log version ${deployLogFacetContractVersion}. Please update diamond with newer version in deploy log. ${onChainRegisteredFacetContractAddress} -> ${deployLogContractAddress}`
`${onChainRegisteredFacetContractName}: Found newer version on deploy log for ${onChainRegisteredFacetContractName} contract. On chain registered facet contract address: ${onChainRegisteredFacetContractAddress} with version ${showVersion(
onChainRegisteredFacetContractVersion
)}, Deploy log contract address ${deployLogContractAddress} with version ${deployLogFacetContractVersion}. Please update diamond with newer version in deploy log. ${onChainRegisteredFacetContractAddress} -> ${deployLogContractAddress}`
)
if (
compareVersions(repoVersion, deployLogFacetContractVersion)
isVersionNewer(repoVersion, deployLogFacetContractVersion)
) {
consola.warn(
`${onChainRegisteredFacetContractName}: There is newer version in the repo for ${onChainRegisteredFacetContractName} contract. Deploy log version ${deployLogFacetContractVersion}, repo version ${repoVersion}`
`${onChainRegisteredFacetContractName}: There is newer version in the repo for ${onChainRegisteredFacetContractName} contract. Deploy log version ${showVersion(
deployLogFacetContractVersion
)}, repo version: ${showVersion(repoVersion)}`
)
}
} else {
Expand All @@ -327,30 +316,24 @@ const main = defineCommand({
)
}
}
// consola.info("here1");
// // fetching {network}.json facet contract version
// if (hasVersion) {
// console.log("here1.1");
// // fetching config facet contract
// const deployLogFacetContractData = await fetchContractDetails(
// baseUrl,
// deployLogContractAddress,
// network
// )
// console.log("here1.2");
// const deployLogFacetContractVersion = extractVersion(
// deployLogFacetContractData.SourceCode
// )
// console.log("here1.2.1");
// if (deployLogFacetContractVersion == null) {
// consola.error(`Contract ${onChainRegisteredFacetContractName} registered in the diamond but no contract version found in ${contractFilePath}.`)
// continue
// }
// console.log("here1.3");
// const onChainRegisteredFacetContractVersion = extractVersion(
// onChainRegisteredFacetContractData.SourceCode
// )
// console.log("here1.4");
// if (onChainRegisteredFacetContractVersion == null) {
// consola.error(`Contract ${onChainRegisteredFacetContractName} registered in the diamond but no contract version found for address ${onChainRegisteredFacetContractAddress}.`)
// continue
Expand Down Expand Up @@ -409,14 +392,11 @@ const main = defineCommand({
// }
// }
// else {
// console.log("here2");
// // TODO verification with bytecode if matches
// consola.error(
// `${onChainRegisteredFacetContractName}: Because contract ${onChainRegisteredFacetContractName} is without versioning it's impossible to verify if it is up to date`
// );
// console.log("here3");
// if(deployLogContractAddress != onChainRegisteredFacetContractAddress) { // deploy log address and on chain registered facet contract address dont match
// console.log("here3.1");
// consola.error(
// `${onChainRegisteredFacetContractName}: On chain registered facet address is different that what is in {network}.json. On chain registered facet contract address: ${onChainRegisteredFacetContractAddress}. Deploy log facet contract address: ${deployLogContractAddress}`
// );
Expand All @@ -425,9 +405,7 @@ const main = defineCommand({
// deployLogContractAddress,
// network
// )
// console.log("here3.2");
// if(deployLogFacetContractData.SourceCode == onChainRegisteredFacetContractData.SourceCode) {
// console.log("here3.3");
// // TODO check with repo source code?
// consola.info(
// `${onChainRegisteredFacetContractName}: But they have the same source codes`
Expand All @@ -449,26 +427,18 @@ const main = defineCommand({
)
networkDeployLogContracts[onChainRegisteredFacetContractName] =
onChainRegisteredFacetContractAddress // update deploy log
if (hasVersion) {
if (repoVersion) {
// fetching onchain facet contract

const onChainRegisteredFacetContractVersion = extractVersion(
onChainRegisteredFacetContractData.SourceCode
)
if (onChainRegisteredFacetContractVersion == null) {
consola.error(
`Contract ${onChainRegisteredFacetContractName} registered in the diamond but no contract version found for address ${onChainRegisteredFacetContractAddress}.`
)
continue
}
if (
compareVersions(
repoVersion,
onChainRegisteredFacetContractVersion
)
isVersionNewer(repoVersion, onChainRegisteredFacetContractVersion)
) {
consola.warn(
`${onChainRegisteredFacetContractName}: There is newer version in the repo for ${onChainRegisteredFacetContractName} contract. Onchain version ${onChainRegisteredFacetContractVersion}, repo version ${repoVersion}`
`${onChainRegisteredFacetContractName}: There is newer version in the repo for ${onChainRegisteredFacetContractName} contract. Onchain version ${showVersion(
onChainRegisteredFacetContractVersion
)}, repo version ${showVersion(repoVersion)}`
)
}
} else {
Expand Down Expand Up @@ -617,17 +587,30 @@ function parseVersion(version: string): number[] {
return version.split('.').map((num) => parseInt(num, 10) || 0)
}

function compareVersions(versionA: string, versionB: string): number {
function isVersionNewer(
versionA: string | null,
versionB: string | null
): boolean {
// If versionA is null, we can't consider it newer.
if (versionA === null) return false
// If versionB is null, versionA is considered newer.
if (versionB === null) return true

const aParts = parseVersion(versionA)
const bParts = parseVersion(versionB)

// Compare each segment
for (let i = 0; i < 3; i++) {
const a = aParts[i] || 0 // default to 0 if missing
const a = aParts[i] || 0
const b = bParts[i] || 0
if (a > b) return 1 // versionA is greater
if (a < b) return -1 // versionB is greater
if (a > b) return true
if (a < b) return false
}
return 0 // versions are equal
return false // Versions are equal
}

function showVersion(version: string | null): string {
return version === null ? "'No version'" : `'${version}'`
}

const checkIsDeployed = async (
Expand Down

0 comments on commit cf4d2be

Please sign in to comment.