Confidence: 96% ·Mar 5, 2026

Spark Capital Allocation

How does billions of dollars flow from Sky Protocol through Spark and into DeFi lending markets? How is revenue calculated? How does it get distributed between Sky and Spark? This article provides the complete technical walkthrough of Spark's capital allocation system - everything you need to understand Sky's economics and the Prime Agent revenue model.

Why This Matters

Understanding Spark's capital allocation is essential for:

  • Governance participants: Knowing how settlements are calculated and approved
  • Protocol analysts: Understanding Sky's revenue model and Prime Agent economics
  • Developers: Building tools that track debt, revenue, and settlements
  • DeFi users: Understanding where sUSDS yield comes from

The Big Picture: How It All Works

Here is the complete lifecycle of capital through Spark:

flowchart LR
    P1["1) Governance"] --> P2["2) Deploy"] --> P3["3) Earn"] --> P4["4) Settle"] --> P5["5) Execute"]
  • Capital Lifecycle Phases:
Phase Action Key Components
1. Governance Set debt ceiling, rate limits Sky Governance, Executive Vote
2. Deploy Mint USDS, send to protocols Vault → Buffer → Controller → Instances
3. Earn Yield accrues from lending Aave, Morpho, SparkLend
4. Settle Off-chain P&L calculation Amatsu, BA Labs, Core GovOps
5. Execute Mint debt, return profit vat.suck(), vat.grab(), transferUsds()
  • Critical insight: Revenue for Prime Allocator Vaults is calculated off-chain through the Simplified Profit and Loss methodology and settled through Executive Votes that mint new debt on the allocator vault equal to the total revenue earned. This minted amount goes to Sky's Surplus Buffer, then Spark's profit share is returned to them. This design enables instance-level profit calculations and transparent verification in Stage 1 [1][2].

Part 1: The Contract Architecture

Spark's allocation system is built on a layered contract architecture that separates governance controls, role assignments, and execution logic. The contracts implementing this system are deployed on Ethereum mainnet and governed by Sky's PauseProxy [9].

The Three-Layer System

Spark's capital allocation uses a three-layer architecture defined by the Allocation System Primitive [10]:

flowchart TB
    subgraph GOVERNANCE["GOVERNANCE"]
        PauseProxy
        Subproxy
    end

    subgraph ROLES["ROLES"]
        Relayer["ALM Relayer"]
        Freezer
    end

    subgraph CONTRACTS["CONTRACTS"]
        Controller
        RateLimits["Rate Limits"]
        Proxy["ALM Proxy"]
        Vault
        Buffer
    end

    External["External Contracts"]

    PauseProxy -->|"Exec Vote"| Subproxy
    Subproxy -->|"Grant/Revoke"| Relayer
    Subproxy -->|"Grant/Revoke"| Freezer
    Subproxy -->|"Sets"| RateLimits
    Freezer -->|"Freeze"| Controller
    Relayer -->|"1) Calls"| Controller
    Controller -->|"2) Checks"| RateLimits
    Controller -->|"3) Txn Data"| Proxy
    Proxy -->|"4) Execute"| External
    Proxy <-->|"draw/wipe"| Vault
    Vault <-->|"Mint/Burn"| Buffer
  • Legend — Roles:
Role Description
PauseProxy Sky Governance, controls Star's Subproxys and admin powers
ALM Relayer Has power to call functions on Controller
Freezer Has power to freeze all actions on Controller
  • Legend — Contracts:
Contract Description Address
Subproxy Star Treasury, grants/revokes roles, sets rate limits 0x3300f198...
Controller Permitted actions: deposit, withdraw, mint, burn, swap, bridge 0x577Fa18a...
Rate Limits Limits the rate and maximum of permitted allocation actions
ALM Proxy Holds the Star Allocation System assets 0x1601843c...
Vault Mints & burns USDS (ALLOCATOR-SPARK-A) 0x691a6c29...
Buffer Transports minted & burned USDS to/from ALM Proxy 0xc395D150...
  • Execution Flow:
Step Action
1 ALM Relayer calls function on Controller
2 Controller checks limit against Rate Limits
3 Controller sends transaction data to ALM Proxy
4 ALM Proxy executes action on External Contracts

Why Stability Fees Are Zero

In Stage 1, stability fees for all Prime Allocator Vaults are set to zero via the SP-BEAM, so that all value transfers happen exclusively through Executive Votes [2]. This is the foundation of the off-chain settlement model:

Aspect Regular User Vaults Prime Allocator Vaults
Stability Fee Non-zero (e.g., 5%) Zero (Stage 1)
Fee Accrual Automatic, on-chain None; minted at settlement
Interest Calculation rate accumulator in VAT Off-chain Simplified P&L
Settlement Continuous via drip() Monthly via Executive Vote
Revenue Mechanism Automatic debt growth Debt minted via vat.suck() + vat.grab()

Why This Design?

  1. Instance-level granularity: Enables per-instance profit calculations across SparkLend, Aave, Morpho, etc.
  2. Flexibility: Allows for complex revenue share arrangements and penalty adjustments
  3. Transparency: Forum posts provide full calculation visibility before execution
  4. Stage 1 Compatibility: Supports the Simplified P&L methodology

USDT and pyUSD Exception

Two asset classes receive full profit-and-loss treatment (not floored at zero): USDT and pyUSD held by Spark in SparkLend or Spark's ALM Proxy. For these assets, Spark pays the Agent Credit Line Borrow Rate and realizes both profits AND losses — unlike standard instances where Instance Profit is floored at zero [2].

Rate Limits: The Safety System

The ALM Controller enforces rate limits to prevent rapid capital movements that could destabilize either party [9]:

flowchart LR
    A["maxAmount"] --> B["slope"]
    B --> C["lastAmount"]
    C --> D["currentRateLimit"]
  • Formula: currentRateLimit = min(slope × (now - lastUpdated) + lastAmount, maxAmount)

  • Spark Example: maxLine=5B, gap=500M, ttl=24h → Can draw 500M/day, max 5B total.

Rate limits apply at multiple levels:

  • Vault level: How much USDS can be minted (debt ceiling + gap/ttl)
  • Instance level: How much can be deployed to each protocol
  • Era system: Operators cannot incur losses exceeding cap per era interval

Part 2: The Complete Capital Flow

Capital moves through five distinct stages, from governance approval of the credit line through deployment into yield-generating protocols and back to Sky through monthly settlement. Each stage involves specific on-chain interactions between the contracts described in Part 1.

Step 1: Credit Line Establishment

Before any capital flows, governance must approve the credit line:

flowchart LR
    PROP["Proposal"] --> CEILING["Set Ceiling"] --> GAP["Set Limits"] --> RISK["Verify Risk Capital"]
  • Parameters Set:
Parameter Value
Debt ceiling 10B USDS (as of March 2026)
Gap 500M USDS/day
Stability fee Zero (set via SP-BEAM per Stage 1 directive)
Borrow Rate Base Rate (Agent Credit Line Borrow Rate)
  • Risk Capital Requirements [10]:
    • Junior Risk Capital (JRC): First-loss capital provided by Spark
    • Senior Risk Capital (SRC): Second-loss capital from Sky's balance sheet
    • Both must be in place before credit line is activated

Step 2: USDS Minting (Debt Creation)

When Spark needs capital:

sequenceDiagram
    participant OP as Operator (RELAYER)
    participant CTRL as ALM Controller
    participant VAULT as AllocatorVault
    participant VAT as VAT
    participant BUF as AllocatorBuffer

    OP->>CTRL: mintUsds(amount)
    CTRL->>CTRL: Check rate limits
    CTRL->>VAULT: draw(amount)
    VAULT->>VAT: frob(ilk, amount)
    Note over VAT: Creates debt position<br/>Art += amount<br/>(normalized debt)
    VAT->>VAULT: USDS minted
    VAULT->>BUF: Transfer USDS
    BUF-->>OP: Success
  • Technical details:
    • Debt is tracked in VAT as Art (normalized debt) × rate (accumulator)
    • Since duty (stability fee) = 0 in Stage 1, the rate stays constant at 1.0
    • Actual interest is calculated off-chain based on Agent Credit Line Borrow Rate [5]
    • Settlement is executed monthly via Executive Vote

Step 3: Deployment to Instances

Capital flows from buffer to yield-generating protocols via the Spark Liquidity Layer [8]:

sequenceDiagram
    participant OP as Operator
    participant CTRL as ALM Controller
    participant BUF as AllocatorBuffer
    participant PROXY as ALM Proxy
    participant INST as Instance (Aave/Morpho)

    OP->>CTRL: deposit(instance, amount)
    CTRL->>CTRL: Check instance rate limits
    CTRL->>BUF: transferFrom(amount)
    BUF->>PROXY: USDS transferred
    PROXY->>INST: deposit(USDS)
    INST-->>PROXY: aToken/shares received
    Note over INST: Capital now earning yield
  • Instance types and their characteristics:
Instance Liquidity Yield Source Risk Profile
SparkLend Hours Crypto borrowing demand Smart contract risk
Aave Lido Market Hours Crypto borrowing demand Smart contract risk
Morpho Vaults Hours Optimized lending rates Curator + smart contract risk
Ethena (sUSDe) Variable Delta-neutral funding Counterparty + depegging risk

These instances are defined in the Spark Prime Agent Artifact [3].

Step 4: Revenue Generation

Throughout the month, yield accrues from deployed capital:

flowchart LR
    D["Deployed Capital"] --> Y["Yield Accrues"] --> R["Monthly Revenue"]
  • Revenue by Instance (Example Month):
Instance Deployed APY Monthly Revenue
SparkLend $800M 5.2% $3.47M
Aave $500M 4.8% $2.00M
Morpho $400M 6.1% $2.03M
Ethena $300M 15% $3.75M
Total $2.0B $11.25M

Part 3: The Monthly Settlement Cycle (MSC)

The MSC is Sky's mechanism for reconciling Prime Agent operations with Sky Core. This is where the magic happens - where yield becomes revenue, and revenue gets distributed [1].

Why Off-Chain Settlement?

Unlike regular user vaults where stability fees accrue automatically on-chain, Prime settlements are calculated off-chain and executed via governance. This design enables:

  • Complex revenue arrangements: Instance-by-instance profit calculations
  • Transparency: All calculations posted publicly before execution
  • Flexibility: Penalties and adjustments can be applied
  • Verification: Independent calculations by multiple parties

The Calculation Methodology

This is the Stage 1 Simplified Profit and Loss Calculation [2]. For the full computational methodology including Agent Rate deductions, sUSDS adjustments, and Sky Direct Exposure treatment, see Debt-Based PnL Methodology.

flowchart TB
    S1["Total Revenue"]
    S2["Total Profit"]
    S3["Adjusted Profit"]
    S4["Amount Due to Sky"]

    S1 --> S2 --> S3 --> S4
  • Formulas:
    • Instance Expense = Invested × Base Rate × (days / 365)
    • Instance Profit = max(Instance Revenue - Instance Expense, 0)
    • Adjusted Profit = Total Profit - Distortion Penalty - Low Yield ASC Penalty

Detailed Example Calculation

Let's work through a real example for a month:

  • Given:

    • Spark's average deployed capital: $2,000,000,000
    • Agent Credit Line Borrow Rate (Base Rate): 5.0% APY
    • Month: 31 days
  • Instance-by-Instance Calculation:

Instance Deployed Revenue Expense Profit
SparkLend $800M $3.47M $3.40M $0.07M
Aave $500M $2.00M $2.12M $0.00M*
Morpho $400M $2.03M $1.70M $0.33M
Ethena $300M $3.75M $1.27M $2.48M
Total $2.0B $11.25M $8.49M $2.88M

*Note: Instance Profit cannot be negative. When Revenue < Expense, Profit = 0.

  • Expense Calculation Formula:
Instance Expense = Deployed × (Base Rate / 365) × Days
Example (SparkLend): $800M × (0.05 / 365) × 31 = $3.40M
  • Penalties (if applicable):

    • Distortion Penalty: 0-100% of Total Profit (discretionary)
    • Low Yield ASC Penalty: MIN(10 × Excess Low Yield ASC %, 100%)
  • Final Settlement:

Adjusted Profit = $2.88M - $0 (penalties) = $2.88M
Amount Due to Sky = $11.25M - $2.88M = $8.37M

The Verification Process

MSC calculations go through a three-party verification process to ensure accuracy [14]:

flowchart LR
    INITIAL["Initial Calc<br/>Amatsu<br/>(7 days)"]
    INDEPENDENT["Independent Calc<br/>BA Labs<br/>(7 days)"]
    FINAL["Final Calc<br/>Core GovOps<br/>(12 days)"]

    INITIAL --> FINAL
    INDEPENDENT --> FINAL
  • Allowed Deviation: If the Initial and Independent calculations differ by ≤1%, the amount is considered "Agreed" and no resolution is needed [15]. The Independent Calculation is performed by the Core Council Risk Advisor (BA Labs) [16], while the Final Calculation is produced by Core GovOps [17].

  • Disputed Amounts: If deviation exceeds 1%, Core GovOps works with all parties to resolve. Prime Agents can also submit a Dispute Notice within 5 days if they believe the calculation is incorrect.

How Settlement is Executed

The settlement mechanism uses a specific on-chain pattern. Here is the flow from the MSC #2 executive spell code, which established the _takeAllocatorPayment pattern used in all subsequent settlements [12]:

flowchart LR
    A["1) takePayment"] --> B["2) suck + grab"] --> C["3) transferUsds"]
  • Settlement Steps:
Step Function Effect
1 _takeAllocatorPayment() Initiates revenue collection
2 vat.suck() + vat.grab() Vault debt ↑, Surplus Buffer ↑
3 _transferUsds() Returns profit to Spark SubProxy
  • Real Example - MSC #4 (November-December 2025) [13]:
Prime Total Revenue Minted Profit Returned Net to Sky
Spark 25,547,255 USDS 7,071,339 USDS 18,475,916 USDS
Grove 14,311,822 USDS 0 USDS 14,311,822 USDS
Obex 1,768,819 USDS 442,327 USDS 1,326,492 USDS
  • Why Grove received $0 profit: Grove's yields likely matched or fell below the Base Rate. Since Instance Profit = max(Revenue - Expense, 0), and Expense is based on the Base Rate, earning at or below the Base Rate results in zero profit.

The On-Chain Mechanism in Detail

function _takeAllocatorPayment(address vault, uint256 wad) internal {
    bytes32 ilk = AllocatorVaultLike(vault).ilk();
    uint256 rate = JugAbstract(MCD_JUG).drip(ilk);
    uint256 dart = ((wad * RAY - 1) / rate) + 1;

    // Step 1: Create sin[vow] AND dai[vow] simultaneously
    VatAbstract(MCD_VAT).suck(MCD_VOW, MCD_VOW, dart * rate);

    // Step 2: Increase vault debt, cancel out the sin
    VatAbstract(MCD_VAT).grab(ilk, vault, address(0), MCD_VOW, 0, int256(dart));
}
  • Key insight: Spark cannot unilaterally extract revenue. The total revenue is first minted as debt to the vault and collected by Sky, then Spark's profit share is returned via a separate transfer [6][7].

Part 4: Understanding the Rates

Three interconnected rates govern the economics of Spark's capital allocation: the Base Rate, the Sky Savings Rate (SSR), and the Agent Credit Line Borrow Rate. Understanding their relationship explains how Sky's revenue is generated and distributed.

The Rate Hierarchy

flowchart TB
    BASE["Base Rate"] --> SSR
    BASE --> BorrowRate["Borrow Rate"]
    BASE --> AgentRate["Agent Rate"]
  • Legend — Rates:
Rate Value Who Benefits
Base Rate ~5% Reference rate for all others
SSR ~4.5% sUSDS holders earn this
Agent Borrow Rate ~5% Spark pays this to Sky
Agent Rate ~4.9% Primes earn on idle balances

Why This Matters for Revenue

The spread between what Spark earns and what it pays to Sky is Spark's profit margin:

flowchart LR
    Yield --> Cost["Cost (5%)"] --> Margin
  • Spark's Profit Margin by Instance:
Instance Yield Cost Margin
SparkLend 5.2% 5.0% +0.2%
Aave 4.8% 5.0% 0%*
Morpho 6.1% 5.0% +1.1%
Ethena 15% 5.0% +10%

*Negative margins are floored at zero — Spark absorbs underperformance.

Part 5: Actively Stabilizing Collateral (ASC)

Prime Agents must maintain liquidity for peg stability [11]:

Minimum Requirement

"Prime Agents must maintain at least 5% of their Collateral Portfolio in Actively Stabilizing Collateral."

What Counts as ASC

  • Resting ASC (provides buy support at ≥0.999 USDS/USD):

    • USDC in LitePSM
    • USDC in PSM3 (Base, Arbitrum, Unichain, Optimism)
    • Cash stablecoins in Curve (paired with USDS)
    • USDC in GUNI pools
  • Latent ASC (convertible to Resting within 15 minutes):

    • Cash stablecoins in SparkLend, Aave, Morpho
    • Cash stablecoins in Curve/Uniswap (not USDS-paired)
    • Cash stablecoins in Prime ALM Proxy ← Important!

ASC Tracking

flowchart LR
    PORTFOLIO["Portfolio: $2B"] --> REQ["5% Required: $100M"]
    REQ --> ACTUAL["Actual ASC: $130M "]
  • Example breakdown: PSM3 $80M + ALM Proxy $30M + Curve $20M = $130M total ASC

  • Penalty for non-compliance: Low Yield ASC Penalty reduces Adjusted Profit.

Part 6: The Surplus Buffer Role

The Surplus Buffer is central to understanding settlements [4]:

flowchart LR
    Inflows --> Buffer["Surplus Buffer"] --> Outflows
  • Surplus Buffer Flows:
Inflows Outflows
MSC settlements (Prime revenue) SSR (sUSDS yield)
Stability fees (user vaults) Agent Rate (Prime balances)
Liquidation penalties Smart Burn Engine
PSM fees Operational expenses
  • Key insight for settlements: At settlement time, the Executive Vote executes a two-step on-chain mechanism that increases the allocator vault's debt while simultaneously crediting the Surplus Buffer. Then, the Prime's profit share is sent from the Surplus Buffer to their SubProxy. See Part 3 for the detailed technical mechanism.

Note that certain assets in Spark's portfolio are classified as Sky Direct Exposures — assets Sky Protocol owns but implements through Prime Agent Allocation Systems (e.g., PSM USDC, Curve pool positions). Prime Agents bear no borrow rate on these, and all revenue flows to the Surplus Buffer.

Part 7: Complete End-to-End Flow

Here is the complete lifecycle visualization:

flowchart LR
    A["1) Draw"] --> B["2) Deploy"] --> C["3) Earn"] --> D["4) Verify"] --> E["5) Settle"]
  • End-to-End Lifecycle:
Step Action Details
1 Draw USDS Vault mints USDS to Buffer
2 Deploy Controller sends to Aave/Morpho
3 Earn Yield accrues throughout month
4 Verify Amatsu + BA Labs → Core GovOps
5 Settle Mint debt → Surplus → Return profit
  • Settlement Phase Roadmap [2]:
Phase Cadence Automation
Phase 1 (current) Monthly, manual Executive Votes for all settlement
Phase 2 Monthly, formalized lpla-checker beacon monitors settlement
Phase 3 Daily (16:00 UTC) Automated settlement with 3-hour lock window

In Phase 3, the Base Rate will accrue automatically on-chain, and Executive Votes will only be needed to settle remaining amounts (demand-side primitives, penalties, Agent Rate).

Part 8: Comparison with Other Primes

Spark is one of several Prime Agents in the Sky ecosystem, each using the same Allocation System Primitive infrastructure but targeting different markets. All share the AllocatorVault → AllocatorBuffer → ALM Controller architecture and participate in the same Monthly Settlement Cycle.

While Spark focuses on DeFi lending, other Primes use the same infrastructure differently:

flowchart LR
    Core["Shared Core"] --> Spark
    Core --> Grove
    Core --> Keel
  • Shared Infrastructure: All Primes use AllocatorVault → AllocatorBuffer → ALM Controller
Aspect Spark Grove Keel
Primary Markets DeFi lending (Aave, Morpho) CLOs, RWAs Solana-native lending, RWAs
Liquidity Hours Days to weeks Variable
Yield Source Crypto borrowing demand Corporate loan spreads Lending spreads, RWA yields
Counterparties Smart contracts Asset managers, banks Solana DeFi protocols
MSC Complexity Moderate High (redemption timing) Moderate

Key Takeaways

  1. Credit Line, Not Grant: Sky provides a credit line at the Agent Credit Line Borrow Rate. Spark must generate yields above this rate to profit.

  2. Zero Stability Fees, But Debt IS Minted: In Stage 1, Prime Allocator Vaults have zero stability fees (set via SP-BEAM). Revenue is calculated off-chain, and at settlement time, debt IS minted on the vault via vat.suck() + vat.grab() to collect revenue.

  3. Two-Step Settlement: First, total revenue is minted as debt and goes to Surplus Buffer. Then, the Prime's profit share is returned to their SubProxy.

  4. Revenue Split is Formulaic: Sky gets (Total Revenue - Adjusted Profit), Spark keeps Adjusted Profit.

  5. Three-Party Verification: Initial Calculation (Operational Executor Agent) + Independent Calculation (Core Council Risk Advisor) + Final Calculation (Core GovOps). Allowed deviation is 1%.

  6. Surplus Buffer is Central: All settlements flow through it - revenue collected first, then profit returned.

  7. Rate Limits Protect Everyone: The ALM Controller's rate limits prevent rapid capital movements that could destabilize either party.

  8. ASC Requirements: 5% minimum in Actively Stabilizing Collateral ensures USDS peg stability.

  9. Instance Profit Floors at Zero: If an instance earns below the Base Rate, Spark absorbs that loss — Sky never receives negative profit from an instance. Exception: USDT and pyUSD have full P&L treatment (both profits and losses).

Frequently Asked Questions

Q: Can Spark withdraw revenue without governance approval?

No. All settlements require Executive Vote approval. Spark cannot unilaterally extract funds.

Q: Why not just use on-chain stability fees like regular vaults?

In Stage 1, stability fees are set to zero via the SP-BEAM so that all value transfers happen through Executive Votes. This enables instance-level profit calculations, transparent three-party verification, and flexible penalty adjustments — none of which are possible with purely automatic on-chain accrual. In later phases, the Base Rate will accrue automatically on-chain, and Executive Votes will handle remaining settlement components.

Q: What happens if Instance Revenue < Instance Expense?

Instance Profit is floored at zero. Spark absorbs losses on underperforming instances; they can't pass negative profit to Sky.

Q: How often does settlement happen?

Monthly in Phase 1 (current). Phase 2 formalizes monthly settlement with automated monitoring. Phase 3 targets daily settlement at 16:00 UTC.

Q: What if settlement calculations disagree?

Multiple parties calculate independently. If difference exceeds 1% (Allowed Deviation), Core GovOps resolves the dispute. Primes can also submit Dispute Notices.

Sources

  1. Sky Core Monthly Settlement Cycle - A.2.4
  2. Stage 1 Simplified Profit And Loss Calculation - A.2.4.1.2.2.1.1
  3. Spark Prime Agent Artifact - A.6.1.1.1.2.6.1
  4. Surplus Buffer - A.3.5.1
  5. Agent Credit Line Borrow Rate - A.3.1.2.5
  6. Payment of Amounts Due to Prime Agents - A.2.4.1.2.1.4.1
  7. Collection of Amounts Due from Prime Agents - A.2.4.1.2.1.4.2
  8. Spark Liquidity Layer Documentation
  9. dss-allocator GitHub Repository
  10. Allocation System Primitive - A.2.2.9.1
  11. Minimum Actively Stabilizing Collateral - A.3.3.2.2
  12. Executive Spell Code - _takeAllocatorPayment Implementation
  13. MSC #4 Settlement Summary (November and December 2025) - Sky Forum
  14. Initial Calculation by Operational Executor Agent - A.2.4.1.2.1.2.1
  15. Allowed Deviation - A.2.4.1.2.1.3.3
  16. Independent Calculation by Core Council Risk Advisor - A.2.4.1.2.1.2.2
  17. Final Calculation by Core GovOps - A.2.4.1.2.1.3