Skip to main content

Custodial vs Non-custodial Supplier Migration

GitHub Discussion Origin Document

This document is a result of the GitHub Discussion found here.

Custodial vs Non-custodial Supplier Migration

Goal: Provide a clear overview of how Suppliers (Servicers) will migrate from Morse to Shannon.

Table of Contents

Terminology

SymbolDefinition
MA Morse address controlled by S (both owner and operator)
M_outputA Morse staking (operator and/or owner) address controlled by S_owner
M_operatorA Morse output address (owner) controlled by S_operator (where rewards go)
SA Shannon address that owns M (both owner and operator)
S_ownerA Shannon owner address (of M_output)
S_operatorA Shannon operator address (of M_operator)
output_addressMorse term - Owner of the staked funds (where rewards and unstaked funds go)
addressMorse term - The Morse staking address (usually the operator address)
owner_addressShannon term - Owner of the staked funds
operator_addressShannon term - Operator of the staked funds

Address fields by chain

ChainNode roleRequired field(s)Optional field(s)Who can control each field
MorseNodeRunner (a.k.a Servicer)address (a.k.a operator)output_addressaddress: operator and/or owner
output_address: owner only
ShannonSupplierowner_addressoperator_addressowner_address: operator and/or owner
operator_address: operator only

Custody Models

Custody typeDefinition
CustodialOwner of staked funds is the same as the node operator
Non-custodialOwner of staked funds differs from the node operator

Background

Morse Background

In Morse, the CLI provides the following documentation for custodial & non-custodial staking:

Running the following command:

pocket nodes supplier --help

Prints out:

The node namespace handles all node related interactions, from staking and unstaking; to unjailing.

---

Operator Address (i.e. Non-Custodial Address) can do the following:
- Submit Block, Claim & Proof Txs

Output Address (i.e. Custodial Address) can do the following:
- Receive earned rewards
- Receive funds after unstaking

Both Operator and Output Addresses can do the following:
- Submit Stake, EditStake, Unstake, Unjail Txs

Morse -> Shannon Migration Types

Migration Types Table

Non-custodial migration has a few variations and can be summarized via the following table.

Flow TypeSupportedMorse (output_address, address)Shannon (owner_address, operator_address)Claim SignerNotesPre-Conditions
Custodial #1 – owner-op sign(M, M)(S, S)S & MSame identity controls and signs Morse & Shannon messagesS owns M
Custodial #2 – operator-only(null, M)(S, null)S & MOwner signs with no output overrideS owns M
Custodial #3 – operator-only(null, M)(S, S)S & MSame signer, no output overrideS owns M
Non-custodial #1 – invalid(M_output, M_operator)(S_owner, null)-Invalid because operator_address must be specified if output_addressaddress
Non-custodial #2 – owner sign(M_output, M_operator)(S_owner, S_operator)S_owner & M_ownerOwner signs for staking addr; output addr linked off-chain to S_owner(S_owner owns M_output) && (S_operator owns M_operator) && (M_operator gives S_operator shannon staking config offchain)
Non-custodial #3 – operator sign(M_output, M_operator)(S_owner, S_operator)S_operator & M_operatorOperator signs for output addr; off-chain linkage to M_operator required(S_owner owns M_output) && (S_operator owns M_operator) && (S_operator gives M_operator shannon address offline)
Non-custodial #4 – invalid(M_output, null)(S_owner, S_operator)-Operator address should not be defined if no distinct output address
Invalid – missing shannon operator(M_output, null)-No operator and no output override — unsupported
Invalid – missing shannon owner(null, S_operator)-Owner must be defined
Non-custodial #5 – invalid(M1, M2)(S, S)SOwner and operator must differ if output differs from staking address

Custodial Migration

Custodial migration is straightforward and can be visualized as follows:

Non-custodial #2 – owner sign

Non-custodial #3 – operator sign

Non-custodial #3 – operator sign - attack

Non-custodial #3 – operator vs owner sign risk tradeoffs

FlowWhat HappensOwner EffortSecurity RiskUX for OwnerSupported?
Default (operator-led claim)Owner creates owner_address → shares it → operator submits claimLow (share one address)Medium – operator could swap addressVery simpleYes (recommended)
Operator generates key, gives it to ownerOperator creates key → passes private key to owner → submits claimMediumHigh – private key handled insecurelyAwkwardNo
Owner prepares full staking configOwner sets up both owner_address & operator_address, then hands config to operatorHigh (many owners are non-technical)LowDifficultNo (impractical)