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
}
}

Here is the Main contract:

contract Main {
...
function call(address senderAddress) public {
// Make the code in here run when someone sends ethers to the Call contract
}
}

So, I want to have it so that whenever someone sends ethers the Call contract, it forwards all the ethers to the Main contract while running the call function in the Main contract with the necessary arguments.

2 Answers
2

The general syntax for calling a function in another contract with arguments and sending funds is: address.func.value(amount)(arg1, arg2, arg3)

func needs to have the payable modifier (for Solidity 0.4+).

Completing @Edmund's answer with these important details, here's an example that compiles:

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
}
}

Also emphasizing what he wrote:

Be aware that this will only work if the people sending the funds send
enough gas to cover the call to Main and whatever you do in it.

Yes, this can be done. Don't call call "call" though - it's asking for trouble.

You'll need the contract that receives the payment to know the address of your Main contract. Imagining it's stored in a variable called main_addr, and Main has a method called handlePayment(), you can call it with something like:

Main m = Main(main_addr);
m.handlePayment();

This can also take parameters, eg you may want to tell it what you got in msg.sender and msg.value.

Be aware that this will only work if the people sending the funds send enough gas to cover the call to Main and whatever you do in it. In some situations it may be better to just log an event in the payable contract and handle it later.