отправить эфиры с одного контракта на другой

Мне интересно, как я могу иметь эфиры в моем контракте. У меня есть 2 контракта, связанных с разными аккаунтами.

Я хочу отправить эфиры с одного контракта на другой, но как мне сначала получить эфиры в моем контракте, чтобы я мог их отправить?

Вот пример:

contract ethertransfer {    
  function fundtransfer(address etherreceiver, uint256 amount) {
    if(!etherreceiver.send(amount)) {
       throw;
    }
  }
}

contract etherreceiver {

  function etherreceiver() {      
  }
}

Ответы (6)

  1. Отправьте эфир на свой контракт ( ethertransfer) с внешней учетной записи (термин для учетных записей, контролируемых пользователем). Чтобы иметь возможность сделать это, вам нужно иметь payableфункцию в вашем контракте (которая может быть резервной функцией https://solidity.readthedocs.io/en/latest/contracts.html#fallback-function ). Оплачиваемая функция — это функция с payableмодификатором (например, function receivePayment() payable {}). Затем вам нужно отправить транзакцию (если определена резервная функция) на контракт или вызвать функцию на вашем контракте (если вы решили иметь ее для приема платежей). Вы можете использовать клиент web3 для взаимодействия с вашим контактом.

  2. Почти то же самое происходит при отправке эфира с одного контракта на другой. Целевой контракт также должен иметь функцию (опять же, это может быть резервная функция или любая другая) .payable

    • Если резервная функция определена: используйте etherreceiver.transfer(100)илиetherreceiver.send(100)
    • Если есть определенная пользовательская функция, используйтеetherreciver.myPayableFunction.value(100)(myArgument1, myArgument2)

Дальнейшее чтение: я рекомендую прочитать раздел, посвященный modifiersэтому, который поможет вам понять, что payableэто такое: https://solidity.readthedocs.io/en/latest/contracts.html#function-modifiers

ОБНОВЛЕНИЕ: в Solidity 0.6+ синтаксис изменился на: address.function{value:msg.value}(arg1, arg2, arg3)для пользовательской оплачиваемой функции вызовите ethereum.stackexchange.com/questions/9705/…

Самый простой подход — это payableфункция, затем отправить ей средства с обычного счета.

contract ethertransfer{

    function payMe() payable returns(bool success) {
        return true;
    }

    function fundtransfer(address etherreceiver, uint256 amount){
        if(!etherreceiver.send(amount)){
           throw;
        }    
    }
}


contract etherreceiver{       
    function etherreceiver(){          
    }    
}

Надеюсь, это поможет.

Как упоминалось ранее, определите платежную функцию для получения средств, например:

function fund() payable returns(bool success) {
}

Затем вызовите эту функцию и укажите эфиры в поле значения.

После успешного tx определите функцию, в которой вы используете send(), например:

contract_destination_address.send(amount);

1) Отправьте эфир на свой контракт

 Step-1: Create a payable method in your contract just to receive some ether. 
         Better use empty payable fallback method(Can just use the contract address to send ether) 

Бывший:

введите описание изображения здесь

 Step-2: Send the transaction to your contract using web3js.

2) Отправить эфир с одного контракта на другой контракт

Лучше всего это можно проиллюстрировать на примере

**Ex:**

//Контракт на получение эфира из другого контракта

контракт TransferEtherTo{

function getBalance() returns(uint){
    return address(this).balance;
}

//Empty payable fallback method just to receive some
 function() payable{
}

}

//*************************************************** ************///

//Контракт на отправку эфира в другой контракт

контракт TransferEtherFrom{

//Declaring an instance of TransferEtherTo contract
TransferEtherTo instance;

constructor(){
    //Initializing TransferEtherTo contract
    instance = new TransferEtherTo();
}

//Returns balance of TransferEtherFrom contract
function getBalance() returns(uint){
    return address(this).balance;
}

//Returns balance of TransferEtherTo contract
function getBalanceInstance() returns(uint){
    return instance.getBalance();
}
//Transfers ether to other contract
function transfer() payable{
    address(instance).send(msg.value);
}

//Fallback function to receive and transfer Ether
function() payable{
    address(instance).send(msg.value);
}

}

Все эфиры, отправленные на контракт TransferEtherFrom (с помощью резервных методов или методов Transfer()), будут отправлены на контракт TransferEtherTo .

договор отправителя

     contract theSender {

     /*Harcoding receiver contract address, one can also use contructor to assign 
      address */
     address payable theReceiverContractAddress;
     theReceiverContractAddress = '0x01...'

     //this is an empty function to receive ether from wallet accounts using web3
     function receiverether() external payable {}

     function balanceof() { 
      return address(this).balance;
      }

     /*this will tranfer the ether stored at this contract's address to the below 
     address */
     function debit() external{ theReceiverContractAddress.transfer(value);}

}

Теперь приемный договор

contract theReceiver{

/*this is required to receive ether from any source, this will store received ether in 
this contract's address */ 

receive() external payable{}

}

Для этого вы должны сделать функцию, которая вызывает address.transferas payable. Кроме того, в контракте-получателе должна быть оплачиваемая функция.

contract ethertransfer {    
  function fundtransfer(address etherreceiver, uint256 amount) public payable {
    if(!etherreceiver.transfer(amount)) {
       throw;
    }
  }
}

contract etherreceiver {

  function etherreceiver() external payable{      
  }
}

Теперь, когда вы вызываете функцию fundtransfer() , просто введите адрес контракта etherreceiver и количество эфиров, которые вы хотите перевести.

После этого при вызове функции из нужного места (remix/web3js) просто введите значение = no. эфиров , это будет вычитать нет. эфиров со счета, вызывающего fundtransfer()и переводить value-amountколичество эфиров на контракт etherreceiver.