Acelere el crecimiento de su juego vendiendo artículos directamente a sus jugadores. En esta guía, repasaremos los pasos para desplegar un contrato de venta primaria usando cualquier moneda personalizada o existente para una tienda dentro del juego que utiliza artículos de un contrato ERC1155. Usaremos las siguientes tecnologías de la plataforma Sequence:

  • Primary Sales Contract: Cómo configurar y desplegar contratos para lanzar una venta primaria — ideal para una tienda web, NFT Drop y más.
  • Sequence Indexer: Aproveche Sequence Indexer para consultar metadatos de NFT y activos del wallet del usuario.

1. Implemente su propio contrato de token y de venta en Sequence Builder

Primero necesitamos un contrato de ventas primarias junto con un contrato ERC1155 que contendrá los artículos del juego que queremos vender. Para ello, siga la guía aquí.

2. Use el demo de ventas primarias dentro del Unity SDK de Sequence

Para comenzar, importe el SDK de Unity de Sequence en su proyecto. Luego, navegue a la escena Demo.unity ubicada en Sequence Embedded Wallet SDK/Sequence/Samples/DemoScene. En esta escena, encontrará el objeto PrimarySalePage, que sirve como referencia útil.

3. Configure la venta en su proyecto

Para configurar su venta, utilice el objeto PrimarySalePage para ingresar la información de su venta. En la sección de configuración, encontrará las siguientes opciones:

  • Cadena: Seleccione la red donde está desplegado su contrato.
  • Dirección del contrato de Token y Venta: Ingrese las direcciones de contrato proporcionadas por el Builder de Sequence.
  • Artículos en venta: Enumere todos los ID de token que desea vender.

4. Implemente código personalizado para interactuar con el SDK

Vamos a crear una clase personalizada para gestionar el estado de nuestra venta. Esta clase recopilará todos los datos necesarios, permitiéndonos mostrar esta información a los usuarios de manera efectiva. En el demo de PrimarySalePage.cs, los datos provienen de la sección de configuración.

class ERC1155SaleState;



public ERC1155SaleState(IWallet wallet, string tokenContractAddress, string saleContractAddress, Chain chain, int[] itemsForSale)

{

    _tokenContractAddress = tokenContractAddress;

    _saleContract = new ERC1155Sale(saleContractAddress);

    _client = new SequenceEthClient(chain);

    _wallet = wallet;

    _chain = chain;

    _itemsForSale = itemsForSale;

}

5. Obtenga los detalles de su venta principal

A continuación, utilice la referencia ERC1155Sale.cs para obtener los detalles de la venta y el token de pago desde el contrato. Esta información puede usarse, por ejemplo, para verificar localmente si el usuario tiene saldo suficiente para el token de pago especificado.

public async Task<bool> UpdateSaleDetailsAsync()

{

    string paymentToken = await _saleContract.GetPaymentTokenAsync(_client);



    ERC1155Sale.SaleDetails globalSaleDetails = await _saleContract.GetGlobalSaleDetailsAsync(_client);

    BigInteger cost = globalSaleDetails.Cost;

    BigInteger supplyCap = globalSaleDetails.SupplyCap;

    int startTime = globalSaleDetails.StartTime;

    int endTime = globalSaleDetails.EndTime;

}

6. Obtener metadatos de tokens para mostrar artículos a los usuarios

Usaremos la API de Indexer para obtener los suministros de tokens para la dirección de contrato de token especificada. Asegúrese de usar la dirección del contrato ERC1155, no la del contrato de ventas.

public async Task UpdateTokenSuppliesAsync()

{

    Dictionary<BigInteger, TokenSupply> tokenSupplies = new Dictionary<BigInteger, TokenSupply>();

    GetTokenSuppliesArgs supplyArgs = new GetTokenSuppliesArgs(_tokenContractAddress, true);

    GetTokenSuppliesReturn suppliesReturn = await Indexer.GetTokenSupplies((int) _chain, supplyArgs);



    foreach (int tokenId in _itemsForSale)

    {

        TokenSupply supply = Array.Find(suppliesReturn.tokenIDs, t => t.tokenID == tokenId);

        if (supply == null)

            continue;



        tokenSupplies.Add(supply.tokenID, supply);

    }

}

Por ejemplo, puede usar la variable supply.tokenMetadata.image de los suministros de token mencionados arriba para mostrar sus artículos al usuario.

[SerializeField] private Image _image;



public async void RenderTokenImage(TokenSupply supply)

{

    _image.sprite = await AssetHandler.GetSpriteAsync(supply.tokenMetadata.image);

}

Asegúrese de implementar su propia clase AssetHandler para manejar la descarga de imágenes desde URLs remotas.

7. Comprar un artículo en la tienda

Esto llamará a la función de minteo del contrato de ventas. Al especificar la dirección de wallet del usuario como el parámetro to, el contrato minteará el artículo para ese usuario. Puede usar la clase ERC1155Sale.cs para crear una referencia a CallContractFunction, lo que le permite enviar una transacción a su contrato de ventas usando la wallet del usuario.

class ERC1155SaleState;



public async Task<bool> PurchaseAsync(BigInteger tokenId, int amount)

{

    string to = _wallet.GetWalletAddress();

    byte[] defaultProof = Array.Empty<byte>();



    CallContractFunction contractCall = _saleContract.Mint(to, new[] {tokenId},

    new[] {new BigInteger(amount)}, null, PaymentToken, new BigInteger(1), defaultProof);



    Transaction[] transactions = new Transaction[] { new RawTransaction(contractCall) };

    TransactionReturn result = await _wallet.SendTransaction(_chain, transactions);

    return result is SuccessfulTransactionReturn;

}

Cuando el usuario haga clic en el botón de compra en la interfaz del juego, llamamos y esperamos la función PurchaseAsync de la clase de estado de venta. Si la compra es exitosa, mostramos una notificación y actualizamos la interfaz. Si falla, mostramos un código QR para que el usuario agregue más fondos a su wallet.

class GameWindowUI;



private ERC1155SaleState _saleState;



public async void OnPurchaseClicked(BigInteger tokenId, int amount)

{

    bool success = await _saleState.PurchaseAsync(tokenId, amount);

    if (!success) {

        OpenQrCodeView();

        return;

    }



    ShowNotification("Purchase succeeded.");

    RenderState();

}