// contracts/GovernanceStructs.sol // SPDX-License-Identifier: Apache 2 pragma solidity ^0.8.0; import "../libraries/external/BytesLib.sol"; import "./ReceiverStructs.sol"; contract ReceiverGovernanceStructs { using BytesLib for bytes; enum GovernanceAction { UpgradeContract, UpgradeGuardianset } struct GuardianSetUpgrade { bytes32 module; uint8 action; uint16 chain; ReceiverStructs.GuardianSet newGuardianSet; uint32 newGuardianSetIndex; } function parseGuardianSetUpgrade( bytes memory encodedUpgrade ) public pure returns (GuardianSetUpgrade memory gsu) { uint index = 0; gsu.module = encodedUpgrade.toBytes32(index); index += 32; gsu.action = encodedUpgrade.toUint8(index); index += 1; require(gsu.action == 2, "invalid GuardianSetUpgrade"); gsu.chain = encodedUpgrade.toUint16(index); index += 2; gsu.newGuardianSetIndex = encodedUpgrade.toUint32(index); index += 4; uint8 guardianLength = encodedUpgrade.toUint8(index); index += 1; gsu.newGuardianSet = ReceiverStructs.GuardianSet({ keys: new address[](guardianLength), expirationTime: 0 }); for (uint i = 0; i < guardianLength; i++) { gsu.newGuardianSet.keys[i] = encodedUpgrade.toAddress(index); index += 20; } require(encodedUpgrade.length == index, "invalid GuardianSetUpgrade"); } }