Skip to content

Instantly share code, notes, and snippets.

@rafarocha
Last active January 15, 2026 21:29
Show Gist options
  • Select an option

  • Save rafarocha/1243b2e427a28912647da41097a067a7 to your computer and use it in GitHub Desktop.

Select an option

Save rafarocha/1243b2e427a28912647da41097a067a7 to your computer and use it in GitHub Desktop.

Contracts

Interfaces

import java.math.BigInteger;
import java.time.Instant;

/**
 * Interface responsável pela transição do estado DRAFT para ACTIVE.
 * Oferece múltiplos cenários de entrada.
 */
public interface ContractActivator {

    /**
     * Cenário Padrão: Ativa o contrato depositando o valor exato total dos itens.
     * @throws IllegalStateException se a lista de itens estiver vazia.
     */
    void activateStandard() throws Exception;

    /**
     * Cenário de Pagamento Parcial/Entrada: Ativa o contrato com um depósito inicial,
     * permitindo que o restante seja pago durante a execução.
     * @param initialDeposit Valor da entrada.
     */
    void activateWithDownPayment(BigInteger initialDeposit) throws Exception;

    /**
     * Cenário com Trava de Tempo: Ativa o contrato, mas os fundos só ficam
     * disponíveis/travados após uma data específica (ex: vesting ou garantia).
     * @param activationDate Data futura para início da vigência.
     */
    void activateScheduled(Instant activationDate) throws Exception;

    /**
     * Cenário Multi-Sig/Oráculo: Requer uma assinatura externa para ativar.
     * @param externalSignature Assinatura de um auditor ou oráculo aprovando o início.
     */
    void activateWithApproval(String externalSignature) throws Exception;
}
import java.math.BigInteger;
import java.util.UUID;

/**
 * Interface para manipulação do contrato enquanto ele está em andamento (ou preparação).
 * Cobre adição/remoção de itens e gestão de saldo.
 */
public interface ContractManager {

    // --- Gestão de Escopo ---

    /**
     * Adiciona um item ao escopo.
     * Só deve funcionar se o contrato permitir edições (ex: não estiver travado).
     */
    void addItem(String description, BigInteger value);

    /**
     * Remove um item pelo ID ou índice.
     * Deve falhar se o item já estiver "em progresso" ou finalizado.
     */
    void removeItem(int itemIndex) throws IndexOutOfBoundsException;

    /**
     * Atualiza o custo de um item existente (renegociação).
     */
    void updateItemValue(int itemIndex, BigInteger newValue);

    // --- Gestão de Execução ---

    /**
     * Adiciona mais fundos ao contrato sem alterar o estado de ativação.
     * Útil se o usuário quiser dar um bônus ou cobrir itens extras.
     */
    void topUpFunds(BigInteger amount);

    /**
     * Marca um item específico como concluído pelo prestador, aguardando aprovação.
     */
    void markItemComplete(int itemIndex);

    /**
     * Pausa o contrato em caso de disputa ou auditoria externa.
     * Impede saques ou modificações até a retomada.
     */
    void pauseContract(String reason);
}
import java.math.BigInteger;

/**
 * Interface responsável por encerrar o ciclo de vida do contrato.
 * Trata pagamentos, reembolsos e disputas.
 */
public interface ContractSettlement {

    /**
     * Cenário "Caminho Feliz": Libera o valor total acordado para o prestador.
     * Requer que o saldo do contrato seja suficiente.
     */
    void finalizeAndPayFull();

    /**
     * Cenário de Cancelamento Mútuo: O contrato é encerrado, o prestador recebe
     * pelo que já fez, e o restante é devolvido ao cliente.
     * @param providerAmount Valor a ser pago ao prestador.
     * @return Valor reembolsado ao cliente.
     */
    BigInteger terminateWithPartialPayment(BigInteger providerAmount);

    /**
     * Cenário de Reembolso Total: O serviço não foi prestado ou falhou na validação.
     * Todo o dinheiro retorna ao cliente (Payer).
     */
    void cancelAndRefundAll();

    /**
     * Cenário de Disputa/Slashing: O prestador agiu de má fé.
     * O contrato penaliza o prestador (queima fundos ou envia para tesouraria)
     * e devolve o resto ao cliente.
     */
    void finalizeWithPenalty(BigInteger penaltyAmount);

    /**
     * Saque de emergência (apenas após um tempo limite de inatividade - Dead Man's Switch).
     */
    void emergencyWithdraw();
}

House up

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment