Skip to main content

YieldForwarderFactory

Git Source

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

NameTypeDescription
_receiveraddressAddress that will receive forwarded assets
_keeperaddressAddress authorized to call reportAndForward on the forwarder
_saltbytes32Caller-provided salt for deterministic address

Returns

NameTypeDescription
forwarderaddressAddress 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

NameTypeDescription
_receiveraddressAddress that will be the forwarder's receiver
_keeperaddressAddress that will be the forwarder's keeper
_saltbytes32The same salt that will be passed to createYieldForwarder
_deployeraddressAddress that will call createYieldForwarder

Returns

NameTypeDescription
predictedaddressPredicted 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

NameTypeDescription
_deployeraddressAddress to query forwarders for

Returns

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

NameTypeDescription
_receiveraddressForwarder receiver address
_keeperaddressForwarder keeper address
_saltbytes32Caller-provided salt
_deployeraddressDeployer address

Returns

NameTypeDescription
<none>bytes32Final 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

NameTypeDescription
_receiveraddressReceiver address to encode in constructor args
_keeperaddressKeeper address to encode in constructor args

Returns

NameTypeDescription
<none>bytesCreation 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

NameTypeDescription
deployeraddressAddress that deployed the forwarder
forwarderAddressaddressAddress of the deployed forwarder
saltbytes32Caller-provided salt used for CREATE2
receiveraddressAddress configured as the forwarder's receiver
keeperaddressAddress 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;
}