Solidity

我怎樣才能獲得應付功能將正確的金額發送到所有者地址?

  • April 15, 2021
function () public payable {
   uint tokens;
   
   /// this math isnt safe 
   tokens = msg.value * 10;
   
   /// this didnt give us the address we needed
   address tokenOwner;

   
   balances[msg.sender] = safeAdd(balances[msg.sender], tokens);
   _totalSupply = safeAdd(_totalSupply, tokens);
   emit Transfer(address(0), msg.sender, tokens);
   tokenOwner.transfer(msg.value);

   }

我試圖了解如何編寫一個函式,其中合約獲取 ETH 並將代幣返還給 ETH 的發送者並將 ETH 發送給合約所有者。

我有問題

  1. 它發送了錯誤的金額——我向合約發送了 0.1 ETH,它發送給我 10,000,000,000,000 個硬幣之類的東西。
  2. tokenOwner 從來沒有收到過 .1 ETH 的發送——合約也沒有。

有什麼想法我哪裡出錯了嗎?

你不應該像這樣調整比例。msg.value已經正確縮放。

tokens = msg.value * 10;

這是沒用的。映射balances通常用於跟踪合約對其他使用者的負債。但是您會立即轉發資金,因此您不需要這樣做。

balances[msg.sender] = safeAdd(balances[msg.sender], tokens);

不清楚是tokenOwner從哪裡來的。

tokenOwner.transfer(msg.value);

嘗試

contract Thing {

 address payable owner;

 function forwarder() public payable {
   owner.transfer(msg.value);
 }
}

更新

所有者是0x0...因為我們沒有將其設置為任何內容。您可以發瘋並導入可轉讓所有權並使所有者成為目的地。


import "@openzeppelin/contracts/access/Ownable.sol";

contract Thing is Ownable {

 function forwarder() public payable {
   payable(owner()).transfer(msg.value); // Ownable sets it in the constructor and presents an owner() function 
 }
}

希望能幫助到你。

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