Мне интересно, как я могу иметь эфиры в моем контракте. У меня есть 2 контракта, связанных с разными аккаунтами.
Я хочу отправить эфиры с одного контракта на другой, но как мне сначала получить эфиры в моем контракте, чтобы я мог их отправить?
Вот пример:
contract ethertransfer {
function fundtransfer(address etherreceiver, uint256 amount) {
if(!etherreceiver.send(amount)) {
throw;
}
}
}
contract etherreceiver {
function etherreceiver() {
}
}
Отправьте эфир на свой контракт ( ethertransfer
) с внешней учетной записи (термин для учетных записей, контролируемых пользователем). Чтобы иметь возможность сделать это, вам нужно иметь payable
функцию в вашем контракте (которая может быть резервной функцией https://solidity.readthedocs.io/en/latest/contracts.html#fallback-function ). Оплачиваемая функция — это функция с payable
модификатором (например, function receivePayment() payable {}
). Затем вам нужно отправить транзакцию (если определена резервная функция) на контракт или вызвать функцию на вашем контракте (если вы решили иметь ее для приема платежей). Вы можете использовать клиент web3 для взаимодействия с вашим контактом.
Почти то же самое происходит при отправке эфира с одного контракта на другой. Целевой контракт также должен иметь функцию (опять же, это может быть резервная функция или любая другая) .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
Самый простой подход — это 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.transfer
as 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.
Бесконечность
address.function{value:msg.value}(arg1, arg2, arg3)
для пользовательской оплачиваемой функции вызовите ethereum.stackexchange.com/questions/9705/…