Skip to content
5 changes: 5 additions & 0 deletions .changeset/ten-dodos-do.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@fuel-bridge/solidity-contracts': patch
---

upgrade chainstate contract (testnet and devnet)
32 changes: 30 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,8 @@
"@fuels/eslint-plugin": "0.20.0",
"@fuels/prettier-config": "0.0.10",
"@fuels/ts-config": "0.0.10",
"fuels": "0.96.1",
"eslint": "^8.49.0",
"fuels": "0.96.1",
"prettier": "^2.7.1",
"tsup": "^8.3.0",
"tsx": "^3.12.7",
Expand All @@ -49,7 +49,35 @@
"elliptic@>=2.0.0 <=6.5.6": ">=6.5.7",
"elliptic@>=5.2.1 <=6.5.6": ">=6.5.7",
"micromatch@<4.0.8": ">=4.0.8",
"cross-spawn@>=7.0.0 <7.0.5": ">=7.0.5"
"cross-spawn@>=7.0.0 <7.0.5": ">=7.0.5",
"body-parser@<1.20.3": ">=1.20.3",
"rollup@>=4.0.0 <4.22.4": ">=4.22.4",
"secp256k1@>=4.0.0 <4.0.4": ">=4.0.4",
"send@<0.19.0": ">=0.19.0",
"serve-static@<1.16.0": ">=1.16.0",
"express@<4.20.0": ">=4.20.0",
"undici@>=6.0.0 <6.21.1": ">=6.21.1",
"undici@>=4.5.0 <5.28.5": ">=5.28.5",
"path-to-regexp@<0.1.10": ">=0.1.10",
"esbuild@<=0.24.2": ">=0.25.0",
"elliptic@<=6.6.0": ">=6.6.1",
"axios@>=1.0.0 <1.8.2": ">=1.8.2",
"cookie@<0.7.0": ">=0.7.0",
"@babel/runtime@<7.26.10": ">=7.26.10",
"base-x@<=3.0.10": ">=3.0.11",
"undici@>=6.0.0 <6.21.2": ">=6.21.2",
"undici@<5.29.0": ">=5.29.0",
"cross-spawn@<6.0.6": ">=6.0.6",
"tar-fs@>=2.0.0 <2.1.2": ">=2.1.2",
"path-to-regexp@<0.1.12": ">=0.1.12",
"serialize-javascript@>=6.0.0 <6.0.2": ">=6.0.2",
"pbkdf2@<=3.1.2": ">=3.1.3",
"pbkdf2@>=3.0.10 <=3.1.2": ">=3.1.3",
"elliptic@<6.6.0": ">=6.6.0",
"form-data": "4.0.4",
"tmp@<=0.2.3": ">=0.2.4",
"tar-fs@>=3.0.0 <3.0.9": ">=3.0.9",
"tar-fs@>=2.0.0 <2.1.3": ">=2.1.3"
}
}
}
201 changes: 201 additions & 0 deletions packages/solidity-contracts/.openzeppelin/sepolia.json
Original file line number Diff line number Diff line change
Expand Up @@ -4799,6 +4799,207 @@
},
"namespaces": {}
}
},
"a04a684b92e3802503ed06c7c7ab43e8e88ecd9ec8b9bf880780da26a167eb2a": {
"address": "0x16Ca371B16DD8EE495142d0229E6A2525F6385BA",
"txHash": "0xcc095021876f79d88c75d34329e34acd6db62536061087a1027cfb16f7ab5a85",
"layout": {
"solcVersion": "0.8.24",
"storage": [
{
"label": "_initialized",
"offset": 0,
"slot": "0",
"type": "t_uint8",
"contract": "Initializable",
"src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:63",
"retypedFrom": "bool"
},
{
"label": "_initializing",
"offset": 1,
"slot": "0",
"type": "t_bool",
"contract": "Initializable",
"src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:68"
},
{
"label": "__gap",
"offset": 0,
"slot": "1",
"type": "t_array(t_uint256)50_storage",
"contract": "ContextUpgradeable",
"src": "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol:40"
},
{
"label": "_paused",
"offset": 0,
"slot": "51",
"type": "t_bool",
"contract": "PausableUpgradeable",
"src": "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol:29"
},
{
"label": "__gap",
"offset": 0,
"slot": "52",
"type": "t_array(t_uint256)49_storage",
"contract": "PausableUpgradeable",
"src": "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol:116"
},
{
"label": "__gap",
"offset": 0,
"slot": "101",
"type": "t_array(t_uint256)50_storage",
"contract": "ERC165Upgradeable",
"src": "@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol:41"
},
{
"label": "_roles",
"offset": 0,
"slot": "151",
"type": "t_mapping(t_bytes32,t_struct(RoleData)23_storage)",
"contract": "AccessControlUpgradeable",
"src": "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol:57"
},
{
"label": "__gap",
"offset": 0,
"slot": "152",
"type": "t_array(t_uint256)49_storage",
"contract": "AccessControlUpgradeable",
"src": "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol:260"
},
{
"label": "__gap",
"offset": 0,
"slot": "201",
"type": "t_array(t_uint256)50_storage",
"contract": "ERC1967UpgradeUpgradeable",
"src": "@openzeppelin/contracts-upgradeable/proxy/ERC1967/ERC1967UpgradeUpgradeable.sol:169"
},
{
"label": "__gap",
"offset": 0,
"slot": "251",
"type": "t_array(t_uint256)50_storage",
"contract": "UUPSUpgradeable",
"src": "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol:111"
},
{
"label": "_commitSlots",
"offset": 0,
"slot": "301",
"type": "t_array(t_struct(Commit)8187_storage)240_storage",
"contract": "FuelChainState",
"src": "contracts/fuelchain/FuelChainState.sol:67"
}
],
"types": {
"t_address": {
"label": "address",
"numberOfBytes": "20"
},
"t_array(t_struct(Commit)8187_storage)240_storage": {
"label": "struct Commit[240]",
"numberOfBytes": "15360"
},
"t_array(t_uint256)49_storage": {
"label": "uint256[49]",
"numberOfBytes": "1568"
},
"t_array(t_uint256)50_storage": {
"label": "uint256[50]",
"numberOfBytes": "1600"
},
"t_bool": {
"label": "bool",
"numberOfBytes": "1"
},
"t_bytes32": {
"label": "bytes32",
"numberOfBytes": "32"
},
"t_mapping(t_address,t_bool)": {
"label": "mapping(address => bool)",
"numberOfBytes": "32"
},
"t_mapping(t_bytes32,t_struct(RoleData)23_storage)": {
"label": "mapping(bytes32 => struct AccessControlUpgradeable.RoleData)",
"numberOfBytes": "32"
},
"t_struct(Commit)8187_storage": {
"label": "struct Commit",
"members": [
{
"label": "blockHash",
"type": "t_bytes32",
"offset": 0,
"slot": "0"
},
{
"label": "timestamp",
"type": "t_uint32",
"offset": 0,
"slot": "1"
},
{
"label": "reserved1",
"type": "t_address",
"offset": 4,
"slot": "1"
},
{
"label": "reserved2",
"type": "t_uint16",
"offset": 24,
"slot": "1"
}
],
"numberOfBytes": "64"
},
"t_struct(RoleData)23_storage": {
"label": "struct AccessControlUpgradeable.RoleData",
"members": [
{
"label": "members",
"type": "t_mapping(t_address,t_bool)",
"offset": 0,
"slot": "0"
},
{
"label": "adminRole",
"type": "t_bytes32",
"offset": 0,
"slot": "1"
}
],
"numberOfBytes": "64"
},
"t_uint16": {
"label": "uint16",
"numberOfBytes": "2"
},
"t_uint256": {
"label": "uint256",
"numberOfBytes": "32"
},
"t_uint32": {
"label": "uint32",
"numberOfBytes": "4"
},
"t_uint8": {
"label": "uint8",
"numberOfBytes": "1"
}
},
"namespaces": {}
},
"allAddresses": [
"0x16Ca371B16DD8EE495142d0229E6A2525F6385BA",
"0x672313F262172Ed48Ac1d4df1fCB8D8154a93A9B"
]
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
import type { TransactionResponse } from 'ethers';
import type { HardhatRuntimeEnvironment } from 'hardhat/types';
import type { DeployFunction } from 'hardhat-deploy/dist/types';

import { FuelChainState__factory as FuelChainState } from '../../typechain';

const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) {
const {
upgrades: { prepareUpgrade },
deployments: { save },
} = hre;

console.log("Upgrading FuelChainState contract");

const contractDeployment = await hre.deployments.get('FuelChainState');

const BLOCKS_PER_COMMIT_INTERVAL = 10800;
const TIME_TO_FINALIZE = 3600 * 24;
const COMMIT_COOLDOWN = TIME_TO_FINALIZE;

const constructorArgs = [
TIME_TO_FINALIZE,
BLOCKS_PER_COMMIT_INTERVAL,
COMMIT_COOLDOWN,
];

const factory = await hre.ethers.getContractFactory('FuelChainState');

const response = (await prepareUpgrade(contractDeployment.address, factory, {
kind: 'uups',
constructorArgs,
getTxResponse: true,
redeployImplementation: 'always',
})) as TransactionResponse;

const receipt = await hre.ethers.provider.getTransactionReceipt(
response.hash
);

const implementation = receipt?.contractAddress ?? '';

if (implementation === '')
throw new Error(
`Upgrade proposal failed for FuelChainState proxy (${contractDeployment.address})`
);

await save('FuelChainState', {
address: contractDeployment.address,
abi: [...FuelChainState.abi],
implementation,
transactionHash: response.hash,
linkedData: {
constructorArgs,
factory: 'FuelChainState',
},
});
console.log(`FuelChainState upgraded to ${implementation}`);
};

func.tags = ['prepare_upgrade_chain_state_time_finalize'];
func.id = 'prepare_upgrade_chain_state_time_finalize';
export default func;
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
import type { TransactionResponse } from 'ethers';
import type { HardhatRuntimeEnvironment } from 'hardhat/types';
import type { DeployFunction } from 'hardhat-deploy/dist/types';

import { FuelChainState__factory as FuelChainState } from '../../typechain';

const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) {
const {
upgrades: { prepareUpgrade },
deployments: { save },
} = hre;

console.log("Upgrading FuelChainState contract");

const contractDeployment = await hre.deployments.get('FuelChainState');

const BLOCKS_PER_COMMIT_INTERVAL = 10800;
const TIME_TO_FINALIZE = 3600 * 24;
const COMMIT_COOLDOWN = TIME_TO_FINALIZE;

const constructorArgs = [
TIME_TO_FINALIZE,
BLOCKS_PER_COMMIT_INTERVAL,
COMMIT_COOLDOWN,
];

const factory = await hre.ethers.getContractFactory('FuelChainState');

const response = (await prepareUpgrade(contractDeployment.address, factory, {
kind: 'uups',
constructorArgs,
getTxResponse: true,
redeployImplementation: 'always',
})) as TransactionResponse;

const receipt = await hre.ethers.provider.getTransactionReceipt(
response.hash
);

const implementation = receipt?.contractAddress ?? '';

if (implementation === '')
throw new Error(
`Upgrade proposal failed for FuelChainState proxy (${contractDeployment.address})`
);

console.log(`FuelChainState upgraded to ${implementation}`);

await save('FuelChainState', {
address: contractDeployment.address,
abi: [...FuelChainState.abi],
implementation,
transactionHash: response.hash,
linkedData: {
constructorArgs,
factory: 'FuelChainState',
},
});
};

func.tags = ['prepare_upgrade_chain_state_time_finalize'];
func.id = 'prepare_upgrade_chain_state_time_finalize';
export default func;
Loading
Loading