Scripts to support upgrades of smart contracts. The package contains common used functions for writing hardhat scripts for smart contracts deployment and upgrade.
To write an upgrade script extend Upgrader
class.
import { Upgrader } from "@skalenetwork/upgrade-tools";
class ExampleContractUpgrader extends Upgrader {
getDeployedVersion = async () => {
return await (await this.getExampleContract()).version();
};
setVersion = async (newVersion: string) => {
const exampleContract = await this.getExampleContract();
const setVersionTransaction = {
to: exampleContract.address,
data: exampleContract.interface.encodeFunctionData("setVersion", [newVersion])
};
this.transactions.push(setVersionTransaction);
}
async getExampleContract() {
return await ethers.getContractAt("ExampleContract", this.abi["example_contract_address"] as string);
}
}
async function main() {
const abi = JSON.parse(await fs.readFile(process.env.ABI, "utf-8")) as SkaleABIFile;
const upgrader = new ExampleContractUpgrader(
"ExampleContract",
"1.0.0",
abi,
["ExampleContract"]
);
await upgrader.upgrade();
}
if (require.main === module) {
main()
.then(() => process.exit(0))
.catch(error => {
console.error(error);
process.exit(1);
});
}
The Upgrader
has 2 abstract functions. It's mandatory to override them:
abstract getDeployedVersion: () => Promise<string | undefined>
abstract setVersion: (newVersion: string) => Promise<void>
getDeployedVersion
returns string representing a deployed version of the contractsetVersion
creates a transaction to set a new version of the contract
There are functions that may be overridden to customize an upgrade process
deployNewContracts = () => { return Promise.resolve() };
initialize = () => { return Promise.resolve() };
deployNewContracts
is called before proxies upgrade and is used to deploy new instancesinitialize
is called after proxies upgrade and is used to send initializing transactions