hardhat-storage-layout-md
v0.0.2
Published
Hardhat TS plugin to generate a json file describing the storage layout of contracts
Downloads
3
Maintainers
Readme
hardhat-storage-layout-json
Hardhat TS plugin to generate a json file describing the storage layout of contracts 99% copied from hardhat-storage-layout, just added json output.
Generate Ethereum smart contract storage layout with Hardhat. This plugin saves time and avoids human error when a
developer tries to update a specific storage slot
in a remote solidity contract. For more info about the storage
layout, please refer to the official solidity documentation.
Installation
yarn add --dev hardhat-storage-layout-md
pnpm add hardhat-storage-layout-md --save-dev
Usage
- Add this plugin to
hardhat.config.js
:
require("hardhat-storage-layout-md");
- Or Add this plugin to
hardhat.config.ts
:
import 'hardhat-storage-layout-md';
- Set storage output path
const config: HardhatUserConfig = {
paths: {
artifacts: './artifacts',
sources: './contracts',
cache: './cache_hardhat',
newStorageLayoutPath: './storage_layout'
}
}
- Compile your contracts (Solc version must be greater than 0.5.13)
- Run
yarn hardhat check
Or
- Export the contracts storage layout prior deployment as follows:
const hre = require("hardhat");
async function main() {
await hre.storageLayout.export();
}
main().then(r =>{} )
┌─────────────────┬────────────────┬──────────────┬────────┬─────────────────────────────────────────────────────┬────────────────┐
│ contract │ state_variable │ storage_slot │ offset │ type │ numberOfBytes │
├─────────────────┼────────────────┼──────────────┼────────┼─────────────────────────────────────────────────────┤────────────────┤
│ ERC20 │ _balances │ 0 │ 0 │ t_mapping(t_address,t_uint256) │1 │
│ ERC20 │ _allowances │ 1 │ 0 │ t_mapping(t_address,t_mapping(t_address,t_uint256)) │1 │
│ ERC20 │ _totalSupply │ 2 │ 0 │ t_uint256 │1 │
│ ERC20 │ _name │ 3 │ 0 │ t_string_storage │1 │
│ ERC20 │ _symbol │ 4 │ 0 │ t_string_storage │1 │
│ WatermelonToken │ _balances │ 0 │ 0 │ t_mapping(t_address,t_uint256) │1 │
│ WatermelonToken │ _allowances │ 1 │ 0 │ t_mapping(t_address,t_mapping(t_address,t_uint256)) │1 │
│ WatermelonToken │ _totalSupply │ 2 │ 0 │ t_uint256 │1 │
│ WatermelonToken │ _name │ 3 │ 0 │ t_string_storage │1 │
│ WatermelonToken │ _symbol │ 4 │ 0 │ t_string_storage │1 │
└─────────────────┴────────────────┴──────────────┴────────┴─────────────────────────────────────────────────────┘────────────────┘
- contract: is the name of the contract including its path as prefix
- state variable: is the name of the state variable
- offset: is the offset in bytes within the storage slot according to the encoding
- storage slot: is the storage slot where the state variable resides or starts. This number may be very large and therefore its JSON value is represented as a string.
- type: is an identifier used as key to the variable’s type information (described in the following)
- numberOfBytes: is the nummber of bytes used by the state variable.