Skip to content

Repository files navigation

SOZIA Token (Fully Decentralized Multi-Sig)

SOZIA Token is a fully decentralized ERC20 token with linear vesting and multi-signature governance. Ownership can be safely renounced, and all critical actions (token claims, operator management, approval threshold updates) are controlled via a multi-sig proposal system.


Table of Contents


Features

  • ERC20 token with linear vesting for Team, Advisors, Community, and Company buckets.
  • Multi-sig governance for claims, operator management, and threshold updates.
  • Ownership can be renounced safely, making the contract fully decentralized.
  • Dashboard-ready helper functions for proposals, approvals, and claimable balances.

Deployment

Constructor Parameters:

  • companyWallet → Company treasury address
  • teamWallet → Team wallet address
  • advisoryWallet → Advisors wallet address
  • communityWallet → Community wallet address
  • _initialOperators → List of trusted operator addresses (3–5 recommended)
  • _initialThreshold → Minimum number of operator approvals required (e.g., 2 out of 3)

Example:

companyWallet   = 0xAAA...AAA
teamWallet      = 0xBBB...BBB
advisoryWallet  = 0xCCC...CCC
communityWallet = 0xDDD...DDD
_initialOperators = [0x111..., 0x222..., 0x333...]
_initialThreshold = 2

Proposing a Token Claim

Claim a Single Bucket:

uint256 proposalId = proposeClaim(TokenBucket.TEAM);

Claim All Buckets:

uint256 proposalId = proposeClaimAll();
  • Captures all claimable tokens at the time of proposal.
  • Skips buckets with 0 claimable tokens.

Approving a Proposal

Operators approve proposals:

approveProposal(proposalId);
  • Each operator can approve once per proposal.
  • Once approvals ≥ approvalThreshold, the proposal executes automatically.

Executing a Proposal

  • Normally executes automatically when threshold approvals are reached.
  • Manual execution (internal):
_executeProposal(proposalId);

Operator Management via Multi-Sig

Add an Operator:

uint256 proposalId = proposeAddOperator(newOperatorAddress);

Remove an Operator:

uint256 proposalId = proposeRemoveOperator(existingOperatorAddress);

Update Approval Threshold:

uint256 proposalId = proposeUpdateThreshold(newThreshold);
  • Threshold must be >0 and ≤ current number of operators.
  • Executes after reaching threshold approvals.

Monitoring & Dashboard

  • View Pending Proposals:
uint256[] memory pending = getPendingProposals();
  • Check Proposal Details:
(proposalType, buckets, amounts, wallets, targetOperator, newThreshold, approvals, executed) = getProposalSummary(proposalId);
  • Check Operator Approvals:
bool approved = isApprovedBy(proposalId, operatorAddress);
  • Get Operators and Threshold:
address[] memory ops = getOperators();
uint256 threshold = approvalThreshold;

Post-Deployment Best Practices

  1. Test on a testnet (Goerli, Mumbai) before mainnet deployment.
  2. Renounce ownership only after verifying operators and threshold.
  3. Ensure threshold is high enough to prevent deadlocks, but not too high to block approvals.
  4. Keep operator keys secure, ideally using multi-sig wallets.
  5. Use a frontend dashboard for transparency of proposals, approvals, and claimable balances.

Key Takeaway

After renouncing ownership, all actions are controlled by multi-sig proposals. There is no centralized owner, making SOZIA Token fully trustless and decentralized.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages