> ## Documentation Index
> Fetch the complete documentation index at: https://docs.railnet.org/llms.txt
> Use this file to discover all available pages before exploring further.

# Mandate a strategy

> Deploy a strategy you own, define guardrails, and delegate operations to an asset manager

export const MandateParties = () => {
  const CSS = `
    .md-bg{fill:#F8F8F8;rx:4;ry:4}.dark .md-bg{fill:#141414}
    .md-t{fill:#374151;font-family:"Inter Tight","Inter",system-ui,sans-serif}.dark .md-t{fill:#D1D5DB}
    .md-tm{fill:#6B7280;font-family:"Inter Tight","Inter",system-ui,sans-serif}.dark .md-tm{fill:#9CA3AF}
    .md-h{fill:#111827;font-family:"Inter Tight","Inter",system-ui,sans-serif}.dark .md-h{fill:#E5E7EB}
    .md-owner{fill:#FFE4D2;rx:3;ry:3}.dark .md-owner{fill:#3D2510}
    .md-am{fill:#D4E8E0;rx:3;ry:3}.dark .md-am{fill:#1E3A2F}
    .md-sc{fill:#E5E7EB;rx:3;ry:3}.dark .md-sc{fill:#2D2D2D}
    .md-ln{stroke:#ACACAC;fill:none;stroke-width:1.5}.dark .md-ln{stroke:#666}
  `;
  return <div className="not-prose w-full my-6 overflow-x-auto" style={{
    padding: '2px'
  }}>
      <style>{CSS}</style>
      <svg viewBox="0 -15 580 245" style={{
    width: '100%',
    height: 'auto',
    maxWidth: '600px',
    display: 'block'
  }} role="img" aria-label="Three-party mandate: platform owner, asset manager, and smart contracts">
        <rect x="0" y="-15" width="580" height="245" className="md-bg" />

        <rect x="15" y="10" width="250" height="140" className="md-owner" />
        <text x="35" y="34" className="md-h" fontSize="12" fontWeight="700">Your platform (owner)</text>
        <text x="35" y="56" className="md-t" fontSize="11">• Owns the strategy</text>
        <text x="35" y="74" className="md-t" fontSize="11">• Defines the guardrails</text>
        <text x="35" y="92" className="md-t" fontSize="11">• Controls fee economics</text>
        <text x="35" y="110" className="md-t" fontSize="11">• Can revoke at any time</text>
        <text x="35" y="128" className="md-t" fontSize="11">• Retains admin control</text>

        <rect x="295" y="10" width="270" height="122" className="md-am" />
        <text x="315" y="34" className="md-h" fontSize="12" fontWeight="700">Asset manager (operator)</text>
        <text x="315" y="56" className="md-t" fontSize="11">• Operates within your rules</text>
        <text x="315" y="74" className="md-t" fontSize="11">• Allocates capital to yield sources</text>
        <text x="315" y="92" className="md-t" fontSize="11">• Rebalances positions</text>
        <text x="315" y="110" className="md-t" fontSize="11">• Manages deposit and redeem queues</text>

        <line x1="140" y1="150" x2="140" y2="182" className="md-ln" />
        <line x1="430" y1="132" x2="430" y2="182" className="md-ln" />
        <line x1="140" y1="182" x2="430" y2="182" className="md-ln" />
        <line x1="290" y1="182" x2="290" y2="196" className="md-ln" />

        <rect x="175" y="196" width="230" height="26" className="md-sc" />
        <text x="290" y="213" textAnchor="middle" className="md-tm" fontSize="11" fontWeight="600">Smart contracts enforce the rules</text>
      </svg>
    </div>;
};

When you mandate a strategy, you deploy and own the infrastructure while delegating day-to-day operations to a professional asset manager. You define exactly what the asset manager can and cannot do — which yield sources they can use, how fees are split, and what roles they hold. The smart contracts enforce these boundaries, not trust.

This guide walks you through the full journey: agreeing on terms, deploying the strategy, configuring guardrails, and delegating operations.

## What is a mandate?

A mandate is your platform's request for an asset manager to operate a Strategy according to guardrails you define. You say: "manage this capital, but only using these yield sources, with these fee caps." The asset manager accepts and operates within those constraints.

Three parties are involved:

<MandateParties />

This differs from the "use an existing strategy" path where the asset manager owns the strategy and you simply point your Conduit at it. With a mandate, **you own and control the strategy** — the asset manager is your operator, not your counterparty.

## Define the terms of your mandate

Before deploying anything, agree with your asset manager on what the mandate allows:

| Term                         | What you decide                              | How it's enforced on-chain                                             |
| ---------------------------- | -------------------------------------------- | ---------------------------------------------------------------------- |
| **Authorized yield sources** | Which protocols the AM can deploy capital to | Vehicle Registry — only explicitly approved sources can receive assets |
| **Allocation limits**        | Maximum exposure per yield source            | Queue configuration and allocation caps                                |
| **Fee structure**            | Fee rates, max caps, and recipient splits    | Fee Manager — immutable max caps guarantee the boundaries              |
| **Operational scope**        | Which on-chain roles the AM receives         | EAC scoped roles — granular, per-contract permissions                  |

## Execute the mandate

<Steps>
  <Step title="Deploy the strategy">
    As the platform, you deploy and own the strategy infrastructure — the External Access Control, Fee Manager, and MultiVehicle. This gives you admin control over the entire system.

    Follow the deployment guide to set up:

    * **External Access Control (EAC)** — your central permission contract, with your platform admin as `DEFAULT_ADMIN_ROLE`
    * **Fee Manager** — configured with the fee structure you agreed on with the AM
    * **MultiVehicle** — the Strategy contract itself, along with its accounting and queue engines

    <Card title="Deploy your strategy" icon="rocket" href="/conduits/use-a-strategy">
      Step-by-step guide to deploying the strategy infrastructure as a Conduit owner.
    </Card>

    For more detail on each contract and parameter, see [Create a Strategy](/strategies/allocation/create).
  </Step>

  <Step title="Authorize yield sources">
    Decide which yield sources your strategy can use. This is the most important guardrail — the asset manager can only deploy capital to sources you have explicitly approved. Everything else is blocked at the contract level.

    You can add or remove authorized sources at any time. Only the owner (you) can change this list.

    <CodeGroup>
      ```solidity Solidity theme={null}
      ISectorAccountingEngine accounting = contracts.multiVehicle.accountingEngine();

      // Authorize yield sources for your strategy
      accounting.syncVehicleActivationStatus(aaveVehicle, true);
      accounting.syncVehicleActivationStatus(compoundVehicle, true);
      ```

      ```typescript TypeScript theme={null}
      // Coming soon
      ```
    </CodeGroup>

    **Requires:** `MULTI_VEHICLE_SET_VEHICLE_AUTHORIZATION` role scoped to the Sector Accounting Engine. As the owner, grant this role to yourself — never to the asset manager.
  </Step>

  <Step title="Grant operational roles to the asset manager">
    This is the formal delegation. You grant the asset manager scoped roles that allow them to operate the strategy — and nothing more.

    | Role category                                                 | What it allows                                      | Scoped to                |
    | ------------------------------------------------------------- | --------------------------------------------------- | ------------------------ |
    | **Core operations** (dispatch, rebalance, move assets/shares) | Allocate capital and rebalance across yield sources | Sector Accounting Engine |
    | **Queue management**                                          | Configure deposit and redeem allocation queues      | Queue Strategy Engine    |
    | **Query progression**                                         | Advance async operations through their lifecycle    | Sub Query Engine         |
    | **Redemption queue**                                          | Feed and retrieve assets from the redemption queue  | MultiVehicle             |

    For the full code to grant all operational roles, see [Grant operational roles](/strategies/allocation/guardrails#grant-operational-roles).

    <Warning>
      Never grant `DEFAULT_ADMIN_ROLE` to the asset manager. This is the most privileged role — it can grant and revoke any other role, including its own.
    </Warning>

    <Tip>
      Optionally grant fee collection roles (`FEE_MANAGER_DISPATCH_ERC20`, `FEE_MANAGER_REDEEM_VEHICLE_SHARES`) to the AM or a keeper for routine fee distribution. See [Optional: grant fee collection roles](/strategies/allocation/guardrails#optional-grant-fee-collection-roles).
    </Tip>
  </Step>

  <Step title="Verify the mandate">
    Confirm the asset manager has exactly the right permissions — operational roles granted, admin roles retained by you.

    <CodeGroup>
      ```solidity Solidity theme={null}
      // Verify the AM has an operational role
      bool canDispatch = eac.hasRoleOrScopedRole(
          keccak256("MULTI_VEHICLE_DISPATCH"),
          address(accounting),
          assetManager
      );

      // Verify the AM does NOT have admin roles
      bool hasAdmin = eac.hasRoleOrScopedRole(
          keccak256("DEFAULT_ADMIN_ROLE"),
          address(0),
          assetManager
      );
      assert(!hasAdmin); // Must be false
      ```

      ```typescript TypeScript theme={null}
      // Coming soon
      ```
    </CodeGroup>

    **Mandate checklist:**

    * The AM has core operational roles (dispatch, rebalance, move assets/shares)
    * The AM has queue management and query progression roles
    * The AM does **not** have vehicle authorization (`MULTI_VEHICLE_SET_VEHICLE_AUTHORIZATION`)
    * The AM does **not** have fee configuration (`FEE_MANAGER_SET_FEES`, `FEE_MANAGER_SET_FEE_RECIPIENTS`)
    * The AM does **not** have `DEFAULT_ADMIN_ROLE`
  </Step>

  <Step title="Connect to your Conduit">
    With the mandate in place and the asset manager operating your strategy, deploy a Conduit on top to let your users access it through your platform's interface.

    <Card title="Quick start" icon="rocket" href="/conduits/quick-start">
      Deploy your first Conduit and connect it to your mandated strategy.
    </Card>
  </Step>
</Steps>

## Monitor the mandate

Once the mandate is active, ongoing oversight is your responsibility as the strategy owner.

<AccordionGroup>
  <Accordion title="Track performance">
    Monitor your strategy's TVL, allocation breakdown, and operational activity through the Railnet subgraph:

    ```graphql theme={null}
    query StrategyOverview($address: String!) {
      Vehicle(where: { address: { _ilike: $address } }) {
        supply
        SectorBalance {
          asset
          value
          sector { name }
        }
        Query(order_by: { createdAt: desc }, limit: 20) {
          mode
          state
          createdAt
        }
      }
    }
    ```

    See [API & reporting](/developers/api) for comprehensive monitoring queries.
  </Accordion>

  <Accordion title="Review allocation decisions">
    Every asset movement emits on-chain events. You can verify that the asset manager is deploying capital only to authorized yield sources and within any allocation limits you defined.
  </Accordion>

  <Accordion title="Audit fee collection">
    The Fee Manager tracks all fee accrual and distribution on-chain. Fees flow to the configured recipients automatically, according to the splits you defined in the Fee Manager.

    See [Fee Manager reference](/developers/contracts/fee-manager) for details on how fees are collected and distributed.
  </Accordion>
</AccordionGroup>

## Adjust the mandate

As the strategy owner, you can adjust mandate terms without redeploying:

| Adjustment                    | How                                           | Notes                                                           |
| ----------------------------- | --------------------------------------------- | --------------------------------------------------------------- |
| **Add a yield source**        | Authorize via `syncVehicleActivationStatus`   | Takes effect immediately — the AM can start allocating          |
| **Remove a yield source**     | Deauthorize via `syncVehicleActivationStatus` | The AM must withdraw capital from that source first             |
| **Change fee rates**          | Update via Fee Manager                        | Must stay within immutable max caps                             |
| **Update fee recipients**     | Update via Fee Manager                        | Dispatch pending fees before changing recipients                |
| **Tighten allocation limits** | Update queue configuration                    | Restricts future allocations; existing positions are unaffected |

## Offboard an asset manager

<Steps>
  <Step title="Check for in-flight operations">
    Before revoking roles, ensure there are no pending queries that require the asset manager's roles to complete.

    ```graphql theme={null}
    query PendingQueries($address: String!) {
      Query(where: {
        Vehicle: { address: { _ilike: $address } },
        state: { _nin: ["SETTLED", "CANCELLED"] }
      }) {
        id
        mode
        state
        createdAt
      }
    }
    ```

    <Tip>
      Allow time for async operations (like Ethena's 7-day cooldown) to settle before revoking roles. Pending operations will complete even after revocation, but new ones cannot be initiated.
    </Tip>
  </Step>

  <Step title="Revoke all operational roles">
    Once in-flight operations have settled, revoke the asset manager's roles. They will no longer be able to initiate any operations on the strategy.

    For the full revocation code, see [Revoke access](/strategies/allocation/guardrails#revoke-access).
  </Step>

  <Step title="Onboard a replacement (optional)">
    You can immediately delegate to a new asset manager by granting them the same set of scoped roles. Your strategy, guardrails, and fee structure remain unchanged — only the operator changes.

    See [Grant operational roles](/strategies/allocation/guardrails#grant-operational-roles) to onboard the new AM.
  </Step>
</Steps>

## Mandate vs. using an existing strategy

Not sure which path is right? Here's how they compare:

|                                | Use an existing strategy      | Mandate a bespoke strategy           |
| ------------------------------ | ----------------------------- | ------------------------------------ |
| **Who owns the strategy?**     | The asset manager             | You (the platform)                   |
| **Who sets guardrails?**       | The AM (self-imposed)         | You                                  |
| **Fee structure**              | The AM's terms                | Your terms                           |
| **Yield source authorization** | The AM decides                | You decide                           |
| **Can you switch AMs?**        | Point to a different strategy | Revoke and re-delegate               |
| **Complexity**                 | Lower — just connect          | Higher — deploy, configure, delegate |

## Next steps

<CardGroup cols={2}>
  <Card title="Configure fees" icon="percent" href="/conduits/configure-fees">
    Configure distribution-layer fees on your Conduit and understand the two-layer fee model.
  </Card>

  <Card title="Guardrails reference" icon="shield" href="/strategies/allocation/guardrails">
    Full technical reference for the delegation model and role-granting code.
  </Card>
</CardGroup>
