Implement fee calculator #81

Merged
pitmutt merged 1 commits from rav001 into dev040 2024-05-08 18:51:35 +00:00
3 changed files with 86 additions and 64 deletions

View File

@ -1643,6 +1643,7 @@ pub extern "C" fn rust_wrapper_create_transaction(
sapoutput_len: usize,
net: bool,
bl_height: u32,
build: bool,
out: *mut u8,
out_len: &mut usize){
let sap_wit_in: Vec<u8> = marshall_from_haskell_var(sap_wit, sap_wit_len, RW);
@ -1794,71 +1795,89 @@ pub extern "C" fn rust_wrapper_create_transaction(
}
}
}
let spend_params_in: Vec<u8> = marshall_from_haskell_var(sapspend, sapspend_len, RW);
let spend_params_reader = Cursor::new(spend_params_in);
let spend_prover = SpendParameters::read(spend_params_reader, false).unwrap();
let output_params_in: Vec<u8> = marshall_from_haskell_var(sapoutput, sapoutput_len, RW);
let output_params_reader = Cursor::new(output_params_in);
let output_prover = OutputParameters::read(output_params_reader, false).unwrap();
let result = if net {
main_builder.build(OsRng, &spend_prover, &output_prover, &FeeRule::standard())
} else {
test_builder.build(OsRng, &spend_prover, &output_prover, &FeeRule::standard())
};
match result {
Ok(r) => {
let mut out_bytes: Vec<u8> = Vec::new();
let _t = r.transaction().write_v5(&mut out_bytes);
let h = Hhex {bytes: out_bytes};
marshall_to_haskell_var(&h, out, out_len, RW);
},
Err(e) => {
match e {
Error::InsufficientFunds(y) => {
let x = Hhex {bytes: vec![0]};
marshall_to_haskell_var(&x, out, out_len, RW);
},
Error::ChangeRequired(y1) => {
let x = Hhex {bytes: vec![1]};
marshall_to_haskell_var(&x, out, out_len, RW);
},
Error::Fee(_y2) => {
let x = Hhex {bytes: vec![2]};
marshall_to_haskell_var(&x, out, out_len, RW);
},
Error::Balance(y3) => {
let x = Hhex {bytes: vec![3]};
marshall_to_haskell_var(&x, out, out_len, RW);
},
Error::TransparentBuild(y4) => {
let x = Hhex {bytes: vec![4]};
marshall_to_haskell_var(&x, out, out_len, RW);
},
Error::SaplingBuild(y5) => {
let x = Hhex {bytes: vec![5]};
marshall_to_haskell_var(&x, out, out_len, RW);
},
Error::OrchardBuild(y7) => {
let x = Hhex {bytes: vec![6]};
marshall_to_haskell_var(&x, out, out_len, RW);
},
Error::OrchardSpend(y8) => {
let x = Hhex {bytes: vec![7]};
marshall_to_haskell_var(&x, out, out_len, RW);
},
Error::OrchardRecipient(y9) => {
let x = Hhex {bytes: vec![8]};
marshall_to_haskell_var(&x, out, out_len, RW);
},
Error::SaplingBuilderNotAvailable => {
let x = Hhex {bytes: vec![9]};
marshall_to_haskell_var(&x, out, out_len, RW);
},
Error::OrchardBuilderNotAvailable => {
let x = Hhex {bytes: vec![10]};
marshall_to_haskell_var(&x, out, out_len, RW);
if build {
let spend_params_in: Vec<u8> = marshall_from_haskell_var(sapspend, sapspend_len, RW);
let spend_params_reader = Cursor::new(spend_params_in);
let spend_prover = SpendParameters::read(spend_params_reader, false).unwrap();
let output_params_in: Vec<u8> = marshall_from_haskell_var(sapoutput, sapoutput_len, RW);
let output_params_reader = Cursor::new(output_params_in);
let output_prover = OutputParameters::read(output_params_reader, false).unwrap();
let result = if net {
main_builder.build(OsRng, &spend_prover, &output_prover, &FeeRule::standard())
} else {
test_builder.build(OsRng, &spend_prover, &output_prover, &FeeRule::standard())
};
match result {
Ok(r) => {
let mut out_bytes: Vec<u8> = Vec::new();
let _t = r.transaction().write_v5(&mut out_bytes);
let h = Hhex {bytes: out_bytes};
marshall_to_haskell_var(&h, out, out_len, RW);
},
Err(e) => {
match e {
Error::InsufficientFunds(y) => {
let x = Hhex {bytes: vec![0]};
marshall_to_haskell_var(&x, out, out_len, RW);
},
Error::ChangeRequired(y1) => {
let x = Hhex {bytes: vec![1]};
marshall_to_haskell_var(&x, out, out_len, RW);
},
Error::Fee(_y2) => {
let x = Hhex {bytes: vec![2]};
marshall_to_haskell_var(&x, out, out_len, RW);
},
Error::Balance(y3) => {
let x = Hhex {bytes: vec![3]};
marshall_to_haskell_var(&x, out, out_len, RW);
},
Error::TransparentBuild(y4) => {
let x = Hhex {bytes: vec![4]};
marshall_to_haskell_var(&x, out, out_len, RW);
},
Error::SaplingBuild(y5) => {
let x = Hhex {bytes: vec![5]};
marshall_to_haskell_var(&x, out, out_len, RW);
},
Error::OrchardBuild(y7) => {
let x = Hhex {bytes: vec![6]};
marshall_to_haskell_var(&x, out, out_len, RW);
},
Error::OrchardSpend(y8) => {
let x = Hhex {bytes: vec![7]};
marshall_to_haskell_var(&x, out, out_len, RW);
},
Error::OrchardRecipient(y9) => {
let x = Hhex {bytes: vec![8]};
marshall_to_haskell_var(&x, out, out_len, RW);
},
Error::SaplingBuilderNotAvailable => {
let x = Hhex {bytes: vec![9]};
marshall_to_haskell_var(&x, out, out_len, RW);
},
Error::OrchardBuilderNotAvailable => {
let x = Hhex {bytes: vec![10]};
marshall_to_haskell_var(&x, out, out_len, RW);
}
}
}
}
} else {
let result = if net {
main_builder.get_fee(&FeeRule::standard())
} else {
test_builder.get_fee(&FeeRule::standard())
};
match result {
Ok(r) => {
let x = Hhex {bytes: r.to_i64_le_bytes().to_vec()};
marshall_to_haskell_var(&x, out, out_len, RW);
},
Err(e) => {
let x = Hhex {bytes: vec![2]};
marshall_to_haskell_var(&x, out, out_len, RW);
}
}
}
}

View File

@ -287,6 +287,7 @@ import ZcashHaskell.Types
, toBorshVar* `BS.ByteString'&
, `Bool'
, `Word64'
, `Bool'
, getVarBuffer `Buffer HexString'&
}
-> `()'

View File

@ -133,8 +133,9 @@ createTransaction ::
-> SaplingOutputParams -- ^ the Sapling circuit output parameters
-> ZcashNet -- ^ the network to be used
-> Int -- ^ target block height
-> Bool -- ^ True to build, False to estimate fee
-> Either TxError HexString
createTransaction sapAnchor orchAnchor tSpend sSpend oSpend outgoing sParams oParams znet bh =
createTransaction sapAnchor orchAnchor tSpend sSpend oSpend outgoing sParams oParams znet bh build =
if BS.length (hexBytes txResult) > 1
then Right txResult
else case head (BS.unpack $ hexBytes txResult) of
@ -168,3 +169,4 @@ createTransaction sapAnchor orchAnchor tSpend sSpend oSpend outgoing sParams oPa
(sapOParams oParams)
(znet == MainNet)
(fromIntegral bh)
build