Commit 7a2870dc authored by inphi's avatar inphi

feat(ctb): add storage-layout and method ABI snapshots

parent c9eb360e
......@@ -432,6 +432,16 @@ jobs:
pnpm autogen:invariant-docs
git diff --exit-code ./invariant-docs/*.md || echo "export INVARIANT_DOCS_STATUS=1" >> "$BASH_ENV"
working_directory: packages/contracts-bedrock
- run:
name: abi snapshot
command: |
pnpm abi-snapshot
if [ $(git diff --exit-code snapshots) ]; then
[ -z git ls-files --others --exclude-standard ] || echo "export ABI_SNAPSHOT_STATUS=1" >> "$BASH_ENV"
else
echo "export ABI_SNAPSHOT_STATUS=1" >> "$BASH_ENV"
fi
working_directory: packages/contracts-bedrock
- run:
name: check statuses
command: |
......@@ -459,6 +469,10 @@ jobs:
echo "Deploy config check failed, see job output for details."
FAILED=1
fi
if [[ "$ABI_SNAPSHOT_STATUS" -ne 0 ]]; then
echo "ABI snapshot check failed, see job output for details."
FAILED=1
fi
if [[ "$FAILED" -ne 0 ]]; then
exit 1
fi
......
......@@ -24,6 +24,7 @@
"gas-snapshot:no-build": "forge snapshot --no-match-test 'testDiff|testFuzz|invariant|generateArtifact' --no-match-contract 'Initializer_Test'",
"gas-snapshot": "pnpm build:go-ffi && pnpm gas-snapshot:no-build",
"storage-snapshot": "./scripts/storage-snapshot.sh",
"abi-snapshot": "npx tsx scripts/generate-snapshots.sh",
"semver-lock": "forge script scripts/SemverLock.s.sol",
"validate-deploy-configs": "./scripts/check-deploy-configs.sh",
"validate-spacers:no-build": "npx tsx scripts/validate-spacers.ts",
......
import fs from 'fs'
import path from 'path'
const outdir = process.argv[2] || path.join(__dirname, '..', 'snapshots')
const forgeArtifactsDir = path.join(__dirname, '..', 'forge-artifacts')
// Assumes there is a single contract per file
const getContracts = (dir: string): Array<string> => {
return fs
.readdirSync(path.join(__dirname, '..', 'src', dir))
.filter((x) => x.endsWith('.sol'))
.map((x) => `${x}:${x.replace('.sol', '')}`)
.sort()
}
const getAllContracts = (): Array<string> => {
return [].concat(
getContracts('L1'),
getContracts('L2'),
getContracts('legacy'),
getContracts('dispute'),
getContracts('universal'),
getContracts('vendor')
)
}
type AbiSpecStorageLayoutEntry = {
slot: number
offset: number
}
type AbiSpecMethodIdentifiers = { [key: string]: string }
type AbiSpecStorageLayout = { [key: string]: AbiSpecStorageLayoutEntry }
type AbiSpecEntry = {
methodIdentifiers: AbiSpecMethodIdentifiers
storageLayout: AbiSpecStorageLayout
}
const sortKeys = (obj: any) => {
if (typeof obj !== 'object' || obj === null) {
return obj
}
return Object.keys(obj)
.sort()
.reduce(
(acc, key) => {
acc[key] = sortKeys(obj[key])
return acc
},
Array.isArray(obj) ? [] : {}
)
}
const main = async () => {
console.log(`writing abi spec to ${outdir}`)
fs.mkdirSync(outdir, { recursive: true })
const contracts = getAllContracts()
for (const contract of contracts) {
const toks = contract.split(':')
const contractFile = contract.split(':')[0]
const contractName = toks[1]
const storageLayout: AbiSpecStorageLayout = {}
let artifactFile = path.join(
forgeArtifactsDir,
contractFile,
`${contractName}.json`
)
// NOTE: Read the first version in the directory. We may want to assert that all version's ABIs are identical
if (!fs.existsSync(artifactFile)) {
const filename = fs.readdirSync(path.dirname(artifactFile))[0]
artifactFile = path.join(path.dirname(artifactFile), filename)
}
const data = fs.readFileSync(artifactFile)
const artifact = JSON.parse(data.toString())
// ignore abstract contracts
if (artifact.bytecode.object === '0x') {
console.log(`ignoring interface ${contractName}`)
continue
}
for (const storageEntry of artifact.storageLayout.storage) {
storageLayout[storageEntry.label] = {
slot: storageEntry.slot,
offset: storageEntry.offset,
}
}
const ids: AbiSpecMethodIdentifiers = {}
for (const [key, value] of Object.entries(artifact.methodIdentifiers)) {
ids[value as string] = key
}
const entry: AbiSpecEntry = {
methodIdentifiers: ids,
storageLayout,
}
fs.writeFileSync(
`${outdir}/${contractName}.json`,
JSON.stringify(sortKeys(entry), null, 2)
)
}
}
main()
{
"methodIdentifiers": {},
"storageLayout": {}
}
\ No newline at end of file
{
"methodIdentifiers": {
"715018a6": "renounceOwnership()",
"8da5cb5b": "owner()",
"9b2ea4bd": "setAddress(string,address)",
"bf40fac1": "getAddress(string)",
"f2fde38b": "transferOwnership(address)"
},
"storageLayout": {
"_owner": {
"offset": 0,
"slot": "0"
},
"addresses": {
"offset": 0,
"slot": "1"
}
}
}
\ No newline at end of file
{
"methodIdentifiers": {
"0d9019e1": "RECIPIENT()",
"3ccfd60b": "withdraw()",
"54fd4d50": "version()",
"84411d65": "totalProcessed()",
"d0e12f90": "WITHDRAWAL_NETWORK()",
"d3e5792b": "MIN_WITHDRAWAL_AMOUNT()"
},
"storageLayout": {
"totalProcessed": {
"offset": 0,
"slot": "0"
}
}
}
\ No newline at end of file
{
"methodIdentifiers": {
"54fd4d50": "version()",
"99d548aa": "load(uint256)",
"c2c4c5c1": "checkpoint()"
},
"storageLayout": {
"blocks": {
"offset": 0,
"slot": "0"
}
}
}
\ No newline at end of file
{
"methodIdentifiers": {
"54fd4d50": "version()",
"5c39fcc1": "initiator()",
"6a42b8f8": "delay()",
"b912de5d": "queuedAt(bytes32)",
"d4b83992": "target()",
"d8bff440": "vetoer()"
},
"storageLayout": {
"_delay": {
"offset": 0,
"slot": "0"
},
"_queuedAt": {
"offset": 0,
"slot": "1"
}
}
}
\ No newline at end of file
{
"methodIdentifiers": {
"08fd6322": "setWhitelistedDeployer(address,bool)",
"13af4035": "setOwner(address)",
"54fd4d50": "version()",
"8da5cb5b": "owner()",
"9b19251a": "whitelist(address)",
"b1540a01": "isDeployerAllowed(address)",
"bdc7b54f": "enableArbitraryContractDeployment()"
},
"storageLayout": {
"owner": {
"offset": 0,
"slot": "0"
},
"whitelist": {
"offset": 0,
"slot": "1"
}
}
}
\ No newline at end of file
{
"methodIdentifiers": {
"26daafbe": "getGameUUID(uint8,bytes32,bytes)",
"3142e55e": "create(uint8,bytes32,bytes)",
"45583b7a": "setImplementation(uint8,address)",
"4d1975b4": "gameCount()",
"54fd4d50": "version()",
"715018a6": "renounceOwnership()",
"8da5cb5b": "owner()",
"bb8aa1fc": "gameAtIndex(uint256)",
"c49d5271": "games(uint8,bytes32,bytes)",
"c4d66de8": "initialize(address)",
"dfa162d3": "gameImpls(uint8)",
"f2fde38b": "transferOwnership(address)"
},
"storageLayout": {
"__gap": {
"offset": 0,
"slot": "52"
},
"_disputeGameList": {
"offset": 0,
"slot": "103"
},
"_disputeGames": {
"offset": 0,
"slot": "102"
},
"_initialized": {
"offset": 0,
"slot": "0"
},
"_initializing": {
"offset": 1,
"slot": "0"
},
"_owner": {
"offset": 0,
"slot": "51"
},
"gameImpls": {
"offset": 0,
"slot": "101"
}
}
}
\ No newline at end of file
{
"methodIdentifiers": {
"92931298": "VM()",
"200d2ed2": "status()",
"266198f9": "ABSOLUTE_PRESTATE()",
"2810e1d6": "resolve()",
"298c9005": "l1BlockNumber()",
"35fef567": "defend(uint256,bytes32)",
"363cc427": "bondManager()",
"4778efe8": "MAX_GAME_DEPTH()",
"529184c9": "BLOCK_ORACLE()",
"54fd4d50": "version()",
"55ef20e6": "proposals()",
"609d3334": "extraData()",
"632247ea": "move(uint256,bytes32,bool)",
"6361506d": "l1Head()",
"8129fc1c": "initialize()",
"8980e0cc": "claimDataLen()",
"8b85902b": "l2BlockNumber()",
"bbdc02db": "gameType()",
"bcef3b55": "rootClaim()",
"c0c3a092": "L2_OUTPUT_ORACLE()",
"c31b29ce": "GAME_DURATION()",
"c55cd0c7": "attack(uint256,bytes32)",
"c6f0308c": "claimData(uint256)",
"cf09e0d0": "createdAt()",
"d8cc1a3c": "step(uint256,bool,bytes,bytes)",
"f8f43ff6": "addLocalData(uint256,uint256,uint256)",
"fa24f743": "gameData()",
"fdffbb28": "resolveClaim(uint256)"
},
"storageLayout": {
"bondManager": {
"offset": 9,
"slot": "0"
},
"claimData": {
"offset": 0,
"slot": "2"
},
"claims": {
"offset": 0,
"slot": "7"
},
"createdAt": {
"offset": 0,
"slot": "0"
},
"l1Head": {
"offset": 0,
"slot": "1"
},
"proposals": {
"offset": 0,
"slot": "3"
},
"status": {
"offset": 8,
"slot": "0"
},
"subgameAtRootResolved": {
"offset": 0,
"slot": "9"
},
"subgames": {
"offset": 0,
"slot": "8"
}
}
}
\ No newline at end of file
{
"methodIdentifiers": {
"0c18c162": "overhead()",
"2e0f2625": "DECIMALS()",
"313ce567": "decimals()",
"49948e0e": "getL1Fee(bytes)",
"519b4bd3": "l1BaseFee()",
"54fd4d50": "version()",
"6ef25c3a": "baseFee()",
"de26c4a1": "getL1GasUsed(bytes)",
"f45e65d8": "scalar()",
"fe173b97": "gasPrice()"
},
"storageLayout": {}
}
\ No newline at end of file
{
"methodIdentifiers": {
"015d8eb9": "setL1BlockValues(uint64,uint64,uint256,bytes32,uint64,bytes32,uint256,uint256)",
"09bd5a60": "hash()",
"54fd4d50": "version()",
"5cf24969": "basefee()",
"64ca23ef": "sequenceNumber()",
"8381f58a": "number()",
"8b239f73": "l1FeeOverhead()",
"9e8c4966": "l1FeeScalar()",
"b80777ea": "timestamp()",
"e591b282": "DEPOSITOR_ACCOUNT()",
"e81b2c6d": "batcherHash()"
},
"storageLayout": {
"basefee": {
"offset": 0,
"slot": "1"
},
"batcherHash": {
"offset": 0,
"slot": "4"
},
"hash": {
"offset": 0,
"slot": "2"
},
"l1FeeOverhead": {
"offset": 0,
"slot": "5"
},
"l1FeeScalar": {
"offset": 0,
"slot": "6"
},
"number": {
"offset": 0,
"slot": "0"
},
"sequenceNumber": {
"offset": 0,
"slot": "3"
},
"timestamp": {
"offset": 8,
"slot": "0"
}
}
}
\ No newline at end of file
{
"methodIdentifiers": {
"54fd4d50": "version()",
"b9b3efe9": "getL1BlockNumber()"
},
"storageLayout": {}
}
\ No newline at end of file
{
"methodIdentifiers": {
"13af4035": "setOwner(address)",
"6c5d4ad0": "setCode(bytes)",
"893d20e8": "getOwner()",
"9b0b0fda": "setStorage(bytes32,bytes32)",
"aaf10f42": "getImplementation()"
},
"storageLayout": {}
}
\ No newline at end of file
{
"methodIdentifiers": {
"028f85f7": "MIN_GAS_CALLDATA_OVERHEAD()",
"0c568498": "MIN_GAS_DYNAMIC_OVERHEAD_DENOMINATOR()",
"0ff754ea": "PORTAL()",
"2828d7e8": "MIN_GAS_DYNAMIC_OVERHEAD_NUMERATOR()",
"3dbb202b": "sendMessage(address,bytes,uint32)",
"3f827a5a": "MESSAGE_VERSION()",
"4c1d6a69": "RELAY_CALL_OVERHEAD()",
"54fd4d50": "version()",
"5644cfdf": "RELAY_GAS_CHECK_BUFFER()",
"6425666b": "portal()",
"6e296e45": "xDomainMessageSender()",
"8129fc1c": "initialize()",
"83a74074": "RELAY_CONSTANT_OVERHEAD()",
"8cbeeef2": "RELAY_RESERVED_GAS()",
"9fce812c": "OTHER_MESSENGER()",
"a4e7f8bd": "failedMessages(bytes32)",
"b1b1b209": "successfulMessages(bytes32)",
"b28ade25": "baseGas(bytes,uint32)",
"d764ad0b": "relayMessage(uint256,address,address,uint256,uint256,bytes)",
"ecc70428": "messageNonce()"
},
"storageLayout": {
"__gap": {
"offset": 0,
"slot": "207"
},
"_initialized": {
"offset": 20,
"slot": "0"
},
"_initializing": {
"offset": 21,
"slot": "0"
},
"failedMessages": {
"offset": 0,
"slot": "206"
},
"msgNonce": {
"offset": 0,
"slot": "205"
},
"spacer_0_0_20": {
"offset": 0,
"slot": "0"
},
"spacer_101_0_1": {
"offset": 0,
"slot": "101"
},
"spacer_102_0_1568": {
"offset": 0,
"slot": "102"
},
"spacer_151_0_32": {
"offset": 0,
"slot": "151"
},
"spacer_152_0_1568": {
"offset": 0,
"slot": "152"
},
"spacer_1_0_1600": {
"offset": 0,
"slot": "1"
},
"spacer_201_0_32": {
"offset": 0,
"slot": "201"
},
"spacer_202_0_32": {
"offset": 0,
"slot": "202"
},
"spacer_51_0_20": {
"offset": 0,
"slot": "51"
},
"spacer_52_0_1568": {
"offset": 0,
"slot": "52"
},
"successfulMessages": {
"offset": 0,
"slot": "203"
},
"xDomainMsgSender": {
"offset": 0,
"slot": "204"
}
}
}
\ No newline at end of file
{
"methodIdentifiers": {
"3687011a": "bridgeERC721(address,address,uint256,uint32,bytes)",
"3cb747bf": "messenger()",
"54fd4d50": "version()",
"5d93a3fc": "deposits(address,address,uint256)",
"761f4493": "finalizeBridgeERC721(address,address,address,address,uint256,bytes)",
"7f46ddb2": "OTHER_BRIDGE()",
"927ede2d": "MESSENGER()",
"aa557452": "bridgeERC721To(address,address,address,uint256,uint32,bytes)",
"c89701a2": "otherBridge()"
},
"storageLayout": {
"__gap": {
"offset": 0,
"slot": "0"
},
"deposits": {
"offset": 0,
"slot": "49"
}
}
}
\ No newline at end of file
{
"methodIdentifiers": {
"0d9019e1": "RECIPIENT()",
"3ccfd60b": "withdraw()",
"54fd4d50": "version()",
"84411d65": "totalProcessed()",
"d0e12f90": "WITHDRAWAL_NETWORK()",
"d3e5792b": "MIN_WITHDRAWAL_AMOUNT()"
},
"storageLayout": {
"totalProcessed": {
"offset": 0,
"slot": "0"
}
}
}
\ No newline at end of file
{
"methodIdentifiers": {
"87087623": "bridgeERC20(address,address,uint256,uint32,bytes)",
"0166a07a": "finalizeBridgeERC20(address,address,address,address,uint256,bytes)",
"09fc8843": "bridgeETH(uint32,bytes)",
"1532ec34": "finalizeETHWithdrawal(address,address,uint256,bytes)",
"1635f5fd": "finalizeBridgeETH(address,address,uint256,bytes)",
"3cb747bf": "messenger()",
"540abf73": "bridgeERC20To(address,address,address,uint256,uint32,bytes)",
"54fd4d50": "version()",
"58a997f6": "depositERC20(address,address,uint256,uint32,bytes)",
"7f46ddb2": "OTHER_BRIDGE()",
"838b2520": "depositERC20To(address,address,address,uint256,uint32,bytes)",
"8f601f66": "deposits(address,address)",
"91c49bf8": "l2TokenBridge()",
"927ede2d": "MESSENGER()",
"9a2ac6d5": "depositETHTo(address,uint32,bytes)",
"a9f9e675": "finalizeERC20Withdrawal(address,address,address,address,uint256,bytes)",
"b1a1a882": "depositETH(uint32,bytes)",
"c89701a2": "otherBridge()",
"e11013dd": "bridgeETHTo(address,uint32,bytes)"
},
"storageLayout": {
"__gap": {
"offset": 0,
"slot": "3"
},
"deposits": {
"offset": 0,
"slot": "2"
},
"spacer_0_0_20": {
"offset": 0,
"slot": "0"
},
"spacer_1_0_20": {
"offset": 0,
"slot": "1"
}
}
}
\ No newline at end of file
{
"methodIdentifiers": {
"028f85f7": "MIN_GAS_CALLDATA_OVERHEAD()",
"0c568498": "MIN_GAS_DYNAMIC_OVERHEAD_DENOMINATOR()",
"2828d7e8": "MIN_GAS_DYNAMIC_OVERHEAD_NUMERATOR()",
"3dbb202b": "sendMessage(address,bytes,uint32)",
"3f827a5a": "MESSAGE_VERSION()",
"4c1d6a69": "RELAY_CALL_OVERHEAD()",
"54fd4d50": "version()",
"5644cfdf": "RELAY_GAS_CHECK_BUFFER()",
"6e296e45": "xDomainMessageSender()",
"8129fc1c": "initialize()",
"83a74074": "RELAY_CONSTANT_OVERHEAD()",
"8cbeeef2": "RELAY_RESERVED_GAS()",
"9fce812c": "OTHER_MESSENGER()",
"a4e7f8bd": "failedMessages(bytes32)",
"a7119869": "l1CrossDomainMessenger()",
"b1b1b209": "successfulMessages(bytes32)",
"b28ade25": "baseGas(bytes,uint32)",
"d764ad0b": "relayMessage(uint256,address,address,uint256,uint256,bytes)",
"ecc70428": "messageNonce()"
},
"storageLayout": {
"__gap": {
"offset": 0,
"slot": "207"
},
"_initialized": {
"offset": 20,
"slot": "0"
},
"_initializing": {
"offset": 21,
"slot": "0"
},
"failedMessages": {
"offset": 0,
"slot": "206"
},
"msgNonce": {
"offset": 0,
"slot": "205"
},
"spacer_0_0_20": {
"offset": 0,
"slot": "0"
},
"spacer_101_0_1": {
"offset": 0,
"slot": "101"
},
"spacer_102_0_1568": {
"offset": 0,
"slot": "102"
},
"spacer_151_0_32": {
"offset": 0,
"slot": "151"
},
"spacer_152_0_1568": {
"offset": 0,
"slot": "152"
},
"spacer_1_0_1600": {
"offset": 0,
"slot": "1"
},
"spacer_201_0_32": {
"offset": 0,
"slot": "201"
},
"spacer_202_0_32": {
"offset": 0,
"slot": "202"
},
"spacer_51_0_20": {
"offset": 0,
"slot": "51"
},
"spacer_52_0_1568": {
"offset": 0,
"slot": "52"
},
"successfulMessages": {
"offset": 0,
"slot": "203"
},
"xDomainMsgSender": {
"offset": 0,
"slot": "204"
}
}
}
\ No newline at end of file
{
"methodIdentifiers": {
"3687011a": "bridgeERC721(address,address,uint256,uint32,bytes)",
"3cb747bf": "messenger()",
"54fd4d50": "version()",
"761f4493": "finalizeBridgeERC721(address,address,address,address,uint256,bytes)",
"7f46ddb2": "OTHER_BRIDGE()",
"927ede2d": "MESSENGER()",
"aa557452": "bridgeERC721To(address,address,address,uint256,uint32,bytes)",
"c89701a2": "otherBridge()"
},
"storageLayout": {
"__gap": {
"offset": 0,
"slot": "0"
}
}
}
\ No newline at end of file
{
"methodIdentifiers": {
"88786272": "startingTimestamp()",
"002134cc": "L2_BLOCK_TIME()",
"4599c788": "latestBlockNumber()",
"529933df": "SUBMISSION_INTERVAL()",
"534db0e2": "challenger()",
"54fd4d50": "version()",
"69f16eec": "latestOutputIndex()",
"6abcf563": "nextOutputIndex()",
"6b4d98dd": "CHALLENGER()",
"70872aa5": "startingBlockNumber()",
"7f006420": "getL2OutputIndexAfter(uint256)",
"89c44cbb": "deleteL2Outputs(uint256)",
"93991af3": "l2BlockTime()",
"9aaab648": "proposeL2Output(bytes32,uint256,bytes32,uint256)",
"a25ae557": "getL2Output(uint256)",
"a8e4fb90": "proposer()",
"bffa7f0f": "PROPOSER()",
"ce5db8d6": "finalizationPeriodSeconds()",
"cf8e5cf0": "getL2OutputAfter(uint256)",
"d1de856c": "computeL2Timestamp(uint256)",
"dcec3348": "nextBlockNumber()",
"e1a41bcf": "submissionInterval()",
"e4a30116": "initialize(uint256,uint256)",
"f4daa291": "FINALIZATION_PERIOD_SECONDS()"
},
"storageLayout": {
"_initialized": {
"offset": 0,
"slot": "0"
},
"_initializing": {
"offset": 1,
"slot": "0"
},
"l2Outputs": {
"offset": 0,
"slot": "3"
},
"startingBlockNumber": {
"offset": 0,
"slot": "1"
},
"startingTimestamp": {
"offset": 0,
"slot": "2"
}
}
}
\ No newline at end of file
{
"methodIdentifiers": {
"87087623": "bridgeERC20(address,address,uint256,uint32,bytes)",
"0166a07a": "finalizeBridgeERC20(address,address,address,address,uint256,bytes)",
"09fc8843": "bridgeETH(uint32,bytes)",
"1635f5fd": "finalizeBridgeETH(address,address,uint256,bytes)",
"32b7006d": "withdraw(address,uint256,uint32,bytes)",
"36c717c1": "l1TokenBridge()",
"3cb747bf": "messenger()",
"540abf73": "bridgeERC20To(address,address,address,uint256,uint32,bytes)",
"54fd4d50": "version()",
"662a633a": "finalizeDeposit(address,address,address,address,uint256,bytes)",
"7f46ddb2": "OTHER_BRIDGE()",
"8f601f66": "deposits(address,address)",
"927ede2d": "MESSENGER()",
"a3a79548": "withdrawTo(address,address,uint256,uint32,bytes)",
"c89701a2": "otherBridge()",
"e11013dd": "bridgeETHTo(address,uint32,bytes)"
},
"storageLayout": {
"__gap": {
"offset": 0,
"slot": "3"
},
"deposits": {
"offset": 0,
"slot": "2"
},
"spacer_0_0_20": {
"offset": 0,
"slot": "0"
},
"spacer_1_0_20": {
"offset": 0,
"slot": "1"
}
}
}
\ No newline at end of file
{
"methodIdentifiers": {
"3f827a5a": "MESSAGE_VERSION()",
"44df8e70": "burn()",
"54fd4d50": "version()",
"82e3702d": "sentMessages(bytes32)",
"c2b3e5ac": "initiateWithdrawal(address,uint256,bytes)",
"ecc70428": "messageNonce()"
},
"storageLayout": {
"msgNonce": {
"offset": 0,
"slot": "1"
},
"sentMessages": {
"offset": 0,
"slot": "0"
}
}
}
\ No newline at end of file
{
"methodIdentifiers": {
"39509351": "increaseAllowance(address,uint256)",
"01ffc9a7": "supportsInterface(bytes4)",
"033964be": "REMOTE_TOKEN()",
"06fdde03": "name()",
"095ea7b3": "approve(address,uint256)",
"18160ddd": "totalSupply()",
"23b872dd": "transferFrom(address,address,uint256)",
"313ce567": "decimals()",
"40c10f19": "mint(address,uint256)",
"54fd4d50": "version()",
"70a08231": "balanceOf(address)",
"95d89b41": "symbol()",
"9dc29fac": "burn(address,uint256)",
"a457c2d7": "decreaseAllowance(address,uint256)",
"a9059cbb": "transfer(address,uint256)",
"ae1f6aaf": "l2Bridge()",
"c01e1bd6": "l1Token()",
"d6c0b2c4": "remoteToken()",
"dd62ed3e": "allowance(address,address)",
"e78cea92": "bridge()",
"ee9a31a2": "BRIDGE()"
},
"storageLayout": {
"_allowances": {
"offset": 0,
"slot": "1"
},
"_balances": {
"offset": 0,
"slot": "0"
},
"_name": {
"offset": 0,
"slot": "3"
},
"_symbol": {
"offset": 0,
"slot": "4"
},
"_totalSupply": {
"offset": 0,
"slot": "2"
}
}
}
\ No newline at end of file
{
"methodIdentifiers": {
"54fd4d50": "version()",
"82e3702d": "sentMessages(bytes32)",
"cafa81dc": "passMessageToL1(bytes)"
},
"storageLayout": {
"sentMessages": {
"offset": 0,
"slot": "0"
}
}
}
\ No newline at end of file
{
"methodIdentifiers": {
"39509351": "increaseAllowance(address,uint256)",
"01ffc9a7": "supportsInterface(bytes4)",
"06fdde03": "name()",
"095ea7b3": "approve(address,uint256)",
"18160ddd": "totalSupply()",
"23b872dd": "transferFrom(address,address,uint256)",
"313ce567": "decimals()",
"40c10f19": "mint(address,uint256)",
"70a08231": "balanceOf(address)",
"95d89b41": "symbol()",
"9dc29fac": "burn(address,uint256)",
"a457c2d7": "decreaseAllowance(address,uint256)",
"a9059cbb": "transfer(address,uint256)",
"ae1f6aaf": "l2Bridge()",
"c01e1bd6": "l1Token()",
"dd62ed3e": "allowance(address,address)"
},
"storageLayout": {
"_allowances": {
"offset": 0,
"slot": "1"
},
"_balances": {
"offset": 0,
"slot": "0"
},
"_name": {
"offset": 0,
"slot": "3"
},
"_symbol": {
"offset": 0,
"slot": "4"
},
"_totalSupply": {
"offset": 0,
"slot": "2"
},
"l1Token": {
"offset": 0,
"slot": "5"
},
"l2Bridge": {
"offset": 0,
"slot": "6"
}
}
}
\ No newline at end of file
{
"methodIdentifiers": {
"39509351": "increaseAllowance(address,uint256)",
"01ffc9a7": "supportsInterface(bytes4)",
"033964be": "REMOTE_TOKEN()",
"06fdde03": "name()",
"095ea7b3": "approve(address,uint256)",
"18160ddd": "totalSupply()",
"23b872dd": "transferFrom(address,address,uint256)",
"313ce567": "decimals()",
"40c10f19": "mint(address,uint256)",
"54fd4d50": "version()",
"70a08231": "balanceOf(address)",
"95d89b41": "symbol()",
"9dc29fac": "burn(address,uint256)",
"a457c2d7": "decreaseAllowance(address,uint256)",
"a9059cbb": "transfer(address,uint256)",
"ae1f6aaf": "l2Bridge()",
"c01e1bd6": "l1Token()",
"d6c0b2c4": "remoteToken()",
"dd62ed3e": "allowance(address,address)",
"e78cea92": "bridge()",
"ee9a31a2": "BRIDGE()"
},
"storageLayout": {
"_allowances": {
"offset": 0,
"slot": "1"
},
"_balances": {
"offset": 0,
"slot": "0"
},
"_name": {
"offset": 0,
"slot": "3"
},
"_symbol": {
"offset": 0,
"slot": "4"
},
"_totalSupply": {
"offset": 0,
"slot": "2"
}
}
}
\ No newline at end of file
{
"methodIdentifiers": {
"54fd4d50": "version()",
"896f93d1": "createStandardL2Token(address,string,string)",
"8cf0629c": "createOptimismMintableERC20WithDecimals(address,string,string,uint8)",
"ce5ac90f": "createOptimismMintableERC20(address,string,string)",
"e78cea92": "bridge()",
"ee9a31a2": "BRIDGE()"
},
"storageLayout": {}
}
\ No newline at end of file
{
"methodIdentifiers": {
"01ffc9a7": "supportsInterface(bytes4)",
"033964be": "REMOTE_TOKEN()",
"06fdde03": "name()",
"081812fc": "getApproved(uint256)",
"095ea7b3": "approve(address,uint256)",
"18160ddd": "totalSupply()",
"23b872dd": "transferFrom(address,address,uint256)",
"2f745c59": "tokenOfOwnerByIndex(address,uint256)",
"42842e0e": "safeTransferFrom(address,address,uint256)",
"4f6ccce7": "tokenByIndex(uint256)",
"54fd4d50": "version()",
"6352211e": "ownerOf(uint256)",
"70a08231": "balanceOf(address)",
"7d1d0c5b": "REMOTE_CHAIN_ID()",
"95d89b41": "symbol()",
"9dc29fac": "burn(address,uint256)",
"a1448194": "safeMint(address,uint256)",
"a22cb465": "setApprovalForAll(address,bool)",
"b88d4fde": "safeTransferFrom(address,address,uint256,bytes)",
"c87b56dd": "tokenURI(uint256)",
"d547cfb7": "baseTokenURI()",
"d6c0b2c4": "remoteToken()",
"e78cea92": "bridge()",
"e9518196": "remoteChainId()",
"e985e9c5": "isApprovedForAll(address,address)",
"ee9a31a2": "BRIDGE()"
},
"storageLayout": {
"_allTokens": {
"offset": 0,
"slot": "8"
},
"_allTokensIndex": {
"offset": 0,
"slot": "9"
},
"_balances": {
"offset": 0,
"slot": "3"
},
"_name": {
"offset": 0,
"slot": "0"
},
"_operatorApprovals": {
"offset": 0,
"slot": "5"
},
"_ownedTokens": {
"offset": 0,
"slot": "6"
},
"_ownedTokensIndex": {
"offset": 0,
"slot": "7"
},
"_owners": {
"offset": 0,
"slot": "2"
},
"_symbol": {
"offset": 0,
"slot": "1"
},
"_tokenApprovals": {
"offset": 0,
"slot": "4"
},
"baseTokenURI": {
"offset": 0,
"slot": "10"
}
}
}
\ No newline at end of file
{
"methodIdentifiers": {
"54fd4d50": "version()",
"5572acae": "isOptimismMintableERC721(address)",
"7d1d0c5b": "REMOTE_CHAIN_ID()",
"d97df652": "createOptimismMintableERC721(address,string,string)",
"ee9a31a2": "BRIDGE()"
},
"storageLayout": {
"isOptimismMintableERC721": {
"offset": 0,
"slot": "0"
}
}
}
\ No newline at end of file
{
"methodIdentifiers": {
"001c2ff6": "L2_ORACLE()",
"33d7e2bd": "systemConfig()",
"3f4ba83a": "unpause()",
"452a9320": "guardian()",
"4870496f": "proveWithdrawalTransaction((uint256,address,address,uint256,uint256,bytes),uint256,(bytes32,bytes32,bytes32,bytes32),bytes[])",
"54fd4d50": "version()",
"5c975abb": "paused()",
"6dbffb78": "isOutputFinalized(uint256)",
"724c184c": "GUARDIAN()",
"8456cb59": "pause()",
"8b4c40b0": "donateETH()",
"8c3152e9": "finalizeWithdrawalTransaction((uint256,address,address,uint256,uint256,bytes))",
"9b5f694a": "l2Oracle()",
"9bf62d82": "l2Sender()",
"a14238e7": "finalizedWithdrawals(bytes32)",
"a35d99df": "minimumGasLimit(uint64)",
"cff0ab96": "params()",
"d53a822f": "initialize(bool)",
"e965084c": "provenWithdrawals(bytes32)",
"e9e05c42": "depositTransaction(address,uint256,uint64,bool,bytes)",
"f0498750": "SYSTEM_CONFIG()"
},
"storageLayout": {
"__gap": {
"offset": 0,
"slot": "2"
},
"_initialized": {
"offset": 0,
"slot": "0"
},
"_initializing": {
"offset": 1,
"slot": "0"
},
"finalizedWithdrawals": {
"offset": 0,
"slot": "51"
},
"l2Sender": {
"offset": 0,
"slot": "50"
},
"params": {
"offset": 0,
"slot": "1"
},
"paused": {
"offset": 0,
"slot": "53"
},
"provenWithdrawals": {
"offset": 0,
"slot": "52"
}
}
}
\ No newline at end of file
{
"methodIdentifiers": {
"0457d6f2": "setRequired(uint256)",
"206a8300": "REQUIRED_SLOT()",
"54fd4d50": "version()",
"5fd579af": "setRecommended(uint256)",
"715018a6": "renounceOwnership()",
"7a1ac61e": "initialize(address,uint256,uint256)",
"8da5cb5b": "owner()",
"d798b1ac": "recommended()",
"dc8452cd": "required()",
"f2fde38b": "transferOwnership(address)",
"f7d12760": "RECOMMENDED_SLOT()",
"ffa1ad74": "VERSION()"
},
"storageLayout": {
"__gap": {
"offset": 0,
"slot": "52"
},
"_initialized": {
"offset": 0,
"slot": "0"
},
"_initializing": {
"offset": 1,
"slot": "0"
},
"_owner": {
"offset": 0,
"slot": "51"
}
}
}
\ No newline at end of file
{
"methodIdentifiers": {
"3659cfe6": "upgradeTo(address)",
"4f1ef286": "upgradeToAndCall(address,bytes)",
"5c60da1b": "implementation()",
"8f283970": "changeAdmin(address)",
"f851a440": "admin()"
},
"storageLayout": {}
}
\ No newline at end of file
{
"methodIdentifiers": {
"0652b57a": "setAddressManager(address)",
"07c8f7b0": "setUpgrading(bool)",
"204e1c7a": "getProxyImplementation(address)",
"238181ae": "implementationName(address)",
"3ab76e9f": "addressManager()",
"6bd9f516": "proxyType(address)",
"715018a6": "renounceOwnership()",
"7eff275e": "changeProxyAdmin(address,address)",
"860f7cda": "setImplementationName(address,string)",
"8d52d4a0": "setProxyType(address,uint8)",
"8da5cb5b": "owner()",
"9623609d": "upgradeAndCall(address,address,bytes)",
"99a88ec4": "upgrade(address,address)",
"9b2ea4bd": "setAddress(string,address)",
"b7947262": "isUpgrading()",
"f2fde38b": "transferOwnership(address)",
"f3b7dead": "getProxyAdmin(address)"
},
"storageLayout": {
"_owner": {
"offset": 0,
"slot": "0"
},
"addressManager": {
"offset": 0,
"slot": "3"
},
"implementationName": {
"offset": 0,
"slot": "2"
},
"proxyType": {
"offset": 0,
"slot": "1"
},
"upgrading": {
"offset": 20,
"slot": "3"
}
}
}
\ No newline at end of file
{
"methodIdentifiers": {},
"storageLayout": {
"addressManager": {
"offset": 0,
"slot": "1"
},
"implementationName": {
"offset": 0,
"slot": "0"
}
}
}
\ No newline at end of file
{
"methodIdentifiers": {
"0d9019e1": "RECIPIENT()",
"3ccfd60b": "withdraw()",
"54fd4d50": "version()",
"84411d65": "totalProcessed()",
"d0e12f90": "WITHDRAWAL_NETWORK()",
"d3e5792b": "MIN_WITHDRAWAL_AMOUNT()",
"d4ff9218": "l1FeeWallet()"
},
"storageLayout": {
"totalProcessed": {
"offset": 0,
"slot": "0"
}
}
}
\ No newline at end of file
{
"methodIdentifiers": {
"0528afe2": "setBytes32((bytes32,bytes32)[])",
"21f8a721": "getAddress(bytes32)",
"4e91db08": "setBytes32(bytes32,bytes32)",
"54fd4d50": "version()",
"a6ed563e": "getBytes32(bytes32)",
"bd02d0f5": "getUint(bytes32)",
"ca446dd9": "setAddress(bytes32,address)",
"e2a4853a": "setUint(bytes32,uint256)"
},
"storageLayout": {}
}
\ No newline at end of file
{
"methodIdentifiers": {
"0c18c162": "overhead()",
"18d13918": "setUnsafeBlockSigner(address)",
"1fd19ee1": "unsafeBlockSigner()",
"4add321d": "minimumGasLimit()",
"4f16540b": "UNSAFE_BLOCK_SIGNER_SLOT()",
"54fd4d50": "version()",
"715018a6": "renounceOwnership()",
"8da5cb5b": "owner()",
"935f029e": "setGasConfig(uint256,uint256)",
"b40a817c": "setGasLimit(uint64)",
"c71973f6": "setResourceConfig((uint32,uint8,uint8,uint32,uint32,uint128))",
"c9b26f61": "setBatcherHash(bytes32)",
"cc731b02": "resourceConfig()",
"e81b2c6d": "batcherHash()",
"f2fde38b": "transferOwnership(address)",
"f45e65d8": "scalar()",
"f68016b7": "gasLimit()",
"f975e925": "initialize(address,uint256,uint256,bytes32,uint64,address,(uint32,uint8,uint8,uint32,uint32,uint128))",
"ffa1ad74": "VERSION()"
},
"storageLayout": {
"__gap": {
"offset": 0,
"slot": "52"
},
"_initialized": {
"offset": 0,
"slot": "0"
},
"_initializing": {
"offset": 1,
"slot": "0"
},
"_owner": {
"offset": 0,
"slot": "51"
},
"_resourceConfig": {
"offset": 0,
"slot": "105"
},
"batcherHash": {
"offset": 0,
"slot": "103"
},
"gasLimit": {
"offset": 0,
"slot": "104"
},
"overhead": {
"offset": 0,
"slot": "101"
},
"scalar": {
"offset": 0,
"slot": "102"
}
}
}
\ No newline at end of file
{
"methodIdentifiers": {
"06fdde03": "name()",
"095ea7b3": "approve(address,uint256)",
"18160ddd": "totalSupply()",
"23b872dd": "transferFrom(address,address,uint256)",
"2e1a7d4d": "withdraw(uint256)",
"313ce567": "decimals()",
"70a08231": "balanceOf(address)",
"95d89b41": "symbol()",
"a9059cbb": "transfer(address,uint256)",
"d0e30db0": "deposit()",
"dd62ed3e": "allowance(address,address)"
},
"storageLayout": {
"allowance": {
"offset": 0,
"slot": "4"
},
"balanceOf": {
"offset": 0,
"slot": "3"
},
"decimals": {
"offset": 0,
"slot": "2"
},
"name": {
"offset": 0,
"slot": "0"
},
"symbol": {
"offset": 0,
"slot": "1"
}
}
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment