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();
}