You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Note: The Stellar contracts (sender, batch-sender, vault, names) have no upgrade function and no renounce_admin. The init_multisig function has no caller authorization check (anyone can call it once). The upgrade authority table reflects the current source code.
Legend
Symbol
Meaning
β
Operation exists and is authorized
β
Operation does not exist (frozen/immutable contract)
π
Requires authorization (caller must sign)
π
Admin-only (stored admin address)
π³οΈ
Token-weighted governance vote
π₯
Multisig threshold (M-of-N)
β±οΈ
Timelock delay enforced
π
Signer rotation proposal flow
β
Not applicable / no storage
Stellar Contracts
1. stealth-announcer (Frozen)
Operation
Expected Caller
Auth Required
Errors
Governance
announce
Anyone (permissionless)
β
scheme_id != 2 β panic metadata empty β panic
None (immutable)
init
β
β
β
β Not implemented
pause
β
β
β
β Not implemented
upgrade
β
β
β
β Frozen
Notes: Stateless event emitter. No storage, no admin, no upgrade path. scheme_id must be 2 (Stellar v2).
2. stealth-registry (Frozen)
Operation
Expected Caller
Auth Required
Errors
Governance
register_keys
Registrant
π registrant.require_auth()
InvalidMetaAddressLength (β 64 bytes)
None (immutable)
remove_keys
Registrant
π registrant.require_auth()
NotRegistered
None (immutable)
stealth_meta_address_of
Anyone (view)
β
NotRegistered
None
init
β
β
β
β Not implemented
pause
β
β
β
β Not implemented
upgrade
β
β
β
β Frozen
Notes: User-sovereign key storage. No admin can censor or alter registrations.
Notes: Immutable split definition storage. Max 25 beneficiaries with 64-byte meta-addresses each. Atomic fund + distribute + announce. No admin, no pause, no upgrade, no multisig.
Notes: Ownership proven via secp256k1 signature from spending private key (first 33 bytes of meta-address). No admin, no pause, no upgrade. Nonce replay protection on registerOnBehalf.
5. WraithWithdrawer (EIP-7702 Delegation Target)
Operation
Expected Caller
Auth Required
Errors
Governance
withdrawETH
Sponsor (msg.sender)
π msg.sender (EIP-7702 delegated)
InsufficientBalance, FeeTooHigh, TransferFailed
None (immutable)
withdrawERC20
Sponsor (msg.sender)
π msg.sender (EIP-7702 delegated)
InsufficientBalance, FeeTooHigh, TransferFailed
None (immutable)
withdrawETHDirect
Self (stealth EOA)
π msg.sender
InsufficientBalance, TransferFailed
None (immutable)
withdrawERC20Direct
Self (stealth EOA)
π msg.sender
InsufficientBalance, TransferFailed
None (immutable)
Notes: Designed as EIP-7702 delegation target. When delegated, address(this) = stealth EOA. Sponsor pays gas, receives sponsorFee from withdrawal. No admin, no pause, no upgrade.
Solana Contracts
1. wraith-announcer (Immutable)
Operation
Expected Caller
Auth Required
Errors
Governance
announce
Caller (Signer)
π Signer<'info>
None (emits event)
None (immutable)
Notes: Stateless. No storage, no admin, no upgrade.
2. wraith-sender (Immutable)
Operation
Expected Caller
Auth Required
Errors
Governance
send_sol
Sender (Signer)
π Signer<'info>
SystemProgram errors
None (immutable)
send_spl
Sender (Signer)
π Signer<'info>
TokenProgram errors
None (immutable)
Notes: Atomic transfer + announcement. No admin, no pause, no upgrade. Sender must sign.
3. wraith-names (Owner-based via PDA)
Operation
Expected Caller
Auth Required
Errors
Governance
register
Owner (Signer, payer)
π Signer<'info>
InvalidNameLength, InvalidNameCharacter
Owner (wallet)
update
Owner (Signer)
π Signer<'info> + owner check
NotOwner
Owner (wallet)
release
Owner (Signer)
π Signer<'info> + owner check
NotOwner
Owner (wallet)
resolve
Anyone (view)
β
Returns meta-address
β
Notes: PDA derived from ["name", name]. Owner = wallet that paid for registration. No admin, no pause, no upgrade.
Notes: Validates secp256k1 signature against blake160(stealth_pubkey) in lock args. Delegates to on-chain ckb-auth cell. No admin, no upgrade (script hash fixed).
2. wraith-names-type (Type Script)
Operation
Expected Caller
Auth Required
Errors
Governance
program_entry (validate)
Tx builder
β (cell lock proves ownership)
InvalidDataLength (β 66 bytes)
None (immutable script)
Notes: Validates name cell data = 66 bytes (spending_pubkey + viewing_pubkey). Create/Update require 66-byte output; Destroy (release) always allowed. Ownership via cell's lock script. No admin, no upgrade.
Cross-Chain Comparison
Initialization
Chain
Contract
Init Auth
Re-init Protection
Stellar
stealth-sender
Deployer (arg)
AlreadyInitialized
Stellar
stealth-splitter
Deployer (arg)
AlreadyInitialized
Stellar
stealth-vault
Deployer (arg)
AlreadyInitialized
Stellar
wraith-names
Deployer (arg)
Idempotent (first wins)
Stellar
wraith-asset-policy
Deployer (arg)
already initialized (panic)
Stellar
governance
Deployer (arg)
AlreadyInitialized
EVM
WraithSender
Constructor arg
Constructor (once)
EVM
ERC6538Registry
Constructor
Constructor (once)
EVM
WraithNames
Constructor
Constructor (once)
EVM
WraithWithdrawer
Constructor
Constructor (once)
Solana
wraith-names
First register (PDA init)
PDA init constraint
CKB
(scripts)
Deploy (cell creation)
Type/lock hash fixed
Pause/Unpause
Chain
Contract
Pause Auth
Unpause Auth
Paused Ops
Exit Ops During Pause
Stellar
stealth-sender
Admin (π + π)
Admin (π + π)
send, batch_send
withdraw_many
Stellar
stealth-batch-sender
Admin (π + π)
Admin (π + π)
batch_send
(none)
Stellar
stealth-vault
Admin (π + π)
Admin (π + π)
deposit
claim, refund, refund_permissionless
Stellar
wraith-names
Admin (π + π)
Admin (π + π)
register, update, release, bulk_*, extend_ttl
resolve, name_of, bulk_renew, auctions
EVM
(none)
β
β
β
β
Solana
(none)
β
β
β
β
CKB
(none)
β
β
β
β
Signer Rotation (Multisig Governance)
Chain
Contract
Propose
Approve
Execute
Cancel
Timelock
Threshold
Stellar
stealth-sender
Signer (π₯)
Signer (π₯)
Signer (π₯ + β±οΈ)
Signer (π₯)
7 days
Configurable
Stellar
stealth-batch-sender
Signer (π₯)
Signer (π₯)
Signer (π₯ + β±οΈ)
Signer (π₯)
7 days
Configurable
Stellar
wraith-names
Signer (π₯)
Signer (π₯)
Signer (π₯ + β±οΈ)
Signer (π₯)
7 days
Configurable
EVM
(none)
β
β
β
β
β
β
Solana
(none)
β
β
β
β
β
β
CKB
(none)
β
β
β
β
β
β
Upgrade Authority
Chain
Contract
Upgradeable
Admin
Multisig
Timelock
Renunciation Path
Stellar
stealth-announcer
β Frozen
β
β
β
N/A
Stellar
stealth-registry
β Frozen
β
β
β
N/A
Stellar
stealth-sender
β No upgrade function
π Admin (pause only)
π₯ Rotation only
β
N/A
Stellar
stealth-batch-sender
β No upgrade function
π Admin (pause only)
π₯ Rotation only
β
N/A
Stellar
stealth-splitter
β Immutable
β
β
β
N/A
Stellar
stealth-vault
β No upgrade function
π Admin (pause only)
β
β
N/A
Stellar
wraith-names
β No upgrade function
π Admin (pause only)
π₯ Rotation only
β
N/A
Stellar
wraith-asset-policy
β (admin only)
π Admin
β
β
β
Stellar
governance
β PoC
π Admin
β
β±οΈ (vote)
β
EVM
All
β Immutable
β
β
β
N/A
Solana
All
β Immutable
β
β
β
N/A
CKB
All
β Immutable
β
β
β
N/A
Error Code Reference
Stellar Errors (by Contract)
stealth-sender (SenderError)
Code
Error
Condition
1
AlreadyInitialized
init called twice
2
NotInitialized
Operation before init
3
LengthMismatch
Batch vector lengths differ
4
TokenNotAllowed
Asset policy rejects token
5
InvalidFeeConfig
Fee > 50bps or fee>0 w/o recipient
16
Paused
Contract paused
6
BatchTooLarge
>30 withdrawals
7
MultisigNotInitialized
init_multisig not called
8
MultisigAlreadyInitialized
init_multisig called twice
9
NotSigner
Caller not in signer set
10
InvalidThreshold
Threshold 0 or > signers
11
RotationAlreadyPending
Proposal exists
12
NoPendingRotation
No proposal to act on
13
AlreadyApprovedRotation
Signer already approved
14
QuorumNotMet
Approvals < threshold
15
TimelockNotElapsed
<7 days since propose
1200
ReceivedAmountMismatch
Stealth address balance did not grow by exactly the transferred amount
stealth-splitter (SplitterError)
Code
Error
Condition
1
AlreadyInitialized
init called twice
2
NotInitialized
Operation before init
3
SplitNotFound
Split ID not in storage
4
TooManyBeneficiaries
>25 beneficiaries
5
WeightOverflow
Weight sum overflow
6
InvalidMetaAddressLength
Meta-address β64 bytes
7
InvalidAmount
Amount β€0
8
EmptyBeneficiaries
No beneficiaries provided
stealth-vault (VaultError)
Code
Error
Condition
1
AlreadyInitialized
init called twice
2
NotInitialized
Operation before init
3
InvalidWindow
refund_after β€ unlock_ledger + grace
4
DepositNotFound
Deposit ID not in storage
5
NotYetUnlocked
ledger < unlock_ledger
6
NotYetRefundable
ledger < refund_after
7
WrongRecipient
Claimer β recipient
8
Paused
Contract paused
9
NotYetPermissionless
ledger < refund_after + grace
10
InvalidGracePeriod
grace_period == 0
wraith-names (NamesError)
Code
Error
Condition
1
NameTaken
Name already registered
2
NameTooShort
<3 chars
3
NameTooLong
>32 chars
4
InvalidNameCharacter
Not lowercase alnum or hyphen
5
InvalidMetaAddress
β 64 bytes
6
NameNotFound
Name not registered
7
NotOwner
Caller β owner (or parent owner)
8
SignatureExpired
ledger β₯ expiry
9
SignatureReplay
Replay key already used
10
InvalidSigner
Not Ed25519 account
11
NotGuardian
Caller not guardian
12
NoProposal
Recovery proposal missing
13
ProposalAlreadyExists
Recovery proposal exists
14
AlreadyApproved
Guardian already approved
15
DelayNotElapsed
Recovery delay not met
16
ThresholdNotMet
Guardian approvals < threshold
17
TooManyGuardians
>max guardians
18
InvalidThreshold
Guardian threshold invalid
19
InvalidExtendLedger
extend_to == 0 (TTL in ledgers from now)
20
ParentNotFound
Subdomain parent missing
32
Paused
Contract paused
21
MultisigNotInitialized
init_multisig not called
22
MultisigAlreadyInitialized
init_multisig called twice
23
NotSigner
Caller not in signer set
24
RotationAlreadyPending
Proposal exists
25
NoPendingRotation
No proposal to act on
26
AlreadyApprovedRotation
Signer already approved
27
QuorumNotMet
Approvals < threshold
28
TimelockNotElapsed
<7 days since propose
29
NameTooDeep
Subdomain depth >1
30
BulkLimitExceeded
>20 names in bulk
31
PremiumAuctionRequired
β€4 chars during premium window
governance (GovernanceError)
Code
Error
Condition
1
AlreadyInitialized
init called twice
2
NotInitialized
Operation before init
3
NotAdmin
Caller β admin
4
ProposalNotFound
Proposal ID missing
5
AlreadyVoted
Voter already voted
6
VotingNotActive
ledger < start or ledger > end
7
VotingStillActive
execute before voting ends
8
QuorumNotMet
total_votes < quorum
9
ProposalDefeated
for_votes β€ against_votes
10
TimelockNotElapsed
ledger < end + timelock
11
AlreadyExecuted
Proposal executed
12
AlreadyCancelled
Proposal cancelled
13
ExecutionFailed
Target call reverted
14
NoVotingPower
balance == 0
EVM Errors
ERC6538Registry
Error
Condition
ERC6538Registry__InvalidSignature
ecrecover fails & EIP-1271 fails
WraithSender
Error
Condition
LengthMismatch
Batch array lengths differ
InsufficientValue
msg.value β sum(amounts) (batch ETH)
TipTransferFailed
ETH tip transfer reverted
WraithNames
Error
Condition
NameTaken
Name already registered
NameTooShort
<3 chars
NameTooLong
>32 chars
InvalidNameCharacter
Not lowercase alnum
InvalidMetaAddress
β 66 bytes
InvalidSignature
ecrecover β spending address
NameNotFound
Name not registered
NotOwner
ecrecover β entry.spendingAddress
WraithWithdrawer
Error
Condition
InsufficientBalance
balance == 0
FeeTooHigh
sponsorFee β₯ balance
TransferFailed
Low-level call reverted
Solana Errors (WraithError)
Error
Condition
InvalidNameLength
Name not 3-32 chars
InvalidNameCharacter
Not lowercase alnum or hyphen
NotOwner
name_record.owner β owner.key()
CKB Errors
wraith-stealth-lock (Error)
Code
Error
Condition
1
IndexOutOfBound
Witness/index missing
2
ItemMissing
Required cell missing
3
LengthNotEnough
Data too short
4
Encoding
Serialization error
5
ArgsLengthNotEnough
Lock args β 53 bytes
6
SignatureLengthNotEnough
Sig β 65 bytes
7
AuthError
ckb-auth verification failed
wraith-names-type (Error)
Code
Error
Condition
1
IndexOutOfBound
Cell index missing
2
ItemMissing
Required cell missing
3
LengthNotEnough
Data too short
4
Encoding
Serialization error
5
InvalidDataLength
Cell data β 66 bytes
Replay Protection Summary
Chain
Contract
Mechanism
Stellar
stealth-registry
None (registrant auth only)
Stellar
wraith-names
Replay key (sha256 of auth message) stored in DataKey::Replay
Stellar
stealth-sender
Multisig rotation: PendingRotation state + approvals vec
Stellar
wraith-names
Multisig rotation: PendingRotation state + approvals vec
Stellar
stealth-splitter
None (immutable; deterministic split_id from beneficiaries + salt)
EVM
ERC6538Registry
Nonce per registrant (_nonces[registrant]++)
EVM
WraithNames
Nonce per spending address (nonces[spendingAddr]++)
Solana
wraith-names
PDA uniqueness (one per name)
CKB
(scripts)
Cell uniqueness (type script hash)
Zero-Address / Stale Authority Checks
Chain
Contract
Check
Stellar
stealth-sender
caller != admin β panic
Stellar
stealth-vault
caller != admin β panic
Stellar
wraith-names
caller != admin β panic
Stellar
wraith-asset-policy
admin.require_auth() (implicit)
Stellar
governance
admin.require_auth() for cancel during voting
EVM
(none)
N/A (no admin)
Solana
(none)
N/A (no admin)
CKB
(none)
N/A (no admin)
Note: Stellar contracts panic on unauthorized admin calls rather than returning errors, as the admin is expected to be a multisig where failed auth = invalid transaction.
Release Artifacts
This matrix is published alongside contract releases: