From 3e3ad914175f004913db927f3a0092c9eaf32ab3 Mon Sep 17 00:00:00 2001 From: fredwes <6827305+fredwes@users.noreply.github.com> Date: Tue, 22 Apr 2025 15:27:47 -0700 Subject: [PATCH] feat: sip 46 --- helpers/SeamlessAddressBook.sol | 1 + proposals/sip_46/DeployProposal.s.sol | 30 +++++++++++ proposals/sip_46/Proposal.sol | 39 ++++++++++++++ proposals/sip_46/TestProposal.t.sol | 78 +++++++++++++++++++++++++++ proposals/sip_46/description.md | 56 +++++++++++++++++++ 5 files changed, 204 insertions(+) create mode 100644 proposals/sip_46/DeployProposal.s.sol create mode 100644 proposals/sip_46/Proposal.sol create mode 100644 proposals/sip_46/TestProposal.t.sol create mode 100644 proposals/sip_46/description.md diff --git a/helpers/SeamlessAddressBook.sol b/helpers/SeamlessAddressBook.sol index ca78504..b9e4233 100644 --- a/helpers/SeamlessAddressBook.sol +++ b/helpers/SeamlessAddressBook.sol @@ -53,6 +53,7 @@ library SeamlessAddressBook { address constant SEAM_EMISSION_MANAGER_2 = 0x785c979EE8709060b3f71aEf4f2C09229DB90778; address constant GUARDIAN_MULTISIG = 0xA1b5f2cc9B407177CD8a4ACF1699fa0b99955A22; + address constant SEAMLESS_CONTRIBUTOR_MULTISIG = 0x783Cbb9387eE592E08125dCDb3e59ddFA73a6113; address constant SEAMLESS_AERA_VAULT_ADMIN = 0x0ec9a61BD923CBaF519b1bAEF839617f012344E2; diff --git a/proposals/sip_46/DeployProposal.s.sol b/proposals/sip_46/DeployProposal.s.sol new file mode 100644 index 0000000..37d5614 --- /dev/null +++ b/proposals/sip_46/DeployProposal.s.sol @@ -0,0 +1,30 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.25; + +import { Script, console } from "forge-std/Script.sol"; +import { Proposal } from "./Proposal.sol"; +import { IGovernor } from "@openzeppelin/contracts/governance/IGovernor.sol"; +import { SeamlessAddressBook } from "../../helpers/SeamlessAddressBook.sol"; + +contract DeployProposal is Script { + function setUp() public { } + + function run(string memory descriptionPath) public { + Proposal proposal = new Proposal(); + + // Change this to GOVERNOR_LONG if you want to make proposal on the long governor + IGovernor governance = IGovernor(SeamlessAddressBook.GOVERNOR_SHORT); + + string memory description = vm.readFile(descriptionPath); + + address proposerAddress = vm.envAddress("PROPOSER_ADDRESS"); + vm.startBroadcast(proposerAddress); + governance.propose( + proposal.getTargets(), + proposal.getValues(), + proposal.getCalldatas(), + description + ); + vm.stopBroadcast(); + } +} diff --git a/proposals/sip_46/Proposal.sol b/proposals/sip_46/Proposal.sol new file mode 100644 index 0000000..68fcf96 --- /dev/null +++ b/proposals/sip_46/Proposal.sol @@ -0,0 +1,39 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.21; + +import { + SeamlessGovProposal, + SeamlessAddressBook +} from "../../helpers/SeamlessGovProposal.sol"; +import { ISeamEmissionManager } from + "@seamless-governance/interfaces/ISeamEmissionManager.sol"; +import { IERC20 } from "@openzeppelin/contracts/interfaces/IERC20.sol"; + +contract Proposal is SeamlessGovProposal { + uint256 public constant budgetAmount = 11_000_000 * 1e18; + + constructor() { + _makeProposal(); + } + + /// @dev This contract is not deployed onchain, do not make transactions to other contracts + /// or deploy a contract. Only the view/pure functions of deployed contracts can be called. + function _makeProposal() internal virtual override { + _addAction( + SeamlessAddressBook.SEAM_EMISSION_MANAGER_2, + abi.encodeWithSelector( + ISeamEmissionManager.claim.selector, + SeamlessAddressBook.TIMELOCK_SHORT + ) + ); + + _addAction( + SeamlessAddressBook.SEAM, + abi.encodeWithSelector( + IERC20.transfer.selector, + SeamlessAddressBook.SEAMLESS_CONTRIBUTOR_MULTISIG, + budgetAmount + ) + ); + } +} diff --git a/proposals/sip_46/TestProposal.t.sol b/proposals/sip_46/TestProposal.t.sol new file mode 100644 index 0000000..5408547 --- /dev/null +++ b/proposals/sip_46/TestProposal.t.sol @@ -0,0 +1,78 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.25; + +import { GovTestHelper } from "../../helpers/GovTestHelper.sol"; +import { Proposal } from "./Proposal.sol"; +import { SeamlessAddressBook } from "../../helpers/SeamlessGovProposal.sol"; +import { ISeamEmissionManager } from + "@seamless-governance/interfaces/ISeamEmissionManager.sol"; +import { IERC20 } from "@openzeppelin/contracts/interfaces/IERC20.sol"; + +contract TestProposal is GovTestHelper { + Proposal public proposal; + + function setUp() public { + vm.rollFork(29282991); + proposal = new Proposal(); + } + + function test_seamClaimedAndTransferedToGuardian_afterPassingProposal() + public + { + IERC20 seam = IERC20(SeamlessAddressBook.SEAM); + + uint256 contributorBalanceBefore = + seam.balanceOf(SeamlessAddressBook.SEAMLESS_CONTRIBUTOR_MULTISIG); + uint256 timelockBalanceBefore = + seam.balanceOf(SeamlessAddressBook.TIMELOCK_SHORT); + uint256 emissionManagerBalanceBefore2 = + seam.balanceOf(SeamlessAddressBook.SEAM_EMISSION_MANAGER_2); + + uint256 expectedEmissionClaimAmount2 = + _expectedEmissionManagerClaimAmount( + ISeamEmissionManager(SeamlessAddressBook.SEAM_EMISSION_MANAGER_2) + ); + + _passProposalShortGov(proposal); + + uint256 contributorBalanceAfter = + seam.balanceOf(SeamlessAddressBook.SEAMLESS_CONTRIBUTOR_MULTISIG); + uint256 timelockBalanceAfter = + seam.balanceOf(SeamlessAddressBook.TIMELOCK_SHORT); + uint256 emissionManagerBalanceAfter2 = + seam.balanceOf(SeamlessAddressBook.SEAM_EMISSION_MANAGER_2); + + assertEq( + contributorBalanceAfter, + contributorBalanceBefore + (11_000_000 * 1e18) + ); + assertEq( + timelockBalanceAfter, + timelockBalanceBefore + expectedEmissionClaimAmount2 + - (11_000_000 * 1e18) + ); + assertEq( + emissionManagerBalanceBefore2 - emissionManagerBalanceAfter2, + expectedEmissionClaimAmount2 + ); + } + + function _expectedEmissionManagerClaimAmount( + ISeamEmissionManager emissionManager + ) internal returns (uint256) { + uint256 snapshotId = vm.snapshot(); + + _passProposalShortGov(proposal); + + uint64 currentTimestamp = uint64(block.timestamp); + + require( + vm.revertToAndDelete(snapshotId), "Failed to revert to snapshot" + ); + + uint256 emissionPerSecond = emissionManager.getEmissionPerSecond(); + uint64 lastClaimedTimestamp = emissionManager.getLastClaimedTimestamp(); + + return (currentTimestamp - lastClaimedTimestamp) * emissionPerSecond; + } +} diff --git a/proposals/sip_46/description.md b/proposals/sip_46/description.md new file mode 100644 index 0000000..d4b98cf --- /dev/null +++ b/proposals/sip_46/description.md @@ -0,0 +1,56 @@ +# [SIP-46] From Bootstrap to Growth: Continuing Seamless DAO’s Support of Core Contributors + +## Summary +This proposal seeks the DAO’s approval to allocate an additional 11% in SEAM tokens to core contributors to support the long-term development, strategic hiring, security efforts, and other alignment grants for Seamless Protocol over the next 2–4 years. This allocation will bring the total contributor allocation to 22%, aligning with industry norms while maintaining strong DAO ownership of the token supply and positioning Seamless for long-term success in an increasingly competitive DeFi landscape. + +## Context and motivation +Since June 2023, the core contributors of Seamless Protocol have operated as a bootstrapped team, delivering significant value with limited resources. From the outset, Seamless was [launched as a fair launch project](https://docs.seamlessprotocol.com/governance/seam-tokenomics), allocating only 11% of the token supply to the team and advisors (8% to the core team and 3% to advisors) — well below industry benchmarks. + +Despite these lean conditions, the team has delivered several major milestones: + +- The **legacy lending/borrowing platform** achieved over **$100M TVL** +- Release of **Integrated Liquidity Markets (ILMs) v1** +- Successful integration with **Morpho vaults**, driving over **$75M TVL** +- **Tokenomics** update and [launch of staking (stkSEAM)](https://www.tally.xyz/gov/seamless-protocol/proposal/92522935634842794439797309771367244712332370162121897616517014635998973064164) +- Upcoming release of **Leverage Tokens** (currently under audit from Spearbit, targeting a May release) +- Ongoing execution across roadmap and master plan initiatives + +This track record reflects both strong contributor performance and growing ecosystem traction. To sustain this momentum, the DAO must evolve its support model — shifting from lean startup conditions to resourcing a high-performing team of professionals. + +To remain competitive, attract and retain talent, and scale effectively, the DAO should invest in its contributors. Providing the necessary resources will enable Seamless to mature into a strategically aligned, long-term team capable of delivering on the protocol’s [mission/vision](https://seamlessprotocol.discourse.group/t/gp-what-drives-seamless-core-beliefs-vision-future/584) and navigating the demands of future growth. For reference, over the course of development, an estimated $3.25 million USD has been operationally utilized across salaries, audits, infrastructure, legal, BD, marketing, and more. + +### Goals & Objectives +This proposal seeks to increase the core contributor allocation from 11% to 22%. This amount remains below the industry averages of ~23-24% and is intended to ensure that contributors are rewarded fairly and supported sustainably. + +The additional SEAM allocation will support several high-priority initiatives: + +- **Strategic hiring and team expansion** + - One new full-time contributor and one contractor have already been onboarded + - Future hiring plans include: + - Full-stack engineers with individual all-in compensations in the range of $102k-$193k USD per year (note: strong full stack engineers command average all-in costs of ~$152k USD depending on experience and geography) + - DeFi-native generalists with individual all-in compensations in the range of $117k-$167k USD per year (note: DeFi-experienced non-technical contributors command average all-in costs of ~$147k a year, based on experience and geographical location) +- **Funding essential protocol functions** + - Smart contract audits for Leverage Tokens v1.0, which typically cost between 50,000 and 100,000 USD per audit + - Two audits have been previously completed: one for the legacy lending and borrowing platform, and one for ILM version 1.0 +- **Alignment grants for long-term partners** + - Token grants to support the involvement of governance delegates, strategic partners, and key advisors +- **Sustaining long-term execution** + - The Seamless roadmap is ambitious. This allocation ensures the protocol has the talent and resources needed to meet community expectations and deliver consistently + +By approving this proposal, the DAO can invest in the people and capabilities required to scale Seamless with focus and integrity. This would mean the continued execution of the [short term roadmap](https://x.com/SeamlessFi/status/1899912753520808419) and marching towards the Seamless [long term master plan](https://x.com/SeamlessFi/status/1906700199113723994). + +### Proposal Details + +#### Allocation +- **11% additional SEAM tokens (11m in SEAM tokens)** sourced from DAO-owned and DAO-vesting smart contracts, taken as a subset of the **65% of SEAM reserved on-chain for DAO use** +- SEAM to be moved from the **DAO timelock to a secure multisig** wallet designated by Core Contributors + +#### Technical Implementation +- Execute onchain transfer from DAO-vesting smart contracts to DAO timelock +- Transfer SEAM from DAO timelock to multisig/custody controlled by core contributors + +## Resources & References + +- [Governance Discussion](https://seamlessprotocol.discourse.group/t/gp-from-bootstrap-to-growth-continuing-seamless-dao-s-support-of-core-contributors/946) +- [Proposal Implementation](https://github.com/seamless-protocol/gov-proposals/tree/main/proposals/sip_46) +- Built using [Seamless Governance Proposals tools](https://github.com/seamless-protocol/gov-proposals)