Exercício – Escrever um contrato inteligente

Concluído

Nesta unidade, vamos adicionar um novo contrato inteligente ao newSolidityProject que criamos anteriormente.

Criar um contrato de remessa

O contrato inteligente que você criará rastreia o status de itens comprados de um marketplace online. Quando o contrato é criado, o status da remessa é definido para Pending. Quando um item é despachado, o status do envio muda para Shipped e um evento é emitido. Após a entrega, o status da remessa do item passa para Delivered e outro evento é emitido.

Para iniciar este exercício:

  1. No projeto que você criou, no diretório contratos, clique com o botão direito do mouse na pasta e escolha criar um arquivo chamado Shipping.sol.

  2. Copie os conteúdos do contrato a seguir e cole-os no novo arquivo.

    pragma solidity >=0.4.25 <0.9.0;
    
    contract Shipping {
        // Our predefined values for shipping listed as enums
        enum ShippingStatus { Pending, Shipped, Delivered }
    
        // Save enum ShippingStatus in variable status
        ShippingStatus private status;
    
        // Event to launch when package has arrived
        event LogNewAlert(string description);
    
        // This initializes our contract state (sets enum to Pending once the program starts)
        constructor() public {
            status = ShippingStatus.Pending;
        }
        // Function to change to Shipped
        function Shipped() public {
            status = ShippingStatus.Shipped;
            emit LogNewAlert("Your package has been shipped");
        }
    
        // Function to change to Delivered
        function Delivered() public {
            status = ShippingStatus.Delivered;
            emit LogNewAlert("Your package has arrived");
        }
    
        // Function to get the status of the shipping
        function getStatus(ShippingStatus _status) internal pure returns (string memory) {
         // Check the current status and return the correct name
         if (ShippingStatus.Pending == _status) return "Pending";
         if (ShippingStatus.Shipped == _status) return "Shipped";
         if (ShippingStatus.Delivered == _status) return "Delivered";
        }
    
       // Get status of your shipped item
        function Status() public view returns (string memory) {
             ShippingStatus _status = status;
             return getStatus(_status);
        }
    }
    
  3. Analise o contrato para ver o que está acontecendo. Confirme se você consegue criar o contrato.

  4. No painel Explorar, clique com o botão direito do mouse no contrato e selecione Criar Contratos para compilar o contrato inteligente.

Adicionar uma migração

Agora vamos adicionar um arquivo de migração para podermos implantar o contrato na rede do Ethereum.

  1. No painel Explorar, passe o ponteiro do mouse sobre a pasta migrações e escolha Novo Arquivo. Nomeie o arquivo 2_Shipping.js.

  2. Adicione este código ao arquivo:

    const Shipping = artifacts.require("Shipping");
    
    module.exports = function (deployer) {
      deployer.deploy(Shipping);
    };
    

Implantar

Em seguida, confirme se é possível implantar o contrato antes de continuar. Clique com o botão direito do mouse no nome do contrato e selecione Implantar Contratos. Na janela que aparecerá, selecione desenvolvimento e aguarde a conclusão da implantação.

Observe a informação na janela de saída. Procure uma implantação do 2_Shipping.js.

Screenshot showing the output window for the shipping contract migration.