O contrato: como e por que funciona
Todos os fundos e todas as regras do FAIRDRUM estão em um único programa na rede Solana — um contrato inteligente. O site apenas envia comandos a ele e mostra a resposta. Abaixo: o que o contrato guarda, quais comandos ele entende, como o número aleatório se transforma em resultado e o que o administrador pode e não pode fazer.
O que é o contrato e onde ele fica
Um contrato inteligente é um programa executado pelos nós da rede Solana, e não no servidor do projeto. O código é o mesmo para todos, e cada ação é uma transação pública. O contrato do FAIRDRUM é escrito em Rust com a biblioteca Anchor; o código-fonte é aberto.
O endereço do programa aparecerá aqui quando o site estiver conectado ao contrato.
Uma consequência importante: se o site fairdrum.to desaparecer, os fundos dos jogadores continuarão no contrato e poderão ser sacados com qualquer programa capaz de enviar o comando de saque com a assinatura da sua carteira.
O que o contrato guarda
- O cofre. Uma única conta em SOL embrulhado (wrapped SOL), controlada apenas pelo próprio programa. Nela fica tudo: os saldos dos jogadores, o banco de prêmios, os jackpots, a reserva e a parte do administrador ainda não retirada.
- A conta geral do jogo. Um registro de como o valor do cofre está dividido: banco de prêmios, jackpot, minijackpot, superjackpot, reserva de aportes iniciais, parte do administrador, valores iniciais dos jackpots e contadores de rodadas por jogo.
- A conta do jogador. É criada pelo comando register, que o site envia junto com o primeiro depósito, e fica vinculada ao endereço da carteira: saldo do jogo, hora do último depósito, rodada não concluída e parte do jackpot ainda não paga.
- A conta de sessão (se o “jogo sem assinaturas” estiver ativado): uma chave temporária, um prazo e um limite de apostas.
A contabilidade é feita de modo que a soma de todos os saldos e potes seja igual ao valor no cofre. Um teste confere essa igualdade depois de cada uma de dezenas de milhares de operações aleatórias.
Quais comandos o contrato entende
| Comando | Quem pode chamar | O que faz |
|---|---|---|
register | jogador | Cria a conta do jogador. O site o envia junto com o primeiro depósito. |
deposit | jogador | Depósito no saldo do jogo. Registra a hora: a partir dela contam as 12 horas até o saque. |
withdraw | jogador | Saque para a própria carteira. É rejeitado enquanto não tiverem passado 12 horas desde o último depósito. |
spin_commit | o jogador ou a chave de sessão dele | Aposta: debita a rodada do saldo, registra o jogo e as chances em vigor e pede um número aleatório ao oráculo. |
spin_settle | qualquer pessoa | Liquidação: lê o número do oráculo, calcula o pagamento e o credita ao jogador. Qualquer pessoa pode chamar; o resultado não depende disso. |
spin_expire | qualquer pessoa | Encerra uma rodada que não foi liquidada em 20 minutos. Se o oráculo não respondeu, a aposta é devolvida integralmente ao jogador. Se o oráculo respondeu e a rodada está selada, paga os prêmios normais sem sorteio de jackpots. |
spin_seal | qualquer pessoa | Sela a rodada: registra o hash do bloco da aposta enquanto ele está disponível (cerca de 3,5 minutos). Só é necessária se o oráculo demorar mais para responder; normalmente quem a chama é o serviço vigilante. Uma rodada que não foi liquidada nem selada a tempo é encerrada sem resultado. |
skip_nonce | jogador | Avança o número da próxima solicitação de aleatoriedade se o endereço da solicitação já estiver ocupado. |
session_open / session_close | jogador | Permite que uma chave temporária faça apostas dentro de um prazo e de um limite; a chave não pode sacar nem depositar. |
donate | qualquer pessoa | Coloca SOL na reserva de aportes iniciais dos jackpots. Não existe comando inverso. |
set_jackpot_starts | administrador | Define novos valores iniciais do jackpot e do superjackpot; eles entram em vigor após 24 horas. |
rescale_pools | administrador | Transfere parte da reserva de aportes iniciais para o banco de prêmios dos jogos. Só nesse sentido; não é possível transferir para os jackpots: eles são reabastecidos pela reserva sozinhos, depois de um prêmio. |
set_paused | administrador | Suspende ou retoma o recebimento de novas apostas — para o caso de falha do oráculo. As apostas já feitas são liquidadas, e os pagamentos e o saque funcionam normalmente. |
set_guardian / guard_pause | administrador | O administrador designa um guardião — uma chave do serviço vigilante que só pode fazer uma coisa: suspender o recebimento de novas apostas se o oráculo parar de responder. Só o administrador pode retirar a pausa. |
propose_dev_authority / accept_dev_authority | administrador | Transferência dos direitos de administrador para outra chave em duas etapas: a chave atual indica a nova, e a nova confirma por conta própria. |
roll_epoch / checkin | qualquer pessoa | De serviço: atualizam a estatística semanal e a marca do dia. Não movimentam fundos. |
claim_dev | administrador | Retira a parte acumulada do administrador, e somente ela. |
initialize / fund_pools | administrador | Inicialização única. initialize cria as contas (quem assina é o titular da autoridade de atualização do programa); fund_pools registra uma única vez o banco inicial aportado, distribuído pelos potes, e o excedente acima dele em uma linha separada, que o administrador pode retirar com o comando promo_pay. |
No código não existe comando que transfira o banco de prêmios, os jackpots ou os saldos dos jogadores para o administrador.
A rodada passo a passo
- Aposta. O comando spin_commit debita a rodada do seu saldo e, na mesma transação, cria no oráculo ORAO uma solicitação de número aleatório. O endereço da solicitação é calculado a partir da sua carteira e do número da rodada, por isso não dá para encaixar a solicitação de outra pessoa.
- Número. Vários nós independentes da ORAO assinam o número aleatório e o gravam na rede. Até essa gravação ninguém o conhece: nem você, nem o projeto, nem um nó isolado.
- Liquidação. O comando spin_settle lê o número no registro do oráculo, confere que a solicitação é mesmo a da sua rodada e calcula o pagamento. O próprio site o envia; se a página estiver fechada, quem faz isso é o programa de plantão do projeto ou você, na próxima visita.
- Exibição. Cartas, minas, foguete, pedras: são formas de mostrar um pagamento já calculado. Os toques no jogo não o alteram.
Por que o resultado não pode ser conhecido de antemão nem falsificado. O número final da rodada é o número do oráculo misturado com o hash do bloco em que a aposta foi registrada. No momento da aposta esse hash ainda não existe, e o número do oráculo chega depois e vem de um terceiro: ninguém consegue calcular o resultado de antemão — nem o jogador, nem o projeto, nem o próprio oráculo. O jogo, os valores iniciais dos jackpots e o teto do prêmio são registrados no momento da aposta, e a fórmula de cálculo está em código aberto. Uma liquidação atrasada nunca é mais vantajosa do que uma feita no prazo. As regras só podem ser alteradas trocando o código do programa, e isso fica visível para todos (veja a seção sobre o administrador).
Como um número aleatório vira resultado
Uma rodada é de 1 a 100 apostas de 0,01 SOL (até 1000 na roda). O número do oráculo é desdobrado em um valor aleatório independente para cada aposta, e para cada uma o contrato responde, em ordem, às perguntas:
- Superjackpot, jackpot, minijackpot? A chance de cada pote é igual à contribuição da aposta para ele dividida pelo valor inicial do pote. Um pote só é sorteado quando tem pelo menos 25% do valor inicial.
- Prêmio do jogo? Cada jogo tem sua própria chance de prêmio e sua própria tabela de seis níveis com pesos. Por exemplo, na roda sai prêmio em 10% das apostas. As tabelas de todos os jogos aparecem nas páginas deles.
- “Girar de novo”? Com chance de 11,6%, a aposta é repetida de graça, por conta do banco de prêmios.
- Caso contrário, a aposta fica sem prêmio. Ela é dividida como qualquer outra: banco de prêmios, jackpots e parte do administrador.
As tabelas dos jogos são diferentes, mas o pagamento esperado é o mesmo em todas (com precisão de centésimos de ponto percentual; com banco de prêmios a partir de 40 SOL, quando os prêmios não batem no teto): cerca de 77,5% da aposta em prêmios comuns e, somando as repetições “Girar de novo”, cerca de 88% das apostas pagas. Quem confere a igualdade é o compilador: se o valor esperado de algum jogo ficar acima do da roda, ou abaixo em mais de meio ponto percentual, o programa não compila.
Onde o contrato coloca cada aposta
| Destino | Parte da aposta paga | Para quê |
|---|---|---|
| Banco de prêmios | ≈88% | prêmios comuns de todos os jogos |
| Jackpot, minijackpot, superjackpot e aporte inicial | 2% | três potes comuns |
| Administrador | 10% | receita do projeto; não há outra |
No código, as partes estão escritas sobre cada aposta executada, incluindo as repetições grátis, por isso lá constam 8,84% e 1,77%: em termos de apostas pagas, isso dá em média 10% e 2%.
As regras de limite e para que servem
- Um prêmio não passa de um quarto do banco de prêmios. O contrato não pode prometer mais do que tem, e um prêmio grande não esvazia o banco para os demais. O que deixa de ser pago fica no banco.
- Saque 12 horas após o último depósito. A regra é igual para todos e está escrita como constante: só pode ser mudada por uma nova versão do programa.
- Os valores iniciais dos jackpots mudam com atraso de 24 horas. As chances da rodada são fixadas no momento da aposta, por isso não dá para mudá-las “sob medida para uma aposta já feita”.
- 20 minutos para a liquidação. Se o oráculo não respondeu, a aposta é devolvida integralmente ao jogador: enquanto não há número, ninguém conhece o resultado, por isso não é possível escapar assim de uma perda. Se respondeu, mas a liquidação atrasou, os prêmios normais são pagos e os jackpots não são sorteados nessa rodada. Proteção do cofre. Antes de cada pagamento e depois de cada liquidação, o contrato verifica se o cofre tem pelo menos o que ele deve aos jogadores e aos potes; caso contrário, a operação é rejeitada. Guardião. Se o oráculo parar de responder, o recebimento de novas apostas é suspenso automaticamente; as liquidações e o saque continuam funcionando.
- O jackpot é pago em parcelas: o vencedor tem direito a 95% do pote, sendo 20% na hora e 8% por semana. A parte ainda não paga fica registrada na conta do vencedor.
- Uma rodada não concluída por jogador. Enquanto a rodada não for liquidada, uma nova aposta não é aceita.
O que o administrador pode e não pode fazer
Pode
- retirar a parte dele: 10% das apostas pagas;
- colocar SOL na reserva e transferi-los da reserva para o banco de prêmios;
- retirar o excedente que ficou no cofre na inicialização, acima do banco inicial;
- alterar os valores iniciais dos jackpots — com atraso e dentro de limites definidos;
- suspender o recebimento de novas apostas se o oráculo não responder e transferir os seus direitos para outra chave.
Não pode
- sacar o banco de prêmios, os jackpots, a reserva ou os saldos dos jogadores (como jogador, ele ganha nas mesmas condições de todos);
- mudar as tabelas de prêmios, a chance de prêmio dos jogos e as partes da aposta: são constantes do código;
- descobrir o número aleatório da rodada antes da aposta, nem escolhê-lo;
- interromper a liquidação das apostas feitas ou o saque: a pausa vale apenas para novas apostas.
Uma ressalva honesta. O programa tem uma autoridade de atualização: enquanto ela não for revogada, o titular pode substituir o código por uma nova versão, e então tudo o que foi dito acima passará a valer para o novo código. O estado dessa autoridade e cada atualização são visíveis em um explorador da Solana. Não há auditoria independente do contrato.
Como isso foi testado
- Testes do contrato: parte do administrador de 10% em cada jogo, retorno muito próximo em todos os jogos com banco de 50 SOL, a regra de um quarto do banco e o teto do prêmio no momento da aposta, a trava de saque, a mudança adiada dos valores iniciais e que uma liquidação atrasada não é mais vantajosa do que uma feita no prazo.
- Teste de conservação dos fundos: dezenas de milhares de operações aleatórias; depois de cada uma, o valor no cofre é conferido com a soma dos saldos e dos potes.
- Simulações longas: dois milhões de apostas em cada jogo; quanto foi pago aos jogadores e quanto o administrador recebeu.
- Transações reais em um nó local da Solana: depósito, saque recusado antes do prazo, aporte na reserva, mudança dos valores iniciais.
- Testes do site: o site calcula as chances com as mesmas fórmulas do contrato e se confere com amostras registradas pelo contrato.
O que não foi testado nem feito está listado, sem enfeites, na página “Por que FAIRDRUM”. Como conferir qualquer rodada por conta própria está na página “Conferir uma rodada”.
Os parâmetros do contrato em uma tabela
- Aposta unitária
- 0,01 SOL
- Rodada
- até 100 apostas nos jogos, até 1.000 na roda
- Jogos (modos)
- 16
- Chance de “Girar de novo”
- 11,6%
- Teto de um prêmio
- 1/4 do banco de prêmios
- Menor valor inicial
- jackpot 0,2 SOL, superjackpot 2 SOL
- Minijackpot
- começa em 1/10 do jackpot
- Para o vencedor do jackpot
- 95% · 5% vai para o superjackpot
- Para o vencedor do superjackpot
- 90%
- Trava de saque
- 12 horas após o último depósito
- Prazo de liquidação da rodada
- 3.000 slots da rede, cerca de 20 minutos
- Taxa de rede e do oráculo
- 0,005 SOL por rodada; não é cobrada pelo projeto