-
Notifications
You must be signed in to change notification settings - Fork 36
/
artista.sol
100 lines (85 loc) · 3.51 KB
/
artista.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
pragma solidity 0.5.12;
contract MichelTelo {
address payable public michelTelo;
address payable public advogado;
address public produtora;
uint public valorDoContrato;
uint public dataDeVencimento;
uint public indiceMulta;
uint public percentualMichelTelo;
uint public valorDevidoMichelTelo;
bool public pago;
bool public retirado;
event pagamentoRealizado (uint valor);
modifier autorizadosRecebimento () {
require (msg.sender == michelTelo || msg.sender == advogado, "Operaçao exclusiva do contratado.");
_;
}
modifier somenteProdutora () {
require (msg.sender == produtora, "Operaçao exclusiva do contratante.");
_;
}
constructor(
address payable _michelTelo,
address _produtora,
uint _valorDoContrato,
uint _dataDePagamento,
uint _percentualMichelTelo
) public {
michelTelo = _michelTelo;
advogado = msg.sender;
produtora = _produtora;
valorDoContrato = _valorDoContrato;
dataDeVencimento = now+_dataDePagamento;
percentualMichelTelo = _percentualMichelTelo;
indiceMulta = 5;
}
function saldoNoContrato () public view returns (uint) {
return address(this).balance;
}
function simulacaoDoValorDaMulta (uint dataDePagamentoSimulado) public view returns (uint valorSimuladoMulta) {
uint prazoEmAtraso = dataDePagamentoSimulado - dataDeVencimento;
uint diaEmSegundos = 86400;
//Para o caso de atraso menor que um dia
if (prazoEmAtraso < diaEmSegundos) {
valorSimuladoMulta = (valorDoContrato*indiceMulta);
valorSimuladoMulta = (valorSimuladoMulta/100);
return valorSimuladoMulta;
}
uint diasMulta = (prazoEmAtraso/diaEmSegundos)+1;
valorSimuladoMulta = (valorDoContrato*(indiceMulta*diasMulta));
valorSimuladoMulta = (valorSimuladoMulta/100);
return valorSimuladoMulta;
}
function calculoMulta () public view returns (uint valorMulta) {
return simulacaoDoValorDaMulta(now);
}
function soma(uint a, uint b) public pure returns (uint resultado) {
resultado = (((a + b)*1000)/100);
return resultado;
}
function pagamentoNoPrazo () public payable somenteProdutora {
require (now <= dataDeVencimento, "Devedor em mora.");
require (msg.value == valorDoContrato, "Valor diverso do devido");
pago = true;
emit pagamentoRealizado(msg.value);
}
function pagamentoEmMora() public payable somenteProdutora {
require (now > dataDeVencimento, "Mora não constituida.");
require (!pago, "Pagamento já realizado.");
require (msg.value == (simulacaoDoValorDaMulta(now) + valorDoContrato), "Valor diverso do devido.");
pago = true;
emit pagamentoRealizado(msg.value);
}
function distribuicaoDeValores() public autorizadosRecebimento {
require(pago, "Pagamento não realizado");
// é algo a linha acima require(pago == true, "Pagamento não realizado");
require(retirado == false, "Distribuição já realizada.");
valorDevidoMichelTelo = (percentualMichelTelo * address(this).balance)/100;
michelTelo.transfer(valorDevidoMichelTelo);
advogado.transfer(address(this).balance);
// advogado.transfer(100);
// 100 wei sao transferidos para a carteira do advogado
retirado = true;
}
}