Mapping
如何在映射中檢索特定實體
我正在嘗試開始堆疊智能合約。每個使用者可以質押不同的 ERC20 Token。
我正在使用以下結構:
struct Token { address tokenAddress; uint256 stakedAmount; uint lastTransactionDate; bool isUsed; }
我定義了一個關係使用者令牌:
mapping(address => Token) stakingUserBalance;
在我的質押功能上,我需要為使用者儲存一個 ERC20 代幣:
function stakeToken(address tokenAddress, uint256 amount) public { require(amount > 0, "You cannot stake 0 token"); //Transfer amount to smartcontract IERC20(tokenAddress).transferFrom(msg.sender, address(this), amount); //Update user balance Token storage userToken = stakingUserBalance[msg.sender]; userToken.lastTransactionDate = block.timestamp; userToken.stakedAmount += amount; //fire event emit TokenStaked(tokenAddress, amount); }
所以我的問題是:如何獲取特定的令牌地址
stakingUserBalance
來更新stakedAmount
正確令牌的值?感謝您的幫助
在您的案例中,每個使用者(由 an 表示
address
)都可以放置一個令牌(由 an 表示address
),您可以為其儲存資訊(由Token
struct 表示)我建議將您的映射結構調整為:// user address -> token address -> information mapping(address => mapping(address => Token)) stakingUserBalance;
這使您可以使用以下方式訪問資訊:
Token storage userToken = stakingUserBalance[msg.sender][tokenAddress];
按照您定義
Token
and的方式stakingUserBalance
,使用者只能質押一次類型的代幣。使用者地址用作唯一的唯一鍵。您必須重組資料結構以使用地址令牌作為唯一組合。一種方法是使用映射的映射。
mapping (address => mapping(address => Token)) public stakedTokens;
這將允許
tokenAddress => Token
為每個使用者地址創建一個映射。這樣,您可以為每個使用者支持多個令牌。要訪問代幣餘額,您可以使用以下方法。
stakedTokens[userAddress][tokenAddress].stakedAmount;
希望這能澄清你的問題。