У меня есть контракт с именем Call
:
contract Call {
...
function () payable {
// TODO: Call the call function in the main contract
// and forward all funds (msg.value) sent to this contract
// and passing in the following data: msg.sender
}
}
Вот Main
контракт:
contract Main {
...
function call(address senderAddress) public {
// Make the code in here run when someone sends ethers to the Call contract
}
}
Итак, я хочу, чтобы всякий раз, когда кто-то отправляет эфиры Call
контракту, он пересылал все эфиры Main
контракту при выполнении call
функции в Main
контракте с необходимыми аргументами.
Можно ли это сделать?
Обновление для комментария @Girish, в Solidity 0.6+ синтаксис изменился на:address.function{value:msg.value}(arg1, arg2, arg3)
Общий синтаксис для вызова функции в другом контракте с аргументами и отправки средств:address.func.value(amount)(arg1, arg2, arg3)
func
должен иметь payable
модификатор (для Solidity 0.4+).
Завершая ответ @Edmund этими важными деталями, вот пример, который компилируется:
pragma solidity ^0.4.0;
contract PayMain {
Main main;
function PayMain(address _m) {
main = Main(_m);
}
function () payable {
// Call the handlePayment function in the main contract
// and forward all funds (msg.value) sent to this contract
// and passing in the following data: msg.sender
main.handlePayment.value(msg.value)(msg.sender);
}
}
contract Main {
function handlePayment(address senderAddress) payable public {
// senderAddress in this example could be removed since msg.sender can be used directly
}
}
Также подчеркнув то, что он написал:
Имейте в виду, что это сработает только в том случае, если люди, отправляющие средства, отправят достаточно газа, чтобы покрыть вызов Main и все, что вы в нем делаете.
Да, это можно сделать. Однако не звоните call
«позвонить» — это напрашивается на неприятности.
Вам понадобится контракт, который получает платеж, чтобы узнать адрес вашего основного контракта. Представьте, что он хранится в переменной с именем main_addr, а у Main есть метод handlePayment(), вы можете вызвать его примерно так:
Main m = Main(main_addr);
m.handlePayment();
Это также может принимать параметры, например, вы можете указать, что вы получили msg.sender
и msg.value
.
Имейте в виду, что это сработает только в том случае, если люди, отправляющие средства, отправят достаточно газа, чтобы покрыть вызов Main и все, что вы в нем делаете. В некоторых ситуациях может быть лучше просто зарегистрировать событие в оплачиваемом контракте и обработать его позже.
Победа
msg.sender
, значениемmsg.sender
будет адресPayMin
Гириш Тиммеговда
эт