Openzeppelin-Contracts
如何使用 OpenZeppelin 程式碼進行內部傳輸?
我有一份包含所有代幣的合約。現在我需要將代幣轉移給將一些 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 > 0 ); this.transfer( <MUST_BE_THE_USER>, tokens ); }
可能以上不是最好或最乾淨的解決方案。Sob 使用 mint 方法並在收到乙太幣時鑄造代幣怎麼樣?所以它可能看起來像這樣:
receive() external payable { require (msg.value > 0); _mint(msg.sender, <number of tokens>); }