#
Master Ledger
The Master Ledger is the canonical source of truth for all Tortuga assets. It maintains the authoritative record of token ownership, regardless of which chain tokens are held on.
#
Overview
flowchart TB
subgraph Master Ledger
REG[Token Registry]
BAL[Balance Tracker]
HIST[Transaction History]
META[Bond Metadata]
end
KYC[KYC Registry] --> BAL
CF[Chain Fusion] <--> BAL
ISSUER[Issuer] --> REG
ISSUER --> META
YLD[Yield Distributor] --> BAL
#
Responsibilities
#
Data Model
#
Token
type Token = record {
id : TokenId;
isin : Text;
name : Text;
symbol : Text;
decimals : nat8;
total_supply : nat;
bond_metadata : BondMetadata;
created_at : Timestamp;
status : TokenStatus;
};
type BondMetadata = record {
issuer : Text;
maturity_date : Timestamp;
coupon_rate : nat; // Basis points (e.g., 750 = 7.5%)
coupon_frequency : CouponFrequency;
collateral_type : Text;
collateral_location : Text;
prospectus_url : Text;
};
type TokenStatus = variant {
Active;
Matured;
Suspended;
Redeemed;
};
type CouponFrequency = variant {
Annual;
SemiAnnual;
Quarterly;
Monthly;
};
#
Balance Entry
type BalanceEntry = record {
owner : Principal;
token_id : TokenId;
balance : nat;
chain : Chain;
last_updated : Timestamp;
};
type Chain = variant {
ICP;
EVM : EvmChain;
Solana;
Cosmos : CosmosChain;
};
type EvmChain = variant {
Ethereum;
Base;
Arbitrum;
Polygon;
};
type CosmosChain = variant {
Osmosis;
CosmosHub;
};
#
Transaction Record
type Transaction = record {
id : TransactionId;
token_id : TokenId;
tx_type : TransactionType;
from : opt Principal;
to : opt Principal;
amount : nat;
chain : Chain;
external_tx_hash : opt Text;
timestamp : Timestamp;
status : TransactionStatus;
};
type TransactionType = variant {
Mint;
Burn;
Transfer;
CrossChainMint;
CrossChainBurn;
YieldPayment;
};
type TransactionStatus = variant {
Pending;
Confirmed;
Failed : Text;
};
#
Canister Interface
#
Token Management
candid
service : {
// Register a new tokenized bond (issuer only)
create_token : (CreateTokenArgs) -> (Result<TokenId, Error>);
// Get token details
get_token : (TokenId) -> (opt Token) query;
// List all tokens
list_tokens : () -> (vec Token) query;
// Update token status (issuer only)
update_token_status : (TokenId, TokenStatus) -> (Result<(), Error>);
}
#
Balance Operations
candid
service : {
// Get balance for a principal on specific chain
balance_of : (Principal, TokenId, Chain) -> (nat) query;
// Get total balance across all chains
total_balance_of : (Principal, TokenId) -> (nat) query;
// Get all holders of a token (for yield distribution)
get_holders : (TokenId) -> (vec BalanceEntry) query;
// Get holder snapshot at specific time (for yield calculation)
get_holder_snapshot : (TokenId, Timestamp) -> (vec BalanceEntry) query;
}
#
Transfer Operations
candid
service : {
// Internal transfer (ICP chain only)
transfer : (TransferArgs) -> (Result<TransactionId, Error>);
// Request cross-chain mint (called by Chain Fusion)
cross_chain_mint : (CrossChainMintArgs) -> (Result<TransactionId, Error>);
// Request cross-chain burn (called by Chain Fusion)
cross_chain_burn : (CrossChainBurnArgs) -> (Result<TransactionId, Error>);
// Update balance after external chain confirmation
confirm_cross_chain_tx : (TransactionId, Text) -> (Result<(), Error>);
}
#
Query Operations
candid
service : {
// Get transaction history for a principal
get_transactions : (Principal, opt TokenId, Pagination) -> (vec Transaction) query;
// Get specific transaction
get_transaction : (TransactionId) -> (opt Transaction) query;
// Get transaction by external chain hash
get_transaction_by_hash : (Text) -> (opt Transaction) query;
}
#
State Management
#
Stable Storage
The Master Ledger uses stable memory for persistence across upgrades:
flowchart TB
subgraph Stable Memory
TOKENS[Token Registry]
BALANCES[Balance Map]
TXS[Transaction Log]
INDEX[Indexes]
end
subgraph Indexes
BY_OWNER[By Owner]
BY_TOKEN[By Token]
BY_CHAIN[By Chain]
BY_TIME[By Timestamp]
end
INDEX --> BY_OWNER & BY_TOKEN & BY_CHAIN & BY_TIME
#
Memory Layout
#
Balance Synchronization
The Master Ledger maintains consistency with external chains through Chain Fusion:
sequenceDiagram
participant EVM as EVM Chain
participant CF as Chain Fusion
participant ML as Master Ledger
Note over EVM,ML: Mint Flow
ML->>CF: Request Mint (user, amount, chain)
CF->>EVM: Sign & Submit Mint TX
EVM-->>CF: TX Confirmed
CF->>ML: Confirm Mint (tx_hash)
ML->>ML: Update Balance
Note over EVM,ML: Burn Flow
EVM->>CF: Burn Event Detected
CF->>ML: Report Burn (user, amount)
ML->>ML: Update Balance
ML-->>CF: Acknowledged
#
Consistency Guarantees
#
Access Control
flowchart TB
ISSUER[Issuer Principal] --> CREATE[Create Token]
ISSUER --> UPDATE[Update Status]
CF[Chain Fusion Canister] --> MINT[Cross-chain Mint]
CF --> BURN[Cross-chain Burn]
CF --> CONFIRM[Confirm TX]
YIELD[Yield Distributor] --> SNAPSHOT[Get Snapshots]
ANY[Any Principal] --> QUERY[Query Operations]
VERIFIED[KYC Verified] --> TRANSFER[Transfer]
#
Error Handling
type Error = variant {
NotAuthorized;
TokenNotFound;
InsufficientBalance;
KycNotVerified : Principal;
TransferRestricted : Text;
InvalidAmount;
TokenSuspended;
TokenMatured;
DuplicateTransaction;
ChainNotSupported;
InternalError : Text;
};