Contract 0x240590cfd54f63df05c9e2fe7264786a73373ab4 1

 

Contract Overview

Balance:
0 ETH

ETH Value:
$0.00

Token:
Txn Hash Method
Block
From
To
Value [Txn Fee]
0xe5c53b00433fd20a1d62eebfd68b8f99d209f626fc493d52b37a107786b1cbf7Execute Proposal203393192022-08-15 19:09:4145 days 21 hrs ago0x88532f5e88f6a1ccd9e64681acc63416594000f4 IN  0x240590cfd54f63df05c9e2fe7264786a73373ab40 ETH0.000148350368 ETH
0xa655b8bb173e9eaa7182e061b9da54b15d09d53a62c709cc2506c46741bf3affVote203380682022-08-15 18:43:1245 days 22 hrs ago0x88532f5e88f6a1ccd9e64681acc63416594000f4 IN  0x240590cfd54f63df05c9e2fe7264786a73373ab40 ETH0.000120084022 ETH
0xf2e4346daf4b59b06fee4ebbb97891023b9eaf9639432735108f7486ff69c414Activate Proposa...203380622022-08-15 18:43:1245 days 22 hrs ago0x88532f5e88f6a1ccd9e64681acc63416594000f4 IN  0x240590cfd54f63df05c9e2fe7264786a73373ab40 ETH0.00011959212 ETH
0x19b264e4a514cd6c682501b6695d7ed1ae58ebf7bbec882611b69108194755bcEndorse Proposal203380562022-08-15 18:43:1245 days 22 hrs ago0x88532f5e88f6a1ccd9e64681acc63416594000f4 IN  0x240590cfd54f63df05c9e2fe7264786a73373ab40 ETH0.000109839349 ETH
0xf4c5f35d6cde3d0f75c0a42d2297674f8f0288f6725cd6136119aacf6b76644cSubmit Proposal203380442022-08-15 18:42:4145 days 22 hrs ago0x88532f5e88f6a1ccd9e64681acc63416594000f4 IN  0x240590cfd54f63df05c9e2fe7264786a73373ab40 ETH0.000194015704 ETH
0x02a398d684631236ca512a359cc706aeb4c6da265593ba316da65af5cc7b231e0x60806040203346882022-08-15 17:43:1245 days 23 hrs ago0x88532f5e88f6a1ccd9e64681acc63416594000f4 IN  Create: Governance0 ETH0.007017669748 ETH
[ Download CSV Export 
Latest 19 internal transactions
Parent Txn Hash Block From To Value
0xe5c53b00433fd20a1d62eebfd68b8f99d209f626fc493d52b37a107786b1cbf7203393192022-08-15 19:09:4145 days 21 hrs ago 0x240590cfd54f63df05c9e2fe7264786a73373ab4 0x874b232fb2ceed25b51c893903c7f7dde11f22c20 ETH
0xe5c53b00433fd20a1d62eebfd68b8f99d209f626fc493d52b37a107786b1cbf7203393192022-08-15 19:09:4145 days 21 hrs ago 0x240590cfd54f63df05c9e2fe7264786a73373ab4 0x874b232fb2ceed25b51c893903c7f7dde11f22c20 ETH
0xe5c53b00433fd20a1d62eebfd68b8f99d209f626fc493d52b37a107786b1cbf7203393192022-08-15 19:09:4145 days 21 hrs ago 0x240590cfd54f63df05c9e2fe7264786a73373ab4 0xa2d346fe55133884bc6f58093ae5ab6b94df608a0 ETH
0xe5c53b00433fd20a1d62eebfd68b8f99d209f626fc493d52b37a107786b1cbf7203393192022-08-15 19:09:4145 days 21 hrs ago 0x240590cfd54f63df05c9e2fe7264786a73373ab4 0x84d1aa64fcd79fc396d9992012378984bffdf4a00 ETH
0xe5c53b00433fd20a1d62eebfd68b8f99d209f626fc493d52b37a107786b1cbf7203393192022-08-15 19:09:4145 days 21 hrs ago 0x240590cfd54f63df05c9e2fe7264786a73373ab4 0x874b232fb2ceed25b51c893903c7f7dde11f22c20 ETH
0xa655b8bb173e9eaa7182e061b9da54b15d09d53a62c709cc2506c46741bf3aff203380682022-08-15 18:43:1245 days 22 hrs ago 0x240590cfd54f63df05c9e2fe7264786a73373ab4 0x874b232fb2ceed25b51c893903c7f7dde11f22c20 ETH
0xa655b8bb173e9eaa7182e061b9da54b15d09d53a62c709cc2506c46741bf3aff203380682022-08-15 18:43:1245 days 22 hrs ago 0x240590cfd54f63df05c9e2fe7264786a73373ab4 0x874b232fb2ceed25b51c893903c7f7dde11f22c20 ETH
0xf2e4346daf4b59b06fee4ebbb97891023b9eaf9639432735108f7486ff69c414203380622022-08-15 18:43:1245 days 22 hrs ago 0x240590cfd54f63df05c9e2fe7264786a73373ab4 0x874b232fb2ceed25b51c893903c7f7dde11f22c20 ETH
0x19b264e4a514cd6c682501b6695d7ed1ae58ebf7bbec882611b69108194755bc203380562022-08-15 18:43:1245 days 22 hrs ago 0x240590cfd54f63df05c9e2fe7264786a73373ab4 0x84d1aa64fcd79fc396d9992012378984bffdf4a00 ETH
0x19b264e4a514cd6c682501b6695d7ed1ae58ebf7bbec882611b69108194755bc203380562022-08-15 18:43:1245 days 22 hrs ago 0x240590cfd54f63df05c9e2fe7264786a73373ab4 0x874b232fb2ceed25b51c893903c7f7dde11f22c20 ETH
0xf4c5f35d6cde3d0f75c0a42d2297674f8f0288f6725cd6136119aacf6b76644c203380442022-08-15 18:42:4145 days 22 hrs ago 0x240590cfd54f63df05c9e2fe7264786a73373ab4 0x84d1aa64fcd79fc396d9992012378984bffdf4a00 ETH
0xf4c5f35d6cde3d0f75c0a42d2297674f8f0288f6725cd6136119aacf6b76644c203380442022-08-15 18:42:4145 days 22 hrs ago 0x240590cfd54f63df05c9e2fe7264786a73373ab4 0x874b232fb2ceed25b51c893903c7f7dde11f22c20 ETH
0xf4c5f35d6cde3d0f75c0a42d2297674f8f0288f6725cd6136119aacf6b76644c203380442022-08-15 18:42:4145 days 22 hrs ago 0x240590cfd54f63df05c9e2fe7264786a73373ab4 0x874b232fb2ceed25b51c893903c7f7dde11f22c20 ETH
0x542fb07955da5b2d78bda855e2c580c5a3f27e684a5f03e7d528716fcaff9ba6203347332022-08-15 17:43:4645 days 23 hrs ago 0xa2d346fe55133884bc6f58093ae5ab6b94df608a 0x240590cfd54f63df05c9e2fe7264786a73373ab40 ETH
0x542fb07955da5b2d78bda855e2c580c5a3f27e684a5f03e7d528716fcaff9ba6203347332022-08-15 17:43:4645 days 23 hrs ago 0x240590cfd54f63df05c9e2fe7264786a73373ab4 0xa2d346fe55133884bc6f58093ae5ab6b94df608a0 ETH
0x542fb07955da5b2d78bda855e2c580c5a3f27e684a5f03e7d528716fcaff9ba6203347332022-08-15 17:43:4645 days 23 hrs ago 0x240590cfd54f63df05c9e2fe7264786a73373ab4 0xa2d346fe55133884bc6f58093ae5ab6b94df608a0 ETH
0x542fb07955da5b2d78bda855e2c580c5a3f27e684a5f03e7d528716fcaff9ba6203347332022-08-15 17:43:4645 days 23 hrs ago 0xa2d346fe55133884bc6f58093ae5ab6b94df608a 0x240590cfd54f63df05c9e2fe7264786a73373ab40 ETH
0x542fb07955da5b2d78bda855e2c580c5a3f27e684a5f03e7d528716fcaff9ba6203347332022-08-15 17:43:4645 days 23 hrs ago 0xa2d346fe55133884bc6f58093ae5ab6b94df608a 0x240590cfd54f63df05c9e2fe7264786a73373ab40 ETH
0x542fb07955da5b2d78bda855e2c580c5a3f27e684a5f03e7d528716fcaff9ba6203347332022-08-15 17:43:4645 days 23 hrs ago 0xa2d346fe55133884bc6f58093ae5ab6b94df608a 0x240590cfd54f63df05c9e2fe7264786a73373ab40 ETH
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Governance

Compiler Version
v0.8.15+commit.e14f2714

Optimization Enabled:
Yes with 20000 runs

Other Settings:
default evmVersion, GNU AGPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Arbiscan on 2022-08-15
*/

// SPDX-License-Identifier: AGPL-3.0-only

// The Governance Policy submits & activates instructions in a INSTR module

// TODO:
// Add governance bounty reward
// Add governance participation reward
// Add minimum vote threshold for activation

pragma solidity ^0.8.15;

error TargetNotAContract(address target_);
error InvalidKeycode(Keycode keycode_);
error InvalidRole(Role role_);

function toKeycode(bytes5 keycode_) pure returns (Keycode) {
    return Keycode.wrap(keycode_);
}

function fromKeycode(Keycode keycode_) pure returns (bytes5) {
    return Keycode.unwrap(keycode_);
}

function toRole(bytes32 role_) pure returns (Role) {
    return Role.wrap(role_);
}

function fromRole(Role role_) pure returns (bytes32) {
    return Role.unwrap(role_);
}

function ensureContract(address target_) view {
    uint256 size;
    assembly("memory-safe") {
        size := extcodesize(target_)
    }
    if (size == 0) revert TargetNotAContract(target_);
}

function ensureValidKeycode(Keycode keycode_) pure {
    bytes5 unwrapped = Keycode.unwrap(keycode_);

    for (uint256 i = 0; i < 5; ) {
        bytes1 char = unwrapped[i];

        if (char < 0x41 || char > 0x5A) revert InvalidKeycode(keycode_); // A-Z only

        unchecked {
            i++;
        }
    }
}

function ensureValidRole(Role role_) pure {
    bytes32 unwrapped = Role.unwrap(role_);

    for (uint256 i = 0; i < 32; ) {
        bytes1 char = unwrapped[i];
        if ((char < 0x61 || char > 0x7A) && char != 0x00) {
            revert InvalidRole(role_); // a-z only
        }
        unchecked {
            i++;
        }
    }
}

// ######################## ~ ERRORS ~ ########################

// KERNEL ADAPTER

error KernelAdapter_OnlyKernel(address caller_);

// MODULE

error Module_PolicyNotAuthorized(address policy_);

// POLICY

error Policy_OnlyRole(Role role_);
error Policy_ModuleDoesNotExist(Keycode keycode_);

// KERNEL

error Kernel_OnlyExecutor(address caller_);
error Kernel_OnlyAdmin(address caller_);
error Kernel_ModuleAlreadyInstalled(Keycode module_);
error Kernel_InvalidModuleUpgrade(Keycode module_);
error Kernel_PolicyAlreadyApproved(address policy_);
error Kernel_PolicyNotApproved(address policy_);
error Kernel_AddressAlreadyHasRole(address addr_, Role role_);
error Kernel_AddressDoesNotHaveRole(address addr_, Role role_);
error Kernel_RoleDoesNotExist(Role role_);

// ######################## ~ GLOBAL TYPES ~ ########################

enum Actions {
    InstallModule,
    UpgradeModule,
    ActivatePolicy,
    DeactivatePolicy,
    ChangeExecutor,
    ChangeAdmin,
    MigrateKernel
}

struct Instruction {
    Actions action;
    address target;
}

struct Permissions {
    Keycode keycode;
    bytes4 funcSelector;
}

type Keycode is bytes5;
type Role is bytes32;

// ######################## ~ MODULE ABSTRACT ~ ########################

abstract contract KernelAdapter {
    Kernel public kernel;

    constructor(Kernel kernel_) {
        kernel = kernel_;
    }

    modifier onlyKernel() {
        if (msg.sender != address(kernel)) revert KernelAdapter_OnlyKernel(msg.sender);
        _;
    }

    function changeKernel(Kernel newKernel_) external onlyKernel {
        kernel = newKernel_;
    }
}

abstract contract Module is KernelAdapter {
    event PermissionSet(bytes4 funcSelector_, address policy_, bool permission_);

    constructor(Kernel kernel_) KernelAdapter(kernel_) {}

    modifier permissioned() {
        if (!kernel.modulePermissions(KEYCODE(), Policy(msg.sender), msg.sig))
            revert Module_PolicyNotAuthorized(msg.sender);
        _;
    }

    function KEYCODE() public pure virtual returns (Keycode);

    /// @notice Specify which version of a module is being implemented.
    /// @dev Minor version change retains interface. Major version upgrade indicates
    /// @dev breaking change to the interface.
    function VERSION() external pure virtual returns (uint8 major, uint8 minor) {}

    /// @notice Initialization function for the module.
    /// @dev This function is called when the module is installed or upgraded by the kernel.
    /// @dev Used to encompass any upgrade logic. Must be gated by onlyKernel.
    function INIT() external virtual onlyKernel {}
}

abstract contract Policy is KernelAdapter  {

    bool public isActive;

    constructor(Kernel kernel_) KernelAdapter(kernel_) {}

    modifier onlyRole(bytes32 role_) {
        Role role = toRole(role_);
        if(!kernel.hasRole(msg.sender, role))
            revert Policy_OnlyRole(role);
        _;
    }

    function configureDependencies() external virtual onlyKernel returns (Keycode[] memory dependencies) {}

    function requestPermissions() external view virtual onlyKernel returns (Permissions[] memory requests) {}

    function getModuleAddress(Keycode keycode_) internal view returns (address) {
        address moduleForKeycode = address(kernel.getModuleForKeycode(keycode_));
        if (moduleForKeycode == address(0)) revert Policy_ModuleDoesNotExist(keycode_);
        return moduleForKeycode;
    }

    /// @notice Function to let kernel grant or revoke active status
    function setActiveStatus(bool activate_) external onlyKernel {
        isActive = activate_;
    }
}

contract Kernel {
    // ######################## ~ VARS ~ ########################
    address public executor;
    address public admin;

    // ######################## ~ DEPENDENCY MANAGEMENT ~ ########################

    // Module Management
    Keycode[] public allKeycodes;
    mapping(Keycode => Module) public getModuleForKeycode; // get contract for module keycode
    mapping(Module => Keycode) public getKeycodeForModule; // get module keycode for contract
    
    // Module dependents data. Manages module dependencies for policies
    mapping(Keycode => Policy[]) public moduleDependents;
    mapping(Keycode => mapping(Policy => uint256)) public getDependentIndex;

    // Module <> Policy Permissions. Policy -> Keycode -> Function Selector -> Permission
    mapping(Keycode => mapping(Policy => mapping(bytes4 => bool))) public modulePermissions; // for policy addr, check if they have permission to call the function int he module

    // List of all active policies
    Policy[] public activePolicies;
    mapping(Policy => uint256) public getPolicyIndex;

    // Policy roles data
    mapping(address => mapping(Role => bool)) public hasRole;
    mapping(Role => bool) public isRole;

    // ######################## ~ EVENTS ~ ########################

    event PermissionsUpdated(
        Keycode indexed keycode_,
        Policy indexed policy_,
        bytes4 funcSelector_,
        bool granted_
    );
    event RoleGranted(Role indexed role_, address indexed addr_);
    event RoleRevoked(Role indexed role_, address indexed addr_);
    event ActionExecuted(Actions indexed action_, address indexed target_);

    // ######################## ~ BODY ~ ########################

    constructor() {
        executor = msg.sender;
        admin = msg.sender;
    }

    // ######################## ~ MODIFIERS ~ ########################

    // Role reserved for governor or any executing address
    modifier onlyExecutor() {
        if (msg.sender != executor) revert Kernel_OnlyExecutor(msg.sender);
        _;
    }

    // Role for managing policy roles
    modifier onlyAdmin() {
        if (msg.sender != admin) revert Kernel_OnlyAdmin(msg.sender);
        _;
    }

    // ######################## ~ KERNEL INTERFACE ~ ########################

    function executeAction(Actions action_, address target_) external onlyExecutor {
        if (action_ == Actions.InstallModule) {
            ensureContract(target_);
            ensureValidKeycode(Module(target_).KEYCODE());
            _installModule(Module(target_));
        } else if (action_ == Actions.UpgradeModule) {
            ensureContract(target_);
            ensureValidKeycode(Module(target_).KEYCODE());
            _upgradeModule(Module(target_));
        } else if (action_ == Actions.ActivatePolicy) {
            ensureContract(target_);
            _activatePolicy(Policy(target_));
        } else if (action_ == Actions.DeactivatePolicy) {
            ensureContract(target_);
            _deactivatePolicy(Policy(target_));
        } else if (action_ == Actions.MigrateKernel) {
            ensureContract(target_);
            _migrateKernel(Kernel(target_));
        } else if (action_ == Actions.ChangeExecutor) {
            executor = target_;
        } else if (action_ == Actions.ChangeAdmin) {
            admin = target_;
        }

        emit ActionExecuted(action_, target_);
    }

    // ######################## ~ KERNEL INTERNAL ~ ########################

    function _installModule(Module newModule_) internal {
        Keycode keycode = newModule_.KEYCODE();

        if (address(getModuleForKeycode[keycode]) != address(0))
            revert Kernel_ModuleAlreadyInstalled(keycode);

        getModuleForKeycode[keycode] = newModule_;
        getKeycodeForModule[newModule_] = keycode;
        allKeycodes.push(keycode);

        newModule_.INIT();
    }

    function _upgradeModule(Module newModule_) internal {
        Keycode keycode = newModule_.KEYCODE();
        Module oldModule = getModuleForKeycode[keycode];

        if (address(oldModule) == address(0) || oldModule == newModule_)
            revert Kernel_InvalidModuleUpgrade(keycode);

        getKeycodeForModule[oldModule] = Keycode.wrap(bytes5(0));
        getKeycodeForModule[newModule_] = keycode;
        getModuleForKeycode[keycode] = newModule_;

        newModule_.INIT();

        _reconfigurePolicies(keycode);
    }

    function _activatePolicy(Policy policy_) internal {
        if (policy_.isActive()) revert Kernel_PolicyAlreadyApproved(address(policy_));

        // Grant permissions for policy to access restricted module functions
        Permissions[] memory requests = policy_.requestPermissions();
        _setPolicyPermissions(policy_, requests, true);

        // Add policy to list of active policies
        activePolicies.push(policy_);
        getPolicyIndex[policy_] = activePolicies.length - 1;

        // Record module dependencies
        Keycode[] memory dependencies = policy_.configureDependencies();
        uint256 depLength = dependencies.length;

        for (uint256 i; i < depLength; ) {
            Keycode keycode = dependencies[i];

            moduleDependents[keycode].push(policy_);
            getDependentIndex[keycode][policy_] = moduleDependents[keycode].length - 1;

            unchecked {
                ++i;
            }
        }

        // Set policy status to active
        policy_.setActiveStatus(true);
    }

    function _deactivatePolicy(Policy policy_) internal {
        if (!policy_.isActive()) revert Kernel_PolicyNotApproved(address(policy_));

        // Revoke permissions
        Permissions[] memory requests = policy_.requestPermissions();
        _setPolicyPermissions(policy_, requests, false);

        // Remove policy from all policy data structures
        uint256 idx = getPolicyIndex[policy_];
        Policy lastPolicy = activePolicies[activePolicies.length - 1];

        activePolicies[idx] = lastPolicy;
        activePolicies.pop();
        getPolicyIndex[lastPolicy] = idx;
        delete getPolicyIndex[policy_];

        // Remove policy from module dependents
        _pruneFromDependents(policy_);

        // Set policy status to inactive
        policy_.setActiveStatus(false);
    }

    // WARNING: ACTION WILL BRICK THIS KERNEL. All functionality will move to the new kernel
    // New kernel must add in all of the modules and policies via executeAction
    // NOTE: Data does not get cleared from this kernel
    function _migrateKernel(Kernel newKernel_) internal {
        uint256 keycodeLen = allKeycodes.length;
        for (uint256 i; i < keycodeLen; ) {
            Module module = Module(getModuleForKeycode[allKeycodes[i]]);
            module.changeKernel(newKernel_);
            unchecked {
                ++i;
            }
        }

        uint256 policiesLen = activePolicies.length;
        for (uint256 j; j < policiesLen; ) {
            Policy policy = activePolicies[j];

            // Deactivate before changing kernel
            policy.setActiveStatus(false);
            policy.changeKernel(newKernel_);
            unchecked {
                ++j;
            }
        }
    }

    function _reconfigurePolicies(Keycode keycode_) internal {
        Policy[] memory dependents = moduleDependents[keycode_];
        uint256 depLength = dependents.length;

        for (uint256 i; i < depLength; ) {
            dependents[i].configureDependencies();

            unchecked {
                ++i;
            }
        }
    }

    function _setPolicyPermissions(
        Policy policy_,
        Permissions[] memory requests_,
        bool grant_
    ) internal {
        uint256 reqLength = requests_.length;
        for (uint256 i = 0; i < reqLength; ) {
            Permissions memory request = requests_[i];
            modulePermissions[request.keycode][policy_][request.funcSelector] = grant_;

            emit PermissionsUpdated(request.keycode, policy_, request.funcSelector, grant_);

            unchecked {
                ++i;
            }
        }
    }

    function _pruneFromDependents(Policy policy_) internal {
        Keycode[] memory dependencies = policy_.configureDependencies();
        uint256 depcLength = dependencies.length;

        for (uint256 i; i < depcLength; ) {
            Keycode keycode = dependencies[i];
            Policy[] storage dependents = moduleDependents[keycode];

            uint256 origIndex = getDependentIndex[keycode][policy_];
            Policy lastPolicy = dependents[dependents.length - 1];

            // Swap with last and pop
            dependents[origIndex] = lastPolicy;
            dependents.pop();

            // Record new index and delete terminated policy index
            getDependentIndex[keycode][lastPolicy] = origIndex;
            delete getDependentIndex[keycode][policy_];

            unchecked {
                ++i;
            }
        }
    }

    function grantRole(Role role_, address addr_) public onlyAdmin {
        if (hasRole[addr_][role_]) revert Kernel_AddressAlreadyHasRole(addr_, role_);

        ensureValidRole(role_);
        if (!isRole[role_]) isRole[role_] = true;

        hasRole[addr_][role_] = true;

        emit RoleGranted(role_, addr_);
    }

    function revokeRole(Role role_, address addr_) public onlyAdmin {
        if (!isRole[role_]) revert Kernel_RoleDoesNotExist(role_);
        if (!hasRole[addr_][role_]) revert Kernel_AddressDoesNotHaveRole(addr_, role_);

        hasRole[addr_][role_] = false;

        emit RoleRevoked(role_, addr_);
    }
}

// [INSTR] The Instructions Module caches and executes batched instructions for protocol upgrades in the Kernel

interface IDefaultInstructions {

    event InstructionsStored(uint256 instructionsId);

    error INSTR_InstructionsCannotBeEmpty();
    error INSTR_InvalidChangeExecutorAction();
    error INSTR_InvalidTargetNotAContract();
    error INSTR_InvalidModuleKeycode();
}

contract DefaultInstructions is Module, IDefaultInstructions {

    /////////////////////////////////////////////////////////////////////////////////
    //                         Kernel Module Configuration                         //
    /////////////////////////////////////////////////////////////////////////////////

    constructor(Kernel kernel_) Module(kernel_) {}

    function KEYCODE() public pure override returns (Keycode) {
        return Keycode.wrap("INSTR");
    }

    /////////////////////////////////////////////////////////////////////////////////
    //                              Module Variables                               //
    /////////////////////////////////////////////////////////////////////////////////

    uint256 public totalInstructions;
    mapping(uint256 => Instruction[]) public storedInstructions;

    /////////////////////////////////////////////////////////////////////////////////
    //                             Policy Interface                                //
    /////////////////////////////////////////////////////////////////////////////////

    // view function for retrieving a list of instructions in an outside contract
    function getInstructions(uint256 instructionsId_) public view returns (Instruction[] memory) {
        return storedInstructions[instructionsId_];
    }

    function store(Instruction[] calldata instructions_) external permissioned returns (uint256) {
        uint256 length = instructions_.length;
        uint256 instructionsId = ++totalInstructions;

        // initialize an empty list of instructions that will be filled
        Instruction[] storage instructions = storedInstructions[instructionsId];

        // if there are no instructions, throw an error
        if (length == 0) {
            revert INSTR_InstructionsCannotBeEmpty();
        }

        // for each instruction, do the following actions:
        for (uint256 i; i < length; ) {
            // get the instruction
            Instruction calldata instruction = instructions_[i];

            // check the address that the instruction is being performed on is a contract (bytecode size > 0)
            _ensureContract(instruction.target);

            // if the instruction deals with a module, make sure the module has a valid keycode (UPPERCASE A-Z ONLY)
            if (
                instruction.action == Actions.InstallModule ||
                instruction.action == Actions.UpgradeModule
            ) {
                Module module = Module(instruction.target);
                _ensureValidKeycode(module.KEYCODE());
            } else if (instruction.action == Actions.ChangeExecutor && i != length - 1) {
                // throw an error if ChangeExecutor exists and is not the last Action in the instruction llist
                // this exists because if ChangeExecutor is not the last item in the list of instructions
                // the Kernel will not recognize any of the following instructions as valid, since the policy
                // executing the list of instructions no longer has permissions in the Kernel. To avoid this issue
                // and prevent invalid proposals from being saved, we perform this check.

                revert INSTR_InvalidChangeExecutorAction();
            }

            instructions.push(instructions_[i]);
            unchecked {
                ++i;
            }
        }

        emit InstructionsStored(instructionsId);

        return instructionsId;
    }

    /////////////////////////////// INTERNAL FUNCTIONS ////////////////////////////////

    function _ensureContract(address target_) internal view {
        uint256 size;
        assembly {
            size := extcodesize(target_)
        }
        if (size == 0) revert INSTR_InvalidTargetNotAContract();
    }

    function _ensureValidKeycode(Keycode keycode_) internal pure {
        bytes5 unwrapped = Keycode.unwrap(keycode_);

        for (uint256 i = 0; i < 5; ) {
            bytes1 char = unwrapped[i];

            if (char < 0x41 || char > 0x5A) revert INSTR_InvalidModuleKeycode(); // A-Z only"

            unchecked {
                i++;
            }
        }
    }
}

// [VOTES] The Votes Module is the ERC20 token that represents voting power in the network.

/// @notice Modern and gas efficient ERC20 + EIP-2612 implementation.
/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC20.sol)
/// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol)
/// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it.
abstract contract ERC20 {
    /*///////////////////////////////////////////////////////////////
                                  EVENTS
    //////////////////////////////////////////////////////////////*/

    event Transfer(address indexed from, address indexed to, uint256 amount);

    event Approval(address indexed owner, address indexed spender, uint256 amount);

    /*///////////////////////////////////////////////////////////////
                             METADATA STORAGE
    //////////////////////////////////////////////////////////////*/

    string public name;

    string public symbol;

    uint8 public immutable decimals;

    /*///////////////////////////////////////////////////////////////
                              ERC20 STORAGE
    //////////////////////////////////////////////////////////////*/

    uint256 public totalSupply;

    mapping(address => uint256) public balanceOf;

    mapping(address => mapping(address => uint256)) public allowance;

    /*///////////////////////////////////////////////////////////////
                             EIP-2612 STORAGE
    //////////////////////////////////////////////////////////////*/

    bytes32 public constant PERMIT_TYPEHASH =
        keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");

    uint256 internal immutable INITIAL_CHAIN_ID;

    bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR;

    mapping(address => uint256) public nonces;

    /*///////////////////////////////////////////////////////////////
                               CONSTRUCTOR
    //////////////////////////////////////////////////////////////*/

    constructor(
        string memory _name,
        string memory _symbol,
        uint8 _decimals
    ) {
        name = _name;
        symbol = _symbol;
        decimals = _decimals;

        INITIAL_CHAIN_ID = block.chainid;
        INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator();
    }

    /*///////////////////////////////////////////////////////////////
                              ERC20 LOGIC
    //////////////////////////////////////////////////////////////*/

    function approve(address spender, uint256 amount) public virtual returns (bool) {
        allowance[msg.sender][spender] = amount;

        emit Approval(msg.sender, spender, amount);

        return true;
    }

    function transfer(address to, uint256 amount) public virtual returns (bool) {
        balanceOf[msg.sender] -= amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(msg.sender, to, amount);

        return true;
    }

    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual returns (bool) {
        uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals.

        if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amount;

        balanceOf[from] -= amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(from, to, amount);

        return true;
    }

    /*///////////////////////////////////////////////////////////////
                              EIP-2612 LOGIC
    //////////////////////////////////////////////////////////////*/

    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public virtual {
        require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED");

        // Unchecked because the only math done is incrementing
        // the owner's nonce which cannot realistically overflow.
        unchecked {
            bytes32 digest = keccak256(
                abi.encodePacked(
                    "\x19\x01",
                    DOMAIN_SEPARATOR(),
                    keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, nonces[owner]++, deadline))
                )
            );

            address recoveredAddress = ecrecover(digest, v, r, s);

            require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER");

            allowance[recoveredAddress][spender] = value;
        }

        emit Approval(owner, spender, value);
    }

    function DOMAIN_SEPARATOR() public view virtual returns (bytes32) {
        return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator();
    }

    function computeDomainSeparator() internal view virtual returns (bytes32) {
        return
            keccak256(
                abi.encode(
                    keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
                    keccak256(bytes(name)),
                    keccak256("1"),
                    block.chainid,
                    address(this)
                )
            );
    }

    /*///////////////////////////////////////////////////////////////
                       INTERNAL MINT/BURN LOGIC
    //////////////////////////////////////////////////////////////*/

    function _mint(address to, uint256 amount) internal virtual {
        totalSupply += amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(address(0), to, amount);
    }

    function _burn(address from, uint256 amount) internal virtual {
        balanceOf[from] -= amount;

        // Cannot underflow because a user's balance
        // will never be larger than the total supply.
        unchecked {
            totalSupply -= amount;
        }

        emit Transfer(from, address(0), amount);
    }
}

error VOTES_TransferDisabled();

contract DefaultVotes is Module, ERC20 {
    constructor(Kernel kernel_) Module(kernel_) ERC20("Voting Tokens", "VOTES", 3) {}

    function KEYCODE() public pure override returns (Keycode) {
        return Keycode.wrap("VOTES");
    }

    // Policy Interface

    function mintTo(address wallet_, uint256 amount_) external permissioned {
        _mint(wallet_, amount_);
    }

    function burnFrom(address wallet_, uint256 amount_) external permissioned {
        _burn(wallet_, amount_);
    }

    function transfer(address, uint256) public override returns (bool) {
        revert VOTES_TransferDisabled();
        return true;
    }

    function transferFrom(
        address from_,
        address to_,
        uint256 amount_
    ) public override permissioned returns (bool) {
        // skip the approve function because callers must be pre-approved via governance

        balanceOf[from_] -= amount_;
        unchecked {
            balanceOf[to_] += amount_;
        }

        emit Transfer(from_, to_, amount_);
        return true;
    }
}

interface IGovernance {

    struct ProposalMetadata {
        bytes32 title;
        address submitter;
        uint256 submissionTimestamp;
        string proposalURI;
    }

    struct ActivatedProposal {
        uint256 proposalId;
        uint256 activationTimestamp;
    }
    
    event ProposalSubmitted(uint256 proposalId);
    event ProposalEndorsed(uint256 proposalId, address voter, uint256 amount);
    event ProposalActivated(uint256 proposalId, uint256 timestamp);
    event WalletVoted(uint256 proposalId, address voter, bool for_, uint256 userVotes);
    event ProposalExecuted(uint256 proposalId);
    
    // proposing
    error NotEnoughVotesToPropose();

    // endorsing
    error CannotEndorseNullProposal();
    error CannotEndorseInvalidProposal();

    // activating
    error NotAuthorizedToActivateProposal();
    error NotEnoughEndorsementsToActivateProposal();
    error ProposalAlreadyActivated();
    error ActiveProposalNotExpired();
    error SubmittedProposalHasExpired();

    // voting
    error NoActiveProposalDetected();
    error UserAlreadyVoted();

    // executing
    error NotEnoughVotesToExecute();
    error ExecutionTimelockStillActive();

    // claiming
    error VotingTokensAlreadyReclaimed();
    error CannotReclaimTokensForActiveVote();
    error CannotReclaimZeroVotes();
}

contract Governance is Policy, IGovernance {

    /////////////////////////////////////////////////////////////////////////////////
    //                         Kernel Policy Configuration                         //
    /////////////////////////////////////////////////////////////////////////////////

    DefaultInstructions public INSTR;
    DefaultVotes public VOTES;

    constructor(Kernel kernel_) Policy(kernel_) {}

    function configureDependencies() external override onlyKernel returns (Keycode[] memory dependencies) {
        dependencies = new Keycode[](2);
        
        dependencies[0] = toKeycode("INSTR");
        INSTR = DefaultInstructions(getModuleAddress(toKeycode("INSTR")));
        
        dependencies[1] = toKeycode("VOTES");
        VOTES = DefaultVotes(getModuleAddress(toKeycode("VOTES")));
    }

    function requestPermissions()
        external
        view
        override
        onlyKernel
        returns (Permissions[] memory requests)
    {
        requests = new Permissions[](4);
        requests[0] = Permissions(toKeycode("INSTR"), INSTR.store.selector);
        requests[1] = Permissions(toKeycode("VOTES"), VOTES.mintTo.selector);
        requests[2] = Permissions(toKeycode("VOTES"), VOTES.burnFrom.selector);
        requests[3] = Permissions(toKeycode("VOTES"), VOTES.transferFrom.selector);
    }

    /////////////////////////////////////////////////////////////////////////////////
    //                             Policy Variables                                //
    /////////////////////////////////////////////////////////////////////////////////

    // currently active proposal
    ActivatedProposal public activeProposal;

    mapping(uint256 => ProposalMetadata) public getProposalMetadata;
    mapping(uint256 => uint256) public totalEndorsementsForProposal;
    mapping(uint256 => mapping(address => uint256)) public userEndorsementsForProposal;
    mapping(uint256 => bool) public proposalHasBeenActivated;
    mapping(uint256 => uint256) public yesVotesForProposal;
    mapping(uint256 => uint256) public noVotesForProposal;
    mapping(uint256 => mapping(address => uint256)) public userVotesForProposal;
    mapping(uint256 => mapping(address => bool)) public tokenClaimsForProposal;

    uint256 public constant ACTIVATION_DEADLINE = 2 weeks; // amount of time a submitted proposal has to activate before it expires
    uint256 public constant GRACE_PERIOD = 1 weeks; // amount of time an activated proposal can stay up before it can be replaced
    uint256 public constant ENDORSEMENT_THRESHOLD = 20; // required percentage of total supply to activate a proposal (in percentage)
    uint256 public constant EXECUTION_THRESHOLD = 33; // required net votes to execute a proposal (in percentage)
    uint256 public constant EXECUTION_TIMELOCK = 10 minutes; // required time for a proposal to be active before it can be executed
    uint256 public constant GOVERNANCE_BOUNTY = 0;  // sucessful proposal reward rate (in basis points)
    uint256 public constant VOTER_REWARD_RATE = 0;  // voter reward rate (in basis points)

    /////////////////////////////////////////////////////////////////////////////////
    //                              View Functions                                 //
    /////////////////////////////////////////////////////////////////////////////////

    function getMetadata(uint256 proposalId_) public view returns (ProposalMetadata memory) {
        return getProposalMetadata[proposalId_];
    }

    function getActiveProposal() public view returns (ActivatedProposal memory) {
        return activeProposal;
    }

    /////////////////////////////////////////////////////////////////////////////////
    //                               User Actions                                  //
    /////////////////////////////////////////////////////////////////////////////////

    function submitProposal(Instruction[] calldata instructions_, bytes32 title_, string memory proposalURI_) external {
        // require the proposing wallet to own at least 1% of the outstanding governance power
        if (VOTES.balanceOf(msg.sender) * 100 < VOTES.totalSupply()) {
            revert NotEnoughVotesToPropose();
        }

        // store the proposed instructions in the INSTR module and save the proposal metadata to the proposal mapping
        uint256 proposalId = INSTR.store(instructions_);
        getProposalMetadata[proposalId] = ProposalMetadata(
            title_,
            msg.sender,
            block.timestamp,
            proposalURI_
        );

        // emit the corresponding event
        emit ProposalSubmitted(proposalId);
    }

    function endorseProposal(uint256 proposalId_) external {
        // get the current votes of the user
        uint256 userVotes = VOTES.balanceOf(msg.sender);

        // revert if endorsing null proposalId
        if (proposalId_ == 0) {
            revert CannotEndorseNullProposal();
        }

        // revert if endorsed instructions are empty
        Instruction[] memory instructions = INSTR.getInstructions(proposalId_);
        if (instructions.length == 0) {
            revert CannotEndorseInvalidProposal();
        }

        // undo any previous endorsement the user made on these instructions
        uint256 previousEndorsement = userEndorsementsForProposal[proposalId_][msg.sender];
        totalEndorsementsForProposal[proposalId_] -= previousEndorsement;

        // reapply user endorsements with most up-to-date votes
        userEndorsementsForProposal[proposalId_][msg.sender] = userVotes;
        totalEndorsementsForProposal[proposalId_] += userVotes;

        // emit the corresponding event
        emit ProposalEndorsed(proposalId_, msg.sender, userVotes);
    }

    function activateProposal(uint256 proposalId_) external {
        // get the proposal to be activated
        ProposalMetadata memory proposal = getProposalMetadata[proposalId_];

        // only allow the proposer to activate their proposal
        if (msg.sender != proposal.submitter) {
            revert NotAuthorizedToActivateProposal();
        }

        // proposals must be activated within 2 weeks of submission or they expire
        if (block.timestamp > proposal.submissionTimestamp + ACTIVATION_DEADLINE) {
            revert SubmittedProposalHasExpired();
        }

        // require endorsements from at least 20% of the total outstanding governance power
        if ((totalEndorsementsForProposal[proposalId_] * 100) < VOTES.totalSupply() * ENDORSEMENT_THRESHOLD) {
            revert NotEnoughEndorsementsToActivateProposal();
        }

        // ensure the proposal is being activated for the first time
        if (proposalHasBeenActivated[proposalId_] == true) {
            revert ProposalAlreadyActivated();
        }

        // ensure the currently active proposal has had at least a week of voting for execution
        if (block.timestamp < activeProposal.activationTimestamp + 1 weeks) {
            revert ActiveProposalNotExpired();
        }

        // activate the proposal
        activeProposal = ActivatedProposal(proposalId_, block.timestamp);

        // record that the proposal has been activated
        proposalHasBeenActivated[proposalId_] = true;

        // emit the corresponding event
        emit ProposalActivated(proposalId_, block.timestamp);
    }

    function vote(bool for_) external {
        // get the amount of user votes
        uint256 userVotes = VOTES.balanceOf(msg.sender);

        // ensure an active proposal exists
        if (activeProposal.proposalId == 0) {
            revert NoActiveProposalDetected();
        }

        // ensure the user has no pre-existing votes on the proposal
        if (userVotesForProposal[activeProposal.proposalId][msg.sender] > 0) {
            revert UserAlreadyVoted();
        }

        // record the votes
        if (for_) {
            yesVotesForProposal[activeProposal.proposalId] += userVotes;
        } else {
            noVotesForProposal[activeProposal.proposalId] += userVotes;
        }

        // record that the user has casted votes
        userVotesForProposal[activeProposal.proposalId][msg.sender] = userVotes;

        // transfer voting tokens to contract
        VOTES.transferFrom(msg.sender, address(this), userVotes);

        // emit the corresponding event
        emit WalletVoted(activeProposal.proposalId, msg.sender, for_, userVotes);
    }

    function executeProposal() external {
        // require the net votes (yes - no) to be greater than 33% of the total voting supply
        uint256 netVotes = yesVotesForProposal[activeProposal.proposalId] - noVotesForProposal[activeProposal.proposalId];
        if (netVotes * 100 < VOTES.totalSupply() * EXECUTION_THRESHOLD) {
            revert NotEnoughVotesToExecute();
        }

        // ensure some time has passed before the proposal can be executed to prevent flashloan attacks
        if (block.timestamp < activeProposal.activationTimestamp + EXECUTION_TIMELOCK) {
            revert ExecutionTimelockStillActive();
        }

        // execute the active proposal
        Instruction[] memory instructions = INSTR.getInstructions(activeProposal.proposalId);

        for (uint256 step; step < instructions.length; ) {
            kernel.executeAction(instructions[step].action, instructions[step].target);
            unchecked { ++step; }
        }

        // reward the proposer with 2% of the token supply
        address proposer = getProposalMetadata[activeProposal.proposalId].submitter;
        VOTES.mintTo(proposer, VOTES.totalSupply() * GOVERNANCE_BOUNTY / 10000);

        // emit the corresponding event
        emit ProposalExecuted(activeProposal.proposalId);

        // deactivate the active proposal
        activeProposal = ActivatedProposal(0, 0);
    }

    function reclaimVotes(uint256 proposalId_) external {
        // get the amount of tokens the user voted with
        uint256 userVotes = userVotesForProposal[proposalId_][msg.sender];

        // ensure the user is not claiming empty votes
        if (userVotes == 0) {
            revert CannotReclaimZeroVotes();
        }

        // ensure the user is not claiming for the active propsal
        if (proposalId_ == activeProposal.proposalId) {
            revert CannotReclaimTokensForActiveVote();
        }

        // ensure the user has not already claimed before for this proposal
        if (tokenClaimsForProposal[proposalId_][msg.sender] == true) {
            revert VotingTokensAlreadyReclaimed();
        }

        // record the voting tokens being claimed from the contract
        tokenClaimsForProposal[proposalId_][msg.sender] = true;

        // return the tokens back to the user
        VOTES.transferFrom(address(this), msg.sender, userVotes);

        // mint a bonus reward (+.4%) to the user for participation
        VOTES.mintTo(msg.sender, userVotes * VOTER_REWARD_RATE / 10000);
    }
}

Contract ABI

[{"inputs":[{"internalType":"contract Kernel","name":"kernel_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ActiveProposalNotExpired","type":"error"},{"inputs":[],"name":"CannotEndorseInvalidProposal","type":"error"},{"inputs":[],"name":"CannotEndorseNullProposal","type":"error"},{"inputs":[],"name":"CannotReclaimTokensForActiveVote","type":"error"},{"inputs":[],"name":"CannotReclaimZeroVotes","type":"error"},{"inputs":[],"name":"ExecutionTimelockStillActive","type":"error"},{"inputs":[{"internalType":"address","name":"caller_","type":"address"}],"name":"KernelAdapter_OnlyKernel","type":"error"},{"inputs":[],"name":"NoActiveProposalDetected","type":"error"},{"inputs":[],"name":"NotAuthorizedToActivateProposal","type":"error"},{"inputs":[],"name":"NotEnoughEndorsementsToActivateProposal","type":"error"},{"inputs":[],"name":"NotEnoughVotesToExecute","type":"error"},{"inputs":[],"name":"NotEnoughVotesToPropose","type":"error"},{"inputs":[{"internalType":"Keycode","name":"keycode_","type":"bytes5"}],"name":"Policy_ModuleDoesNotExist","type":"error"},{"inputs":[],"name":"ProposalAlreadyActivated","type":"error"},{"inputs":[],"name":"SubmittedProposalHasExpired","type":"error"},{"inputs":[],"name":"UserAlreadyVoted","type":"error"},{"inputs":[],"name":"VotingTokensAlreadyReclaimed","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"ProposalActivated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"address","name":"voter","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ProposalEndorsed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"ProposalExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"ProposalSubmitted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"address","name":"voter","type":"address"},{"indexed":false,"internalType":"bool","name":"for_","type":"bool"},{"indexed":false,"internalType":"uint256","name":"userVotes","type":"uint256"}],"name":"WalletVoted","type":"event"},{"inputs":[],"name":"ACTIVATION_DEADLINE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ENDORSEMENT_THRESHOLD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EXECUTION_THRESHOLD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EXECUTION_TIMELOCK","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GOVERNANCE_BOUNTY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GRACE_PERIOD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"INSTR","outputs":[{"internalType":"contract DefaultInstructions","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VOTER_REWARD_RATE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VOTES","outputs":[{"internalType":"contract DefaultVotes","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId_","type":"uint256"}],"name":"activateProposal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"activeProposal","outputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"},{"internalType":"uint256","name":"activationTimestamp","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract Kernel","name":"newKernel_","type":"address"}],"name":"changeKernel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"configureDependencies","outputs":[{"internalType":"Keycode[]","name":"dependencies","type":"bytes5[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId_","type":"uint256"}],"name":"endorseProposal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"executeProposal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getActiveProposal","outputs":[{"components":[{"internalType":"uint256","name":"proposalId","type":"uint256"},{"internalType":"uint256","name":"activationTimestamp","type":"uint256"}],"internalType":"struct IGovernance.ActivatedProposal","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId_","type":"uint256"}],"name":"getMetadata","outputs":[{"components":[{"internalType":"bytes32","name":"title","type":"bytes32"},{"internalType":"address","name":"submitter","type":"address"},{"internalType":"uint256","name":"submissionTimestamp","type":"uint256"},{"internalType":"string","name":"proposalURI","type":"string"}],"internalType":"struct IGovernance.ProposalMetadata","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getProposalMetadata","outputs":[{"internalType":"bytes32","name":"title","type":"bytes32"},{"internalType":"address","name":"submitter","type":"address"},{"internalType":"uint256","name":"submissionTimestamp","type":"uint256"},{"internalType":"string","name":"proposalURI","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"kernel","outputs":[{"internalType":"contract Kernel","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"noVotesForProposal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"proposalHasBeenActivated","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId_","type":"uint256"}],"name":"reclaimVotes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"requestPermissions","outputs":[{"components":[{"internalType":"Keycode","name":"keycode","type":"bytes5"},{"internalType":"bytes4","name":"funcSelector","type":"bytes4"}],"internalType":"struct Permissions[]","name":"requests","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"activate_","type":"bool"}],"name":"setActiveStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"enum Actions","name":"action","type":"uint8"},{"internalType":"address","name":"target","type":"address"}],"internalType":"struct Instruction[]","name":"instructions_","type":"tuple[]"},{"internalType":"bytes32","name":"title_","type":"bytes32"},{"internalType":"string","name":"proposalURI_","type":"string"}],"name":"submitProposal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"tokenClaimsForProposal","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"totalEndorsementsForProposal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"userEndorsementsForProposal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"userVotesForProposal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"for_","type":"bool"}],"name":"vote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"yesVotesForProposal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b5060405162002ba738038062002ba783398101604081905262000034916200005a565b600080546001600160a01b0319166001600160a01b03929092169190911790556200008c565b6000602082840312156200006d57600080fd5b81516001600160a01b03811681146200008557600080fd5b9392505050565b612b0b806200009c6000396000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c8063742c9fe61161010f578063d419cf48116100a2578063e545739411610071578063e54573941461050a578063eb9b983814610512578063ec7404b114610535578063ee1e9a0c1461054857600080fd5b8063d419cf4814610469578063d4aae0c41461048c578063d7335d03146104ac578063e4b4a727146104ea57600080fd5b8063a574cea4116100de578063a574cea41461040c578063c1a287e21461042c578063d175506714610436578063d2aaa8eb1461044957600080fd5b8063742c9fe6146103a25780637b5eb27b146103cd5780638e7e29cf146103d75780639459b875146103f757600080fd5b806342aa8491116101875780634b9f5c98116101565780634b9f5c981461034c5780634d4b75771461035f5780635924be701461038d5780636bc10c3f1461031557600080fd5b806342aa84911461031557806345ac59551461031d5780634657b36c146103305780634a0323a91461034357600080fd5b806322f3e2d4116101c357806322f3e2d4146102cb578063373058b8146102f0578063387e1c8c146102fa5780633d4cc9581461030d57600080fd5b806301153876146101f557806309fd0d831461022d578063137516d814610272578063179d8bb6146102a0575b600080fd5b610218610203366004612161565b60086020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b60015461024d9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610224565b610292610280366004612161565b60066020526000908152604090205481565b604051908152602001610224565b6102926102ae36600461219f565b600b60209081526000928352604080842090915290825290205481565b6000546102189074010000000000000000000000000000000000000000900460ff1681565b6102f861055b565b005b6102f8610308366004612161565b6109db565b610292602181565b610292600081565b6102f861032b366004612161565b610c67565b6102f861033e3660046121cf565b611013565b61029261025881565b6102f861035a366004612201565b6110b2565b61021861036d36600461219f565b600c60209081526000928352604080842090915290825290205460ff1681565b61039561133d565b604051610224919061221e565b6102926103b036600461219f565b600760209081526000928352604080842090915290825290205481565b6102926212750081565b6102926103e5366004612161565b60096020526000908152604090205481565b6103ff611647565b60405161022491906122b1565b61041f61041a366004612161565b61186d565b6040516102249190612382565b61029262093a8081565b6102f8610444366004612161565b611977565b610292610457366004612161565b600a6020526000908152604090205481565b600354600454610477919082565b60408051928352602083019190915201610224565b60005461024d9073ffffffffffffffffffffffffffffffffffffffff1681565b604080518082018252600080825260209182015281518083018352600354808252600454918301918252835190815290519181019190915201610224565b60025461024d9073ffffffffffffffffffffffffffffffffffffffff1681565b610292601481565b610525610520366004612161565b611bf4565b60405161022494939291906123d9565b6102f8610543366004612201565b611cbe565b6102f8610556366004612553565b611d5b565b6003546000908152600a602090815260408083205460099092528220546105829190612623565b90506021600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105f3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610617919061263a565b6106219190612653565b61062c826064612653565b1015610664576040517f9831686f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6004546106749061025890612690565b4210156106ad576040517f709c69b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001546003546040517ff19928c0000000000000000000000000000000000000000000000000000000008152600481019190915260009173ffffffffffffffffffffffffffffffffffffffff169063f19928c090602401600060405180830381865afa158015610721573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261076791908101906126b5565b905060005b815181101561082f57600054825173ffffffffffffffffffffffffffffffffffffffff9091169063c4d1f8f1908490849081106107ab576107ab612795565b6020026020010151600001518484815181106107c9576107c9612795565b6020026020010151602001516040518363ffffffff1660e01b81526004016107f29291906127ff565b600060405180830381600087803b15801561080c57600080fd5b505af1158015610820573d6000803e3d6000fd5b5050505080600101905061076c565b5060035460009081526005602090815260408083206001015460025482517f18160ddd000000000000000000000000000000000000000000000000000000008152925173ffffffffffffffffffffffffffffffffffffffff92831695919092169363449a52f8938693612710939287926318160ddd92600480830193928290030181865afa1580156108c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108e9919061263a565b6108f39190612653565b6108fd9190612830565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff90921660048301526024820152604401600060405180830381600087803b15801561096857600080fd5b505af115801561097c573d6000803e3d6000fd5b50506003546040519081527f712ae1383f79ac853f8d882153778e0260ef8f03b504e2866e0593e04d2b291f9250602001905060405180910390a150506040805180820190915260008082526020909101819052600381905560045550565b6000818152600b6020908152604080832033845290915281205490819003610a2f576040517f6bd7abe300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6003548203610a6a576040517f0de3e4c100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000828152600c6020908152604080832033845290915290205460ff161515600103610ac2576040517fc23171d600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000828152600c602090815260408083203380855292529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905560025491517f23b872dd00000000000000000000000000000000000000000000000000000000815230600482015260248101919091526044810183905273ffffffffffffffffffffffffffffffffffffffff909116906323b872dd906064016020604051808303816000875af1158015610b84573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ba8919061286b565b5060025473ffffffffffffffffffffffffffffffffffffffff1663449a52f833612710610bd6600086612653565b610be09190612830565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff90921660048301526024820152604401600060405180830381600087803b158015610c4b57600080fd5b505af1158015610c5f573d6000803e3d6000fd5b505050505050565b6000818152600560209081526040808320815160808101835281548152600182015473ffffffffffffffffffffffffffffffffffffffff1693810193909352600281015491830191909152600381018054606084019190610cc790612888565b80601f0160208091040260200160405190810160405280929190818152602001828054610cf390612888565b8015610d405780601f10610d1557610100808354040283529160200191610d40565b820191906000526020600020905b815481529060010190602001808311610d2357829003601f168201915b5050505050815250509050806020015173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610db4576040517f4de79f0b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b621275008160400151610dc79190612690565b421115610e00576040517f96baca5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600254604080517f18160ddd000000000000000000000000000000000000000000000000000000008152905160149273ffffffffffffffffffffffffffffffffffffffff16916318160ddd9160048083019260209291908290030181865afa158015610e70573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e94919061263a565b610e9e9190612653565b600083815260066020526040902054610eb8906064612653565b1015610ef0576040517f688c859b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008281526008602052604090205460ff161515600103610f3d576040517f9d4b96f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600454610f4d9062093a80612690565b421015610f86576040517fdd095e8d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805180820182528381524260209182018190526003859055600481905560008581526008835283902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558251858152918201527f2b806fd287b9b5a02303f4209a6276f6fc3c57a7081780b1862a1da3ae24d15e91015b60405180910390a15050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461106b576040517f14fa403c0000000000000000000000000000000000000000000000000000000081523360048201526024015b60405180910390fd5b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6002546040517f70a0823100000000000000000000000000000000000000000000000000000000815233600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015611121573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611145919061263a565b600354909150600003611184576040517ff6b9a51000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6003546000908152600b60209081526040808320338452909152902054156111d8576040517f38ec521300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b811561120a57600354600090815260096020526040812080548392906111ff908490612690565b909155506112319050565b6003546000908152600a60205260408120805483929061122b908490612690565b90915550505b6003546000908152600b602090815260408083203380855292529182902083905560025491517f23b872dd00000000000000000000000000000000000000000000000000000000815260048101919091523060248201526044810183905273ffffffffffffffffffffffffffffffffffffffff909116906323b872dd906064016020604051808303816000875af11580156112d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112f4919061286b565b506003546040805191825233602083015283151590820152606081018290527f1954f7e73fcf13e5923622fa4857346300f0edfaf363fb5da7a72eaf13d7c51690608001611007565b60005460609073ffffffffffffffffffffffffffffffffffffffff163314611393576040517f14fa403c000000000000000000000000000000000000000000000000000000008152336004820152602401611062565b60408051600480825260a0820190925290816020015b60408051808201909152600080825260208201528152602001906001900390816113a957905050905060405180604001604052806114047f494e53545200000000000000000000000000000000000000000000000000000090565b7fffffffffff0000000000000000000000000000000000000000000000000000001681527fb1d85eec000000000000000000000000000000000000000000000000000000006020909101528151829060009061146257611462612795565b6020026020010181905250604051806040016040528061149f7f564f54455300000000000000000000000000000000000000000000000000000090565b7fffffffffff0000000000000000000000000000000000000000000000000000001681527f449a52f8000000000000000000000000000000000000000000000000000000006020909101528151829060019081106114ff576114ff612795565b6020026020010181905250604051806040016040528061153c7f564f54455300000000000000000000000000000000000000000000000000000090565b7fffffffffff0000000000000000000000000000000000000000000000000000001681527f79cc67900000000000000000000000000000000000000000000000000000000060209091015281518290600290811061159c5761159c612795565b602002602001018190525060405180604001604052806115d97f564f54455300000000000000000000000000000000000000000000000000000090565b7fffffffffff0000000000000000000000000000000000000000000000000000001681527f23b872dd0000000000000000000000000000000000000000000000000000000060209091015281518290600390811061163957611639612795565b602002602001018190525090565b60005460609073ffffffffffffffffffffffffffffffffffffffff16331461169d576040517f14fa403c000000000000000000000000000000000000000000000000000000008152336004820152602401611062565b60408051600280825260608201835290916020830190803683370190505090507f494e535452000000000000000000000000000000000000000000000000000000816000815181106116f1576116f1612795565b7fffffffffff0000000000000000000000000000000000000000000000000000009092166020928302919091019091015261175161174c7f494e53545200000000000000000000000000000000000000000000000000000090565b612033565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff929092169190911790557f564f544553000000000000000000000000000000000000000000000000000000816001815181106117ca576117ca612795565b7fffffffffff0000000000000000000000000000000000000000000000000000009092166020928302919091019091015261182561174c7f564f54455300000000000000000000000000000000000000000000000000000090565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691909117905590565b604080516080808201835260008083526020808401829052838501829052606080850181905286835260058252918590208551938401865280548452600181015473ffffffffffffffffffffffffffffffffffffffff169184019190915260028101549483019490945260038401805493949293918401916118ee90612888565b80601f016020809104026020016040519081016040528092919081815260200182805461191a90612888565b80156119675780601f1061193c57610100808354040283529160200191611967565b820191906000526020600020905b81548152906001019060200180831161194a57829003601f168201915b5050505050815250509050919050565b6002546040517f70a0823100000000000000000000000000000000000000000000000000000000815233600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa1580156119e6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a0a919061263a565b905081600003611a46576040517ff655d1a800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001546040517ff19928c00000000000000000000000000000000000000000000000000000000081526004810184905260009173ffffffffffffffffffffffffffffffffffffffff169063f19928c090602401600060405180830381865afa158015611ab6573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611afc91908101906126b5565b90508051600003611b39576040517f786d51dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600083815260076020908152604080832033845282528083205486845260069092528220805491928392611b6e908490612623565b909155505060008481526007602090815260408083203384528252808320869055868352600690915281208054859290611ba9908490612690565b9091555050604080518581523360208201529081018490527ff639be31b4468db993d6fb19466ffbcda6a9a93d5015525821eadb0c90e9938b9060600160405180910390a150505050565b6005602052600090815260409020805460018201546002830154600384018054939473ffffffffffffffffffffffffffffffffffffffff90931693919291611c3b90612888565b80601f0160208091040260200160405190810160405280929190818152602001828054611c6790612888565b8015611cb45780601f10611c8957610100808354040283529160200191611cb4565b820191906000526020600020905b815481529060010190602001808311611c9757829003601f168201915b5050505050905084565b60005473ffffffffffffffffffffffffffffffffffffffff163314611d11576040517f14fa403c000000000000000000000000000000000000000000000000000000008152336004820152602401611062565b6000805491151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611dc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dec919061263a565b6002546040517f70a0823100000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff909116906370a0823190602401602060405180830381865afa158015611e5a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e7e919061263a565b611e89906064612653565b1015611ec1576040517f97ba73bf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001546040517fb1d85eec00000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff169063b1d85eec90611f1a90889088906004016128db565b6020604051808303816000875af1158015611f39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f5d919061263a565b60408051608081018252858152336020808301918252428385019081526060840188815260008781526005909352949091208351815591516001830180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9092169190911790555160028201559151929350916003820190611ff6908261299e565b50506040518281527f05aed0f9e08bd59568a150f02aa524912356d7109fd145147712dc2782d83b63915060200160405180910390a15050505050565b600080546040517fb4dc00b40000000000000000000000000000000000000000000000000000000081527fffffffffff00000000000000000000000000000000000000000000000000000084166004820152829173ffffffffffffffffffffffffffffffffffffffff169063b4dc00b490602401602060405180830381865afa1580156120c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120e89190612ab8565b905073ffffffffffffffffffffffffffffffffffffffff811661215b576040517f5c3fa9cd0000000000000000000000000000000000000000000000000000000081527fffffffffff00000000000000000000000000000000000000000000000000000084166004820152602401611062565b92915050565b60006020828403121561217357600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461219c57600080fd5b50565b600080604083850312156121b257600080fd5b8235915060208301356121c48161217a565b809150509250929050565b6000602082840312156121e157600080fd5b81356121ec8161217a565b9392505050565b801515811461219c57600080fd5b60006020828403121561221357600080fd5b81356121ec816121f3565b602080825282518282018190526000919060409081850190868401855b828110156122a457815180517fffffffffff0000000000000000000000000000000000000000000000000000001685528601517fffffffff000000000000000000000000000000000000000000000000000000001686850152928401929085019060010161223b565b5091979650505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561230b5783517fffffffffff00000000000000000000000000000000000000000000000000000016835292840192918401916001016122cd565b50909695505050505050565b6000815180845260005b8181101561233d57602081850181015186830182015201612321565b8181111561234f576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081528151602082015273ffffffffffffffffffffffffffffffffffffffff602083015116604082015260408201516060820152600060608301516080808401526123d160a0840182612317565b949350505050565b84815273ffffffffffffffffffffffffffffffffffffffff841660208201528260408201526080606082015260006124146080830184612317565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156124705761247061241e565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156124bd576124bd61241e565b604052919050565b600082601f8301126124d657600080fd5b813567ffffffffffffffff8111156124f0576124f061241e565b61252160207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601612476565b81815284602083860101111561253657600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000806060858703121561256957600080fd5b843567ffffffffffffffff8082111561258157600080fd5b818701915087601f83011261259557600080fd5b8135818111156125a457600080fd5b8860208260061b85010111156125b957600080fd5b602092830196509450908601359250604086013590808211156125db57600080fd5b506125e8878288016124c5565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015612635576126356125f4565b500390565b60006020828403121561264c57600080fd5b5051919050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561268b5761268b6125f4565b500290565b600082198211156126a3576126a36125f4565b500190565b6007811061219c57600080fd5b600060208083850312156126c857600080fd5b825167ffffffffffffffff808211156126e057600080fd5b818501915085601f8301126126f457600080fd5b8151818111156127065761270661241e565b612714848260051b01612476565b818152848101925060069190911b83018401908782111561273457600080fd5b928401925b8184101561278a57604084890312156127525760008081fd5b61275a61244d565b8451612765816126a8565b8152848601516127748161217a565b8187015283526040939093019291840191612739565b979650505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600781106127fb577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b6040810161280d82856127c4565b73ffffffffffffffffffffffffffffffffffffffff831660208301529392505050565b600082612866577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60006020828403121561287d57600080fd5b81516121ec816121f3565b600181811c9082168061289c57607f821691505b6020821081036128d5577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b6020808252818101839052600090604080840186845b87811015612946578135612904816126a8565b61290e84826127c4565b508482013561291c8161217a565b73ffffffffffffffffffffffffffffffffffffffff168386015291830191908301906001016128f1565b5090979650505050505050565b601f82111561299957600081815260208120601f850160051c8101602086101561297a5750805b601f850160051c820191505b81811015610c5f57828155600101612986565b505050565b815167ffffffffffffffff8111156129b8576129b861241e565b6129cc816129c68454612888565b84612953565b602080601f831160018114612a1f57600084156129e95750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555610c5f565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015612a6c57888601518255948401946001909101908401612a4d565b5085821015612aa857878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b600060208284031215612aca57600080fd5b81516121ec8161217a56fea264697066735822122048ae5dc5e7f2aa007d7489216d45900fb703403776916574fcce86c84f03a1ca64736f6c634300080f0033000000000000000000000000a2d346fe55133884bc6f58093ae5ab6b94df608a

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000a2d346fe55133884bc6f58093ae5ab6b94df608a

-----Decoded View---------------
Arg [0] : kernel_ (address): 0xa2d346fe55133884bc6f58093ae5ab6b94df608a

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000a2d346fe55133884bc6f58093ae5ab6b94df608a


Deployed ByteCode Sourcemap

29206:11223:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31176:56;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;364:14:1;;357:22;339:41;;327:2;312:18;31176:56:0;;;;;;;;29521:32;;;;;;;;;;;;595:42:1;583:55;;;565:74;;553:2;538:18;29521:32:0;391:254:1;31017:63:0;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;796:25:1;;;784:2;769:18;31017:63:0;650:177:1;31360:75:0;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;4450:20;;;;;;;;;;;;37857:1418;;;:::i;:::-;;39283:1143;;;;;;:::i;:::-;;:::i;31924:48::-;;31970:2;31924:48;;32172:45;;32216:1;32172:45;;35099:1641;;;;;;:::i;:::-;;:::i;3263:99::-;;;;;;:::i;:::-;;:::i;32039:55::-;;32084:10;32039:55;;36748:1101;;;;;;:::i;:::-;;:::i;31442:74::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;30067:527;;;:::i;:::-;;;;;;;:::i;31087:82::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;31525:53;;31571:7;31525:53;;31239:54;;;;;;:::i;:::-;;;;;;;;;;;;;;29648:411;;;:::i;:::-;;;;;;;:::i;32634:146::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;31658:46::-;;31697:7;31658:46;;33974:1117;;;;;;:::i;:::-;;:::i;31300:53::-;;;;;;:::i;:::-;;;;;;;;;;;;;;30899:39;;;;;;;;;;;;;;4929:25:1;;;4985:2;4970:18;;4963:34;;;;4902:18;30899:39:0;4755:248:1;3024:20:0;;;;;;;;;32788:116;-1:-1:-1;;;;;;;;;;;;;;;;;32875:21:0;;;;;;;32882:14;32875:21;;;;;;;;;;;;32788:116;;5470:32:1;;;5540:24;;5518:20;;;5511:54;;;;5443:18;32788:116:0;5254:317:1;29560:25:0;;;;;;;;;31789:50;;31837:2;31789:50;;30947:63;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;5319:100::-;;;;;;:::i;:::-;;:::i;33175:791::-;;;;;;:::i;:::-;;:::i;37857:1418::-;38086:14;:25;37999:16;38067:45;;;:18;:45;;;;;;;;;38018:19;:46;;;;;;:94;;38067:45;38018:94;:::i;:::-;37999:113;;31970:2;38144:5;;;;;;;;;;;:17;;;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:41;;;;:::i;:::-;38127:14;:8;38138:3;38127:14;:::i;:::-;:58;38123:123;;;38209:25;;;;;;;;;;;;;;38123:123;38385:34;;:55;;32084:10;;38385:55;:::i;:::-;38367:15;:73;38363:143;;;38464:30;;;;;;;;;;;;;;38363:143;38594:5;;38616:14;:25;38594:48;;;;;;;;796:25:1;;;;38558:33:0;;38594:5;;;:21;;769:18:1;;38594:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38558:84;;38660:12;38655:185;38681:12;:19;38674:4;:26;38655:185;;;38719:6;;38740:18;;38719:6;;;;;:20;;38740:12;;38753:4;;38740:18;;;;;;:::i;:::-;;;;;;;:25;;;38767:12;38780:4;38767:18;;;;;;;;:::i;:::-;;;;;;;:25;;;38719:74;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38820:6;;;;;38655:185;;;-1:-1:-1;38951:14:0;:25;38912:16;38931:46;;;:19;:46;;;;;;;;:56;;;38998:5;;39021:19;;;;;;;38931:56;;;;;38998:5;;;;;:12;;38931:56;;39063:5;;38912:16;38998:5;;39021:17;;:19;;;;;38931:46;39021:19;;;;;38998:5;39021:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:39;;;;:::i;:::-;:47;;;;:::i;:::-;38998:71;;;;;;;;;;12301:42:1;12289:55;;;38998:71:0;;;12271:74:1;12361:18;;;12354:34;12244:18;;38998:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;39145:14:0;:25;39128:43;;796:25:1;;;39128:43:0;;-1:-1:-1;784:2:1;769:18;;-1:-1:-1;39128:43:0;;;;;;;-1:-1:-1;;39244:23:0;;;;;;;;;-1:-1:-1;39244:23:0;;;;;;;;;;39227:14;:40;;;;;-1:-1:-1;37857:1418:0:o;39283:1143::-;39403:17;39423:33;;;:20;:33;;;;;;;;39457:10;39423:45;;;;;;;;;39541:14;;;39537:78;;39579:24;;;;;;;;;;;;;;39537:78;39713:14;:25;39698:40;;39694:114;;39762:34;;;;;;;;;;;;;;39694:114;39901:35;;;;:22;:35;;;;;;;;39937:10;39901:47;;;;;;;;;;:55;;:47;:55;39897:125;;39980:30;;;;;;;;;;;;;;39897:125;40103:35;;;;:22;:35;;;;;;;;40139:10;40103:47;;;;;;;;;:54;;;;40153:4;40103:54;;;40217:5;;:56;;;;;40244:4;40217:56;;;12662:34:1;12712:18;;;12705:43;;;;12764:18;;;12757:34;;;40103:47:0;40217:5;;;;:18;;12574::1;;40217:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;40355:5:0;;;;:12;40368:10;40412:5;40380:29;40355:5;40380:9;:29;:::i;:::-;:37;;;;:::i;:::-;40355:63;;;;;;;;;;12301:42:1;12289:55;;;40355:63:0;;;12271:74:1;12361:18;;;12354:34;12244:18;;40355:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39335:1091;39283:1143;:::o;35099:1641::-;35211:32;35246;;;:19;:32;;;;;;;;35211:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35372:8;:18;;;35358:32;;:10;:32;;;35354:105;;35414:33;;;;;;;;;;;;;;35354:105;31571:7;35577:8;:28;;;:50;;;;:::i;:::-;35559:15;:68;35555:137;;;35651:29;;;;;;;;;;;;;;35555:137;35853:5;;:19;;;;;;;;31837:2;;35853:5;;;:17;;:19;;;;;;;;;;;;;;:5;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:43;;;;:::i;:::-;35802:41;;;;:28;:41;;;;;;:47;;35846:3;35802:47;:::i;:::-;35801:95;35797:176;;;35920:41;;;;;;;;;;;;;;35797:176;36059:37;;;;:24;:37;;;;;;;;:45;;:37;:45;36055:111;;36128:26;;;;;;;;;;;;;;36055:111;36297:34;;:44;;36334:7;36297:44;:::i;:::-;36279:15;:62;36275:128;;;36365:26;;;;;;;;;;;;;;36275:128;36466:47;;;;;;;;;;;36497:15;36466:47;;;;;;;36449:14;:64;;;;;;;-1:-1:-1;36582:37:0;;;:24;:37;;;;;:44;;;;36449:64;36582:44;;;36685:47;;4929:25:1;;;4970:18;;;4963:34;36685:47:0;;4902:18:1;36685:47:0;;;;;;;;35155:1585;35099:1641;:::o;3263:99::-;3183:6;;;;3161:10;:29;3157:78;;3199:36;;;;;3224:10;3199:36;;;565:74:1;538:18;;3199:36:0;;;;;;;;3157:78;3335:6:::1;:19:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;3263:99::o;36748:1101::-;36854:5;;:27;;;;;36870:10;36854:27;;;565:74:1;36834:17:0;;36854:5;;;:15;;538:18:1;;36854:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36943:14;:25;36834:47;;-1:-1:-1;36943:25:0;:30;36939:96;;36997:26;;;;;;;;;;;;;;36939:96;37142:14;:25;37183:1;37121:47;;;:20;:47;;;;;;;;37169:10;37121:59;;;;;;;;:63;37117:121;;37208:18;;;;;;;;;;;;;;37117:121;37283:4;37279:187;;;37324:14;:25;37304:46;;;;:19;:46;;;;;:59;;37354:9;;37304:46;:59;;37354:9;;37304:59;:::i;:::-;;;;-1:-1:-1;37279:187:0;;-1:-1:-1;37279:187:0;;37415:14;:25;37396:45;;;;:18;:45;;;;;:58;;37445:9;;37396:45;:58;;37445:9;;37396:58;:::i;:::-;;;;-1:-1:-1;;37279:187:0;37549:14;:25;37528:47;;;;:20;:47;;;;;;;;37576:10;37528:59;;;;;;;;;:71;;;37659:5;;:56;;;;;;;;12662:34:1;;;;37698:4:0;12712:18:1;;;12705:43;12764:18;;;12757:34;;;37528:59:0;37659:5;;;;:18;;12574::1;;37659:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;37786:14:0;:25;37774:67;;;13950:25:1;;;37813:10:0;14006:2:1;13991:18;;13984:83;14110:14;;14103:22;14083:18;;;14076:50;14157:2;14142:18;;14135:34;;;37774:67:0;;13937:3:1;13922:19;37774:67:0;13725:450:1;30067:527:0;3183:6;;30185:29;;3183:6;;3161:10;:29;3157:78;;3199:36;;;;;3224:10;3199:36;;;565:74:1;538:18;;3199:36:0;391:254:1;3157:78:0;30243:20:::1;::::0;;30261:1:::1;30243:20:::0;;;;;::::1;::::0;;;;::::1;;;;-1:-1:-1::0;;;;;;;;;;;;;;;;;30243:20:0::1;;;;;;;;;;;;;;;30232:31;;30288:53;;;;;;;;30300:18;;488:8:::0;402:99;30300:18:::1;30288:53:::0;::::1;::::0;;30320:20;30288:53:::1;::::0;;::::1;::::0;30274:11;;:8;;-1:-1:-1;;30274:11:0::1;;;;:::i;:::-;;;;;;:67;;;;30366:54;;;;;;;;30378:18;;488:8:::0;402:99;30378:18:::1;30366:54:::0;::::1;::::0;;30398:21;30366:54:::1;::::0;;::::1;::::0;30352:11;;:8;;30361:1:::1;::::0;30352:11;::::1;;;;;:::i;:::-;;;;;;:68;;;;30445:56;;;;;;;;30457:18;;488:8:::0;402:99;30457:18:::1;30445:56:::0;::::1;::::0;;30477:23;30445:56:::1;::::0;;::::1;::::0;30431:11;;:8;;30440:1:::1;::::0;30431:11;::::1;;;;;:::i;:::-;;;;;;:70;;;;30526:60;;;;;;;;30538:18;;488:8:::0;402:99;30538:18:::1;30526:60:::0;::::1;::::0;;30558:27;30526:60:::1;::::0;;::::1;::::0;30512:11;;:8;;30521:1:::1;::::0;30512:11;::::1;;;;;:::i;:::-;;;;;;:74;;;;30067:527:::0;:::o;29648:411::-;3183:6;;29719:29;;3183:6;;3161:10;:29;3157:78;;3199:36;;;;;3224:10;3199:36;;;565:74:1;538:18;;3199:36:0;391:254:1;3157:78:0;29776:16:::1;::::0;;29790:1:::1;29776:16:::0;;;;;::::1;::::0;;;;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;;29761:31:0;-1:-1:-1;29831:18:0::1;29813:12;29826:1;29813:15;;;;;;;;:::i;:::-;:36:::0;;;::::1;:15;::::0;;::::1;::::0;;;;;;;:36;29888::::1;29905:18;;488:8:::0;402:99;29905:18:::1;29888:16;:36::i;:::-;29860:5;:65:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;29964:18:::1;29946:12;29959:1;29946:15;;;;;;;;:::i;:::-;:36:::0;;;::::1;:15;::::0;;::::1;::::0;;;;;;;:36;30014::::1;30031:18;;488:8:::0;402:99;30014:36:::1;29993:5;:58:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;29648:411;:::o;32634:146::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32740:32:0;;;:19;:32;;;;;;32733:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;32733:39:0;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32634:146;;;:::o;33974:1117::-;34106:5;;:27;;;;;34122:10;34106:27;;;565:74:1;34086:17:0;;34106:5;;;:15;;538:18:1;;34106:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34086:47;;34198:11;34213:1;34198:16;34194:83;;34238:27;;;;;;;;;;;;;;34194:83;34379:5;;:34;;;;;;;;796:25:1;;;34343:33:0;;34379:5;;;:21;;769:18:1;;34379:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34343:70;;34428:12;:19;34451:1;34428:24;34424:94;;34476:30;;;;;;;;;;;;;;34424:94;34608:27;34638:40;;;:27;:40;;;;;;;;34679:10;34638:52;;;;;;;;34701:41;;;:28;:41;;;;;:64;;34638:52;;;;34701:64;;34638:52;;34701:64;:::i;:::-;;;;-1:-1:-1;;34843:40:0;;;;:27;:40;;;;;;;;34884:10;34843:52;;;;;;;:64;;;34918:41;;;:28;:41;;;;;:54;;34898:9;;34843:40;34918:54;;34898:9;;34918:54;:::i;:::-;;;;-1:-1:-1;;35031:52:0;;;14382:25:1;;;35061:10:0;14438:2:1;14423:18;;14416:83;14515:18;;;14508:34;;;35031:52:0;;14370:2:1;14355:18;35031:52:0;;;;;;;34029:1062;;;33974:1117;:::o;30947:63::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5319:100::-;3183:6;;;;3161:10;:29;3157:78;;3199:36;;;;;3224:10;3199:36;;;565:74:1;538:18;;3199:36:0;391:254:1;3157:78:0;5391:8:::1;:20:::0;;;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;5319:100::o;33175:791::-;33437:5;;;;;;;;;;;:17;;;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33401:5;;:27;;;;;33417:10;33401:27;;;565:74:1;33401:5:0;;;;;:15;;538:18:1;;33401:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:33;;33431:3;33401:33;:::i;:::-;:55;33397:120;;;33480:25;;;;;;;;;;;;;;33397:120;33669:5;;:26;;;;;33648:18;;33669:5;;;:11;;:26;;33681:13;;;;33669:26;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33740:130;;;;;;;;;;;33792:10;33740:130;;;;;;;33817:15;33740:130;;;;;;;;;;;;-1:-1:-1;33706:31:0;;;:19;:31;;;;;;;:164;;;;;;;;;;;;;33740:130;33706:164;;;;;;;;;;;;;;;;:31;;-1:-1:-1;33740:130:0;33706:164;;;;;;;;:::i;:::-;-1:-1:-1;;33929:29:0;;796:25:1;;;33929:29:0;;-1:-1:-1;784:2:1;769:18;33929:29:0;;;;;;;33290:676;33175:791;;;;:::o;4951:290::-;5018:7;5073:6;;:36;;;;;18117:66:1;18105:79;;5073:36:0;;;18087:98:1;5018:7:0;;5073:6;;;:26;;18060:18:1;;5073:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5038:72;-1:-1:-1;5125:30:0;;;5121:78;;5164:35;;;;;18117:66:1;18105:79;;5164:35:0;;;18087:98:1;18060:18;;5164:35:0;17915:276:1;5121:78:0;5217:16;4951:290;-1:-1:-1;;4951:290:0:o;14:180:1:-;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;-1:-1:-1;165:23:1;;14:180;-1:-1:-1;14:180:1:o;832:154::-;918:42;911:5;907:54;900:5;897:65;887:93;;976:1;973;966:12;887:93;832:154;:::o;991:315::-;1059:6;1067;1120:2;1108:9;1099:7;1095:23;1091:32;1088:52;;;1136:1;1133;1126:12;1088:52;1172:9;1159:23;1149:33;;1232:2;1221:9;1217:18;1204:32;1245:31;1270:5;1245:31;:::i;:::-;1295:5;1285:15;;;991:315;;;;;:::o;1311:262::-;1385:6;1438:2;1426:9;1417:7;1413:23;1409:32;1406:52;;;1454:1;1451;1444:12;1406:52;1493:9;1480:23;1512:31;1537:5;1512:31;:::i;:::-;1562:5;1311:262;-1:-1:-1;;;1311:262:1:o;1578:118::-;1664:5;1657:13;1650:21;1643:5;1640:32;1630:60;;1686:1;1683;1676:12;1701:241;1757:6;1810:2;1798:9;1789:7;1785:23;1781:32;1778:52;;;1826:1;1823;1816:12;1778:52;1865:9;1852:23;1884:28;1906:5;1884:28;:::i;1947:940::-;2174:2;2226:21;;;2296:13;;2199:18;;;2318:22;;;2145:4;;2174:2;2359;;2377:18;;;;2418:15;;;2145:4;2461:400;2475:6;2472:1;2469:13;2461:400;;;2534:13;;2576:9;;2587:66;2572:82;2560:95;;2699:11;;2693:18;2713:66;2689:91;2675:12;;;2668:113;2801:12;;;;2836:15;;;;2497:1;2490:9;2461:400;;;-1:-1:-1;2878:3:1;;1947:940;-1:-1:-1;;;;;;;1947:940:1:o;2892:731::-;3089:2;3141:21;;;3211:13;;3114:18;;;3233:22;;;3060:4;;3089:2;3312:15;;;;3286:2;3271:18;;;3060:4;3355:242;3369:6;3366:1;3363:13;3355:242;;;3434:13;;3449:66;3430:86;3418:99;;3572:15;;;;3537:12;;;;3391:1;3384:9;3355:242;;;-1:-1:-1;3614:3:1;;2892:731;-1:-1:-1;;;;;;2892:731:1:o;3628:531::-;3670:3;3708:5;3702:12;3735:6;3730:3;3723:19;3760:1;3770:162;3784:6;3781:1;3778:13;3770:162;;;3846:4;3902:13;;;3898:22;;3892:29;3874:11;;;3870:20;;3863:59;3799:12;3770:162;;;3950:6;3947:1;3944:13;3941:87;;;4016:1;4009:4;4000:6;3995:3;3991:16;3987:27;3980:38;3941:87;-1:-1:-1;4073:2:1;4061:15;4078:66;4057:88;4048:98;;;;4148:4;4044:109;;3628:531;-1:-1:-1;;3628:531:1:o;4164:586::-;4361:2;4350:9;4343:21;4406:6;4400:13;4395:2;4384:9;4380:18;4373:41;4478:42;4472:2;4464:6;4460:15;4454:22;4450:71;4445:2;4434:9;4430:18;4423:99;4576:2;4568:6;4564:15;4558:22;4553:2;4542:9;4538:18;4531:50;4324:4;4628:2;4620:6;4616:15;4610:22;4670:4;4663;4652:9;4648:20;4641:34;4692:52;4739:3;4728:9;4724:19;4710:12;4692:52;:::i;:::-;4684:60;4164:586;-1:-1:-1;;;;4164:586:1:o;5828:484::-;6061:6;6050:9;6043:25;6116:42;6108:6;6104:55;6099:2;6088:9;6084:18;6077:83;6196:6;6191:2;6180:9;6176:18;6169:34;6239:3;6234:2;6223:9;6219:18;6212:31;6024:4;6260:46;6301:3;6290:9;6286:19;6278:6;6260:46;:::i;:::-;6252:54;5828:484;-1:-1:-1;;;;;;5828:484:1:o;6317:184::-;6369:77;6366:1;6359:88;6466:4;6463:1;6456:15;6490:4;6487:1;6480:15;6506:257;6578:4;6572:11;;;6610:17;;6657:18;6642:34;;6678:22;;;6639:62;6636:88;;;6704:18;;:::i;:::-;6740:4;6733:24;6506:257;:::o;6768:334::-;6839:2;6833:9;6895:2;6885:13;;6900:66;6881:86;6869:99;;6998:18;6983:34;;7019:22;;;6980:62;6977:88;;;7045:18;;:::i;:::-;7081:2;7074:22;6768:334;;-1:-1:-1;6768:334:1:o;7107:590::-;7150:5;7203:3;7196:4;7188:6;7184:17;7180:27;7170:55;;7221:1;7218;7211:12;7170:55;7257:6;7244:20;7283:18;7279:2;7276:26;7273:52;;;7305:18;;:::i;:::-;7349:114;7457:4;7388:66;7381:4;7377:2;7373:13;7369:86;7365:97;7349:114;:::i;:::-;7488:2;7479:7;7472:19;7534:3;7527:4;7522:2;7514:6;7510:15;7506:26;7503:35;7500:55;;;7551:1;7548;7541:12;7500:55;7616:2;7609:4;7601:6;7597:17;7590:4;7581:7;7577:18;7564:55;7664:1;7639:16;;;7657:4;7635:27;7628:38;;;;7643:7;7107:590;-1:-1:-1;;;7107:590:1:o;7702:919::-;7846:6;7854;7862;7870;7923:2;7911:9;7902:7;7898:23;7894:32;7891:52;;;7939:1;7936;7929:12;7891:52;7979:9;7966:23;8008:18;8049:2;8041:6;8038:14;8035:34;;;8065:1;8062;8055:12;8035:34;8103:6;8092:9;8088:22;8078:32;;8148:7;8141:4;8137:2;8133:13;8129:27;8119:55;;8170:1;8167;8160:12;8119:55;8210:2;8197:16;8236:2;8228:6;8225:14;8222:34;;;8252:1;8249;8242:12;8222:34;8307:7;8300:4;8290:6;8287:1;8283:14;8279:2;8275:23;8271:34;8268:47;8265:67;;;8328:1;8325;8318:12;8265:67;8359:4;8351:13;;;;-1:-1:-1;8383:6:1;-1:-1:-1;8421:20:1;;;8408:34;;-1:-1:-1;8495:2:1;8480:18;;8467:32;;8511:16;;;8508:36;;;8540:1;8537;8530:12;8508:36;;8563:52;8607:7;8596:8;8585:9;8581:24;8563:52;:::i;:::-;8553:62;;;7702:919;;;;;;;:::o;8626:184::-;8678:77;8675:1;8668:88;8775:4;8772:1;8765:15;8799:4;8796:1;8789:15;8815:125;8855:4;8883:1;8880;8877:8;8874:34;;;8888:18;;:::i;:::-;-1:-1:-1;8925:9:1;;8815:125::o;8945:184::-;9015:6;9068:2;9056:9;9047:7;9043:23;9039:32;9036:52;;;9084:1;9081;9074:12;9036:52;-1:-1:-1;9107:16:1;;8945:184;-1:-1:-1;8945:184:1:o;9134:228::-;9174:7;9300:1;9232:66;9228:74;9225:1;9222:81;9217:1;9210:9;9203:17;9199:105;9196:131;;;9307:18;;:::i;:::-;-1:-1:-1;9347:9:1;;9134:228::o;9367:128::-;9407:3;9438:1;9434:6;9431:1;9428:13;9425:39;;;9444:18;;:::i;:::-;-1:-1:-1;9480:9:1;;9367:128::o;9500:106::-;9580:1;9573:5;9570:12;9560:40;;9596:1;9593;9586:12;9611:1388;9734:6;9765:2;9808;9796:9;9787:7;9783:23;9779:32;9776:52;;;9824:1;9821;9814:12;9776:52;9857:9;9851:16;9886:18;9927:2;9919:6;9916:14;9913:34;;;9943:1;9940;9933:12;9913:34;9981:6;9970:9;9966:22;9956:32;;10026:7;10019:4;10015:2;10011:13;10007:27;9997:55;;10048:1;10045;10038:12;9997:55;10077:2;10071:9;10099:2;10095;10092:10;10089:36;;;10105:18;;:::i;:::-;10145:36;10177:2;10172;10169:1;10165:10;10161:19;10145:36;:::i;:::-;10215:15;;;10246:12;;;;-1:-1:-1;10297:1:1;10293:10;;;;10285:19;;10281:28;;;10321:19;;;10318:39;;;10353:1;10350;10343:12;10318:39;10377:11;;;;10397:572;10413:6;10408:3;10405:15;10397:572;;;10495:4;10489:3;10480:7;10476:17;10472:28;10469:118;;;10541:1;10570:2;10566;10559:14;10469:118;10613:22;;:::i;:::-;10669:3;10663:10;10686:38;10716:7;10686:38;:::i;:::-;10737:22;;10793:12;;;10787:19;10819:33;10787:19;10819:33;:::i;:::-;10872:14;;;10865:31;10909:18;;10439:4;10430:14;;;;;10947:12;;;;10397:572;;;10988:5;9611:1388;-1:-1:-1;;;;;;;9611:1388:1:o;11004:184::-;11056:77;11053:1;11046:88;11153:4;11150:1;11143:15;11177:4;11174:1;11167:15;11193:292;11272:1;11265:5;11262:12;11252:200;;11308:77;11305:1;11298:88;11409:4;11406:1;11399:15;11437:4;11434:1;11427:15;11252:200;11461:18;;11193:292::o;11490:323::-;11661:2;11646:18;;11673:42;11650:9;11697:6;11673:42;:::i;:::-;11763;11755:6;11751:55;11746:2;11735:9;11731:18;11724:83;11490:323;;;;;:::o;11818:274::-;11858:1;11884;11874:189;;11919:77;11916:1;11909:88;12020:4;12017:1;12010:15;12048:4;12045:1;12038:15;11874:189;-1:-1:-1;12077:9:1;;11818:274::o;12802:245::-;12869:6;12922:2;12910:9;12901:7;12897:23;12893:32;12890:52;;;12938:1;12935;12928:12;12890:52;12970:9;12964:16;12989:28;13011:5;12989:28;:::i;13052:437::-;13131:1;13127:12;;;;13174;;;13195:61;;13249:4;13241:6;13237:17;13227:27;;13195:61;13302:2;13294:6;13291:14;13271:18;13268:38;13265:218;;13339:77;13336:1;13329:88;13440:4;13437:1;13430:15;13468:4;13465:1;13458:15;13265:218;;13052:437;;;:::o;14553:974::-;14792:2;14844:21;;;14817:18;;;14900:22;;;14763:4;;14941:2;14959:18;;;15000:6;14763:4;15034:467;15048:6;15045:1;15042:13;15034:467;;;15123:6;15110:20;15143:36;15173:5;15143:36;:::i;:::-;15192:35;15223:3;15216:5;15192:35;:::i;:::-;;15280:2;15272:6;15268:15;15255:29;15297:33;15322:7;15297:33;:::i;:::-;15377:42;15364:56;15350:12;;;15343:78;15441:12;;;;15476:15;;;;15070:1;15063:9;15034:467;;;-1:-1:-1;15518:3:1;;14553:974;-1:-1:-1;;;;;;;14553:974:1:o;15658:545::-;15760:2;15755:3;15752:11;15749:448;;;15796:1;15821:5;15817:2;15810:17;15866:4;15862:2;15852:19;15936:2;15924:10;15920:19;15917:1;15913:27;15907:4;15903:38;15972:4;15960:10;15957:20;15954:47;;;-1:-1:-1;15995:4:1;15954:47;16050:2;16045:3;16041:12;16038:1;16034:20;16028:4;16024:31;16014:41;;16105:82;16123:2;16116:5;16113:13;16105:82;;;16168:17;;;16149:1;16138:13;16105:82;;15749:448;15658:545;;;:::o;16439:1471::-;16565:3;16559:10;16592:18;16584:6;16581:30;16578:56;;;16614:18;;:::i;:::-;16643:97;16733:6;16693:38;16725:4;16719:11;16693:38;:::i;:::-;16687:4;16643:97;:::i;:::-;16795:4;;16859:2;16848:14;;16876:1;16871:782;;;;17697:1;17714:6;17711:89;;;-1:-1:-1;17766:19:1;;;17760:26;17711:89;16345:66;16336:1;16332:11;;;16328:84;16324:89;16314:100;16420:1;16416:11;;;16311:117;17813:81;;16841:1063;;16871:782;15605:1;15598:14;;;15642:4;15629:18;;16919:66;16907:79;;;17084:236;17098:7;17095:1;17092:14;17084:236;;;17187:19;;;17181:26;17166:42;;17279:27;;;;17247:1;17235:14;;;;17114:19;;17084:236;;;17088:3;17348:6;17339:7;17336:19;17333:261;;;17409:19;;;17403:26;17510:66;17492:1;17488:14;;;17504:3;17484:24;17480:97;17476:102;17461:118;17446:134;;17333:261;-1:-1:-1;;;;;17640:1:1;17624:14;;;17620:22;17607:36;;-1:-1:-1;16439:1471:1:o;18196:265::-;18280:6;18333:2;18321:9;18312:7;18308:23;18304:32;18301:52;;;18349:1;18346;18339:12;18301:52;18381:9;18375:16;18400:31;18425:5;18400:31;:::i

Metadata Hash

48ae5dc5e7f2aa007d7489216d45900fb703403776916574fcce86c84f03a1ca
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.