OMEGA Examples

Real-world examples and use cases for OMEGA blockchain development using MEGA language (.mega files)

Basic ERC20 Token

A complete implementation of an ERC20-compatible token:

// BasicToken.mega
blockchain BasicToken {
    state {
        mapping(address => uint256) balances;
        mapping(address => mapping(address => uint256)) allowances;
        
        uint256 total_supply;
        string name;
        string symbol;
        uint8 decimals;
        address owner;
    }
    
    constructor(
        string _name,
        string _symbol,
        uint8 _decimals,
        uint256 _initial_supply
    ) {
        name = _name;
        symbol = _symbol;
        decimals = _decimals;
        total_supply = _initial_supply * 10**_decimals;
        owner = msg.sender;
        balances[msg.sender] = total_supply;
        
        emit Transfer(address(0), msg.sender, total_supply);
    }
    
    function balance_of(address account) public view returns (uint256) {
        return balances[account];
    }
    
    function transfer(address to, uint256 amount) public returns (bool) {
        require(to != address(0), "Transfer to zero address");
        require(balances[msg.sender] >= amount, "Insufficient balance");
        
        balances[msg.sender] -= amount;
        balances[to] += amount;
        
        emit Transfer(msg.sender, to, amount);
        return true;
    }
    
    function approve(address spender, uint256 amount) public returns (bool) {
        allowances[msg.sender][spender] = amount;
        emit Approval(msg.sender, spender, amount);
        return true;
    }
    
    function transfer_from(address from, address to, uint256 amount) 
        public returns (bool) {
        require(to != address(0), "Transfer to zero address");
        require(balances[from] >= amount, "Insufficient balance");
        require(allowances[from][msg.sender] >= amount, "Insufficient allowance");
        
        balances[from] -= amount;
        balances[to] += amount;
        allowances[from][msg.sender] -= amount;
        
        emit Transfer(from, to, amount);
        return true;
    }
    
    function allowance(address owner, address spender) 
        public view returns (uint256) {
        return allowances[owner][spender];
    }
    
    // Events
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

DeFi Automated Market Maker (AMM)

A simple constant product AMM implementation:

// SimpleAMM.mega
blockchain SimpleAMM {
    state {
        address token_a;
        address token_b;
        
        uint256 reserve_a;
        uint256 reserve_b;
        
        mapping(address => uint256) liquidity_shares;
        uint256 total_liquidity;
        
        uint256 constant FEE_RATE = 3; // 0.3% fee
        uint256 constant FEE_DENOMINATOR = 1000;
    }
    
    constructor(address _token_a, address _token_b) {
        token_a = _token_a;
        token_b = _token_b;
    }
    
    function add_liquidity(uint256 amount_a, uint256 amount_b) 
        public returns (uint256 liquidity) {
        
        // Transfer tokens from user
        IERC20(token_a).transfer_from(msg.sender, address(this), amount_a);
        IERC20(token_b).transfer_from(msg.sender, address(this), amount_b);
        
        if (total_liquidity == 0) {
            liquidity = sqrt(amount_a * amount_b);
        } else {
            liquidity = min(
                (amount_a * total_liquidity) / reserve_a,
                (amount_b * total_liquidity) / reserve_b
            );
        }
        
        require(liquidity > 0, "Insufficient liquidity minted");
        
        liquidity_shares[msg.sender] += liquidity;
        total_liquidity += liquidity;
        
        reserve_a += amount_a;
        reserve_b += amount_b;
        
        emit LiquidityAdded(msg.sender, amount_a, amount_b, liquidity);
        return liquidity;
    }
    
    function remove_liquidity(uint256 liquidity) 
        public returns (uint256 amount_a, uint256 amount_b) {
        require(liquidity_shares[msg.sender] >= liquidity, "Insufficient liquidity");
        
        amount_a = (liquidity * reserve_a) / total_liquidity;
        amount_b = (liquidity * reserve_b) / total_liquidity;
        
        liquidity_shares[msg.sender] -= liquidity;
        total_liquidity -= liquidity;
        
        reserve_a -= amount_a;
        reserve_b -= amount_b;
        
        IERC20(token_a).transfer(msg.sender, amount_a);
        IERC20(token_b).transfer(msg.sender, amount_b);
        
        emit LiquidityRemoved(msg.sender, amount_a, amount_b, liquidity);
        return (amount_a, amount_b);
    }
    
    function swap_a_for_b(uint256 amount_a_in) public returns (uint256 amount_b_out) {
        require(amount_a_in > 0, "Invalid input amount");
        
        uint256 amount_a_with_fee = amount_a_in * (FEE_DENOMINATOR - FEE_RATE);
        amount_b_out = (amount_a_with_fee * reserve_b) / 
                       (reserve_a * FEE_DENOMINATOR + amount_a_with_fee);
        
        require(amount_b_out > 0, "Insufficient output amount");
        
        IERC20(token_a).transfer_from(msg.sender, address(this), amount_a_in);
        IERC20(token_b).transfer(msg.sender, amount_b_out);
        
        reserve_a += amount_a_in;
        reserve_b -= amount_b_out;
        
        emit Swap(msg.sender, amount_a_in, 0, 0, amount_b_out);
        return amount_b_out;
    }
    
    function get_reserves() public view returns (uint256, uint256) {
        return (reserve_a, reserve_b);
    }
    
    // Helper functions
    function sqrt(uint256 x) internal pure returns (uint256) {
        if (x == 0) return 0;
        uint256 z = (x + 1) / 2;
        uint256 y = x;
        while (z < y) {
            y = z;
            z = (x / z + z) / 2;
        }
        return y;
    }
    
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }
    
    // Events
    event LiquidityAdded(address indexed provider, uint256 amount_a, uint256 amount_b, uint256 liquidity);
    event LiquidityRemoved(address indexed provider, uint256 amount_a, uint256 amount_b, uint256 liquidity);
    event Swap(address indexed user, uint256 amount_a_in, uint256 amount_b_in, uint256 amount_a_out, uint256 amount_b_out);
}

NFT Collection

An ERC721-compatible NFT collection with minting and metadata:

// NFTCollection.mega
blockchain NFTCollection {
    state {
        mapping(uint256 => address) token_owners;
        mapping(address => uint256) owner_token_count;
        mapping(uint256 => address) token_approvals;
        mapping(address => mapping(address => bool)) operator_approvals;
        mapping(uint256 => string) token_uris;
        
        string collection_name;
        string collection_symbol;
        uint256 next_token_id;
        uint256 max_supply;
        uint256 mint_price;
        address owner;
        bool public_mint_enabled;
    }
    
    constructor(
        string _name,
        string _symbol,
        uint256 _max_supply,
        uint256 _mint_price
    ) {
        collection_name = _name;
        collection_symbol = _symbol;
        max_supply = _max_supply;
        mint_price = _mint_price;
        owner = msg.sender;
        next_token_id = 1;
    }
    
    modifier only_owner() {
        require(msg.sender == owner, "Only owner can call this");
        _;
    }
    
    function mint(address to, string memory token_uri) public payable returns (uint256) {
        require(next_token_id <= max_supply, "Max supply reached");
        require(to != address(0), "Cannot mint to zero address");
        
        if (msg.sender != owner) {
            require(public_mint_enabled, "Public minting not enabled");
            require(msg.value >= mint_price, "Insufficient payment");
        }
        
        uint256 token_id = next_token_id;
        next_token_id++;
        
        token_owners[token_id] = to;
        owner_token_count[to]++;
        token_uris[token_id] = token_uri;
        
        emit Transfer(address(0), to, token_id);
        return token_id;
    }
    
    function batch_mint(address[] recipients, string[] token_uris) 
        public only_owner returns (uint256[] token_ids) {
        require(recipients.length == token_uris.length, "Array length mismatch");
        require(next_token_id + recipients.length <= max_supply, "Would exceed max supply");
        
        token_ids = new uint256[](recipients.length);
        
        for (uint256 i = 0; i < recipients.length; i++) {
            token_ids[i] = mint(recipients[i], token_uris[i]);
        }
        
        return token_ids;
    }
    
    function owner_of(uint256 token_id) public view returns (address) {
        address token_owner = token_owners[token_id];
        require(token_owner != address(0), "Token does not exist");
        return token_owner;
    }
    
    function balance_of(address owner_addr) public view returns (uint256) {
        require(owner_addr != address(0), "Query for zero address");
        return owner_token_count[owner_addr];
    }
    
    function transfer_from(address from, address to, uint256 token_id) public {
        require(is_approved_or_owner(msg.sender, token_id), "Not approved or owner");
        require(from == token_owners[token_id], "From address is not owner");
        require(to != address(0), "Transfer to zero address");
        
        // Clear approval
        token_approvals[token_id] = address(0);
        
        // Update balances
        owner_token_count[from]--;
        owner_token_count[to]++;
        token_owners[token_id] = to;
        
        emit Transfer(from, to, token_id);
    }
    
    function approve(address approved, uint256 token_id) public {
        address token_owner = owner_of(token_id);
        require(approved != token_owner, "Approval to current owner");
        require(
            msg.sender == token_owner || operator_approvals[token_owner][msg.sender],
            "Not owner or approved for all"
        );
        
        token_approvals[token_id] = approved;
        emit Approval(token_owner, approved, token_id);
    }
    
    function set_approval_for_all(address operator, bool approved) public {
        require(operator != msg.sender, "Approve to caller");
        operator_approvals[msg.sender][operator] = approved;
        emit ApprovalForAll(msg.sender, operator, approved);
    }
    
    function token_uri(uint256 token_id) public view returns (string) {
        require(token_owners[token_id] != address(0), "Token does not exist");
        return token_uris[token_id];
    }
    
    function set_public_mint(bool enabled) public only_owner {
        public_mint_enabled = enabled;
    }
    
    function withdraw() public only_owner {
        payable(owner).transfer(address(this).balance);
    }
    
    function is_approved_or_owner(address spender, uint256 token_id) 
        internal view returns (bool) {
        address token_owner = owner_of(token_id);
        return (
            spender == token_owner ||
            token_approvals[token_id] == spender ||
            operator_approvals[token_owner][spender]
        );
    }
    
    // Events
    event Transfer(address indexed from, address indexed to, uint256 indexed token_id);
    event Approval(address indexed owner, address indexed approved, uint256 indexed token_id);
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
}

Cross-Chain Bridge

A bridge contract for transferring tokens between different blockchains:

// CrossChainBridge.mega
blockchain CrossChainBridge {
    state {
        mapping(bytes32 => bool) processed_transactions;
        mapping(address => uint256) locked_balances;
        mapping(string => bool) supported_chains;
        
        address bridge_token;
        address owner;
        uint256 bridge_fee;
        uint256 min_bridge_amount;
        
        // Validator system
        mapping(address => bool) validators;
        uint256 validator_count;
        uint256 required_signatures;
    }
    
    constructor(
        address _bridge_token,
        uint256 _bridge_fee,
        uint256 _min_bridge_amount,
        uint256 _required_signatures
    ) {
        bridge_token = _bridge_token;
        bridge_fee = _bridge_fee;
        min_bridge_amount = _min_bridge_amount;
        required_signatures = _required_signatures;
        owner = msg.sender;
        
        // Add initial supported chains
        supported_chains["ethereum"] = true;
        supported_chains["polygon"] = true;
        supported_chains["solana"] = true;
    }
    
    modifier only_owner() {
        require(msg.sender == owner, "Only owner can call this");
        _;
    }
    
    modifier only_validator() {
        require(validators[msg.sender], "Only validator can call this");
        _;
    }
    
    @cross_chain(target = "solana")
    function bridge_to_solana(bytes32 solana_recipient, uint256 amount) public payable {
        require(amount >= min_bridge_amount, "Amount below minimum");
        require(msg.value >= bridge_fee, "Insufficient bridge fee");
        require(supported_chains["solana"], "Solana not supported");
        
        // Lock tokens on source chain
        IERC20(bridge_token).transfer_from(msg.sender, address(this), amount);
        locked_balances[msg.sender] += amount;
        
        // Generate unique transaction ID
        bytes32 tx_id = keccak256(abi.encodePacked(
            msg.sender,
            solana_recipient,
            amount,
            block.timestamp,
            block.number
        ));
        
        emit CrossChainTransfer(
            tx_id,
            msg.sender,
            solana_recipient,
            amount,
            "ethereum",
            "solana"
        );
    }
    
    @cross_chain(target = "polygon")
    function bridge_to_polygon(address polygon_recipient, uint256 amount) public payable {
        require(amount >= min_bridge_amount, "Amount below minimum");
        require(msg.value >= bridge_fee, "Insufficient bridge fee");
        require(supported_chains["polygon"], "Polygon not supported");
        
        IERC20(bridge_token).transfer_from(msg.sender, address(this), amount);
        locked_balances[msg.sender] += amount;
        
        bytes32 tx_id = keccak256(abi.encodePacked(
            msg.sender,
            polygon_recipient,
            amount,
            block.timestamp,
            block.number
        ));
        
        emit CrossChainTransfer(
            tx_id,
            msg.sender,
            polygon_recipient,
            amount,
            "ethereum",
            "polygon"
        );
    }
    
    function complete_bridge_transfer(
        bytes32 tx_id,
        address recipient,
        uint256 amount,
        string source_chain,
        bytes[] signatures
    ) public only_validator {
        require(!processed_transactions[tx_id], "Transaction already processed");
        require(signatures.length >= required_signatures, "Insufficient signatures");
        require(supported_chains[source_chain], "Source chain not supported");
        
        // Verify signatures (simplified)
        require(verify_signatures(tx_id, recipient, amount, source_chain, signatures), 
                "Invalid signatures");
        
        processed_transactions[tx_id] = true;
        
        // Mint or unlock tokens
        IERC20(bridge_token).transfer(recipient, amount);
        
        emit BridgeTransferCompleted(tx_id, recipient, amount, source_chain);
    }
    
    function add_validator(address validator) public only_owner {
        require(!validators[validator], "Already a validator");
        validators[validator] = true;
        validator_count++;
    }
    
    function remove_validator(address validator) public only_owner {
        require(validators[validator], "Not a validator");
        validators[validator] = false;
        validator_count--;
        require(validator_count >= required_signatures, "Too few validators");
    }
    
    function set_supported_chain(string chain, bool supported) public only_owner {
        supported_chains[chain] = supported;
    }
    
    function set_bridge_parameters(
        uint256 _bridge_fee,
        uint256 _min_bridge_amount,
        uint256 _required_signatures
    ) public only_owner {
        bridge_fee = _bridge_fee;
        min_bridge_amount = _min_bridge_amount;
        require(_required_signatures <= validator_count, "Too many required signatures");
        required_signatures = _required_signatures;
    }
    
    function verify_signatures(
        bytes32 tx_id,
        address recipient,
        uint256 amount,
        string source_chain,
        bytes[] signatures
    ) internal view returns (bool) {
        // Simplified signature verification
        // In production, implement proper ECDSA signature verification
        bytes32 message_hash = keccak256(abi.encodePacked(
            tx_id, recipient, amount, source_chain
        ));
        
        uint256 valid_signatures = 0;
        for (uint256 i = 0; i < signatures.length; i++) {
            address signer = recover_signer(message_hash, signatures[i]);
            if (validators[signer]) {
                valid_signatures++;
            }
        }
        
        return valid_signatures >= required_signatures;
    }
    
    function recover_signer(bytes32 hash, bytes signature) 
        internal pure returns (address) {
        // Implement ECDSA recovery
        // This is a placeholder
        return address(0);
    }
    
    function withdraw_fees() public only_owner {
        payable(owner).transfer(address(this).balance);
    }
    
    // Events
    event CrossChainTransfer(
        bytes32 indexed tx_id,
        address indexed sender,
        bytes32 indexed recipient,
        uint256 amount,
        string source_chain,
        string target_chain
    );
    
    event BridgeTransferCompleted(
        bytes32 indexed tx_id,
        address indexed recipient,
        uint256 amount,
        string source_chain
    );
}

DAO Governance

A decentralized autonomous organization with proposal and voting system:

// DAOGovernance.mega
blockchain DAOGovernance {
    state {
        struct Proposal {
            uint256 id;
            address proposer;
            string title;
            string description;
            uint256 start_time;
            uint256 end_time;
            uint256 votes_for;
            uint256 votes_against;
            uint256 votes_abstain;
            bool executed;
            bool cancelled;
            bytes execution_data;
            address target_contract;
        }
        
        mapping(uint256 => Proposal) proposals;
        mapping(uint256 => mapping(address => bool)) has_voted;
        mapping(uint256 => mapping(address => uint256)) vote_power;
        
        address governance_token;
        uint256 next_proposal_id;
        uint256 proposal_threshold; // Minimum tokens to create proposal
        uint256 voting_period; // Duration of voting in seconds
        uint256 execution_delay; // Delay before execution
        uint256 quorum_threshold; // Minimum participation for valid vote
        
        address[] council_members;
        mapping(address => bool) is_council_member;
    }
    
    constructor(
        address _governance_token,
        uint256 _proposal_threshold,
        uint256 _voting_period,
        uint256 _execution_delay,
        uint256 _quorum_threshold
    ) {
        governance_token = _governance_token;
        proposal_threshold = _proposal_threshold;
        voting_period = _voting_period;
        execution_delay = _execution_delay;
        quorum_threshold = _quorum_threshold;
        next_proposal_id = 1;
    }
    
    function create_proposal(
        string title,
        string description,
        address target_contract,
        bytes execution_data
    ) public returns (uint256) {
        uint256 proposer_balance = IERC20(governance_token).balance_of(msg.sender);
        require(proposer_balance >= proposal_threshold, "Insufficient tokens to propose");
        
        uint256 proposal_id = next_proposal_id++;
        
        proposals[proposal_id] = Proposal({
            id: proposal_id,
            proposer: msg.sender,
            title: title,
            description: description,
            start_time: block.timestamp,
            end_time: block.timestamp + voting_period,
            votes_for: 0,
            votes_against: 0,
            votes_abstain: 0,
            executed: false,
            cancelled: false,
            execution_data: execution_data,
            target_contract: target_contract
        });
        
        emit ProposalCreated(
            proposal_id,
            msg.sender,
            title,
            description,
            block.timestamp,
            block.timestamp + voting_period
        );
        
        return proposal_id;
    }
    
    function vote(uint256 proposal_id, uint8 vote_type) public {
        // vote_type: 0 = against, 1 = for, 2 = abstain
        require(vote_type <= 2, "Invalid vote type");
        require(!has_voted[proposal_id][msg.sender], "Already voted");
        
        Proposal storage proposal = proposals[proposal_id];
        require(proposal.id != 0, "Proposal does not exist");
        require(block.timestamp >= proposal.start_time, "Voting not started");
        require(block.timestamp <= proposal.end_time, "Voting ended");
        require(!proposal.cancelled, "Proposal cancelled");
        
        uint256 voter_power = IERC20(governance_token).balance_of(msg.sender);
        require(voter_power > 0, "No voting power");
        
        has_voted[proposal_id][msg.sender] = true;
        vote_power[proposal_id][msg.sender] = voter_power;
        
        if (vote_type == 0) {
            proposal.votes_against += voter_power;
        } else if (vote_type == 1) {
            proposal.votes_for += voter_power;
        } else {
            proposal.votes_abstain += voter_power;
        }
        
        emit VoteCast(proposal_id, msg.sender, vote_type, voter_power);
    }
    
    function execute_proposal(uint256 proposal_id) public {
        Proposal storage proposal = proposals[proposal_id];
        require(proposal.id != 0, "Proposal does not exist");
        require(block.timestamp > proposal.end_time + execution_delay, "Execution delay not met");
        require(!proposal.executed, "Already executed");
        require(!proposal.cancelled, "Proposal cancelled");
        
        uint256 total_votes = proposal.votes_for + proposal.votes_against + proposal.votes_abstain;
        require(total_votes >= quorum_threshold, "Quorum not met");
        require(proposal.votes_for > proposal.votes_against, "Proposal rejected");
        
        proposal.executed = true;
        
        // Execute the proposal
        if (proposal.target_contract != address(0) && proposal.execution_data.length > 0) {
            (bool success, ) = proposal.target_contract.call(proposal.execution_data);
            require(success, "Execution failed");
        }
        
        emit ProposalExecuted(proposal_id, msg.sender);
    }
    
    function cancel_proposal(uint256 proposal_id) public {
        Proposal storage proposal = proposals[proposal_id];
        require(proposal.id != 0, "Proposal does not exist");
        require(!proposal.executed, "Already executed");
        require(!proposal.cancelled, "Already cancelled");
        
        // Only proposer or council can cancel
        require(
            msg.sender == proposal.proposer || is_council_member[msg.sender],
            "Not authorized to cancel"
        );
        
        proposal.cancelled = true;
        emit ProposalCancelled(proposal_id, msg.sender);
    }
    
    function add_council_member(address member) public {
        require(is_council_member[msg.sender] || council_members.length == 0, 
                "Only council can add members");
        require(!is_council_member[member], "Already a council member");
        
        council_members.push(member);
        is_council_member[member] = true;
        
        emit CouncilMemberAdded(member);
    }
    
    function remove_council_member(address member) public {
        require(is_council_member[msg.sender], "Only council can remove members");
        require(is_council_member[member], "Not a council member");
        
        is_council_member[member] = false;
        
        // Remove from array
        for (uint256 i = 0; i < council_members.length; i++) {
            if (council_members[i] == member) {
                council_members[i] = council_members[council_members.length - 1];
                council_members.pop();
                break;
            }
        }
        
        emit CouncilMemberRemoved(member);
    }
    
    function get_proposal(uint256 proposal_id) public view returns (Proposal memory) {
        return proposals[proposal_id];
    }
    
    function get_proposal_status(uint256 proposal_id) public view returns (string memory) {
        Proposal memory proposal = proposals[proposal_id];
        
        if (proposal.cancelled) return "Cancelled";
        if (proposal.executed) return "Executed";
        if (block.timestamp < proposal.start_time) return "Pending";
        if (block.timestamp <= proposal.end_time) return "Active";
        
        uint256 total_votes = proposal.votes_for + proposal.votes_against + proposal.votes_abstain;
        if (total_votes < quorum_threshold) return "Failed (No Quorum)";
        if (proposal.votes_for <= proposal.votes_against) return "Rejected";
        if (block.timestamp <= proposal.end_time + execution_delay) return "Queued";
        
        return "Ready for Execution";
    }
    
    // Events
    event ProposalCreated(
        uint256 indexed proposal_id,
        address indexed proposer,
        string title,
        string description,
        uint256 start_time,
        uint256 end_time
    );
    
    event VoteCast(
        uint256 indexed proposal_id,
        address indexed voter,
        uint8 vote_type,
        uint256 voting_power
    );
    
    event ProposalExecuted(uint256 indexed proposal_id, address indexed executor);
    event ProposalCancelled(uint256 indexed proposal_id, address indexed canceller);
    event CouncilMemberAdded(address indexed member);
    event CouncilMemberRemoved(address indexed member);
}

More Examples

Explore additional examples in our GitHub repository: