Erc-20

如何在使用 struct 建構的 Mapping 上循環?

  • January 17, 2022

在我的堆疊智能合約中,使用者可以質押任何 ERC20 代幣:

struct Token {
       address tokenAddress;
       uint256 stakedAmount;
       uint256 lastTransactionDate;
   }

//stakingUserBalance between adress token and amount
mapping(address => mapping(address => Token)) public stakingUserBalance;

對於 Dapp,我需要返回使用者堆疊的所有代幣。所以,我選擇返回一個 Token 數組。

function getUserStakedTokens(address userAddress) public view returns(Token[] memory){
       
   }

當我知道時,是否可以在映射時循環每個令牌儲存userAddress?要為特定使用者循環我的映射,我需要一個 Array 嗎?

謝謝你的幫助 ?

在solidity中查看映射是不可能的。這是因為從技術上講,預設情況下每個鍵都以零值存在。如果您想獲取使用者已抵押的所有代幣的列表,您需要為每個使用者維護一組代幣地址。

mapping (address => address[]) userToTokenAddress;

每次使用者質押代幣時,檢查使用者是否已經質押代幣,如果沒有,將其附加到userToTokenAddress列表中。

if(!stakingUserBalance[msg.sender][tokenAddress){
   userToTokenAddress[msg.sender].push(tokenAddress)
}
// rest of the staking logic

如果您想在使用者撤回所有特定令牌時從數組中刪除令牌地址,則必須以不同的方式對其進行重組。或者,您可以檢查每個代幣的餘額是否在鏈下非零,這樣您就可以獲得有效質押代幣的過濾列表。

引用自:https://ethereum.stackexchange.com/questions/119148