From 33dc5a89597527102ef2b26fc2ed0cd73710aeb9 Mon Sep 17 00:00:00 2001 From: aggstam Date: Fri, 24 Feb 2023 00:06:17 +0200 Subject: [PATCH] faucetd: updated to only airdrop native token --- bin/faucetd/src/main.rs | 77 ++++++++++++++++++----------------------- 1 file changed, 34 insertions(+), 43 deletions(-) diff --git a/bin/faucetd/src/main.rs b/bin/faucetd/src/main.rs index 620bfe4a1..c13e880c1 100644 --- a/bin/faucetd/src/main.rs +++ b/bin/faucetd/src/main.rs @@ -32,15 +32,16 @@ use darkfi::{ }; use darkfi_money_contract::{ client::{ - build_transfer_tx, MONEY_KEYS_COL_IS_DEFAULT, MONEY_KEYS_COL_PUBLIC, MONEY_KEYS_COL_SECRET, - MONEY_KEYS_TABLE, MONEY_TREE_COL_TREE, MONEY_TREE_TABLE, + transfer_v1::TransferCallBuilder, MONEY_KEYS_COL_IS_DEFAULT, MONEY_KEYS_COL_PUBLIC, + MONEY_KEYS_COL_SECRET, MONEY_KEYS_TABLE, MONEY_TREE_COL_TREE, MONEY_TREE_TABLE, }, - MoneyFunction, MONEY_CONTRACT_ZKAS_BURN_NS_V1, MONEY_CONTRACT_ZKAS_MINT_NS_V1, + MoneyFunction::TransferV1 as MoneyTransfer, + MONEY_CONTRACT_ZKAS_BURN_NS_V1, MONEY_CONTRACT_ZKAS_MINT_NS_V1, }; use darkfi_sdk::{ crypto::{ constants::MERKLE_DEPTH, contract_id::MONEY_CONTRACT_ID, Keypair, MerkleNode, PublicKey, - TokenId, + DARK_TOKEN_ID, }, db::SMART_CONTRACT_ZKAS_DB_NAME, incrementalmerkletree::bridgetree::BridgeTree, @@ -354,21 +355,16 @@ impl Faucetd { } // RPCAPI: - // Processes an airdrop request and airdrops requested token and amount to address. + // Processes a native token airdrop request and airdrops requested amount to address. // Returns the transaction ID upon success. // Params: // 0: base58 encoded address of the recipient // 1: Amount to airdrop in form of f64 - // 2: base58 encoded token ID to airdrop // - // --> {"jsonrpc": "2.0", "method": "airdrop", "params": ["1DarkFi...", 1.42, "1F00b4r..."], "id": 1} + // --> {"jsonrpc": "2.0", "method": "airdrop", "params": ["1DarkFi...", 1.42], "id": 1} // <-- {"jsonrpc": "2.0", "result": "txID", "id": 1} async fn airdrop(&self, id: Value, params: &[Value]) -> JsonResult { - if params.len() != 3 || - !params[0].is_string() || - !params[1].is_f64() || - !params[2].is_string() - { + if params.len() != 2 || !params[0].is_string() || !params[1].is_f64() { return JsonError::new(InvalidParams, None, id).into() } @@ -398,16 +394,6 @@ impl Faucetd { return server_error(RpcError::AmountExceedsLimit, id) } - // Here we allow the faucet to mint arbitrary token IDs. - // TODO: Revert this to native token when we have contracts for minting tokens. - let token_id = match TokenId::try_from(params[2].as_str().unwrap()) { - Ok(v) => v, - Err(e) => { - error!("airdrop(): Failed parsing TokenID from string: {}", e); - return server_error(RpcError::ParseError, id) - } - }; - // Check if there as a previous airdrop and the timeout has passed. let now = Utc::now().timestamp(); let map = self.airdrop_map.lock().await; @@ -440,23 +426,28 @@ impl Faucetd { (mint_data.2.clone(), mint_data.1.clone(), burn_data.2.clone(), burn_data.1.clone()) }; - // Create money contract params and proofs - let (params, proofs, secret_keys, _spent_coins) = match build_transfer_tx( - &self.keypair, - &pubkey, - amount, - token_id, - pallas::Base::zero(), - pallas::Base::zero(), - pallas::Base::random(&mut OsRng), - &[], // <-- The faucet doesn't really have to pass OwnCoins I think - &self.merkle_tree, - &mint_zkbin, - &mint_pk, - &burn_zkbin, - &burn_pk, - true, - ) { + // Create money contract transfer params and proofs + let builder = TransferCallBuilder { + keypair: self.keypair, + recipient: pubkey, + value: amount, + token_id: *DARK_TOKEN_ID, + rcpt_spend_hook: pallas::Base::zero(), + rcpt_user_data: pallas::Base::zero(), + rcpt_user_data_blind: pallas::Base::random(&mut OsRng), + change_spend_hook: pallas::Base::zero(), + change_user_data: pallas::Base::zero(), + change_user_data_blind: pallas::Base::random(&mut OsRng), + coins: vec![], + tree: self.merkle_tree.clone(), + mint_zkbin, + mint_pk, + burn_zkbin, + burn_pk, + clear_input: true, + }; + + let debris = match builder.build() { Ok(v) => v, Err(e) => { error!("Failed to build transfer tx params: {}", e); @@ -465,12 +456,12 @@ impl Faucetd { }; // Build transaction - let mut data = vec![MoneyFunction::Transfer as u8]; - params.encode(&mut data).unwrap(); + let mut data = vec![MoneyTransfer as u8]; + debris.params.encode(&mut data).unwrap(); let calls = vec![ContractCall { contract_id: cid, data }]; - let proofs = vec![proofs]; + let proofs = vec![debris.proofs]; let mut tx = Transaction { calls, proofs, signatures: vec![] }; - let sigs = tx.create_sigs(&mut OsRng, &secret_keys).unwrap(); + let sigs = tx.create_sigs(&mut OsRng, &debris.signature_secrets).unwrap(); tx.signatures = vec![sigs]; // Safety check to see if the transaction is actually valid.