From f191149b4ff20ba8ca9ef9efa0b1a1772b8893b1 Mon Sep 17 00:00:00 2001 From: Keyvan Kambakhsh Date: Sun, 10 Sep 2023 01:53:54 +0330 Subject: [PATCH] Unify ContractIds with TokenIds + Allow contracts control minting of tokens --- src/blockchain/config.rs | 4 +- src/blockchain/error.rs | 2 - src/blockchain/mempool.rs | 14 +- src/blockchain/mod.rs | 20 +- .../ops/apply_tx/create_contract.rs | 26 +- src/blockchain/ops/apply_tx/create_token.rs | 192 ------------- src/blockchain/ops/apply_tx/delegate.rs | 6 +- src/blockchain/ops/apply_tx/mod.rs | 26 +- .../ops/apply_tx/update_contract/deposit.rs | 14 +- .../ops/apply_tx/update_contract/mint.rs | 23 +- .../ops/apply_tx/update_contract/mod.rs | 8 +- .../ops/apply_tx/update_contract/withdraw.rs | 12 +- src/blockchain/ops/apply_tx/update_token.rs | 264 ------------------ .../ops/pay_validator_and_delegators.rs | 6 +- src/blockchain/ops/select_transactions.rs | 2 +- src/blockchain/test/mod.rs | 60 ++-- src/blockchain/test/rewards.rs | 20 +- src/cli/chain/health_check.rs | 6 +- src/cli/mod.rs | 6 +- src/cli/wallet/add_token.rs | 4 +- src/cli/wallet/auto_delegate.rs | 4 +- src/cli/wallet/delegate.rs | 4 +- src/cli/wallet/info.rs | 10 +- src/cli/wallet/new_token.rs | 4 +- src/cli/wallet/register_validator.rs | 4 +- src/cli/wallet/send.rs | 14 +- src/cli/wallet/undelegate.rs | 4 +- src/client/error.rs | 2 +- src/client/explorer.rs | 38 +-- src/client/mod.rs | 6 +- src/config/blockchain.rs | 36 ++- src/core/mod.rs | 10 +- src/core/transaction.rs | 113 ++------ src/db/keys.rs | 8 +- src/mpn/circuits/test.rs | 4 +- src/mpn/circuits/update_circuit.rs | 14 +- src/mpn/mod.rs | 17 +- src/mpn/update.rs | 4 +- src/mpn/withdraw.rs | 6 +- src/node/api/get_balance.rs | 8 +- src/node/api/get_explorer_blocks.rs | 2 +- src/node/heartbeat/log_info.rs | 4 +- src/wallet/mod.rs | 10 +- src/wallet/tx_builder.rs | 34 ++- src/zk/mod.rs | 14 +- src/zk/state/mod.rs | 2 +- src/zk/test/mod.rs | 6 +- 47 files changed, 283 insertions(+), 814 deletions(-) delete mode 100644 src/blockchain/ops/apply_tx/create_token.rs delete mode 100644 src/blockchain/ops/apply_tx/update_token.rs diff --git a/src/blockchain/config.rs b/src/blockchain/config.rs index b5149438..9b8beaa0 100644 --- a/src/blockchain/config.rs +++ b/src/blockchain/config.rs @@ -1,4 +1,4 @@ -use crate::core::{Address, Block, Ratio, TokenId}; +use crate::core::{Address, Block, ContractId, Ratio}; use crate::mpn::MpnConfig; use std::collections::HashSet; @@ -8,7 +8,7 @@ pub struct BlockchainConfig { pub genesis: Block, pub reward_ratio: u64, pub max_block_size: usize, - pub ziesha_token_id: TokenId, + pub ziesha_token_id: ContractId, pub mpn_config: MpnConfig, pub testnet_height_limit: Option, pub max_memo_length: usize, diff --git a/src/blockchain/error.rs b/src/blockchain/error.rs index 2554e25d..d68c8cd9 100644 --- a/src/blockchain/error.rs +++ b/src/blockchain/error.rs @@ -79,8 +79,6 @@ pub enum BlockchainError { TokenNotFound, #[error("token not updatable")] TokenNotUpdatable, - #[error("token is being updated by a wrong account")] - TokenUpdatePermissionDenied, #[error("token supply not enough to be redeemed")] TokenSupplyInsufficient, #[error("token supply overflows when issued")] diff --git a/src/blockchain/mempool.rs b/src/blockchain/mempool.rs index 3b1b1465..58ac0c19 100644 --- a/src/blockchain/mempool.rs +++ b/src/blockchain/mempool.rs @@ -1,7 +1,7 @@ use super::{Blockchain, BlockchainError, TransactionMetadata, TransactionStats}; use crate::core::{ - Address, Amount, GeneralAddress, GeneralTransaction, MpnDeposit, MpnWithdraw, NonceGroup, - TokenId, TransactionAndDelta, TransactionKind, + Address, Amount, ContractId, GeneralAddress, GeneralTransaction, MpnDeposit, MpnWithdraw, + NonceGroup, TransactionAndDelta, TransactionKind, }; use crate::db::KvStore; use crate::zk::MpnTransaction; @@ -151,7 +151,7 @@ impl Mempool { for (ng, mempool) in self.txs.iter() { if let Some((tx, _)) = mempool.first_tx() { let fee = tx.fee(); - if fee.token_id == TokenId::Ziesha { + if fee.token_id == ContractId::Ziesha { firsts.entry(ng.kind()).or_default().push(fee.amount); } } @@ -226,7 +226,7 @@ impl Mempool { return Ok(()); } - if tx.fee().token_id != TokenId::Ziesha { + if tx.fee().token_id != ContractId::Ziesha { return Ok(()); } @@ -297,13 +297,15 @@ impl Mempool { } let ziesha_balance = match tx.sender() { - GeneralAddress::ChainAddress(addr) => blockchain.get_balance(addr, TokenId::Ziesha)?, + GeneralAddress::ChainAddress(addr) => { + blockchain.get_balance(addr, ContractId::Ziesha)? + } GeneralAddress::MpnAddress(mpn_addr) => { let acc = blockchain.get_mpn_account(mpn_addr)?; acc.tokens .get(&0) .map(|m| { - if m.token_id == TokenId::Ziesha { + if m.token_id == ContractId::Ziesha { m.amount } else { 0.into() diff --git a/src/blockchain/mod.rs b/src/blockchain/mod.rs index e5b5fdca..762fea41 100644 --- a/src/blockchain/mod.rs +++ b/src/blockchain/mod.rs @@ -9,9 +9,9 @@ mod ops; use crate::core::{ hash::Hash, Address, Amount, Block, ContractAccount, ContractDeposit, ContractId, ContractUpdate, ContractUpdateData, ContractWithdraw, Delegate, Hasher, Header, Money, - MpnAddress, ProofOfStake, Ratio, RegularSendEntry, Signature, Staker, Token, TokenId, - TokenUpdate, Transaction, TransactionAndDelta, TransactionData, Undelegation, UndelegationId, - ValidatorProof, Vrf, ZkHasher as CoreZkHasher, + MpnAddress, ProofOfStake, Ratio, RegularSendEntry, Signature, Staker, Token, Transaction, + TransactionAndDelta, TransactionData, Undelegation, UndelegationId, ValidatorProof, Vrf, + ZkHasher as CoreZkHasher, }; use crate::crypto::VerifiableRandomFunction; use crate::db::{keys, KvStore, RamMirrorKvStore, WriteOp}; @@ -108,13 +108,13 @@ pub trait Blockchain { fn db_checksum(&self) -> Result; - fn get_token(&self, token_id: TokenId) -> Result, BlockchainError>; + fn get_token(&self, token_id: ContractId) -> Result, BlockchainError>; - fn get_balance(&self, addr: Address, token_id: TokenId) -> Result; + fn get_balance(&self, addr: Address, token_id: ContractId) -> Result; fn get_contract_balance( &self, contract_id: ContractId, - token_id: TokenId, + token_id: ContractId, ) -> Result; fn get_delegate( &self, @@ -307,7 +307,7 @@ impl Blockchain for KvStoreChain { fn get_contract_balance( &self, contract_id: ContractId, - token_id: TokenId, + token_id: ContractId, ) -> Result { Ok( match self @@ -320,14 +320,14 @@ impl Blockchain for KvStoreChain { ) } - fn get_token(&self, token_id: TokenId) -> Result, BlockchainError> { + fn get_token(&self, token_id: ContractId) -> Result, BlockchainError> { Ok(match self.database.get(keys::token(&token_id))? { Some(b) => Some(b.try_into()?), None => None, }) } - fn get_balance(&self, addr: Address, token_id: TokenId) -> Result { + fn get_balance(&self, addr: Address, token_id: ContractId) -> Result { Ok( match self.database.get(keys::account_balance(&addr, token_id))? { Some(b) => b.try_into()?, @@ -500,7 +500,7 @@ impl Blockchain for KvStoreChain { Ok(blks) } fn next_reward(&self) -> Result { - let supply = self.get_balance(Default::default(), TokenId::Ziesha)?; + let supply = self.get_balance(Default::default(), ContractId::Ziesha)?; Ok(supply / self.config.reward_ratio) } fn draft_block( diff --git a/src/blockchain/ops/apply_tx/create_contract.rs b/src/blockchain/ops/apply_tx/create_contract.rs index e11c4e07..525ab9b6 100644 --- a/src/blockchain/ops/apply_tx/create_contract.rs +++ b/src/blockchain/ops/apply_tx/create_contract.rs @@ -4,7 +4,6 @@ pub fn create_contract( chain: &mut KvStoreChain, tx_src: Address, contract_id: ContractId, - token_id: TokenId, contract: &zk::ZkContract, state: &Option, money: Money, @@ -17,12 +16,13 @@ pub fn create_contract( return Err(BlockchainError::TokenBadNameSymbol); } chain.database.update(&[WriteOp::Put( - keys::account_balance(&tx_src, token_id), + keys::account_balance(&tx_src, contract_id), token.token.supply.into(), )])?; - chain - .database - .update(&[WriteOp::Put(keys::token(&token_id), (&token.token).into())])?; + chain.database.update(&[WriteOp::Put( + keys::token(&contract_id), + (&token.token).into(), + )])?; } chain.database.update(&[WriteOp::Put( keys::contract(&contract_id), @@ -87,12 +87,9 @@ mod tests { ) .unwrap(); let contract_id: ContractId = - "0001020304050607080900010203040506070809000102030405060708090001" + "0x0001020304050607080900010203040506070809000102030405060708090001" .parse() .unwrap(); - let token_id: TokenId = "0001020304050607080900010203040506070809000102030405060708090001" - .parse() - .unwrap(); let state_model = zk::ZkStateModel::Struct { field_types: vec![zk::ZkStateModel::Scalar, zk::ZkStateModel::Scalar], }; @@ -112,7 +109,6 @@ mod tests { chain, abc.get_address(), contract_id, - token_id, &contract, &Some(Default::default()), Money::ziesha(2345), @@ -127,12 +123,12 @@ mod tests { 7655u64.into(), ), WriteOp::Put( - "CAB-0001020304050607080900010203040506070809000102030405060708090001-Ziesha" + "CAB-0x0001020304050607080900010203040506070809000102030405060708090001-Ziesha" .into(), 2345u64.into(), ), WriteOp::Put( - "CAC-0001020304050607080900010203040506070809000102030405060708090001".into(), + "CAC-0x0001020304050607080900010203040506070809000102030405060708090001".into(), ContractAccount { height: 1, compressed_state: initial_state.clone(), @@ -140,15 +136,15 @@ mod tests { .into(), ), WriteOp::Put( - "CON-0001020304050607080900010203040506070809000102030405060708090001".into(), + "CON-0x0001020304050607080900010203040506070809000102030405060708090001".into(), contract.into(), ), WriteOp::Put( - "S-0001020304050607080900010203040506070809000102030405060708090001-HGT".into(), + "S-0x0001020304050607080900010203040506070809000102030405060708090001-HGT".into(), 1u64.into(), ), WriteOp::Put( - "S-0001020304050607080900010203040506070809000102030405060708090001-RT".into(), + "S-0x0001020304050607080900010203040506070809000102030405060708090001-RT".into(), initial_state.into(), ), ]; diff --git a/src/blockchain/ops/apply_tx/create_token.rs b/src/blockchain/ops/apply_tx/create_token.rs deleted file mode 100644 index 0ac16243..00000000 --- a/src/blockchain/ops/apply_tx/create_token.rs +++ /dev/null @@ -1,192 +0,0 @@ -use super::*; - -pub fn create_token( - chain: &mut KvStoreChain, - tx_src: Address, - token_id: TokenId, - token: &Token, -) -> Result<(), BlockchainError> { - if chain.get_token(token_id)?.is_some() { - return Err(BlockchainError::TokenAlreadyExists); - } else { - if !token.validate() { - return Err(BlockchainError::TokenBadNameSymbol); - } - chain.database.update(&[WriteOp::Put( - keys::account_balance(&tx_src, token_id), - token.supply.into(), - )])?; - chain - .database - .update(&[WriteOp::Put(keys::token(&token_id), token.into())])?; - } - Ok(()) -} - -#[cfg(test)] -mod tests { - use super::*; - use crate::db::{RamKvStore, WriteOp}; - - #[test] - fn test_create_token() { - let chain = KvStoreChain::new( - RamKvStore::new(), - crate::config::blockchain::get_test_blockchain_config(), - ) - .unwrap(); - let token_id: TokenId = - "0x0001020304050607080900010203040506070809000102030405060708090001" - .parse() - .unwrap(); - let addr: Address = "edae9736792cbdbab2c72068eb41c6ef2e6cab372ca123f834bd7eb59fcecad640" - .parse() - .unwrap(); - let tkn = Token { - name: "KeyvanCoin".into(), - symbol: "KIWI".into(), - supply: Amount(12345), - decimals: 2, - minter: None, - }; - let (ops, _) = chain - .isolated(|chain| Ok(create_token(chain, addr, token_id, &tkn)?)) - .unwrap(); - - let expected_ops = vec![ - WriteOp::Put( - "ACB-edae9736792cbdbab2c72068eb41c6ef2e6cab372ca123f834bd7eb59fcecad640-0x0001020304050607080900010203040506070809000102030405060708090001".into(), - Amount(12345).into(), - ), - WriteOp::Put( - "TKN-0x0001020304050607080900010203040506070809000102030405060708090001".into(), - (&tkn).into(), - ), - ]; - - assert_eq!(ops, expected_ops); - } - - #[test] - fn test_already_exists() { - let chain = KvStoreChain::new( - RamKvStore::new(), - crate::config::blockchain::get_test_blockchain_config(), - ) - .unwrap(); - let token_id: TokenId = - "0x0001020304050607080900010203040506070809000102030405060708090001" - .parse() - .unwrap(); - let addr_1: Address = "edae9736792cbdbab2c72068eb41c6ef2e6cab372ca123f834bd7eb59fcecad640" - .parse() - .unwrap(); - let addr_2: Address = "ed9e9736792cbdbab2c72068eb41c6ef2e6cab372ca123f834bd7eb59fcecad641" - .parse() - .unwrap(); - let tkn = Token { - name: "KeyvanCoin".into(), - symbol: "KIWI".into(), - supply: Amount(12345), - decimals: 2, - minter: None, - }; - assert!(matches!( - chain.isolated(|chain| { - create_token(chain, addr_1, token_id, &tkn)?; - create_token(chain, addr_2, token_id, &tkn)?; - Ok(()) - }), - Err(BlockchainError::TokenAlreadyExists) - )); - } - - #[test] - fn test_bad_name_symbol() { - let chain = KvStoreChain::new( - RamKvStore::new(), - crate::config::blockchain::get_test_blockchain_config(), - ) - .unwrap(); - let token_id: TokenId = - "0x0001020304050607080900010203040506070809000102030405060708090001" - .parse() - .unwrap(); - let addr: Address = "edae9736792cbdbab2c72068eb41c6ef2e6cab372ca123f834bd7eb59fcecad640" - .parse() - .unwrap(); - let good_token = Token { - name: "Keyvan Coin".into(), - symbol: "KIWI1".into(), - supply: Amount(12345), - decimals: 2, - minter: None, - }; - let bad_tokens = vec![ - Token { - name: " KeyvanCoin".into(), - symbol: "KIWI1".into(), - supply: Amount(12345), - decimals: 2, - minter: None, - }, - Token { - name: "KeyvanCoin".into(), - symbol: "KIW I".into(), - supply: Amount(12345), - decimals: 2, - minter: None, - }, - Token { - name: "کیوان".into(), - symbol: "KIWI".into(), - supply: Amount(12345), - decimals: 2, - minter: None, - }, - Token { - name: "KeyvanCoin".into(), - symbol: "KIWi".into(), - supply: Amount(12345), - decimals: 2, - minter: None, - }, - Token { - name: "KeyvanCoin".into(), - symbol: "1KIWI".into(), - supply: Amount(12345), - decimals: 2, - minter: None, - }, - Token { - name: "KeyvanCoinAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA".into(), - symbol: "KIWI".into(), - supply: Amount(12345), - decimals: 2, - minter: None, - }, - Token { - name: "KeyvanCoin".into(), - symbol: "KIWIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII".into(), - supply: Amount(12345), - decimals: 2, - minter: None, - }, - ]; - assert!(chain - .isolated(|chain| { - create_token(chain, addr.clone(), token_id, &good_token)?; - Ok(()) - }) - .is_ok()); - for bad_token in bad_tokens { - assert!(matches!( - chain.isolated(|chain| { - create_token(chain, addr.clone(), token_id, &bad_token)?; - Ok(()) - }), - Err(BlockchainError::TokenBadNameSymbol) - )); - } - } -} diff --git a/src/blockchain/ops/apply_tx/delegate.rs b/src/blockchain/ops/apply_tx/delegate.rs index a2ef3c24..d95710bc 100644 --- a/src/blockchain/ops/apply_tx/delegate.rs +++ b/src/blockchain/ops/apply_tx/delegate.rs @@ -6,13 +6,13 @@ pub fn delegate( amount: Amount, to: Address, ) -> Result<(), BlockchainError> { - let mut src_bal = chain.get_balance(tx_src.clone(), TokenId::Ziesha)?; + let mut src_bal = chain.get_balance(tx_src.clone(), ContractId::Ziesha)?; if src_bal < amount { return Err(BlockchainError::BalanceInsufficient); } src_bal -= amount; chain.database.update(&[WriteOp::Put( - keys::account_balance(&tx_src, TokenId::Ziesha), + keys::account_balance(&tx_src, ContractId::Ziesha), src_bal.into(), )])?; @@ -210,7 +210,7 @@ mod tests { &[RegularSendEntry { dst: src.clone(), amount: Money { - token_id: TokenId::Ziesha, + token_id: ContractId::Ziesha, amount: Amount(100), }, }], diff --git a/src/blockchain/ops/apply_tx/mod.rs b/src/blockchain/ops/apply_tx/mod.rs index 64e5ad0c..0cedd97d 100644 --- a/src/blockchain/ops/apply_tx/mod.rs +++ b/src/blockchain/ops/apply_tx/mod.rs @@ -1,12 +1,10 @@ mod auto_delegate; mod create_contract; -mod create_token; mod delegate; mod regular_send; mod undelegate; mod update_contract; mod update_staker; -mod update_token; use super::*; @@ -67,7 +65,7 @@ pub fn apply_tx( return Err(BlockchainError::IllegalTreasuryAccess); } - if tx.fee.token_id != TokenId::Ziesha { + if tx.fee.token_id != ContractId::Ziesha { return Err(BlockchainError::OnlyZieshaFeesAccepted); } @@ -118,20 +116,6 @@ pub fn apply_tx( let undelegation_id = UndelegationId::new(tx); undelegate::undelegate(chain, undelegation_id, tx_src, *amount, from.clone())?; } - TransactionData::CreateToken { token } => { - let token_id = { - let tid = TokenId::new(tx); - if tid == chain.config.ziesha_token_id { - TokenId::Ziesha - } else { - tid - } - }; - create_token::create_token(chain, tx_src, token_id, token)?; - } - TransactionData::UpdateToken { token_id, update } => { - update_token::update_token(chain, tx_src, token_id, update)?; - } TransactionData::RegularSend { entries } => { regular_send::regular_send(chain, tx_src, entries)?; } @@ -140,11 +124,10 @@ pub fn apply_tx( state, money, } => { - let contract_id = ContractId::new(tx); - let token_id = { - let tid = TokenId::new(tx); + let contract_id = { + let tid = ContractId::new(tx); if tid == chain.config.ziesha_token_id { - TokenId::Ziesha + ContractId::Ziesha } else { tid } @@ -153,7 +136,6 @@ pub fn apply_tx( chain, tx_src, contract_id, - token_id, contract, state, *money, diff --git a/src/blockchain/ops/apply_tx/update_contract/deposit.rs b/src/blockchain/ops/apply_tx/update_contract/deposit.rs index 855be158..3caa849f 100644 --- a/src/blockchain/ops/apply_tx/update_contract/deposit.rs +++ b/src/blockchain/ops/apply_tx/update_contract/deposit.rs @@ -169,12 +169,12 @@ mod tests { Amount(9800).into(), ), WriteOp::Put( - "CAB-9e438ff7c98bb11eeab8d5220268904df386cdae241f4207cda54b8f87bc0f87-Ziesha" + "CAB-0x069c7585c9cd138dd714b36716efdff2257e536b3360da2aad96c35c9c46bd5e-Ziesha" .into(), Amount(123).into(), ), WriteOp::Put( - "DNC-ed8c19c6a4cf1460e961f7bae8eea54d437b9edac27cbeb09be32ae367adf9098a-9e438ff7c98bb11eeab8d5220268904df386cdae241f4207cda54b8f87bc0f87".into(), + "DNC-ed8c19c6a4cf1460e961f7bae8eea54d437b9edac27cbeb09be32ae367adf9098a-0x069c7585c9cd138dd714b36716efdff2257e536b3360da2aad96c35c9c46bd5e".into(), 1u32.into(), ), ]; @@ -183,7 +183,7 @@ mod tests { assert_eq!( exec_fees, vec![Money { - token_id: TokenId::Ziesha, + token_id: ContractId::Ziesha, amount: Amount(77) }] ); @@ -269,7 +269,7 @@ mod tests { let expected_ops = vec![ WriteOp::Put( - "ACB-ed8c19c6a4cf1460e961f7bae8eea54d437b9edac27cbeb09be32ae367adf9098a-0x5bfa932c150df0af24346419d31b61dab0747d78fa1b46e97f838927423c99f4" + "ACB-ed8c19c6a4cf1460e961f7bae8eea54d437b9edac27cbeb09be32ae367adf9098a-0x08bfdbe1dd6e8f02bbca1e930981ae9dfff03238721e58e8007049f861b30496" .into(), Amount(90000).into(), ), @@ -279,12 +279,12 @@ mod tests { Amount(9679).into(), ), WriteOp::Put( - "CAB-9e438ff7c98bb11eeab8d5220268904df386cdae241f4207cda54b8f87bc0f87-0x5bfa932c150df0af24346419d31b61dab0747d78fa1b46e97f838927423c99f4" + "CAB-0x069c7585c9cd138dd714b36716efdff2257e536b3360da2aad96c35c9c46bd5e-0x08bfdbe1dd6e8f02bbca1e930981ae9dfff03238721e58e8007049f861b30496" .into(), Amount(10000).into(), ), WriteOp::Put( - "DNC-ed8c19c6a4cf1460e961f7bae8eea54d437b9edac27cbeb09be32ae367adf9098a-9e438ff7c98bb11eeab8d5220268904df386cdae241f4207cda54b8f87bc0f87".into(), + "DNC-ed8c19c6a4cf1460e961f7bae8eea54d437b9edac27cbeb09be32ae367adf9098a-0x069c7585c9cd138dd714b36716efdff2257e536b3360da2aad96c35c9c46bd5e".into(), 1u32.into(), ), ]; @@ -293,7 +293,7 @@ mod tests { assert_eq!( exec_fees, vec![Money { - token_id: TokenId::Ziesha, + token_id: ContractId::Ziesha, amount: Amount(321) }] ); diff --git a/src/blockchain/ops/apply_tx/update_contract/mint.rs b/src/blockchain/ops/apply_tx/update_contract/mint.rs index fbbabe7e..03f55ef3 100644 --- a/src/blockchain/ops/apply_tx/update_contract/mint.rs +++ b/src/blockchain/ops/apply_tx/update_contract/mint.rs @@ -8,20 +8,21 @@ pub fn mint( amount: &Amount, executor_fees: &mut Vec, ) -> Result<(zk::ZkVerifierKey, zk::ZkCompressedState), BlockchainError> { - if let Some(token) = &contract.token { - /*let mut bal = chain.get_contract_balance(contract_id.clone(), *token_id)?; + if let Some(mut token) = contract.token.clone() { + let mut bal = chain.get_contract_balance(contract_id.clone(), *contract_id)?; if bal + *amount < bal || token.token.supply + *amount < token.token.supply { return Err(BlockchainError::TokenSupplyOverflow); } bal += *amount; - token.supply += *amount; - chain - .database - .update(&[WriteOp::Put(keys::token(token_id), (&token).into())])?; + token.token.supply += *amount; chain.database.update(&[WriteOp::Put( - keys::account_balance(&tx_src, *token_id), + keys::token(contract_id), + (&token.token).into(), + )])?; + chain.database.update(&[WriteOp::Put( + keys::contract_balance(contract_id, *contract_id), bal.into(), - )])?;*/ + )])?; let func = token .mint_functions @@ -33,6 +34,12 @@ pub fn mint( [(zk::ZkDataLocator(vec![]), Some((*amount).into()))].into(), ))?; let aux_data = state_builder.compress()?; + + executor_fees.push(Money { + token_id: contract_id.clone(), + amount: *amount, + }); + Ok((circuit.clone(), aux_data)) } else { Err(BlockchainError::ContractNotToken) diff --git a/src/blockchain/ops/apply_tx/update_contract/mod.rs b/src/blockchain/ops/apply_tx/update_contract/mod.rs index cdfbaf51..1306be38 100644 --- a/src/blockchain/ops/apply_tx/update_contract/mod.rs +++ b/src/blockchain/ops/apply_tx/update_contract/mod.rs @@ -32,19 +32,19 @@ pub fn update_contract( ); // Pay prover reward from tx_src - let mut src_bal = chain.get_balance(tx_src.clone(), TokenId::Ziesha)?; + let mut src_bal = chain.get_balance(tx_src.clone(), ContractId::Ziesha)?; if src_bal < update.reward { return Err(BlockchainError::BalanceInsufficient); } src_bal -= update.reward; chain.database.update(&[WriteOp::Put( - keys::account_balance(&tx_src, TokenId::Ziesha), + keys::account_balance(&tx_src, ContractId::Ziesha), src_bal.into(), )])?; - let mut prover_bal = chain.get_balance(update.prover.clone(), TokenId::Ziesha)?; + let mut prover_bal = chain.get_balance(update.prover.clone(), ContractId::Ziesha)?; prover_bal += update.reward; chain.database.update(&[WriteOp::Put( - keys::account_balance(&update.prover, TokenId::Ziesha), + keys::account_balance(&update.prover, ContractId::Ziesha), prover_bal.into(), )])?; diff --git a/src/blockchain/ops/apply_tx/update_contract/withdraw.rs b/src/blockchain/ops/apply_tx/update_contract/withdraw.rs index f9d4949a..f0a898f5 100644 --- a/src/blockchain/ops/apply_tx/update_contract/withdraw.rs +++ b/src/blockchain/ops/apply_tx/update_contract/withdraw.rs @@ -204,7 +204,7 @@ mod tests { Amount(9200).into(), ), WriteOp::Put( - "CAB-9e438ff7c98bb11eeab8d5220268904df386cdae241f4207cda54b8f87bc0f87-Ziesha" + "CAB-0x069c7585c9cd138dd714b36716efdff2257e536b3360da2aad96c35c9c46bd5e-Ziesha" .into(), Amount(750).into(), ), @@ -214,7 +214,7 @@ mod tests { assert_eq!( exec_fees, vec![Money { - token_id: TokenId::Ziesha, + token_id: ContractId::Ziesha, amount: Amount(50) }] ); @@ -331,17 +331,17 @@ mod tests { let expected_ops = vec![ WriteOp::Put( - "ACB-ed8c19c6a4cf1460e961f7bae8eea54d437b9edac27cbeb09be32ae367adf9098a-0x5bfa932c150df0af24346419d31b61dab0747d78fa1b46e97f838927423c99f4" + "ACB-ed8c19c6a4cf1460e961f7bae8eea54d437b9edac27cbeb09be32ae367adf9098a-0x08bfdbe1dd6e8f02bbca1e930981ae9dfff03238721e58e8007049f861b30496" .into(), Amount(99333).into(), ), WriteOp::Put( - "CAB-9e438ff7c98bb11eeab8d5220268904df386cdae241f4207cda54b8f87bc0f87-0x5bfa932c150df0af24346419d31b61dab0747d78fa1b46e97f838927423c99f4" + "CAB-0x069c7585c9cd138dd714b36716efdff2257e536b3360da2aad96c35c9c46bd5e-0x08bfdbe1dd6e8f02bbca1e930981ae9dfff03238721e58e8007049f861b30496" .into(), Amount(667).into(), ), WriteOp::Put( - "CAB-9e438ff7c98bb11eeab8d5220268904df386cdae241f4207cda54b8f87bc0f87-Ziesha" + "CAB-0x069c7585c9cd138dd714b36716efdff2257e536b3360da2aad96c35c9c46bd5e-Ziesha" .into(), Amount(556).into(), ) @@ -351,7 +351,7 @@ mod tests { assert_eq!( exec_fees, vec![Money { - token_id: TokenId::Ziesha, + token_id: ContractId::Ziesha, amount: Amount(444) }] ); diff --git a/src/blockchain/ops/apply_tx/update_token.rs b/src/blockchain/ops/apply_tx/update_token.rs deleted file mode 100644 index 4ed76ff8..00000000 --- a/src/blockchain/ops/apply_tx/update_token.rs +++ /dev/null @@ -1,264 +0,0 @@ -use super::*; - -pub fn update_token( - chain: &mut KvStoreChain, - tx_src: Address, - token_id: &TokenId, - update: &TokenUpdate, -) -> Result<(), BlockchainError> { - if let Some(mut token) = chain.get_token(*token_id)? { - if let Some(minter) = token.minter.clone() { - if minter == tx_src { - match update { - TokenUpdate::Mint { amount } => { - let mut bal = chain.get_balance(tx_src.clone(), *token_id)?; - if bal + *amount < bal || token.supply + *amount < token.supply { - return Err(BlockchainError::TokenSupplyOverflow); - } - bal += *amount; - token.supply += *amount; - chain - .database - .update(&[WriteOp::Put(keys::token(token_id), (&token).into())])?; - chain.database.update(&[WriteOp::Put( - keys::account_balance(&tx_src, *token_id), - bal.into(), - )])?; - } - TokenUpdate::ChangeMinter { minter } => { - token.minter = Some(minter.clone()); - chain - .database - .update(&[WriteOp::Put(keys::token(token_id), (&token).into())])?; - } - } - } else { - return Err(BlockchainError::TokenUpdatePermissionDenied); - } - } else { - return Err(BlockchainError::TokenNotUpdatable); - } - } else { - return Err(BlockchainError::TokenNotFound); - } - Ok(()) -} - -#[cfg(test)] -mod tests { - use super::*; - use crate::db::{RamKvStore, WriteOp}; - - #[test] - fn test_non_existing_token() { - let chain = KvStoreChain::new( - RamKvStore::new(), - crate::config::blockchain::get_test_blockchain_config(), - ) - .unwrap(); - let token_id: TokenId = - "0x0001020304050607080900010203040506070809000102030405060708090001" - .parse() - .unwrap(); - let addr: Address = "edae9736792cbdbab2c72068eb41c6ef2e6cab372ca123f834bd7eb59fcecad640" - .parse() - .unwrap(); - assert!(matches!( - chain.isolated(|chain| Ok(update_token( - chain, - addr, - &token_id, - &TokenUpdate::Mint { - amount: Amount(100) - } - )?)), - Err(BlockchainError::TokenNotFound) - )); - } - - #[test] - fn test_unupdatable_token() { - let mut chain = KvStoreChain::new( - RamKvStore::new(), - crate::config::blockchain::get_test_blockchain_config(), - ) - .unwrap(); - let token_id_1: TokenId = - "0x0001020304050607080900010203040506070809000102030405060708090001" - .parse() - .unwrap(); - let token_id_2: TokenId = - "0x0001020304050607080900010203040506070809000102030405060708090002" - .parse() - .unwrap(); - let addr_1: Address = "edae9736792cbdbab2c72068eb41c6ef2e6cab372ca123f834bd7eb59fcecad640" - .parse() - .unwrap(); - let addr_2: Address = "ed9e9736792cbdbab2c72068eb41c6ef2e6cab372ca123f834bd7eb59fcecad641" - .parse() - .unwrap(); - let tkn = Token { - name: "KeyvanCoin".into(), - symbol: "KIWI".into(), - supply: Amount(12345), - decimals: 2, - minter: None, - }; - super::create_token::create_token(&mut chain, addr_1.clone(), token_id_1, &tkn).unwrap(); - let tkn2 = Token { - name: "KeyvanCoin".into(), - symbol: "KIWI".into(), - supply: Amount(12345), - decimals: 2, - minter: Some(addr_2), - }; - super::create_token::create_token(&mut chain, addr_1.clone(), token_id_2, &tkn2).unwrap(); - assert!(matches!( - chain.isolated(|chain| Ok(update_token( - chain, - addr_1.clone(), - &token_id_1, - &TokenUpdate::Mint { - amount: Amount(100) - } - )?)), - Err(BlockchainError::TokenNotUpdatable) - )); - assert!(matches!( - chain.isolated(|chain| Ok(update_token( - chain, - addr_1, - &token_id_2, - &TokenUpdate::Mint { - amount: Amount(100) - } - )?)), - Err(BlockchainError::TokenUpdatePermissionDenied) - )); - } - - #[test] - fn test_mint_token() { - let mut chain = KvStoreChain::new( - RamKvStore::new(), - crate::config::blockchain::get_test_blockchain_config(), - ) - .unwrap(); - let token_id: TokenId = - "0x0001020304050607080900010203040506070809000102030405060708090001" - .parse() - .unwrap(); - let addr: Address = "edae9736792cbdbab2c72068eb41c6ef2e6cab372ca123f834bd7eb59fcecad640" - .parse() - .unwrap(); - let tkn = Token { - name: "KeyvanCoin".into(), - symbol: "KIWI".into(), - supply: Amount(12345), - decimals: 2, - minter: Some(addr.clone()), - }; - super::create_token::create_token(&mut chain, addr.clone(), token_id, &tkn).unwrap(); - - let (ops, _) = chain - .isolated(|chain| { - Ok(update_token( - chain, - addr.clone(), - &token_id, - &TokenUpdate::Mint { - amount: Amount(100), - }, - )?) - }) - .unwrap(); - - let expected_ops = vec![ - WriteOp::Put( - "ACB-edae9736792cbdbab2c72068eb41c6ef2e6cab372ca123f834bd7eb59fcecad640-0x0001020304050607080900010203040506070809000102030405060708090001".into(), - Amount(12445).into() - ), - WriteOp::Put( - "TKN-0x0001020304050607080900010203040506070809000102030405060708090001" - .into(), - (&Token { - name: "KeyvanCoin".into(), - symbol: "KIWI".into(), - supply: Amount(12445), - decimals: 2, - minter: Some(addr), - }).into() - ), - ]; - - assert_eq!(ops, expected_ops); - } - - #[test] - fn test_change_minter() { - let mut chain = KvStoreChain::new( - RamKvStore::new(), - crate::config::blockchain::get_test_blockchain_config(), - ) - .unwrap(); - let token_id: TokenId = - "0x0001020304050607080900010203040506070809000102030405060708090001" - .parse() - .unwrap(); - let addr: Address = "edae9736792cbdbab2c72068eb41c6ef2e6cab372ca123f834bd7eb59fcecad640" - .parse() - .unwrap(); - let new_addr: Address = - "ed9e9736792cbdbab2c72068eb41c6ef2e6cab372ca123f834bd7eb59fcecad641" - .parse() - .unwrap(); - let tkn = Token { - name: "KeyvanCoin".into(), - symbol: "KIWI".into(), - supply: Amount(12345), - decimals: 2, - minter: Some(addr.clone()), - }; - super::create_token::create_token(&mut chain, addr.clone(), token_id, &tkn).unwrap(); - - let (ops, _) = chain - .isolated(|chain| { - Ok(update_token( - chain, - addr.clone(), - &token_id, - &TokenUpdate::ChangeMinter { - minter: new_addr.clone(), - }, - )?) - }) - .unwrap(); - - let expected_ops = vec![WriteOp::Put( - "TKN-0x0001020304050607080900010203040506070809000102030405060708090001".into(), - (&Token { - name: "KeyvanCoin".into(), - symbol: "KIWI".into(), - supply: Amount(12345), - decimals: 2, - minter: Some(new_addr), - }) - .into(), - )]; - - assert_eq!(ops, expected_ops); - chain.database.update(&ops).unwrap(); - - assert!(matches!( - chain.isolated(|chain| Ok(update_token( - chain, - addr, - &token_id, - &TokenUpdate::Mint { - amount: Amount(100) - } - )?)), - Err(BlockchainError::TokenUpdatePermissionDenied) - )); - } -} diff --git a/src/blockchain/ops/pay_validator_and_delegators.rs b/src/blockchain/ops/pay_validator_and_delegators.rs index a4e5b0ce..f486a05f 100644 --- a/src/blockchain/ops/pay_validator_and_delegators.rs +++ b/src/blockchain/ops/pay_validator_and_delegators.rs @@ -46,7 +46,7 @@ pub fn pay_validator_and_delegators( dst: addr.clone(), amount: Money { amount: amnt, - token_id: TokenId::Ziesha, + token_id: ContractId::Ziesha, }, }], }, @@ -88,7 +88,7 @@ pub fn pay_validator_and_delegators( .get_undelegation(key.undelegator.clone(), key.undelegation_id)? .ok_or(BlockchainError::Inconsistency)?; let new_balance = - chain.get_balance(key.undelegator.clone(), TokenId::Ziesha)? + undelegation.amount; + chain.get_balance(key.undelegator.clone(), ContractId::Ziesha)? + undelegation.amount; chain.database.update(&[ WriteOp::Remove( keys::UndelegationDbKey { @@ -98,7 +98,7 @@ pub fn pay_validator_and_delegators( .into(), ), WriteOp::Put( - keys::account_balance(&key.undelegator, TokenId::Ziesha), + keys::account_balance(&key.undelegator, ContractId::Ziesha), new_balance.into(), ), ])?; diff --git a/src/blockchain/ops/select_transactions.rs b/src/blockchain/ops/select_transactions.rs index ed819e3b..50f29b09 100644 --- a/src/blockchain/ops/select_transactions.rs +++ b/src/blockchain/ops/select_transactions.rs @@ -8,7 +8,7 @@ pub fn select_transactions( ) -> Result, BlockchainError> { let mut sorted = txs .iter() - .filter(|t| t.tx.fee.token_id == TokenId::Ziesha) + .filter(|t| t.tx.fee.token_id == ContractId::Ziesha) .cloned() .collect::>(); // WARN: Sort will be invalid if not all fees are specified in Ziesha diff --git a/src/blockchain/test/mod.rs b/src/blockchain/test/mod.rs index 0baa0085..b889e531 100644 --- a/src/blockchain/test/mod.rs +++ b/src/blockchain/test/mod.rs @@ -286,7 +286,7 @@ fn test_merkle_root_check() { fork1.apply_block(&blk1).unwrap(); assert_eq!( fork1 - .get_balance(alice.get_address(), TokenId::Ziesha) + .get_balance(alice.get_address(), ContractId::Ziesha) .unwrap(), Amount(9700) ); @@ -294,7 +294,7 @@ fn test_merkle_root_check() { fork2.apply_block(&blk2).unwrap(); assert_eq!( fork2 - .get_balance(alice.get_address(), TokenId::Ziesha) + .get_balance(alice.get_address(), ContractId::Ziesha) .unwrap(), Amount(9700) ); @@ -327,13 +327,13 @@ fn test_txs_cant_be_duplicated() { // Alice: 10000 Bob: 0 assert_eq!( chain - .get_balance(alice.get_address(), TokenId::Ziesha) + .get_balance(alice.get_address(), ContractId::Ziesha) .unwrap(), Amount(10000) ); assert_eq!( chain - .get_balance(bob.get_address(), TokenId::Ziesha) + .get_balance(bob.get_address(), ContractId::Ziesha) .unwrap(), Amount(0) ); @@ -357,13 +357,13 @@ fn test_txs_cant_be_duplicated() { .unwrap(); assert_eq!( chain - .get_balance(alice.get_address(), TokenId::Ziesha) + .get_balance(alice.get_address(), ContractId::Ziesha) .unwrap(), Amount(7000) ); assert_eq!( chain - .get_balance(bob.get_address(), TokenId::Ziesha) + .get_balance(bob.get_address(), ContractId::Ziesha) .unwrap(), Amount(2700) ); @@ -379,13 +379,13 @@ fn test_txs_cant_be_duplicated() { .unwrap(); assert_eq!( chain - .get_balance(alice.get_address(), TokenId::Ziesha) + .get_balance(alice.get_address(), ContractId::Ziesha) .unwrap(), Amount(7000) ); assert_eq!( chain - .get_balance(bob.get_address(), TokenId::Ziesha) + .get_balance(bob.get_address(), ContractId::Ziesha) .unwrap(), Amount(2700) ); @@ -409,13 +409,13 @@ fn test_txs_cant_be_duplicated() { .unwrap(); assert_eq!( chain - .get_balance(alice.get_address(), TokenId::Ziesha) + .get_balance(alice.get_address(), ContractId::Ziesha) .unwrap(), Amount(4000) ); assert_eq!( chain - .get_balance(bob.get_address(), TokenId::Ziesha) + .get_balance(bob.get_address(), ContractId::Ziesha) .unwrap(), Amount(5400) ); @@ -438,13 +438,13 @@ fn test_insufficient_balance_is_handled() { // Alice: 10000 Bob: 0 assert_eq!( chain - .get_balance(alice.get_address(), TokenId::Ziesha) + .get_balance(alice.get_address(), ContractId::Ziesha) .unwrap(), Amount(10000) ); assert_eq!( chain - .get_balance(bob.get_address(), TokenId::Ziesha) + .get_balance(bob.get_address(), ContractId::Ziesha) .unwrap(), Amount(0) ); @@ -477,7 +477,7 @@ fn test_insufficient_balance_is_handled() { .unwrap(); assert_eq!( chain - .get_balance(bob.get_address(), TokenId::Ziesha) + .get_balance(bob.get_address(), ContractId::Ziesha) .unwrap(), Amount(0) ); @@ -533,7 +533,7 @@ fn test_cant_apply_unsigned_tx() { .unwrap(); assert_eq!( chain - .get_balance(bob.get_address(), TokenId::Ziesha) + .get_balance(bob.get_address(), ContractId::Ziesha) .unwrap(), Amount(0) ); @@ -595,7 +595,7 @@ fn test_cant_apply_invalid_signed_tx() { .unwrap(); assert_eq!( chain - .get_balance(bob.get_address(), TokenId::Ziesha) + .get_balance(bob.get_address(), ContractId::Ziesha) .unwrap(), Amount(0) ); @@ -618,13 +618,13 @@ fn test_balances_are_correct_after_tx() { // Alice: 10000 Bob: 0 assert_eq!( chain - .get_balance(alice.get_address(), TokenId::Ziesha) + .get_balance(alice.get_address(), ContractId::Ziesha) .unwrap(), Amount(10000) ); assert_eq!( chain - .get_balance(bob.get_address(), TokenId::Ziesha) + .get_balance(bob.get_address(), ContractId::Ziesha) .unwrap(), Amount(0) ); @@ -651,13 +651,13 @@ fn test_balances_are_correct_after_tx() { .unwrap(); assert_eq!( chain - .get_balance(alice.get_address(), TokenId::Ziesha) + .get_balance(alice.get_address(), ContractId::Ziesha) .unwrap(), Amount(7000) ); assert_eq!( chain - .get_balance(bob.get_address(), TokenId::Ziesha) + .get_balance(bob.get_address(), ContractId::Ziesha) .unwrap(), Amount(2700) ); @@ -684,13 +684,13 @@ fn test_balances_are_correct_after_tx() { .unwrap(); assert_eq!( chain - .get_balance(alice.get_address(), TokenId::Ziesha) + .get_balance(alice.get_address(), ContractId::Ziesha) .unwrap(), Amount(7000) ); assert_eq!( chain - .get_balance(bob.get_address(), TokenId::Ziesha) + .get_balance(bob.get_address(), ContractId::Ziesha) .unwrap(), Amount(2700) ); @@ -717,13 +717,13 @@ fn test_balances_are_correct_after_tx() { .unwrap(); assert_eq!( chain - .get_balance(alice.get_address(), TokenId::Ziesha) + .get_balance(alice.get_address(), ContractId::Ziesha) .unwrap(), Amount(9600) ); assert_eq!( chain - .get_balance(bob.get_address(), TokenId::Ziesha) + .get_balance(bob.get_address(), ContractId::Ziesha) .unwrap(), Amount(0) ); @@ -750,13 +750,13 @@ fn test_balances_are_correct_after_tx() { .unwrap(); assert_eq!( chain - .get_balance(alice.get_address(), TokenId::Ziesha) + .get_balance(alice.get_address(), ContractId::Ziesha) .unwrap(), Amount(9400) ); assert_eq!( chain - .get_balance(bob.get_address(), TokenId::Ziesha) + .get_balance(bob.get_address(), ContractId::Ziesha) .unwrap(), Amount(0) ); @@ -783,13 +783,13 @@ fn test_balances_are_correct_after_tx() { .unwrap(); assert_eq!( chain - .get_balance(alice.get_address(), TokenId::Ziesha) + .get_balance(alice.get_address(), ContractId::Ziesha) .unwrap(), Amount(0) ); assert_eq!( chain - .get_balance(bob.get_address(), TokenId::Ziesha) + .get_balance(bob.get_address(), ContractId::Ziesha) .unwrap(), Amount(0) ); @@ -940,10 +940,10 @@ fn test_chain_should_draft_all_valid_transactions() { assert_eq!(2, draft.body.len()); let account1 = chain - .get_balance(wallet1.get_address(), TokenId::Ziesha) + .get_balance(wallet1.get_address(), ContractId::Ziesha) .unwrap(); let account2 = chain - .get_balance(wallet2.get_address(), TokenId::Ziesha) + .get_balance(wallet2.get_address(), ContractId::Ziesha) .unwrap(); assert_eq!(Amount(10_000_000 - 7000), account1); assert_eq!(Amount(7000), account2); @@ -1050,7 +1050,7 @@ fn test_chain_should_rollback_applied_block() { let nonce = chain.get_nonce(wallet2.get_address()).unwrap(); let balance = chain - .get_balance(wallet2.get_address(), TokenId::Ziesha) + .get_balance(wallet2.get_address(), ContractId::Ziesha) .unwrap(); assert_eq!(Amount(1_000_000), balance); assert_eq!(0, nonce); diff --git a/src/blockchain/test/rewards.rs b/src/blockchain/test/rewards.rs index 3c9511f4..b80d9db6 100644 --- a/src/blockchain/test/rewards.rs +++ b/src/blockchain/test/rewards.rs @@ -30,7 +30,7 @@ fn test_correct_rewards() { chain.apply_block(&draft).unwrap(); assert!(close_enough( chain - .get_balance(validator.get_address(), TokenId::Ziesha) + .get_balance(validator.get_address(), ContractId::Ziesha) .unwrap(), expected_validator_reward_1 )); @@ -52,7 +52,7 @@ fn test_correct_rewards() { delegator_stake, Money { amount: 0.into(), - token_id: TokenId::Ziesha, + token_id: ContractId::Ziesha, }, 1, ), @@ -62,7 +62,7 @@ fn test_correct_rewards() { validator_stake, Money { amount: 0.into(), - token_id: TokenId::Ziesha, + token_id: ContractId::Ziesha, }, chain.get_nonce(validator.get_address()).unwrap() + 1, ), @@ -79,13 +79,13 @@ fn test_correct_rewards() { let expected_delegator_balance_2 = Amount(10000) - delegator_stake; assert!(close_enough( chain - .get_balance(validator.get_address(), TokenId::Ziesha) + .get_balance(validator.get_address(), ContractId::Ziesha) .unwrap(), expected_validator_balance_2 )); assert!(close_enough( chain - .get_balance(delegator.get_address(), TokenId::Ziesha) + .get_balance(delegator.get_address(), ContractId::Ziesha) .unwrap(), expected_delegator_balance_2 )); @@ -100,7 +100,7 @@ fn test_correct_rewards() { chain.apply_block(&draft).unwrap(); assert!(close_enough( chain - .get_balance(validator.get_address(), TokenId::Ziesha) + .get_balance(validator.get_address(), ContractId::Ziesha) .unwrap() - expected_validator_balance_2, Amount( @@ -109,7 +109,7 @@ fn test_correct_rewards() { )); assert!(close_enough( chain - .get_balance(delegator.get_address(), TokenId::Ziesha) + .get_balance(delegator.get_address(), ContractId::Ziesha) .unwrap() - expected_delegator_balance_2, Amount((expected_reward_3 - expected_validator_reward_3).0 * 3 / 5) @@ -154,7 +154,7 @@ fn test_auto_delegate() { + Amount((expected_delegator_reward_before_auto_delegate.0 as f64 * 55.0 / 255.0) as u64); assert_eq!( chain - .get_balance(delegator.get_address(), TokenId::Ziesha) + .get_balance(delegator.get_address(), ContractId::Ziesha) .unwrap(), Amount(25) ); @@ -173,13 +173,13 @@ fn test_auto_delegate() { )); assert!(close_enough( chain - .get_balance(validator.get_address(), TokenId::Ziesha) + .get_balance(validator.get_address(), ContractId::Ziesha) .unwrap(), expected_validator_reward )); assert!(close_enough( chain - .get_balance(delegator.get_address(), TokenId::Ziesha) + .get_balance(delegator.get_address(), ContractId::Ziesha) .unwrap(), expected_delegator_balance )); diff --git a/src/cli/chain/health_check.rs b/src/cli/chain/health_check.rs index 49771454..bfe8eb8c 100644 --- a/src/cli/chain/health_check.rs +++ b/src/cli/chain/health_check.rs @@ -3,7 +3,7 @@ use bazuka::blockchain::Blockchain; use bazuka::db::KvStore; use bazuka::{ blockchain::KvStoreChain, - core::{Amount, TokenId}, + core::{Amount, ContractId}, db::ReadOnlyLevelDbKvStore, }; use colored::Colorize; @@ -30,7 +30,7 @@ pub fn health_check(conf: &BazukaConfig) { let mut sum_mpn: Amount = 0.into(); for mpn_acc in chain.get_mpn_accounts(0, acc_count as usize).unwrap() { for money in mpn_acc.1.tokens.values() { - if money.token_id == TokenId::Ziesha { + if money.token_id == ContractId::Ziesha { sum_mpn += money.amount; } } @@ -40,7 +40,7 @@ pub fn health_check(conf: &BazukaConfig) { let mpn_contract_balance_check = sum_mpn == chain - .get_contract_balance(mpn_contract_id, TokenId::Ziesha) + .get_contract_balance(mpn_contract_id, ContractId::Ziesha) .unwrap(); let currency_in_circulation_check = chain.currency_in_circulation().unwrap() == expected_currency_in_circulation; diff --git a/src/cli/mod.rs b/src/cli/mod.rs index a765ed77..9680e08c 100644 --- a/src/cli/mod.rs +++ b/src/cli/mod.rs @@ -16,7 +16,7 @@ use { use { bazuka::client::{NodeError, PeerAddress}, bazuka::config, - bazuka::core::{Address, Decimal, GeneralAddress, TokenId}, + bazuka::core::{Address, ContractId, Decimal, GeneralAddress}, bazuka::mpn::MpnWorker, bazuka::wallet::WalletCollection, serde::{Deserialize, Serialize}, @@ -93,7 +93,7 @@ enum WalletOptions { /// Add a new token to the wallet AddToken { #[structopt(long)] - id: TokenId, + id: ContractId, }, /// Creates a new token NewToken { @@ -121,7 +121,7 @@ enum WalletOptions { #[structopt(long)] to: GeneralAddress, #[structopt(long)] - token_id: Option, + token_id: Option, #[structopt(long)] amount: Decimal, #[structopt(long, default_value = "0")] diff --git a/src/cli/wallet/add_token.rs b/src/cli/wallet/add_token.rs index 254e4ac5..b521f267 100644 --- a/src/cli/wallet/add_token.rs +++ b/src/cli/wallet/add_token.rs @@ -1,8 +1,8 @@ use std::path::PathBuf; -use bazuka::{core::TokenId, wallet::WalletCollection}; +use bazuka::{core::ContractId, wallet::WalletCollection}; -pub fn add_token(token_id: TokenId, mut wallet: WalletCollection, wallet_path: &PathBuf) -> () { +pub fn add_token(token_id: ContractId, mut wallet: WalletCollection, wallet_path: &PathBuf) -> () { wallet.user(0).add_token(token_id); wallet.save(wallet_path).unwrap(); } diff --git a/src/cli/wallet/auto_delegate.rs b/src/cli/wallet/auto_delegate.rs index 1c2cca2b..fb5893d0 100644 --- a/src/cli/wallet/auto_delegate.rs +++ b/src/cli/wallet/auto_delegate.rs @@ -4,7 +4,7 @@ use tokio::try_join; use crate::cli::{BazukaConfig, CURRENT_NETWORK}; use bazuka::client::{BazukaClient, Limit, NodeError}; use bazuka::common::*; -use bazuka::core::{Address, Decimal, Money, NonceGroup, Ratio, TokenId}; +use bazuka::core::{Address, ContractId, Decimal, Money, NonceGroup, Ratio}; use bazuka::wallet::WalletCollection; pub async fn auto_delegate( @@ -37,7 +37,7 @@ pub async fn auto_delegate( ratio, Money { amount: fee.to_amount(bazuka::config::UNIT_ZEROS), - token_id: TokenId::Ziesha, + token_id: ContractId::Ziesha, }, new_nonce, ); diff --git a/src/cli/wallet/delegate.rs b/src/cli/wallet/delegate.rs index c0bdeadd..910079ed 100644 --- a/src/cli/wallet/delegate.rs +++ b/src/cli/wallet/delegate.rs @@ -4,7 +4,7 @@ use tokio::try_join; use crate::cli::{BazukaConfig, CURRENT_NETWORK}; use bazuka::client::{BazukaClient, Limit, NodeError}; use bazuka::common::*; -use bazuka::core::{Address, Decimal, Money, NonceGroup, TokenId}; +use bazuka::core::{Address, ContractId, Decimal, Money, NonceGroup}; use bazuka::wallet::WalletCollection; use colored::Colorize; @@ -48,7 +48,7 @@ pub async fn delegate( amount.to_amount(bazuka::config::UNIT_ZEROS), Money { amount: fee.to_amount(bazuka::config::UNIT_ZEROS), - token_id: TokenId::Ziesha, + token_id: ContractId::Ziesha, }, new_nonce, ); diff --git a/src/cli/wallet/info.rs b/src/cli/wallet/info.rs index dcc105c8..c147c048 100644 --- a/src/cli/wallet/info.rs +++ b/src/cli/wallet/info.rs @@ -5,7 +5,7 @@ use bazuka::client::{Limit, NodeError}; use bazuka::common::*; use bazuka::core::{MpnAddress, NonceGroup}; use bazuka::wallet::WalletCollection; -use bazuka::{client::BazukaClient, core::TokenId}; +use bazuka::{client::BazukaClient, core::ContractId}; use colored::Colorize; use std::collections::HashMap; @@ -32,7 +32,7 @@ pub async fn info(conf: BazukaConfig, mut wallet: WalletCollection, validator: b ); let validator_ziesha = client - .get_balance(val_tx_builder.get_address(), TokenId::Ziesha) + .get_balance(val_tx_builder.get_address(), ContractId::Ziesha) .await? .balance; println!( @@ -54,7 +54,7 @@ pub async fn info(conf: BazukaConfig, mut wallet: WalletCollection, validator: b .tokens .get(&0) .map(|tkn| { - if tkn.token_id == TokenId::Ziesha { + if tkn.token_id == ContractId::Ziesha { tkn.amount } else { 0.into() @@ -133,7 +133,7 @@ pub async fn info(conf: BazukaConfig, mut wallet: WalletCollection, validator: b format!("<{}>:", inf.name).bright_yellow(), inf.balance .display_by_decimals(tokens.get(id).unwrap().decimals), - if *id == TokenId::Ziesha { + if *id == ContractId::Ziesha { bazuka::config::SYMBOL.to_string() } else { format!(" {} (Token-Id: {})", inf.symbol, id) @@ -237,7 +237,7 @@ pub async fn info(conf: BazukaConfig, mut wallet: WalletCollection, validator: b .as_ref() .map(|t| money.amount.display_by_decimals(t.decimals)) .unwrap_or("N/A".to_string()), - if money.token_id == TokenId::Ziesha { + if money.token_id == ContractId::Ziesha { bazuka::config::SYMBOL.to_string() } else { format!(" {}", inf.symbol) diff --git a/src/cli/wallet/new_token.rs b/src/cli/wallet/new_token.rs index 397be8f7..27925da6 100644 --- a/src/cli/wallet/new_token.rs +++ b/src/cli/wallet/new_token.rs @@ -3,7 +3,7 @@ use std::path::PathBuf; use crate::cli::{BazukaConfig, CURRENT_NETWORK}; use bazuka::client::{BazukaClient, Limit, NodeError}; use bazuka::common::*; -use bazuka::core::{Decimal, Money, NonceGroup, TokenId}; +use bazuka::core::{ContractId, Decimal, Money, NonceGroup}; use bazuka::wallet::WalletCollection; use tokio::try_join; @@ -43,7 +43,7 @@ pub async fn new_token( mintable.then(|| tx_builder.get_address()), Money { amount: fee.to_amount(bazuka::config::UNIT_ZEROS), - token_id: TokenId::Ziesha, + token_id: ContractId::Ziesha, }, new_nonce, ); diff --git a/src/cli/wallet/register_validator.rs b/src/cli/wallet/register_validator.rs index 8af43865..1a68b571 100644 --- a/src/cli/wallet/register_validator.rs +++ b/src/cli/wallet/register_validator.rs @@ -5,7 +5,7 @@ use tokio::try_join; use crate::cli::{BazukaConfig, CURRENT_NETWORK}; use bazuka::client::{BazukaClient, Limit, NodeError}; use bazuka::common::*; -use bazuka::core::{Decimal, Money, NonceGroup, Ratio, TokenId}; +use bazuka::core::{ContractId, Decimal, Money, NonceGroup, Ratio}; use bazuka::wallet::WalletCollection; pub async fn register_validator( @@ -37,7 +37,7 @@ pub async fn register_validator( commission, Money { amount: fee.to_amount(bazuka::config::UNIT_ZEROS), - token_id: TokenId::Ziesha, + token_id: ContractId::Ziesha, }, new_nonce, ); diff --git a/src/cli/wallet/send.rs b/src/cli/wallet/send.rs index 65be49aa..1901dfdc 100644 --- a/src/cli/wallet/send.rs +++ b/src/cli/wallet/send.rs @@ -6,7 +6,7 @@ use bazuka::{ client::{BazukaClient, Limit, NodeError}, common::*, config, - core::{Amount, Decimal, GeneralAddress, Money, NonceGroup, TokenId, TransactionKind}, + core::{Amount, ContractId, Decimal, GeneralAddress, Money, NonceGroup, TransactionKind}, }; use colored::Colorize; use std::collections::HashMap; @@ -18,7 +18,7 @@ pub async fn send( to: GeneralAddress, amount: Decimal, fee: Decimal, - token_id: Option, + token_id: Option, conf: BazukaConfig, mut wallet: WalletCollection, wallet_path: &PathBuf, @@ -41,7 +41,7 @@ pub async fn send( token_id } } else { - TokenId::Ziesha + ContractId::Ziesha }; try_join!( @@ -103,7 +103,7 @@ pub async fn send( }, Money { amount: fee_amount, - token_id: TokenId::Ziesha, + token_id: ContractId::Ziesha, }, new_nonce, ); @@ -139,7 +139,7 @@ pub async fn send( }, Money { amount: fee_amount, - token_id: TokenId::Ziesha, + token_id: ContractId::Ziesha, }, ); if let Some(err) = client.transact(pay.clone().into()).await?.error { @@ -177,7 +177,7 @@ pub async fn send( }, Money { amount: fee_amount, - token_id: TokenId::Ziesha, + token_id: ContractId::Ziesha, }, to.to_string().parse().unwrap(), // TODO: WTH :D ); @@ -215,7 +215,7 @@ pub async fn send( }, Money { amount: fee_amount, - token_id: TokenId::Ziesha, + token_id: ContractId::Ziesha, }, new_nonce, ); diff --git a/src/cli/wallet/undelegate.rs b/src/cli/wallet/undelegate.rs index 82422617..856ee021 100644 --- a/src/cli/wallet/undelegate.rs +++ b/src/cli/wallet/undelegate.rs @@ -4,7 +4,7 @@ use tokio::try_join; use crate::cli::{BazukaConfig, CURRENT_NETWORK}; use bazuka::client::{BazukaClient, Limit, NodeError}; use bazuka::common::*; -use bazuka::core::{Address, Decimal, Money, NonceGroup, TokenId}; +use bazuka::core::{Address, ContractId, Decimal, Money, NonceGroup}; use bazuka::wallet::WalletCollection; pub async fn undelegate( @@ -37,7 +37,7 @@ pub async fn undelegate( amount.to_amount(bazuka::config::UNIT_ZEROS), Money { amount: fee.to_amount(bazuka::config::UNIT_ZEROS), - token_id: TokenId::Ziesha, + token_id: ContractId::Ziesha, }, new_nonce, ); diff --git a/src/client/error.rs b/src/client/error.rs index bfa8b431..aa6abebe 100644 --- a/src/client/error.rs +++ b/src/client/error.rs @@ -39,7 +39,7 @@ pub enum NodeError { #[error("cannot parse account address: {0}")] GeneralParseAddressError(#[from] crate::core::ParseGeneralAddressError), #[error("cannot parse general address: {0}")] - TokenIdParseError(#[from] crate::core::ParseTokenIdError), + ContractIdParseError(#[from] crate::core::ParseContractIdError), #[error("timeout reached: {0}")] TimeoutError(#[from] tokio::time::error::Elapsed), #[error("http body size limit error")] diff --git a/src/client/explorer.rs b/src/client/explorer.rs index ac9c36a7..94cd5def 100644 --- a/src/client/explorer.rs +++ b/src/client/explorer.rs @@ -1,7 +1,7 @@ use crate::core::{ Address, Amount, Block, ContractDeposit, ContractUpdate, ContractUpdateData, ContractWithdraw, - GeneralTransaction, Header, Money, MpnDeposit, MpnWithdraw, ProofOfStake, Token, TokenUpdate, - Transaction, TransactionData, + GeneralTransaction, Header, Money, MpnDeposit, MpnWithdraw, ProofOfStake, Token, Transaction, + TransactionData, }; use crate::crypto::jubjub::*; use crate::zk::{ @@ -282,26 +282,6 @@ impl From<&ZkProof> for ExplorerZkProof { } } -#[derive(Deserialize, Serialize, Debug, Clone)] -#[serde(tag = "type")] -pub enum ExplorerTokenUpdate { - Mint { amount: u64 }, - ChangeMinter { minter: String }, -} - -impl From<&TokenUpdate> for ExplorerTokenUpdate { - fn from(obj: &TokenUpdate) -> Self { - match obj { - TokenUpdate::Mint { amount } => Self::Mint { - amount: (*amount).into(), - }, - TokenUpdate::ChangeMinter { minter } => Self::ChangeMinter { - minter: minter.to_string(), - }, - } - } -} - #[derive(Deserialize, Serialize, Debug, Clone)] #[serde(tag = "type")] pub enum ExplorerContractUpdateData { @@ -391,13 +371,6 @@ pub enum ExplorerTransactionData { updates: Vec, delta: Option, }, - CreateToken { - token: ExplorerToken, - }, - UpdateToken { - token_id: String, - update: ExplorerTokenUpdate, - }, } impl From<&TransactionData> for ExplorerTransactionData { @@ -446,13 +419,6 @@ impl From<&TransactionData> for ExplorerTransactionData { updates: updates.iter().map(|u| u.into()).collect(), delta: delta.as_ref().map(|d| d.into()), }, - TransactionData::CreateToken { token } => Self::CreateToken { - token: token.into(), - }, - TransactionData::UpdateToken { token_id, update } => Self::UpdateToken { - token_id: token_id.to_string(), - update: update.into(), - }, } } } diff --git a/src/client/mod.rs b/src/client/mod.rs index ee3f2d06..59be8742 100644 --- a/src/client/mod.rs +++ b/src/client/mod.rs @@ -1,5 +1,5 @@ use crate::blockchain::TransactionMetadata; -use crate::core::{Address, GeneralTransaction, MpnAddress, Signer, TokenId}; +use crate::core::{Address, ContractId, GeneralTransaction, MpnAddress, Signer}; use crate::crypto::ed25519; use crate::crypto::SignatureScheme; use crate::zk::ZkProof; @@ -359,7 +359,7 @@ impl BazukaClient { pub async fn get_balance( &self, address: Address, - token_id: TokenId, + token_id: ContractId, ) -> Result { self.sender .json_get::( @@ -373,7 +373,7 @@ impl BazukaClient { .await } - pub async fn get_token(&self, token_id: TokenId) -> Result { + pub async fn get_token(&self, token_id: ContractId) -> Result { self.sender .json_get::( format!("http://{}/token", self.peer), diff --git a/src/config/blockchain.rs b/src/config/blockchain.rs index 76b168d8..861ddce5 100644 --- a/src/config/blockchain.rs +++ b/src/config/blockchain.rs @@ -4,7 +4,7 @@ use crate::blockchain::BlockchainConfig; use crate::common::*; use crate::core::{ Amount, Block, ContractId, Header, Money, MpnAddress, ProofOfStake, Ratio, RegularSendEntry, - Signature, Token, TokenId, Transaction, TransactionAndDelta, TransactionData, ZkHasher, + Signature, Token, Transaction, TransactionAndDelta, TransactionData, ZkHasher, }; use crate::mpn::circuits::MpnCircuit; use crate::mpn::MpnConfig; @@ -80,7 +80,7 @@ fn get_mpn_contract( ); data.0.insert( zk::ZkDataLocator(vec![i as u64, 4, 0, 0]), - zk::ZkScalar::from(TokenId::Ziesha), + zk::ZkScalar::from(ContractId::Ziesha), ); data.0.insert( zk::ZkDataLocator(vec![i as u64, 4, 0, 1]), @@ -99,7 +99,7 @@ fn get_mpn_contract( ), ( zk::ZkDataLocator(vec![i as u64, 4, 0, 0]), - Some(zk::ZkScalar::from(TokenId::Ziesha)), + Some(zk::ZkScalar::from(ContractId::Ziesha)), ), ( zk::ZkDataLocator(vec![i as u64, 4, 0, 1]), @@ -195,14 +195,26 @@ fn get_ziesha_token_creation_tx() -> Transaction { Transaction { memo: "Happy Birthday Ziesha!".into(), src: None, - data: TransactionData::CreateToken { - token: Token { - name: "Ziesha".into(), - symbol: "ZSH".into(), - supply: Amount(2_000_000_000_u64 * UNIT), - decimals: UNIT_ZEROS, - minter: None, + data: TransactionData::CreateContract { + contract: zk::ZkContract { + token: Some(zk::ZkTokenContract { + token: Token { + name: "Ziesha".into(), + symbol: "ZSH".into(), + supply: Amount(2_000_000_000_u64 * UNIT), + decimals: UNIT_ZEROS, + minter: None, + }, + mint_functions: vec![], + }), + state_model: zk::ZkStateModel::Scalar, + initial_state: zk::ZkCompressedState::empty::(zk::ZkStateModel::Scalar), + deposit_functions: vec![], + withdraw_functions: vec![], + functions: vec![], }, + state: Some(Default::default()), + money: Money::ziesha(0), }, nonce: 0, fee: Money::ziesha(0), @@ -230,7 +242,7 @@ pub fn blockchain_config_template(initial_balances: bool) -> BlockchainConfig { let mpn_contract_id = ContractId::new(&mpn_tx_delta.tx); let ziesha_token_creation_tx = get_ziesha_token_creation_tx(); - let ziesha_token_id = TokenId::new(&ziesha_token_creation_tx); + let ziesha_token_id = ContractId::new(&ziesha_token_creation_tx); let create_staker = Transaction { memo: "Very first staker created!".into(), @@ -290,7 +302,7 @@ pub fn blockchain_config_template(initial_balances: bool) -> BlockchainConfig { entries: vec![RegularSendEntry { dst, amount: Money { - token_id: TokenId::Ziesha, + token_id: ContractId::Ziesha, amount: amnt, }, }], diff --git a/src/core/mod.rs b/src/core/mod.rs index c0108c84..e5821a4b 100644 --- a/src/core/mod.rs +++ b/src/core/mod.rs @@ -13,7 +13,9 @@ use thiserror::Error; pub use money::Amount; pub use money::Decimal; -pub use transaction::{Money, Ratio}; +pub use transaction::Ratio; + +pub type Money = transaction::Money; pub type Hasher = hash::Sha3Hasher; pub type Signer = crypto::ed25519::Ed25519; @@ -32,7 +34,7 @@ pub type Undelegation = address::Undelegation; pub type Signature = address::Signature; pub type Transaction = transaction::Transaction; pub type TransactionData = transaction::TransactionData; -pub type RegularSendEntry = transaction::RegularSendEntry; +pub type RegularSendEntry = transaction::RegularSendEntry; pub type ContractAccount = transaction::ContractAccount; pub type ContractUpdate = transaction::ContractUpdate; pub type ContractUpdateData = transaction::ContractUpdateData; @@ -48,13 +50,11 @@ pub type MpnTransaction = zk::MpnTransaction; pub type Header = header::Header; pub type ValidatorProof = header::ValidatorProof; pub type Block = blocks::Block; -pub type TokenId = transaction::TokenId; -pub type ParseTokenIdError = transaction::ParseTokenIdError; -pub type TokenUpdate = transaction::TokenUpdate; pub type Token = transaction::Token; pub type ProofOfStake = header::ProofOfStake; pub type ContractId = transaction::ContractId; +pub type ParseContractIdError = transaction::ParseContractIdError; pub type TransactionAndDelta = transaction::TransactionAndDelta; diff --git a/src/core/transaction.rs b/src/core/transaction.rs index 7a9a985a..6e917ee4 100644 --- a/src/core/transaction.rs +++ b/src/core/transaction.rs @@ -51,70 +51,37 @@ impl FromStr for UndelegationId { } } -#[derive( - serde::Serialize, - serde::Deserialize, - PartialEq, - Debug, - Clone, - Copy, - Eq, - std::hash::Hash, - Default, -)] -pub struct ContractId(H::Output); - #[derive(Error, Debug)] pub enum ParseContractIdError { #[error("contract-id invalid")] Invalid, } -impl ContractId { - pub fn new(tx: &Transaction) -> Self { - Self(tx.hash()) - } -} - -impl std::fmt::Display for ContractId { - fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { - write!(f, "{}", hex::encode(self.0)) - } -} - -#[derive(Error, Debug)] -pub enum ParseTokenIdError { - #[error("token-id invalid")] - Invalid, -} - #[derive(serde::Serialize, serde::Deserialize, PartialEq, Debug, Clone, Copy, Hash, Eq)] -pub enum TokenId { - Null, +pub enum ContractId { + Null(std::marker::PhantomData), Ziesha, Custom(ZkScalar), } -impl Default for TokenId { +impl Default for ContractId { fn default() -> Self { - Self::Null + Self::Null(std::marker::PhantomData) } } -impl TokenId { - pub fn new( - tx: &Transaction, - ) -> Self { +impl ContractId { + pub fn new(tx: &Transaction) -> Self { Self::Custom(crate::zk::hash_to_scalar(&bincode::serialize(&tx).unwrap())) } } #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, Copy, PartialEq, Eq, Default)] -pub struct Money { - pub token_id: TokenId, +pub struct Money { + pub token_id: ContractId, pub amount: Amount, } -impl Money { - pub fn new(token_id: TokenId, amount: u64) -> Self { +impl Money { + pub fn new(token_id: ContractId, amount: u64) -> Self { Self { token_id, amount: Amount(amount), @@ -122,16 +89,16 @@ impl Money { } pub fn ziesha(amount: u64) -> Self { Self { - token_id: TokenId::Ziesha, + token_id: ContractId::Ziesha, amount: Amount(amount), } } } -impl From for TokenId { +impl From for ContractId { fn from(val: ZkScalar) -> Self { if val == ZkScalar::ZERO { - Self::Null + Self::Null(std::marker::PhantomData) } else if val == ZkScalar::ONE { Self::Ziesha } else { @@ -140,24 +107,24 @@ impl From for TokenId { } } -impl std::fmt::Display for TokenId { +impl std::fmt::Display for ContractId { fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { match self { - TokenId::Null => { + ContractId::Null(_) => { write!(f, "Null") } - TokenId::Ziesha => { + ContractId::Ziesha => { write!(f, "Ziesha") } - TokenId::Custom(id) => { + ContractId::Custom(id) => { write!(f, "{}", id) } } } } -impl FromStr for TokenId { - type Err = ParseTokenIdError; +impl FromStr for ContractId { + type Err = ParseContractIdError; fn from_str(s: &str) -> Result { if s == "Ziesha" { Ok(Self::Ziesha) @@ -168,15 +135,6 @@ impl FromStr for TokenId { } } -impl FromStr for ContractId { - type Err = ParseContractIdError; - fn from_str(s: &str) -> Result { - let bytes = hex::decode(s).map_err(|_| ParseContractIdError::Invalid)?; - let hash_output = H::Output::try_from(bytes).map_err(|_| ParseContractIdError::Invalid)?; - Ok(Self(hash_output)) - } -} - #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq, Default)] pub struct ContractDeposit { pub memo: String, @@ -184,8 +142,8 @@ pub struct ContractDeposit { pub deposit_circuit_id: u32, pub calldata: ZkScalar, pub src: S::Pub, - pub amount: Money, - pub fee: Money, + pub amount: Money, + pub fee: Money, pub nonce: u32, pub sig: Option, } @@ -197,8 +155,8 @@ pub struct ContractWithdraw { pub withdraw_circuit_id: u32, pub calldata: ZkScalar, pub dst: S::Pub, - pub amount: Money, // Amount sent from contract to dst - pub fee: Money, // Executor fee, paid by contract + pub amount: Money, // Amount sent from contract to dst + pub fee: Money, // Executor fee, paid by contract } #[derive(serde::Serialize, serde::Deserialize, Clone, Debug, Default)] @@ -270,7 +228,7 @@ pub enum ContractUpdateData { }, // Proof for FunctionCallCircuits[function_id](curr_state, next_state) FunctionCall { - fee: Money, // Executor fee + fee: Money, // Executor fee }, Mint { amount: Amount, @@ -288,9 +246,9 @@ pub struct ContractUpdate { } #[derive(serde::Serialize, serde::Deserialize, PartialEq, Eq, Debug, Clone)] -pub struct RegularSendEntry { +pub struct RegularSendEntry { pub dst: S::Pub, - pub amount: Money, + pub amount: Money, } #[derive(serde::Serialize, serde::Deserialize, PartialEq, Eq, Debug, Clone)] @@ -322,12 +280,6 @@ impl Token { } } -#[derive(serde::Serialize, serde::Deserialize, PartialEq, Eq, Debug, Clone)] -pub enum TokenUpdate { - Mint { amount: Amount }, - ChangeMinter { minter: S::Pub }, -} - #[derive( serde::Serialize, serde::Deserialize, PartialEq, Eq, Debug, Clone, Copy, PartialOrd, Ord, )] @@ -377,13 +329,13 @@ pub enum TransactionData>, + entries: Vec>, }, // Create a Zero-Contract. The creator can consider multiple ways (Circuits) of updating // the state. But there should be only one circuit for entering and exiting the contract. CreateContract { contract: ZkContract, - money: Money, + money: Money, state: Option, // Removable for space efficiency, not considered inside signature! }, // Collection of contract updates @@ -392,13 +344,6 @@ pub enum TransactionData>, delta: Option, // Removable for space efficiency, not considered inside signature! }, - CreateToken { - token: Token, - }, - UpdateToken { - token_id: TokenId, - update: TokenUpdate, - }, } #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] @@ -406,7 +351,7 @@ pub struct Transaction pub src: Option, // None is reward treasury! pub nonce: u32, pub data: TransactionData, - pub fee: Money, + pub fee: Money, pub memo: String, pub sig: Signature, } diff --git a/src/db/keys.rs b/src/db/keys.rs index 08759adc..64db0414 100644 --- a/src/db/keys.rs +++ b/src/db/keys.rs @@ -1,5 +1,5 @@ use super::*; -use crate::core::{Address, ContractId, MpnAddress, TokenId, UndelegationId}; +use crate::core::{Address, ContractId, MpnAddress, UndelegationId}; use crate::zk::ZkDataLocator; use thiserror::Error; @@ -255,7 +255,7 @@ pub fn delegate(delegator: &Address, delegatee: &Address) -> StringKey { format!("DEL-{}-{}", delegator, delegatee).into() } -pub fn account_balance(address: &Address, token_id: TokenId) -> StringKey { +pub fn account_balance(address: &Address, token_id: ContractId) -> StringKey { format!("ACB-{}-{}", address, token_id).into() } @@ -263,7 +263,7 @@ pub fn contract_account(contract_id: &ContractId) -> StringKey { format!("CAC-{}", contract_id).into() } -pub fn contract_balance(contract_id: &ContractId, token_id: TokenId) -> StringKey { +pub fn contract_balance(contract_id: &ContractId, token_id: ContractId) -> StringKey { format!("CAB-{}-{}", contract_id, token_id).into() } @@ -271,7 +271,7 @@ pub fn contract(contract_id: &ContractId) -> StringKey { format!("CON-{}", contract_id).into() } -pub fn token(token_id: &TokenId) -> StringKey { +pub fn token(token_id: &ContractId) -> StringKey { format!("TKN-{}", token_id).into() } diff --git a/src/mpn/circuits/test.rs b/src/mpn/circuits/test.rs index 807ea705..6583cf9f 100644 --- a/src/mpn/circuits/test.rs +++ b/src/mpn/circuits/test.rs @@ -1,5 +1,5 @@ use super::*; -use crate::core::{ContractDeposit, ContractWithdraw, Money, TokenId, ZkHasher as CoreZkHasher}; +use crate::core::{ContractDeposit, ContractId, ContractWithdraw, Money, ZkHasher as CoreZkHasher}; use crate::zk::{ StateManagerError, ZkDataLocator, ZkDeltaPairs, ZkScalar, ZkStateBuilder, ZkStateModel, }; @@ -126,7 +126,7 @@ fn test_empty_update_circuit() { state: ZkScalar::from(123), aux_data: aux, next_state: ZkScalar::from(123), - fee_token: TokenId::Ziesha, + fee_token: ContractId::Ziesha, transitions: vec![UpdateTransition::null(3, 3); 4], }; diff --git a/src/mpn/circuits/update_circuit.rs b/src/mpn/circuits/update_circuit.rs index f9219121..0dc5971e 100644 --- a/src/mpn/circuits/update_circuit.rs +++ b/src/mpn/circuits/update_circuit.rs @@ -1,6 +1,6 @@ use super::{MpnCircuit, UpdateTransition}; -use crate::core::TokenId; +use crate::core::ContractId; use crate::zk::groth16::gadgets::{ common, common::Number, common::UnsignedInteger, eddsa, eddsa::AllocatedPoint, merkle, poseidon, BellmanFr, @@ -16,12 +16,12 @@ pub struct UpdateCircuit { pub log4_token_tree_size: u8, pub log4_update_batch_size: u8, - pub commitment: ZkScalar, // Public - pub height: u64, // Public - pub state: ZkScalar, // Public - pub aux_data: ZkScalar, // Public - pub next_state: ZkScalar, // Public - pub fee_token: TokenId, // Private + pub commitment: ZkScalar, // Public + pub height: u64, // Public + pub state: ZkScalar, // Public + pub aux_data: ZkScalar, // Public + pub next_state: ZkScalar, // Public + pub fee_token: ContractId, // Private pub transitions: Vec, // Secret :) } diff --git a/src/mpn/mod.rs b/src/mpn/mod.rs index 30a071b2..2a3f4281 100644 --- a/src/mpn/mod.rs +++ b/src/mpn/mod.rs @@ -6,7 +6,7 @@ pub mod withdraw; use crate::blockchain::{Blockchain, BlockchainError}; use crate::core::{ hash::Hash, Address, Amount, ContractId, ContractUpdate, ContractUpdateData, Hasher, Money, - MpnAddress, MpnDeposit, MpnWithdraw, Signature, TokenId, Transaction, TransactionAndDelta, + MpnAddress, MpnDeposit, MpnWithdraw, Signature, Transaction, TransactionAndDelta, TransactionData, }; use crate::db::{KvStore, KvStoreError, WriteOp}; @@ -153,7 +153,9 @@ impl MpnWorkPool { prover: self.solutions[&i].prover.clone(), }, MpnWorkData::Update(trans) => { - assert!(trans.iter().all(|t| t.tx.fee.token_id == TokenId::Ziesha)); + assert!(trans + .iter() + .all(|t| t.tx.fee.token_id == ContractId::Ziesha)); let fee_sum = trans .iter() .map(|t| Into::::into(t.tx.fee.amount)) @@ -161,7 +163,7 @@ impl MpnWorkPool { ContractUpdate { data: ContractUpdateData::FunctionCall { fee: Money { - token_id: TokenId::Ziesha, + token_id: ContractId::Ziesha, amount: fee_sum.into(), }, }, @@ -326,9 +328,10 @@ pub fn prepare_works>( - config.mpn_num_update_batches as u64 * u64::from(update_reward)) .into(); - let validator_balance = db.get_balance(validator_tx_builder.get_address(), TokenId::Ziesha)?; + let validator_balance = + db.get_balance(validator_tx_builder.get_address(), ContractId::Ziesha)?; mirror.database_mut().update(&[WriteOp::Put( - crate::db::keys::account_balance(&validator_tx_builder.get_address(), TokenId::Ziesha), + crate::db::keys::account_balance(&validator_tx_builder.get_address(), ContractId::Ziesha), (validator_balance + remaining_reward).into(), )])?; @@ -340,7 +343,7 @@ pub fn prepare_works>( validator_tx_builder.get_mpn_address(), validator_tx_builder_deposit_nonce + 1, Money { - token_id: TokenId::Ziesha, + token_id: ContractId::Ziesha, amount: remaining_reward, }, Money::ziesha(0), @@ -394,7 +397,7 @@ pub fn prepare_works>( config.log4_tree_size, config.log4_token_tree_size, config.log4_update_batch_size, - TokenId::Ziesha, + ContractId::Ziesha, &mut mirror, &updates, &mut new_account_indices, diff --git a/src/mpn/update.rs b/src/mpn/update.rs index f4ad6a88..5833532f 100644 --- a/src/mpn/update.rs +++ b/src/mpn/update.rs @@ -1,6 +1,6 @@ use super::*; use crate::blockchain::{Blockchain, BlockchainError}; -use crate::core::{ContractId, TokenId, ZkHasher}; +use crate::core::{ContractId, ZkHasher}; use crate::db::{keys, KvStore, WriteOp}; use crate::zk::{KvStoreStateManager, ZkCompressedState, ZkDataLocator, ZkScalar}; use rayon::prelude::*; @@ -10,7 +10,7 @@ pub fn update>( mpn_log4_account_capacity: u8, log4_token_tree_size: u8, log4_batch_size: u8, - fee_token: TokenId, + fee_token: ContractId, db: &mut B, txs: &[MpnTransaction], new_account_indices: &mut HashMap, diff --git a/src/mpn/withdraw.rs b/src/mpn/withdraw.rs index 8617e429..220949a2 100644 --- a/src/mpn/withdraw.rs +++ b/src/mpn/withdraw.rs @@ -297,7 +297,7 @@ mod tests { 1, Money { amount: Amount(10056), - token_id: TokenId::Custom(123.into()), + token_id: ContractId::Custom(123.into()), }, Money::ziesha(0), ); @@ -326,11 +326,11 @@ mod tests { 1, Money { amount: Amount(30), - token_id: TokenId::Custom(123.into()), + token_id: ContractId::Custom(123.into()), }, Money { amount: Amount(26), - token_id: TokenId::Custom(123.into()), + token_id: ContractId::Custom(123.into()), }, abc.get_address(), ); diff --git a/src/node/api/get_balance.rs b/src/node/api/get_balance.rs index a6d0fe12..ef3b407c 100644 --- a/src/node/api/get_balance.rs +++ b/src/node/api/get_balance.rs @@ -1,7 +1,7 @@ use super::messages::{GetBalanceRequest, GetBalanceResponse}; use super::{NodeContext, NodeError}; use crate::blockchain::Blockchain; -use crate::core::TokenId; +use crate::core::ContractId; use crate::db::KvStore; use std::sync::Arc; use tokio::sync::RwLock; @@ -11,7 +11,7 @@ pub async fn get_balance>( req: GetBalanceRequest, ) -> Result { let context = context.read().await; - let token_id: TokenId = req.token_id.parse()?; + let token_id: ContractId = req.token_id.parse()?; let tkn = context .blockchain .get_token(token_id)? @@ -71,8 +71,8 @@ mod tests { .await; assert!(matches!( resp, - Err(NodeError::TokenIdParseError( - crate::core::ParseTokenIdError::Invalid + Err(NodeError::ContractIdParseError( + crate::core::ParseContractIdError::Invalid )) )); } diff --git a/src/node/api/get_explorer_blocks.rs b/src/node/api/get_explorer_blocks.rs index 59684603..991345b8 100644 --- a/src/node/api/get_explorer_blocks.rs +++ b/src/node/api/get_explorer_blocks.rs @@ -26,7 +26,7 @@ mod tests { #[tokio::test] async fn test_get_explorer_blocks_format() { - let expected = "[ExplorerBlock { header: ExplorerHeader { parent_hash: \"0000000000000000000000000000000000000000000000000000000000000000\", number: 0, block_root: \"0000000000000000000000000000000000000000000000000000000000000000\", proof_of_stake: ExplorerProofOfStake { timestamp: 0, validator: \"ed0000000000000000000000000000000000000000000000000000000000000000\" } }, body: [ExplorerTransaction { memo: \"Happy Birthday Ziesha!\", src: None, nonce: 0, data: CreateToken { token: ExplorerToken { name: \"Ziesha\", symbol: \"ZSH\", supply: 2000000000000000000, minter: None } }, fee: ExplorerMoney { amount: 0, token_id: \"Ziesha\" }, sig: \"\" }, ExplorerTransaction { memo: \"A Payment-Network to rule them all!\", src: None, nonce: 0, data: CreateContract { contract: ExplorerContract { initial_state: ExplorerCompressedState { state: ZkCompressedState { state_hash: ZkScalar(0x501a18871f186db1437e77e2c33acfa81405608cc60806399347215dbe98f714), state_size: 0 } }, state_model: ExplorerStateModel { state_model: List { log4_size: 30, item_type: Struct { field_types: [Scalar, Scalar, Scalar, Scalar, List { log4_size: 1, item_type: Struct { field_types: [Scalar, Scalar] } }] } } }, deposit_functions: [ExplorerMultiInputVerifierKey { verifier_key: ExplorerVerifierKey { vk: Dummy }, log4_payment_capacity: 1 }], withdraw_functions: [ExplorerMultiInputVerifierKey { verifier_key: ExplorerVerifierKey { vk: Dummy }, log4_payment_capacity: 1 }], functions: [ExplorerSingleInputVerifierKey { verifier_key: ExplorerVerifierKey { vk: Dummy } }] }, state: Some(ExplorerDataPairs { data: {} }), money: ExplorerMoney { amount: 0, token_id: \"Ziesha\" } }, fee: ExplorerMoney { amount: 0, token_id: \"Ziesha\" }, sig: \"\" }, ExplorerTransaction { memo: \"Dummy tx\", src: None, nonce: 0, data: RegularSend { entries: [(\"ed8c19c6a4cf1460e961f7bae8eea54d437b9edac27cbeb09be32ae367adf9098a\", ExplorerMoney { amount: 10000, token_id: \"Ziesha\" })] }, fee: ExplorerMoney { amount: 0, token_id: \"Ziesha\" }, sig: \"\" }, ExplorerTransaction { memo: \"\", src: None, nonce: 0, data: RegularSend { entries: [(\"ed379d481f1e818af8c5c10f7488f5765c2a87bd10c01699b2309dbc9ab81efe21\", ExplorerMoney { amount: 100, token_id: \"Ziesha\" })] }, fee: ExplorerMoney { amount: 0, token_id: \"Ziesha\" }, sig: \"\" }, ExplorerTransaction { memo: \"Test validator\", src: Some(\"ed062ef0fde01e8544dad7e8c6541c04122e1d70e6b5e89f128a0cfbff617f7cb3\"), nonce: 0, data: UpdateStaker { vrf_pub_key: \"0c8b08e1af55ac2907f2b18d3bfb11ffa9feb21b8a782ce236bbefd769d09532\", commission: 0.047058823529411764 }, fee: ExplorerMoney { amount: 0, token_id: \"Ziesha\" }, sig: \"\" }, ExplorerTransaction { memo: \"\", src: Some(\"ed379d481f1e818af8c5c10f7488f5765c2a87bd10c01699b2309dbc9ab81efe21\"), nonce: 0, data: Delegate { to: \"ed062ef0fde01e8544dad7e8c6541c04122e1d70e6b5e89f128a0cfbff617f7cb3\", amount: 25 }, fee: ExplorerMoney { amount: 0, token_id: \"Ziesha\" }, sig: \"\" }, ExplorerTransaction { memo: \"Test validator\", src: Some(\"ed6e95016e0a3d299a6e761921da491da1f27189e8a340dfae212daa629853357b\"), nonce: 0, data: UpdateStaker { vrf_pub_key: \"b4d9ae5e4152bc7efc2aac9c17042282e11042d9879df3d98caab368b642f15c\", commission: 0.047058823529411764 }, fee: ExplorerMoney { amount: 0, token_id: \"Ziesha\" }, sig: \"\" }, ExplorerTransaction { memo: \"\", src: Some(\"ed379d481f1e818af8c5c10f7488f5765c2a87bd10c01699b2309dbc9ab81efe21\"), nonce: 0, data: Delegate { to: \"ed6e95016e0a3d299a6e761921da491da1f27189e8a340dfae212daa629853357b\", amount: 25 }, fee: ExplorerMoney { amount: 0, token_id: \"Ziesha\" }, sig: \"\" }, ExplorerTransaction { memo: \"Test validator\", src: Some(\"ed2a141799ef60019f6254aaffc57ffd9b693b8ea4156a4c08965e42cfec26dc6b\"), nonce: 0, data: UpdateStaker { vrf_pub_key: \"5c85a1ae211a922515629683725a1e244be0061a778f15d80b89b6008546f952\", commission: 0.047058823529411764 }, fee: ExplorerMoney { amount: 0, token_id: \"Ziesha\" }, sig: \"\" }, ExplorerTransaction { memo: \"\", src: Some(\"ed379d481f1e818af8c5c10f7488f5765c2a87bd10c01699b2309dbc9ab81efe21\"), nonce: 0, data: Delegate { to: \"ed2a141799ef60019f6254aaffc57ffd9b693b8ea4156a4c08965e42cfec26dc6b\", amount: 25 }, fee: ExplorerMoney { amount: 0, token_id: \"Ziesha\" }, sig: \"\" }] }, ExplorerBlock { header: ExplorerHeader { parent_hash: \"75d45c92c322b300d6ff6fc2fb22323dc3cb1fdc8655e4ed94cca66c8114f4ad\", number: 1, block_root: \"75d45c92c322b300d6ff6fc2fb22323dc3cb1fdc8655e4ed94cca66c8114f4ad\", proof_of_stake: ExplorerProofOfStake { timestamp: 30, validator: \"ed062ef0fde01e8544dad7e8c6541c04122e1d70e6b5e89f128a0cfbff617f7cb3\" } }, body: [] }]"; + let expected = "[ExplorerBlock { header: ExplorerHeader { parent_hash: \"0000000000000000000000000000000000000000000000000000000000000000\", number: 0, block_root: \"0000000000000000000000000000000000000000000000000000000000000000\", proof_of_stake: ExplorerProofOfStake { timestamp: 0, validator: \"ed0000000000000000000000000000000000000000000000000000000000000000\" } }, body: [ExplorerTransaction { memo: \"Happy Birthday Ziesha!\", src: None, nonce: 0, data: CreateContract { contract: ExplorerContract { initial_state: ExplorerCompressedState { state: ZkCompressedState { state_hash: ZkScalar(0x0000000000000000000000000000000000000000000000000000000000000000), state_size: 0 } }, state_model: ExplorerStateModel { state_model: Scalar }, deposit_functions: [], withdraw_functions: [], functions: [] }, state: Some(ExplorerDataPairs { data: {} }), money: ExplorerMoney { amount: 0, token_id: \"Ziesha\" } }, fee: ExplorerMoney { amount: 0, token_id: \"Ziesha\" }, sig: \"\" }, ExplorerTransaction { memo: \"A Payment-Network to rule them all!\", src: None, nonce: 0, data: CreateContract { contract: ExplorerContract { initial_state: ExplorerCompressedState { state: ZkCompressedState { state_hash: ZkScalar(0x501a18871f186db1437e77e2c33acfa81405608cc60806399347215dbe98f714), state_size: 0 } }, state_model: ExplorerStateModel { state_model: List { log4_size: 30, item_type: Struct { field_types: [Scalar, Scalar, Scalar, Scalar, List { log4_size: 1, item_type: Struct { field_types: [Scalar, Scalar] } }] } } }, deposit_functions: [ExplorerMultiInputVerifierKey { verifier_key: ExplorerVerifierKey { vk: Dummy }, log4_payment_capacity: 1 }], withdraw_functions: [ExplorerMultiInputVerifierKey { verifier_key: ExplorerVerifierKey { vk: Dummy }, log4_payment_capacity: 1 }], functions: [ExplorerSingleInputVerifierKey { verifier_key: ExplorerVerifierKey { vk: Dummy } }] }, state: Some(ExplorerDataPairs { data: {} }), money: ExplorerMoney { amount: 0, token_id: \"Ziesha\" } }, fee: ExplorerMoney { amount: 0, token_id: \"Ziesha\" }, sig: \"\" }, ExplorerTransaction { memo: \"Dummy tx\", src: None, nonce: 0, data: RegularSend { entries: [(\"ed8c19c6a4cf1460e961f7bae8eea54d437b9edac27cbeb09be32ae367adf9098a\", ExplorerMoney { amount: 10000, token_id: \"Ziesha\" })] }, fee: ExplorerMoney { amount: 0, token_id: \"Ziesha\" }, sig: \"\" }, ExplorerTransaction { memo: \"\", src: None, nonce: 0, data: RegularSend { entries: [(\"ed379d481f1e818af8c5c10f7488f5765c2a87bd10c01699b2309dbc9ab81efe21\", ExplorerMoney { amount: 100, token_id: \"Ziesha\" })] }, fee: ExplorerMoney { amount: 0, token_id: \"Ziesha\" }, sig: \"\" }, ExplorerTransaction { memo: \"Test validator\", src: Some(\"ed062ef0fde01e8544dad7e8c6541c04122e1d70e6b5e89f128a0cfbff617f7cb3\"), nonce: 0, data: UpdateStaker { vrf_pub_key: \"0c8b08e1af55ac2907f2b18d3bfb11ffa9feb21b8a782ce236bbefd769d09532\", commission: 0.047058823529411764 }, fee: ExplorerMoney { amount: 0, token_id: \"Ziesha\" }, sig: \"\" }, ExplorerTransaction { memo: \"\", src: Some(\"ed379d481f1e818af8c5c10f7488f5765c2a87bd10c01699b2309dbc9ab81efe21\"), nonce: 0, data: Delegate { to: \"ed062ef0fde01e8544dad7e8c6541c04122e1d70e6b5e89f128a0cfbff617f7cb3\", amount: 25 }, fee: ExplorerMoney { amount: 0, token_id: \"Ziesha\" }, sig: \"\" }, ExplorerTransaction { memo: \"Test validator\", src: Some(\"ed6e95016e0a3d299a6e761921da491da1f27189e8a340dfae212daa629853357b\"), nonce: 0, data: UpdateStaker { vrf_pub_key: \"b4d9ae5e4152bc7efc2aac9c17042282e11042d9879df3d98caab368b642f15c\", commission: 0.047058823529411764 }, fee: ExplorerMoney { amount: 0, token_id: \"Ziesha\" }, sig: \"\" }, ExplorerTransaction { memo: \"\", src: Some(\"ed379d481f1e818af8c5c10f7488f5765c2a87bd10c01699b2309dbc9ab81efe21\"), nonce: 0, data: Delegate { to: \"ed6e95016e0a3d299a6e761921da491da1f27189e8a340dfae212daa629853357b\", amount: 25 }, fee: ExplorerMoney { amount: 0, token_id: \"Ziesha\" }, sig: \"\" }, ExplorerTransaction { memo: \"Test validator\", src: Some(\"ed2a141799ef60019f6254aaffc57ffd9b693b8ea4156a4c08965e42cfec26dc6b\"), nonce: 0, data: UpdateStaker { vrf_pub_key: \"5c85a1ae211a922515629683725a1e244be0061a778f15d80b89b6008546f952\", commission: 0.047058823529411764 }, fee: ExplorerMoney { amount: 0, token_id: \"Ziesha\" }, sig: \"\" }, ExplorerTransaction { memo: \"\", src: Some(\"ed379d481f1e818af8c5c10f7488f5765c2a87bd10c01699b2309dbc9ab81efe21\"), nonce: 0, data: Delegate { to: \"ed2a141799ef60019f6254aaffc57ffd9b693b8ea4156a4c08965e42cfec26dc6b\", amount: 25 }, fee: ExplorerMoney { amount: 0, token_id: \"Ziesha\" }, sig: \"\" }] }, ExplorerBlock { header: ExplorerHeader { parent_hash: \"75d45c92c322b300d6ff6fc2fb22323dc3cb1fdc8655e4ed94cca66c8114f4ad\", number: 1, block_root: \"75d45c92c322b300d6ff6fc2fb22323dc3cb1fdc8655e4ed94cca66c8114f4ad\", proof_of_stake: ExplorerProofOfStake { timestamp: 30, validator: \"ed062ef0fde01e8544dad7e8c6541c04122e1d70e6b5e89f128a0cfbff617f7cb3\" } }, body: [] }]"; let ctx = test_context(); let blocks = get_explorer_blocks(ctx.clone(), GetExplorerBlocksRequest { since: 0, count: 2 }) diff --git a/src/node/heartbeat/log_info.rs b/src/node/heartbeat/log_info.rs index da2eda77..8fac3a7f 100644 --- a/src/node/heartbeat/log_info.rs +++ b/src/node/heartbeat/log_info.rs @@ -19,11 +19,11 @@ pub async fn log_info>( let wallet_addr = ctx.validator_wallet.get_address(); let tkn = ctx .blockchain - .get_token(crate::core::TokenId::Ziesha)? + .get_token(crate::core::ContractId::Ziesha)? .unwrap(); let balance = ctx .blockchain - .get_balance(wallet_addr, crate::core::TokenId::Ziesha)?; + .get_balance(wallet_addr, crate::core::ContractId::Ziesha)?; inf.push(("Balance", balance.display_by_decimals(tkn.decimals))); println!( diff --git a/src/wallet/mod.rs b/src/wallet/mod.rs index e372e150..ed8651d6 100644 --- a/src/wallet/mod.rs +++ b/src/wallet/mod.rs @@ -1,7 +1,7 @@ mod tx_builder; pub use tx_builder::TxBuilder; -use crate::core::{GeneralTransaction, NonceGroup, TokenId}; +use crate::core::{ContractId, GeneralTransaction, NonceGroup}; use bip39::Mnemonic; use rand_core_mnemonic::{CryptoRng, RngCore}; @@ -89,7 +89,7 @@ impl WalletCollection { pub struct Wallet { pub mnemonic: Mnemonic, pub wallet_type: WalletType, - pub tokens: Vec, + pub tokens: Vec, pub txs: HashMap>, } @@ -97,7 +97,7 @@ impl Wallet { pub fn new(wallet_type: WalletType, mnemonic: Mnemonic) -> Self { Self { txs: HashMap::new(), - tokens: vec![TokenId::Ziesha], + tokens: vec![ContractId::Ziesha], wallet_type, mnemonic, } @@ -108,12 +108,12 @@ impl Wallet { pub fn tx_builder(&self) -> TxBuilder { TxBuilder::new(&self.seed()) } - pub fn add_token(&mut self, token_id: TokenId) { + pub fn add_token(&mut self, token_id: ContractId) { if !self.tokens.contains(&token_id) { self.tokens.push(token_id); } } - pub fn get_tokens(&self) -> &[TokenId] { + pub fn get_tokens(&self) -> &[ContractId] { &self.tokens } pub fn reset(&mut self) { diff --git a/src/wallet/tx_builder.rs b/src/wallet/tx_builder.rs index 918e2c72..39d940a3 100644 --- a/src/wallet/tx_builder.rs +++ b/src/wallet/tx_builder.rs @@ -4,7 +4,7 @@ use crate::client::{messages::ValidatorClaim, PeerAddress}; use crate::core::{ hash::Hash, Address, Amount, ContractDeposit, ContractId, ContractWithdraw, Hasher, Money, MpnAddress, MpnDeposit, MpnWithdraw, Ratio, RegularSendEntry, Signature, Signer, Token, - TokenId, Transaction, TransactionAndDelta, TransactionData, ValidatorProof, Vrf, ZkSigner, + Transaction, TransactionAndDelta, TransactionData, ValidatorProof, Vrf, ZkSigner, }; use crate::crypto::SignatureScheme; use crate::crypto::VerifiableRandomFunction; @@ -221,18 +221,32 @@ impl TxBuilder { minter: Option
, fee: Money, nonce: u32, - ) -> (TransactionAndDelta, TokenId) { + ) -> (TransactionAndDelta, ContractId) { let mut tx = Transaction { memo, src: Some(self.get_address()), - data: TransactionData::CreateToken { - token: Token { - name, - symbol, - minter, - supply, - decimals, + data: TransactionData::CreateContract { + contract: zk::ZkContract { + token: Some(zk::ZkTokenContract { + token: Token { + name, + symbol, + minter, + supply, + decimals, + }, + mint_functions: vec![], + }), + state_model: zk::ZkStateModel::Scalar, + initial_state: zk::ZkCompressedState::empty::( + zk::ZkStateModel::Scalar, + ), + deposit_functions: vec![], + withdraw_functions: vec![], + functions: vec![], }, + state: Some(Default::default()), + money: Money::ziesha(0), }, nonce, fee, @@ -240,7 +254,7 @@ impl TxBuilder { }; self.sign_tx(&mut tx); - let token_id = TokenId::new(&tx); + let token_id = ContractId::new(&tx); ( TransactionAndDelta { tx, diff --git a/src/zk/mod.rs b/src/zk/mod.rs index ed8e0152..1ff6642a 100644 --- a/src/zk/mod.rs +++ b/src/zk/mod.rs @@ -1,4 +1,4 @@ -use crate::core::{hash::Hash, Amount, Hasher, Money, Token, TokenId, ZkHasher as ZkMainHasher}; +use crate::core::{hash::Hash, Amount, ContractId, Hasher, Money, Token, ZkHasher as ZkMainHasher}; use crate::crypto::{jubjub, ZkSignatureScheme}; use ff::{Field, PrimeField}; @@ -95,7 +95,7 @@ impl MpnAccount { pub fn find_token_index( &self, log4_token_capacity: u8, - token_id: TokenId, + token_id: ContractId, empty_allowed: bool, ) -> Option { for (ind, money) in self.tokens.iter() { @@ -277,12 +277,12 @@ impl From for ZkScalar { } } -impl From for ZkScalar { - fn from(m: TokenId) -> Self { +impl From for ZkScalar { + fn from(m: ContractId) -> Self { match m { - TokenId::Null => Self::ZERO, - TokenId::Ziesha => Self::ONE, - TokenId::Custom(id) => id, + ContractId::Null(_) => Self::ZERO, + ContractId::Ziesha => Self::ONE, + ContractId::Custom(id) => id, } } } diff --git a/src/zk/state/mod.rs b/src/zk/state/mod.rs index 89ed8599..f3c6aa78 100644 --- a/src/zk/state/mod.rs +++ b/src/zk/state/mod.rs @@ -40,7 +40,7 @@ pub struct ZkStateBuilder { impl ZkStateBuilder { pub fn new(state_model: ZkStateModel) -> Self { let contract_id = ContractId::from_str( - "0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", ) .unwrap(); let mut db = RamKvStore::new(); diff --git a/src/zk/test/mod.rs b/src/zk/test/mod.rs index b92766bb..ca6dc74b 100644 --- a/src/zk/test/mod.rs +++ b/src/zk/test/mod.rs @@ -75,7 +75,7 @@ fn test_state_manager_scalar() -> Result<(), StateManagerError> { let mut db = RamKvStore::new(); let c0 = - ContractId::from_str("0000000000000000000000000000000000000000000000000000000000000000") + ContractId::from_str("0x0000000000000000000000000000000000000000000000000000000000000000") .unwrap(); db.update(&[WriteOp::Put( @@ -102,7 +102,7 @@ fn test_state_manager_struct() -> Result<(), StateManagerError> { let mut db = RamKvStore::new(); let c0 = - ContractId::from_str("0000000000000000000000000000000000000000000000000000000000000000") + ContractId::from_str("0x0000000000000000000000000000000000000000000000000000000000000000") .unwrap(); db.update(&[WriteOp::Put( @@ -179,7 +179,7 @@ fn test_state_manager_list() -> Result<(), StateManagerError> { let mut db = RamKvStore::new(); let c0 = - ContractId::from_str("0000000000000000000000000000000000000000000000000000000000000000") + ContractId::from_str("0x0000000000000000000000000000000000000000000000000000000000000000") .unwrap(); let mut roots = Vec::new();