Openzeppelin-Contracts

如何使用 OpenZeppelin 程式碼進行內部傳輸?

  • September 29, 2021

我有一份包含所有代幣的合約。現在我需要將代幣轉移給將一些 BNB 發送到其“接收”備份的使用者。

所以……在 OpenZeppelin 派生合約中,我們無法訪問餘額數組,並且“轉移”函式始終使用發送者(實際使用者)作為提供代幣的人。

function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
   _transfer(_msgSender(), recipient, amount);
   return true;
}

在接收方法中,我不能讓合約給發送者代幣。

   receive() external payable {
       require( msg.value > 0 );
       transfer( <MUST_BE_THE_USER>, tokens );
   }

當“transfer()”呼叫“_transfer()”時,它會讓使用者給自己代幣。我需要呼叫“_transfer(<THE_CONTRACT_ADDRESS>, <THE_USER_ADDRESS>, amount);” 但是我的擴展 OZ 的 ERC20 的合約無法訪問此功能。

作為替代方案,我們有“transferFrom(address sender, address recipient, uint256 amount)”,但它有所有“批准”的東西……

當支出者不是 msg.sender 時,如何使用 OZ 基礎合約進行轉賬?

我認為您需要通過您的契約來呼叫您的契約,所以請嘗試“this.transfer”…

簡化 -> 關鍵字“this”將呼叫傳輸函式作為外部函式,這使得合約成為新的“msg.sender”。在您的契約中使用它之前,請理解“這個”非常好。

receive() external payable {
   require( msg.value &gt; 0 );
   this.transfer( &lt;MUST_BE_THE_USER&gt;, tokens );
}

可能以上不是最好或最乾淨的解決方案。Sob 使用 mint 方法並在收到乙太幣時鑄造代幣怎麼樣?所以它可能看起來像這樣:

receive() external payable {
   require (msg.value &gt; 0);
   _mint(msg.sender, &lt;number of tokens&gt;);
}

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