Author

Topic: NinjaBets - Aposte nas olimpíadas de forma 'descentralizada' na testnet da ETH (Read 341 times)

legendary
Activity: 2352
Merit: 1121
☢️ alegotardo™️
Acho que o que você viu foi a transação mandando o LINK de pagamento para o endereço do oracle. Grin

Então, eu vi que na verdade tem uma transação output de taxas e uma transação input na aba Internal Txns, esse segundo achei que era um token quando bati o olho pela primeira vez.

Mas eu realmente estava pensando em criar um $NINJA e distribuir ele como parte do prêmio. Ainda dava para brincar mais um pouco e criar um contrato de staking onde você poderia lockar o $NINJA e receber uma parte dos lucros da plataforma.

Até que é interessante, mas aí os anti Defi são capaz de chamar de pirâmide Cheesy
Eu por exemplo que não entendo nada disso prefiro receber em ETH mesmo e converter o mais rápido possível para BTC
legendary
Activity: 2758
Merit: 6830
Desculpe, estou confundindo "Internal Transaction" com "Token Transfer".
Acho que o que você viu foi a transação mandando o LINK de pagamento para o endereço do oracle. Grin

Mas eu realmente estava pensando em criar um $NINJA e distribuir ele como parte do prêmio. Ainda dava para brincar mais um pouco e criar um contrato de staking onde você poderia lockar o $NINJA e receber uma parte dos lucros da plataforma.
legendary
Activity: 2352
Merit: 1121
☢️ alegotardo™️
Eu fiz o Claim...
Já furioso em não ter recebido a minha parte dos lucros (só o valor apostado e descontado as as taxas), aí pra completar ainda recebi o valor em um token.
Eu paguei em ETH e recebi de volta em ShitToken, é isso mesmo?

Flag criada.

Aonde? Quero apoiar mas não achei Angry


-EDIT-

Desculpe, estou confundindo "Internal Transaction" com "Token Transfer".
legendary
Activity: 2758
Merit: 6830
Não sei o quanto você está comprometido com o design do site, se for muito então seria legal trocar o "Claim 0,00 ETH" por "já resgatado" após o usuário receber o seu prêmio.
Era a ideia mas esqueci de expor uma função que retorna se o usuário já deu claim. Cheesy

Estou vendo se consigo integrar uma API que achei, que retorna dados de jogos reais. Também estou pensando em implementar apostas em mais de 2 times/jogadores.

Mas alguem tem alguma sugestão para o NinjaBets v3?
legendary
Activity: 2492
Merit: 2150
Crypto Swap Exchange
Dei o claim reward aqui e recebi a aposta de volta, ao menos deu pra testar essa parte do sistema..

Não sei o quanto você está comprometido com o design do site, se for muito então seria legal trocar o "Claim 0,00 ETH" por "já resgatado" após o usuário receber o seu prêmio.
legendary
Activity: 2758
Merit: 6830
Como assim abaixo de zero? 0.18 > 0
Meu pensamento na hora foi:

Números para a direita -> menor.

- 0
- 0.18 = mais números para a direita > abaixo de zero.

Ainda bem que eu vivo de crypto. Cool



você também tem conhecimentos para desenvolver plataformas NFT?
Ter eu não tenho, mas também não tinha o conhecimento de como implementar o chainlink (de forma prática) em um smartcontract.
legendary
Activity: 1610
Merit: 4442
**In BTC since 2013**
São para essas coisas que serve a testnet.

@TryNinja... você também tem conhecimentos para desenvolver plataformas NFT?
legendary
Activity: 2492
Merit: 2150
Crypto Swap Exchange
A primeira divisão (0.00987 / 0.05325) retorna 0.18, que é um número abaixo de zero.

Como assim abaixo de zero? 0.18 > 0

Abaixo de 1?

#rugDoNinjabets
#rektnews

Flag criada.
legendary
Activity: 2758
Merit: 6830
Acabou o jogo e é do Brasil. Cool

Tx callback da Chainlink: https://kovan.etherscan.io/tx/0x2d55a999666a9afb17bd60fdefb21db58d138acde8bedbb46adf26488826c294

Mas agora tenho uma pessima notícia para os apostadores. Grin

Dei claim no meu prêmio e me deparei com o valor errado. Fui debuggar e descobri algo que eu não tinha percebido antes.

Esse é o código que calcula o prêmio:

Code:
uint256 userInitialBets = games[_gameId].bets[winner][msg.sender].amount;

uint256 winnerPoolBets = games[_gameId].totalBets[winner];
uint256 loserPoolBets = games[_gameId].totalBets[winner == 1 ? 2 : 1];

uint256 prizeAmount = userInitialBets.div(winnerPoolBets).mul(loserPoolBets).add(userInitialBets);

Algo de errado ai? A principio, parece que não. Pega o valor do bet (0.00987), divide pela pool total de apostas no vencedor (0.05325), o que daria 0.185352113. Multiplica esse valor pela pool de apostas dos perdedores (0.04881) e dá 0.00904703664. Adiciona o valor apostado pelo usuário no time vencedor (0.00987).

Prêmio final de 0.00987 / 0.05325 * 0.04881 + 0.00987 = 0.0189170366!

https://kovan.etherscan.io/tx/0x9e6ce0b658c3dd86efd5b2989d6ffe59cfe7563610bf54e3f91d236c34e1f4cc

...mas o claim foi de 0.00987... por que?

A primeira divisão (0.00987 / 0.05325) retorna 0.18, que é um número abaixo de 1. Acontece que a solidity arredonda o número para zero...

Code:
/**
    * @dev Returns the integer division of two unsigned integers. Reverts on
    * division by zero. The result is rounded towards zero.
    *
    * Counterpart to Solidity's `/` operator. Note: this function uses a
    * `revert` opcode (which leaves remaining gas untouched) while Solidity
    * uses an invalid opcode to revert (consuming all remaining gas).
    *
    * Requirements:
    * - The divisor cannot be zero.
    */
function div(uint256 a, uint256 b) internal pure returns (uint256) {
    return div(a, b, "SafeMath: division by zero");
}

No final das contas, a matemática fica: 0 * 0.04881 + 0.00987 = 0.00987

A solução seria primeiro multiplicar o valor para depois dividir.

#rugDoNinjabets
#rektnews

Cheesy
member
Activity: 92
Merit: 39
@TryNinja @sabotag3x

Deu certo usando o MSEdge, pelo Brave não deu certo de forma alguma ate agora, mesmo removendo o Metamask e instalando de novo.


Obrigado pela a todos pela ajuda.


Apostas Feitas.




Ótimo, aos poucos você vai aprimorando a interface.
Acho que seria interessante colocar links também que direcionam o usuário para a Etherscan, tanto nas apostas feitas pelo próprio usuário como também as apostas gerais ou o contrato do jogo em questão.

Mais pra frente quando tiver boas APIs para extrair os dados dos jogos com fontes confiáveis você cria um site de apostas profissional e começa a lucrar com isso.
Tá aí um excelente nicho de mercado para investir.... o primeiro site de apostas esportivas descentralizado Cool

Se tiver opção de apostar nos GP de F1, to dentro.(por enquanto pode ser ainda na testenet  Grin)
legendary
Activity: 2352
Merit: 1121
☢️ alegotardo™️
tem o registro de 0.04, mas na parte de cima, ta zerado ainda.
Parece ser problema no RPC que não está trazendo os dados. Tenta trocar a rede para a main e depois voltar novamente para a Kovan, ou só abrir e fechar o navegador.

Aproveitei e fiz alguns ajustes no site, que agora verifica se você ganhou a aposta e já mostra um botão de claim com o valor do prêmio.

Ótimo, aos poucos você vai aprimorando a interface.
Acho que seria interessante colocar links também que direcionam o usuário para a Etherscan, tanto nas apostas feitas pelo próprio usuário como também as apostas gerais ou o contrato do jogo em questão.

Mais pra frente quando tiver boas APIs para extrair os dados dos jogos com fontes confiáveis você cria um site de apostas profissional e começa a lucrar com isso.
Tá aí um excelente nicho de mercado para investir.... o primeiro site de apostas esportivas descentralizado Cool
member
Activity: 92
Merit: 39
Tenta pelo etherscan para ver se é problema no site ou no metamask: https://kovan.etherscan.io/address/0xC950039ABcB06e7bC331d986a3DB86cFF50A4472

Parece ser problema no RPC que não está trazendo os dados. Tenta trocar a rede para a main e depois voltar novamente para a Kovan, ou só abrir e fechar o navegador.

ontem mesmo tinha feito isso, troquei de rede, e depois abrir o navegador só com o seu site, mas mesmo assim nada  Undecided



Realmente parece algo na MetaMask, tentei pela etherscan, e só conectou a carteira depois de recarregar a pagina umas 3x.

Quando clico em "Write" não acontece nada.

No console do navegador mostra isso



preenchi os campo desse forma.

payBet: 0.02
_gameId: 2
_team: tentei 1, 01, team1, tbm tentei 0, "Brasil" e Brasil (mesmo o campo sendo "numeric" eu tentei)

vou instalar a MetaMask em outro navegador e tentar de novo.
legendary
Activity: 2758
Merit: 6830
tem o registro de 0.04, mas na parte de cima, ta zerado ainda.
Parece ser problema no RPC que não está trazendo os dados. Tenta trocar a rede para a main e depois voltar novamente para a Kovan, ou só abrir e fechar o navegador.

Aproveitei e fiz alguns ajustes no site, que agora verifica se você ganhou a aposta e já mostra um botão de claim com o valor do prêmio.
member
Activity: 92
Merit: 39

acho que sei o que pode ser.



tem o registro de 0.04, mas na parte de cima, ta zerado ainda.

na kovan.etherscan.io mostra o saldo correto, deve ser algum zig no metamask.



hj mais tarde vou tentar de novo, vlw pela Força @sabotag3x e @TryNinja.
legendary
Activity: 2492
Merit: 2150
Crypto Swap Exchange
alguma dica?

Tentei reproduzir o erro e não obtive resultado.. Tentei conectar em outra rede e depois logar, etc e nada desse erro..

Esses 3 erros do console também aparecem aqui..

Tenta pelo etherscan para ver se é problema no site ou no metamask: https://kovan.etherscan.io/address/0xC950039ABcB06e7bC331d986a3DB86cFF50A4472




edit: também estou usando o Brave.
member
Activity: 92
Merit: 39
depois que conecto o site com o metamask, não aparece as opções de aposta, mostra apenas o endereço e no balance fica só "Balance:ETH"
Estranho, tem como abrir o console do navegador (inspecionar elemento) e ver se aparece algum erro lá?



legendary
Activity: 2758
Merit: 6830
depois que conecto o site com o metamask, não aparece as opções de aposta, mostra apenas o endereço e no balance fica só "Balance:ETH"
Estranho, tem como abrir o console do navegador (inspecionar elemento) e ver se aparece algum erro lá?
member
Activity: 92
Merit: 39
5) Coloca o montante que quer apostar e clica no time desejado:




vou usar o mini-tutorial do @sabotag3x para avisar pro @TryNinja que depois que conecto o site com o metamask, não aparece as opções de aposta, mostra apenas o endereço e no balance fica só "Balance:ETH"

Obs¹.: os 0.04 já estão no metamask.
Obs².: to usando o Brave, e tbm tentei com o shields desativado.

alguma dica?
legendary
Activity: 2758
Merit: 6830
No aguardo: 0x7C0E59DcAE2045A433D4fFa2f7f6D76004d6fE0E  Grin Grin
As faucets da Kovan parecem estar bem secas, mas consegui enviar 0.04

To gostando de ver várias apostas... espero que não tenha implementado um bug critico na nova versão do contrato. Grin



Primeiro eu pensei em fugir com o dindin, mas aí fiquei com medo de tomar RedTrust de um DT1, depois me lembrei que na verdade o depósito foi feito na testnet da Kovan... bem que desconfiei que o @TryNinja não fosse assim tão generoso.
Reportado. Cool
legendary
Activity: 2492
Merit: 2150
Crypto Swap Exchange
Lembrando que tem que conectar a carteira (e.g Metamask) na rede da Kovan, que já vem pre-configurada por padrão (só selecionar na tela da carteira).

Vou postar um mini-tutorial, talvez o pessoal não esteja participando pois não saiba o quão fácil é..

1) você baixa a extensão Metamask: https://metamask.io/

2) Ai você cria uma carteira nova:




3) Seleciona a rede (testnet da Kuvan):




4) Clica em Connect no belo site que o @TryNinja fez e seleciona a carteira:




5) Coloca o montante que quer apostar e clica no time desejado:




6) Depois é só confirmar a transação:





Pelo método anterior (etherscan), é o mesmo processo porém você precisa(va) inserir os dados da aposta manualmente ao invés de apenas clicar.. o legal dessas apostas é que o site pode ficar offline por algum motivo e mesmo assim você consegue fazer a aposta por outro lugar..

Apostei no Brasil
member
Activity: 92
Merit: 39
Eu pensei que eu tinha apostado 0,025 no Brasil e 0,01 na Letônia, justamente para testar o claim porém olhando agora as minhas apostas de ontem, pelo visto fiz as duas apostas no Brasil Undecided
Mais uma, então? Te mandei outros 0.05 ETH.

Fiz um novo deploy com algumas pequenas melhorias no código do contrato. E.g:

- data limite para as apostas
- qualquer um pode chamar a função requestGameResult()
- vários jogos/apostas podem rolar ao mesmo tempo

Novo contrato: https://kovan.etherscan.io/address/0xC950039ABcB06e7bC331d986a3DB86cFF50A4472

Dia 7 de Agosto, às 8:30 (horário de Brasilia), vai rolar Brasil vs Espanha pela medalha dourada. Dá tempo até do @alegotardo e, quem sabe, mais alguem participar. O id do jogo é 2 e as apostas vão até as 7:30 do mesmo dia (7 de Agosto).

Também criei uma interface simples, que pega os dados direto da blockchain, para facilitar as apostas. Cool

Lembrando que tem que conectar a carteira (e.g Metamask) na rede da Kovan, que já vem pre-configurada por padrão (só selecionar na tela da carteira).

https://ninjabets.vercel.app

No aguardo: 0x7C0E59DcAE2045A433D4fFa2f7f6D76004d6fE0E  Grin Grin
legendary
Activity: 2352
Merit: 1121
☢️ alegotardo™️
Mandei 0.04 ETH Smiley
Primeiro eu pensei em fugir com o dindin, mas aí fiquei com medo de tomar RedTrust de um DT1, depois me lembrei que na verdade o depósito foi feito na testnet da Kovan... bem que desconfiei que o @TryNinja não fosse assim tão generoso.

Dia 7 de Agosto, às 8:30 (horário de Brasilia), vai rolar Brasil vs Espanha pela medalha dourada. Dá tempo até do @alegotardo e, quem sabe, mais alguem participar. O id do jogo é 2 e as apostas vão até as 7:30 do mesmo dia (7 de Agosto).

Que maravilha, consegui fazer as apostas, a primeira pela etherscan mesmo que foi tranquilo e uma segunda pela interface que ficou muito bacana... intuitiva e fácil de mexer.

Ah, se eu ganhar o prêmio vou devolver apenas o valor não apostado, ok? Tongue
legendary
Activity: 2758
Merit: 6830
Eu pensei que eu tinha apostado 0,025 no Brasil e 0,01 na Letônia, justamente para testar o claim porém olhando agora as minhas apostas de ontem, pelo visto fiz as duas apostas no Brasil Undecided
Mais uma, então? Te mandei outros 0.05 ETH.

Fiz um novo deploy com algumas pequenas melhorias no código do contrato. E.g:

- data limite para as apostas
- qualquer um pode chamar a função requestGameResult()
- vários jogos/apostas podem rolar ao mesmo tempo

Novo contrato: https://kovan.etherscan.io/address/0xC950039ABcB06e7bC331d986a3DB86cFF50A4472

Dia 7 de Agosto, às 8:30 (horário de Brasilia), vai rolar Brasil vs Espanha pela medalha dourada. Dá tempo até do @alegotardo e, quem sabe, mais alguem participar. O id do jogo é 2 e as apostas vão até as 7:30 do mesmo dia (7 de Agosto).

Também criei uma interface simples, que pega os dados direto da blockchain, para facilitar as apostas. Cool

Lembrando que tem que conectar a carteira (e.g Metamask) na rede da Kovan, que já vem pre-configurada por padrão (só selecionar na tela da carteira).

https://ninjabets.vercel.app
legendary
Activity: 2492
Merit: 2150
Crypto Swap Exchange
Apostei logo na Letonia para "garantir" a sua vitória (queria que você desse o claim).

Eu pensei que eu tinha apostado 0,025 no Brasil e 0,01 na Letônia, justamente para testar o claim porém olhando agora as minhas apostas de ontem, pelo visto fiz as duas apostas no Brasil Undecided
legendary
Activity: 2758
Merit: 6830
legendary
Activity: 2492
Merit: 2150
Crypto Swap Exchange
legendary
Activity: 2352
Merit: 1121
☢️ alegotardo™️
Tenho migalhas na wallet então sem o aporte financeiro não consigo apostar Tongue
Também vou ficar off daqui a pouco e não vou conseguir participar dessa aposta de hoje.
Mandei 0.04 ETH Smiley

https://kovan.etherscan.io/tx/0xb38e4eb45fbe4cc69c1117de0bb3bc6d67092d65808feecc58f50f074a7d7911

Seria legal uma aposta com várias pessoas diferentes, para testar o sistema por completo. Cheesy

Desculpe, estou só no "mobile" agora e não sei como usar a etherscan aqui junto com minha Walker. até baixei o app da metamask mas não tenho ideia de como juntar ambos Undecided
legendary
Activity: 2758
Merit: 6830
Tenho migalhas na wallet então sem o aporte financeiro não consigo apostar Tongue
Também vou ficar off daqui a pouco e não vou conseguir participar dessa aposta de hoje.
Mandei 0.04 ETH Smiley

https://kovan.etherscan.io/tx/0xb38e4eb45fbe4cc69c1117de0bb3bc6d67092d65808feecc58f50f074a7d7911

Seria legal uma aposta com várias pessoas diferentes, para testar o sistema por completo. Cheesy
legendary
Activity: 2352
Merit: 1121
☢️ alegotardo™️
Mais alguem?

Opa, já que fizeram a frente eu vou participar também, não parece ser complicado... muito pelo contrário.
Minha wallet é 0x1D4abD8c5Bc50ceA64C3128914370781DA98C4d9

[edit]
Tenho migalhas na wallet então sem o aporte financeiro não consigo apostar Tongue
Também vou ficar off daqui a pouco e não vou conseguir participar dessa aposta de hoje.

Qualquer coisa marcamos pra outro dia Wink
legendary
Activity: 2758
Merit: 6830
Fiz duas apostas para testar, uma em cada equipe.. Pensei em apostar só na Letônia para testar o que o contrato faria (devolveria o valor apostado aos dois ou teria algum bug que somaria os 2 montantes de quem apostou na Letônia, dividiria por 2 e enviaria o valor errado Tongue)..
Não é tão simples assim. Cheesy

A formula é: [(userBet / totalWinnerBets) * totalLoserBets] + userBet

Ou seja, se você tiver 20% do total de apostas na Letônia e ela ganhar, vai receber seu inicial + 20% do pote do prêmio (apostas no Brasil).

imagino que também deva ser fácil criar um frontend para ficar mais amigável ao usuário..
Vamos ver... Roll Eyes
legendary
Activity: 2492
Merit: 2150
Crypto Swap Exchange
Mais alguem?

Fiz duas apostas para testar, uma em cada equipe.. Pensei em apostar só na Letônia para testar o que o contrato faria (devolveria o valor apostado aos dois ou teria algum bug que somaria os 2 montantes de quem apostou na Letônia, dividiria por 2 e enviaria o valor errado Tongue)..

Bem fácil apostar pelo Etherscan, imagino que também deva ser fácil criar um frontend para ficar mais amigável ao usuário..
legendary
Activity: 2758
Merit: 6830
Kovan? Foi a mais perto que encontrei..

Se me mandar uns ETH eu aceito fazer uma aposta para testar o sistema, pode ser qualquer esporte, meu endereço: 0x2abe5d8Ad5199f1d5C40A7487AC8a6464d15BE03
Opa, esse mesmo. Grin

Já mandei 0.05 ETH: https://kovan.etherscan.io/tx/0xfae093c0ef9bac2e1b2b0947ffdaafa268da01fb5bf3db949e6907eb8ab153f7

Hoje, às 22:00 (hórario de Brasilia), temos as quartas de finais do volley de praia com Brasil vs Letônia: https://olympics.com/tokyo-2020/olympic-games/en/results/beach-volleyball/results-men-qfnl-000200-.htm

A partida de id 3 está aberta. Você pode conferir os seus dados na aba "Read Contract" na etherscan.

currentGameId:
Code:
3

games, passando o id 3:
Code:
team1   string :  Brasil
team2   string :  Letonia
winner   uint256 :  0
bettingClosed   bool :  false

E apostar na aba "Write Contract", passando o valor, _gameId de 3 e o _team (1 = Brasil ou 2 = Letonia).

Apostei 0.03 na Letonia. Cool
https://kovan.etherscan.io/tx/0x457c71008b63c1f8e7332a3a1dc8a55466a4a54899a3d040cf1af2226ea7ad71

O resultado será tirado da API: https://ninjabets.ninjastic.space/games/3



Mais alguem?
legendary
Activity: 2492
Merit: 2150
Crypto Swap Exchange
É preciso ter um pouco de ETH na testnet da Kovak

Kovan? Foi a mais perto que encontrei..

Se me mandar uns ETH eu aceito fazer uma aposta para testar o sistema, pode ser qualquer esporte, meu endereço: 0x2abe5d8Ad5199f1d5C40A7487AC8a6464d15BE03
legendary
Activity: 1610
Merit: 4442
**In BTC since 2013**
Também recomendo o CryptoZombies, que curti demais: https://cryptozombies.io

Este é muito interessante. Tenho de tirar um tempo para testar.
Dará sempre para aprender mais algumas coisas.
Boa dica.
legendary
Activity: 2758
Merit: 6830
@TryNinja Parabéns, ficou muito top mano. Queria aprender também a codar esses smartcontracts com ChainLink usando Solidity, como aprendeu? Me recomenda uns conteúdos aí kkkkkkkkkkkkkk
Valeu. Eu já tinha um background como programador JavaScript, então não foi tão dificil. Aprendi tentando ler contratos de farms na ETH/BSC para não ser roubado e depois me aprofundei aqui e ali. Se quiser começar, recomendo esse site para achar bons recursos: https://cryptodevhub.io/wiki

Também recomendo o CryptoZombies, que curti demais: https://cryptozombies.io

Como você não sabe programação, pode ser interessante começar com JavaScript e desenvolvimento web, também.



Depois de aprender Solidity, é só saber ler os docs da Chainlink ou qualquer lib que queira usar. https://docs.chain.link
member
Activity: 111
Merit: 76
@TryNinja Parabéns, ficou muito top mano. Queria aprender também a codar esses smartcontracts com ChainLink usando Solidity, como aprendeu? Me recomenda uns conteúdos aí kkkkkkkkkkkkkk

OBS: não sei nada de programação.
legendary
Activity: 2758
Merit: 6830
Ninguém vai uma aposta? Cool

@bitmover, encontrei isso hoje, por acaso:

This is why we’ve chosen to integrate with Chainlink. The amazing folks at Chainlink Labs have worked tirelessly to help us not only secure our current supported assets with Chainlink Price Feeds but also incorporate something new for on-chain data feeds…
Thales goes to the 2021 Olympic Games!

As Thales smart contracts are well-suited to support sports markets, we wanted this MVP release to be something special, so we decided to include some trial Olympics sports markets for everyone to feel part of this ancient macro-event tradition.

https://thales.market/markets#olympics
legendary
Activity: 2758
Merit: 6830
Mas pelo q eu entendi você não usa o api dos resultados dos jogos olímpicos. Daria para fazer isso usando um api real?
A blockchain não se importa, qualquer API pode ser utilizada. Por isso foi utilizado uma API fake demonstrativa.

Eu die uma olhada e achei essa api aqui
https://olympicsapi.docs.apiary.io/
Não tem os resultados.
legendary
Activity: 2212
Merit: 5622
Non-custodial BTC Wallet
Boa, pegou minha sugestão de apostas da olimpíadas.

Mas pelo q eu entendi você não usa o api dos resultados dos jogos olímpicos. Daria para fazer isso usando um api real?

Eu die uma olhada e achei essa api aqui
https://olympicsapi.docs.apiary.io/
legendary
Activity: 2758
Merit: 6830
O processo por trás da tela

1. Eu, o operador, defino um novo jogo: setGames(1, "Bitcoin", "Bitcoin Cash")
https://kovan.etherscan.io/tx/0xbe05a1b1211fb67fcb678b5bb62226fc6f25cf6bef6215540ab97729226c60fe

2. O jogador 1 aposta no time 1 (Bitcoin), enviando 0.001 ETH enquanto chama a função: payBet(1, 1)
https://kovan.etherscan.io/tx/0x5c050b40cb38c6bec23ef3e72c8578c2682e91935f027fe6c68cc8fdb27f8f65

3. O jogador 2 aposta no time 2 (Bitcoin Cash), enviando 0.005 ETH enquanto chama a função: payBet(1, 2)
https://kovan.etherscan.io/tx/0x6fa8aa8505742bc3fecdf33b7e401010960a40fc9869f144c23806f2d1b42daf

4. Eu, operador, fecho as apostas para o jogo de id 1: finishCurrentGame(1)
https://kovan.etherscan.io/tx/0x555c3f8b3f5fac8239d49f884fc03f503798e1a4a6ab1e5dd20729fdc31a3fd5

5. Eu, operador, aguardo o termino do jogo e chamo a função: requestGameResult(1).
https://kovan.etherscan.io/tx/0x71b7007333644cb99b03729d81086daf0b6d1ca8b542d50c81c64dcb3261b272

6. Essa mesma função faz uma chamada ao contrato da Chainlink na rede testnet da Kovan, passando o endereço da api (https://ninjabets.ninjastic.space/games/1), o dado requisitado (winner) e a função callback (fulfillOracleRequest) para ser chamada com o resultado.

Code:
{
  "id": 1,
  "title": "Qual o verdadeiro Bitcoin?",
  "team1": "Bitcoin",
  "team2": "Bitcoin Cash",
  "winner": 1
}

7. Após pegar o resultado, o node da ChanLink chama a função de callback fulfillOracleRequest passando o resultado do campo "winner", trazido da API. https://kovan.etherscan.io/tx/0x0c3c20a513da5c9398b8dd0776acb90575794326413327ad99959669d1c174c3

8. O jogador 1, que apostou no time vencedor (1 = Bitcoin), chama a função: claimRewards(1), onde ele recebe 0.06 ETH (aposta inicial de 0.01 + 0.05 do perdedor no time 2).
https://kovan.etherscan.io/tx/0x1c68a16e519433d9c427fbc9d5d3af1161a1e874bc01caa473d65b0801dc9286

Fim. Smiley
legendary
Activity: 2758
Merit: 6830
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.app
Contrato na testnet da Kovan: https://kovan.etherscan.io/address/0xC950039ABcB06e7bC331d986a3DB86cFF50A4472

Como 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 premio

Apó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 contrato

O código pode ser visto na mesma página da Etherscan, na aba "Contract": https://kovan.etherscan.io/address/0xC950039ABcB06e7bC331d986a3DB86cFF50A4472#code

Limitações

1. 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/idDoJogo

3. 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?  Cool

Manda o endereço que eu passo uns ETH e a gente marca um jogo.

edit: atualizado com novo contrato
Jump to: