Mapping

如何在映射中檢索特定實體

  • January 14, 2022

我正在嘗試開始堆疊智能合約。每個使用者可以質押不同的 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),您可以為其儲存資訊(由Tokenstruct 表示)我建議將您的映射結構調整為:

// user address -> token address -> information
mapping(address => mapping(address => Token)) stakingUserBalance;

這使您可以使用以下方式訪問資訊:

Token storage userToken = stakingUserBalance[msg.sender][tokenAddress];

按照您定義Tokenand的方式stakingUserBalance,使用者只能質押一次類型的代幣。使用者地址用作唯一的唯一鍵。您必須重組資料結構以使用地址令牌作為唯一組合。

一種方法是使用映射的映射。

mapping (address => mapping(address => Token)) public stakedTokens;

這將允許tokenAddress => Token為每個使用者地址創建一個映射。這樣,您可以為每個使用者支持多個令牌。

要訪問代幣餘額,您可以使用以下方法。

stakedTokens[userAddress][tokenAddress].stakedAmount;

希望這能澄清你的問題。

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