Interesting question, and I don't have a complete answer. But from the Solidity docs under address
it says:
call, callcode and delegatecall:
Furthermore, to interface with contracts that do not adhere to the ABI, the function call is provided which takes an arbitrary number of arguments of any type.
Example:
address nameReg = 0x72ba7d8e73fe8eb666ea66babc8116a41bfb10e2;
nameReg.call("register", "MyName");
My interpretation is:
p.recipient.call.value(p.amount * 1 ether)(transactionBytecode);
is calling the address (p.recipient) setting the given amount of the transaction value
to (p.amount * 1 ether) and setting the data
field of the transaction to (transactionByteCode)
This would be similar to sending a normal transaction with the web3 api. pseudo-code:
tx = {
from: (in the example, the calling contracts address)
to: (p.recipient is the address),
value: (p.amount * 1 ether),
data: (transactionByteCode),
...
}
web3.eth.sendTransaction(tx)
More Info: After experimenting and digging around a bit I found this:
Many apps, like the multisig wallet and the democracy DAO, allows the users to ask the contract to execute a custom solidity call to another contract. This is a very powerful feature that allows, for example the user to have a second authentication for any transaction in the wallet contract; or allows the DAO to own and maintain names in the registrar, or the DAO to own custom coins.
This is usually done with the solidity .call feature that will have this parameters:
someAddress.call.value(_amount)(_data);
Where someAddress is an address to another contract, _amount is amount of ether in wei and _data is a custom abi encode of function that the user wants to call.
So my original answer is a bit off. But, if you do in fact make the call and _data
is NOT an abi function to execute, _data
will be pass to the data field in the transaction, but it appears the value will not.