Transfer Manager Proposal

If passed, this Proposal allows a Delegation to manage the funds of its Organization specific Treasury Manager of the various Organization to which it is linked.

It has effectively infinite use cases. One example may be that the Delegation votes to spend money on the execution of a project that benefits the Organization to which it is attached.

The Proposal can be initialized with the data parameter executed by the lazyInit function:

function lazyInit(bytes memory lazyInitData) external returns(bytes memory lazyInitResponseData) {
    require(keccak256(bytes(uri)) == keccak256(""));
    (uri, lazyInitResponseData) = abi.decode(lazyInitData, (string, bytes));
    require(keccak256(bytes(uri)) != keccak256(""));

    ITreasuryManager.TransferEntry[] memory _entries;
    (additionalUri, treasuryManagerAddress, _entries) = abi.decode(lazyInitResponseData, (string, address, ITreasuryManager.TransferEntry[]));
    for(uint256 i = 0; i < _entries.length; i++) {
        entries.push(_entries[i]);
    }

    lazyInitResponseData = DelegationUtilities.extractVotingTokens(ILazyInitCapableElement(treasuryManagerAddress).initializer(), ILazyInitCapableElement(treasuryManagerAddress).host());
}

The lazyInit function contains the following data:

  • uri -> this can contain Proposal Metadata such as title, useful links, etc...

and then:

  • string additionalUri -> this can contain Proposal description, risks, benefits, and other information to describe the proposal behavior.

  • treasuryManagerAddress -> this is the address of the Delegation TreasuryManager to use. Keep in mind that a Delegation has a different dedicated TreasuryManager for each Organization to which it is attached.

  • _entries -> this represents an array of TransferEntry parameters. To learn more about how to pass this, see the TreasuryManager page.

The execute function allows the Delegation to execute a batchTransfer to send funds from its TreasuryManager in the manner defined in _entries.

function execute(bytes32) external {
    ITreasuryManager(treasuryManagerAddress).batchTransfer(entries);
}

Voting On This Proposal

This Proposal can be voted on using the wrapped governance tokens of the Organization to which the Delegation's TreasuryManager is linked (recall that a Delegation has a different dedicated TreasuryManager for each Organization to which it is attached).

The Delegation token is automatically retrieved by the Proposal using the extractVotingTokens function:

DelegationUtilities.extractVotingTokens(ILazyInitCapableElement(treasuryManagerAddress).initializer(), ILazyInitCapableElement(treasuryManagerAddress).host());

This Proposal follows the governance rules set by the Delegation host at the time of Delegation creation or changed through the "Change Rules Proposal".

Last updated