From 00e00cd577ac73e8cd161ea76bb78da2ad1540d9 Mon Sep 17 00:00:00 2001 From: therealyingtong Date: Tue, 17 Oct 2023 14:08:22 +0800 Subject: [PATCH] tx-examples::partial_fulfillment_token_swap: Fix example --- taiga_halo2/examples/tx_examples/main.rs | 4 +- .../partial_fulfillment_token_swap.rs | 506 ++++++++---------- .../vp_examples/partial_fulfillment_intent.rs | 12 +- .../partial_fulfillment_intent/data_static.rs | 24 +- .../partial_fulfillment_intent/swap.rs | 18 +- taiga_halo2/src/circuit/vp_examples/token.rs | 4 +- 6 files changed, 245 insertions(+), 323 deletions(-) diff --git a/taiga_halo2/examples/tx_examples/main.rs b/taiga_halo2/examples/tx_examples/main.rs index 873e5938..cbb805f9 100644 --- a/taiga_halo2/examples/tx_examples/main.rs +++ b/taiga_halo2/examples/tx_examples/main.rs @@ -13,8 +13,8 @@ fn main() { let tx = token_swap_with_intent::create_token_swap_intent_transaction(rng); tx.execute().unwrap(); - // let tx = partial_fulfillment_token_swap::create_token_swap_transaction(rng); - // tx.execute().unwrap(); + let tx = partial_fulfillment_token_swap::create_token_swap_transaction(rng); + tx.execute().unwrap(); let tx = cascaded_partial_transactions::create_transaction(rng); tx.execute().unwrap(); diff --git a/taiga_halo2/examples/tx_examples/partial_fulfillment_token_swap.rs b/taiga_halo2/examples/tx_examples/partial_fulfillment_token_swap.rs index 220d75b0..0bfbc74e 100644 --- a/taiga_halo2/examples/tx_examples/partial_fulfillment_token_swap.rs +++ b/taiga_halo2/examples/tx_examples/partial_fulfillment_token_swap.rs @@ -1,293 +1,213 @@ -// /// The token swap intent can be partially fulfilled. -// /// Alice has 2 "BTC" and wants 10 "ETH". Then Alice creates an intent for it. -// /// Bob has 5 "ETH" and wants 1 "BTC". -// /// The Solver/Bob can partially fulfill Alice's intent and return 1 "BTC" back to Alice. -// /// -// use crate::token::create_token_swap_ptx; -// use group::Group; -// use halo2_proofs::arithmetic::Field; -// use pasta_curves::{group::Curve, pallas}; -// use rand::{CryptoRng, RngCore}; -// use taiga_halo2::{ -// circuit::vp_examples::{ -// partial_fulfillment_intent::{ -// create_intent_note, PartialFulfillmentIntentValidityPredicateCircuit, -// }, -// signature_verification::COMPRESSED_TOKEN_AUTH_VK, -// token::{Token, TokenAuthorization}, -// }, -// constant::TAIGA_COMMITMENT_TREE_DEPTH, -// merkle_tree::{Anchor, MerklePath}, -// note::{InputNoteProvingInfo, Note, OutputNoteProvingInfo}, -// nullifier::{Nullifier, NullifierKeyContainer}, -// shielded_ptx::ShieldedPartialTransaction, -// transaction::{ShieldedPartialTxBundle, Transaction, TransparentPartialTxBundle}, -// }; - -// pub fn create_token_intent_ptx( -// mut rng: R, -// sell: Token, -// buy: Token, -// input_auth_sk: pallas::Scalar, -// input_nk: NullifierKeyContainer, // NullifierKeyContainer::Key -// ) -> ( -// ShieldedPartialTransaction, -// NullifierKeyContainer, -// pallas::Base, -// pallas::Base, -// Nullifier, -// ) { -// let input_auth = TokenAuthorization::from_sk_vk(&input_auth_sk, &COMPRESSED_TOKEN_AUTH_VK); - -// // input note -// let rho = Nullifier::from(pallas::Base::random(&mut rng)); -// let input_note = sell.create_random_token_note(&mut rng, rho, input_nk, &input_auth); - -// // output intent note -// let input_note_nk_com = input_note.get_nk_commitment(); -// let input_note_nf = input_note.get_nf().unwrap(); -// let intent_note = create_intent_note( -// &mut rng, -// &sell, -// &buy, -// input_note_nk_com, -// input_note.app_data_dynamic, -// input_note_nf, -// input_nk, -// ); - -// // padding the zero notes -// let padding_input_note = Note::random_padding_input_note(&mut rng); -// let padding_input_note_nf = padding_input_note.get_nf().unwrap(); -// let padding_output_note = Note::random_padding_output_note(&mut rng, padding_input_note_nf); - -// let input_notes = [*input_note.note(), padding_input_note]; -// let output_notes = [intent_note, padding_output_note]; - -// let merkle_path = MerklePath::random(&mut rng, TAIGA_COMMITMENT_TREE_DEPTH); - -// // Fetch a valid anchor for dummy notes -// let anchor = Anchor::from(pallas::Base::random(&mut rng)); - -// // Create the input note proving info -// let input_note_proving_info = input_note.generate_input_token_note_proving_info( -// &mut rng, -// input_auth, -// input_auth_sk, -// merkle_path.clone(), -// input_notes, -// output_notes, -// ); - -// // Create the intent note proving info -// let intent_note_proving_info = { -// let intent_vp = PartialFulfillmentIntentValidityPredicateCircuit { -// owned_note_pub_id: intent_note.commitment().inner(), -// input_notes, -// output_notes, -// sell: sell.clone(), -// buy, -// receiver_nk_com: input_note_nk_com, -// receiver_app_data_dynamic: input_note.app_data_dynamic, -// }; - -// OutputNoteProvingInfo::new(intent_note, Box::new(intent_vp), vec![]) -// }; - -// // Create the padding input note proving info -// let padding_input_note_proving_info = InputNoteProvingInfo::create_padding_note_proving_info( -// padding_input_note, -// merkle_path, -// anchor, -// input_notes, -// output_notes, -// ); - -// // Create the padding output note proving info -// let padding_output_note_proving_info = OutputNoteProvingInfo::create_padding_note_proving_info( -// padding_output_note, -// input_notes, -// output_notes, -// ); - -// // Create shielded partial tx -// let ptx = ShieldedPartialTransaction::build( -// [input_note_proving_info, padding_input_note_proving_info], -// [intent_note_proving_info, padding_output_note_proving_info], -// vec![], -// &mut rng, -// ); - -// ( -// ptx, -// input_nk, -// input_note_nk_com, -// input_note.app_data_dynamic, -// rho, -// ) -// } - -// #[allow(clippy::too_many_arguments)] -// pub fn consume_token_intent_ptx( -// mut rng: R, -// sell: Token, -// buy: Token, -// bought_note_value: u64, -// returned_note_value: u64, -// input_rho: Nullifier, -// input_nk: NullifierKeyContainer, // NullifierKeyContainer::Key -// receiver_nk_com: pallas::Base, -// receiver_app_data_dynamic: pallas::Base, -// output_auth_pk: pallas::Point, -// ) -> ShieldedPartialTransaction { -// // input intent note -// let intent_note = create_intent_note( -// &mut rng, -// &sell, -// &buy, -// receiver_nk_com, -// receiver_app_data_dynamic, -// input_rho, -// input_nk, -// ); - -// // output notes -// let input_note_nf = intent_note.get_nf().unwrap(); -// let output_auth = TokenAuthorization::new(output_auth_pk, *COMPRESSED_TOKEN_AUTH_VK); -// let bought_token = Token::new(buy.name().inner(), bought_note_value); -// let bought_note = -// bought_token.create_random_token_note(&mut rng, input_note_nf, input_nk, &output_auth); - -// // padding the zero note -// let padding_input_note = Note::random_padding_input_note(&mut rng); -// let padding_input_note_nf = padding_input_note.get_nf().unwrap(); -// let returned_token = Token::new(sell.name().inner(), returned_note_value); -// let returned_note = returned_token.create_random_token_note( -// &mut rng, -// padding_input_note_nf, -// input_nk, -// &output_auth, -// ); -// // let padding_output_note = Note::random_padding_input_note(&mut rng, padding_input_note_nf); - -// let input_notes = [intent_note, padding_input_note]; -// let output_notes = [*bought_note.note(), *returned_note.note()]; - -// let merkle_path = MerklePath::random(&mut rng, TAIGA_COMMITMENT_TREE_DEPTH); - -// // Fetch a valid anchor for dummy notes -// let anchor = Anchor::from(pallas::Base::random(&mut rng)); - -// // Create the intent note proving info -// let intent_note_proving_info = { -// let intent_vp = PartialFulfillmentIntentValidityPredicateCircuit { -// owned_note_pub_id: input_note_nf.inner(), -// input_notes, -// output_notes, -// sell: sell.clone(), -// buy: buy.clone(), -// receiver_nk_com, -// receiver_app_data_dynamic, -// }; - -// InputNoteProvingInfo::new( -// intent_note, -// merkle_path.clone(), -// Some(anchor), -// Box::new(intent_vp), -// vec![], -// ) -// }; - -// // Create the output note proving info -// let bought_note_proving_info = bought_note.generate_output_token_note_proving_info( -// &mut rng, -// output_auth, -// input_notes, -// output_notes, -// ); - -// // Create the padding input note proving info -// let padding_input_note_proving_info = InputNoteProvingInfo::create_padding_note_proving_info( -// padding_input_note, -// merkle_path, -// anchor, -// input_notes, -// output_notes, -// ); - -// // Create the returned note proving info -// let returned_note_proving_info = returned_note.generate_output_token_note_proving_info( -// &mut rng, -// output_auth, -// input_notes, -// output_notes, -// ); - -// // Create shielded partial tx -// ShieldedPartialTransaction::build( -// [intent_note_proving_info, padding_input_note_proving_info], -// [bought_note_proving_info, returned_note_proving_info], -// vec![], -// &mut rng, -// ) -// } - -// pub fn create_token_swap_transaction(mut rng: R) -> Transaction { -// let generator = pallas::Point::generator().to_affine(); - -// // Alice creates the partial transaction with 5 BTC input and intent output -// let alice_auth_sk = pallas::Scalar::random(&mut rng); -// let alice_auth_pk = generator * alice_auth_sk; -// let alice_nk = NullifierKeyContainer::random_key(&mut rng); -// let sell = Token::new("btc".to_string(), 2u64); -// let buy = Token::new("eth".to_string(), 10u64); -// let (alice_ptx, intent_nk, receiver_nk_com, receiver_app_data_dynamic, intent_rho) = -// create_token_intent_ptx(&mut rng, sell.clone(), buy.clone(), alice_auth_sk, alice_nk); - -// // Bob creates the partial transaction with 1 DOLPHIN input and 5 BTC output -// let bob_auth_sk = pallas::Scalar::random(&mut rng); -// let bob_auth_pk = generator * bob_auth_sk; -// let bob_nk = NullifierKeyContainer::random_key(&mut rng); -// let eth_token = Token::new("eth".to_string(), 5); -// let btc_token = Token::new("btc".to_string(), 1); - -// let bob_ptx = create_token_swap_ptx( -// &mut rng, -// eth_token, -// bob_auth_sk, -// bob_nk, -// btc_token, -// bob_auth_pk, -// bob_nk.to_commitment(), -// ); - -// // Solver/Bob creates the partial transaction to consume the intent note -// // The bob_ptx and solver_ptx can be merged to one ptx. -// let solver_ptx = consume_token_intent_ptx( -// &mut rng, -// sell, -// buy, -// 5u64, -// 1u64, -// intent_rho, -// intent_nk, -// receiver_nk_com, -// receiver_app_data_dynamic, -// alice_auth_pk, -// ); - -// // Solver creates the final transaction -// let shielded_tx_bundle = ShieldedPartialTxBundle::new(vec![alice_ptx, bob_ptx, solver_ptx]); -// let transparent_ptx_bundle = TransparentPartialTxBundle::default(); -// Transaction::build(&mut rng, shielded_tx_bundle, transparent_ptx_bundle) -// } - -// #[test] -// fn test_partial_fulfillment_token_swap_tx() { -// use rand::rngs::OsRng; - -// let mut rng = OsRng; -// let tx = create_token_swap_transaction(&mut rng); -// tx.execute().unwrap(); -// } +/// The token swap intent can be partially fulfilled. +/// Alice has 2 "BTC" and wants 10 "ETH". Then Alice creates an intent for it. +/// Bob has 5 "ETH" and wants 1 "BTC". +/// The Solver/Bob can partially fulfill Alice's intent and return 1 "BTC" back to Alice. +/// +use crate::token::create_token_swap_ptx; +use group::Group; +use halo2_proofs::arithmetic::Field; +use pasta_curves::{group::Curve, pallas}; +use rand::{CryptoRng, RngCore}; +use taiga_halo2::{ + circuit::vp_examples::{ + partial_fulfillment_intent::{PartialFulfillmentIntentValidityPredicateCircuit, Swap}, + signature_verification::COMPRESSED_TOKEN_AUTH_VK, + token::{Token, TokenAuthorization, TokenNote}, + }, + constant::TAIGA_COMMITMENT_TREE_DEPTH, + merkle_tree::{Anchor, MerklePath}, + note::{InputNoteProvingInfo, Note, OutputNoteProvingInfo}, + nullifier::NullifierKeyContainer, + shielded_ptx::ShieldedPartialTransaction, + transaction::{ShieldedPartialTxBundle, Transaction, TransparentPartialTxBundle}, +}; + +pub fn create_token_intent_ptx( + mut rng: R, + sell: Token, + buy: Token, + input_auth_sk: pallas::Scalar, +) -> (ShieldedPartialTransaction, Swap, Note) { + let input_auth = TokenAuthorization::from_sk_vk(&input_auth_sk, &COMPRESSED_TOKEN_AUTH_VK); + let swap = Swap::random(&mut rng, sell, buy, input_auth); + let intent_note = swap.create_intent_note(&mut rng); + + // padding the zero notes + let padding_input_note = Note::random_padding_input_note(&mut rng); + let padding_input_note_nf = padding_input_note.get_nf().unwrap(); + let padding_output_note = Note::random_padding_output_note(&mut rng, padding_input_note_nf); + + let input_notes = [*swap.sell.note(), padding_input_note]; + let output_notes = [intent_note, padding_output_note]; + + let merkle_path = MerklePath::random(&mut rng, TAIGA_COMMITMENT_TREE_DEPTH); + + // Fetch a valid anchor for dummy notes + let anchor = Anchor::from(pallas::Base::random(&mut rng)); + + // Create the input note proving info + let input_note_proving_info = swap.sell.generate_input_token_note_proving_info( + &mut rng, + input_auth, + input_auth_sk, + merkle_path.clone(), + input_notes, + output_notes, + ); + + // Create the intent note proving info + let intent_note_proving_info = { + let intent_vp = PartialFulfillmentIntentValidityPredicateCircuit { + owned_note_pub_id: intent_note.commitment().inner(), + input_notes, + output_notes, + swap: swap.clone(), + }; + + OutputNoteProvingInfo::new(intent_note, Box::new(intent_vp), vec![]) + }; + + // Create the padding input note proving info + let padding_input_note_proving_info = InputNoteProvingInfo::create_padding_note_proving_info( + padding_input_note, + merkle_path, + anchor, + input_notes, + output_notes, + ); + + // Create the padding output note proving info + let padding_output_note_proving_info = OutputNoteProvingInfo::create_padding_note_proving_info( + padding_output_note, + input_notes, + output_notes, + ); + + // Create shielded partial tx + let ptx = ShieldedPartialTransaction::build( + [input_note_proving_info, padding_input_note_proving_info], + [intent_note_proving_info, padding_output_note_proving_info], + vec![], + &mut rng, + ); + + (ptx, swap, intent_note) +} + +#[allow(clippy::too_many_arguments)] +pub fn consume_token_intent_ptx( + mut rng: R, + swap: Swap, + intent_note: Note, + offer: Token, + output_auth_pk: pallas::Point, +) -> ShieldedPartialTransaction { + let (input_notes, output_notes) = swap.fill(&mut rng, intent_note, offer); + let [intent_note, padding_input_note] = input_notes; + let [bought_note, returned_note] = output_notes; + + // output notes + let output_auth = TokenAuthorization::new(output_auth_pk, *COMPRESSED_TOKEN_AUTH_VK); + let merkle_path = MerklePath::random(&mut rng, TAIGA_COMMITMENT_TREE_DEPTH); + + // Fetch a valid anchor for dummy notes + let anchor = Anchor::from(pallas::Base::random(&mut rng)); + + // Create the intent note proving info + let intent_note_proving_info = { + let intent_vp = PartialFulfillmentIntentValidityPredicateCircuit { + owned_note_pub_id: intent_note.get_nf().unwrap().inner(), + input_notes, + output_notes, + swap: swap.clone(), + }; + + InputNoteProvingInfo::new( + intent_note, + merkle_path.clone(), + Some(anchor), + Box::new(intent_vp), + vec![], + ) + }; + + // Create the output note proving info + let bought_note_proving_info = TokenNote { + token_name: swap.buy.name().clone(), + note: bought_note, + } + .generate_output_token_note_proving_info(&mut rng, output_auth, input_notes, output_notes); + + // Create the padding input note proving info + let padding_input_note_proving_info = InputNoteProvingInfo::create_padding_note_proving_info( + padding_input_note, + merkle_path, + anchor, + input_notes, + output_notes, + ); + + // Create the returned note proving info + let returned_note_proving_info = TokenNote { + token_name: swap.sell.token_name().clone(), + note: returned_note, + } + .generate_output_token_note_proving_info(&mut rng, output_auth, input_notes, output_notes); + + // Create shielded partial tx + ShieldedPartialTransaction::build( + [intent_note_proving_info, padding_input_note_proving_info], + [bought_note_proving_info, returned_note_proving_info], + vec![], + &mut rng, + ) +} + +pub fn create_token_swap_transaction(mut rng: R) -> Transaction { + let generator = pallas::Point::generator().to_affine(); + + // Alice creates the partial transaction with: + // - 2 BTC sell + // - intent output encoding 10 ETH ask + let alice_auth_sk = pallas::Scalar::random(&mut rng); + let alice_auth_pk = generator * alice_auth_sk; + let sell = Token::new("btc".to_string(), 2u64); + let buy = Token::new("eth".to_string(), 10u64); + let (alice_ptx, swap, intent_note) = + create_token_intent_ptx(&mut rng, sell.clone(), buy.clone(), alice_auth_sk); + + // Bob creates the partial transaction with 1 DOLPHIN input and 5 BTC output + let bob_auth_sk = pallas::Scalar::random(&mut rng); + let bob_auth_pk = generator * bob_auth_sk; + let bob_nk = NullifierKeyContainer::random_key(&mut rng); + let offer = Token::new("eth".to_string(), 5); + let returned = Token::new("btc".to_string(), 1); + + let bob_ptx = create_token_swap_ptx( + &mut rng, + offer.clone(), + bob_auth_sk, + bob_nk, + returned, + bob_auth_pk, + bob_nk.to_commitment(), + ); + + // Solver/Bob creates the partial transaction to consume the intent note + // The bob_ptx and solver_ptx can be merged to one ptx. + let solver_ptx = consume_token_intent_ptx(&mut rng, swap, intent_note, offer, alice_auth_pk); + + // Solver creates the final transaction + let shielded_tx_bundle = ShieldedPartialTxBundle::new(vec![alice_ptx, bob_ptx, solver_ptx]); + let transparent_ptx_bundle = TransparentPartialTxBundle::default(); + Transaction::build(&mut rng, shielded_tx_bundle, transparent_ptx_bundle) +} + +#[test] +fn test_partial_fulfillment_token_swap_tx() { + use rand::rngs::OsRng; + + let mut rng = OsRng; + let tx = create_token_swap_transaction(&mut rng); + tx.execute().unwrap(); +} diff --git a/taiga_halo2/src/circuit/vp_examples/partial_fulfillment_intent.rs b/taiga_halo2/src/circuit/vp_examples/partial_fulfillment_intent.rs index fe51d251..682c0bcf 100644 --- a/taiga_halo2/src/circuit/vp_examples/partial_fulfillment_intent.rs +++ b/taiga_halo2/src/circuit/vp_examples/partial_fulfillment_intent.rs @@ -31,8 +31,8 @@ use pasta_curves::pallas; use rand::rngs::OsRng; use rand::RngCore; -mod swap; -use swap::Swap; +pub mod swap; +pub use swap::Swap; mod data_static; use data_static::PartialFulfillmentIntentDataStatic; @@ -50,7 +50,7 @@ pub struct PartialFulfillmentIntentValidityPredicateCircuit { pub owned_note_pub_id: pallas::Base, pub input_notes: [Note; NUM_NOTE], pub output_notes: [Note; NUM_NOTE], - swap: Swap, + pub swap: Swap, } impl ValidityPredicateCircuit for PartialFulfillmentIntentValidityPredicateCircuit { @@ -206,6 +206,8 @@ mod tests { #[test] fn create_intent() { + use crate::nullifier::Nullifier; + let mut rng = OsRng; let sell = Token::new("token1".to_string(), 2u64); let buy = Token::new("token2".to_string(), 4u64); @@ -214,8 +216,8 @@ mod tests { let intent_note = swap.create_intent_note(&mut rng); let input_padding_note = Note::random_padding_input_note(&mut rng); - let output_padding_note = - Note::random_padding_output_note(&mut rng, input_padding_note.get_nf().unwrap()); + let nf = Nullifier::random(&mut rng); + let output_padding_note = Note::random_padding_output_note(&mut rng, nf); let input_notes = [*swap.sell.note(), input_padding_note]; let output_notes = [intent_note, output_padding_note]; diff --git a/taiga_halo2/src/circuit/vp_examples/partial_fulfillment_intent/data_static.rs b/taiga_halo2/src/circuit/vp_examples/partial_fulfillment_intent/data_static.rs index 8d705a9b..f3b7e2bc 100644 --- a/taiga_halo2/src/circuit/vp_examples/partial_fulfillment_intent/data_static.rs +++ b/taiga_halo2/src/circuit/vp_examples/partial_fulfillment_intent/data_static.rs @@ -15,18 +15,18 @@ use halo2_proofs::{ use pasta_curves::pallas; #[derive(Clone, Debug)] -pub(super) struct PartialFulfillmentIntentDataStatic { - pub(super) token_vp_vk: AssignedCell, - pub(super) sold_token: AssignedCell, - pub(super) sold_token_value: AssignedCell, - pub(super) bought_token: AssignedCell, - pub(super) bought_token_value: AssignedCell, - pub(super) receiver_nk_com: AssignedCell, - pub(super) receiver_app_data_dynamic: AssignedCell, +pub struct PartialFulfillmentIntentDataStatic { + pub token_vp_vk: AssignedCell, + pub sold_token: AssignedCell, + pub sold_token_value: AssignedCell, + pub bought_token: AssignedCell, + pub bought_token_value: AssignedCell, + pub receiver_nk_com: AssignedCell, + pub receiver_app_data_dynamic: AssignedCell, } impl PartialFulfillmentIntentDataStatic { - pub(super) fn encode( + pub fn encode( &self, config: PoseidonConfig, mut layouter: impl Layouter, @@ -48,7 +48,7 @@ impl PartialFulfillmentIntentDataStatic { } /// Checks to be enforced if `is_input_note == 1` - pub(super) fn is_input_note_checks( + pub fn is_input_note_checks( &self, is_input_note: &AssignedCell, basic_variables: &BasicValidityPredicateVariables, @@ -121,7 +121,7 @@ impl PartialFulfillmentIntentDataStatic { } /// Checks to be enforced if `is_output_note == 1` - pub(super) fn is_output_note_checks( + pub fn is_output_note_checks( &self, is_output_note: &AssignedCell, basic_variables: &BasicValidityPredicateVariables, @@ -175,7 +175,7 @@ impl PartialFulfillmentIntentDataStatic { } /// Checks to be enforced if `is_partial_fulfillment == 1` - pub(super) fn is_partial_fulfillment_checks( + pub fn is_partial_fulfillment_checks( &self, is_input_note: &AssignedCell, basic_variables: &BasicValidityPredicateVariables, diff --git a/taiga_halo2/src/circuit/vp_examples/partial_fulfillment_intent/swap.rs b/taiga_halo2/src/circuit/vp_examples/partial_fulfillment_intent/swap.rs index 2e2c3775..1f8e82ae 100644 --- a/taiga_halo2/src/circuit/vp_examples/partial_fulfillment_intent/swap.rs +++ b/taiga_halo2/src/circuit/vp_examples/partial_fulfillment_intent/swap.rs @@ -17,14 +17,14 @@ use pasta_curves::pallas; use rand::RngCore; #[derive(Clone, Debug, Default)] -pub(super) struct Swap { - pub(super) sell: TokenNote, - pub(super) buy: Token, - pub(super) auth: TokenAuthorization, +pub struct Swap { + pub sell: TokenNote, + pub buy: Token, + pub auth: TokenAuthorization, } impl Swap { - pub(super) fn random( + pub fn random( mut rng: impl RngCore, sell: Token, buy: Token, @@ -45,7 +45,7 @@ impl Swap { /// - completely fills the swap using a single `TokenNote`, or /// - partially fills the swap, producing a `TokenNote` and a /// returned note. - pub(super) fn fill( + pub fn fill( &self, mut rng: impl RngCore, intent_note: Note, @@ -88,7 +88,7 @@ impl Swap { (input_notes, output_notes) } - pub(super) fn encode_app_data_static(&self) -> pallas::Base { + pub fn encode_app_data_static(&self) -> pallas::Base { poseidon_hash_n([ self.sell.encode_name(), self.sell.encode_value(), @@ -101,7 +101,7 @@ impl Swap { ]) } - pub(super) fn create_intent_note(&self, mut rng: R) -> Note { + pub fn create_intent_note(&self, mut rng: R) -> Note { let rseed = RandomSeed::random(&mut rng); Note::new( @@ -117,7 +117,7 @@ impl Swap { } /// Assign variables encoded in app_static_data - pub(super) fn assign_app_data_static( + pub fn assign_app_data_static( &self, column: Column, mut layouter: impl Layouter, diff --git a/taiga_halo2/src/circuit/vp_examples/token.rs b/taiga_halo2/src/circuit/vp_examples/token.rs index 7674a553..dead3b84 100644 --- a/taiga_halo2/src/circuit/vp_examples/token.rs +++ b/taiga_halo2/src/circuit/vp_examples/token.rs @@ -122,8 +122,8 @@ impl Token { #[derive(Clone, Debug, Default)] pub struct TokenNote { - token_name: TokenName, - note: Note, + pub token_name: TokenName, + pub note: Note, } impl std::ops::Deref for TokenNote {