Solidity

Solidity將應付函式的值發送給所有者:“發送和轉移僅適用於’地址支付’類型的對象,而不是地址”

  • October 28, 2021

簡單的測試/案例,有一個應直接向所有者匯款的支付功能。我得到了標題中的錯誤。程式碼:

address private owner;
   
   constructor() {
       owner = msg.sender;
   }

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

現在,如果我嘗試聲明address private payable owner;我得到錯誤Expected identifier but got payable

另外,如果我在建構子中嘗試address payable private owner;,則會收到錯誤消息type address is not implicitly convertible to expected type address payable

我怎樣才能解決這個問題?我在這裡缺少的基本原則是什麼?對此和學習的新手,謝謝。

最新版本 (>0.8.0) 的正確語法是:

// SPDX-License-Identifier: MIT
pragma solidity >=0.8.0 <0.9.0;

contract YourContract {
   address payable private owner;
   
   constructor() {
       owner = payable(msg.sender);
   }

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

另外,如果我嘗試支付應付私人所有者的地址;然後在我的建構子中,我得到錯誤類型地址不能隱式轉換為預期的應付類型地址。

這是因為 msg.sender 是地址類型,而不是預設的地址支付。您必鬚根據設計明確將地址標記為應付。如範例中所示,您將 msg.sender 變數轉換為使用 payable(your_address) 支付的地址類型。

您還可以將演員表推遲到您真正需要它的那一刻:

// SPDX-License-Identifier: MIT
pragma solidity >=0.8.0 <0.9.0;

contract YourContract {
   address private owner;

   constructor() {
       owner = msg.sender;
   }

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

基本原則很簡單,因為你要轉移有價值的代幣,所以語言的定義方式是你必須明確允許它這樣做。

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