🏛️ Multisig & DAO ” Gobernanza Descentralizada

Gnosis Safe pattern, propuestas on-chain y votaciones con tokens de gobernanza

Semana 10: Governance
Multisig 3-of-5Governor BravoTimelockSnapshotERC-20 Votes
🏛️ Multisig = cuenta bancaria que requiere múltiples firmas: Un banco empresarial exige que 3 de 5 directivos firmen para mover dinero. Gnosis Safe es eso on-chain: ningún individuo puede vaciar la tesorería. DAO (Decentralized Autonomous Organization) va más allá: los token holders votan propuestas que se ejecutan automáticamente después de un Timelock (período de espera para que la comunidad reaccione). MakerDAO, Compound, Uniswap ” todos usan Governor Bravo o un derivado.
📚 Refs: safe.global · OpenZeppelin Governor · Compound Governor Bravo · Snapshot
Multisig
DAO Voting
Código

Simulador Gnosis Safe (3-of-5)

Transacción propuesta:
To: 0x6B175...0F (DAI)
Function: transfer(address,uint256)
Args: 0xAbe3..., 500,000 DAI
Proposer: Alice
Firmantes (requiere 3/5):
Esperando firmas...
// Gnosis Safe: MultiSigWallet.sol (simplificado)
contract MultiSigWallet {
  address[] public owners;    // [Alice,Bob,Carol,Dave,Eve]
  uint256 public required = 3; // threshold

  struct Transaction {
    address to;
    uint256 value;
    bytes data;
    bool executed;
    uint256 confirmations;
  }

  mapping(uint256 => mapping(address => bool))
    public isConfirmed;

  function confirmTransaction(uint256 txId) external {
    require(isOwner[msg.sender]);
    isConfirmed[txId][msg.sender] = true;
    tx.confirmations++;
    if (tx.confirmations >= required) execute(txId);
  }
}

Simulador DAO ” Propuestas On-Chain

OpenZeppelin Governor + Timelock

// MyGovernor.sol ” basado en OpenZeppelin Governor
import "@openzeppelin/contracts/governance/Governor.sol";
import "@openzeppelin/contracts/governance/extensions/GovernorVotes.sol";
import "@openzeppelin/contracts/governance/TimelockController.sol";

contract MyGovernor is Governor, GovernorVotes, GovernorTimelockControl {
  constructor(IVotes _token, TimelockController _timelock)
    Governor("MyGovernor")
    GovernorVotes(_token)
    GovernorTimelockControl(_timelock) {}

  function votingDelay() public pure override returns (uint256) {
    return 1; // 1 bloque para abrir votación
  }
  function votingPeriod() public pure override returns (uint256) {
    return 45818; // ~1 semana en bloques
  }
  function quorum(uint256) public pure override returns (uint256) {
    return 1e18; // 1 token = quórum mínimo
  }
}

// Proponer:
uint256 propId = governor.propose(
  [tokenAddress],       // targets
  [0],             // values
  [transferCalldata],     // calldatas
  "Transfer 500k DAI to grants"
);

// Votar (después de votingDelay):
governor.castVoteWithReason(propId, 1, "Apoyo el programa"); // 1=For

// Si pasa ’ queue en Timelock ’ execute después de delay (48h)
🏛️ Explora el multisig coleccionando firmas y el sistema de DAO creando y votando propuestas on-chain.