60 lines
1.5 KiB
Solidity
60 lines
1.5 KiB
Solidity
|
// 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");
|
||
|
}
|
||
|
|
||
|
}
|