Tirei um tempinho para codar um contrato simples, baseado em Solidity, que utiliza a ChainLink para demonstrar o funcionamento de uma casa de apostas descentralizada.
Site UI:
https://ninjabets.vercel.appContrato na testnet da Kovan:
https://kovan.etherscan.io/address/0xC950039ABcB06e7bC331d986a3DB86cFF50A4472Como apostarÉ preciso ter um pouco de ETH na testnet da Kovan para pagar as transações e fazer as apostas. Existem faucets que te dão um troquinho, e.g:
https://app.mycrypto.com/faucet (ou sinta-se livre para postar seu endereço, e eu mesmo mando um pouco).
Como não desenvolvi nenhuma interface, os processos devem ser feitos pela interface da Etherscan.
Com o ETH em mãos, vá para a página do contrato na Etherscan (link acima) e clique na aba "Write Contract". A função
payBet pode ser chamada passando o valor em ETH da aposta no primeiro campo, o id do jogo no
_gameId e o id do time (1 ou 2) no
_team. Depois é só clicar em Write e confirmar a transação.
Como recuperar o premioApós o termino do jogo, você pode chamar a função
claimRewards passando o mesmo
_gameId. A recompensa é calculada baseada na proporção do valor apostado no time vencedor relativo ao resto do pote, dividida pelo total apostado no time perdedor + aposta inicial. E claro que você precisa ter apostado no time vencedor para fazer isso.
O id do jogo em andamento e a quantidade apostada (de todo o jogo e por jogador) podem ser vistos na aba "Read Contract", fazendo um query nas funções
getTotalBets(_gameId) e
getUserBets(_gameId, _user).
Código do contratoO código pode ser visto na mesma página da Etherscan, na aba "Contract":
https://kovan.etherscan.io/address/0xC950039ABcB06e7bC331d986a3DB86cFF50A4472#codeLimitações1. Para simplificar todo o processo, programei o contrato para aceitar apostas em apenas 2 times (por partida).
2. Ele é descentralizado no papel, mas eu controlo a API que desenvolvi para o projeto (também para simplificar o processo). Ou seja, eu que coloco no sistema quem ganhou. Em um caso realmente descentralizado, poderiamos utilizar várias APIs de provedores diferentes e comparar seus resultados. API utilizada:
https://ninjabets.ninjastic.space/games/idDoJogo3. Eu, o operador do contrato, sou o único que posso definir novos jogos e chamar o oracle da ChainLink para pegar o resultado (para fins de demonstração). Em um caso descentralizado, poderiamos dar uma recompensa leve para quem chamasse as funções no momento certo (para incentivar o desenvolvimento de bots que fizessem essa manutenção). Um exemplo que utiliza desse formato é a Aave e Compound, onde qualquer um pode criar um bot "liquidador" para liquidar empréstimos que caem abaixo de um certo nível de colateral (ficando com uma % da recompensa).
E aí, quem topa uma aposta?
Manda o endereço que eu passo uns ETH e a gente marca um jogo.
edit: atualizado com novo contrato