darkfi_money_contract/
lib.rs

1/* This file is part of DarkFi (https://dark.fi)
2 *
3 * Copyright (C) 2020-2026 Dyne.org foundation
4 *
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU Affero General Public License as
7 * published by the Free Software Foundation, either version 3 of the
8 * License, or (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 * GNU Affero General Public License for more details.
14 *
15 * You should have received a copy of the GNU Affero General Public License
16 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
17 */
18
19//! DarkFi Money Contract
20//!
21//! Smart contract implementing money transfers, atomic swaps, token
22//! minting and freezing, and staking/unstaking of consensus tokens.
23
24use darkfi_sdk::error::ContractError;
25
26/// Functions available in the contract
27#[repr(u8)]
28#[derive(Debug)]
29// ANCHOR: money-function
30pub enum MoneyFunction {
31    FeeV1 = 0x00,
32    GenesisMintV1 = 0x01,
33    PoWRewardV1 = 0x02,
34    TransferV1 = 0x03,
35    OtcSwapV1 = 0x04,
36    AuthTokenMintV1 = 0x05,
37    AuthTokenFreezeV1 = 0x06,
38    TokenMintV1 = 0x07,
39    BurnV1 = 0x08,
40}
41// ANCHOR_END: money-function
42
43impl TryFrom<u8> for MoneyFunction {
44    type Error = ContractError;
45
46    fn try_from(b: u8) -> core::result::Result<Self, Self::Error> {
47        match b {
48            0x00 => Ok(Self::FeeV1),
49            0x01 => Ok(Self::GenesisMintV1),
50            0x02 => Ok(Self::PoWRewardV1),
51            0x03 => Ok(Self::TransferV1),
52            0x04 => Ok(Self::OtcSwapV1),
53            0x05 => Ok(Self::AuthTokenMintV1),
54            0x06 => Ok(Self::AuthTokenFreezeV1),
55            0x07 => Ok(Self::TokenMintV1),
56            0x08 => Ok(Self::BurnV1),
57            _ => Err(ContractError::InvalidFunction),
58        }
59    }
60}
61
62/// Internal contract errors
63pub mod error;
64
65/// Call parameters definitions
66pub mod model;
67
68#[cfg(not(feature = "no-entrypoint"))]
69/// WASM entrypoint functions
70pub mod entrypoint;
71
72#[cfg(feature = "client")]
73/// Client API for interaction with this smart contract
74pub mod client;
75
76// These are the different sled trees that will be created
77pub const MONEY_CONTRACT_INFO_TREE: &str = "info";
78pub const MONEY_CONTRACT_COINS_TREE: &str = "coins";
79pub const MONEY_CONTRACT_COIN_ROOTS_TREE: &str = "coin_roots";
80pub const MONEY_CONTRACT_NULLIFIERS_TREE: &str = "nullifiers";
81pub const MONEY_CONTRACT_NULLIFIER_ROOTS_TREE: &str = "nullifier_roots";
82pub const MONEY_CONTRACT_TOKEN_FREEZE_TREE: &str = "token_freezes";
83pub const MONEY_CONTRACT_FEES_TREE: &str = "fees";
84
85// These are keys inside the info tree
86pub const MONEY_CONTRACT_DB_VERSION: &[u8] = b"db_version";
87pub const MONEY_CONTRACT_COIN_MERKLE_TREE: &[u8] = b"coins_tree";
88pub const MONEY_CONTRACT_LATEST_COIN_ROOT: &[u8] = b"last_coins_root";
89pub const MONEY_CONTRACT_LATEST_NULLIFIER_ROOT: &[u8] = b"last_nullifiers_root";
90
91/// Precalculated root hash for a tree containing only a single Fp::ZERO coin.
92/// Used to save gas.
93pub const EMPTY_COINS_TREE_ROOT: [u8; 32] = [
94    0xb8, 0xc1, 0x07, 0x5a, 0x80, 0xa8, 0x09, 0x65, 0xc2, 0x39, 0x8f, 0x71, 0x1f, 0xe7, 0x3e, 0x05,
95    0xb4, 0xed, 0xae, 0xde, 0xf1, 0x62, 0xf2, 0x61, 0xd4, 0xee, 0xd7, 0xcd, 0x72, 0x74, 0x8d, 0x17,
96];
97
98/// zkas fee circuit namespace
99pub const MONEY_CONTRACT_ZKAS_FEE_NS_V1: &str = "Fee_V1";
100/// zkas mint circuit namespace
101pub const MONEY_CONTRACT_ZKAS_MINT_NS_V1: &str = "Mint_V1";
102/// zkas burn circuit namespace
103pub const MONEY_CONTRACT_ZKAS_BURN_NS_V1: &str = "Burn_V1";
104/// zkas token auth mint circuit namespace
105pub const MONEY_CONTRACT_ZKAS_AUTH_TOKEN_MINT_NS_V1: &str = "AuthTokenMint_V1";
106/// zkas token mint circuit namespace
107pub const MONEY_CONTRACT_ZKAS_TOKEN_MINT_NS_V1: &str = "TokenMint_V1";