[DRAFT] Endowment permissions to KPK Update #10

Abstract

This proposal is a routine update to the Endowment Manager permissions. It expands the Endowment’s access to real-world-asset (RWA) and fixed-income positions, adds a set of curated Morpho yield vaults and the Aave v3 Horizon market, enables Maple (Syrup) swap routing, and introduces a dedicated reward-claim role. No permissions are removed.

Motivation

The update continues the diversification of the Endowment’s stable and ETH allocations into vetted yield and fixed-income venues while keeping all activity within the Investment Policy Statement (IPS). New access covers fixed-yield principal tokens via Pendle, curated lending and yield vaults on Morpho (kpk, Steakhouse, Smokehouse, and Sentora), and the RLUSD market on Aave v3 Horizon. A separate Harvest role is introduced so that protocol reward claims can be executed with payouts forced to the Endowment safe, without granting broader permissions.

Specification

Additions

1. Token Approvals

Token Functions Allowed Mainnet Address
sUSDS approve 0xa3931d71877C0E7a3148CB7Eb4463524FEc27fbD
PT-sUSDS-26NOV2026 approve 0xdc169abe56461a2e0c034da431ac2a3ebf596094
PayPal USD (PYUSD) approve 0x6c3ea9036406852006290770BEdFcAbA0e23A0e8
Ripple USD (RLUSD) approve 0x8292Bb45bf1Ee4d140127049757C2E0fF06317eD

2. RWA and Fixed-Income Positions

Contract Functions Allowed Contract Address
Pendle Router V4 swapExactTokenForPt swapExactPtForToken redeemPyToToken 0x888888888889758F76e7103c6CbF23ABbF58F946
kpk Euler RWA Vault deposit withdraw redeem 0x2B47c128b35DDDcB66Ce2FA5B33c95314a7de245

3. Morpho Yield Vaults

Vault Functions Allowed Contract Address
kpk USDC Yield (Vault V2) deposit withdraw redeem 0xD5cCe260E7a755DDf0Fb9cdF06443d593AaeaA13
kpk ETH Yield (Vault V2) deposit withdraw redeem 0x5dbf760b4fd0cDdDe0366b33aEb338b2A6d77725
Steakhouse High Yield USDC deposit withdraw redeem 0xbeeff2C5bF38f90e3482a8b19F12E5a6D2FCa757
Smokehouse USDC deposit withdraw redeem 0xBEeFFF209270748ddd194831b3fa287a5386f5bC
Sentora PYUSD Main deposit withdraw redeem 0xb576765fB15505433aF24FEe2c0325895C559FB2
Sentora RLUSD Main deposit withdraw redeem 0x6dC58a0FdfC8D694e571DC59B9A52EEEa780E6bf

4. Aave v3 Horizon Market

Contract Functions Allowed Contract Address
Aave v3 Horizon Pool (RLUSD) supply withdraw 0xAe05Cd22df81871bc7cC2a04BeCfb516bFe332C8

5. Swaps (CoW Protocol token lists)

Token Change Mainnet Address
syrupUSDC Add to sell and buy lists 0x80ac24aA929eaF5013f6436cdA2a7ba190f5Cc0b
syrupUSDT Add to sell and buy lists 0x356B8d89c1e1239Cbbb9dE4815c39A1474d5BA7D

6. Reward Claims (new Harvest role)

Distributor Functions Allowed Contract Address
Fluid Distributor claim 0x7060FE0Dd3E31be01EFAc6B28C8D38018fD163B0
Fluid GHO Distributor claim 0xF398E66B1273a34558AeBbEC550DccaF4AcC7714
Merkl Distributor claim 0x3Ef3D8bA38EBe18DB133cEc108f4D14CE00Dd9Ae

All token approvals are spender-pinned to the specific protocol contract they enable. A new Harvest role is created to isolate reward-claim permissions, with all claim payouts forced to the Endowment safe.

Removals

None in this update.

Reviewing the Permissions Policy

To review, the following resources are provided:

Considerations

All positions conform to the Endowment’s risk tolerance under the Investment Policy Statement (IPS). All venues in this update are permissionless; the Aave v3 Horizon RLUSD position is on the stablecoin supply side, which requires no onboarding or whitelisting, and no other position in this update carries an onboarding precondition.

Next Steps

The proposal will be introduced in the next meta-governance call. Pending review from Blockful and no revisions following discussion during the meta-governance call, this proposal will progress to an on-chain executable vote.

Pre-draft calldata security verification: PUR #10

Verification result

We reconstructed all 54 transactions of the payload and compared the reconstruction against the published payload. The two are identical. Transactions described in the specification were derived from the specification and the public contract interfaces. All new permissions are correctly restricted: deposits, withdrawals, and reward payouts can only be directed to the Endowment Safe, approvals are limited to the named protocol contracts, and the Pendle Router cannot be used to route funds through external contracts. No existing permission is removed.

The simulation and tests can be found here.

Findings and questions for kpk

1. Item 6 is implemented through a new module that the proposal text should describe. Transactions 0 through 7 deploy a second Roles instance, place the Endowment Manager permission set behind it, and transfer its ownership to kpk; we understand it will host the Harvest role, configured by kpk after execution. The claims listed under item 6 are already permitted today, with payouts restricted to the Endowment Safe, so the practical effect of item 6 is a dedicated claim operator. Our simulation confirms that payouts cannot be redirected even if the module is misconfigured. Ownership of the module, however, allows kpk to grant third parties access to the Endowment Manager permission set without a DAO vote.

Question: please describe the module in the proposal text, confirm that its use is limited to the Harvest role, and identify its intended members.

2. Item 5 is not implemented. Adding syrupUSDC and syrupUSDT to the swap token lists does not appear in any of the 54 transactions.

Question: will the payload be amended to include it?

3. The specification lists an address that does not correspond to a deployed contract. The table entry for Steakhouse High Yield USDC gives 0xbeeff7aE5E00Aae3Db302e4B0d8C883810a58100, which holds no code on mainnet. The payload correctly uses 0xbeeff2C5bF38f90e3482a8b19F12E5a6D2FCa757.

Suggestion: correct the address in the proposal text.

Reproduction

  1. Clone: git clone https://github.com/blockful/dao-proposals.git

  2. Checkout: git checkout 337e300

  3. Run: forge test --match-path "src/ens/proposals/ep-kpk-update-10/*" -vv

We will re-run this verification once the payload is finalized and the draft is published.

1) Sub-Roles Modifier

The payload only deploys and wires the module. It does not create the HARVESTER role or add any member. The HARVESTER role and its member will be configured afterwards by the MANAGER Safe, which becomes the owner of the Sub-Roles Modifier in the last tx.

You can see exactly what the role will contain in client configs:

Its scope is limited to reward claims (Fluid FLUID, Fluid GHO, and Merkl/Morpho incentives), with the recipient hard pinned to the endowment Safe.

As for how it works, the Sub-Roles Modifier is a nested permission layer under the main Roles Modifier. Since it’s assigned the MANAGER role on the main Roles Modifier (setDefaultRole + assignRoles), every transaction it forwards is still checked against the MANAGER policy. So the effective permissions of a Sub-Role are always the intersection of its own scope and MANAGER.

It can never authorize anything that MANAGER doesn’t already allow.

To verify, the whole setup was recreated on a mainnet fork. The 8 tx setup ran cleanly, with the module deployed deterministically at 0xa5dd28EC…, owner set to the MANAGER Safe, and target set to the main Roles Modifier.

A test HARVESTER Sub-Role and verified both cases:

  • :white_check_mark: A claim action already allowed by MANAGER passes end to end.
  • :cross_mark: An action deliberately granted to the Sub-Role but not allowed by MANAGER (WETH.transfer) reverts at the main Roles Modifier.

So the firewall is working as expected. Even if we scope something on the Sub-Roles, the main MANAGER policy still has the final say.

VTNet: Tenderly Dashboard

2) The missing syrupUSDC / syrupUSDT swaps

This is a legitimate catch, regenerating the updated .json to include these.

3) Empty Address

Updated to correct the forum post.

2 Likes