Nesse artigo iremos aprender a criar uma aplicação utilizando o mapeamento iterável através da criação de um contrato inteligente.
Iterando um mapping
Na blockchain, você não pode iterar através de um mapping. Então aqui está um exemplo de aplicação de como criar um mapping iterável.
// SPDX-License-Identifier: MITpragma solidity ^0.8.13;library IterableMapping {// mapping iterável através de address para uint;struct Map {address[] keys;mapping(address => uint) values;mapping(address => uint) indexOf;mapping(address => bool) inserted;}// Retorna o valor do map utilizando a key como parâmetrofunction get(Map storage map, address key) public view returns (uint) {return map.values[key];}// Retorna a key definida no index passado por parâmetrofunction getKeyAtIndex(Map storage map, uint index) public view returns (address) {return map.keys[index];}// Retorna o tamanho de keys existentes no mapafunction size(Map storage map) public view returns (uint) {return map.keys.length;}// Grava no mapa passado por parâmetro o endereço da key e valor a ser salvofunction set(Map storage map,address key,uint val) public {if (map.inserted[key]) {map.values[key] = val;} else {map.inserted[key] = true;map.values[key] = val;map.indexOf[key] = map.keys.length;map.keys.push(key);}}// Remove do mapa passado por parâmetro o valor do endereço// se existente no mapafunction remove(Map storage map, address key) public {if (!map.inserted[key]) {return;}delete map.inserted[key];delete map.values[key];uint index = map.indexOf[key];uint lastIndex = map.keys.length - 1;address lastKey = map.keys[lastIndex];map.indexOf[lastKey] = index;delete map.indexOf[key];map.keys[index] = lastKey;map.keys.pop();}}contract TestIterableMap {using IterableMapping for IterableMapping.Map;IterableMapping.Map private map;function testIterableMap() public {map.set(address(0), 0);map.set(address(1), 100);map.set(address(2), 200); // insertmap.set(address(2), 200); // updatemap.set(address(3), 300);for (uint i = 0; i < map.size(); i++) {address key = map.getKeyAtIndex(i);assert(map.get(key) == i * 100);}map.remove(address(1));// keys = [address(0), address(3), address(2)]assert(map.size() == 3);assert(map.getKeyAtIndex(0) == address(0));assert(map.getKeyAtIndex(1) == address(3));assert(map.getKeyAtIndex(2) == address(2));}}