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
}