WEB3DEV

Cover image for Como Criar uma Edição ( ERC1155 ) de Contrato Inteligente de Apostas + Web App
Adriano P. Araujo
Adriano P. Araujo

Posted on

Como Criar uma Edição ( ERC1155 ) de Contrato Inteligente de Apostas + Web App

Neste guia, mostraremos como criar e implantar um contrato inteligente de apostas ERC1155 NFT, onde as pessoas podem apostar em suas edições de NFTs e ganhar tokens ERC20 como recompensa.

Passaremos por:

  1. Criando a Edição ERC1155 do contrato inteligente

  2. Criando o Token ERC20 do contrato inteligente

  3. Criando o contrato inteligente de aposta

  4. Criando um aplicativo  web para interagir com o contrato

Vamos começar!

Implante uma edição do contrato inteligente

Se você ainda não possui um contrato inteligente de coleção NFT ERC1155, vá para a página Explore e selecione o contrato inteligente Edition Drop:

Nesta página, clique na versão mais recente de Deploy Now:

Uma lista de opções será aberta para preencher os metadados do contrato NFT Drop que você implementará. Configure seu contrato inteligente com um image, name, description, etc., e configure qual endereço da carteira receberá os fundos das vendas primária e secundária:

Estou usando a rede de teste Polygon Mumbai, mas você pode escolher qualquer rede que preferir.

Quando estiver pronto, clique em Deploy Now!

Depois que seu contrato inteligente for implantado, você estará pronto para:

  1. A cunhagem preguiçosa dos NFTs que estão prontas para os usuários cunharem a partir do NFTs tab.

  2. Configurar suas condições de reivindicação, definição de preço, data de lançamento, quantidade etc.

Não abordaremos esses tópicos em detalhes neste guia, fique à vontade para usar a documentação na página do Edition Drop se precisar de mais informações!

Implante um contrato inteligente de token ERC20

Em seguida, vamos implantar um contrato inteligente de token ERC20, que representa os usuários de token que serão recompensados por apostar seus NFTs!

Se você ainda não possui um contrato inteligente ERC20, vá para a página Explore e clique no contrato Token.

Clique Deploy Now para iniciar o fluxo de implantação:

Certifique-se de implantar isso na mesma rede que sua coleção NFT.

Sorteio de fornecimento de token ERC20

O caminho do  contrato inteligente [EditionStake.sol](https://github.com/thirdweb-dev/contracts/blob/main/contracts/staking/EditionStake.sol) funciona para que  implantemos a  transferência   de tokens para o usuário quando reivindicam suas recompensas.

Por esse motivo, precisamos fornecer ao contrato inteligente de aposta um suprimento de tokens para que ele seja transferido.

Para fazer isso, primeiro vamos cunhar alguns tokens em nosso contrato inteligente ERC20 e transferi-los para o contrato de aposta.

Vá para a guia Tokens e clique em Mint.

Entre com um valor e clique em  Mint tokens:

Implante uma edição que comprometa o contrato inteligente

Passaremos para a parte emocionante e implantaremos o próprio contrato de aposta!

Vá para o Página de contrato inteligente EditionStake, e clique em Deploy Now:

Agora você precisará fornecer alguma configuração para o seu contrato de apostas.

Você pode usar as informações abaixo de cada campo para ajudá-lo a entender com quais valores você precisa preenchê-los.

Quando estiver pronto, clique em Deploy Now para enviar seu contrato inteligente!

Depósito do Token ERC20

Volte ao seu contrato inteligente ERC20 e aprove os tokens para o seu endereço de contrato inteligente de aposta recém-implantado para gastar.

Vá até a guia explorar no seu Token  do contrato e clique na função approve. Vamos permitir que o contrato de aposta gaste ( uma quantidade ) de tokens para que possa pagar recompensas aos jogadores.

Digite seu endereço de contrato de aposta e uma quantia que você acha adequada, clique em Execute e aprove a transação.

Finalmente, vá para a guia explorar do contrato de Aposta .

Aqui, você verá uma função depositRewardTokens. Essa é a função que usaremos para fornecer nosso contrato de apostas com fundos para distribuir como recompensa.

Adicione a quantidade de tokens que deseja depositar no endereço do contrato de aposta.

Uma vez feito, clique em executar e você estará pronto!

Criando um Aplicativo Web de Aposta

Agora, vamos criar um aplicativo Web de aposta NFT, onde os usuários possam conectar suas carteiras, depositar / retirar  NFTs e reivindicar recompensas.

Antes de começarmos, você pode acessar o código fonte completo para este modelo no GitHub.

https://github.com/thirdweb-example/edition-staking-app

Usando o CLI, crie um novo projeto Next.js & TypeScript com o React SDK pré-configurado para você, usando o seguinte comando:


npx thirdweb create app --next --ts




Enter fullscreen mode Exit fullscreen mode

Por padrão, a rede é Ethereum Mainnet, você precisará alterá-la para a rede na qual implantou seus contratos inteligentes para dentro do arquivo _app.tsx.


// Este é o chainId para seu dApp funcionar.

const activeChainId = ChainId.Mumbai;

Enter fullscreen mode Exit fullscreen mode

Mostrando NFTs de Carteira Conectada

Primeiro, mostraremos os NFTs que a pessoa possui e permitiremos que as apostem com um botão. Vamos editar  a página index.tsx para adicionar essa lógica.

Obtendo os próprios NFTs:


const address = useAddress();

const { contract: editionDropContract } = useContract(

  <your-edition-drop-contract-address-here>,

  "edition-drop"

);

const { data: ownedNfts } = useOwnedNFTs(editionDropContract, address);



Enter fullscreen mode Exit fullscreen mode

Renderizando-os na interface do usuário:


<div>

  {ownedNfts?.map((nft) => (

    <div key={nft.metadata.id.toString()}>

      <ThirdwebNftMedia metadata={nft.metadata} />

      <h3>{nft.metadata.name}</h3>

      <Web3Button

        contractAddress={stakingContractAddress}

        action={() => stakeNft(nft.metadata.id)}

      >

        Stake

      </Web3Button>

    </div>

  ))}

</div>



Enter fullscreen mode Exit fullscreen mode

Estamos usando o componente [ThirdwebNftMedia](https://portal.thirdweb.com/ui-components/nft-renderer') da thirdweb para exibir o NFT.

Em seguida, precisamos criar uma função stakeNft que levará o usuário a apostar no NFT, primeiro solicitando que ele conceda o approval (aprovação)  para o endereço do contrato de aposta, para transferir NFTs da carteira do usuário ( da coleção NFT ).


const { contract, isLoading } = useContract(stakingContractAddress);



async function stakeNft(id: string) {

  if (!address) return;



  const isApproved = await editionDropContract?.isApproved(

    address,

    stakingContractAddress

  );

  if (!isApproved) {

    await editionDropContract?.setApprovalForAll(stakingContractAddress, true);

  }

  await contract?.call("stake", id, 1);

}



Enter fullscreen mode Exit fullscreen mode

O terceiro parâmetro no await contract?.call("stake", id, 1); é a quantidade do token que você deseja que seus usuários apostem. Você pode fazer disso um valor dinâmico e aceitar a entrada do usuário; por simplicidade, estamos codificando com dificuldade 1 aqui.

Mostrando os NFTs apostados

Agora que apostamos em nosso NFT, também precisamos exibir as NFTs que o usuário apostou até agora. Para fazer isso, criaremos um novo componente.

Então, crie um novo arquivo components/NFTCard.tsx e adicione o seguinte:


import {

  ThirdwebNftMedia,

  useContract,

  useNFT,

  Web3Button,

} from "@thirdweb-dev/react";

import type { FC } from "react";

import {

  editionDropContractAddress,

  stakingContractAddress,

} from "../consts/contractAddresses";

import styles from "../styles/Home.module.css";



interface NFTCardProps {

  tokenId: number;

}



const NFTCard: FC<NFTCardProps> = ({ tokenId }) => {

  const { contract } = useContract(editionDropContractAddress, "edition-drop");

  const { data: nft } = useNFT(contract, tokenId);



  return (

    <>

      {nft && (

        <div className={styles.nftBox}>

          {nft.metadata && (

            <ThirdwebNftMedia

              metadata={nft.metadata}

              className={styles.nftMedia}

            />

          )}

          <h3>{nft.metadata.name}</h3>

          <Web3Button

            action={(contract) =>

              contract?.call("withdraw", nft.metadata.id, 1)

            }

            contractAddress={stakingContractAddress}

          >

            Withdraw

          </Web3Button>

        </div>

      )}

    </>

  );

};



export default NFTCard;



Enter fullscreen mode Exit fullscreen mode

Isso nos dá um belo cartão para mostrar nossos NFTs apostados, cada cartão mostra a imagem do NFT, o nome do NFT e também um botãoWithdraw(retirada) que permite ao usuário abandonar a aposta.

Agora, em pages/stake.tsx transformaremos cada token apostado nesse componente da seguinte maneira:


const { data: stakedTokens } = useContractRead(

  contract,

  "getStakeInfo",

  address

);



<div>

  {stakedTokens &&

    stakedTokens[0]?.map((stakedToken: BigNumber) => (

      <NFTCard tokenId={stakedToken.toNumber()} key={stakedToken.toString()} />

    ))}

</div>

Enter fullscreen mode Exit fullscreen mode

Ótimo! Agora, temos os NFTs apostados e os NFTs não apostados do usuário.

Mostrar recompensas reivindicadas


const [claimableRewards, setClaimableRewards] = useState<BigNumber>();



useEffect(() => {

  if (!contract || !address) return;



  async function loadClaimableRewards() {

    const stakeInfo = await contract?.call("getStakeInfoForToken", 0, address);

    setClaimableRewards(stakeInfo[1]);

  }



  loadClaimableRewards();

}, [address, contract]);

Enter fullscreen mode Exit fullscreen mode

Isso receberá o stakeInfo do contrato e depois definirá as recompensas.

Para renderiza-lo, precisamos formatá-lo assim:


<p>

  {!claimableRewards

    ? "Loading..."

    : ethers.utils.formatUnits(claimableRewards, 18)}

</p>



Enter fullscreen mode Exit fullscreen mode

Reivindicando recompensas

Para permitir que os usuários reivindiquem as recompensas, criaremos um botão e anexaremos uma função a ele.


<Web3Button

  action={(contract) => contract.call("claimRewards", 0)}

  contractAddress={stakingContractAddress}

>

  Claim Rewards

</Web3Button>

Enter fullscreen mode Exit fullscreen mode

Conclusão

Este guia nos ensinou como permitir que seus usuários apostem  NFTs ERC1155 que possuam e recebam recompensas por apostá-las!

Se você fez isso também, dê um tapinha nas costas e compartilhe conosco no Discord da thirdweb! Se você quiser dar uma olhada no código, confira o Repositório GitHub.


Este artigo foi escrito por  Avneesh Agarwal e traduzido por Adriano P. de Araujo. O original em inglês pode ser encontrado aqui.

Top comments (0)