# Governance

## Code

* `MessageMultiSigWallet.sol`
* `MultiSigWallet.sol`

## Events

### Confirmation

```bash
event Confirmation(address indexed sender, uint indexed transactionId);
```

Allows an owner to confirm a transaction.

* `address sender` : Owner Address
* `uint transactionId` : Transaction Identifier

### Revocation

```bash
event Revocation(address indexed sender, uint indexed transactionId);
```

Allows an owner to revoke confirmation for a transaction.

* `address sender` : Owner Address
* `uint transactionId` : Transaction Identifier

### Submission

```bash
event Submission(uint indexed transactionId);
```

Adds a new transaction to the transaction mapping if the transaction does not exist yet.

* `uint transactionId` : Transaction Identifier

### Execution

```bash
event Execution(uint indexed transactionId);
```

Transaction succeeded.

* `uint transactionId` : Transaction Identifier

### ExecutionFailure

```bash
event ExecutionFailure(uint indexed transactionId);
```

Transaction failed.

* `uint transactionId` : Transaction Identifier

### OwnerAddition

```bash
event OwnerAddition(address indexed owner);
```

Adds new Owner.

* `address owner` : New Owner Address

### OwnerRemoval

```bash
event OwnerRemoval(address indexed owner);
```

Removes Owner.

* `address owner` : Owner Address

### RequirementChange

```bash
event RequirementChange(uint required);
```

Changes Multi-Sig Wallet Requirement.

* `uint required` : Requirement Value

## Interface

```bash
pragma solidity 0.5.0;

interface MessageMultiSigWallet {
    function getConfirmationCount(uint transactionId) public view returns (uint count);
    function getTransactionCount(bool pending, bool executed) public view returns (uint count);
    function getOwners() public view returns (address[] memory);
    function getConfirmations(uint transactionId) public view returns (address[] memory _confirmations);
    function getTransactionIds(uint from, uint to, bool pending, bool executed) public view returns (uint[] memory _transactionIds);
    function getHashValidators(bytes32 hash) public view returns (address[] memory)
    function isConfirmed(uint transactionId) public view returns (bool);
    function isValidatedHash(bytes32 hash) public view returns (bool);
    
    function submitTransaction(address destination, uint value, bytes memory data) public returns (uint transactionId);
    function confirmTransaction(uint transactionId) public;
    function revokeConfirmation(uint transactionId) public;
    function executeTransaction(uint transactionId) public;
    
    function updateValidate(bytes32 hash) public returns (bool);
    function validate(address validator, bytes32 hash, uint8 v, bytes32 r, bytes32 s) public returns (bool);
}
```
