Erc-20
如何在使用 struct 建構的 Mapping 上循環?
在我的堆疊智能合約中,使用者可以質押任何 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
如果您想在使用者撤回所有特定令牌時從數組中刪除令牌地址,則必須以不同的方式對其進行重組。或者,您可以檢查每個代幣的餘額是否在鏈下非零,這樣您就可以獲得有效質押代幣的過濾列表。