YieldForwarderFactory
Title: YieldForwarder Factory
Author: Golem Foundation
Factory for deploying YieldForwarder instances via CREATE2
Uses full CREATE2 deployment (not proxy) since the contract is tiny. DEPLOYMENT PATTERN:
- Full bytecode deployment via CREATE2 for deterministic addresses
- Salt includes receiver, keeper, caller-provided salt, and deployer for uniqueness
- Each deployment tracked per deployer FEATURES:
- Deterministic addresses via CREATE2
- Deployment tracking per deployer
- Address prediction for governance proposals
Note: security-contact: [email protected]
State Variables
deployerToForwarders
Mapping of deployers to their deployed forwarders
Allows tracking and enumeration of forwarders per deployer
mapping(address => ForwarderInfo[]) public deployerToForwarders
Functions
createYieldForwarder
Creates a new YieldForwarder instance with deterministic address
Uses CREATE2 with a salt derived from receiver, keeper, caller-provided salt, and msg.sender. This allows governance proposals to use a fixed salt, avoiding race conditions.
function createYieldForwarder(address _receiver, address _keeper, bytes32 _salt)
external
returns (address forwarder);
Parameters
| Name | Type | Description |
|---|---|---|
_receiver | address | Address that will receive forwarded assets |
_keeper | address | Address authorized to call reportAndForward on the forwarder |
_salt | bytes32 | Caller-provided salt for deterministic address |
Returns
| Name | Type | Description |
|---|---|---|
forwarder | address | Address of newly created YieldForwarder |
computeYieldForwarderAddress
Predicts the deterministic address where a YieldForwarder will be deployed
Uses CREATE2 address computation with the same salt derivation as createYieldForwarder
function computeYieldForwarderAddress(address _receiver, address _keeper, bytes32 _salt, address _deployer)
external
view
returns (address predicted);
Parameters
| Name | Type | Description |
|---|---|---|
_receiver | address | Address that will be the forwarder's receiver |
_keeper | address | Address that will be the forwarder's keeper |
_salt | bytes32 | The same salt that will be passed to createYieldForwarder |
_deployer | address | Address that will call createYieldForwarder |
Returns
| Name | Type | Description |
|---|---|---|
predicted | address | Predicted address of deployment |
getForwardersByDeployer
Returns all yield forwarders created by a specific deployer
May be expensive for deployers with many forwarders
function getForwardersByDeployer(address _deployer) external view returns (ForwarderInfo[] memory);
Parameters
| Name | Type | Description |
|---|---|---|
_deployer | address | Address to query forwarders for |
Returns
| Name | Type | Description |
|---|---|---|
<none> | ForwarderInfo[] | forwarders Array of deployed forwarders with receiver info |
_computeFinalSalt
Computes the final CREATE2 salt from receiver, keeper, caller salt, and deployer
function _computeFinalSalt(address _receiver, address _keeper, bytes32 _salt, address _deployer)
internal
pure
returns (bytes32);
Parameters
| Name | Type | Description |
|---|---|---|
_receiver | address | Forwarder receiver address |
_keeper | address | Forwarder keeper address |
_salt | bytes32 | Caller-provided salt |
_deployer | address | Deployer address |
Returns
| Name | Type | Description |
|---|---|---|
<none> | bytes32 | Final salt for CREATE2 |
_getCreationBytecode
Returns the creation bytecode for a YieldForwarder with the given params
function _getCreationBytecode(address _receiver, address _keeper) internal pure returns (bytes memory);
Parameters
| Name | Type | Description |
|---|---|---|
_receiver | address | Receiver address to encode in constructor args |
_keeper | address | Keeper address to encode in constructor args |
Returns
| Name | Type | Description |
|---|---|---|
<none> | bytes | Creation bytecode including constructor args |
Events
YieldForwarderCreated
Emitted when a new YieldForwarder is created
event YieldForwarderCreated(
address indexed deployer,
address indexed forwarderAddress,
bytes32 indexed salt,
address receiver,
address keeper
);
Parameters
| Name | Type | Description |
|---|---|---|
deployer | address | Address that deployed the forwarder |
forwarderAddress | address | Address of the deployed forwarder |
salt | bytes32 | Caller-provided salt used for CREATE2 |
receiver | address | Address configured as the forwarder's receiver |
keeper | address | Address configured as the forwarder's keeper |
Errors
ForwarderAlreadyExists
Thrown when a forwarder already exists at the predicted address
error ForwarderAlreadyExists(address existingForwarder);
Structs
ForwarderInfo
Information about a deployed yield forwarder
Stored for each deployer to track their forwarders
struct ForwarderInfo {
/// @notice Address of the deployed forwarder contract
address forwarderAddress;
/// @notice Address of the receiver configured in the forwarder
address receiver;
/// @notice Address of the keeper configured in the forwarder
address keeper;
}