Exercício 8

Exercício de Integração: Arrays, Structs, Mappings e Enums

Faremos um exercício integrador que utilizará arrays, structs, mappings e enums.

Cada endereço (address) terá atribuído um array de structs. Em cada struct é possível armazenar uma string, uma cor e acompanhar o número de vezes que a string foi modificada.

Passos a seguir:

  • Programe o contrato no Remix,

  • Faça o deploy do contrato no Remix.

  • Com um endereço, adicione informações no seu respectivo array para pelo menos duas posições (2 structs). Use a função addInfo para isso.

  • Faça o mesmo utilizando outro endereço.

  • Execute as funções setInfo, setColor, getOneInfo, getMyInfoAtIndex e listAllInfo.

Código Solidity

// SPDX-License-Identifier: MIT
pragma solidity 0.8.19;

/// @title Conceitos: Tudo Junto 3
/// @author Solange Gueiros

// Um array de structs por endereço = mapping, struct e array
// contagem de mudanças por endereço

contract AllTogether {

enum Colors {Undefined, Blue, Red}

struct InfoStruct {
    string info;
    Colors color;
    uint countChanges;
}

mapping(address => InfoStruct[]) public storedInfos;

constructor() {
    InfoStruct memory auxInfo = InfoStruct ({
        info: "Hello world",
        color: Colors.Undefined,
        countChanges: 0
    });
    storedInfos[msg.sender].push(auxInfo);
}

event InfoChange(address person, uint countChanges, string oldInfo, string newInfo);

// Adiciona um struct na última posição do array associado a quem envia a transação
function addInfo(Colors myColor, string memory myInfo) public returns (uint index) {
    InfoStruct memory auxInfo = InfoStruct ({
        info: myInfo,
        color: myColor,
        countChanges: 0
    });
    storedInfos[msg.sender].push(auxInfo);
    index = storedInfos[msg.sender].length -1;
}

// Modifica a info dentro do struct em uma posição específica do array
function setInfo(uint index, string memory newInfo) public {
    storedInfos[msg.sender][index].countChanges++;
    emit InfoChange(msg.sender, storedInfos[msg.sender][index].countChanges, storedInfos[msg.sender][index].info, newInfo);
    storedInfos[msg.sender][index].info = newInfo;
}

// Modifica a cor dentro do struct em uma posição específica do array
function setColor(uint index, Colors myColor) public {
    storedInfos[msg.sender][index].color = myColor;
    storedInfos[msg.sender][index].countChanges++;
}

// Retorna o struct de uma posição específica do array associado a um endereço
function getOneInfo(address account, uint index) public view returns (InfoStruct memory) {
    require(index < storedInfos[account].length, "index inválido");
    return storedInfos[account][index];
}

// Retorna o struct de uma posição específica do array associado a quem envia a transação
function getMyInfoAtIndex(uint index) external view returns (InfoStruct memory) {
    return getOneInfo(msg.sender, index);
}

// Lista o array de structs associado a um endereço
function listAllInfo(address account) external view returns (InfoStruct[] memory) {
    return storedInfos[account];
}
}

Last updated