#!/usr/bin/env nodeconstfs=require('fs');constproc=require('child_process');constsemver=require('semver');construn=(cmd,...args)=>proc.execFileSync(cmd,args,{encoding:'utf8'}).trim();constgitStatus=run('git','status','--porcelain','-uno','contracts/**/*.sol');if(gitStatus.length>0){console.error('Contracts directory is not clean');process.exit(1);}const{version}=require('../../package.json');// Get latest tag according to semver.const[tag]=run('git','tag').split(/\r?\n/).filter(semver.coerce)// check version can be processed.filter(v=>semver.satisfies(v,`< ${version}`))// ignores prereleases unless currently a prerelease.sort(semver.rcompare);// Ordering tag → HEAD is important here.constfiles=run('git','diff',tag,'HEAD','--name-only','contracts/**/*.sol').split(/\r?\n/).filter(file=>file&&!file.match(/mock/i)&&fs.existsSync(file));for(constfileoffiles){constcurrent=fs.readFileSync(file,'utf8');constupdated=current.replace(/(\/\/ SPDX-License-Identifier:.*)$(\n\/\/ OpenZeppelin Contracts .*$)?/m,`$1\n// OpenZeppelin Contracts (last updated v${version}) (${file.replace('contracts/','')})`,);fs.writeFileSync(file,updated);}