Aqua0
Developers

Becoming a strategist

How a wallet gets a strategy class it can ship against, without asking the team.

Class creation is self-service and permissionless. If you hit "not the registered strategist", you are looking at someone else's class, not a closed door.

What a class is

A strategy class is the consent record LPs back. Its key is derived from your own address:

strategyKey = keccak256(abi.encode(strategist, chainId, sortedPair, label))

Because your address is in the preimage, two strategists never collide on the same pair. Your class for MYRC/USDC is not the same class as anyone else's for MYRC/USDC.

VaultRegistry.registerStrategyClass(strategyKey) issues the next monotonic classId and is permissionless. The registry stores only key -> id; it holds no owner.

Getting your own class

Open the ship wizard for the pair you want and, if you have no class for it, take the one-click class creation. It derives the key from your connected wallet, registers the legs, and leaves you as the strategist. No admin step, no request to the team.

If a key is already taken, creation walks a bounded label sequence to route around it. A key's preimage is public, so in principle it can be front-run; escalation handles that without you needing to know it happened.

Why you can see a class you cannot ship

Ownership lives on AssetVault, per strategy, not on the registry:

function classStrategist(uint256 strategyId) external view returns (address);

not the registered strategist means classStrategist(classId) is not your wallet. That is working as intended. Class ids are global and visible, so encountering one you do not own is normal. Create your own rather than trying to ship against it.

Transferring a class

function setStrategist(uint256 strategyId, address strategist) external;

Gated to the current strategist, so transfer is self-service and no admin key can seize a strategy's signer.

Losing the strategist key does not trap LP funds. It makes the strategy dormant: no new ships or approvals, while committed principal stays withdrawable and deployed principal returns through the Composer and async redeem, both independent of the strategist.

Checking ownership before you build

classStrategist is a plain view call, so a script can check before attempting a ship:

const owner = await vault.read.classStrategist([classId])
if (owner.toLowerCase() !== wallet.toLowerCase()) {
  // create your own class instead of shipping against this one
}

On this page