diff --git a/benches/reissue.rs b/benches/reissue.rs index 09ec0d4..73218d8 100644 --- a/benches/reissue.rs +++ b/benches/reissue.rs @@ -2,10 +2,11 @@ use std::collections::{BTreeMap, BTreeSet}; use std::iter::FromIterator; +use std::sync::{Arc, Mutex}; use sn_dbc::{ - bls_dkg_id, Amount, AmountSecrets, Dbc, DbcContent, Error, Mint, ReissueRequestBuilder, - SimpleKeyManager, SimpleSigner, SimpleSpendBook, + bls_dkg_id, Amount, AmountSecrets, Dbc, DbcContent, Error, MintNode, SimpleKeyManager, + SimpleSigner, SimpleSpendBook, }; use criterion::{black_box, criterion_group, criterion_main, Criterion}; @@ -22,7 +23,7 @@ fn decrypt_amount_secrets( fn genesis( amount: Amount, ) -> ( - Mint, + MintNode>>, bls_dkg::outcome::Outcome, Dbc, ) { @@ -35,7 +36,7 @@ fn genesis( ), genesis_owner.public_key_set.public_key(), ); - let mut genesis_node = Mint::new(key_manager, SimpleSpendBook::new()); + let mut genesis_node = MintNode::new(key_manager, Arc::new(Mutex::new(SimpleSpendBook::new()))); let genesis = genesis_node.issue_genesis_dbc(amount).unwrap(); @@ -68,7 +69,7 @@ fn bench_reissue_1_to_100(c: &mut Criterion) { let output_owner = bls_dkg_id(); let output_owner_pk = output_owner.public_key_set.public_key(); - let reissue_tx = sn_dbc::TransactionBuilder::default() + let tx = sn_dbc::TransactionBuilder::default() .add_input(genesis_dbc.clone(), genesis_secrets) .add_outputs((0..n_outputs).into_iter().map(|_| sn_dbc::Output { amount: 1, @@ -77,22 +78,17 @@ fn bench_reissue_1_to_100(c: &mut Criterion) { .build() .unwrap(); - let rr = ReissueRequestBuilder::new(reissue_tx) - .add_dbc_signer( - genesis_dbc.spend_key(), - genesis_owner.public_key_set.clone(), - (genesis_owner.index, genesis_owner.secret_key_share), - ) - .build() - .unwrap(); + genesis + .spendbook + .lock() + .unwrap() + .log_spent(genesis_dbc.spend_key(), tx.blinded()); - let spendbook = genesis.snapshot_spendbook(); c.bench_function(&format!("reissue split 1 to {}", n_outputs), |b| { b.iter(|| { - genesis.reset_spendbook(spendbook.clone()); genesis .reissue( - black_box(rr.clone()), + black_box(tx.clone()), black_box(BTreeSet::from_iter([genesis_dbc.spend_key()])), ) .unwrap(); @@ -108,7 +104,7 @@ fn bench_reissue_100_to_1(c: &mut Criterion) { let owners = Vec::from_iter((0..n_outputs).into_iter().map(|_| bls_dkg_id())); - let reissue_tx = sn_dbc::TransactionBuilder::default() + let tx = sn_dbc::TransactionBuilder::default() .add_input(genesis_dbc.clone(), genesis_amount_secrets) .add_outputs(owners.iter().map(|owner| sn_dbc::Output { amount: 1, @@ -117,7 +113,7 @@ fn bench_reissue_100_to_1(c: &mut Criterion) { .build() .unwrap(); - let dbc_owners = BTreeMap::from_iter(reissue_tx.outputs.iter().map(|out_dbc| { + let dbc_owners = BTreeMap::from_iter(tx.outputs.iter().map(|out_dbc| { let owner = owners .iter() .find(|o| o.public_key_set.public_key() == out_dbc.owner) @@ -125,18 +121,14 @@ fn bench_reissue_100_to_1(c: &mut Criterion) { .clone(); (out_dbc.owner, owner) })); - - let rr = ReissueRequestBuilder::new(reissue_tx) - .add_dbc_signer( - genesis_dbc.spend_key(), - genesis_owner.public_key_set.clone(), - (genesis_owner.index, genesis_owner.secret_key_share), - ) - .build() - .unwrap(); + genesis + .spendbook + .lock() + .unwrap() + .log_spent(genesis_dbc.spend_key(), tx.blinded()); let reissue_share = genesis - .reissue(rr.clone(), BTreeSet::from_iter([genesis_dbc.spend_key()])) + .reissue(tx.clone(), BTreeSet::from_iter([genesis_dbc.spend_key()])) .unwrap(); let (mint_key_set, mint_sig_share) = reissue_share @@ -151,7 +143,7 @@ fn bench_reissue_100_to_1(c: &mut Criterion) { .combine_signatures(vec![mint_sig_share.threshold_crypto()]) .unwrap(); - let dbcs = Vec::from_iter(rr.transaction.outputs.into_iter().map(|content| Dbc { + let dbcs = Vec::from_iter(tx.outputs.into_iter().map(|content| Dbc { content, transaction: reissue_share.dbc_transaction.clone(), transaction_sigs: BTreeMap::from_iter([( @@ -174,26 +166,20 @@ fn bench_reissue_100_to_1(c: &mut Criterion) { .build() .unwrap(); - let mut rr_builder = ReissueRequestBuilder::new(merge_tx); - for dbc in dbcs.iter() { - let owner = &dbc_owners[&dbc.owner()]; - rr_builder = rr_builder.add_dbc_signer( - dbc.spend_key(), - owner.public_key_set.clone(), - (owner.index, owner.secret_key_share.clone()), - ); + genesis + .spendbook + .lock() + .unwrap() + .log_spent(dbc.spend_key(), merge_tx.blinded()); } - let merge_rr = rr_builder.build().unwrap(); - let inputs = merge_rr.transaction.blinded().inputs; + let inputs = merge_tx.blinded().inputs; - let spendbook = genesis.snapshot_spendbook(); c.bench_function(&format!("reissue merge {} to 1", n_outputs), |b| { b.iter(|| { - genesis.reset_spendbook(spendbook.clone()); genesis - .reissue(black_box(merge_rr.clone()), black_box(inputs.clone())) + .reissue(black_box(merge_tx.clone()), black_box(inputs.clone())) .unwrap(); }) }); diff --git a/examples/mint-repl/mint-repl.rs b/examples/mint-repl/mint-repl.rs index 55b7662..18011ea 100644 --- a/examples/mint-repl/mint-repl.rs +++ b/examples/mint-repl/mint-repl.rs @@ -10,23 +10,24 @@ //! Safe Network DBC Mint CLI playground. #![allow(clippy::from_iter_instead_of_collect)] -use anyhow::{anyhow, Error, Result}; +use anyhow::{anyhow, Result}; use blsttc::poly::Poly; use blsttc::serde_impl::SerdeSecret; use blsttc::{ - PublicKey, PublicKeySet, SecretKey, SecretKeySet, SecretKeyShare, Signature, SignatureShare, + Fr, IntoFr, PublicKey, PublicKeySet, SecretKey, SecretKeySet, SecretKeyShare, SignatureShare, }; use rustyline::config::Configurer; use rustyline::error::ReadlineError; use rustyline::Editor; use serde::{Deserialize, Serialize}; use sn_dbc::{ - Amount, Dbc, DbcBuilder, GenesisDbcShare, Mint, Output, ReissueRequest, ReissueRequestBuilder, - ReissueTransaction, SimpleKeyManager as KeyManager, SimpleSigner as Signer, - SimpleSpendBook as SpendBook, SpendKey, TransactionBuilder, + Amount, Dbc, DbcBuilder, GenesisDbcShare, MintNode, Output, ReissueTransaction, + SimpleKeyManager as KeyManager, SimpleSigner as Signer, SimpleSpendBook as SpendBook, SpendKey, + TransactionBuilder, }; use std::collections::{BTreeMap, BTreeSet, HashMap}; use std::iter::FromIterator; +use std::sync::{Arc, Mutex}; #[cfg(unix)] use std::os::unix::{io::AsRawFd, prelude::RawFd}; @@ -37,7 +38,7 @@ use termios::{tcsetattr, Termios, ICANON, TCSADRAIN}; /// Holds information about the Mint, which may be comprised /// of 1 or more nodes. struct MintInfo { - mintnodes: Vec>, + mintnodes: Vec>>>, genesis: DbcUnblinded, secret_key_set: SecretKeySet, poly: Poly, @@ -45,7 +46,7 @@ struct MintInfo { impl MintInfo { // returns the first mint node. - fn mintnode(&self) -> Result<&Mint> { + fn mintnode(&self) -> Result<&MintNode>>> { self.mintnodes .get(0) .ok_or_else(|| anyhow!("Mint not yet created")) @@ -74,14 +75,6 @@ struct ReissueTransactionUnblinded { output_pk_pks: HashMap, } -/// A ReissueRequest with pubkey set for all the input and output Dbcs -#[derive(Debug, Clone, Serialize, Deserialize)] -struct ReissueRequestUnblinded { - inner: ReissueRequest, - input_pk_pks: HashMap, - output_pk_pks: HashMap, -} - /// This type is just for serializing HashMap> #[derive(Debug, Clone, Serialize, Deserialize, Default)] struct SignatureSharesMap(HashMap>); @@ -118,7 +111,6 @@ fn main() -> Result<()> { "mintinfo" => print_mintinfo_human(&mintinfo), "prepare_tx" => prepare_tx(), "sign_tx" => sign_tx(), - "prepare_reissue" => prepare_reissue(), "reissue" => reissue(&mut mintinfo), "reissue_ez" => reissue_ez(&mut mintinfo), "validate" => validate(&mintinfo), @@ -127,7 +119,7 @@ fn main() -> Result<()> { "quit" | "exit" => break, "help" => { println!( - "\nCommands:\n Mint: [mintinfo, newmint, reissue]\n Client: [newkey, prepare_tx, sign_tx, prepare_reissue, reissue_ez, decode, validate]\n General: [exit, help]\n" + "\nCommands:\n Mint: [mintinfo, newmint, reissue]\n Client: [newkey, prepare_tx, sign_tx, reissue_ez, decode, validate]\n General: [exit, help]\n" ); Ok(()) } @@ -212,7 +204,7 @@ fn mk_new_random_mint(threshold: usize, amount: Amount) -> Result { /// creates a new mint from an existing SecretKeySet that was seeded by poly. fn mk_new_mint(secret_key_set: SecretKeySet, poly: Poly, amount: Amount) -> Result { let genesis_pubkey = secret_key_set.public_keys().public_key(); - let mut mints: Vec> = Default::default(); + let mut mints: Vec>>> = Default::default(); // Generate each Mint node, and corresponding NodeSignature. (Index + SignatureShare) let mut genesis_set: Vec = Default::default(); @@ -224,7 +216,7 @@ fn mk_new_mint(secret_key_set: SecretKeySet, poly: Poly, amount: Amount) -> Resu ), genesis_pubkey, ); - let mut mint = Mint::new(key_manager, SpendBook::new()); + let mut mint = MintNode::new(key_manager, Arc::new(Mutex::new(SpendBook::new()))); genesis_set.push(mint.issue_genesis_dbc(amount)?); mints.push(mint); } @@ -389,7 +381,7 @@ fn print_mintinfo_human(mintinfo: &MintInfo) -> Result<()> { println!("\n"); println!("-- SpendBook --\n"); - for (dbc_owner, _tx) in mintinfo.mintnode()?.spendbook.iter() { + for (dbc_owner, _tx) in mintinfo.mintnode()?.spendbook.lock().unwrap().iter() { println!(" {}", encode(&dbc_owner.0.to_bytes())); } @@ -458,7 +450,7 @@ fn print_dbc_human( /// handles decode command. fn decode_input() -> Result<()> { - let t = readline_prompt("\n[d: DBC, rt: ReissueTransaction, s: SignatureSharesMap, rr: ReissueRequest, pks: PublicKeySet, sks: SecretKeySet]\nType: ")?; + let t = readline_prompt("\n[d: DBC, rt: ReissueTransaction, s: SignatureSharesMap, pks: PublicKeySet, sks: SecretKeySet]\nType: ")?; let input = readline_prompt_nl("\nPaste Data: ")?; let bytes = decode(input)?; @@ -530,10 +522,6 @@ fn decode_input() -> Result<()> { "\n\n-- SignatureSharesMap --\n\n{:#?}", from_be_bytes::(&bytes)? ), - "rr" => println!( - "\n\n-- ReissueRequest --\n\n{:#?}", - from_be_bytes::(&bytes)? - ), _ => println!("Unknown type!"), } println!(); @@ -569,7 +557,13 @@ fn validate(mintinfo: &MintInfo) -> Result<()> { }; match dbc.confirm_valid(mintinfo.mintnode()?.key_manager()) { - Ok(_) => match mintinfo.mintnode()?.is_spent(dbc.spend_key())? { + Ok(_) => match mintinfo + .mintnode()? + .spendbook + .lock() + .unwrap() + .is_spent(dbc.spend_key()) + { true => println!("\nThis DBC is unspendable. (valid but has already been spent)\n"), false => println!("\nThis DBC is spendable. (valid and has not been spent)\n"), }, @@ -781,115 +775,23 @@ fn sign_tx() -> Result<()> { Ok(()) } -/// Implements prepare_reissue command. -fn prepare_reissue() -> Result<()> { - // TODO: rewrite this using the ReissueRequestBuilder - let tx_input = readline_prompt_nl("\nReissueTransaction: ")?; - let tx: ReissueTransactionUnblinded = from_be_hex(&tx_input)?; - let mut sig_shares_by_input: HashMap> = - Default::default(); - - // Get from user: SignatureSharesMap(s) for each tx input - // until required # of SignatureShare obtained. - for dbc in tx.inner.inputs.iter() { - println!("-----------------"); - println!("Input [id: {}]", encode(dbc.owner().to_bytes()),); - println!("-----------------"); - - let pubkeyset = tx - .input_pk_pks - .get(&dbc.owner()) - .ok_or_else(|| anyhow!("PubKeySet not found"))?; - - let mut num_shares = 0usize; - while num_shares < pubkeyset.threshold() + 1 { - let ssm_input = readline_prompt_nl("\nSignatureSharesMap, or 'cancel': ")?; - let shares_map: SignatureSharesMap = if ssm_input == "cancel" { - println!("\nprepare_reissue cancelled.\n"); - return Ok(()); - } else { - from_be_hex(&ssm_input)? - }; - for (owner, shares) in shares_map.0.iter() { - for (idx, share) in shares.iter() { - let list = sig_shares_by_input - .entry(*owner) - .or_insert_with(BTreeMap::default); - (*list).insert(*idx, share.clone()); - num_shares += 1; - } - } - } - } - - let mut proofs: HashMap = Default::default(); - for dbc in tx.inner.inputs.iter() { - let shares = match sig_shares_by_input.get(&dbc.owner()) { - Some(s) => s, - None => { - return Err(anyhow!( - "Signature Shares not found for input Dbc {}", - encode(&dbc.owner().to_bytes()) - )) - } - }; - let pubkeyset = tx - .input_pk_pks - .get(&dbc.owner()) - .ok_or_else(|| anyhow!("PubKeySet not found"))?; - - let sig = pubkeyset - .combine_signatures(shares) - .map_err(|e| Error::msg(format!("{}", e)))?; - proofs.insert(dbc.spend_key(), sig); - } - - println!("\n\nThank-you. Preparing ReissueRequest...\n\n"); - - let reissue_request = ReissueRequestUnblinded { - inner: ReissueRequest { - transaction: tx.inner.clone(), - input_ownership_proofs: proofs, - }, - input_pk_pks: tx.input_pk_pks, - output_pk_pks: tx.output_pk_pks, - }; - - println!("\n-- ReissueRequest --"); - println!("{}", to_be_hex(&reissue_request)?); - println!("-- End ReissueRequest --\n"); - - Ok(()) -} - /// Implements reissue command. fn reissue(mintinfo: &mut MintInfo) -> Result<()> { - let mr_input = readline_prompt_nl("\nReissueRequest: ")?; - let reissue_request: ReissueRequestUnblinded = from_be_hex(&mr_input)?; + let tx_input = readline_prompt_nl("\nReissueTransaction: ")?; + let tx: ReissueTransactionUnblinded = from_be_hex(&tx_input)?; println!("\n\nThank-you. Generating DBC(s)...\n\n"); - let input_keys = BTreeSet::from_iter( - reissue_request - .inner - .transaction - .inputs - .iter() - .map(Dbc::spend_key), - ); + let input_keys = BTreeSet::from_iter(tx.inner.inputs.iter().map(Dbc::spend_key)); - reissue_exec( - mintinfo, - &reissue_request.inner, - &input_keys, - &reissue_request.output_pk_pks, - ) + reissue_exec(mintinfo, &tx.inner, &input_keys, &tx.output_pk_pks) } /// Implements reissue_ez command. fn reissue_ez(mintinfo: &mut MintInfo) -> Result<()> { let mut tx_builder: TransactionBuilder = Default::default(); - let mut rr_builder: ReissueRequestBuilder = Default::default(); + let mut dbc_signers: BTreeMap)> = + Default::default(); let mut pk_pks: HashMap = Default::default(); // Get from user: input DBC(s) and required # of SecretKeyShare+index for each. @@ -929,7 +831,9 @@ fn reissue_ez(mintinfo: &mut MintInfo) -> Result<()> { dbc.owner.threshold() + 1 ); - while rr_builder.num_signers_by_dbc(dbc.inner.spend_key()) < dbc.owner.threshold() + 1 { + let mut secret_shares = BTreeMap::new(); + + while dbc.owner.threshold() + 1 > secret_shares.len() { let key = readline_prompt_nl("\nSecretKeyShare, or 'cancel': ")?; let secret: SecretKeyShare = if key == "cancel" { println!("\nreissue_ez cancelled\n"); @@ -940,25 +844,16 @@ fn reissue_ez(mintinfo: &mut MintInfo) -> Result<()> { let idx_input = readline_prompt("\nSecretKeyShare Index: ")?; let idx: usize = idx_input.parse()?; - rr_builder = rr_builder.add_dbc_signer( - dbc.inner.spend_key(), - dbc.owner.clone(), - (idx, secret.clone()), - ); + secret_shares.insert(idx.into_fr(), secret); } - let secret_shares = rr_builder - .get_signers(dbc.inner.spend_key()) - .ok_or(sn_dbc::Error::MissingInputOwnerProof)? - .get(&dbc.owner) - .ok_or(sn_dbc::Error::ReissueRequestPublicKeySetMismatch)?; - let amount_secrets = dbc .inner .content - .amount_secrets_by_secret_key_shares(&dbc.owner, secret_shares)?; + .amount_secrets_by_secret_key_shares(&dbc.owner, &secret_shares)?; tx_builder = tx_builder.add_input(dbc.inner.clone(), amount_secrets); + dbc_signers.insert(dbc.inner.spend_key(), (dbc.owner, secret_shares)); } let mut i = 0u32; @@ -1022,22 +917,18 @@ fn reissue_ez(mintinfo: &mut MintInfo) -> Result<()> { println!("\n\nThank-you. Generating DBC(s)...\n\n"); let input_owners = tx_builder.input_spend_keys(); - let transaction = tx_builder.build()?; - let rr = rr_builder.set_reissue_transaction(transaction).build()?; - - println!("Prepared reissue request..."); - - reissue_exec(mintinfo, &rr, &input_owners, &pk_pks) + let tx = tx_builder.build()?; + reissue_exec(mintinfo, &tx, &input_owners, &pk_pks) } /// Performs reissue fn reissue_exec( mintinfo: &mut MintInfo, - reissue_request: &ReissueRequest, + reissue_tx: &ReissueTransaction, input_owners: &BTreeSet, output_pk_pks: &HashMap, ) -> Result<()> { - let mut dbc_builder = DbcBuilder::new(reissue_request.transaction.clone()); + let mut dbc_builder = DbcBuilder::new(reissue_tx.clone()); // Mint is multi-node. So each mint node must execute Mint::reissue() and // provide its SignatureShare, which the client must then combine together @@ -1045,8 +936,17 @@ fn reissue_exec( for mint in mintinfo.mintnodes.iter_mut() { // here we pretend the client has made a network request to a single mint node // so this mint.reissue() execs on the Mint node and returns data to client. - println!("Sending reissue request.."); - let reissue_share = mint.reissue(reissue_request.clone(), input_owners.clone())?; + let blinded_tx = reissue_tx.blinded(); + for in_dbc in reissue_tx.inputs.iter() { + mint.spendbook + .lock() + .unwrap() + .log_spent(in_dbc.spend_key(), blinded_tx.clone()); + } + + println!("Sending reissue tx.."); + + let reissue_share = mint.reissue(reissue_tx.clone(), input_owners.clone())?; // and now we are back to client code. dbc_builder = dbc_builder.add_reissue_share(reissue_share); diff --git a/examples/mint-repl/sample_runs/reissue_ez.txt b/examples/mint-repl/sample_runs/reissue_ez.txt index 1ef6442..9858138 100644 --- a/examples/mint-repl/sample_runs/reissue_ez.txt +++ b/examples/mint-repl/sample_runs/reissue_ez.txt @@ -27,45 +27,44 @@ Number of Mint Nodes: 1 -- Mint Keys -- -SecretKeySet (Poly): 6b22f6081a184b069be0eca67a1991a36b40dea9b36de074200080a33db32feb0000000000000001 +SecretKeySet (Poly): 044e1ee23096886283b9ef75fa5c4180dc78eaaaace8efbf04c6296453943b3f0000000000000001 -PublicKeySet: e13050c7dd443e07e515eb2b901460da291447eb3bd6773c5289d369fb7f36c6b3b932f5340a290bc0f3d5c248adad840000000000000001 +PublicKeySet: 24c9445b6f70d91c31d7b05bd703e0f4ba3aff4140e6f4a86c8b365b49b1dac5b0a78c416070d1f69ef89003dd12eab70000000000000001 -- SecretKeyShares -- - 0. 6b22f6081a184b069be0eca67a1991a36b40dea9b36de074200080a33db32feb - 1. 6b22f6081a184b069be0eca67a1991a36b40dea9b36de074200080a33db32feb + 0. 044e1ee23096886283b9ef75fa5c4180dc78eaaaace8efbf04c6296453943b3f + 1. 044e1ee23096886283b9ef75fa5c4180dc78eaaaace8efbf04c6296453943b3f -- PublicKeyShares -- - 0. 84adad48c2d5f3c00b290a34f532b9b3c6367ffb69d389523c77d63beb471429da6014902beb15e5073e44ddc75030e1 - 1. 84adad48c2d5f3c00b290a34f532b9b3c6367ffb69d389523c77d63beb471429da6014902beb15e5073e44ddc75030e1 + 0. b7ea12dd0390f89ef6d17060418ca7b0c5dab1495b368b6ca8f4e64041ff3abaf4e003d75bb0d7311cd9706f5b44c924 + 1. b7ea12dd0390f89ef6d17060418ca7b0c5dab1495b368b6ca8f4e64041ff3abaf4e003d75bb0d7311cd9706f5b44c924 Required Signers: 1 (Threshold = 0) -- Genesis DBC -- -id: 84adad48c2d5f3c00b290a34f532b9b3c6367ffb69d389523c77d63beb471429da6014902beb15e5073e44ddc75030e1 +id: b7ea12dd0390f89ef6d17060418ca7b0c5dab1495b368b6ca8f4e64041ff3abaf4e003d75bb0d7311cd9706f5b44c924 *** Secrets (decrypted) *** amount: 1000 - blinding_factor: 02f0b9816e3b7731e05902d3cd0e1f89b9faed861da3e16475bb15dcd3237716 + blinding_factor: 09df650409c45b1061758c318806244b59c4a186b826a6f0175d3bcb48333394 -owner: e13050c7dd443e07e515eb2b901460da291447eb3bd6773c5289d369fb7f36c6b3b932f5340a290bc0f3d5c248adad840000000000000001 +owner: 24c9445b6f70d91c31d7b05bd703e0f4ba3aff4140e6f4a86c8b365b49b1dac5b0a78c416070d1f69ef89003dd12eab70000000000000001 inputs: 97f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb outputs: - 84adad48c2d5f3c00b290a34f532b9b3c6367ffb69d389523c77d63beb471429da6014902beb15e5073e44ddc75030e1 + b7ea12dd0390f89ef6d17060418ca7b0c5dab1495b368b6ca8f4e64041ff3abaf4e003d75bb0d7311cd9706f5b44c924 Data: -e13050c7dd443e07e515eb2b901460da291447eb3bd6773c5289d369fb7f36c6b3b932f5340a290bc0f3d5c248adad840000000000000001cc95d3e6df19fe4e971c28cb59150f63805a8ec878011fd289c80593b6bd5906a84f1360cf1fb4a7e6a92d1d95b26e0ffff233c6f0eaa196d94cfe5ee4af705627eae334ffb2ddc764f37071e271afe2a8efb85886a3e0a06d463fa0b4551581e13050c7dd443e07e515eb2b901460da291447eb3bd6773c5289d369fb7f36c6b3b932f5340a290bc0f3d5c248adad84bbc622db0af03afbef1a7af93fe8556c58ac1b173f3a4ea105b974974f8c68c30faca94f8c63952694d79731a7d3f1970000000000000001e13050c7dd443e07e515eb2b901460da291447eb3bd6773c5289d369fb7f36c6b3b932f5340a290bc0f3d5c248adad840000000000000001bbc622db0af03afbef1a7af93fe8556c58ac1b173f3a4ea105b974974f8c68c30faca94f8c63952694d79731a7d3f1970000000000000001e13050c7dd443e07e515eb2b901460da291447eb3bd6773c5289d369fb7f36c6b3b932f5340a290bc0f3d5c248adad84017c747ab2424f87bce27c850c361fb2c8e24b853d8345819685f3f7c0704d820e6350eada09d75fe44f28ad0f4531136695b912bb1cab320b14b27d4eaf32492c802034e1eb2bd33f70ae92e08757f8ac890bd9f53b019c8ffa892d84a4b2747cd1683bd8afd02449ab9276f8137f7bae23eedef41aa579c65f146b3693a1da343a4eb4c06401ba28c664768494d76e3eed8b6ae466a7bb7a7286f8cc15a85046084364f7029736f18121fed3006a8cdd933f11d60c10d81d952d9b880e69006abcab77d787af61194d6971fac1250b002241a065b48380a5cf86b2f881744a59d244b2e0f41060ea3917f944abe115e305408b79ff8e501f5509461b092f960048c396ff9f2f5a92ccbd68022e625404c9c603b1c3a7b19b6c906be4ea0c1a680ca39bac19dc38cc6ee811586459aee280c9a48f87e2a48acecc2cfbdb851c72eb96612e2ef206705bd4d36f2b27a94f36a51e10b82743854de0bbf80cf95874d9ae917dc588337b3d1d4c91497caac22cc836534597cc58cef6743ed4d5724756d1b22d95c7ab4b8d11c0785f60b34bce91afb47f773aba0fa4c67bbd0cde38baaf761ed2d301b83ac8a07c9641fe7c3745e96e8f273bb0be2c8ff458e2440658fcb14c3e20768df414712535e5dc392012e58aee62f4721712a9b0e6692b02ab7e1f8e5c80a158577d332ecb8190ec20aaa401d6da42286c4d7eb7fc38c60f059ed05f1c705066bbe02f0486c686362c429d99e534e7dcc341a789c70cae28152dacf0b24271b4b4cc90b8c0ace262c09725b4fd626d3a5158f7df8fd3ee6162a65c700051851b125403f416029b955e5bc770b6f7d119f7273460bd70a24169d7db70055430481dbcf2cf9c1c6a390df44be21fa58cde20b48b135c215845fc590105babb7f60668753de793d3bed1c12abcccb5b218022357aeba4785a00000000000002a04d8ea7ca1e65de3f6c5bcc481c6fbe78e77b28f6fc255604d18b4c7f9b3b05bc32ce433590953a49e0d7fb64ab3f592ac41d25a5802ef0bbf517a1e384652c002002015b7fdc89f960743eb645076c0c23845e3135bd18e47dee60c23ef647917d5e277ba4a0c002dd80436aa7ebc80fb55864967a2f37a1fdb6fbae737f53921ad8d7da966423d88d68c34388fa265b1470ae1fe9a2d69767eb193b3ff6074d9d638bc210f25b1700000000000000287634ac86d6ee1afbac7b3ea56c6b281945562b035f958efdbc645f8213fe9a49df0c54d127c767ecbbe7f0dcfa415ab7bbc622db0af03afbef1a7af93fe8556c58ac1b173f3a4ea105b974974f8c68c30faca94f8c63952694d79731a7d3f1970000000000000001 +24c9445b6f70d91c31d7b05bd703e0f4ba3aff4140e6f4a86c8b365b49b1dac5b0a78c416070d1f69ef89003dd12eab700000000000000010d49c0398a913316eb40b46206f51f223ac2b0d21a0908fec225e0de9a2be8ff4146bc60f4df8898f3c97ae4fd3f4f07a8903dcf211684926a8853c621ac207a89b64ed72e5e92e15ac1da6ed825fd666479327e2bb9a34ce4581ceec328c5a024c9445b6f70d91c31d7b05bd703e0f4ba3aff4140e6f4a86c8b365b49b1dac5b0a78c416070d1f69ef89003dd12eab7bbc622db0af03afbef1a7af93fe8556c58ac1b173f3a4ea105b974974f8c68c30faca94f8c63952694d79731a7d3f197000000000000000124c9445b6f70d91c31d7b05bd703e0f4ba3aff4140e6f4a86c8b365b49b1dac5b0a78c416070d1f69ef89003dd12eab70000000000000001bbc622db0af03afbef1a7af93fe8556c58ac1b173f3a4ea105b974974f8c68c30faca94f8c63952694d79731a7d3f197000000000000000124c9445b6f70d91c31d7b05bd703e0f4ba3aff4140e6f4a86c8b365b49b1dac5b0a78c416070d1f69ef89003dd12eab70699c57507828a7b547c6342f6eece42d989a742a46277a125d50a90c279bf1e0af2b882b909cdcff6d782970ea19b58bd9a13b269144a945ff70df0cd6cb5360f72029ac991e9238bedf5097b33c35f69122a1410c172a3e003473cc00c57b817d1f4ccfb657e0c7fb11e42e5155259fd074b0afbd3f61b1bdd61ed7d837f2e6c658d391daf32900f6a2ce98b54ec1d04ca6c6f1614473eccc13ad8ba09a1da76cf19ba24a95066632114daacaa85c6bd102ee9ba001b53c03984e4ebfa01f22211e918a5b9198a7c1ef6083a9a3dee0b2d0d35896df8c33e564caf8cb0b0e209aae62dec6949bcfd7a398d10d5cd9acc88166dfd763862cc8d13de7ea78cf0308f2e9bcb2a032086566daeab515167eea6064c8392b8a58e8eefbd0455c0242fcbb97da8de15d73951d06b9b18a2a0ac4b8ed33843af76c892837af6dfd67a1bd3bd18af467a903d476c4468b17694daed6e57485928200fa5433c56508ba003e17fb7a9cdf3900c120d7e0e1166851d4a1ba3f042e2632ac4bee38db6c2aa0359b3bf70275235803e9c7bdb469cf9496508968c7431b425681b73c4789bf010a19aada7258593e09337a2a4f7d87d1cfef4ce42da46aedb0674abffb5bef809c8cf021c470092ca3a9520554c8f51aef9f82b02185081cf627ca61d204ac700c702c910822f9abe4313b5694daa31018d712c819212b6fddebf8f29300227081f5f4029c3b62b3f1d9025459c6aa51529a6f6882864b0821b0c65b0d16f0a4fce820a93c07efe49af43cedfe79aad7b37478714a47b4355f981c5b48969e254e905314d1fcaacceb24b9b09905eb2f087f111e857d4ee4066681dbfc12c4e407135efb777488961299d8ef0a15553f7ad6d49b358f8a4514d65d1ea017a4a003d917f0a29ada26b846b398195812cdef5e7be67528125e1102e0b5d4ab62000000000000002a07dd58b1c660fa4467a4e69b1f9831149d09e10e2e2be9267524cdfb80c386a463c2532ac9325b064ed9b823ea22b46e8c04591694e65891761194b4f3254c8bf8352ad26df05aa6ca12b3df820cfc10f4c2a34dec2a557fe7233ecedc56033b22267ab43168a48467ee1c589e8377d1395eed6631f0393d9fbb9f5aafbd18a889e207c873e04d9ec218ff899b69efe3665ddf8d27833c98f029fba56e135f984dc1f27dd975a1c4400000000000000289443359354048fd334a5e34e4c23bca18f25345a5f80ea067c62fd39aaf3996e24181908a80f96553b6eb0c3b1ce8091bbc622db0af03afbef1a7af93fe8556c58ac1b173f3a4ea105b974974f8c68c30faca94f8c63952694d79731a7d3f1970000000000000001 -- SpendBook -- - 97f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb >> reissue_ez -------------- @@ -74,12 +73,12 @@ Input DBC #0 DBC Data, or 'done': -e13050c7dd443e07e515eb2b901460da291447eb3bd6773c5289d369fb7f36c6b3b932f5340a290bc0f3d5c248adad840000000000000001cc95d3e6df19fe4e971c28cb59150f63805a8ec878011fd289c80593b6bd5906a84f1360cf1fb4a7e6a92d1d95b26e0ffff233c6f0eaa196d94cfe5ee4af705627eae334ffb2ddc764f37071e271afe2a8efb85886a3e0a06d463fa0b4551581e13050c7dd443e07e515eb2b901460da291447eb3bd6773c5289d369fb7f36c6b3b932f5340a290bc0f3d5c248adad84bbc622db0af03afbef1a7af93fe8556c58ac1b173f3a4ea105b974974f8c68c30faca94f8c63952694d79731a7d3f1970000000000000001e13050c7dd443e07e515eb2b901460da291447eb3bd6773c5289d369fb7f36c6b3b932f5340a290bc0f3d5c248adad840000000000000001bbc622db0af03afbef1a7af93fe8556c58ac1b173f3a4ea105b974974f8c68c30faca94f8c63952694d79731a7d3f1970000000000000001e13050c7dd443e07e515eb2b901460da291447eb3bd6773c5289d369fb7f36c6b3b932f5340a290bc0f3d5c248adad84017c747ab2424f87bce27c850c361fb2c8e24b853d8345819685f3f7c0704d820e6350eada09d75fe44f28ad0f4531136695b912bb1cab320b14b27d4eaf32492c802034e1eb2bd33f70ae92e08757f8ac890bd9f53b019c8ffa892d84a4b2747cd1683bd8afd02449ab9276f8137f7bae23eedef41aa579c65f146b3693a1da343a4eb4c06401ba28c664768494d76e3eed8b6ae466a7bb7a7286f8cc15a85046084364f7029736f18121fed3006a8cdd933f11d60c10d81d952d9b880e69006abcab77d787af61194d6971fac1250b002241a065b48380a5cf86b2f881744a59d244b2e0f41060ea3917f944abe115e305408b79ff8e501f5509461b092f960048c396ff9f2f5a92ccbd68022e625404c9c603b1c3a7b19b6c906be4ea0c1a680ca39bac19dc38cc6ee811586459aee280c9a48f87e2a48acecc2cfbdb851c72eb96612e2ef206705bd4d36f2b27a94f36a51e10b82743854de0bbf80cf95874d9ae917dc588337b3d1d4c91497caac22cc836534597cc58cef6743ed4d5724756d1b22d95c7ab4b8d11c0785f60b34bce91afb47f773aba0fa4c67bbd0cde38baaf761ed2d301b83ac8a07c9641fe7c3745e96e8f273bb0be2c8ff458e2440658fcb14c3e20768df414712535e5dc392012e58aee62f4721712a9b0e6692b02ab7e1f8e5c80a158577d332ecb8190ec20aaa401d6da42286c4d7eb7fc38c60f059ed05f1c705066bbe02f0486c686362c429d99e534e7dcc341a789c70cae28152dacf0b24271b4b4cc90b8c0ace262c09725b4fd626d3a5158f7df8fd3ee6162a65c700051851b125403f416029b955e5bc770b6f7d119f7273460bd70a24169d7db70055430481dbcf2cf9c1c6a390df44be21fa58cde20b48b135c215845fc590105babb7f60668753de793d3bed1c12abcccb5b218022357aeba4785a00000000000002a04d8ea7ca1e65de3f6c5bcc481c6fbe78e77b28f6fc255604d18b4c7f9b3b05bc32ce433590953a49e0d7fb64ab3f592ac41d25a5802ef0bbf517a1e384652c002002015b7fdc89f960743eb645076c0c23845e3135bd18e47dee60c23ef647917d5e277ba4a0c002dd80436aa7ebc80fb55864967a2f37a1fdb6fbae737f53921ad8d7da966423d88d68c34388fa265b1470ae1fe9a2d69767eb193b3ff6074d9d638bc210f25b1700000000000000287634ac86d6ee1afbac7b3ea56c6b281945562b035f958efdbc645f8213fe9a49df0c54d127c767ecbbe7f0dcfa415ab7bbc622db0af03afbef1a7af93fe8556c58ac1b173f3a4ea105b974974f8c68c30faca94f8c63952694d79731a7d3f1970000000000000001 +24c9445b6f70d91c31d7b05bd703e0f4ba3aff4140e6f4a86c8b365b49b1dac5b0a78c416070d1f69ef89003dd12eab700000000000000010d49c0398a913316eb40b46206f51f223ac2b0d21a0908fec225e0de9a2be8ff4146bc60f4df8898f3c97ae4fd3f4f07a8903dcf211684926a8853c621ac207a89b64ed72e5e92e15ac1da6ed825fd666479327e2bb9a34ce4581ceec328c5a024c9445b6f70d91c31d7b05bd703e0f4ba3aff4140e6f4a86c8b365b49b1dac5b0a78c416070d1f69ef89003dd12eab7bbc622db0af03afbef1a7af93fe8556c58ac1b173f3a4ea105b974974f8c68c30faca94f8c63952694d79731a7d3f197000000000000000124c9445b6f70d91c31d7b05bd703e0f4ba3aff4140e6f4a86c8b365b49b1dac5b0a78c416070d1f69ef89003dd12eab70000000000000001bbc622db0af03afbef1a7af93fe8556c58ac1b173f3a4ea105b974974f8c68c30faca94f8c63952694d79731a7d3f197000000000000000124c9445b6f70d91c31d7b05bd703e0f4ba3aff4140e6f4a86c8b365b49b1dac5b0a78c416070d1f69ef89003dd12eab70699c57507828a7b547c6342f6eece42d989a742a46277a125d50a90c279bf1e0af2b882b909cdcff6d782970ea19b58bd9a13b269144a945ff70df0cd6cb5360f72029ac991e9238bedf5097b33c35f69122a1410c172a3e003473cc00c57b817d1f4ccfb657e0c7fb11e42e5155259fd074b0afbd3f61b1bdd61ed7d837f2e6c658d391daf32900f6a2ce98b54ec1d04ca6c6f1614473eccc13ad8ba09a1da76cf19ba24a95066632114daacaa85c6bd102ee9ba001b53c03984e4ebfa01f22211e918a5b9198a7c1ef6083a9a3dee0b2d0d35896df8c33e564caf8cb0b0e209aae62dec6949bcfd7a398d10d5cd9acc88166dfd763862cc8d13de7ea78cf0308f2e9bcb2a032086566daeab515167eea6064c8392b8a58e8eefbd0455c0242fcbb97da8de15d73951d06b9b18a2a0ac4b8ed33843af76c892837af6dfd67a1bd3bd18af467a903d476c4468b17694daed6e57485928200fa5433c56508ba003e17fb7a9cdf3900c120d7e0e1166851d4a1ba3f042e2632ac4bee38db6c2aa0359b3bf70275235803e9c7bdb469cf9496508968c7431b425681b73c4789bf010a19aada7258593e09337a2a4f7d87d1cfef4ce42da46aedb0674abffb5bef809c8cf021c470092ca3a9520554c8f51aef9f82b02185081cf627ca61d204ac700c702c910822f9abe4313b5694daa31018d712c819212b6fddebf8f29300227081f5f4029c3b62b3f1d9025459c6aa51529a6f6882864b0821b0c65b0d16f0a4fce820a93c07efe49af43cedfe79aad7b37478714a47b4355f981c5b48969e254e905314d1fcaacceb24b9b09905eb2f087f111e857d4ee4066681dbfc12c4e407135efb777488961299d8ef0a15553f7ad6d49b358f8a4514d65d1ea017a4a003d917f0a29ada26b846b398195812cdef5e7be67528125e1102e0b5d4ab62000000000000002a07dd58b1c660fa4467a4e69b1f9831149d09e10e2e2be9267524cdfb80c386a463c2532ac9325b064ed9b823ea22b46e8c04591694e65891761194b4f3254c8bf8352ad26df05aa6ca12b3df820cfc10f4c2a34dec2a557fe7233ecedc56033b22267ab43168a48467ee1c589e8377d1395eed6631f0393d9fbb9f5aafbd18a889e207c873e04d9ec218ff899b69efe3665ddf8d27833c98f029fba56e135f984dc1f27dd975a1c4400000000000000289443359354048fd334a5e34e4c23bca18f25345a5f80ea067c62fd39aaf3996e24181908a80f96553b6eb0c3b1ce8091bbc622db0af03afbef1a7af93fe8556c58ac1b173f3a4ea105b974974f8c68c30faca94f8c63952694d79731a7d3f1970000000000000001 Valid DBC We need 1 SecretKeyShare in order to decrypt the input amount. SecretKeyShare, or 'cancel': -6b22f6081a184b069be0eca67a1991a36b40dea9b36de074200080a33db32feb +044e1ee23096886283b9ef75fa5c4180dc78eaaaace8efbf04c6296453943b3f SecretKeyShare Index: 0 -------------- @@ -124,8 +123,7 @@ e13050c7dd443e07e515eb2b901460da291447eb3bd6773c5289d369fb7f36c6b3b932f5340a290b Thank-you. Generating DBC(s)... -Prepared reissue request... -Sending reissue request.. +Sending reissue tx.. -- Begin DBC -- id: 84adad48c2d5f3c00b290a34f532b9b3c6367ffb69d389523c77d63beb471429da6014902beb15e5073e44ddc75030e1 @@ -135,10 +133,10 @@ amount: unknown. SecretKey not available owner: e13050c7dd443e07e515eb2b901460da291447eb3bd6773c5289d369fb7f36c6b3b932f5340a290bc0f3d5c248adad840000000000000001 inputs: - 86cd17afc1aa7549a5859e8dc5deb1cc5e54a78077745db3e5433a34e293d934a74d3646b8b5cf40ae70a26a61469948 + 800b7eaa010b0a63e7cb51e5b818a9cba5f8cc2f6eab5e88144ed30cd5fe4b38a47351cb0908803b36b7bbc88348c90f Data: -e13050c7dd443e07e515eb2b901460da291447eb3bd6773c5289d369fb7f36c6b3b932f5340a290bc0f3d5c248adad84000000000000000199cc7f1ae23c2eceabecb3a4738379da3a433c395c3b0aaf33ad6521b085ef4865d39d66eef378bf16ff11f35084fd0583fd1d62bd07a89fe914e217b833c97c69e16ed20f887f6ee7495db6c7fe6464d13b6f891fe03f413cc9177a35e867aae13050c7dd443e07e515eb2b901460da291447eb3bd6773c5289d369fb7f36c6b3b932f5340a290bc0f3d5c248adad84489946616aa270ae40cfb5b846364da734d993e2343a43e5b35d747780a7545eccb1dec58d9e85a54975aac1af17cd860000000000000001e13050c7dd443e07e515eb2b901460da291447eb3bd6773c5289d369fb7f36c6b3b932f5340a290bc0f3d5c248adad840000000000000001489946616aa270ae40cfb5b846364da734d993e2343a43e5b35d747780a7545eccb1dec58d9e85a54975aac1af17cd860000000000000001e13050c7dd443e07e515eb2b901460da291447eb3bd6773c5289d369fb7f36c6b3b932f5340a290bc0f3d5c248adad8403485e4fb698ea160eadbc730c83a722a96375a91ed7ca0a201105b10cf4479705430674b40de755b9416bd5a9495a4aafdd9b21a034a38f5a34df36fbce6f6146242666dee9d3194a9f75960143782a18e43e7ae30506d7d7812e5fbd9d8e462dc050e12ac839e221f3a0cafdfcce146504d5deaa04f7e707089754c6ff4ffc443e6412e22101731e30376bbcc1aa6ef91e2c4ff98378dc887342ffd9accb8e37044e110754ae3dc492bc90715adb6c664ee62b28cdaf4a55d1fea5775f54b81a4dd0df3005111374a497eeceb1aa01e1df30581327fd4b196c0724bb9bcb742e11785ef1cd6cb11d39641977d46493b916c6f17e53a5e77a0ee83b1444c0b637823c94f1be0afc5afd827fb8864e6d726d0a17f006902afd7c0501148d82781b4c5ca9608cccf3d282fea16e3da215e2277ad26bf04427ddb0d74059bd97ce661e7e2b9d4f8b2ce135eab6183de91d7c46711600bd543a759933dd60372240233bd226f3673c8f0fb8bb1914332d4372bccb70a98167813fac353984584a5a1eeca13e6bd3c96158adfa17f1a42a8ff5a63ff591519b6401a8aa579896475e77fc1540ba27473a8bf68ed14cd8da90f01344fa37815f0aea25350b5f4ca08c0b74a170fc23649ac42b90fbd8e77da042567638d8d5f974ab71bec4009a3c8c01663b4cfeeda49fa1ea9dc3e7413a3b76c94bbfb6a2201144defca1e617ae650d9d0f7637a7cb2ec7603b5a4c1156ee155724f2b0ee1152605eca3815760d957f075e189636bdb95ac1e41ae599aae8f3c695233f113ae25d6a323fa204e3c67c764198fc92cc1039edf6757c28e42fd509926a1f84ae0ee2f0b8452548483e3dd60abe54df6304d410af5fecd324f64788474c5fc71105005793a8a06200f06071d0259be05545b9ed1b68895dd54d30607883cbc68896f58fefd37bb31c0400000000000002a07eca2dd27c679bf6917f29149c26e0ce52cca75a7749107af1c23b3df92148a426d2a7d3c1fd41f41f0c04532b51d2b1fa50c6a00a9270912238bebfdfc170967aaf86eacb42c2155c55dbaa551dd40f661251c01ab75fc96dc327a2776052f0bc2bc174f69aab81f1cd7d95dccabf605487e42365b47fcf1c72ad2f7435a3a511daa1e4986b80246ef74473da5af4d598886f53a06b17658d54ebf8831925c9b334e4156bfb878200000000000000287b412e513c8e0d2208ed611d34aad65e2514ff66f1c42404f6149daa275eed6772e8c0c65c77da7b697465ac8fa12088489946616aa270ae40cfb5b846364da734d993e2343a43e5b35d747780a7545eccb1dec58d9e85a54975aac1af17cd860000000000000001 +e13050c7dd443e07e515eb2b901460da291447eb3bd6773c5289d369fb7f36c6b3b932f5340a290bc0f3d5c248adad84000000000000000177ffd100534012966ed626ffff45a8533808737c46e02fcdc9a45b67e2d36385f55de94e2ddb1b4bfafb6d2f722ae4123a54452ef8cff7e510ffc6b4ca4d92facf272f7e99835ebcca2f7814587a1e5b00668dc033b3329c0b3d08cff42a1b9324c9445b6f70d91c31d7b05bd703e0f4ba3aff4140e6f4a86c8b365b49b1dac5b0a78c416070d1f69ef89003dd12eab70fc94883c8bbb7363b800809cb5173a4384bfed50cd34e14885eab6e2fccf8a5cba918b8e551cbe7630a0b01aa7e0b800000000000000001e13050c7dd443e07e515eb2b901460da291447eb3bd6773c5289d369fb7f36c6b3b932f5340a290bc0f3d5c248adad8400000000000000010fc94883c8bbb7363b800809cb5173a4384bfed50cd34e14885eab6e2fccf8a5cba918b8e551cbe7630a0b01aa7e0b800000000000000001e13050c7dd443e07e515eb2b901460da291447eb3bd6773c5289d369fb7f36c6b3b932f5340a290bc0f3d5c248adad840b3adf5d181cc92c3a40192c57fdefd974ebc9af13d961a9c6a4b25238f0d5ad022f6b6e51d12079412423b3dc9cf5dce15c296cc548bbbc8a644a80922da9f43f11809024ed2312f3a2e462dba918ffd237a8cd7e9273c669c010732e34757c5b9b08e676032103b32e9a99e3c811a4e9ea9f37e0f0a44fe0058cbef1ca9a7c20b719b1f83b8f0d983f46904683aecfd6a3d99ed10b5a74008620524eb741d06c6a0f84bf8600a20fc9ccb8614ddc18717c35d35b8c1a3b2af7542c0a90a20633dd337d90887f8932d173e8b2692aa7028a439e603033d2585d6678efde7b84214231b94b601925a748e87f8b879b8675cd32a113628cca3ba9312281e5f8843349537742eecb59496a43f1f8e9759fccd456145cad06dd90fc55d61c87eeb4210b5e99b5584f56248ea1ec0b37b64d99601e587b4222ff2497a8df9328812e5dea391f93805f6c8f83cedbe1452136d60780e96d167a6b436f357bddc9d65e2c7555b35074f4ca70a311d1c4f55e5616141771a5bb5c41e0f9069c3ece9a204d0af83e554c2c2cee67d89779e03b1a9cdd95ce27ed6920ca0af2da4ef86ad25aee418fc193317740d24c7481a0176fe23f113c4ff6137fa5086e5619afab2401787d72e16ae40bb396d124e75fc926f757da46e8f674a3c8565062f44e232b077e9347ca3f702ae4e61f851601555c82d204fb2d20b591d0424443d98286220433295b62041d0ef16d8e11c10722db2d644b43e532d398106ee886b3e36df613dcbb48c47c531324e39163d8bb25e1404752ab3e321622425c199fa6b14dc07d602c588533b0b636eaf91b7f69a6809fcc04f563318d3f8ecb96f163005d9a04fc1a625c216c9d0efa17a077f7ccb2e4a931496e725f24b583eeb34be278502778e3eb38188cdebbcbcb6ab02b87e14ad5513dc5bfe3cdd2a6816f16c2c23000000000000002a013b9632966b3d9ce7004b750484bc1daa04e3fc42a6ea756133b17ceb2947354f031f402693744e5c1c8bcff5ef28632c8ed6443d3df2e3f7411f6151b883d865ef925125190d1021ba0dfc150c35013df81a790f0e71f62c2201dde9e22d01ee7e88d9f346ee2101f2e1456a15b889fbf2019492e37026c42ac66cc5f056aa24b34100e10b6351f2ce44a8a1e59e8586913c3f9d5626465bc24a78ae0b68574b86b192432acec550000000000000028d9f8f556f6c0c7bc3216efb22eebeb71f1ff8009b080a600bc77d239265e8e1981e9faec4206d0d4f812d62f7ce229800fc94883c8bbb7363b800809cb5173a4384bfed50cd34e14885eab6e2fccf8a5cba918b8e551cbe7630a0b01aa7e0b800000000000000001 -- End DBC -- @@ -150,10 +148,10 @@ amount: unknown. SecretKey not available owner: e13050c7dd443e07e515eb2b901460da291447eb3bd6773c5289d369fb7f36c6b3b932f5340a290bc0f3d5c248adad840000000000000001 inputs: - 86cd17afc1aa7549a5859e8dc5deb1cc5e54a78077745db3e5433a34e293d934a74d3646b8b5cf40ae70a26a61469948 + 800b7eaa010b0a63e7cb51e5b818a9cba5f8cc2f6eab5e88144ed30cd5fe4b38a47351cb0908803b36b7bbc88348c90f Data: -e13050c7dd443e07e515eb2b901460da291447eb3bd6773c5289d369fb7f36c6b3b932f5340a290bc0f3d5c248adad84000000000000000199cc7f1ae23c2eceabecb3a4738379da3a433c395c3b0aaf33ad6521b085ef4865d39d66eef378bf16ff11f35084fd0583fd1d62bd07a89fe914e217b833c97c69e16ed20f887f6ee7495db6c7fe6464d13b6f891fe03f413cc9177a35e867aae13050c7dd443e07e515eb2b901460da291447eb3bd6773c5289d369fb7f36c6b3b932f5340a290bc0f3d5c248adad84489946616aa270ae40cfb5b846364da734d993e2343a43e5b35d747780a7545eccb1dec58d9e85a54975aac1af17cd860000000000000001e13050c7dd443e07e515eb2b901460da291447eb3bd6773c5289d369fb7f36c6b3b932f5340a290bc0f3d5c248adad840000000000000001489946616aa270ae40cfb5b846364da734d993e2343a43e5b35d747780a7545eccb1dec58d9e85a54975aac1af17cd860000000000000001e13050c7dd443e07e515eb2b901460da291447eb3bd6773c5289d369fb7f36c6b3b932f5340a290bc0f3d5c248adad84050ab23569dba6b2f2c9ef29136f891f3295799014c51332ed5b0ffb11cad50105148ba39c72a1c9f92d9ae47fda7df1859e96d665cfc6ddedd5d07605438a587d087d0664bfab561efc1709526cb145e798f0ac568176032c73f41122bff44000e58345530a657a1ee21db1aa5a7e2a6bad7846a761e48e3aba149e1631fcc859108fb53283fa97acf3c9465f0d662ae4abfe6ecb6d9a45514f0af746cbf7540dfb49dc3d9ea66a5bf203f3ebe7e474ec2d7b23ebb7db007aa593651af3e53218ab740c3414c2ff2366ae3745436735d91670e2853c366bf6660bd32b26db8c436a4c58ee38549f2bbbd246c3f197af3b396b5f1ace2a1f70d6abbd5e1fc70228d7a15cae003ff0115d97356fd8da0f523edcf19d3b193aa53f98d3ca51f16c1843e307ce77fc44fa781198697f18bd4d22cf1ee17d520fc2345244398d41944ff11ecf7f106dc5c2ef9d938dd6095db09cb04ab6caa83486bef8875a2d8dda18db5e681877c98866bb9c148658e3b5d02a7a60805dca11438ea860d73814640ba3daaa8109a3b23784b9d5ef5eaf746f10aacaa4021ad00c32e613aaf877326ddae716c45210440fbe669a187ab120cc8cd29831ea3a884de2b1d750b1a83a0a645699efcbac8153692bdd0d24e6e510d22600075fd286d378cc75bbdc83b2030326e219eff81d0e31c210067e87f1d315aa3924120f8094a721edf1020e190ddb5bd8409d85c940f208b86d2269d0f5cfa920e4cb2c185e5819aa6b5e96914c9ad4555d269a11dc19600ae2738519042857688ffc52acbfa796e086eaf13277c9a495bc95d90f1abf2ee80347aa5ef149a56aab6bbae945ee450ef3b68ca037a6704dc8296b7d5c9ea14002172409f50a5a66bdafe5c6115b01fe9427c55652b35a9fb3162e06839a78d6a65706a1f53c0824ffa77cf5691d809701a952ba00000000000002a07d8b955f325231112f07e99cf7adb37379e06a3af526253c8d6ee1d4c3510912fb9364a741e3897df98686eb8e819fdb177932fbb59b99acd2194c4a9d884831c6bc50875e248d6b8e47c188b9a3c2034b28ddeaac81cabf2b4386b28d85f831d1481cc65e5146d027d84a9cb521c284f0d4c32e2c3fbb6c2bb2993f034f9cb2319acf7d19140be5e0d57601c5b39dd73d8ee66815537dfef7b0bba91a79b8e51b9561a78b51871a0000000000000028a0cbd76eb352ec09eb1f346a623e07c4ce1e792586dec98a36001d5614a0bae2175789d99da18853305ebd9e2f989aad489946616aa270ae40cfb5b846364da734d993e2343a43e5b35d747780a7545eccb1dec58d9e85a54975aac1af17cd860000000000000001 +e13050c7dd443e07e515eb2b901460da291447eb3bd6773c5289d369fb7f36c6b3b932f5340a290bc0f3d5c248adad84000000000000000177ffd100534012966ed626ffff45a8533808737c46e02fcdc9a45b67e2d36385f55de94e2ddb1b4bfafb6d2f722ae4123a54452ef8cff7e510ffc6b4ca4d92facf272f7e99835ebcca2f7814587a1e5b00668dc033b3329c0b3d08cff42a1b9324c9445b6f70d91c31d7b05bd703e0f4ba3aff4140e6f4a86c8b365b49b1dac5b0a78c416070d1f69ef89003dd12eab70fc94883c8bbb7363b800809cb5173a4384bfed50cd34e14885eab6e2fccf8a5cba918b8e551cbe7630a0b01aa7e0b800000000000000001e13050c7dd443e07e515eb2b901460da291447eb3bd6773c5289d369fb7f36c6b3b932f5340a290bc0f3d5c248adad8400000000000000010fc94883c8bbb7363b800809cb5173a4384bfed50cd34e14885eab6e2fccf8a5cba918b8e551cbe7630a0b01aa7e0b800000000000000001e13050c7dd443e07e515eb2b901460da291447eb3bd6773c5289d369fb7f36c6b3b932f5340a290bc0f3d5c248adad840c9537bcbb3baee5cedafe8d782c280e6e3ccafd5fcef7bf0303e0b480ff17f1021aabd53efd871e6cd44e0a850a47787effae1bcc802d21e300a2598aae36df6aa49fdbd5391aaecb45b072b2ab2b5c6b2fa654f1ed1f82d481fc9b3f026a44111b9a5861a245bb404edbd91efa94da21fcd475edf6a093a5585181cd1334224782e211099c89e7733dc54cec7dace2ccffef3d816d6d5080a139b5cb18037019b363e9bd64f824aeb79f0087b0cc4168c11f087b634285f4c04a9f0da7edc8456a33b97a0111f252abfa0221b951ef1f95b53c462f89a738bf5b0df9102d645454ab2c8a6cacd7800769edc1792b156e291889b4cd3d387c51d85735265e505a29514822cf50a50246ad0c249596748af3f204d0e11346db3b04e65bb7305e644a165193311f3e4bee293e8fa8555904edb6775d4272bd136e9f55f059ad2822b94c9ab9016255dc70ec03ebf6141961f177d7ed67bd22b479b5daceec441a256d7e4dfeb4ea21eaa3b4f65948b0ad76a45824549518cf2f7b36d95f86d2387b4df884e88bdb41412b1b7dd0db35ddc4b8b0d4ca9f3f4a7204f67d4e6775b03d675d5acd8f39db9d19689c4779c6cad43cdad93b92b050ae5588867fd5025601849c06a25802e6e1d4eb29027029ca35675e33044939ea7440880b7a6ade110b8fea2ed7cf61664315b122985268bd745ee9a7b354eb135a8007de808f3ab80d85f60a5f5909023851abf14ab860560f1a57c72080026af2606597709e54b82b3ae9f75070af8e02e3728cd463789a97c3cb29578d5ba189bca2d4e44915ba7f890f92e17c54676c2325f9b4527d5d507c6e5eb14f7d2c26e827dbe6a11f3401b2feb8af97a8ea8e0f18ebf8eb3cf6dab50ab772de4dda022568781e7520280f74dad847393fc7496ed6a705f74bf51c1eda610d8ae6fe4cc4d71ce6cc52b600000000000002a01b1a54658e1334818a0551ee8466f1c91e53979b047cf3b93d0cb8d55eb9e8c8be632a0f9668d26de81e36fc84e1b81381b727297b0204fbdaf39a36cfbb8e86afa3924f829303fa0f0e26bf4ef81f03f5a8682568b4ad7c4bcd40764fc4652d60a8fe1169a579a424897c733f2805f16e4b02d6afe7bda9d965e5a23c61ea8c64566f0e1e2238cda177df224dcd81dac0d6276ee135707a98e3bcff5c488eead21b271d937013420000000000000028081c4135ad863bee5f696b07f8966a4c5e4c58c02fd19b3dcbae013b5573e8dde614a548f5918e275de941bb27efd08e0fc94883c8bbb7363b800809cb5173a4384bfed50cd34e14885eab6e2fccf8a5cba918b8e551cbe7630a0b01aa7e0b800000000000000001 -- End DBC -- @@ -165,10 +163,10 @@ amount: unknown. SecretKey not available owner: e13050c7dd443e07e515eb2b901460da291447eb3bd6773c5289d369fb7f36c6b3b932f5340a290bc0f3d5c248adad840000000000000001 inputs: - 86cd17afc1aa7549a5859e8dc5deb1cc5e54a78077745db3e5433a34e293d934a74d3646b8b5cf40ae70a26a61469948 + 800b7eaa010b0a63e7cb51e5b818a9cba5f8cc2f6eab5e88144ed30cd5fe4b38a47351cb0908803b36b7bbc88348c90f Data: -e13050c7dd443e07e515eb2b901460da291447eb3bd6773c5289d369fb7f36c6b3b932f5340a290bc0f3d5c248adad84000000000000000199cc7f1ae23c2eceabecb3a4738379da3a433c395c3b0aaf33ad6521b085ef4865d39d66eef378bf16ff11f35084fd0583fd1d62bd07a89fe914e217b833c97c69e16ed20f887f6ee7495db6c7fe6464d13b6f891fe03f413cc9177a35e867aae13050c7dd443e07e515eb2b901460da291447eb3bd6773c5289d369fb7f36c6b3b932f5340a290bc0f3d5c248adad84489946616aa270ae40cfb5b846364da734d993e2343a43e5b35d747780a7545eccb1dec58d9e85a54975aac1af17cd860000000000000001e13050c7dd443e07e515eb2b901460da291447eb3bd6773c5289d369fb7f36c6b3b932f5340a290bc0f3d5c248adad840000000000000001489946616aa270ae40cfb5b846364da734d993e2343a43e5b35d747780a7545eccb1dec58d9e85a54975aac1af17cd860000000000000001e13050c7dd443e07e515eb2b901460da291447eb3bd6773c5289d369fb7f36c6b3b932f5340a290bc0f3d5c248adad84026c24fb2f613ba3fc438985dfca055042619cf031d9bc920f2120c70067447400b22ce6ff63eb51ef0025f64a7edb0706dc2b26cc28f9783c2c76cbfbe6b26061e344a74b33507efb427854a69bed708e99dfc6cc87ed16147718b0a5ff2d0e797773b7ec78729fc5b5e14cbdbd21e426e8068c45b2dfac878f77835765012a3a50f2ac29d5bc55903587f0f5c842d2cb955cab16de8e1ab285c7ef5c16f6760d952dbeb35dc0a9251cae9058eb7395cbb682ff176c2ce3c50d17c2ca921022156ebce516e524a985b0f0a7ba78b9e6105e1a8cfd2f26390d743249ea3a2f5c2a9d165ca39bf1867c0feefa6dbda88643809f1b6f97993f3868bcca735154646b64d8a41d98936d2272fd044c44dd613aa4c1514beb5c32e3edab9a2bce0d485d2f308f696663a1d11cbbf7cb910079ecf74dc8def4c4a5dfa8e29f3c179602443526aac310ff954c19e5dcde76b6b3047c178abe61577246746d955b24ddc44a7503ac7bfb05f16ed930a733e7c86e57ec324eb9c92e18ab5475c595050a6c643909e9d58ab60814f8666a3d5f0287d54c822eb6e18a76602404bf8590291a5c478b3dd49d6e01f27676f0c384b28bf55974e6b41d6ee64777acf3472d68fc0df0bad27b4d284264c50bfce9fe03b83c8c613394ecfc11925d8e38e07b62a9040d5c3a24d8daeb31f50f41be4c018a2e79594d09fb90d17d07885fcbfda7c00bc2411a531a35d5cd9b4d41813b2dadf01ed28dfc1e3dd38854441d481c74cd4a2f54c48f1de42b2daf60456bc84fef1a75bd95b0a4a814c7f7a706f94af24e5bb114750a06a551e44cc8851daf71aad0b40b8f0c5d22de30bb8e164ca272706d8bcbe5656c173defd7a03b52d352730a3e60df4184b7ce3826465521c49e1c2ff39b5a81829f272e9f16836a60a144fa05a699778c7cc95734258666a5b4ba00000000000002a05a4712607bcd9f17e11600f6b5f4eb462043aff06a6d4f28ab04ebbb32fb320e93478a473e80238a035c3b9c29ef94f944a5d045acd7c92276de4aaf1bfae594d1ff94f9d147965d27c20635deaf430cc15053d334d13533aa9f8aa06f346bdb4158b39c3443182b7a3403d7b1ce71382771e4925c84b8ef90239d4d3bb34baa0d6f63118f19855fe5a97fe70df50f6b82c73280d405ff4cf6aa6143085e86202802055f65be60e40000000000000028cd883fb52db9746cbfef58cf6f99d6b8f62576bf0f18f86578ef36ec2c221731d52c8b1c4098f335fd487caa3d831591489946616aa270ae40cfb5b846364da734d993e2343a43e5b35d747780a7545eccb1dec58d9e85a54975aac1af17cd860000000000000001 +e13050c7dd443e07e515eb2b901460da291447eb3bd6773c5289d369fb7f36c6b3b932f5340a290bc0f3d5c248adad84000000000000000177ffd100534012966ed626ffff45a8533808737c46e02fcdc9a45b67e2d36385f55de94e2ddb1b4bfafb6d2f722ae4123a54452ef8cff7e510ffc6b4ca4d92facf272f7e99835ebcca2f7814587a1e5b00668dc033b3329c0b3d08cff42a1b9324c9445b6f70d91c31d7b05bd703e0f4ba3aff4140e6f4a86c8b365b49b1dac5b0a78c416070d1f69ef89003dd12eab70fc94883c8bbb7363b800809cb5173a4384bfed50cd34e14885eab6e2fccf8a5cba918b8e551cbe7630a0b01aa7e0b800000000000000001e13050c7dd443e07e515eb2b901460da291447eb3bd6773c5289d369fb7f36c6b3b932f5340a290bc0f3d5c248adad8400000000000000010fc94883c8bbb7363b800809cb5173a4384bfed50cd34e14885eab6e2fccf8a5cba918b8e551cbe7630a0b01aa7e0b800000000000000001e13050c7dd443e07e515eb2b901460da291447eb3bd6773c5289d369fb7f36c6b3b932f5340a290bc0f3d5c248adad84058191a355ac05934a6d78ebb32fc027fc15e34d782a5173d75f1d67bb8408f609379e774a726ac7c095ca214ae16344706a7db73d61c07abe766548041514792ae114139893fd9753d1833853881c7acf39a172840b809eb4e83ea1d7ac070a5754aa59760d1b176098d676a5438a9c088e4bb9727022fc80c0bddfda7d87be279161adaf4603aa89221c9e9dd0ae9eb89ed4ade96ebcbe813354a86c1c937221bc4f0da5f2c6f801d7f1daa9db2365693a551c522922a93db25073362a37ea0d0b20a3abc15d5db68ebb788947d946b482ab77f7a91fc097caa0a002ade3c62cd01760b57e195ed2d046bb22d2ab9344940a989ec5b5a36889bb2a0e2159220735bcd30ac5309171135cbf8aca7bd83d64ac7a50b09e6be8cbf38a7f58801c3300e9789abe89494da1c0209cdf5cb7f28a5456501ee0fdb1618c09741a7c8a54703aa4494dd5c752ca32af7776004c35669f173ff705ab81ce0276a154401c60b9e5306f3410c3e4679e6efbc34849fd0fe1a8070cdccc6eceaced7496f74c01f77ea9c0ae612961e87873925203302a83b136f3db9b4226bd80c31463935236bbc19a1c051439073a6394aed60137e14976b29d412e7030a1a618d9b40904047972ac1ceaf2c31e1dfed6429cbcc3add93d4b3d34cf211e2c250acb1809f60b320d90a7f99515069d098c759008643ccbd4cf86a356aa46ba4d54c534198c027b1eef73304d12b390dddc2355b185dc2fcc58fd1679b611737316f04f5cfa6c722b9eb7f2d9e575a6ee3216db9b09f02f580a60ed06fcb872557a81f5e94846348a2dfb4c030cb73d4d2efcf69c5065c674f857331569ea1b548cb3b64f7c5ec441b26fe78b4147dfea2d7c614ba31e0faeb994babd41b3cc3f5ea2d695ce7baced4b6e68a6e0428acc913646991b0d847a0adbf8bb01e09c7bdf118f9ea600000000000002a06f2bec7f983b42f945322605c8c2f11316a3fdd495e19e80fb338ac53c8641e8f75ea0de3a641b8c41848218919e2a64869cdff670ee34c3b359ab4ef7d6e163236f049fc776c039e46f544f96f646048f37fcd85e696eb92c7576077ef80f6f0792808f12d8193ad414e8807548e2e65c25136e99fa45df0611f41e3ace9e92f22a0ba65fcabd9f38b9c7449ee2eec71ee9b31a94f08aa6f9d699e1ea857cee23bedb8e1163665500000000000000289af8886deb4c24e5a6da79928cfd5039bc30e1291420be3764dc6193b7a7849bae893e1728a9c3f43834c01c81680d8d0fc94883c8bbb7363b800809cb5173a4384bfed50cd34e14885eab6e2fccf8a5cba918b8e551cbe7630a0b01aa7e0b800000000000000001 -- End DBC -- >> diff --git a/examples/mint-repl/sample_runs/reissue_manual.txt b/examples/mint-repl/sample_runs/reissue_manual.txt index 4f6f217..d74a6d3 100644 --- a/examples/mint-repl/sample_runs/reissue_manual.txt +++ b/examples/mint-repl/sample_runs/reissue_manual.txt @@ -31,7 +31,7 @@ Type 'help' to get started. Commands: Mint: [mintinfo, newmint, reissue] - Client: [newkey, prepare_tx, sign_tx, prepare_reissue, reissue_ez, decode, validate] + Client: [newkey, prepare_tx, sign_tx, reissue_ez, decode, validate] General: [exit, help] >> mintinfo @@ -40,45 +40,44 @@ Number of Mint Nodes: 1 -- Mint Keys -- -SecretKeySet (Poly): 3be16480526c03d2fd6b7f82c27ef109db9ebdb9feea9300174f3055bb7e52c80000000000000001 +SecretKeySet (Poly): 3d853287f6ddbfbc9a6b7667759f044acd7da0086dfd0d49abf4d1461d26e1dd0000000000000001 -PublicKeySet: 094af4b0f9f344586e215f3804bb4d59f1b498a75e2e502b858fcddd076f56dc7e444f24e769418646afd97557231ea70000000000000001 +PublicKeySet: e05bae55e06952a020eee1c20a264cb9601b8a6ea9ca56aaba0cb923d30d4bfb35406b0c70ac8421dd1c227d6c2e7cae0000000000000001 -- SecretKeyShares -- - 0. 3be16480526c03d2fd6b7f82c27ef109db9ebdb9feea9300174f3055bb7e52c8 - 1. 3be16480526c03d2fd6b7f82c27ef109db9ebdb9feea9300174f3055bb7e52c8 + 0. 3d853287f6ddbfbc9a6b7667759f044acd7da0086dfd0d49abf4d1461d26e1dd + 1. 3d853287f6ddbfbc9a6b7667759f044acd7da0086dfd0d49abf4d1461d26e1dd -- PublicKeyShares -- - 0. a71e235775d9af46864169e7244f447edc566f07ddcd8f852b502e5ea798b4f1594dbb04385f216e5844f3f9b0f44a09 - 1. a71e235775d9af46864169e7244f447edc566f07ddcd8f852b502e5ea798b4f1594dbb04385f216e5844f3f9b0f44a09 + 0. ae7c2e6c7d221cdd2184ac700c6b4035fb4b0dd323b90cbaaa56caa96e8a1b60b94c260ac2e1ee20a05269e055ae5be0 + 1. ae7c2e6c7d221cdd2184ac700c6b4035fb4b0dd323b90cbaaa56caa96e8a1b60b94c260ac2e1ee20a05269e055ae5be0 Required Signers: 1 (Threshold = 0) -- Genesis DBC -- -id: a71e235775d9af46864169e7244f447edc566f07ddcd8f852b502e5ea798b4f1594dbb04385f216e5844f3f9b0f44a09 +id: ae7c2e6c7d221cdd2184ac700c6b4035fb4b0dd323b90cbaaa56caa96e8a1b60b94c260ac2e1ee20a05269e055ae5be0 *** Secrets (decrypted) *** amount: 1000 - blinding_factor: 0e5121e53b41eef1f56a7dbae7d490289a0021de497c10e0ddc8852679037924 + blinding_factor: 0d94dbf10e8c99cbc127d06615c2bd4d6b2e493724c5c968b7af6365a46afe5d -owner: 094af4b0f9f344586e215f3804bb4d59f1b498a75e2e502b858fcddd076f56dc7e444f24e769418646afd97557231ea70000000000000001 +owner: e05bae55e06952a020eee1c20a264cb9601b8a6ea9ca56aaba0cb923d30d4bfb35406b0c70ac8421dd1c227d6c2e7cae0000000000000001 inputs: 97f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb outputs: - a71e235775d9af46864169e7244f447edc566f07ddcd8f852b502e5ea798b4f1594dbb04385f216e5844f3f9b0f44a09 + ae7c2e6c7d221cdd2184ac700c6b4035fb4b0dd323b90cbaaa56caa96e8a1b60b94c260ac2e1ee20a05269e055ae5be0 Data: -094af4b0f9f344586e215f3804bb4d59f1b498a75e2e502b858fcddd076f56dc7e444f24e769418646afd97557231ea70000000000000001021247f14cd394ed34af0cc9c2130bf753a01c4ddf0abbbf900412e542d7d494831e011e3930a09657e566b7a2f3bc1449fe4dc9f4237d122367751b6a5037447c334f64a20ec05cf96cf196e104c6aaa72b36065cf29d147eec0b0940df4895094af4b0f9f344586e215f3804bb4d59f1b498a75e2e502b858fcddd076f56dc7e444f24e769418646afd97557231ea7bbc622db0af03afbef1a7af93fe8556c58ac1b173f3a4ea105b974974f8c68c30faca94f8c63952694d79731a7d3f1970000000000000001094af4b0f9f344586e215f3804bb4d59f1b498a75e2e502b858fcddd076f56dc7e444f24e769418646afd97557231ea70000000000000001bbc622db0af03afbef1a7af93fe8556c58ac1b173f3a4ea105b974974f8c68c30faca94f8c63952694d79731a7d3f1970000000000000001094af4b0f9f344586e215f3804bb4d59f1b498a75e2e502b858fcddd076f56dc7e444f24e769418646afd97557231ea70d0a1815eb9597a4be42cb705aa51342c9d5cc632a690cfb352451ad2660743e00ffbdd3bf4913a3d88f270293b7be378ea4407989a72cb90cfcbc8072c3834a4d9eedf1c088f474929b955bbfeefb713548e15a7cfb6ed8d1920e739e200dae725bb4908e39c081e74a8bbba15f5daf093e2b7c755437e249c32d2dd55153447c83f6d8da95b6d447e164dbe79967a33de78013bd71214e176248db8c1a3b004bc8274e197e9f4b342bd74f5dccb720e1566c7cf3879ea5ee9dce44bee735a655afaac1f26904f573839ac2ae1c5901c4b77617a5a4b1aecbcdfa952979d7c248afdaeacb6df2e5e7d8e15d817aea30a1d14be18429d87490f91ac7be4f9b7e281ec3ed3a0e350b5aad9b17e60f8115127e4eb0f40f5f4c67cc4781b08ec62c56f5aee6d0815ce55c4cc56e1cd8b3ceec6f4cff4938604f0c57e716859809ae38c087452778b15b8c4226cc43824891f883333f61bd8748809d7a2e417c86e0700c0b2f32c3693058d24bd89aa84a00249c62d3b82931a9896def2b456f2366247954c0d61c4c7f6f8ab9e38a5b88e4224951112c7d690914f45a810fdc7cde7cd8b4635e5020a144db71f78581f4fdb736a82707771222b1d76f970bc6de360b9afd21a0afcf5edf7ab265e18d2bd3554421f976250908316ddc8d25f910bd0e5b33b2a93b5324232fe999c10ba80f48d3aa0f34be418a06a5e874f202b3560a3f7279baa4b0a653af5818bbbb33930a6cfd2567063d1384739be56ac7f70776ec78f23efa65d6f581ea9509ff2e3ed4178923de31a6eca987be79f7175fce76a26cb0a390dc3fa581db268829115892edd7336a9419b8dd20453656eecb927cfeeb2bc22a78ff350a4c9633225255023f522de85e0141e4c273b22f851f4829ddb8ea15aa679ca6ca95d5d15764b548c03410e151d2dc287028e2537b043a00000000000002a07abc430eb0c39eec37ec7c11951f29d079a01b7a4948d5b1a132e9b9253ec6ee40d7d1e3864cd7a262d95ddfac30d8213e6dd5ff4cef6f3342260078fff53ca82c228b8081fb2095afe08cb69bac6608cd5675adf767b2265f49b4430a4ec4e945e5f0163ed8107e193757516e81e72bd3bc2cba326b232de44907a92ddea2b94ea3e01961503a4ee98caa95b1dcfaf54d64101ad4982bd4f1c70797de71416889ec9b11bc31ab34000000000000002805ce12457b7667e97c9baa1a64abf7358a9862bb7f981e977a6198de2830f07fefc7c23c1697091320e48e8c577423b4bbc622db0af03afbef1a7af93fe8556c58ac1b173f3a4ea105b974974f8c68c30faca94f8c63952694d79731a7d3f1970000000000000001 +e05bae55e06952a020eee1c20a264cb9601b8a6ea9ca56aaba0cb923d30d4bfb35406b0c70ac8421dd1c227d6c2e7cae0000000000000001ae4b89ceed50027d6d54371909cac23358531d22325ac582e9b0e95c89a9ffbe363c9a86a4fbf7a1d741fcd0bfa7ca174f95fdc81e69a7fd30e38bb3d4404c9cc998b63ef5e3440c5ae79fac4f7961a5b6cae948c36422599d7c3fb4eadd048ae05bae55e06952a020eee1c20a264cb9601b8a6ea9ca56aaba0cb923d30d4bfb35406b0c70ac8421dd1c227d6c2e7caebbc622db0af03afbef1a7af93fe8556c58ac1b173f3a4ea105b974974f8c68c30faca94f8c63952694d79731a7d3f1970000000000000001e05bae55e06952a020eee1c20a264cb9601b8a6ea9ca56aaba0cb923d30d4bfb35406b0c70ac8421dd1c227d6c2e7cae0000000000000001bbc622db0af03afbef1a7af93fe8556c58ac1b173f3a4ea105b974974f8c68c30faca94f8c63952694d79731a7d3f1970000000000000001e05bae55e06952a020eee1c20a264cb9601b8a6ea9ca56aaba0cb923d30d4bfb35406b0c70ac8421dd1c227d6c2e7cae02e065dacf768fbda032ff5fc81a33b35a5a7438b976426d5d78a8bddbfb50090526499fa87bdd586d03fe41fb2aa353c6d226c2390ee93c222e98b2b77f90fd34f465cd34678b9bd6489efc3dbff846dfbc1a8a29b904f2502a7b50d20b27f27a867a348b9ce46e212f0b0967622f458ae7c9064cfa3825e3542f97eddf80ec44edcce6f1607c1cc42f9dfba9436723bc33adaa40e6209c42c629f723de5bec5483f1700d60c8061bf536ae7a0ee2a0b799ba12c52e25345d7d0440617b10124a5e8c037405299c61fa19f960cc8e5313b607238c3c321322b810ffe908d7c81babb158ecfd4db63580248815a7a3599a09fd15d2d2192e8a38cd2847929bae364b2f7e7fd9c79bd20356c39e083a6cc1524201582bd34be72c2795c9e1d46c4c33526aebc93da4d935b1953b2bc2490c200b5a1986f48aab8a4ccd83b9791020ba1592a687093354640a1760cad87c9b910947f693c97ff912c62d0ce406cc34af2fa68f4bb1a390c97e12c59ab5c08583d00de645d1910dff6e26c6b23c14465eb1763b21cc84b813ed51bbed17647b51b6493dc7be4b288100171f8a889c1812b2bad35f750ba1518468116c067fa0d41edb7d45cc24b1521b1c88a8fa440fa0f709175deef977b89d326a42df1bdd976cbfb30ed4b85157defe04363def00a39850021d669b288cc9ceb9a87050ef8547686cd87f962249104e026a22dc08a57ca37f0ea9775fa3cae120a303fdaf951ec5042d7d368d875f059bcc232d054e127fedbd4d14127e817b3eb896609dd9734f3648816d773f4462b9809a682d1c66445823bcda9e1935409f478fc1a08c62b848f0c20f00dd196359063ebc19009c28d89288286dfa4c8de37a9506c9319e62a7debe8ce5f927dc48328c162cee5fa4efb7bf8097d9ce531614128a0a265f3f556fad6db6b41fb70cee65c200000000000002a04a6d790c88780e1281d4a68356f211300a6e3f1bde92592428f6ce92ffc1b1482f1ecd04e4f81b3230bbf6f199480c1cb9b02a04f0238e60581c6eb9f6350e6add40f43d3641bfd00a2ca19a85f0df1189a6de5e04ef9f9d0a5b3e06c92ee9b8f4555e1c9f38813e55de9b3896c35d5adde22f4b41ce7a1a394b394563f121b31bc50136e6607477b3a0cf0e92d96768732ca02fc8be2024d7d11a98aecbb0fd7844752624cb18620000000000000028bbbacb64d0386816d3ffbac56036e3b3ac9c88554bd47cbff4fedb20b844352c578561d02fde69bd7addfb118cf4d1b7bbc622db0af03afbef1a7af93fe8556c58ac1b173f3a4ea105b974974f8c68c30faca94f8c63952694d79731a7d3f1970000000000000001 -- SpendBook -- - 97f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb >> newkey @@ -88,26 +87,26 @@ new How many shares needed to sign (m in m-of-n): 2 -- Poly Hex -- - 5e6e80e8066d9d7c0df204be6b409e5503478b3c52e8e44b47900b2115044c9b384694638154801a7ba2df42eba67444358fbddedbb706b2df7f95b762b706600000000000000002 + 6d369e002305168f9eef0dd4688350981edfa08b4f3fd9a12ed14d492b866fdd3b8b41cc61c7e4a44351298e76eb908bc2771106ee2e8b9d97c3078209f4adb60000000000000002 -- SecretKeyShares -- - 0. 22c76df85e24a04e565b0bf94d453a93e519a5182ea18eff270fa0d977bb52fa - 1. 0d48478d3af4c082311338afaee400e394a38c51818c174b6e9fabfb8cbf9f94 - 2. 6bb6c87541625dfe3f053d6e1a249f3897eb178dd474fb96b62fb71ca1c3ec2f - 3. 5637a20a1e327e3219bd6a247bc365884774fec7275f83e2fdbfc23eb6c838c9 - 4. 40b87b9efb029e65f47596dadd622bd7f6fee6007a4a0c2f454fcd60cbcc8563 - 5. 2b395533d7d2be99cf2dc3913f00f227a688cd39cd34947b8cdfd882e0d0d1fd + 0. 34d438795b2f7debaf065f5ad5cd091e8d990d8f3d70093fc69454cc357b1d92 + 1. 2e1d2f26549717331abb952734ae81b158bb0a178cb186e1f565a21661018d6e + 2. 276625d34dfeb07a8670caf3938ffa4423dd069fdbf304842436ef608c87fd4a + 3. 20af1c80476649c1f22600bff27172d6eeff03282b34822653083caab80e6d26 + 4. 19f8132d40cde3095ddb368c5152eb69ba20ffb07a75ffc881d989f4e394dd02 + 5. 134109da3a357c50c9906c58b03463fc8542fc38c9b77d6ab0aad73f0f1b4cde -- PublicKeyShares -- - 0. 9142035b220c7217a9939d0533e3c1d5ec811d8dbdfb1bca6e637cb5fa506b71352e790e9a7b20d29d961ace2e62a826 - 1. ace21761f097c21f347b8221ae25fc83c17509555e37c4ba512fc935da8551cc21f5d89d4c81d4255ad9867cb263117b - 2. ade451af6beee11e17dc0e305f8267f7ae5f79ebaa149d8d96130425bb7e7b72be4c5f9efc4af59022df9439234b46f6 - 3. a1eabb12199f0300bb53c0309cef2824d6d3dcb4768975600807e363649dcc225ad3a3c5edff9542ddce581aa7218c62 - 4. 953fc7b16221f7c688e62dae5d38343bad355dc4399de65f0b2663b3cbae8863643f20f7b4daee7da3741e959e27c21e - 5. b47b779798012b097c1b39c1b1aa6b368eea6a56bb7495dbc0c1cb24e48080c19a29aee4529810d05db3a0664398acab + 0. 8c0525db2ee13d29c3a63149e4a14d1ebf0de93fba7e896c509acc5f7fb07b4406e0152ded65f9ac5fe2bdb5916868fb + 1. 83f0f10c2706baee7c191fd7d1d8d9b3382afbe02b0afda35965ca00850e6d4710a4564e827615fbfc51749d7cf4b7b5 + 2. b381e432ba48e450d69705f044a31572b060f3d6f4c308a5e15d92d48146485c0f7ac0621e26f7d134a2a091157483cb + 3. b793cb697769b475d941db6df26fadcbd2881fcfecde799cd42102bd59545ed1ca8c7e657b8bc7898c3526ab3b816ad9 + 4. 83302131e4c7fdb4494261218fe8ab8f35f83b9f32261260cfb9a4ed905aa0a7a9652127c9b4014377251ffe569bbbef + 5. 8f69bf5297dbff870f3d0a1528340a7985bdcbc7174e3a860fbfe6fc2a30b41dcfd70ae8a0bc231a834628e7d478368a -- PublicKeySet -- -d16b06ffc7b7414e9a610b15850f88b5c0f11edbbd4e4b7f493912da5693b9379326e105cdf40cff53d993b7f2435e89648f4937b22cc80504c2cb2c13e10a5f7c5c5f8dbdd3ad34b8e30cb27b687518d953f42dc57acd10fe28fde801fee7ac0000000000000002 +f52a810cae8e4035d96647a215582f83069f216c2f5ab4f88b2d367521421310237a16def5211e94bc4d81c9e5b96cb78547cb06a63f788e144f7a3b9871c18fb2156563efd747c1c4cd95a17971acf7b616cdf81cf3fc2e27e53ca308d485ac0000000000000002 Signing Threshold: 1 (2 signers required) @@ -115,13 +114,13 @@ Signing Threshold: 1 (2 signers required) >> prepare_tx Input DBC, or 'done': -094af4b0f9f344586e215f3804bb4d59f1b498a75e2e502b858fcddd076f56dc7e444f24e769418646afd97557231ea70000000000000001021247f14cd394ed34af0cc9c2130bf753a01c4ddf0abbbf900412e542d7d494831e011e3930a09657e566b7a2f3bc1449fe4dc9f4237d122367751b6a5037447c334f64a20ec05cf96cf196e104c6aaa72b36065cf29d147eec0b0940df4895094af4b0f9f344586e215f3804bb4d59f1b498a75e2e502b858fcddd076f56dc7e444f24e769418646afd97557231ea7bbc622db0af03afbef1a7af93fe8556c58ac1b173f3a4ea105b974974f8c68c30faca94f8c63952694d79731a7d3f1970000000000000001094af4b0f9f344586e215f3804bb4d59f1b498a75e2e502b858fcddd076f56dc7e444f24e769418646afd97557231ea70000000000000001bbc622db0af03afbef1a7af93fe8556c58ac1b173f3a4ea105b974974f8c68c30faca94f8c63952694d79731a7d3f1970000000000000001094af4b0f9f344586e215f3804bb4d59f1b498a75e2e502b858fcddd076f56dc7e444f24e769418646afd97557231ea70d0a1815eb9597a4be42cb705aa51342c9d5cc632a690cfb352451ad2660743e00ffbdd3bf4913a3d88f270293b7be378ea4407989a72cb90cfcbc8072c3834a4d9eedf1c088f474929b955bbfeefb713548e15a7cfb6ed8d1920e739e200dae725bb4908e39c081e74a8bbba15f5daf093e2b7c755437e249c32d2dd55153447c83f6d8da95b6d447e164dbe79967a33de78013bd71214e176248db8c1a3b004bc8274e197e9f4b342bd74f5dccb720e1566c7cf3879ea5ee9dce44bee735a655afaac1f26904f573839ac2ae1c5901c4b77617a5a4b1aecbcdfa952979d7c248afdaeacb6df2e5e7d8e15d817aea30a1d14be18429d87490f91ac7be4f9b7e281ec3ed3a0e350b5aad9b17e60f8115127e4eb0f40f5f4c67cc4781b08ec62c56f5aee6d0815ce55c4cc56e1cd8b3ceec6f4cff4938604f0c57e716859809ae38c087452778b15b8c4226cc43824891f883333f61bd8748809d7a2e417c86e0700c0b2f32c3693058d24bd89aa84a00249c62d3b82931a9896def2b456f2366247954c0d61c4c7f6f8ab9e38a5b88e4224951112c7d690914f45a810fdc7cde7cd8b4635e5020a144db71f78581f4fdb736a82707771222b1d76f970bc6de360b9afd21a0afcf5edf7ab265e18d2bd3554421f976250908316ddc8d25f910bd0e5b33b2a93b5324232fe999c10ba80f48d3aa0f34be418a06a5e874f202b3560a3f7279baa4b0a653af5818bbbb33930a6cfd2567063d1384739be56ac7f70776ec78f23efa65d6f581ea9509ff2e3ed4178923de31a6eca987be79f7175fce76a26cb0a390dc3fa581db268829115892edd7336a9419b8dd20453656eecb927cfeeb2bc22a78ff350a4c9633225255023f522de85e0141e4c273b22f851f4829ddb8ea15aa679ca6ca95d5d15764b548c03410e151d2dc287028e2537b043a00000000000002a07abc430eb0c39eec37ec7c11951f29d079a01b7a4948d5b1a132e9b9253ec6ee40d7d1e3864cd7a262d95ddfac30d8213e6dd5ff4cef6f3342260078fff53ca82c228b8081fb2095afe08cb69bac6608cd5675adf767b2265f49b4430a4ec4e945e5f0163ed8107e193757516e81e72bd3bc2cba326b232de44907a92ddea2b94ea3e01961503a4ee98caa95b1dcfaf54d64101ad4982bd4f1c70797de71416889ec9b11bc31ab34000000000000002805ce12457b7667e97c9baa1a64abf7358a9862bb7f981e977a6198de2830f07fefc7c23c1697091320e48e8c577423b4bbc622db0af03afbef1a7af93fe8556c58ac1b173f3a4ea105b974974f8c68c30faca94f8c63952694d79731a7d3f1970000000000000001 +e05bae55e06952a020eee1c20a264cb9601b8a6ea9ca56aaba0cb923d30d4bfb35406b0c70ac8421dd1c227d6c2e7cae0000000000000001ae4b89ceed50027d6d54371909cac23358531d22325ac582e9b0e95c89a9ffbe363c9a86a4fbf7a1d741fcd0bfa7ca174f95fdc81e69a7fd30e38bb3d4404c9cc998b63ef5e3440c5ae79fac4f7961a5b6cae948c36422599d7c3fb4eadd048ae05bae55e06952a020eee1c20a264cb9601b8a6ea9ca56aaba0cb923d30d4bfb35406b0c70ac8421dd1c227d6c2e7caebbc622db0af03afbef1a7af93fe8556c58ac1b173f3a4ea105b974974f8c68c30faca94f8c63952694d79731a7d3f1970000000000000001e05bae55e06952a020eee1c20a264cb9601b8a6ea9ca56aaba0cb923d30d4bfb35406b0c70ac8421dd1c227d6c2e7cae0000000000000001bbc622db0af03afbef1a7af93fe8556c58ac1b173f3a4ea105b974974f8c68c30faca94f8c63952694d79731a7d3f1970000000000000001e05bae55e06952a020eee1c20a264cb9601b8a6ea9ca56aaba0cb923d30d4bfb35406b0c70ac8421dd1c227d6c2e7cae02e065dacf768fbda032ff5fc81a33b35a5a7438b976426d5d78a8bddbfb50090526499fa87bdd586d03fe41fb2aa353c6d226c2390ee93c222e98b2b77f90fd34f465cd34678b9bd6489efc3dbff846dfbc1a8a29b904f2502a7b50d20b27f27a867a348b9ce46e212f0b0967622f458ae7c9064cfa3825e3542f97eddf80ec44edcce6f1607c1cc42f9dfba9436723bc33adaa40e6209c42c629f723de5bec5483f1700d60c8061bf536ae7a0ee2a0b799ba12c52e25345d7d0440617b10124a5e8c037405299c61fa19f960cc8e5313b607238c3c321322b810ffe908d7c81babb158ecfd4db63580248815a7a3599a09fd15d2d2192e8a38cd2847929bae364b2f7e7fd9c79bd20356c39e083a6cc1524201582bd34be72c2795c9e1d46c4c33526aebc93da4d935b1953b2bc2490c200b5a1986f48aab8a4ccd83b9791020ba1592a687093354640a1760cad87c9b910947f693c97ff912c62d0ce406cc34af2fa68f4bb1a390c97e12c59ab5c08583d00de645d1910dff6e26c6b23c14465eb1763b21cc84b813ed51bbed17647b51b6493dc7be4b288100171f8a889c1812b2bad35f750ba1518468116c067fa0d41edb7d45cc24b1521b1c88a8fa440fa0f709175deef977b89d326a42df1bdd976cbfb30ed4b85157defe04363def00a39850021d669b288cc9ceb9a87050ef8547686cd87f962249104e026a22dc08a57ca37f0ea9775fa3cae120a303fdaf951ec5042d7d368d875f059bcc232d054e127fedbd4d14127e817b3eb896609dd9734f3648816d773f4462b9809a682d1c66445823bcda9e1935409f478fc1a08c62b848f0c20f00dd196359063ebc19009c28d89288286dfa4c8de37a9506c9319e62a7debe8ce5f927dc48328c162cee5fa4efb7bf8097d9ce531614128a0a265f3f556fad6db6b41fb70cee65c200000000000002a04a6d790c88780e1281d4a68356f211300a6e3f1bde92592428f6ce92ffc1b1482f1ecd04e4f81b3230bbf6f199480c1cb9b02a04f0238e60581c6eb9f6350e6add40f43d3641bfd00a2ca19a85f0df1189a6de5e04ef9f9d0a5b3e06c92ee9b8f4555e1c9f38813e55de9b3896c35d5adde22f4b41ce7a1a394b394563f121b31bc50136e6607477b3a0cf0e92d96768732ca02fc8be2024d7d11a98aecbb0fd7844752624cb18620000000000000028bbbacb64d0386816d3ffbac56036e3b3ac9c88554bd47cbff4fedb20b844352c578561d02fde69bd7addfb118cf4d1b7bbc622db0af03afbef1a7af93fe8556c58ac1b173f3a4ea105b974974f8c68c30faca94f8c63952694d79731a7d3f1970000000000000001 We need 1 SecretKeyShare in order to decrypt the input amount. We have 0 of 1 required SecretKeyShare SecretKeyShare, or 'done': -3be16480526c03d2fd6b7f82c27ef109db9ebdb9feea9300174f3055bb7e52c8 +3d853287f6ddbfbc9a6b7667759f044acd7da0086dfd0d49abf4d1461d26e1dd SecretKeyShare Index: 0 @@ -136,7 +135,7 @@ Inputs total: 1000. Remaining: 1000 Amount, or 'cancel': 900 PublicKeySet, or 'cancel': -d16b06ffc7b7414e9a610b15850f88b5c0f11edbbd4e4b7f493912da5693b9379326e105cdf40cff53d993b7f2435e89648f4937b22cc80504c2cb2c13e10a5f7c5c5f8dbdd3ad34b8e30cb27b687518d953f42dc57acd10fe28fde801fee7ac0000000000000002 +f52a810cae8e4035d96647a215582f83069f216c2f5ab4f88b2d367521421310237a16def5211e94bc4d81c9e5b96cb78547cb06a63f788e144f7a3b9871c18fb2156563efd747c1c4cd95a17971acf7b616cdf81cf3fc2e27e53ca308d485ac0000000000000002 ------------ Output #1 @@ -146,7 +145,7 @@ Inputs total: 1000. Remaining: 100 Amount, or 'cancel': 100 PublicKeySet, or 'cancel': -d16b06ffc7b7414e9a610b15850f88b5c0f11edbbd4e4b7f493912da5693b9379326e105cdf40cff53d993b7f2435e89648f4937b22cc80504c2cb2c13e10a5f7c5c5f8dbdd3ad34b8e30cb27b687518d953f42dc57acd10fe28fde801fee7ac0000000000000002 +f52a810cae8e4035d96647a215582f83069f216c2f5ab4f88b2d367521421310237a16def5211e94bc4d81c9e5b96cb78547cb06a63f788e144f7a3b9871c18fb2156563efd747c1c4cd95a17971acf7b616cdf81cf3fc2e27e53ca308d485ac0000000000000002 Thank-you. Preparing ReissueTransaction... @@ -154,91 +153,47 @@ Thank-you. Preparing ReissueTransaction... -- ReissueTransaction -- -d16b06ffc7b7414e9a610b15850f88b5c0f11edbbd4e4b7f493912da5693b9379326e105cdf40cff53d993b7f2435e89648f4937b22cc80504c2cb2c13e10a5f7c5c5f8dbdd3ad34b8e30cb27b687518d953f42dc57acd10fe28fde801fee7ac0000000000000002648f4937b22cc80504c2cb2c13e10a5f7c5c5f8dbdd3ad34b8e30cb27b687518d953f42dc57acd10fe28fde801fee7ac0000000000000001094af4b0f9f344586e215f3804bb4d59f1b498a75e2e502b858fcddd076f56dc7e444f24e769418646afd97557231ea70000000000000001094af4b0f9f344586e215f3804bb4d59f1b498a75e2e502b858fcddd076f56dc7e444f24e769418646afd97557231ea70000000000000001648f4937b22cc80504c2cb2c13e10a5f7c5c5f8dbdd3ad34b8e30cb27b687518d953f42dc57acd10fe28fde801fee7ac02d662d88336e96b4dc49155f81de806bd2cdb6503c08c06ee0e561c2c586ce80b7b30facadc609745db219c82e329ae5fa97a092d7dcf5a16a71b6a7fa0e54e2a5a8bc3703de161dae37c63d82239bf7fe051319c56e01b13a7a96de3563bd2634b24889769d3a1a363521c4da0be1221fec32aea0aa8930f7aaa4d516cf96e1de8da9c307ddd9470c55c56b9a8c8e12aba0dbe3ba3e9bba9a7eff30d00fc6006ca8c2556a35e7cccd18f03fd0b26e88928fb1de066237d18f0a5bfac11c4901dd9498128b7f77a4f35a8b9389ebd2ed09a7c9b6c13249d77015a5748645ca2339b016737364791fea6c316507cbd0d6cf5765ac81d1cc25a17328529cbc57e6f743c542f02a919fca2ce065ab9fc157f67ed388e4f493c125f5b78b4a1fda414f7dcfa036b37fa2c86d516f1259b31d57cc41806859df3cab837bfeebd1f26120ef226f2941136fafc67dd12fe11787627c88201def2e978f086cebe279cc6457c060eabb88c5e4848aac97eeace8e52859f4f483121da3a0b9b61e364efd25b9d91446421c7a7de20805ee492591e2e2990919462805ae065070ab9f6f76e0f9f5b3e2a4b44109446fc4b6cd07247dcfc30248592ca5ee095a6824d6e926803495fada87043d33d493c635f2c9d4fd327e6486662bb09b7f2d0842d59162601a1ab5ed223319d0255261a04a71ef6dfdb577b0bac325d2662da7b42dfbb9707b4cf3dbbcb3d184403b66e596256e4e04d92e579dc20a1219e9c13428bc8707e6445112cdf2ab34ff9ae2ae57d2201e6a3ddd59139c6d348f579112a8a933a67e92bf925db76085c7abc2d63261b2b8f129882e6e3bb6b821d7ccad2efd7ec5fcb9250e253b3deb02b2ee8d47bb943d12799f7f83731abc30a62bea94534881bec0d5ef069b0be0a8ade44a252396e5b34ef86664da50e023f986ade70800e00000000000002a00297a9cb06a7c29b2372b220a4436c46ce74ce991213b7c49839a62fd9116a520f4dbe391ff8fc2ff35a792bf22d8248ff577f6efec2fa1678934eee55cb26cb56e9ddf2ea88f8054e2bc0897e4c890a31e509a47dc3a1db8c5b1264b2c7675bd0806d885e73773e7009d7450dc1135833c3e198aeddf6a49bf19615cc216db804403895c772c6a6de7b211ff233d7d059cc381ca2e4bb319b86f304f9c50f0bd459eba61db7531800000000000000287ec664e088d6fe82746ad585b493fa14d21a330495ed66d5869a37050caec3e5d1294c4a21e6bd8899f92f007dadd4b6835f89937d786b69413041c49a2e1c81bb9315fda3449c9a6454f14ef19611af38cde8fd2d362f32ffd023c651c263950000000000000001648f4937b22cc80504c2cb2c13e10a5f7c5c5f8dbdd3ad34b8e30cb27b687518d953f42dc57acd10fe28fde801fee7ac05609247e364a5faa363cffaec1dbdc2f96db226275d2a7581de7b271c2f8e780875dc4f799f910deac2a547da5305732dd8d700bd1342c52b3dd7c05047f4e20252bf329749ce8abb1ef5ab44fd6bd65a0e8a2d11a5279be5bddfdd4294ed9e2cc1744a5030cbc39aedd2da9961b2161ce8b0f6670bab88844cdb6a93d1ebfa5a72185150878036ab038fd5c16b9384ebcfc63d64e06e6aa8172dde925bdff4200ac18cd0e82a209fe3bf382afdf15cee494a8d1cf862d3c784aa2c513de12c32acce82cf9d3fdf3c82aba25afcb458e5917b76ab1160d462cb3d0fa0050b4459b232670fa8f2d7c1be4fbde634e17a706233e41b491316be0fd318922e565e0847139f65a4d77d7349185d132143c66b765437ef82d83bb94d141f8a35380e1a499c02e8ec3966048551714469d46bdacd8c7e5b96886b855ff2d8e98fa52c56a56612cb84c5e370029e90a964a6f74a66fa79aa82d0955be423e68bcf15ca1b186da2588994c9cbe519cefe0bdd3be5c59f2053299e27bbc9f3fb4b72716e68f1f4663cb7926b9273028fedeecc4418382fa1fa9c432b853c3295f38736f015be8fbacf9aa9c937e3466df09fff9a8d9f2d69bdc46af61ccc6fbf603ee0e2022e02f59f1cbe0bd99cee23a0f5a34cde82fc15d5968b98c5a7572d5dd660560868a915a5d4c72c1eea79dc52513047a9196a4335b52a1171a5fcfbeb1dcb1204415c9702727014d9f59614a15f698c916cac6190257bd9b687ef7a6bf34cf41da3d71fbcdabb7cca6e391687dcbc21aef12bfc00dea2e98a99e3fdfdbbc6c23579981a24d226315710ea0cca20cdddc14633e8408f93be5c05dde8c9bd2698690df4b93d61d6ecb4e054d74cb3763421cabb7a32a7f69301f70a514cd5453c6668fa9629af315bb9a225ead51c479c165981a6253865ab2813d4ace8c8705000000000000002a0727e443a582f549efc2b09a8548d371abcefaa3d52ca392e1c31b56dd8b9332c6d988e38c0598c30a6af7cf39cfa1625b86c0a09966ff47da8ea8daa78ac4b3fa029a3be277c7ae012d2789b477c790b3a2e2ae926bd4ab6426563a05ad8c0d65430cf8208aca5cb5176bc923ddde79502bb4d3759d9fc899b519b016f4ab587dca3d40da78980d3fa9a20e1d3f32a5573f48c262b382f632ddb435ede55279dc82c276045d0c9c300000000000000289d56f04d0f0b585728e6fbb1390e40cc556cefd5a709105ad0c10b7a25d51c4ee68def6a731be81c20d20adfb069a395835f89937d786b69413041c49a2e1c81bb9315fda3449c9a6454f14ef19611af38cde8fd2d362f32ffd023c651c2639500000000000000010000000000000002021247f14cd394ed34af0cc9c2130bf753a01c4ddf0abbbf900412e542d7d494831e011e3930a09657e566b7a2f3bc1449fe4dc9f4237d122367751b6a5037447c334f64a20ec05cf96cf196e104c6aaa72b36065cf29d147eec0b0940df4895094af4b0f9f344586e215f3804bb4d59f1b498a75e2e502b858fcddd076f56dc7e444f24e769418646afd97557231ea7bbc622db0af03afbef1a7af93fe8556c58ac1b173f3a4ea105b974974f8c68c30faca94f8c63952694d79731a7d3f1970000000000000001094af4b0f9f344586e215f3804bb4d59f1b498a75e2e502b858fcddd076f56dc7e444f24e769418646afd97557231ea70000000000000001bbc622db0af03afbef1a7af93fe8556c58ac1b173f3a4ea105b974974f8c68c30faca94f8c63952694d79731a7d3f1970000000000000001094af4b0f9f344586e215f3804bb4d59f1b498a75e2e502b858fcddd076f56dc7e444f24e769418646afd97557231ea70d0a1815eb9597a4be42cb705aa51342c9d5cc632a690cfb352451ad2660743e00ffbdd3bf4913a3d88f270293b7be378ea4407989a72cb90cfcbc8072c3834a4d9eedf1c088f474929b955bbfeefb713548e15a7cfb6ed8d1920e739e200dae725bb4908e39c081e74a8bbba15f5daf093e2b7c755437e249c32d2dd55153447c83f6d8da95b6d447e164dbe79967a33de78013bd71214e176248db8c1a3b004bc8274e197e9f4b342bd74f5dccb720e1566c7cf3879ea5ee9dce44bee735a655afaac1f26904f573839ac2ae1c5901c4b77617a5a4b1aecbcdfa952979d7c248afdaeacb6df2e5e7d8e15d817aea30a1d14be18429d87490f91ac7be4f9b7e281ec3ed3a0e350b5aad9b17e60f8115127e4eb0f40f5f4c67cc4781b08ec62c56f5aee6d0815ce55c4cc56e1cd8b3ceec6f4cff4938604f0c57e716859809ae38c087452778b15b8c4226cc43824891f883333f61bd8748809d7a2e417c86e0700c0b2f32c3693058d24bd89aa84a00249c62d3b82931a9896def2b456f2366247954c0d61c4c7f6f8ab9e38a5b88e4224951112c7d690914f45a810fdc7cde7cd8b4635e5020a144db71f78581f4fdb736a82707771222b1d76f970bc6de360b9afd21a0afcf5edf7ab265e18d2bd3554421f976250908316ddc8d25f910bd0e5b33b2a93b5324232fe999c10ba80f48d3aa0f34be418a06a5e874f202b3560a3f7279baa4b0a653af5818bbbb33930a6cfd2567063d1384739be56ac7f70776ec78f23efa65d6f581ea9509ff2e3ed4178923de31a6eca987be79f7175fce76a26cb0a390dc3fa581db268829115892edd7336a9419b8dd20453656eecb927cfeeb2bc22a78ff350a4c9633225255023f522de85e0141e4c273b22f851f4829ddb8ea15aa679ca6ca95d5d15764b548c03410e151d2dc287028e2537b043a00000000000002a07abc430eb0c39eec37ec7c11951f29d079a01b7a4948d5b1a132e9b9253ec6ee40d7d1e3864cd7a262d95ddfac30d8213e6dd5ff4cef6f3342260078fff53ca82c228b8081fb2095afe08cb69bac6608cd5675adf767b2265f49b4430a4ec4e945e5f0163ed8107e193757516e81e72bd3bc2cba326b232de44907a92ddea2b94ea3e01961503a4ee98caa95b1dcfaf54d64101ad4982bd4f1c70797de71416889ec9b11bc31ab34000000000000002805ce12457b7667e97c9baa1a64abf7358a9862bb7f981e977a6198de2830f07fefc7c23c1697091320e48e8c577423b4bbc622db0af03afbef1a7af93fe8556c58ac1b173f3a4ea105b974974f8c68c30faca94f8c63952694d79731a7d3f19700000000000000010000000000000001 +f52a810cae8e4035d96647a215582f83069f216c2f5ab4f88b2d367521421310237a16def5211e94bc4d81c9e5b96cb78547cb06a63f788e144f7a3b9871c18fb2156563efd747c1c4cd95a17971acf7b616cdf81cf3fc2e27e53ca308d485ac00000000000000028547cb06a63f788e144f7a3b9871c18fb2156563efd747c1c4cd95a17971acf7b616cdf81cf3fc2e27e53ca308d485ac0000000000000001e05bae55e06952a020eee1c20a264cb9601b8a6ea9ca56aaba0cb923d30d4bfb35406b0c70ac8421dd1c227d6c2e7cae0000000000000001e05bae55e06952a020eee1c20a264cb9601b8a6ea9ca56aaba0cb923d30d4bfb35406b0c70ac8421dd1c227d6c2e7cae00000000000000018547cb06a63f788e144f7a3b9871c18fb2156563efd747c1c4cd95a17971acf7b616cdf81cf3fc2e27e53ca308d485ac0319e3c87f4287bcf42d1b87978246c731015bc54448262ccb9288db0d026e1006d0983c4d8d730d5eb34a8dc96daebe8dd3ab658373473fe33acead27477e85145352cc091b4bb26ce7a79ca11e0d4e93614b8fa7678e3be53c979128f3dbd648967d32218fc2481d0fa3266e6603dc9a708fc87a261d2d776ad8ab69b71d38327a6c458c339b7d1009b1ac2854996a1b70cd55d3f0a580217abc6dc9886bb00715f485bedc5a14d7f94a5f17c5bfc2e2c8553b9dd14df3d7074e9cf51f3b927e2be72ad57c9ef33444859b407104467b6b18a27e1d2664b28ca52464415326764bc600b1d7d2834e53de856e34954201deb062850d89ee4558b12066f8d0641e79cf4ea90abc14b82f9842561b3645cd09920dacd8cc0898b3e6b13e5bc26612abd9605112d645aa00fdf05645dbca93fb3572e3d29d375f8298d4cdfac9e05101a20c9e3c30b9af723b3e799c84a4d8314374656f076f5480500e84f3d7d434a5768b90ce13e40dfdc1fdbfe2df5d1207b1ec931ce2445325b75796c237cc34e8caf7f1a01bd0184e97be7ab035416ecd6c3fab8a53d2a4f94266c3757d74194aa86b66ec678afe29f0d14c84311363cf66492d15db45ef2dd69bb683c3f80a08b1b256574451c74d721b9a52ff1e1dd39d1b052afd66493b9c2554a896530d01ba320f149cbf517f5e6dab9222f7473de7ec65d5289e6c08e18d31e6e67901b855f4727ad9ed19104ac55c9cb7a4aa5ca8b4464ae632eb87f1fd392b2ea123723bea052ea066a9364fd366d005a8a0176461a409aabda53a64126e3b95aa39b277316efdc2a2a23ad1eb10c4568271ea6227f9ec3b64206e9d2e0f4b44b67f2cb7974d604338ffa584fbea446719a8a3f77c24cedcebc640de4c3301130a5d8fff0bddcf0e999affec415cdec12f185f04db12bc84b66a5ba561b489e23600000000000002a0509b15d5605e9fca106e66c1dd616394c78b506f4dd875fe0e344f4224c551cc9bdf1426e01e620c4a528d6e47a437c47220496df2b96a479e1dd8f22f090a1d70c3325600722182f94dfbdf4ebaa610fbb63de2fd196ea36598ed0d929d863e0d5f926241aa82a5e01c93c734f78ba37b119317dd8fc3064bbeeeb9e935aeb732f94587f205368d9311cc755a35e8b9ffca29bfcf9dc6ae96a3ac1ce67f6ac6689207860cf25d6f0000000000000028c0570964d6220618189ce311ebe3cc6791ed763b87f97efbad61c4733eb0c7283247be3203af64b04732e15cd07a4aa07ac7a9b989d9a17c3b9cdbb94402a08b853f325b8179aec6bfd06f29a4fc9d3d67a8f720ead2bd27c0033d274fb257af00000000000000018547cb06a63f788e144f7a3b9871c18fb2156563efd747c1c4cd95a17971acf7b616cdf81cf3fc2e27e53ca308d485ac0429046e8ffe81bf259642616f69ef76c3d86ee868ccb904835b1b1f07fde7400648e9699e11d4810161cf3eee47b50b06aab6945042989a77804dbc6fcbb199089e0c689cb8c3217fc06cff1fa9982873dcf4824e4ed7b869f9dd4332487514046f75ec5c69469cc5972dbf2eb2b4f56094cb987ab8774dcecb41675d2310dc3f734b392a9732ee471cc7d4c2a2db308bc1b4a04d2b9863dbfb4948cfdd0a7002f78e8fdf6c68bcde0ac24966b4246c28b5cf83c5443d7fb3e612f9e955146e5e19f8857ef4d6d9099a80de831b66a4a78941c0d825b5337980118c6bd472e014f23b89a115142fc3f43cfb7e095936b4fd64b4c000b381fced479bd0a1380475183316071c6e4673001648eeb604e20b54779912f5c48b782e7dd83e8f5d6a0a53fae9261f5494af2549f54c755d181d09a64c45ec5e40bf9f042744cd464440505038cef79ef60ffb8006bb9ee10271ec4ea998765c4fd4faa6148dab6c22213322faf3fa409aaee8a13d0aba207e355e42ec279fa924c911942d4344a6c47cdf78b4991f99b9d35f05eead53d754d07069d89594cd702bb30000ec4af9fc1728df5689d06fb6465c1371d39107e5056de94d20b3f6800b313b544c18583208d94e2603ae2a157cf6f1dd5b18dc8d499f6a8c5eb06d4a26aad493b2f9a66a02ae05b9bb43a76421ae50c5df5d6e1dba48c05cd6069313d3af1c2b0d71357a0c4ce30ed0e53053a1ac9a0a8edce594cc1bc26c95eab0b85488f934941977783d162393777eb38cca0729e3be097a3c443ea3ebc40037c545c4dedee24b60d416239b18e201726b881e6cd76c7dce2cf26b626665a344f5181cac3787bce19a0a9480ddfa289f67942be622f1fcdb440f4d7c7a664581d961cac0e5ad588b8649c33b1e4ad83ac6256420370eee198f63924b12481ae2e58d6f79a549b8454800000000000002a00007113bb9e6207717b3b14e5ac51bc27f79cbb5775d815cb707e8bae644fcc8d68aade01cf051f154df4385a4ac60612c9666f5ff4e5ac54f60a4dc9cca21faf3f628871157cfa4793180c5831b9c11783df76d1587c6077ee39c0018ca9f31d087336d5f46715b9412ea533aa984be87e8bb9f323d803dd3ea09807e7325a4d4439cd77e2072ee7f836d457a4989cd746a3e8f15f978d0a061816b606a95e0a264cf0d195f4ac00000000000000028fe474c01fcf5b3c6e43c9e1ad7c1541c1089d666c15285c17bfc146cc3a8ce221a38de036e075e32f79ad839e8e2c4877ac7a9b989d9a17c3b9cdbb94402a08b853f325b8179aec6bfd06f29a4fc9d3d67a8f720ead2bd27c0033d274fb257af00000000000000010000000000000002ae4b89ceed50027d6d54371909cac23358531d22325ac582e9b0e95c89a9ffbe363c9a86a4fbf7a1d741fcd0bfa7ca174f95fdc81e69a7fd30e38bb3d4404c9cc998b63ef5e3440c5ae79fac4f7961a5b6cae948c36422599d7c3fb4eadd048ae05bae55e06952a020eee1c20a264cb9601b8a6ea9ca56aaba0cb923d30d4bfb35406b0c70ac8421dd1c227d6c2e7caebbc622db0af03afbef1a7af93fe8556c58ac1b173f3a4ea105b974974f8c68c30faca94f8c63952694d79731a7d3f1970000000000000001e05bae55e06952a020eee1c20a264cb9601b8a6ea9ca56aaba0cb923d30d4bfb35406b0c70ac8421dd1c227d6c2e7cae0000000000000001bbc622db0af03afbef1a7af93fe8556c58ac1b173f3a4ea105b974974f8c68c30faca94f8c63952694d79731a7d3f1970000000000000001e05bae55e06952a020eee1c20a264cb9601b8a6ea9ca56aaba0cb923d30d4bfb35406b0c70ac8421dd1c227d6c2e7cae02e065dacf768fbda032ff5fc81a33b35a5a7438b976426d5d78a8bddbfb50090526499fa87bdd586d03fe41fb2aa353c6d226c2390ee93c222e98b2b77f90fd34f465cd34678b9bd6489efc3dbff846dfbc1a8a29b904f2502a7b50d20b27f27a867a348b9ce46e212f0b0967622f458ae7c9064cfa3825e3542f97eddf80ec44edcce6f1607c1cc42f9dfba9436723bc33adaa40e6209c42c629f723de5bec5483f1700d60c8061bf536ae7a0ee2a0b799ba12c52e25345d7d0440617b10124a5e8c037405299c61fa19f960cc8e5313b607238c3c321322b810ffe908d7c81babb158ecfd4db63580248815a7a3599a09fd15d2d2192e8a38cd2847929bae364b2f7e7fd9c79bd20356c39e083a6cc1524201582bd34be72c2795c9e1d46c4c33526aebc93da4d935b1953b2bc2490c200b5a1986f48aab8a4ccd83b9791020ba1592a687093354640a1760cad87c9b910947f693c97ff912c62d0ce406cc34af2fa68f4bb1a390c97e12c59ab5c08583d00de645d1910dff6e26c6b23c14465eb1763b21cc84b813ed51bbed17647b51b6493dc7be4b288100171f8a889c1812b2bad35f750ba1518468116c067fa0d41edb7d45cc24b1521b1c88a8fa440fa0f709175deef977b89d326a42df1bdd976cbfb30ed4b85157defe04363def00a39850021d669b288cc9ceb9a87050ef8547686cd87f962249104e026a22dc08a57ca37f0ea9775fa3cae120a303fdaf951ec5042d7d368d875f059bcc232d054e127fedbd4d14127e817b3eb896609dd9734f3648816d773f4462b9809a682d1c66445823bcda9e1935409f478fc1a08c62b848f0c20f00dd196359063ebc19009c28d89288286dfa4c8de37a9506c9319e62a7debe8ce5f927dc48328c162cee5fa4efb7bf8097d9ce531614128a0a265f3f556fad6db6b41fb70cee65c200000000000002a04a6d790c88780e1281d4a68356f211300a6e3f1bde92592428f6ce92ffc1b1482f1ecd04e4f81b3230bbf6f199480c1cb9b02a04f0238e60581c6eb9f6350e6add40f43d3641bfd00a2ca19a85f0df1189a6de5e04ef9f9d0a5b3e06c92ee9b8f4555e1c9f38813e55de9b3896c35d5adde22f4b41ce7a1a394b394563f121b31bc50136e6607477b3a0cf0e92d96768732ca02fc8be2024d7d11a98aecbb0fd7844752624cb18620000000000000028bbbacb64d0386816d3ffbac56036e3b3ac9c88554bd47cbff4fedb20b844352c578561d02fde69bd7addfb118cf4d1b7bbc622db0af03afbef1a7af93fe8556c58ac1b173f3a4ea105b974974f8c68c30faca94f8c63952694d79731a7d3f19700000000000000010000000000000001 -- End ReissueTransaction -- ->> sign_tx - -ReissueTransaction: -d16b06ffc7b7414e9a610b15850f88b5c0f11edbbd4e4b7f493912da5693b9379326e105cdf40cff53d993b7f2435e89648f4937b22cc80504c2cb2c13e10a5f7c5c5f8dbdd3ad34b8e30cb27b687518d953f42dc57acd10fe28fde801fee7ac0000000000000002648f4937b22cc80504c2cb2c13e10a5f7c5c5f8dbdd3ad34b8e30cb27b687518d953f42dc57acd10fe28fde801fee7ac0000000000000001094af4b0f9f344586e215f3804bb4d59f1b498a75e2e502b858fcddd076f56dc7e444f24e769418646afd97557231ea70000000000000001094af4b0f9f344586e215f3804bb4d59f1b498a75e2e502b858fcddd076f56dc7e444f24e769418646afd97557231ea70000000000000001648f4937b22cc80504c2cb2c13e10a5f7c5c5f8dbdd3ad34b8e30cb27b687518d953f42dc57acd10fe28fde801fee7ac02d662d88336e96b4dc49155f81de806bd2cdb6503c08c06ee0e561c2c586ce80b7b30facadc609745db219c82e329ae5fa97a092d7dcf5a16a71b6a7fa0e54e2a5a8bc3703de161dae37c63d82239bf7fe051319c56e01b13a7a96de3563bd2634b24889769d3a1a363521c4da0be1221fec32aea0aa8930f7aaa4d516cf96e1de8da9c307ddd9470c55c56b9a8c8e12aba0dbe3ba3e9bba9a7eff30d00fc6006ca8c2556a35e7cccd18f03fd0b26e88928fb1de066237d18f0a5bfac11c4901dd9498128b7f77a4f35a8b9389ebd2ed09a7c9b6c13249d77015a5748645ca2339b016737364791fea6c316507cbd0d6cf5765ac81d1cc25a17328529cbc57e6f743c542f02a919fca2ce065ab9fc157f67ed388e4f493c125f5b78b4a1fda414f7dcfa036b37fa2c86d516f1259b31d57cc41806859df3cab837bfeebd1f26120ef226f2941136fafc67dd12fe11787627c88201def2e978f086cebe279cc6457c060eabb88c5e4848aac97eeace8e52859f4f483121da3a0b9b61e364efd25b9d91446421c7a7de20805ee492591e2e2990919462805ae065070ab9f6f76e0f9f5b3e2a4b44109446fc4b6cd07247dcfc30248592ca5ee095a6824d6e926803495fada87043d33d493c635f2c9d4fd327e6486662bb09b7f2d0842d59162601a1ab5ed223319d0255261a04a71ef6dfdb577b0bac325d2662da7b42dfbb9707b4cf3dbbcb3d184403b66e596256e4e04d92e579dc20a1219e9c13428bc8707e6445112cdf2ab34ff9ae2ae57d2201e6a3ddd59139c6d348f579112a8a933a67e92bf925db76085c7abc2d63261b2b8f129882e6e3bb6b821d7ccad2efd7ec5fcb9250e253b3deb02b2ee8d47bb943d12799f7f83731abc30a62bea94534881bec0d5ef069b0be0a8ade44a252396e5b34ef86664da50e023f986ade70800e00000000000002a00297a9cb06a7c29b2372b220a4436c46ce74ce991213b7c49839a62fd9116a520f4dbe391ff8fc2ff35a792bf22d8248ff577f6efec2fa1678934eee55cb26cb56e9ddf2ea88f8054e2bc0897e4c890a31e509a47dc3a1db8c5b1264b2c7675bd0806d885e73773e7009d7450dc1135833c3e198aeddf6a49bf19615cc216db804403895c772c6a6de7b211ff233d7d059cc381ca2e4bb319b86f304f9c50f0bd459eba61db7531800000000000000287ec664e088d6fe82746ad585b493fa14d21a330495ed66d5869a37050caec3e5d1294c4a21e6bd8899f92f007dadd4b6835f89937d786b69413041c49a2e1c81bb9315fda3449c9a6454f14ef19611af38cde8fd2d362f32ffd023c651c263950000000000000001648f4937b22cc80504c2cb2c13e10a5f7c5c5f8dbdd3ad34b8e30cb27b687518d953f42dc57acd10fe28fde801fee7ac05609247e364a5faa363cffaec1dbdc2f96db226275d2a7581de7b271c2f8e780875dc4f799f910deac2a547da5305732dd8d700bd1342c52b3dd7c05047f4e20252bf329749ce8abb1ef5ab44fd6bd65a0e8a2d11a5279be5bddfdd4294ed9e2cc1744a5030cbc39aedd2da9961b2161ce8b0f6670bab88844cdb6a93d1ebfa5a72185150878036ab038fd5c16b9384ebcfc63d64e06e6aa8172dde925bdff4200ac18cd0e82a209fe3bf382afdf15cee494a8d1cf862d3c784aa2c513de12c32acce82cf9d3fdf3c82aba25afcb458e5917b76ab1160d462cb3d0fa0050b4459b232670fa8f2d7c1be4fbde634e17a706233e41b491316be0fd318922e565e0847139f65a4d77d7349185d132143c66b765437ef82d83bb94d141f8a35380e1a499c02e8ec3966048551714469d46bdacd8c7e5b96886b855ff2d8e98fa52c56a56612cb84c5e370029e90a964a6f74a66fa79aa82d0955be423e68bcf15ca1b186da2588994c9cbe519cefe0bdd3be5c59f2053299e27bbc9f3fb4b72716e68f1f4663cb7926b9273028fedeecc4418382fa1fa9c432b853c3295f38736f015be8fbacf9aa9c937e3466df09fff9a8d9f2d69bdc46af61ccc6fbf603ee0e2022e02f59f1cbe0bd99cee23a0f5a34cde82fc15d5968b98c5a7572d5dd660560868a915a5d4c72c1eea79dc52513047a9196a4335b52a1171a5fcfbeb1dcb1204415c9702727014d9f59614a15f698c916cac6190257bd9b687ef7a6bf34cf41da3d71fbcdabb7cca6e391687dcbc21aef12bfc00dea2e98a99e3fdfdbbc6c23579981a24d226315710ea0cca20cdddc14633e8408f93be5c05dde8c9bd2698690df4b93d61d6ecb4e054d74cb3763421cabb7a32a7f69301f70a514cd5453c6668fa9629af315bb9a225ead51c479c165981a6253865ab2813d4ace8c8705000000000000002a0727e443a582f549efc2b09a8548d371abcefaa3d52ca392e1c31b56dd8b9332c6d988e38c0598c30a6af7cf39cfa1625b86c0a09966ff47da8ea8daa78ac4b3fa029a3be277c7ae012d2789b477c790b3a2e2ae926bd4ab6426563a05ad8c0d65430cf8208aca5cb5176bc923ddde79502bb4d3759d9fc899b519b016f4ab587dca3d40da78980d3fa9a20e1d3f32a5573f48c262b382f632ddb435ede55279dc82c276045d0c9c300000000000000289d56f04d0f0b585728e6fbb1390e40cc556cefd5a709105ad0c10b7a25d51c4ee68def6a731be81c20d20adfb069a395835f89937d786b69413041c49a2e1c81bb9315fda3449c9a6454f14ef19611af38cde8fd2d362f32ffd023c651c2639500000000000000010000000000000002021247f14cd394ed34af0cc9c2130bf753a01c4ddf0abbbf900412e542d7d494831e011e3930a09657e566b7a2f3bc1449fe4dc9f4237d122367751b6a5037447c334f64a20ec05cf96cf196e104c6aaa72b36065cf29d147eec0b0940df4895094af4b0f9f344586e215f3804bb4d59f1b498a75e2e502b858fcddd076f56dc7e444f24e769418646afd97557231ea7bbc622db0af03afbef1a7af93fe8556c58ac1b173f3a4ea105b974974f8c68c30faca94f8c63952694d79731a7d3f1970000000000000001094af4b0f9f344586e215f3804bb4d59f1b498a75e2e502b858fcddd076f56dc7e444f24e769418646afd97557231ea70000000000000001bbc622db0af03afbef1a7af93fe8556c58ac1b173f3a4ea105b974974f8c68c30faca94f8c63952694d79731a7d3f1970000000000000001094af4b0f9f344586e215f3804bb4d59f1b498a75e2e502b858fcddd076f56dc7e444f24e769418646afd97557231ea70d0a1815eb9597a4be42cb705aa51342c9d5cc632a690cfb352451ad2660743e00ffbdd3bf4913a3d88f270293b7be378ea4407989a72cb90cfcbc8072c3834a4d9eedf1c088f474929b955bbfeefb713548e15a7cfb6ed8d1920e739e200dae725bb4908e39c081e74a8bbba15f5daf093e2b7c755437e249c32d2dd55153447c83f6d8da95b6d447e164dbe79967a33de78013bd71214e176248db8c1a3b004bc8274e197e9f4b342bd74f5dccb720e1566c7cf3879ea5ee9dce44bee735a655afaac1f26904f573839ac2ae1c5901c4b77617a5a4b1aecbcdfa952979d7c248afdaeacb6df2e5e7d8e15d817aea30a1d14be18429d87490f91ac7be4f9b7e281ec3ed3a0e350b5aad9b17e60f8115127e4eb0f40f5f4c67cc4781b08ec62c56f5aee6d0815ce55c4cc56e1cd8b3ceec6f4cff4938604f0c57e716859809ae38c087452778b15b8c4226cc43824891f883333f61bd8748809d7a2e417c86e0700c0b2f32c3693058d24bd89aa84a00249c62d3b82931a9896def2b456f2366247954c0d61c4c7f6f8ab9e38a5b88e4224951112c7d690914f45a810fdc7cde7cd8b4635e5020a144db71f78581f4fdb736a82707771222b1d76f970bc6de360b9afd21a0afcf5edf7ab265e18d2bd3554421f976250908316ddc8d25f910bd0e5b33b2a93b5324232fe999c10ba80f48d3aa0f34be418a06a5e874f202b3560a3f7279baa4b0a653af5818bbbb33930a6cfd2567063d1384739be56ac7f70776ec78f23efa65d6f581ea9509ff2e3ed4178923de31a6eca987be79f7175fce76a26cb0a390dc3fa581db268829115892edd7336a9419b8dd20453656eecb927cfeeb2bc22a78ff350a4c9633225255023f522de85e0141e4c273b22f851f4829ddb8ea15aa679ca6ca95d5d15764b548c03410e151d2dc287028e2537b043a00000000000002a07abc430eb0c39eec37ec7c11951f29d079a01b7a4948d5b1a132e9b9253ec6ee40d7d1e3864cd7a262d95ddfac30d8213e6dd5ff4cef6f3342260078fff53ca82c228b8081fb2095afe08cb69bac6608cd5675adf767b2265f49b4430a4ec4e945e5f0163ed8107e193757516e81e72bd3bc2cba326b232de44907a92ddea2b94ea3e01961503a4ee98caa95b1dcfaf54d64101ad4982bd4f1c70797de71416889ec9b11bc31ab34000000000000002805ce12457b7667e97c9baa1a64abf7358a9862bb7f981e977a6198de2830f07fefc7c23c1697091320e48e8c577423b4bbc622db0af03afbef1a7af93fe8556c58ac1b173f3a4ea105b974974f8c68c30faca94f8c63952694d79731a7d3f19700000000000000010000000000000001 ------------------ -Input #0 [id: a71e235775d9af46864169e7244f447edc566f07ddcd8f852b502e5ea798b4f1594dbb04385f216e5844f3f9b0f44a09, amount: ??? (encrypted)] ------------------ - -We have 0 of 1 required SecretKeyShare - -SecretKeyShare, or 'done': -3be16480526c03d2fd6b7f82c27ef109db9ebdb9feea9300174f3055bb7e52c8 - -SecretKeyShare Index: 0 - - -Thank-you. Preparing SignatureSharesMap... - - - --- SignatureSharesMap -- -82a4069133f63ada2456a51356836e3fc1c0938a0688ae064a4b8e85978df4b8d3860ce9b2f81fa50feb765df237f60942fd2e839ebbdd9ea03cd4d6fccd75ca0a83f8da5007cca7af16dffc6e537d561360fa5b631eee4ff82a2c5c7253a0a800000000000000000000000000000001094af4b0f9f344586e215f3804bb4d59f1b498a75e2e502b858fcddd076f56dc7e444f24e769418646afd97557231ea70000000000000001 --- End SignatureSharesMap -- - ->> prepare_reissue - -ReissueTransaction: -d16b06ffc7b7414e9a610b15850f88b5c0f11edbbd4e4b7f493912da5693b9379326e105cdf40cff53d993b7f2435e89648f4937b22cc80504c2cb2c13e10a5f7c5c5f8dbdd3ad34b8e30cb27b687518d953f42dc57acd10fe28fde801fee7ac0000000000000002648f4937b22cc80504c2cb2c13e10a5f7c5c5f8dbdd3ad34b8e30cb27b687518d953f42dc57acd10fe28fde801fee7ac0000000000000001094af4b0f9f344586e215f3804bb4d59f1b498a75e2e502b858fcddd076f56dc7e444f24e769418646afd97557231ea70000000000000001094af4b0f9f344586e215f3804bb4d59f1b498a75e2e502b858fcddd076f56dc7e444f24e769418646afd97557231ea70000000000000001648f4937b22cc80504c2cb2c13e10a5f7c5c5f8dbdd3ad34b8e30cb27b687518d953f42dc57acd10fe28fde801fee7ac02d662d88336e96b4dc49155f81de806bd2cdb6503c08c06ee0e561c2c586ce80b7b30facadc609745db219c82e329ae5fa97a092d7dcf5a16a71b6a7fa0e54e2a5a8bc3703de161dae37c63d82239bf7fe051319c56e01b13a7a96de3563bd2634b24889769d3a1a363521c4da0be1221fec32aea0aa8930f7aaa4d516cf96e1de8da9c307ddd9470c55c56b9a8c8e12aba0dbe3ba3e9bba9a7eff30d00fc6006ca8c2556a35e7cccd18f03fd0b26e88928fb1de066237d18f0a5bfac11c4901dd9498128b7f77a4f35a8b9389ebd2ed09a7c9b6c13249d77015a5748645ca2339b016737364791fea6c316507cbd0d6cf5765ac81d1cc25a17328529cbc57e6f743c542f02a919fca2ce065ab9fc157f67ed388e4f493c125f5b78b4a1fda414f7dcfa036b37fa2c86d516f1259b31d57cc41806859df3cab837bfeebd1f26120ef226f2941136fafc67dd12fe11787627c88201def2e978f086cebe279cc6457c060eabb88c5e4848aac97eeace8e52859f4f483121da3a0b9b61e364efd25b9d91446421c7a7de20805ee492591e2e2990919462805ae065070ab9f6f76e0f9f5b3e2a4b44109446fc4b6cd07247dcfc30248592ca5ee095a6824d6e926803495fada87043d33d493c635f2c9d4fd327e6486662bb09b7f2d0842d59162601a1ab5ed223319d0255261a04a71ef6dfdb577b0bac325d2662da7b42dfbb9707b4cf3dbbcb3d184403b66e596256e4e04d92e579dc20a1219e9c13428bc8707e6445112cdf2ab34ff9ae2ae57d2201e6a3ddd59139c6d348f579112a8a933a67e92bf925db76085c7abc2d63261b2b8f129882e6e3bb6b821d7ccad2efd7ec5fcb9250e253b3deb02b2ee8d47bb943d12799f7f83731abc30a62bea94534881bec0d5ef069b0be0a8ade44a252396e5b34ef86664da50e023f986ade70800e00000000000002a00297a9cb06a7c29b2372b220a4436c46ce74ce991213b7c49839a62fd9116a520f4dbe391ff8fc2ff35a792bf22d8248ff577f6efec2fa1678934eee55cb26cb56e9ddf2ea88f8054e2bc0897e4c890a31e509a47dc3a1db8c5b1264b2c7675bd0806d885e73773e7009d7450dc1135833c3e198aeddf6a49bf19615cc216db804403895c772c6a6de7b211ff233d7d059cc381ca2e4bb319b86f304f9c50f0bd459eba61db7531800000000000000287ec664e088d6fe82746ad585b493fa14d21a330495ed66d5869a37050caec3e5d1294c4a21e6bd8899f92f007dadd4b6835f89937d786b69413041c49a2e1c81bb9315fda3449c9a6454f14ef19611af38cde8fd2d362f32ffd023c651c263950000000000000001648f4937b22cc80504c2cb2c13e10a5f7c5c5f8dbdd3ad34b8e30cb27b687518d953f42dc57acd10fe28fde801fee7ac05609247e364a5faa363cffaec1dbdc2f96db226275d2a7581de7b271c2f8e780875dc4f799f910deac2a547da5305732dd8d700bd1342c52b3dd7c05047f4e20252bf329749ce8abb1ef5ab44fd6bd65a0e8a2d11a5279be5bddfdd4294ed9e2cc1744a5030cbc39aedd2da9961b2161ce8b0f6670bab88844cdb6a93d1ebfa5a72185150878036ab038fd5c16b9384ebcfc63d64e06e6aa8172dde925bdff4200ac18cd0e82a209fe3bf382afdf15cee494a8d1cf862d3c784aa2c513de12c32acce82cf9d3fdf3c82aba25afcb458e5917b76ab1160d462cb3d0fa0050b4459b232670fa8f2d7c1be4fbde634e17a706233e41b491316be0fd318922e565e0847139f65a4d77d7349185d132143c66b765437ef82d83bb94d141f8a35380e1a499c02e8ec3966048551714469d46bdacd8c7e5b96886b855ff2d8e98fa52c56a56612cb84c5e370029e90a964a6f74a66fa79aa82d0955be423e68bcf15ca1b186da2588994c9cbe519cefe0bdd3be5c59f2053299e27bbc9f3fb4b72716e68f1f4663cb7926b9273028fedeecc4418382fa1fa9c432b853c3295f38736f015be8fbacf9aa9c937e3466df09fff9a8d9f2d69bdc46af61ccc6fbf603ee0e2022e02f59f1cbe0bd99cee23a0f5a34cde82fc15d5968b98c5a7572d5dd660560868a915a5d4c72c1eea79dc52513047a9196a4335b52a1171a5fcfbeb1dcb1204415c9702727014d9f59614a15f698c916cac6190257bd9b687ef7a6bf34cf41da3d71fbcdabb7cca6e391687dcbc21aef12bfc00dea2e98a99e3fdfdbbc6c23579981a24d226315710ea0cca20cdddc14633e8408f93be5c05dde8c9bd2698690df4b93d61d6ecb4e054d74cb3763421cabb7a32a7f69301f70a514cd5453c6668fa9629af315bb9a225ead51c479c165981a6253865ab2813d4ace8c8705000000000000002a0727e443a582f549efc2b09a8548d371abcefaa3d52ca392e1c31b56dd8b9332c6d988e38c0598c30a6af7cf39cfa1625b86c0a09966ff47da8ea8daa78ac4b3fa029a3be277c7ae012d2789b477c790b3a2e2ae926bd4ab6426563a05ad8c0d65430cf8208aca5cb5176bc923ddde79502bb4d3759d9fc899b519b016f4ab587dca3d40da78980d3fa9a20e1d3f32a5573f48c262b382f632ddb435ede55279dc82c276045d0c9c300000000000000289d56f04d0f0b585728e6fbb1390e40cc556cefd5a709105ad0c10b7a25d51c4ee68def6a731be81c20d20adfb069a395835f89937d786b69413041c49a2e1c81bb9315fda3449c9a6454f14ef19611af38cde8fd2d362f32ffd023c651c2639500000000000000010000000000000002021247f14cd394ed34af0cc9c2130bf753a01c4ddf0abbbf900412e542d7d494831e011e3930a09657e566b7a2f3bc1449fe4dc9f4237d122367751b6a5037447c334f64a20ec05cf96cf196e104c6aaa72b36065cf29d147eec0b0940df4895094af4b0f9f344586e215f3804bb4d59f1b498a75e2e502b858fcddd076f56dc7e444f24e769418646afd97557231ea7bbc622db0af03afbef1a7af93fe8556c58ac1b173f3a4ea105b974974f8c68c30faca94f8c63952694d79731a7d3f1970000000000000001094af4b0f9f344586e215f3804bb4d59f1b498a75e2e502b858fcddd076f56dc7e444f24e769418646afd97557231ea70000000000000001bbc622db0af03afbef1a7af93fe8556c58ac1b173f3a4ea105b974974f8c68c30faca94f8c63952694d79731a7d3f1970000000000000001094af4b0f9f344586e215f3804bb4d59f1b498a75e2e502b858fcddd076f56dc7e444f24e769418646afd97557231ea70d0a1815eb9597a4be42cb705aa51342c9d5cc632a690cfb352451ad2660743e00ffbdd3bf4913a3d88f270293b7be378ea4407989a72cb90cfcbc8072c3834a4d9eedf1c088f474929b955bbfeefb713548e15a7cfb6ed8d1920e739e200dae725bb4908e39c081e74a8bbba15f5daf093e2b7c755437e249c32d2dd55153447c83f6d8da95b6d447e164dbe79967a33de78013bd71214e176248db8c1a3b004bc8274e197e9f4b342bd74f5dccb720e1566c7cf3879ea5ee9dce44bee735a655afaac1f26904f573839ac2ae1c5901c4b77617a5a4b1aecbcdfa952979d7c248afdaeacb6df2e5e7d8e15d817aea30a1d14be18429d87490f91ac7be4f9b7e281ec3ed3a0e350b5aad9b17e60f8115127e4eb0f40f5f4c67cc4781b08ec62c56f5aee6d0815ce55c4cc56e1cd8b3ceec6f4cff4938604f0c57e716859809ae38c087452778b15b8c4226cc43824891f883333f61bd8748809d7a2e417c86e0700c0b2f32c3693058d24bd89aa84a00249c62d3b82931a9896def2b456f2366247954c0d61c4c7f6f8ab9e38a5b88e4224951112c7d690914f45a810fdc7cde7cd8b4635e5020a144db71f78581f4fdb736a82707771222b1d76f970bc6de360b9afd21a0afcf5edf7ab265e18d2bd3554421f976250908316ddc8d25f910bd0e5b33b2a93b5324232fe999c10ba80f48d3aa0f34be418a06a5e874f202b3560a3f7279baa4b0a653af5818bbbb33930a6cfd2567063d1384739be56ac7f70776ec78f23efa65d6f581ea9509ff2e3ed4178923de31a6eca987be79f7175fce76a26cb0a390dc3fa581db268829115892edd7336a9419b8dd20453656eecb927cfeeb2bc22a78ff350a4c9633225255023f522de85e0141e4c273b22f851f4829ddb8ea15aa679ca6ca95d5d15764b548c03410e151d2dc287028e2537b043a00000000000002a07abc430eb0c39eec37ec7c11951f29d079a01b7a4948d5b1a132e9b9253ec6ee40d7d1e3864cd7a262d95ddfac30d8213e6dd5ff4cef6f3342260078fff53ca82c228b8081fb2095afe08cb69bac6608cd5675adf767b2265f49b4430a4ec4e945e5f0163ed8107e193757516e81e72bd3bc2cba326b232de44907a92ddea2b94ea3e01961503a4ee98caa95b1dcfaf54d64101ad4982bd4f1c70797de71416889ec9b11bc31ab34000000000000002805ce12457b7667e97c9baa1a64abf7358a9862bb7f981e977a6198de2830f07fefc7c23c1697091320e48e8c577423b4bbc622db0af03afbef1a7af93fe8556c58ac1b173f3a4ea105b974974f8c68c30faca94f8c63952694d79731a7d3f19700000000000000010000000000000001 ------------------ -Input [id: a71e235775d9af46864169e7244f447edc566f07ddcd8f852b502e5ea798b4f1594dbb04385f216e5844f3f9b0f44a09] ------------------ - -SignatureSharesMap, or 'cancel': -82a4069133f63ada2456a51356836e3fc1c0938a0688ae064a4b8e85978df4b8d3860ce9b2f81fa50feb765df237f60942fd2e839ebbdd9ea03cd4d6fccd75ca0a83f8da5007cca7af16dffc6e537d561360fa5b631eee4ff82a2c5c7253a0a800000000000000000000000000000001094af4b0f9f344586e215f3804bb4d59f1b498a75e2e502b858fcddd076f56dc7e444f24e769418646afd97557231ea70000000000000001 - - -Thank-you. Preparing ReissueRequest... - - - --- ReissueRequest -- -d16b06ffc7b7414e9a610b15850f88b5c0f11edbbd4e4b7f493912da5693b9379326e105cdf40cff53d993b7f2435e89648f4937b22cc80504c2cb2c13e10a5f7c5c5f8dbdd3ad34b8e30cb27b687518d953f42dc57acd10fe28fde801fee7ac0000000000000002648f4937b22cc80504c2cb2c13e10a5f7c5c5f8dbdd3ad34b8e30cb27b687518d953f42dc57acd10fe28fde801fee7ac0000000000000001094af4b0f9f344586e215f3804bb4d59f1b498a75e2e502b858fcddd076f56dc7e444f24e769418646afd97557231ea70000000000000001094af4b0f9f344586e215f3804bb4d59f1b498a75e2e502b858fcddd076f56dc7e444f24e769418646afd97557231ea7000000000000000182a4069133f63ada2456a51356836e3fc1c0938a0688ae064a4b8e85978df4b8d3860ce9b2f81fa50feb765df237f60942fd2e839ebbdd9ea03cd4d6fccd75ca0a83f8da5007cca7af16dffc6e537d561360fa5b631eee4ff82a2c5c7253a0a8835f89937d786b69413041c49a2e1c81bb9315fda3449c9a6454f14ef19611af38cde8fd2d362f32ffd023c651c263950000000000000001648f4937b22cc80504c2cb2c13e10a5f7c5c5f8dbdd3ad34b8e30cb27b687518d953f42dc57acd10fe28fde801fee7ac02d662d88336e96b4dc49155f81de806bd2cdb6503c08c06ee0e561c2c586ce80b7b30facadc609745db219c82e329ae5fa97a092d7dcf5a16a71b6a7fa0e54e2a5a8bc3703de161dae37c63d82239bf7fe051319c56e01b13a7a96de3563bd2634b24889769d3a1a363521c4da0be1221fec32aea0aa8930f7aaa4d516cf96e1de8da9c307ddd9470c55c56b9a8c8e12aba0dbe3ba3e9bba9a7eff30d00fc6006ca8c2556a35e7cccd18f03fd0b26e88928fb1de066237d18f0a5bfac11c4901dd9498128b7f77a4f35a8b9389ebd2ed09a7c9b6c13249d77015a5748645ca2339b016737364791fea6c316507cbd0d6cf5765ac81d1cc25a17328529cbc57e6f743c542f02a919fca2ce065ab9fc157f67ed388e4f493c125f5b78b4a1fda414f7dcfa036b37fa2c86d516f1259b31d57cc41806859df3cab837bfeebd1f26120ef226f2941136fafc67dd12fe11787627c88201def2e978f086cebe279cc6457c060eabb88c5e4848aac97eeace8e52859f4f483121da3a0b9b61e364efd25b9d91446421c7a7de20805ee492591e2e2990919462805ae065070ab9f6f76e0f9f5b3e2a4b44109446fc4b6cd07247dcfc30248592ca5ee095a6824d6e926803495fada87043d33d493c635f2c9d4fd327e6486662bb09b7f2d0842d59162601a1ab5ed223319d0255261a04a71ef6dfdb577b0bac325d2662da7b42dfbb9707b4cf3dbbcb3d184403b66e596256e4e04d92e579dc20a1219e9c13428bc8707e6445112cdf2ab34ff9ae2ae57d2201e6a3ddd59139c6d348f579112a8a933a67e92bf925db76085c7abc2d63261b2b8f129882e6e3bb6b821d7ccad2efd7ec5fcb9250e253b3deb02b2ee8d47bb943d12799f7f83731abc30a62bea94534881bec0d5ef069b0be0a8ade44a252396e5b34ef86664da50e023f986ade70800e00000000000002a00297a9cb06a7c29b2372b220a4436c46ce74ce991213b7c49839a62fd9116a520f4dbe391ff8fc2ff35a792bf22d8248ff577f6efec2fa1678934eee55cb26cb56e9ddf2ea88f8054e2bc0897e4c890a31e509a47dc3a1db8c5b1264b2c7675bd0806d885e73773e7009d7450dc1135833c3e198aeddf6a49bf19615cc216db804403895c772c6a6de7b211ff233d7d059cc381ca2e4bb319b86f304f9c50f0bd459eba61db7531800000000000000287ec664e088d6fe82746ad585b493fa14d21a330495ed66d5869a37050caec3e5d1294c4a21e6bd8899f92f007dadd4b6835f89937d786b69413041c49a2e1c81bb9315fda3449c9a6454f14ef19611af38cde8fd2d362f32ffd023c651c263950000000000000001648f4937b22cc80504c2cb2c13e10a5f7c5c5f8dbdd3ad34b8e30cb27b687518d953f42dc57acd10fe28fde801fee7ac05609247e364a5faa363cffaec1dbdc2f96db226275d2a7581de7b271c2f8e780875dc4f799f910deac2a547da5305732dd8d700bd1342c52b3dd7c05047f4e20252bf329749ce8abb1ef5ab44fd6bd65a0e8a2d11a5279be5bddfdd4294ed9e2cc1744a5030cbc39aedd2da9961b2161ce8b0f6670bab88844cdb6a93d1ebfa5a72185150878036ab038fd5c16b9384ebcfc63d64e06e6aa8172dde925bdff4200ac18cd0e82a209fe3bf382afdf15cee494a8d1cf862d3c784aa2c513de12c32acce82cf9d3fdf3c82aba25afcb458e5917b76ab1160d462cb3d0fa0050b4459b232670fa8f2d7c1be4fbde634e17a706233e41b491316be0fd318922e565e0847139f65a4d77d7349185d132143c66b765437ef82d83bb94d141f8a35380e1a499c02e8ec3966048551714469d46bdacd8c7e5b96886b855ff2d8e98fa52c56a56612cb84c5e370029e90a964a6f74a66fa79aa82d0955be423e68bcf15ca1b186da2588994c9cbe519cefe0bdd3be5c59f2053299e27bbc9f3fb4b72716e68f1f4663cb7926b9273028fedeecc4418382fa1fa9c432b853c3295f38736f015be8fbacf9aa9c937e3466df09fff9a8d9f2d69bdc46af61ccc6fbf603ee0e2022e02f59f1cbe0bd99cee23a0f5a34cde82fc15d5968b98c5a7572d5dd660560868a915a5d4c72c1eea79dc52513047a9196a4335b52a1171a5fcfbeb1dcb1204415c9702727014d9f59614a15f698c916cac6190257bd9b687ef7a6bf34cf41da3d71fbcdabb7cca6e391687dcbc21aef12bfc00dea2e98a99e3fdfdbbc6c23579981a24d226315710ea0cca20cdddc14633e8408f93be5c05dde8c9bd2698690df4b93d61d6ecb4e054d74cb3763421cabb7a32a7f69301f70a514cd5453c6668fa9629af315bb9a225ead51c479c165981a6253865ab2813d4ace8c8705000000000000002a0727e443a582f549efc2b09a8548d371abcefaa3d52ca392e1c31b56dd8b9332c6d988e38c0598c30a6af7cf39cfa1625b86c0a09966ff47da8ea8daa78ac4b3fa029a3be277c7ae012d2789b477c790b3a2e2ae926bd4ab6426563a05ad8c0d65430cf8208aca5cb5176bc923ddde79502bb4d3759d9fc899b519b016f4ab587dca3d40da78980d3fa9a20e1d3f32a5573f48c262b382f632ddb435ede55279dc82c276045d0c9c300000000000000289d56f04d0f0b585728e6fbb1390e40cc556cefd5a709105ad0c10b7a25d51c4ee68def6a731be81c20d20adfb069a395835f89937d786b69413041c49a2e1c81bb9315fda3449c9a6454f14ef19611af38cde8fd2d362f32ffd023c651c2639500000000000000010000000000000002021247f14cd394ed34af0cc9c2130bf753a01c4ddf0abbbf900412e542d7d494831e011e3930a09657e566b7a2f3bc1449fe4dc9f4237d122367751b6a5037447c334f64a20ec05cf96cf196e104c6aaa72b36065cf29d147eec0b0940df4895094af4b0f9f344586e215f3804bb4d59f1b498a75e2e502b858fcddd076f56dc7e444f24e769418646afd97557231ea7bbc622db0af03afbef1a7af93fe8556c58ac1b173f3a4ea105b974974f8c68c30faca94f8c63952694d79731a7d3f1970000000000000001094af4b0f9f344586e215f3804bb4d59f1b498a75e2e502b858fcddd076f56dc7e444f24e769418646afd97557231ea70000000000000001bbc622db0af03afbef1a7af93fe8556c58ac1b173f3a4ea105b974974f8c68c30faca94f8c63952694d79731a7d3f1970000000000000001094af4b0f9f344586e215f3804bb4d59f1b498a75e2e502b858fcddd076f56dc7e444f24e769418646afd97557231ea70d0a1815eb9597a4be42cb705aa51342c9d5cc632a690cfb352451ad2660743e00ffbdd3bf4913a3d88f270293b7be378ea4407989a72cb90cfcbc8072c3834a4d9eedf1c088f474929b955bbfeefb713548e15a7cfb6ed8d1920e739e200dae725bb4908e39c081e74a8bbba15f5daf093e2b7c755437e249c32d2dd55153447c83f6d8da95b6d447e164dbe79967a33de78013bd71214e176248db8c1a3b004bc8274e197e9f4b342bd74f5dccb720e1566c7cf3879ea5ee9dce44bee735a655afaac1f26904f573839ac2ae1c5901c4b77617a5a4b1aecbcdfa952979d7c248afdaeacb6df2e5e7d8e15d817aea30a1d14be18429d87490f91ac7be4f9b7e281ec3ed3a0e350b5aad9b17e60f8115127e4eb0f40f5f4c67cc4781b08ec62c56f5aee6d0815ce55c4cc56e1cd8b3ceec6f4cff4938604f0c57e716859809ae38c087452778b15b8c4226cc43824891f883333f61bd8748809d7a2e417c86e0700c0b2f32c3693058d24bd89aa84a00249c62d3b82931a9896def2b456f2366247954c0d61c4c7f6f8ab9e38a5b88e4224951112c7d690914f45a810fdc7cde7cd8b4635e5020a144db71f78581f4fdb736a82707771222b1d76f970bc6de360b9afd21a0afcf5edf7ab265e18d2bd3554421f976250908316ddc8d25f910bd0e5b33b2a93b5324232fe999c10ba80f48d3aa0f34be418a06a5e874f202b3560a3f7279baa4b0a653af5818bbbb33930a6cfd2567063d1384739be56ac7f70776ec78f23efa65d6f581ea9509ff2e3ed4178923de31a6eca987be79f7175fce76a26cb0a390dc3fa581db268829115892edd7336a9419b8dd20453656eecb927cfeeb2bc22a78ff350a4c9633225255023f522de85e0141e4c273b22f851f4829ddb8ea15aa679ca6ca95d5d15764b548c03410e151d2dc287028e2537b043a00000000000002a07abc430eb0c39eec37ec7c11951f29d079a01b7a4948d5b1a132e9b9253ec6ee40d7d1e3864cd7a262d95ddfac30d8213e6dd5ff4cef6f3342260078fff53ca82c228b8081fb2095afe08cb69bac6608cd5675adf767b2265f49b4430a4ec4e945e5f0163ed8107e193757516e81e72bd3bc2cba326b232de44907a92ddea2b94ea3e01961503a4ee98caa95b1dcfaf54d64101ad4982bd4f1c70797de71416889ec9b11bc31ab34000000000000002805ce12457b7667e97c9baa1a64abf7358a9862bb7f981e977a6198de2830f07fefc7c23c1697091320e48e8c577423b4bbc622db0af03afbef1a7af93fe8556c58ac1b173f3a4ea105b974974f8c68c30faca94f8c63952694d79731a7d3f19700000000000000010000000000000001 --- End ReissueRequest -- - >> reissue -ReissueRequest: -d16b06ffc7b7414e9a610b15850f88b5c0f11edbbd4e4b7f493912da5693b9379326e105cdf40cff53d993b7f2435e89648f4937b22cc80504c2cb2c13e10a5f7c5c5f8dbdd3ad34b8e30cb27b687518d953f42dc57acd10fe28fde801fee7ac0000000000000002648f4937b22cc80504c2cb2c13e10a5f7c5c5f8dbdd3ad34b8e30cb27b687518d953f42dc57acd10fe28fde801fee7ac0000000000000001094af4b0f9f344586e215f3804bb4d59f1b498a75e2e502b858fcddd076f56dc7e444f24e769418646afd97557231ea70000000000000001094af4b0f9f344586e215f3804bb4d59f1b498a75e2e502b858fcddd076f56dc7e444f24e769418646afd97557231ea7000000000000000182a4069133f63ada2456a51356836e3fc1c0938a0688ae064a4b8e85978df4b8d3860ce9b2f81fa50feb765df237f60942fd2e839ebbdd9ea03cd4d6fccd75ca0a83f8da5007cca7af16dffc6e537d561360fa5b631eee4ff82a2c5c7253a0a8835f89937d786b69413041c49a2e1c81bb9315fda3449c9a6454f14ef19611af38cde8fd2d362f32ffd023c651c263950000000000000001648f4937b22cc80504c2cb2c13e10a5f7c5c5f8dbdd3ad34b8e30cb27b687518d953f42dc57acd10fe28fde801fee7ac02d662d88336e96b4dc49155f81de806bd2cdb6503c08c06ee0e561c2c586ce80b7b30facadc609745db219c82e329ae5fa97a092d7dcf5a16a71b6a7fa0e54e2a5a8bc3703de161dae37c63d82239bf7fe051319c56e01b13a7a96de3563bd2634b24889769d3a1a363521c4da0be1221fec32aea0aa8930f7aaa4d516cf96e1de8da9c307ddd9470c55c56b9a8c8e12aba0dbe3ba3e9bba9a7eff30d00fc6006ca8c2556a35e7cccd18f03fd0b26e88928fb1de066237d18f0a5bfac11c4901dd9498128b7f77a4f35a8b9389ebd2ed09a7c9b6c13249d77015a5748645ca2339b016737364791fea6c316507cbd0d6cf5765ac81d1cc25a17328529cbc57e6f743c542f02a919fca2ce065ab9fc157f67ed388e4f493c125f5b78b4a1fda414f7dcfa036b37fa2c86d516f1259b31d57cc41806859df3cab837bfeebd1f26120ef226f2941136fafc67dd12fe11787627c88201def2e978f086cebe279cc6457c060eabb88c5e4848aac97eeace8e52859f4f483121da3a0b9b61e364efd25b9d91446421c7a7de20805ee492591e2e2990919462805ae065070ab9f6f76e0f9f5b3e2a4b44109446fc4b6cd07247dcfc30248592ca5ee095a6824d6e926803495fada87043d33d493c635f2c9d4fd327e6486662bb09b7f2d0842d59162601a1ab5ed223319d0255261a04a71ef6dfdb577b0bac325d2662da7b42dfbb9707b4cf3dbbcb3d184403b66e596256e4e04d92e579dc20a1219e9c13428bc8707e6445112cdf2ab34ff9ae2ae57d2201e6a3ddd59139c6d348f579112a8a933a67e92bf925db76085c7abc2d63261b2b8f129882e6e3bb6b821d7ccad2efd7ec5fcb9250e253b3deb02b2ee8d47bb943d12799f7f83731abc30a62bea94534881bec0d5ef069b0be0a8ade44a252396e5b34ef86664da50e023f986ade70800e00000000000002a00297a9cb06a7c29b2372b220a4436c46ce74ce991213b7c49839a62fd9116a520f4dbe391ff8fc2ff35a792bf22d8248ff577f6efec2fa1678934eee55cb26cb56e9ddf2ea88f8054e2bc0897e4c890a31e509a47dc3a1db8c5b1264b2c7675bd0806d885e73773e7009d7450dc1135833c3e198aeddf6a49bf19615cc216db804403895c772c6a6de7b211ff233d7d059cc381ca2e4bb319b86f304f9c50f0bd459eba61db7531800000000000000287ec664e088d6fe82746ad585b493fa14d21a330495ed66d5869a37050caec3e5d1294c4a21e6bd8899f92f007dadd4b6835f89937d786b69413041c49a2e1c81bb9315fda3449c9a6454f14ef19611af38cde8fd2d362f32ffd023c651c263950000000000000001648f4937b22cc80504c2cb2c13e10a5f7c5c5f8dbdd3ad34b8e30cb27b687518d953f42dc57acd10fe28fde801fee7ac05609247e364a5faa363cffaec1dbdc2f96db226275d2a7581de7b271c2f8e780875dc4f799f910deac2a547da5305732dd8d700bd1342c52b3dd7c05047f4e20252bf329749ce8abb1ef5ab44fd6bd65a0e8a2d11a5279be5bddfdd4294ed9e2cc1744a5030cbc39aedd2da9961b2161ce8b0f6670bab88844cdb6a93d1ebfa5a72185150878036ab038fd5c16b9384ebcfc63d64e06e6aa8172dde925bdff4200ac18cd0e82a209fe3bf382afdf15cee494a8d1cf862d3c784aa2c513de12c32acce82cf9d3fdf3c82aba25afcb458e5917b76ab1160d462cb3d0fa0050b4459b232670fa8f2d7c1be4fbde634e17a706233e41b491316be0fd318922e565e0847139f65a4d77d7349185d132143c66b765437ef82d83bb94d141f8a35380e1a499c02e8ec3966048551714469d46bdacd8c7e5b96886b855ff2d8e98fa52c56a56612cb84c5e370029e90a964a6f74a66fa79aa82d0955be423e68bcf15ca1b186da2588994c9cbe519cefe0bdd3be5c59f2053299e27bbc9f3fb4b72716e68f1f4663cb7926b9273028fedeecc4418382fa1fa9c432b853c3295f38736f015be8fbacf9aa9c937e3466df09fff9a8d9f2d69bdc46af61ccc6fbf603ee0e2022e02f59f1cbe0bd99cee23a0f5a34cde82fc15d5968b98c5a7572d5dd660560868a915a5d4c72c1eea79dc52513047a9196a4335b52a1171a5fcfbeb1dcb1204415c9702727014d9f59614a15f698c916cac6190257bd9b687ef7a6bf34cf41da3d71fbcdabb7cca6e391687dcbc21aef12bfc00dea2e98a99e3fdfdbbc6c23579981a24d226315710ea0cca20cdddc14633e8408f93be5c05dde8c9bd2698690df4b93d61d6ecb4e054d74cb3763421cabb7a32a7f69301f70a514cd5453c6668fa9629af315bb9a225ead51c479c165981a6253865ab2813d4ace8c8705000000000000002a0727e443a582f549efc2b09a8548d371abcefaa3d52ca392e1c31b56dd8b9332c6d988e38c0598c30a6af7cf39cfa1625b86c0a09966ff47da8ea8daa78ac4b3fa029a3be277c7ae012d2789b477c790b3a2e2ae926bd4ab6426563a05ad8c0d65430cf8208aca5cb5176bc923ddde79502bb4d3759d9fc899b519b016f4ab587dca3d40da78980d3fa9a20e1d3f32a5573f48c262b382f632ddb435ede55279dc82c276045d0c9c300000000000000289d56f04d0f0b585728e6fbb1390e40cc556cefd5a709105ad0c10b7a25d51c4ee68def6a731be81c20d20adfb069a395835f89937d786b69413041c49a2e1c81bb9315fda3449c9a6454f14ef19611af38cde8fd2d362f32ffd023c651c2639500000000000000010000000000000002021247f14cd394ed34af0cc9c2130bf753a01c4ddf0abbbf900412e542d7d494831e011e3930a09657e566b7a2f3bc1449fe4dc9f4237d122367751b6a5037447c334f64a20ec05cf96cf196e104c6aaa72b36065cf29d147eec0b0940df4895094af4b0f9f344586e215f3804bb4d59f1b498a75e2e502b858fcddd076f56dc7e444f24e769418646afd97557231ea7bbc622db0af03afbef1a7af93fe8556c58ac1b173f3a4ea105b974974f8c68c30faca94f8c63952694d79731a7d3f1970000000000000001094af4b0f9f344586e215f3804bb4d59f1b498a75e2e502b858fcddd076f56dc7e444f24e769418646afd97557231ea70000000000000001bbc622db0af03afbef1a7af93fe8556c58ac1b173f3a4ea105b974974f8c68c30faca94f8c63952694d79731a7d3f1970000000000000001094af4b0f9f344586e215f3804bb4d59f1b498a75e2e502b858fcddd076f56dc7e444f24e769418646afd97557231ea70d0a1815eb9597a4be42cb705aa51342c9d5cc632a690cfb352451ad2660743e00ffbdd3bf4913a3d88f270293b7be378ea4407989a72cb90cfcbc8072c3834a4d9eedf1c088f474929b955bbfeefb713548e15a7cfb6ed8d1920e739e200dae725bb4908e39c081e74a8bbba15f5daf093e2b7c755437e249c32d2dd55153447c83f6d8da95b6d447e164dbe79967a33de78013bd71214e176248db8c1a3b004bc8274e197e9f4b342bd74f5dccb720e1566c7cf3879ea5ee9dce44bee735a655afaac1f26904f573839ac2ae1c5901c4b77617a5a4b1aecbcdfa952979d7c248afdaeacb6df2e5e7d8e15d817aea30a1d14be18429d87490f91ac7be4f9b7e281ec3ed3a0e350b5aad9b17e60f8115127e4eb0f40f5f4c67cc4781b08ec62c56f5aee6d0815ce55c4cc56e1cd8b3ceec6f4cff4938604f0c57e716859809ae38c087452778b15b8c4226cc43824891f883333f61bd8748809d7a2e417c86e0700c0b2f32c3693058d24bd89aa84a00249c62d3b82931a9896def2b456f2366247954c0d61c4c7f6f8ab9e38a5b88e4224951112c7d690914f45a810fdc7cde7cd8b4635e5020a144db71f78581f4fdb736a82707771222b1d76f970bc6de360b9afd21a0afcf5edf7ab265e18d2bd3554421f976250908316ddc8d25f910bd0e5b33b2a93b5324232fe999c10ba80f48d3aa0f34be418a06a5e874f202b3560a3f7279baa4b0a653af5818bbbb33930a6cfd2567063d1384739be56ac7f70776ec78f23efa65d6f581ea9509ff2e3ed4178923de31a6eca987be79f7175fce76a26cb0a390dc3fa581db268829115892edd7336a9419b8dd20453656eecb927cfeeb2bc22a78ff350a4c9633225255023f522de85e0141e4c273b22f851f4829ddb8ea15aa679ca6ca95d5d15764b548c03410e151d2dc287028e2537b043a00000000000002a07abc430eb0c39eec37ec7c11951f29d079a01b7a4948d5b1a132e9b9253ec6ee40d7d1e3864cd7a262d95ddfac30d8213e6dd5ff4cef6f3342260078fff53ca82c228b8081fb2095afe08cb69bac6608cd5675adf767b2265f49b4430a4ec4e945e5f0163ed8107e193757516e81e72bd3bc2cba326b232de44907a92ddea2b94ea3e01961503a4ee98caa95b1dcfaf54d64101ad4982bd4f1c70797de71416889ec9b11bc31ab34000000000000002805ce12457b7667e97c9baa1a64abf7358a9862bb7f981e977a6198de2830f07fefc7c23c1697091320e48e8c577423b4bbc622db0af03afbef1a7af93fe8556c58ac1b173f3a4ea105b974974f8c68c30faca94f8c63952694d79731a7d3f19700000000000000010000000000000001 +ReissueTransaction: +f52a810cae8e4035d96647a215582f83069f216c2f5ab4f88b2d367521421310237a16def5211e94bc4d81c9e5b96cb78547cb06a63f788e144f7a3b9871c18fb2156563efd747c1c4cd95a17971acf7b616cdf81cf3fc2e27e53ca308d485ac00000000000000028547cb06a63f788e144f7a3b9871c18fb2156563efd747c1c4cd95a17971acf7b616cdf81cf3fc2e27e53ca308d485ac0000000000000001e05bae55e06952a020eee1c20a264cb9601b8a6ea9ca56aaba0cb923d30d4bfb35406b0c70ac8421dd1c227d6c2e7cae0000000000000001e05bae55e06952a020eee1c20a264cb9601b8a6ea9ca56aaba0cb923d30d4bfb35406b0c70ac8421dd1c227d6c2e7cae00000000000000018547cb06a63f788e144f7a3b9871c18fb2156563efd747c1c4cd95a17971acf7b616cdf81cf3fc2e27e53ca308d485ac0319e3c87f4287bcf42d1b87978246c731015bc54448262ccb9288db0d026e1006d0983c4d8d730d5eb34a8dc96daebe8dd3ab658373473fe33acead27477e85145352cc091b4bb26ce7a79ca11e0d4e93614b8fa7678e3be53c979128f3dbd648967d32218fc2481d0fa3266e6603dc9a708fc87a261d2d776ad8ab69b71d38327a6c458c339b7d1009b1ac2854996a1b70cd55d3f0a580217abc6dc9886bb00715f485bedc5a14d7f94a5f17c5bfc2e2c8553b9dd14df3d7074e9cf51f3b927e2be72ad57c9ef33444859b407104467b6b18a27e1d2664b28ca52464415326764bc600b1d7d2834e53de856e34954201deb062850d89ee4558b12066f8d0641e79cf4ea90abc14b82f9842561b3645cd09920dacd8cc0898b3e6b13e5bc26612abd9605112d645aa00fdf05645dbca93fb3572e3d29d375f8298d4cdfac9e05101a20c9e3c30b9af723b3e799c84a4d8314374656f076f5480500e84f3d7d434a5768b90ce13e40dfdc1fdbfe2df5d1207b1ec931ce2445325b75796c237cc34e8caf7f1a01bd0184e97be7ab035416ecd6c3fab8a53d2a4f94266c3757d74194aa86b66ec678afe29f0d14c84311363cf66492d15db45ef2dd69bb683c3f80a08b1b256574451c74d721b9a52ff1e1dd39d1b052afd66493b9c2554a896530d01ba320f149cbf517f5e6dab9222f7473de7ec65d5289e6c08e18d31e6e67901b855f4727ad9ed19104ac55c9cb7a4aa5ca8b4464ae632eb87f1fd392b2ea123723bea052ea066a9364fd366d005a8a0176461a409aabda53a64126e3b95aa39b277316efdc2a2a23ad1eb10c4568271ea6227f9ec3b64206e9d2e0f4b44b67f2cb7974d604338ffa584fbea446719a8a3f77c24cedcebc640de4c3301130a5d8fff0bddcf0e999affec415cdec12f185f04db12bc84b66a5ba561b489e23600000000000002a0509b15d5605e9fca106e66c1dd616394c78b506f4dd875fe0e344f4224c551cc9bdf1426e01e620c4a528d6e47a437c47220496df2b96a479e1dd8f22f090a1d70c3325600722182f94dfbdf4ebaa610fbb63de2fd196ea36598ed0d929d863e0d5f926241aa82a5e01c93c734f78ba37b119317dd8fc3064bbeeeb9e935aeb732f94587f205368d9311cc755a35e8b9ffca29bfcf9dc6ae96a3ac1ce67f6ac6689207860cf25d6f0000000000000028c0570964d6220618189ce311ebe3cc6791ed763b87f97efbad61c4733eb0c7283247be3203af64b04732e15cd07a4aa07ac7a9b989d9a17c3b9cdbb94402a08b853f325b8179aec6bfd06f29a4fc9d3d67a8f720ead2bd27c0033d274fb257af00000000000000018547cb06a63f788e144f7a3b9871c18fb2156563efd747c1c4cd95a17971acf7b616cdf81cf3fc2e27e53ca308d485ac0429046e8ffe81bf259642616f69ef76c3d86ee868ccb904835b1b1f07fde7400648e9699e11d4810161cf3eee47b50b06aab6945042989a77804dbc6fcbb199089e0c689cb8c3217fc06cff1fa9982873dcf4824e4ed7b869f9dd4332487514046f75ec5c69469cc5972dbf2eb2b4f56094cb987ab8774dcecb41675d2310dc3f734b392a9732ee471cc7d4c2a2db308bc1b4a04d2b9863dbfb4948cfdd0a7002f78e8fdf6c68bcde0ac24966b4246c28b5cf83c5443d7fb3e612f9e955146e5e19f8857ef4d6d9099a80de831b66a4a78941c0d825b5337980118c6bd472e014f23b89a115142fc3f43cfb7e095936b4fd64b4c000b381fced479bd0a1380475183316071c6e4673001648eeb604e20b54779912f5c48b782e7dd83e8f5d6a0a53fae9261f5494af2549f54c755d181d09a64c45ec5e40bf9f042744cd464440505038cef79ef60ffb8006bb9ee10271ec4ea998765c4fd4faa6148dab6c22213322faf3fa409aaee8a13d0aba207e355e42ec279fa924c911942d4344a6c47cdf78b4991f99b9d35f05eead53d754d07069d89594cd702bb30000ec4af9fc1728df5689d06fb6465c1371d39107e5056de94d20b3f6800b313b544c18583208d94e2603ae2a157cf6f1dd5b18dc8d499f6a8c5eb06d4a26aad493b2f9a66a02ae05b9bb43a76421ae50c5df5d6e1dba48c05cd6069313d3af1c2b0d71357a0c4ce30ed0e53053a1ac9a0a8edce594cc1bc26c95eab0b85488f934941977783d162393777eb38cca0729e3be097a3c443ea3ebc40037c545c4dedee24b60d416239b18e201726b881e6cd76c7dce2cf26b626665a344f5181cac3787bce19a0a9480ddfa289f67942be622f1fcdb440f4d7c7a664581d961cac0e5ad588b8649c33b1e4ad83ac6256420370eee198f63924b12481ae2e58d6f79a549b8454800000000000002a00007113bb9e6207717b3b14e5ac51bc27f79cbb5775d815cb707e8bae644fcc8d68aade01cf051f154df4385a4ac60612c9666f5ff4e5ac54f60a4dc9cca21faf3f628871157cfa4793180c5831b9c11783df76d1587c6077ee39c0018ca9f31d087336d5f46715b9412ea533aa984be87e8bb9f323d803dd3ea09807e7325a4d4439cd77e2072ee7f836d457a4989cd746a3e8f15f978d0a061816b606a95e0a264cf0d195f4ac00000000000000028fe474c01fcf5b3c6e43c9e1ad7c1541c1089d666c15285c17bfc146cc3a8ce221a38de036e075e32f79ad839e8e2c4877ac7a9b989d9a17c3b9cdbb94402a08b853f325b8179aec6bfd06f29a4fc9d3d67a8f720ead2bd27c0033d274fb257af00000000000000010000000000000002ae4b89ceed50027d6d54371909cac23358531d22325ac582e9b0e95c89a9ffbe363c9a86a4fbf7a1d741fcd0bfa7ca174f95fdc81e69a7fd30e38bb3d4404c9cc998b63ef5e3440c5ae79fac4f7961a5b6cae948c36422599d7c3fb4eadd048ae05bae55e06952a020eee1c20a264cb9601b8a6ea9ca56aaba0cb923d30d4bfb35406b0c70ac8421dd1c227d6c2e7caebbc622db0af03afbef1a7af93fe8556c58ac1b173f3a4ea105b974974f8c68c30faca94f8c63952694d79731a7d3f1970000000000000001e05bae55e06952a020eee1c20a264cb9601b8a6ea9ca56aaba0cb923d30d4bfb35406b0c70ac8421dd1c227d6c2e7cae0000000000000001bbc622db0af03afbef1a7af93fe8556c58ac1b173f3a4ea105b974974f8c68c30faca94f8c63952694d79731a7d3f1970000000000000001e05bae55e06952a020eee1c20a264cb9601b8a6ea9ca56aaba0cb923d30d4bfb35406b0c70ac8421dd1c227d6c2e7cae02e065dacf768fbda032ff5fc81a33b35a5a7438b976426d5d78a8bddbfb50090526499fa87bdd586d03fe41fb2aa353c6d226c2390ee93c222e98b2b77f90fd34f465cd34678b9bd6489efc3dbff846dfbc1a8a29b904f2502a7b50d20b27f27a867a348b9ce46e212f0b0967622f458ae7c9064cfa3825e3542f97eddf80ec44edcce6f1607c1cc42f9dfba9436723bc33adaa40e6209c42c629f723de5bec5483f1700d60c8061bf536ae7a0ee2a0b799ba12c52e25345d7d0440617b10124a5e8c037405299c61fa19f960cc8e5313b607238c3c321322b810ffe908d7c81babb158ecfd4db63580248815a7a3599a09fd15d2d2192e8a38cd2847929bae364b2f7e7fd9c79bd20356c39e083a6cc1524201582bd34be72c2795c9e1d46c4c33526aebc93da4d935b1953b2bc2490c200b5a1986f48aab8a4ccd83b9791020ba1592a687093354640a1760cad87c9b910947f693c97ff912c62d0ce406cc34af2fa68f4bb1a390c97e12c59ab5c08583d00de645d1910dff6e26c6b23c14465eb1763b21cc84b813ed51bbed17647b51b6493dc7be4b288100171f8a889c1812b2bad35f750ba1518468116c067fa0d41edb7d45cc24b1521b1c88a8fa440fa0f709175deef977b89d326a42df1bdd976cbfb30ed4b85157defe04363def00a39850021d669b288cc9ceb9a87050ef8547686cd87f962249104e026a22dc08a57ca37f0ea9775fa3cae120a303fdaf951ec5042d7d368d875f059bcc232d054e127fedbd4d14127e817b3eb896609dd9734f3648816d773f4462b9809a682d1c66445823bcda9e1935409f478fc1a08c62b848f0c20f00dd196359063ebc19009c28d89288286dfa4c8de37a9506c9319e62a7debe8ce5f927dc48328c162cee5fa4efb7bf8097d9ce531614128a0a265f3f556fad6db6b41fb70cee65c200000000000002a04a6d790c88780e1281d4a68356f211300a6e3f1bde92592428f6ce92ffc1b1482f1ecd04e4f81b3230bbf6f199480c1cb9b02a04f0238e60581c6eb9f6350e6add40f43d3641bfd00a2ca19a85f0df1189a6de5e04ef9f9d0a5b3e06c92ee9b8f4555e1c9f38813e55de9b3896c35d5adde22f4b41ce7a1a394b394563f121b31bc50136e6607477b3a0cf0e92d96768732ca02fc8be2024d7d11a98aecbb0fd7844752624cb18620000000000000028bbbacb64d0386816d3ffbac56036e3b3ac9c88554bd47cbff4fedb20b844352c578561d02fde69bd7addfb118cf4d1b7bbc622db0af03afbef1a7af93fe8556c58ac1b173f3a4ea105b974974f8c68c30faca94f8c63952694d79731a7d3f19700000000000000010000000000000001 Thank-you. Generating DBC(s)... -Sending reissue request.. +Sending reissue tx.. -- Begin DBC -- -id: ace7fe01e8fd28fe10cd7ac52df453d91875687bb20ce3b834add3bd8d5f5c7c5f0ae1132ccbc20405c82cb237498f64 +id: ac85d408a33ce5272efcf31cf8cd16b6f7ac7179a195cdc4c147d7ef636515b28fc171983b7a4f148e783fa606cb4785 amount: unknown. SecretKey not available -owner: d16b06ffc7b7414e9a610b15850f88b5c0f11edbbd4e4b7f493912da5693b9379326e105cdf40cff53d993b7f2435e89648f4937b22cc80504c2cb2c13e10a5f7c5c5f8dbdd3ad34b8e30cb27b687518d953f42dc57acd10fe28fde801fee7ac0000000000000002 +owner: f52a810cae8e4035d96647a215582f83069f216c2f5ab4f88b2d367521421310237a16def5211e94bc4d81c9e5b96cb78547cb06a63f788e144f7a3b9871c18fb2156563efd747c1c4cd95a17971acf7b616cdf81cf3fc2e27e53ca308d485ac0000000000000002 inputs: - 9563c251c623d0ff322f362dfde8cd38af1196f14ef154649a9c44a3fd1593bb811c2e9ac4413041696b787d93895f83 + af57b24f273d03c027bdd2ea20f7a8673d9dfca4296fd0bfc6ae79815b323f858ba00244b9db9c3b7ca1d989b9a9c77a Data: -d16b06ffc7b7414e9a610b15850f88b5c0f11edbbd4e4b7f493912da5693b9379326e105cdf40cff53d993b7f2435e89648f4937b22cc80504c2cb2c13e10a5f7c5c5f8dbdd3ad34b8e30cb27b687518d953f42dc57acd10fe28fde801fee7ac0000000000000002805a970d3251f5ec4581c9b99d6913c67a1ba5f1599f3cc7e0f79198b58a5e0d5611a0c7ecee0931c9d9ae3e8f6fed1729b6d9e5545b6c34936c837ba9381e1d391fbb90954551948beb3b100bfbb34b724e0c873e4b1f458b4d0e14fb040682094af4b0f9f344586e215f3804bb4d59f1b498a75e2e502b858fcddd076f56dc7e444f24e769418646afd97557231ea7835f89937d786b69413041c49a2e1c81bb9315fda3449c9a6454f14ef19611af38cde8fd2d362f32ffd023c651c263950000000000000001648f4937b22cc80504c2cb2c13e10a5f7c5c5f8dbdd3ad34b8e30cb27b687518d953f42dc57acd10fe28fde801fee7ac0000000000000001835f89937d786b69413041c49a2e1c81bb9315fda3449c9a6454f14ef19611af38cde8fd2d362f32ffd023c651c263950000000000000001648f4937b22cc80504c2cb2c13e10a5f7c5c5f8dbdd3ad34b8e30cb27b687518d953f42dc57acd10fe28fde801fee7ac02d662d88336e96b4dc49155f81de806bd2cdb6503c08c06ee0e561c2c586ce80b7b30facadc609745db219c82e329ae5fa97a092d7dcf5a16a71b6a7fa0e54e2a5a8bc3703de161dae37c63d82239bf7fe051319c56e01b13a7a96de3563bd2634b24889769d3a1a363521c4da0be1221fec32aea0aa8930f7aaa4d516cf96e1de8da9c307ddd9470c55c56b9a8c8e12aba0dbe3ba3e9bba9a7eff30d00fc6006ca8c2556a35e7cccd18f03fd0b26e88928fb1de066237d18f0a5bfac11c4901dd9498128b7f77a4f35a8b9389ebd2ed09a7c9b6c13249d77015a5748645ca2339b016737364791fea6c316507cbd0d6cf5765ac81d1cc25a17328529cbc57e6f743c542f02a919fca2ce065ab9fc157f67ed388e4f493c125f5b78b4a1fda414f7dcfa036b37fa2c86d516f1259b31d57cc41806859df3cab837bfeebd1f26120ef226f2941136fafc67dd12fe11787627c88201def2e978f086cebe279cc6457c060eabb88c5e4848aac97eeace8e52859f4f483121da3a0b9b61e364efd25b9d91446421c7a7de20805ee492591e2e2990919462805ae065070ab9f6f76e0f9f5b3e2a4b44109446fc4b6cd07247dcfc30248592ca5ee095a6824d6e926803495fada87043d33d493c635f2c9d4fd327e6486662bb09b7f2d0842d59162601a1ab5ed223319d0255261a04a71ef6dfdb577b0bac325d2662da7b42dfbb9707b4cf3dbbcb3d184403b66e596256e4e04d92e579dc20a1219e9c13428bc8707e6445112cdf2ab34ff9ae2ae57d2201e6a3ddd59139c6d348f579112a8a933a67e92bf925db76085c7abc2d63261b2b8f129882e6e3bb6b821d7ccad2efd7ec5fcb9250e253b3deb02b2ee8d47bb943d12799f7f83731abc30a62bea94534881bec0d5ef069b0be0a8ade44a252396e5b34ef86664da50e023f986ade70800e00000000000002a00297a9cb06a7c29b2372b220a4436c46ce74ce991213b7c49839a62fd9116a520f4dbe391ff8fc2ff35a792bf22d8248ff577f6efec2fa1678934eee55cb26cb56e9ddf2ea88f8054e2bc0897e4c890a31e509a47dc3a1db8c5b1264b2c7675bd0806d885e73773e7009d7450dc1135833c3e198aeddf6a49bf19615cc216db804403895c772c6a6de7b211ff233d7d059cc381ca2e4bb319b86f304f9c50f0bd459eba61db7531800000000000000287ec664e088d6fe82746ad585b493fa14d21a330495ed66d5869a37050caec3e5d1294c4a21e6bd8899f92f007dadd4b6835f89937d786b69413041c49a2e1c81bb9315fda3449c9a6454f14ef19611af38cde8fd2d362f32ffd023c651c263950000000000000001 +f52a810cae8e4035d96647a215582f83069f216c2f5ab4f88b2d367521421310237a16def5211e94bc4d81c9e5b96cb78547cb06a63f788e144f7a3b9871c18fb2156563efd747c1c4cd95a17971acf7b616cdf81cf3fc2e27e53ca308d485ac000000000000000243278512ce08243555a97a32c420e2904a62e3bfe1e41ad6b2cf4f769dc5ce2c91f011d67b62d38d9cd8d2b03f71b60eb5fa7e01a595904d8443da448d88da563ffa113cd4e917ffe8f5c52b58311e67bf1f22ff72e943df5fbff44b6c54388ce05bae55e06952a020eee1c20a264cb9601b8a6ea9ca56aaba0cb923d30d4bfb35406b0c70ac8421dd1c227d6c2e7cae7ac7a9b989d9a17c3b9cdbb94402a08b853f325b8179aec6bfd06f29a4fc9d3d67a8f720ead2bd27c0033d274fb257af00000000000000018547cb06a63f788e144f7a3b9871c18fb2156563efd747c1c4cd95a17971acf7b616cdf81cf3fc2e27e53ca308d485ac00000000000000017ac7a9b989d9a17c3b9cdbb94402a08b853f325b8179aec6bfd06f29a4fc9d3d67a8f720ead2bd27c0033d274fb257af00000000000000018547cb06a63f788e144f7a3b9871c18fb2156563efd747c1c4cd95a17971acf7b616cdf81cf3fc2e27e53ca308d485ac0319e3c87f4287bcf42d1b87978246c731015bc54448262ccb9288db0d026e1006d0983c4d8d730d5eb34a8dc96daebe8dd3ab658373473fe33acead27477e85145352cc091b4bb26ce7a79ca11e0d4e93614b8fa7678e3be53c979128f3dbd648967d32218fc2481d0fa3266e6603dc9a708fc87a261d2d776ad8ab69b71d38327a6c458c339b7d1009b1ac2854996a1b70cd55d3f0a580217abc6dc9886bb00715f485bedc5a14d7f94a5f17c5bfc2e2c8553b9dd14df3d7074e9cf51f3b927e2be72ad57c9ef33444859b407104467b6b18a27e1d2664b28ca52464415326764bc600b1d7d2834e53de856e34954201deb062850d89ee4558b12066f8d0641e79cf4ea90abc14b82f9842561b3645cd09920dacd8cc0898b3e6b13e5bc26612abd9605112d645aa00fdf05645dbca93fb3572e3d29d375f8298d4cdfac9e05101a20c9e3c30b9af723b3e799c84a4d8314374656f076f5480500e84f3d7d434a5768b90ce13e40dfdc1fdbfe2df5d1207b1ec931ce2445325b75796c237cc34e8caf7f1a01bd0184e97be7ab035416ecd6c3fab8a53d2a4f94266c3757d74194aa86b66ec678afe29f0d14c84311363cf66492d15db45ef2dd69bb683c3f80a08b1b256574451c74d721b9a52ff1e1dd39d1b052afd66493b9c2554a896530d01ba320f149cbf517f5e6dab9222f7473de7ec65d5289e6c08e18d31e6e67901b855f4727ad9ed19104ac55c9cb7a4aa5ca8b4464ae632eb87f1fd392b2ea123723bea052ea066a9364fd366d005a8a0176461a409aabda53a64126e3b95aa39b277316efdc2a2a23ad1eb10c4568271ea6227f9ec3b64206e9d2e0f4b44b67f2cb7974d604338ffa584fbea446719a8a3f77c24cedcebc640de4c3301130a5d8fff0bddcf0e999affec415cdec12f185f04db12bc84b66a5ba561b489e23600000000000002a0509b15d5605e9fca106e66c1dd616394c78b506f4dd875fe0e344f4224c551cc9bdf1426e01e620c4a528d6e47a437c47220496df2b96a479e1dd8f22f090a1d70c3325600722182f94dfbdf4ebaa610fbb63de2fd196ea36598ed0d929d863e0d5f926241aa82a5e01c93c734f78ba37b119317dd8fc3064bbeeeb9e935aeb732f94587f205368d9311cc755a35e8b9ffca29bfcf9dc6ae96a3ac1ce67f6ac6689207860cf25d6f0000000000000028c0570964d6220618189ce311ebe3cc6791ed763b87f97efbad61c4733eb0c7283247be3203af64b04732e15cd07a4aa07ac7a9b989d9a17c3b9cdbb94402a08b853f325b8179aec6bfd06f29a4fc9d3d67a8f720ead2bd27c0033d274fb257af0000000000000001 -- End DBC -- -- Begin DBC -- -id: ace7fe01e8fd28fe10cd7ac52df453d91875687bb20ce3b834add3bd8d5f5c7c5f0ae1132ccbc20405c82cb237498f64 +id: ac85d408a33ce5272efcf31cf8cd16b6f7ac7179a195cdc4c147d7ef636515b28fc171983b7a4f148e783fa606cb4785 amount: unknown. SecretKey not available -owner: d16b06ffc7b7414e9a610b15850f88b5c0f11edbbd4e4b7f493912da5693b9379326e105cdf40cff53d993b7f2435e89648f4937b22cc80504c2cb2c13e10a5f7c5c5f8dbdd3ad34b8e30cb27b687518d953f42dc57acd10fe28fde801fee7ac0000000000000002 +owner: f52a810cae8e4035d96647a215582f83069f216c2f5ab4f88b2d367521421310237a16def5211e94bc4d81c9e5b96cb78547cb06a63f788e144f7a3b9871c18fb2156563efd747c1c4cd95a17971acf7b616cdf81cf3fc2e27e53ca308d485ac0000000000000002 inputs: - 9563c251c623d0ff322f362dfde8cd38af1196f14ef154649a9c44a3fd1593bb811c2e9ac4413041696b787d93895f83 + af57b24f273d03c027bdd2ea20f7a8673d9dfca4296fd0bfc6ae79815b323f858ba00244b9db9c3b7ca1d989b9a9c77a Data: -d16b06ffc7b7414e9a610b15850f88b5c0f11edbbd4e4b7f493912da5693b9379326e105cdf40cff53d993b7f2435e89648f4937b22cc80504c2cb2c13e10a5f7c5c5f8dbdd3ad34b8e30cb27b687518d953f42dc57acd10fe28fde801fee7ac0000000000000002805a970d3251f5ec4581c9b99d6913c67a1ba5f1599f3cc7e0f79198b58a5e0d5611a0c7ecee0931c9d9ae3e8f6fed1729b6d9e5545b6c34936c837ba9381e1d391fbb90954551948beb3b100bfbb34b724e0c873e4b1f458b4d0e14fb040682094af4b0f9f344586e215f3804bb4d59f1b498a75e2e502b858fcddd076f56dc7e444f24e769418646afd97557231ea7835f89937d786b69413041c49a2e1c81bb9315fda3449c9a6454f14ef19611af38cde8fd2d362f32ffd023c651c263950000000000000001648f4937b22cc80504c2cb2c13e10a5f7c5c5f8dbdd3ad34b8e30cb27b687518d953f42dc57acd10fe28fde801fee7ac0000000000000001835f89937d786b69413041c49a2e1c81bb9315fda3449c9a6454f14ef19611af38cde8fd2d362f32ffd023c651c263950000000000000001648f4937b22cc80504c2cb2c13e10a5f7c5c5f8dbdd3ad34b8e30cb27b687518d953f42dc57acd10fe28fde801fee7ac05609247e364a5faa363cffaec1dbdc2f96db226275d2a7581de7b271c2f8e780875dc4f799f910deac2a547da5305732dd8d700bd1342c52b3dd7c05047f4e20252bf329749ce8abb1ef5ab44fd6bd65a0e8a2d11a5279be5bddfdd4294ed9e2cc1744a5030cbc39aedd2da9961b2161ce8b0f6670bab88844cdb6a93d1ebfa5a72185150878036ab038fd5c16b9384ebcfc63d64e06e6aa8172dde925bdff4200ac18cd0e82a209fe3bf382afdf15cee494a8d1cf862d3c784aa2c513de12c32acce82cf9d3fdf3c82aba25afcb458e5917b76ab1160d462cb3d0fa0050b4459b232670fa8f2d7c1be4fbde634e17a706233e41b491316be0fd318922e565e0847139f65a4d77d7349185d132143c66b765437ef82d83bb94d141f8a35380e1a499c02e8ec3966048551714469d46bdacd8c7e5b96886b855ff2d8e98fa52c56a56612cb84c5e370029e90a964a6f74a66fa79aa82d0955be423e68bcf15ca1b186da2588994c9cbe519cefe0bdd3be5c59f2053299e27bbc9f3fb4b72716e68f1f4663cb7926b9273028fedeecc4418382fa1fa9c432b853c3295f38736f015be8fbacf9aa9c937e3466df09fff9a8d9f2d69bdc46af61ccc6fbf603ee0e2022e02f59f1cbe0bd99cee23a0f5a34cde82fc15d5968b98c5a7572d5dd660560868a915a5d4c72c1eea79dc52513047a9196a4335b52a1171a5fcfbeb1dcb1204415c9702727014d9f59614a15f698c916cac6190257bd9b687ef7a6bf34cf41da3d71fbcdabb7cca6e391687dcbc21aef12bfc00dea2e98a99e3fdfdbbc6c23579981a24d226315710ea0cca20cdddc14633e8408f93be5c05dde8c9bd2698690df4b93d61d6ecb4e054d74cb3763421cabb7a32a7f69301f70a514cd5453c6668fa9629af315bb9a225ead51c479c165981a6253865ab2813d4ace8c8705000000000000002a0727e443a582f549efc2b09a8548d371abcefaa3d52ca392e1c31b56dd8b9332c6d988e38c0598c30a6af7cf39cfa1625b86c0a09966ff47da8ea8daa78ac4b3fa029a3be277c7ae012d2789b477c790b3a2e2ae926bd4ab6426563a05ad8c0d65430cf8208aca5cb5176bc923ddde79502bb4d3759d9fc899b519b016f4ab587dca3d40da78980d3fa9a20e1d3f32a5573f48c262b382f632ddb435ede55279dc82c276045d0c9c300000000000000289d56f04d0f0b585728e6fbb1390e40cc556cefd5a709105ad0c10b7a25d51c4ee68def6a731be81c20d20adfb069a395835f89937d786b69413041c49a2e1c81bb9315fda3449c9a6454f14ef19611af38cde8fd2d362f32ffd023c651c263950000000000000001 +f52a810cae8e4035d96647a215582f83069f216c2f5ab4f88b2d367521421310237a16def5211e94bc4d81c9e5b96cb78547cb06a63f788e144f7a3b9871c18fb2156563efd747c1c4cd95a17971acf7b616cdf81cf3fc2e27e53ca308d485ac000000000000000243278512ce08243555a97a32c420e2904a62e3bfe1e41ad6b2cf4f769dc5ce2c91f011d67b62d38d9cd8d2b03f71b60eb5fa7e01a595904d8443da448d88da563ffa113cd4e917ffe8f5c52b58311e67bf1f22ff72e943df5fbff44b6c54388ce05bae55e06952a020eee1c20a264cb9601b8a6ea9ca56aaba0cb923d30d4bfb35406b0c70ac8421dd1c227d6c2e7cae7ac7a9b989d9a17c3b9cdbb94402a08b853f325b8179aec6bfd06f29a4fc9d3d67a8f720ead2bd27c0033d274fb257af00000000000000018547cb06a63f788e144f7a3b9871c18fb2156563efd747c1c4cd95a17971acf7b616cdf81cf3fc2e27e53ca308d485ac00000000000000017ac7a9b989d9a17c3b9cdbb94402a08b853f325b8179aec6bfd06f29a4fc9d3d67a8f720ead2bd27c0033d274fb257af00000000000000018547cb06a63f788e144f7a3b9871c18fb2156563efd747c1c4cd95a17971acf7b616cdf81cf3fc2e27e53ca308d485ac0429046e8ffe81bf259642616f69ef76c3d86ee868ccb904835b1b1f07fde7400648e9699e11d4810161cf3eee47b50b06aab6945042989a77804dbc6fcbb199089e0c689cb8c3217fc06cff1fa9982873dcf4824e4ed7b869f9dd4332487514046f75ec5c69469cc5972dbf2eb2b4f56094cb987ab8774dcecb41675d2310dc3f734b392a9732ee471cc7d4c2a2db308bc1b4a04d2b9863dbfb4948cfdd0a7002f78e8fdf6c68bcde0ac24966b4246c28b5cf83c5443d7fb3e612f9e955146e5e19f8857ef4d6d9099a80de831b66a4a78941c0d825b5337980118c6bd472e014f23b89a115142fc3f43cfb7e095936b4fd64b4c000b381fced479bd0a1380475183316071c6e4673001648eeb604e20b54779912f5c48b782e7dd83e8f5d6a0a53fae9261f5494af2549f54c755d181d09a64c45ec5e40bf9f042744cd464440505038cef79ef60ffb8006bb9ee10271ec4ea998765c4fd4faa6148dab6c22213322faf3fa409aaee8a13d0aba207e355e42ec279fa924c911942d4344a6c47cdf78b4991f99b9d35f05eead53d754d07069d89594cd702bb30000ec4af9fc1728df5689d06fb6465c1371d39107e5056de94d20b3f6800b313b544c18583208d94e2603ae2a157cf6f1dd5b18dc8d499f6a8c5eb06d4a26aad493b2f9a66a02ae05b9bb43a76421ae50c5df5d6e1dba48c05cd6069313d3af1c2b0d71357a0c4ce30ed0e53053a1ac9a0a8edce594cc1bc26c95eab0b85488f934941977783d162393777eb38cca0729e3be097a3c443ea3ebc40037c545c4dedee24b60d416239b18e201726b881e6cd76c7dce2cf26b626665a344f5181cac3787bce19a0a9480ddfa289f67942be622f1fcdb440f4d7c7a664581d961cac0e5ad588b8649c33b1e4ad83ac6256420370eee198f63924b12481ae2e58d6f79a549b8454800000000000002a00007113bb9e6207717b3b14e5ac51bc27f79cbb5775d815cb707e8bae644fcc8d68aade01cf051f154df4385a4ac60612c9666f5ff4e5ac54f60a4dc9cca21faf3f628871157cfa4793180c5831b9c11783df76d1587c6077ee39c0018ca9f31d087336d5f46715b9412ea533aa984be87e8bb9f323d803dd3ea09807e7325a4d4439cd77e2072ee7f836d457a4989cd746a3e8f15f978d0a061816b606a95e0a264cf0d195f4ac00000000000000028fe474c01fcf5b3c6e43c9e1ad7c1541c1089d666c15285c17bfc146cc3a8ce221a38de036e075e32f79ad839e8e2c4877ac7a9b989d9a17c3b9cdbb94402a08b853f325b8179aec6bfd06f29a4fc9d3d67a8f720ead2bd27c0033d274fb257af0000000000000001 -- End DBC -- >> reissue_ez @@ -248,17 +203,21 @@ Input DBC #0 DBC Data, or 'done': -d16b06ffc7b7414e9a610b15850f88b5c0f11edbbd4e4b7f493912da5693b9379326e105cdf40cff53d993b7f2435e89648f4937b22cc80504c2cb2c13e10a5f7c5c5f8dbdd3ad34b8e30cb27b687518d953f42dc57acd10fe28fde801fee7ac0000000000000002805a970d3251f5ec4581c9b99d6913c67a1ba5f1599f3cc7e0f79198b58a5e0d5611a0c7ecee0931c9d9ae3e8f6fed1729b6d9e5545b6c34936c837ba9381e1d391fbb90954551948beb3b100bfbb34b724e0c873e4b1f458b4d0e14fb040682094af4b0f9f344586e215f3804bb4d59f1b498a75e2e502b858fcddd076f56dc7e444f24e769418646afd97557231ea7835f89937d786b69413041c49a2e1c81bb9315fda3449c9a6454f14ef19611af38cde8fd2d362f32ffd023c651c263950000000000000001648f4937b22cc80504c2cb2c13e10a5f7c5c5f8dbdd3ad34b8e30cb27b687518d953f42dc57acd10fe28fde801fee7ac0000000000000001835f89937d786b69413041c49a2e1c81bb9315fda3449c9a6454f14ef19611af38cde8fd2d362f32ffd023c651c263950000000000000001648f4937b22cc80504c2cb2c13e10a5f7c5c5f8dbdd3ad34b8e30cb27b687518d953f42dc57acd10fe28fde801fee7ac02d662d88336e96b4dc49155f81de806bd2cdb6503c08c06ee0e561c2c586ce80b7b30facadc609745db219c82e329ae5fa97a092d7dcf5a16a71b6a7fa0e54e2a5a8bc3703de161dae37c63d82239bf7fe051319c56e01b13a7a96de3563bd2634b24889769d3a1a363521c4da0be1221fec32aea0aa8930f7aaa4d516cf96e1de8da9c307ddd9470c55c56b9a8c8e12aba0dbe3ba3e9bba9a7eff30d00fc6006ca8c2556a35e7cccd18f03fd0b26e88928fb1de066237d18f0a5bfac11c4901dd9498128b7f77a4f35a8b9389ebd2ed09a7c9b6c13249d77015a5748645ca2339b016737364791fea6c316507cbd0d6cf5765ac81d1cc25a17328529cbc57e6f743c542f02a919fca2ce065ab9fc157f67ed388e4f493c125f5b78b4a1fda414f7dcfa036b37fa2c86d516f1259b31d57cc41806859df3cab837bfeebd1f26120ef226f2941136fafc67dd12fe11787627c88201def2e978f086cebe279cc6457c060eabb88c5e4848aac97eeace8e52859f4f483121da3a0b9b61e364efd25b9d91446421c7a7de20805ee492591e2e2990919462805ae065070ab9f6f76e0f9f5b3e2a4b44109446fc4b6cd07247dcfc30248592ca5ee095a6824d6e926803495fada87043d33d493c635f2c9d4fd327e6486662bb09b7f2d0842d59162601a1ab5ed223319d0255261a04a71ef6dfdb577b0bac325d2662da7b42dfbb9707b4cf3dbbcb3d184403b66e596256e4e04d92e579dc20a1219e9c13428bc8707e6445112cdf2ab34ff9ae2ae57d2201e6a3ddd59139c6d348f579112a8a933a67e92bf925db76085c7abc2d63261b2b8f129882e6e3bb6b821d7ccad2efd7ec5fcb9250e253b3deb02b2ee8d47bb943d12799f7f83731abc30a62bea94534881bec0d5ef069b0be0a8ade44a252396e5b34ef86664da50e023f986ade70800e00000000000002a00297a9cb06a7c29b2372b220a4436c46ce74ce991213b7c49839a62fd9116a520f4dbe391ff8fc2ff35a792bf22d8248ff577f6efec2fa1678934eee55cb26cb56e9ddf2ea88f8054e2bc0897e4c890a31e509a47dc3a1db8c5b1264b2c7675bd0806d885e73773e7009d7450dc1135833c3e198aeddf6a49bf19615cc216db804403895c772c6a6de7b211ff233d7d059cc381ca2e4bb319b86f304f9c50f0bd459eba61db7531800000000000000287ec664e088d6fe82746ad585b493fa14d21a330495ed66d5869a37050caec3e5d1294c4a21e6bd8899f92f007dadd4b6835f89937d786b69413041c49a2e1c81bb9315fda3449c9a6454f14ef19611af38cde8fd2d362f32ffd023c651c263950000000000000001 +19f8132d40cde3095ddb368c5152eb69ba20ffb07a75ffc881d989f4e394dd02^A^Kdone +DBC decoding failed: Invalid character '\u{1}' at position 64 + +DBC Data, or 'done': +f52a810cae8e4035d96647a215582f83069f216c2f5ab4f88b2d367521421310237a16def5211e94bc4d81c9e5b96cb78547cb06a63f788e144f7a3b9871c18fb2156563efd747c1c4cd95a17971acf7b616cdf81cf3fc2e27e53ca308d485ac000000000000000243278512ce08243555a97a32c420e2904a62e3bfe1e41ad6b2cf4f769dc5ce2c91f011d67b62d38d9cd8d2b03f71b60eb5fa7e01a595904d8443da448d88da563ffa113cd4e917ffe8f5c52b58311e67bf1f22ff72e943df5fbff44b6c54388ce05bae55e06952a020eee1c20a264cb9601b8a6ea9ca56aaba0cb923d30d4bfb35406b0c70ac8421dd1c227d6c2e7cae7ac7a9b989d9a17c3b9cdbb94402a08b853f325b8179aec6bfd06f29a4fc9d3d67a8f720ead2bd27c0033d274fb257af00000000000000018547cb06a63f788e144f7a3b9871c18fb2156563efd747c1c4cd95a17971acf7b616cdf81cf3fc2e27e53ca308d485ac00000000000000017ac7a9b989d9a17c3b9cdbb94402a08b853f325b8179aec6bfd06f29a4fc9d3d67a8f720ead2bd27c0033d274fb257af00000000000000018547cb06a63f788e144f7a3b9871c18fb2156563efd747c1c4cd95a17971acf7b616cdf81cf3fc2e27e53ca308d485ac0319e3c87f4287bcf42d1b87978246c731015bc54448262ccb9288db0d026e1006d0983c4d8d730d5eb34a8dc96daebe8dd3ab658373473fe33acead27477e85145352cc091b4bb26ce7a79ca11e0d4e93614b8fa7678e3be53c979128f3dbd648967d32218fc2481d0fa3266e6603dc9a708fc87a261d2d776ad8ab69b71d38327a6c458c339b7d1009b1ac2854996a1b70cd55d3f0a580217abc6dc9886bb00715f485bedc5a14d7f94a5f17c5bfc2e2c8553b9dd14df3d7074e9cf51f3b927e2be72ad57c9ef33444859b407104467b6b18a27e1d2664b28ca52464415326764bc600b1d7d2834e53de856e34954201deb062850d89ee4558b12066f8d0641e79cf4ea90abc14b82f9842561b3645cd09920dacd8cc0898b3e6b13e5bc26612abd9605112d645aa00fdf05645dbca93fb3572e3d29d375f8298d4cdfac9e05101a20c9e3c30b9af723b3e799c84a4d8314374656f076f5480500e84f3d7d434a5768b90ce13e40dfdc1fdbfe2df5d1207b1ec931ce2445325b75796c237cc34e8caf7f1a01bd0184e97be7ab035416ecd6c3fab8a53d2a4f94266c3757d74194aa86b66ec678afe29f0d14c84311363cf66492d15db45ef2dd69bb683c3f80a08b1b256574451c74d721b9a52ff1e1dd39d1b052afd66493b9c2554a896530d01ba320f149cbf517f5e6dab9222f7473de7ec65d5289e6c08e18d31e6e67901b855f4727ad9ed19104ac55c9cb7a4aa5ca8b4464ae632eb87f1fd392b2ea123723bea052ea066a9364fd366d005a8a0176461a409aabda53a64126e3b95aa39b277316efdc2a2a23ad1eb10c4568271ea6227f9ec3b64206e9d2e0f4b44b67f2cb7974d604338ffa584fbea446719a8a3f77c24cedcebc640de4c3301130a5d8fff0bddcf0e999affec415cdec12f185f04db12bc84b66a5ba561b489e23600000000000002a0509b15d5605e9fca106e66c1dd616394c78b506f4dd875fe0e344f4224c551cc9bdf1426e01e620c4a528d6e47a437c47220496df2b96a479e1dd8f22f090a1d70c3325600722182f94dfbdf4ebaa610fbb63de2fd196ea36598ed0d929d863e0d5f926241aa82a5e01c93c734f78ba37b119317dd8fc3064bbeeeb9e935aeb732f94587f205368d9311cc755a35e8b9ffca29bfcf9dc6ae96a3ac1ce67f6ac6689207860cf25d6f0000000000000028c0570964d6220618189ce311ebe3cc6791ed763b87f97efbad61c4733eb0c7283247be3203af64b04732e15cd07a4aa07ac7a9b989d9a17c3b9cdbb94402a08b853f325b8179aec6bfd06f29a4fc9d3d67a8f720ead2bd27c0033d274fb257af0000000000000001 Valid DBC We need 2 SecretKeyShare in order to decrypt the input amount. SecretKeyShare, or 'cancel': -6bb6c87541625dfe3f053d6e1a249f3897eb178dd474fb96b62fb71ca1c3ec2f +276625d34dfeb07a8670caf3938ffa4423dd069fdbf304842436ef608c87fd4a SecretKeyShare Index: 2 SecretKeyShare, or 'cancel': -40b87b9efb029e65f47596dadd622bd7f6fee6007a4a0c2f454fcd60cbcc8563 +19f8132d40cde3095ddb368c5152eb69ba20ffb07a75ffc881d989f4e394dd02 SecretKeyShare Index: 4 -------------- @@ -267,17 +226,17 @@ Input DBC #1 DBC Data, or 'done': -d16b06ffc7b7414e9a610b15850f88b5c0f11edbbd4e4b7f493912da5693b9379326e105cdf40cff53d993b7f2435e89648f4937b22cc80504c2cb2c13e10a5f7c5c5f8dbdd3ad34b8e30cb27b687518d953f42dc57acd10fe28fde801fee7ac0000000000000002805a970d3251f5ec4581c9b99d6913c67a1ba5f1599f3cc7e0f79198b58a5e0d5611a0c7ecee0931c9d9ae3e8f6fed1729b6d9e5545b6c34936c837ba9381e1d391fbb90954551948beb3b100bfbb34b724e0c873e4b1f458b4d0e14fb040682094af4b0f9f344586e215f3804bb4d59f1b498a75e2e502b858fcddd076f56dc7e444f24e769418646afd97557231ea7835f89937d786b69413041c49a2e1c81bb9315fda3449c9a6454f14ef19611af38cde8fd2d362f32ffd023c651c263950000000000000001648f4937b22cc80504c2cb2c13e10a5f7c5c5f8dbdd3ad34b8e30cb27b687518d953f42dc57acd10fe28fde801fee7ac0000000000000001835f89937d786b69413041c49a2e1c81bb9315fda3449c9a6454f14ef19611af38cde8fd2d362f32ffd023c651c263950000000000000001648f4937b22cc80504c2cb2c13e10a5f7c5c5f8dbdd3ad34b8e30cb27b687518d953f42dc57acd10fe28fde801fee7ac05609247e364a5faa363cffaec1dbdc2f96db226275d2a7581de7b271c2f8e780875dc4f799f910deac2a547da5305732dd8d700bd1342c52b3dd7c05047f4e20252bf329749ce8abb1ef5ab44fd6bd65a0e8a2d11a5279be5bddfdd4294ed9e2cc1744a5030cbc39aedd2da9961b2161ce8b0f6670bab88844cdb6a93d1ebfa5a72185150878036ab038fd5c16b9384ebcfc63d64e06e6aa8172dde925bdff4200ac18cd0e82a209fe3bf382afdf15cee494a8d1cf862d3c784aa2c513de12c32acce82cf9d3fdf3c82aba25afcb458e5917b76ab1160d462cb3d0fa0050b4459b232670fa8f2d7c1be4fbde634e17a706233e41b491316be0fd318922e565e0847139f65a4d77d7349185d132143c66b765437ef82d83bb94d141f8a35380e1a499c02e8ec3966048551714469d46bdacd8c7e5b96886b855ff2d8e98fa52c56a56612cb84c5e370029e90a964a6f74a66fa79aa82d0955be423e68bcf15ca1b186da2588994c9cbe519cefe0bdd3be5c59f2053299e27bbc9f3fb4b72716e68f1f4663cb7926b9273028fedeecc4418382fa1fa9c432b853c3295f38736f015be8fbacf9aa9c937e3466df09fff9a8d9f2d69bdc46af61ccc6fbf603ee0e2022e02f59f1cbe0bd99cee23a0f5a34cde82fc15d5968b98c5a7572d5dd660560868a915a5d4c72c1eea79dc52513047a9196a4335b52a1171a5fcfbeb1dcb1204415c9702727014d9f59614a15f698c916cac6190257bd9b687ef7a6bf34cf41da3d71fbcdabb7cca6e391687dcbc21aef12bfc00dea2e98a99e3fdfdbbc6c23579981a24d226315710ea0cca20cdddc14633e8408f93be5c05dde8c9bd2698690df4b93d61d6ecb4e054d74cb3763421cabb7a32a7f69301f70a514cd5453c6668fa9629af315bb9a225ead51c479c165981a6253865ab2813d4ace8c8705000000000000002a0727e443a582f549efc2b09a8548d371abcefaa3d52ca392e1c31b56dd8b9332c6d988e38c0598c30a6af7cf39cfa1625b86c0a09966ff47da8ea8daa78ac4b3fa029a3be277c7ae012d2789b477c790b3a2e2ae926bd4ab6426563a05ad8c0d65430cf8208aca5cb5176bc923ddde79502bb4d3759d9fc899b519b016f4ab587dca3d40da78980d3fa9a20e1d3f32a5573f48c262b382f632ddb435ede55279dc82c276045d0c9c300000000000000289d56f04d0f0b585728e6fbb1390e40cc556cefd5a709105ad0c10b7a25d51c4ee68def6a731be81c20d20adfb069a395835f89937d786b69413041c49a2e1c81bb9315fda3449c9a6454f14ef19611af38cde8fd2d362f32ffd023c651c263950000000000000001 +f52a810cae8e4035d96647a215582f83069f216c2f5ab4f88b2d367521421310237a16def5211e94bc4d81c9e5b96cb78547cb06a63f788e144f7a3b9871c18fb2156563efd747c1c4cd95a17971acf7b616cdf81cf3fc2e27e53ca308d485ac000000000000000243278512ce08243555a97a32c420e2904a62e3bfe1e41ad6b2cf4f769dc5ce2c91f011d67b62d38d9cd8d2b03f71b60eb5fa7e01a595904d8443da448d88da563ffa113cd4e917ffe8f5c52b58311e67bf1f22ff72e943df5fbff44b6c54388ce05bae55e06952a020eee1c20a264cb9601b8a6ea9ca56aaba0cb923d30d4bfb35406b0c70ac8421dd1c227d6c2e7cae7ac7a9b989d9a17c3b9cdbb94402a08b853f325b8179aec6bfd06f29a4fc9d3d67a8f720ead2bd27c0033d274fb257af00000000000000018547cb06a63f788e144f7a3b9871c18fb2156563efd747c1c4cd95a17971acf7b616cdf81cf3fc2e27e53ca308d485ac00000000000000017ac7a9b989d9a17c3b9cdbb94402a08b853f325b8179aec6bfd06f29a4fc9d3d67a8f720ead2bd27c0033d274fb257af00000000000000018547cb06a63f788e144f7a3b9871c18fb2156563efd747c1c4cd95a17971acf7b616cdf81cf3fc2e27e53ca308d485ac0429046e8ffe81bf259642616f69ef76c3d86ee868ccb904835b1b1f07fde7400648e9699e11d4810161cf3eee47b50b06aab6945042989a77804dbc6fcbb199089e0c689cb8c3217fc06cff1fa9982873dcf4824e4ed7b869f9dd4332487514046f75ec5c69469cc5972dbf2eb2b4f56094cb987ab8774dcecb41675d2310dc3f734b392a9732ee471cc7d4c2a2db308bc1b4a04d2b9863dbfb4948cfdd0a7002f78e8fdf6c68bcde0ac24966b4246c28b5cf83c5443d7fb3e612f9e955146e5e19f8857ef4d6d9099a80de831b66a4a78941c0d825b5337980118c6bd472e014f23b89a115142fc3f43cfb7e095936b4fd64b4c000b381fced479bd0a1380475183316071c6e4673001648eeb604e20b54779912f5c48b782e7dd83e8f5d6a0a53fae9261f5494af2549f54c755d181d09a64c45ec5e40bf9f042744cd464440505038cef79ef60ffb8006bb9ee10271ec4ea998765c4fd4faa6148dab6c22213322faf3fa409aaee8a13d0aba207e355e42ec279fa924c911942d4344a6c47cdf78b4991f99b9d35f05eead53d754d07069d89594cd702bb30000ec4af9fc1728df5689d06fb6465c1371d39107e5056de94d20b3f6800b313b544c18583208d94e2603ae2a157cf6f1dd5b18dc8d499f6a8c5eb06d4a26aad493b2f9a66a02ae05b9bb43a76421ae50c5df5d6e1dba48c05cd6069313d3af1c2b0d71357a0c4ce30ed0e53053a1ac9a0a8edce594cc1bc26c95eab0b85488f934941977783d162393777eb38cca0729e3be097a3c443ea3ebc40037c545c4dedee24b60d416239b18e201726b881e6cd76c7dce2cf26b626665a344f5181cac3787bce19a0a9480ddfa289f67942be622f1fcdb440f4d7c7a664581d961cac0e5ad588b8649c33b1e4ad83ac6256420370eee198f63924b12481ae2e58d6f79a549b8454800000000000002a00007113bb9e6207717b3b14e5ac51bc27f79cbb5775d815cb707e8bae644fcc8d68aade01cf051f154df4385a4ac60612c9666f5ff4e5ac54f60a4dc9cca21faf3f628871157cfa4793180c5831b9c11783df76d1587c6077ee39c0018ca9f31d087336d5f46715b9412ea533aa984be87e8bb9f323d803dd3ea09807e7325a4d4439cd77e2072ee7f836d457a4989cd746a3e8f15f978d0a061816b606a95e0a264cf0d195f4ac00000000000000028fe474c01fcf5b3c6e43c9e1ad7c1541c1089d666c15285c17bfc146cc3a8ce221a38de036e075e32f79ad839e8e2c4877ac7a9b989d9a17c3b9cdbb94402a08b853f325b8179aec6bfd06f29a4fc9d3d67a8f720ead2bd27c0033d274fb257af0000000000000001 Valid DBC We need 2 SecretKeyShare in order to decrypt the input amount. SecretKeyShare, or 'cancel': -6bb6c87541625dfe3f053d6e1a249f3897eb178dd474fb96b62fb71ca1c3ec2f +276625d34dfeb07a8670caf3938ffa4423dd069fdbf304842436ef608c87fd4a SecretKeyShare Index: 2 SecretKeyShare, or 'cancel': -40b87b9efb029e65f47596dadd622bd7f6fee6007a4a0c2f454fcd60cbcc8563 +19f8132d40cde3095ddb368c5152eb69ba20ffb07a75ffc881d989f4e394dd02 SecretKeyShare Index: 4 -------------- @@ -302,8 +261,7 @@ d16b06ffc7b7414e9a610b15850f88b5c0f11edbbd4e4b7f493912da5693b9379326e105cdf40cff Thank-you. Generating DBC(s)... -Prepared reissue request... -Sending reissue request.. +Sending reissue tx.. -- Begin DBC -- id: ace7fe01e8fd28fe10cd7ac52df453d91875687bb20ce3b834add3bd8d5f5c7c5f0ae1132ccbc20405c82cb237498f64 @@ -313,9 +271,11 @@ amount: unknown. SecretKey not available owner: d16b06ffc7b7414e9a610b15850f88b5c0f11edbbd4e4b7f493912da5693b9379326e105cdf40cff53d993b7f2435e89648f4937b22cc80504c2cb2c13e10a5f7c5c5f8dbdd3ad34b8e30cb27b687518d953f42dc57acd10fe28fde801fee7ac0000000000000002 inputs: - 81b2862c81f713f6e97d183a9391b0f26581d9c01455a6be4d820358515fd8a76f33fea744dc23a26329e0317a1c8b2a - 8ac87879949086813f524f624cbe3ada9200376bb6503bd105b11e65c6820a1196c8f9e3a40b822623f29deacdf97768 + 821d7b9721932b428d86e36ffe4dfa0414bde8ab020507f27e12e8d7a2241dcaf12f38ded23a098294b01581a69591f8 + 91d1ed67668c7ac92292d553c589bc619d317f06706f2cddbf184d0e3202f3d7fd191653992b1b81d1f083aeb02f49b9 Data: -d16b06ffc7b7414e9a610b15850f88b5c0f11edbbd4e4b7f493912da5693b9379326e105cdf40cff53d993b7f2435e89648f4937b22cc80504c2cb2c13e10a5f7c5c5f8dbdd3ad34b8e30cb27b687518d953f42dc57acd10fe28fde801fee7ac00000000000000029b19a7c675e0087a06dbb2a5144ea209006752809875b93f9c842911d8fd22d97ead90b77f4771c7b25253ed84cc860cfa697728f0d8e8526a7dfdf3d0c4d2918aa033fd5dd21d26baa1b5a551ea879c068f66ee9f5fe02efc47718329238c98094af4b0f9f344586e215f3804bb4d59f1b498a75e2e502b858fcddd076f56dc7e444f24e769418646afd97557231ea76877f9cdea9df22326820ba4e3f9c896110a82c6651eb105d13b50b66b370092da3abe4c624f523f818690947978c88a9b19a7c675e0087a06dbb2a5144ea209006752809875b93f9c842911d8fd22d97ead90b77f4771c7b25253ed84cc860cfa697728f0d8e8526a7dfdf3d0c4d2918aa033fd5dd21d26baa1b5a551ea879c068f66ee9f5fe02efc47718329238c98094af4b0f9f344586e215f3804bb4d59f1b498a75e2e502b858fcddd076f56dc7e444f24e769418646afd97557231ea72a8b1c7a31e02963a223dc44a7fe336fa7d85f515803824dbea65514c0d98165f2b091933a187de9f613f7812c86b2810000000000000002648f4937b22cc80504c2cb2c13e10a5f7c5c5f8dbdd3ad34b8e30cb27b687518d953f42dc57acd10fe28fde801fee7ac00000000000000016877f9cdea9df22326820ba4e3f9c896110a82c6651eb105d13b50b66b370092da3abe4c624f523f818690947978c88a2a8b1c7a31e02963a223dc44a7fe336fa7d85f515803824dbea65514c0d98165f2b091933a187de9f613f7812c86b2810000000000000002648f4937b22cc80504c2cb2c13e10a5f7c5c5f8dbdd3ad34b8e30cb27b687518d953f42dc57acd10fe28fde801fee7ac0c226c7c276fea0af58eb2650ee3e741c40ddb72a23165cff87019cf3359ab1007b59aa63bd6f36e3ad13db28fc558cedcf4efc4c5f7668475b50ab1bf4bf82a0629ea6ee50785fb992283eccfa1acd16aa3f29c030c5549ac91c544374ce16c0fd7e7b4181053ee82d533a5d3f74e16013507869ac77039e6391f56b49723644585aecad5ec817c34f5fa689df83d417e67b04979a4d21868507ac6c9854a0227e22edc4fe56573a568a9edc837423936c753db199c680aee6cf6ebe121e04c547f743d07329ad444c688329e549712e8a964ebcecdee19994dfa94c7a24da46e4ae1224a76df2e3da3ef8a95abd658a037e63c7b6f5f55d16941962c94ef2c674e5c3f36a71a016ae3ffaa79e5b4fd9abff6362a0be675803f3d2a5305613a79a4d2236f07aa199320c69981e0badc16be2319c7548e741dbdd0f76aac259255704d0836edf2cd24f70ed7bf97201f87b7cf1c2e6f84c27bba74a4ad2a172023d8187db8cbe4ada20b3e3ed52f4c01f739be1b954707a05bca72b9428465143eeca5d77cfb729dc6b80688f456b297854b695664bf07283fba9c5fbd10090848cb12abfcf5d178e840452b280246df9afa15a21e68c8d4aa554c46f3921d2a0894e753eb68d57aff4fe30078865e478bf86fc075cbc9a5db4dffe926cc7f6f08eeda5f1d176b2027cf66e33f4d327fb9459548a2c059ab44713a4e8ccac87d0dc8cc758b48808a681127a6f0cdf30cc53a770e7339d04bd8a7c0e2fbcba4d5383af375617de0d6658166b0eb95a7a230f35c19ce7afcdc8cb51608c23aeb4415c58585e9f7f1853b7b0af653edaa1a3bf2207a66156633ed35f62a9095938461cda853585ac6b423a81a211e47718d9325be5621ce4a65dbc6b59f5679226047b7866b6fd1fd0348fc97c9bc9cac2eb9f20450363e7f45c6dc05a8719e7c1a00000000000002a07abc430eb0c39eec37ec7c11951f29d079a01b7a4948d5b1a132e9b9253ec6ee06e970e33ae79770c09276d36814e13309ddf9618843481ea81a952ccd6ef95ac309976cf90b906d04aa77704b512613f4e710ca46985437250c23010f0b64b3477ffaec1ad81392e96f4bd0c02bfee81a14d38a0ac216ec1db1a5af28a2eaaea4258f1baf3eef07530c351d2b16526934847bf051d9d983f11451bce053bfe97795a59be7ee9ef40000000000000028cadd2bd3c87b647ab87c1c5549b4b1010e755f034b43f4e8da5eda4954622cc32c9bb8f26de0012d5427b7927d4757b06877f9cdea9df22326820ba4e3f9c896110a82c6651eb105d13b50b66b370092da3abe4c624f523f818690947978c88a2a8b1c7a31e02963a223dc44a7fe336fa7d85f515803824dbea65514c0d98165f2b091933a187de9f613f7812c86b2810000000000000002 +d16b06ffc7b7414e9a610b15850f88b5c0f11edbbd4e4b7f493912da5693b9379326e105cdf40cff53d993b7f2435e89648f4937b22cc80504c2cb2c13e10a5f7c5c5f8dbdd3ad34b8e30cb27b687518d953f42dc57acd10fe28fde801fee7ac00000000000000022c941ec3a0645ef79d7838d99d6f79106237274460d7474f63ef446f15539f217b4e7eb216914f06fdc935938cb75900a4296576506e7ef515b31ec2a5622d1ccd9ad0d40d94221faf2fc31d71a3f906dcd20687e8465726d6ea0e7785b2cda2e05bae55e06952a020eee1c20a264cb9601b8a6ea9ca56aaba0cb923d30d4bfb35406b0c70ac8421dd1c227d6c2e7caeb9492fb0ae83f0d1811b2b99531619fdd7f302320e4d18bfdd2c6f70067f319d61bc89c553d59222c97a8c6667edd1912c941ec3a0645ef79d7838d99d6f79106237274460d7474f63ef446f15539f217b4e7eb216914f06fdc935938cb75900a4296576506e7ef515b31ec2a5622d1ccd9ad0d40d94221faf2fc31d71a3f906dcd20687e8465726d6ea0e7785b2cda2e05bae55e06952a020eee1c20a264cb9601b8a6ea9ca56aaba0cb923d30d4bfb35406b0c70ac8421dd1c227d6c2e7caef89195a68115b09482093ad2de382ff1ca1d24a2d7e8127ef2070502abe8bd1404fa4dfe6fe3868d422b9321977b1d820000000000000002648f4937b22cc80504c2cb2c13e10a5f7c5c5f8dbdd3ad34b8e30cb27b687518d953f42dc57acd10fe28fde801fee7ac0000000000000001b9492fb0ae83f0d1811b2b99531619fdd7f302320e4d18bfdd2c6f70067f319d61bc89c553d59222c97a8c6667edd191f89195a68115b09482093ad2de382ff1ca1d24a2d7e8127ef2070502abe8bd1404fa4dfe6fe3868d422b9321977b1d820000000000000002648f4937b22cc80504c2cb2c13e10a5f7c5c5f8dbdd3ad34b8e30cb27b687518d953f42dc57acd10fe28fde801fee7ac04a155db56f026db7641bf2855bf526ca0be3b43d7c447d646c5dcfeeed4aff60e1c3914c09596ac53462eb046b1ca3e1292f4d3011d4c897279a321862ffcba0921c14803d63c6525e16e88e1e77a6a028491d6e5df12569c71ed110cfc84a0288687de9426fe91d914cb89023a09bb384542a1ce048c52b01b83d52a7fe4a80fa54f7c376b14940ebae852a14ae9c82d656c1c97342df0fe80dde154f182dc59f8e7e366f050c468751ddd13c3012ed3018e46282e3cbfa4d693351a66b948417a58840df695e302067470badd8a323ef901a3544807460179c72dbcfeb3a0289d1711db72715e5d008a94e7f85d8ba3b0a57e8e09e1b63f3520201c4103263ba25dfeb6e386dd18036aeb0eba734c60f12054e38441e3367563750edbb5ac3a3ef1f98524a22f22b40a8f23293209f1d180b26a0a7f86d8fd14ffe8d018141afb6e993012e69f7b187f447708b99b6d9a012e07378a6787a00ee313b5749e456673b509722bb14d6d3f67bad32e6ff94b4d2c6f8aa63aad158f9f7520bdfa2fb0c570f67f93b63b9e64d3fb613a4369ff0c028ce7e7f1b8599f06a01c5f062e30ddcfb9663860007493225adabcdfd5c7957811b818d1d03c35168f4a9cf4093ebe2fd783a4db1c5971ad9df0eeddd96b3c8918bc1a453c38df5a485f45ed0daa370971137543ff5150202132c395cae199b90aa43f45da951a5d99c2e048016eb08749fd00a3ea0706e90e913cb207a4929437a1991210e23aad0f42b4a27006fb3d369e7985bfd56d5cf4e5f73daf66448724b7c331b00042d169450f6a26a1e278f25579d0224ce716b8eb7cdc176a3a042eefc290f1a2c591de8a24da2cc36db362f42a85df3b56ddcd72061cdca7b1b6eb59a32aa7015544d108bdc84e74603c760a8fe65ec7a0c0a93e7711ad9f788a19e34fed5c08ff5b74ba26f400000000000002a04a6d790c88780e1281d4a68356f211300a6e3f1bde92592428f6ce92ffc1b148007fbb213a1cc0a949bf4eb4ae0329812b67a3743de4bafccbe44b91346a12c4f3053d5436eed23bba8bee22a0ffe400bf349a431a104b4a0758e0229f8b51f02ecfaaa6a215f41700ca5a142261bf65b4340743e99831deaf6e660307576e849fa304633777584bd59346d6bca5b83175ed1d40eee443ed3432b23ca05bff4d5cb9948f195119b000000000000000283cea04c5c2bc543f2d18ecb72639163322aacec29386e696b019967754bedc1e226a370858f403cc952f9451a6ad8b89b9492fb0ae83f0d1811b2b99531619fdd7f302320e4d18bfdd2c6f70067f319d61bc89c553d59222c97a8c6667edd191f89195a68115b09482093ad2de382ff1ca1d24a2d7e8127ef2070502abe8bd1404fa4dfe6fe3868d422b9321977b1d820000000000000002 -- End DBC -- + +>> diff --git a/src/builder.rs b/src/builder.rs index ad73acc..6878b34 100644 --- a/src/builder.rs +++ b/src/builder.rs @@ -1,4 +1,4 @@ -use blsttc::{Fr, IntoFr, PublicKeySet, SecretKeyShare, Signature, SignatureShare}; +use blsttc::{PublicKeySet, SignatureShare}; use std::collections::{BTreeMap, BTreeSet, HashMap, HashSet}; use std::iter::FromIterator; @@ -6,7 +6,7 @@ use curve25519_dalek_ng::scalar::Scalar; use crate::{ Amount, AmountSecrets, Dbc, DbcContent, Error, NodeSignature, PublicKey, ReissueRequest, - ReissueShare, ReissueTransaction, Result, SpendKey, + ReissueShare, ReissueTransaction, Result, SpendKey, SpentProof, SpentProofShare, }; ///! Unblinded data for creating sn_dbc::DbcContent @@ -96,117 +96,72 @@ impl TransactionBuilder { } /// Builds a ReissueRequest from a ReissueTransaction and -/// any number of (input) DBC hashes with associated ownership share(s). -#[derive(Debug, Default)] +/// any number of (input) DBC spent proof shares. +#[derive(Debug)] pub struct ReissueRequestBuilder { - pub reissue_transaction: Option, - #[allow(clippy::type_complexity)] - pub signers_by_dbc: HashMap>>, + pub reissue_transaction: ReissueTransaction, + pub spent_proof_shares: BTreeMap>, } impl ReissueRequestBuilder { /// Create a new ReissueRequestBuilder from a ReissueTransaction pub fn new(reissue_transaction: ReissueTransaction) -> Self { Self { - reissue_transaction: Some(reissue_transaction), - signers_by_dbc: Default::default(), + reissue_transaction, + spent_proof_shares: Default::default(), } } - /// Set the reissue_transaction - pub fn set_reissue_transaction(mut self, reissue_transaction: ReissueTransaction) -> Self { - self.reissue_transaction = Some(reissue_transaction); - self - } - - /// Add a single signer share for a DBC hash - pub fn add_dbc_signer( - mut self, - dbc_key: SpendKey, - public_key_set: PublicKeySet, - secret_key_share: (FR, SecretKeyShare), - ) -> Self { - self.signers_by_dbc - .entry(dbc_key) - .or_default() - .entry(public_key_set) - .or_default() - .insert(secret_key_share.0.into_fr(), secret_key_share.1); - self - } + /// Add a SpentProofShare for the given spend_key + pub fn add_spent_proof_share(mut self, spend_key: SpendKey, share: SpentProofShare) -> Self { + let shares = self.spent_proof_shares.entry(spend_key).or_default(); + shares.insert(share); - /// Add a list of signer shares for a DBC hash - pub fn add_dbc_signers( - mut self, - dbc_key: SpendKey, - public_key_set: PublicKeySet, - secret_key_shares: Vec<(FR, SecretKeyShare)>, - ) -> Self { - let dbc_owners = self.signers_by_dbc.entry(dbc_key).or_default(); - for (idx, secret_key_share) in secret_key_shares.into_iter() { - dbc_owners - .entry(public_key_set.clone()) - .or_default() - .insert(idx.into_fr(), secret_key_share); - } self } - pub fn num_signers_by_dbc(&self, dbc_key: SpendKey) -> usize { - self.signers_by_dbc - .get(&dbc_key) - .map(BTreeMap::len) - .unwrap_or(0) - } - - pub fn get_signers( - &self, - dbc_key: SpendKey, - ) -> Option<&BTreeMap>> { - self.signers_by_dbc.get(&dbc_key) - } + pub fn build(&self) -> Result { + let spent_proofs: BTreeMap = self + .spent_proof_shares + .iter() + .map(|(spend_key, shares)| { + let any_share = shares + .iter() + .next() + .ok_or(Error::ReissueRequestMissingSpentProofShare(*spend_key))?; - /// Aggregates SecretKeyShares for all DBC owners in a ReissueTransaction - /// in order to combine signature shares into Signatures, thereby - /// creating the ownership proofs necessary to construct - /// a ReissueRequest. - pub fn build(self) -> Result { - let mut input_ownership_proofs: HashMap = Default::default(); - let transaction = match self.reissue_transaction { - Some(tx) => tx, - None => return Err(Error::MissingReissueTransaction), - }; + if shares + .iter() + .map(SpentProofShare::spentbook_pks) + .any(|pks| pks != any_share.spentbook_pks()) + { + return Err(Error::ReissueRequestPublicKeySetMismatch); + } - for dbc in transaction.inputs.iter() { - let signers = self - .signers_by_dbc - .get(&dbc.spend_key()) - .ok_or(Error::MissingInputOwnerProof)?; + let spend_sig = any_share.spend_sig.clone(); + let spentbook_pub_key = any_share.spentbook_public_key(); + let spentbook_sig = any_share.spentbook_pks.combine_signatures( + shares + .iter() + .map(SpentProofShare::spentbook_sig_share) + .map(NodeSignature::threshold_crypto), + )?; - if signers.len() != 1 { - return Err(Error::ReissueRequestPublicKeySetMismatch); - } - let (owner_pks, secret_shares) = signers - .iter() - .next() - .ok_or(Error::ReissueRequestPublicKeySetMismatch)?; + let spent_proof = SpentProof { + spend_sig, + spentbook_pub_key, + spentbook_sig, + }; - let sig_shares: BTreeMap = secret_shares - .iter() - .map(|(idx, secret_key_share)| { - let sks = secret_key_share.derive_child(&dbc.spend_key_index()); - let sig_share = sks.sign(transaction.blinded().hash()); - (*idx, sig_share) - }) - .collect(); + Ok((*spend_key, spent_proof)) + }) + .collect::>()?; - let signature = owner_pks.combine_signatures(sig_shares)?; - input_ownership_proofs.insert(dbc.spend_key(), signature); - } + let transaction = self.reissue_transaction.clone(); let rr = ReissueRequest { transaction, - input_ownership_proofs, + spent_proofs, }; Ok(rr) } diff --git a/src/dbc.rs b/src/dbc.rs index 2b7639a..dd519d3 100644 --- a/src/dbc.rs +++ b/src/dbc.rs @@ -88,8 +88,8 @@ mod tests { use crate::tests::{NonZeroTinyInt, TinyInt}; use crate::{ - Amount, DbcBuilder, DbcHelper, Hash, KeyManager, Mint, ReissueRequest, - ReissueRequestBuilder, SimpleKeyManager, SimpleSigner, SimpleSpendBook, + Amount, DbcBuilder, DbcHelper, Hash, KeyManager, MintNode, ReissueRequest, + ReissueRequestBuilder, SimpleKeyManager, SimpleSigner, SpentProof, SpentProofShare, }; fn divide(amount: Amount, n_ways: u8) -> impl Iterator { @@ -106,8 +106,9 @@ mod tests { dbc_owner: &bls_dkg::outcome::Outcome, dbc: Dbc, n_ways: u8, - output_owner: &blsttc::PublicKeySet, - ) -> Result { + output_owner: PublicKey, + spentbook_node: &MintNode, + ) -> Result { let amount_secrets = DbcHelper::decrypt_amount_secrets(dbc_owner, &dbc.content)?; let reissue_tx = crate::TransactionBuilder::default() @@ -115,16 +116,33 @@ mod tests { .add_outputs( divide(amount_secrets.amount, n_ways).map(|amount| crate::Output { amount, - owner: output_owner.public_key(), + owner: output_owner, }), ) .build()?; + let tx_hash = reissue_tx.blinded().hash(); + + let spend_sig = dbc_owner.public_key_set.combine_signatures([( + dbc_owner.index, + dbc_owner + .secret_key_share + .derive_child(&dbc.spend_key_index()) + .sign(tx_hash), + )])?; + let spentbook_pks = spentbook_node.key_manager.public_key_set()?; + let spentbook_sig_share = spentbook_node + .key_manager + .sign(&SpentProof::proof_msg(&tx_hash, &spend_sig))?; + let rr = ReissueRequestBuilder::new(reissue_tx) - .add_dbc_signer( + .add_spent_proof_share( dbc.spend_key(), - dbc_owner.public_key_set.clone(), - (dbc_owner.index, dbc_owner.secret_key_share.clone()), + SpentProofShare { + spend_sig, + spentbook_pks, + spentbook_sig_share, + }, ) .build()?; @@ -185,7 +203,7 @@ mod tests { SimpleSigner::from(genesis_owner.clone()), genesis_owner.public_key_set.public_key(), ); - let mut genesis_node = Mint::new(key_manager, SimpleSpendBook::new()); + let mut genesis_node = MintNode::new(key_manager); let genesis = genesis_node.issue_genesis_dbc(amount).unwrap(); @@ -208,15 +226,11 @@ mod tests { &genesis_owner, genesis_dbc, n_inputs.coerce(), - &input_owner.public_key_set, + input_owner.public_key_set.public_key(), + &genesis_node, )?; - let split_reissue_share = genesis_node - .reissue( - reissue_request.clone(), - reissue_request.transaction.blinded().inputs, - ) - .unwrap(); + let split_reissue_share = genesis_node.reissue(reissue_request.clone()).unwrap(); let mut dbc_builder = DbcBuilder::new(reissue_request.transaction); dbc_builder = dbc_builder.add_reissue_share(split_reissue_share); @@ -237,21 +251,35 @@ mod tests { }) .build()?; + let tx_blinded = reissue_tx.blinded(); + let mut rr_builder = ReissueRequestBuilder::new(reissue_tx.clone()); for input in reissue_tx.inputs.iter() { - rr_builder = rr_builder.add_dbc_signer( + let spend_sig = input_owner.public_key_set.combine_signatures([( + input_owner.index, + input_owner + .secret_key_share + .derive_child(&input.spend_key_index()) + .sign(tx_blinded.hash()), + )])?; + let spentbook_pks = genesis_node.key_manager.public_key_set()?; + let spentbook_sig_share = genesis_node + .key_manager + .sign(&SpentProof::proof_msg(&tx_blinded.hash(), &spend_sig))?; + + rr_builder = rr_builder.add_spent_proof_share( input.spend_key(), - input_owner.public_key_set.clone(), - (input_owner.index, input_owner.secret_key_share.clone()), + SpentProofShare { + spend_sig, + spentbook_pks, + spentbook_sig_share, + }, ); } let rr = rr_builder.build()?; - - let reissue_share = genesis_node - .reissue(rr.clone(), rr.transaction.blinded().inputs) - .unwrap(); - assert_eq!(rr.transaction.blinded(), reissue_share.dbc_transaction); + let reissue_share = genesis_node.reissue(rr).unwrap(); + assert_eq!(tx_blinded, reissue_share.dbc_transaction); let (mint_key_set, mint_sig_share) = reissue_share.mint_node_signatures.values().next().unwrap(); @@ -292,8 +320,7 @@ mod tests { .take(n_valid_sigs.coerce()) .map(|in_owner| (*in_owner, (genesis_key, mint_sig.clone()))), ); - let mut repeating_inputs = rr - .transaction + let mut repeating_inputs = reissue_tx .inputs .iter() .cycle() diff --git a/src/error.rs b/src/error.rs index e6aaf76..2c8387c 100644 --- a/src/error.rs +++ b/src/error.rs @@ -5,10 +5,11 @@ // under the GPL Licence is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY // KIND, either express or implied. Please review the Licences for the specific language governing // permissions and limitations relating to use of the SAFE Network Software. -use std::collections::BTreeMap; use std::io; use thiserror::Error; +use crate::SpendKey; + /// Specialisation of `std::Result`. pub type Result = std::result::Result; @@ -19,12 +20,8 @@ pub type Result = std::result::Result; pub enum Error { #[error("An error occured when signing {0}")] Signing(String), - #[error("Attempted an invalid operation {0}")] - InvalidOperation(String), #[error("This input has a signature, but it doesn't appear in the transaction")] UnknownInput, - #[error("Filtered input doesn't appear in the transaction")] - FilteredInputNotPresent, #[error("Failed signature check.")] FailedSignature, #[error("Unrecognised authority.")] @@ -33,21 +30,12 @@ pub enum Error { MissingReissueTransaction, #[error("At least one transaction input is missing a signature.")] MissingSignatureForInput, - #[error("At least one input is missing an ownership proof")] - MissingInputOwnerProof, + #[error("At least one input is missing a spent proof for {0:?}")] + MissingSpentProof(SpendKey), + #[error("Invalid SpentProof Signature for {0:?}")] + InvalidSpentProofSignature(SpendKey), #[error("Mint request doesn't balance out sum(input) == sum(output)")] DbcReissueRequestDoesNotBalance, - #[error("Failed to unblind an input DBC")] - FailedUnblinding, - #[error("DBC already spent in transaction: {transaction:?}")] - DbcAlreadySpent { - transaction: crate::DbcTransaction, - transaction_sigs: BTreeMap, - }, - #[error("Genesis Input has already been spent in a different transaction")] - GenesisInputAlreadySpent, - #[error("This node is not a genesis node")] - NotGenesisNode, #[error("The DBC transaction must have at least one input")] TransactionMustHaveAnInput, #[error("Dbc Content is not a member of transaction outputs")] @@ -57,6 +45,8 @@ pub enum Error { #[error("The PublicKeySet differs between ReissueRequest entries")] ReissueRequestPublicKeySetMismatch, + #[error("We need at least one spent proof share for {0:?} to build a SpentProof")] + ReissueRequestMissingSpentProofShare(SpendKey), #[error("The PublicKeySet differs between ReissueShare entries")] ReissueSharePublicKeySetMismatch, @@ -94,8 +84,6 @@ pub enum Error { /// JSON serialisation error. #[error("JSON serialisation error: {0}")] JsonSerialisation(#[from] serde_json::Error), - #[error("SpendBook error {0}")] - SpendBook(String), #[error("Infallible. Can never fail")] Infallible(#[from] std::convert::Infallible), diff --git a/src/lib.rs b/src/lib.rs index ebfd7a5..401c026 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -17,7 +17,7 @@ mod dbc_transaction; mod error; mod key_manager; mod mint; -mod spend_book; +mod spent_proof; pub use crate::{ builder::{DbcBuilder, Output, ReissueRequestBuilder, TransactionBuilder}, @@ -30,10 +30,10 @@ pub use crate::{ SimpleSigner, }, mint::{ - genesis_dbc_input, GenesisDbcShare, Mint, MintNodeSignatures, ReissueRequest, ReissueShare, - ReissueTransaction, + genesis_dbc_input, GenesisDbcShare, MintNode, MintNodeSignatures, ReissueRequest, + ReissueShare, ReissueTransaction, }, - spend_book::{SimpleSpendBook, SpendBook, SpendKey}, + spent_proof::{SpendKey, SpentProof, SpentProofShare}, }; #[derive(Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord, Serialize, Deserialize)] diff --git a/src/mint.rs b/src/mint.rs index 5ca978b..099b2f3 100644 --- a/src/mint.rs +++ b/src/mint.rs @@ -15,12 +15,12 @@ use crate::{ Amount, Dbc, DbcContent, DbcTransaction, Error, KeyManager, NodeSignature, PublicKey, - PublicKeySet, Result, SpendBook, SpendKey, + PublicKeySet, Result, SpendKey, SpentProof, }; use curve25519_dalek_ng::ristretto::RistrettoPoint; use serde::{Deserialize, Serialize}; use std::{ - collections::{BTreeMap, BTreeSet, HashMap, HashSet}, + collections::{BTreeMap, BTreeSet, HashSet}, iter::FromIterator, }; @@ -131,8 +131,7 @@ impl ReissueTransaction { #[derive(Eq, PartialEq, Debug, Clone, Deserialize, Serialize)] pub struct ReissueRequest { pub transaction: ReissueTransaction, - // Signatures from the owners of each input, signing `self.transaction.blinded().hash()` - pub input_ownership_proofs: HashMap, + pub spent_proofs: BTreeMap, } #[derive(Eq, PartialEq, Debug, Clone, Deserialize, Serialize)] @@ -142,21 +141,16 @@ pub struct ReissueShare { } #[derive(Debug, Clone, Deserialize, Serialize)] -pub struct Mint +pub struct MintNode where K: KeyManager, - S: SpendBook, { pub(crate) key_manager: K, - pub spendbook: S, } -impl Mint { - pub fn new(key_manager: K, spendbook: S) -> Self { - Self { - key_manager, - spendbook, - } +impl MintNode { + pub fn new(key_manager: K) -> Self { + Self { key_manager } } pub fn issue_genesis_dbc(&mut self, amount: Amount) -> Result { @@ -175,18 +169,6 @@ impl Mint { outputs: BTreeSet::from_iter([dbc_content.owner]), }; - match self - .spendbook - .lookup(&genesis_dbc_input()) - .map_err(|e| Error::SpendBook(e.to_string()))? - { - Some(tx) if tx != &transaction => return Err(Error::GenesisInputAlreadySpent), - _ => (), - } - - self.spendbook - .log(genesis_dbc_input(), transaction.clone()) - .map_err(|e| Error::SpendBook(e.to_string()))?; let transaction_sig = self .key_manager .sign(&transaction.hash()) @@ -203,70 +185,25 @@ impl Mint { }) } - pub fn is_spent(&self, spend_key: SpendKey) -> Result { - Ok(self - .spendbook - .lookup(&spend_key) - .map_err(|e| Error::SpendBook(e.to_string()))? - .is_some()) - } - pub fn key_manager(&self) -> &K { &self.key_manager } - pub fn reissue( - &mut self, - reissue_req: ReissueRequest, - inputs_belonging_to_mint: BTreeSet, - ) -> Result { + pub fn reissue(&mut self, reissue_req: ReissueRequest) -> Result { reissue_req.transaction.validate(self.key_manager())?; let transaction = reissue_req.transaction.blinded(); let transaction_hash = transaction.hash(); - for input_dbc in reissue_req.transaction.inputs.iter() { - let input_spend_key = input_dbc.spend_key(); - match reissue_req.input_ownership_proofs.get(&input_spend_key) { - Some(sig) if input_spend_key.0.verify(sig, &transaction_hash) => (), - Some(_) => return Err(Error::FailedSignature), - None => return Err(Error::MissingInputOwnerProof), - } - } - - if !inputs_belonging_to_mint.is_subset(&transaction.inputs) { - return Err(Error::FilteredInputNotPresent); - } - // Validate that each input has not yet been spent. - for input in inputs_belonging_to_mint.iter() { - if let Some(transaction) = self - .spendbook - .lookup(input) - .map_err(|e| Error::SpendBook(e.to_string()))? - .cloned() - { - // This input has already been spent, return the spend transaction to the user - let transaction_sigs = self.sign_transaction(&transaction)?; - return Err(Error::DbcAlreadySpent { - transaction, - transaction_sigs, - }); + for input in reissue_req.transaction.inputs.iter() { + match reissue_req.spent_proofs.get(&input.spend_key()) { + Some(proof) => proof.validate(input, transaction_hash, self.key_manager())?, + None => return Err(Error::MissingSpentProof(input.spend_key())), } } let transaction_sigs = self.sign_transaction(&transaction)?; - for input in reissue_req - .transaction - .inputs - .iter() - .filter(|&i| inputs_belonging_to_mint.contains(&i.spend_key())) - { - self.spendbook - .log(input.spend_key(), transaction.clone()) - .map_err(|e| Error::SpendBook(e.to_string()))?; - } - let reissue_share = ReissueShare { dbc_transaction: transaction, mint_node_signatures: transaction_sigs, @@ -293,16 +230,6 @@ impl Mint { ))), )) } - - // Used in testing / benchmarking - pub fn snapshot_spendbook(&self) -> S { - self.spendbook.clone() - } - - // Used in testing / benchmarking - pub fn reset_spendbook(&mut self, spendbook: S) { - self.spendbook = spendbook - } } #[cfg(test)] @@ -314,7 +241,7 @@ mod tests { use crate::{ tests::{TinyInt, TinyVec}, DbcBuilder, DbcHelper, ReissueRequestBuilder, SimpleKeyManager, SimpleSigner, - SimpleSpendBook, + SpentProofShare, }; #[quickcheck] @@ -326,7 +253,7 @@ mod tests { SimpleSigner::from(genesis_owner.clone()), genesis_owner.public_key_set.public_key(), ); - let mut genesis_node = Mint::new(key_manager, SimpleSpendBook::new()); + let mut genesis_node = MintNode::new(key_manager); let genesis = genesis_node.issue_genesis_dbc(1000).unwrap(); @@ -364,7 +291,7 @@ mod tests { let genesis_key = genesis_owner.public_key_set.public_key(); let key_manager = SimpleKeyManager::new(SimpleSigner::from(genesis_owner.clone()), genesis_key); - let mut genesis_node = Mint::new(key_manager.clone(), SimpleSpendBook::new()); + let mut genesis_node = MintNode::new(key_manager.clone()); let genesis = genesis_node.issue_genesis_dbc(output_amount)?; let genesis_sig = genesis @@ -379,7 +306,6 @@ mod tests { (genesis_key, genesis_sig), )]), }; - let gen_dbc_spend_key = genesis_dbc.spend_key(); let genesis_amount_secrets = DbcHelper::decrypt_amount_secrets(&genesis_owner, &genesis_dbc.content)?; @@ -388,23 +314,38 @@ mod tests { let output_owner_pk = output_owner.public_key_set.public_key(); let reissue_tx = crate::TransactionBuilder::default() - .add_input(genesis_dbc, genesis_amount_secrets) + .add_input(genesis_dbc.clone(), genesis_amount_secrets) .add_outputs(output_amounts.iter().map(|a| crate::Output { amount: *a, owner: output_owner_pk, })) .build()?; + let tx_hash = reissue_tx.blinded().hash(); + + let spend_sig = genesis_owner.public_key_set.combine_signatures([( + genesis_owner.index, + genesis_owner + .secret_key_share + .derive_child(&genesis_dbc.spend_key_index()) + .sign(tx_hash), + )])?; + let spentbook_pks = genesis_node.key_manager.public_key_set()?; + let spentbook_sig_share = genesis_node + .key_manager + .sign(&SpentProof::proof_msg(&tx_hash, &spend_sig))?; let rr = ReissueRequestBuilder::new(reissue_tx.clone()) - .add_dbc_signer( - gen_dbc_spend_key, - genesis_owner.public_key_set, - (genesis_owner.index, genesis_owner.secret_key_share), + .add_spent_proof_share( + genesis_dbc.spend_key(), + SpentProofShare { + spend_sig, + spentbook_pks, + spentbook_sig_share, + }, ) .build()?; - let reissue_share = match genesis_node.reissue(rr, BTreeSet::from_iter([gen_dbc_spend_key])) - { + let reissue_share = match genesis_node.reissue(rr) { Ok(rs) => { // Verify that at least one output was present. assert_ne!(n_outputs, 0); @@ -440,79 +381,6 @@ mod tests { Ok(()) } - #[test] - fn test_double_spend_protection() -> Result<()> { - let genesis_owner = crate::bls_dkg_id(); - let genesis_key = genesis_owner.public_key_set.public_key(); - let key_manager = - SimpleKeyManager::new(SimpleSigner::from(genesis_owner.clone()), genesis_key); - let mut genesis_node = Mint::new(key_manager, SimpleSpendBook::new()); - - let genesis = genesis_node.issue_genesis_dbc(1000)?; - let genesis_sig = genesis - .public_key_set - .combine_signatures(vec![genesis.transaction_sig.threshold_crypto()])?; - - let genesis_dbc = Dbc { - content: genesis.dbc_content, - transaction: genesis.transaction, - transaction_sigs: BTreeMap::from_iter([( - genesis_dbc_input(), - (genesis_key, genesis_sig), - )]), - }; - let gen_dbc_spend_key = genesis_dbc.spend_key(); - - let genesis_amount_secrets = - DbcHelper::decrypt_amount_secrets(&genesis_owner, &genesis_dbc.content)?; - - let output_owner = crate::bls_dkg_id(); - let reissue_tx = crate::TransactionBuilder::default() - .add_input(genesis_dbc.clone(), genesis_amount_secrets) - .add_output(crate::Output { - amount: 1000, - owner: output_owner.public_key_set.public_key(), - }) - .build()?; - - let rr = ReissueRequestBuilder::new(reissue_tx) - .add_dbc_signer( - gen_dbc_spend_key, - genesis_owner.public_key_set.clone(), - (genesis_owner.index, genesis_owner.secret_key_share.clone()), - ) - .build()?; - - let reissue_share = genesis_node.reissue(rr, BTreeSet::from_iter([gen_dbc_spend_key]))?; - let t = reissue_share.dbc_transaction; - let s = reissue_share.mint_node_signatures; - - let double_spend_reissue_tx = crate::TransactionBuilder::default() - .add_input(genesis_dbc, genesis_amount_secrets) - .add_output(crate::Output { - amount: 1000, - owner: output_owner.public_key_set.public_key(), - }) - .build()?; - - let double_spend_rr = ReissueRequestBuilder::new(double_spend_reissue_tx) - .add_dbc_signer( - gen_dbc_spend_key, - genesis_owner.public_key_set, - (genesis_owner.index, genesis_owner.secret_key_share), - ) - .build()?; - - let res = genesis_node.reissue(double_spend_rr, BTreeSet::from_iter([gen_dbc_spend_key])); - - assert!(matches!( - res, - Err(Error::DbcAlreadySpent { transaction, transaction_sigs }) if transaction == t && transaction_sigs == s - )); - - Ok(()) - } - #[quickcheck] fn prop_dbc_transaction_many_to_many( // the amount of each input transaction @@ -521,10 +389,10 @@ mod tests { output_amounts: TinyVec, // Controls which output dbc's will receive extra parent hashes extra_output_parents: TinyVec, - // Include a valid ownership proof for the following inputs - input_owner_proofs: TinyVec, - // Include an invalid ownership proof for the following inputs - invalid_input_owner_proofs: TinyVec, + // Include a valid SpendProof for the following inputs + valid_spent_proofs: TinyVec, + // Include an invalid SpendProofs for the following inputs + invalid_spent_proofs: TinyVec, ) -> Result<(), Error> { let input_amounts = Vec::from_iter(input_amounts.into_iter().map(TinyInt::coerce::)); @@ -538,11 +406,11 @@ mod tests { .map(TinyInt::coerce::), ); - let inputs_to_create_owner_proofs = - BTreeSet::from_iter(input_owner_proofs.into_iter().map(TinyInt::coerce::)); + let valid_spent_proofs = + BTreeSet::from_iter(valid_spent_proofs.into_iter().map(TinyInt::coerce::)); - let inputs_to_create_invalid_owner_proofs = BTreeSet::from_iter( - invalid_input_owner_proofs + let invalid_spent_proofs = BTreeSet::from_iter( + invalid_spent_proofs .into_iter() .map(TinyInt::coerce::), ); @@ -553,7 +421,7 @@ mod tests { SimpleSigner::from(genesis_owner.clone()), genesis_owner.public_key_set.public_key(), ); - let mut genesis_node = Mint::new(key_manager, SimpleSpendBook::new()); + let mut genesis_node = MintNode::new(key_manager); let genesis_amount: Amount = input_amounts.iter().sum(); let genesis = genesis_node.issue_genesis_dbc(genesis_amount)?; @@ -571,7 +439,6 @@ mod tests { (genesis_key, genesis_sig), )]), }; - let gen_dbc_spend_key = genesis_dbc.spend_key(); let genesis_amount_secrets = DbcHelper::decrypt_amount_secrets(&genesis_owner, &genesis_dbc.content)?; @@ -582,7 +449,7 @@ mod tests { })); let reissue_tx = crate::TransactionBuilder::default() - .add_input(genesis_dbc, genesis_amount_secrets) + .add_input(genesis_dbc.clone(), genesis_amount_secrets) .add_outputs( owner_amounts_and_keys .clone() @@ -591,28 +458,43 @@ mod tests { ) .build()?; + let spend_sig = genesis_owner.public_key_set.combine_signatures(vec![( + genesis_owner.index, + genesis_owner + .secret_key_share + .derive_child(&genesis_dbc.spend_key_index()) + .sign(reissue_tx.blinded().hash()), + )])?; + let spentbook_pks = genesis_node.key_manager.public_key_set()?; + let spentbook_sig_share = genesis_node.key_manager.sign(&SpentProof::proof_msg( + &reissue_tx.blinded().hash(), + &spend_sig, + ))?; + let rr1 = ReissueRequestBuilder::new(reissue_tx) - .add_dbc_signer( - gen_dbc_spend_key, - genesis_owner.public_key_set, - (genesis_owner.index, genesis_owner.secret_key_share), + .add_spent_proof_share( + genesis_dbc.spend_key(), + SpentProofShare { + spend_sig, + spentbook_pks, + spentbook_sig_share, + }, ) .build()?; - let reissue_share = - match genesis_node.reissue(rr1.clone(), BTreeSet::from_iter([gen_dbc_spend_key])) { - Ok(rs) => { - // Verify that at least one input (output in this tx) was present. - assert!(!input_amounts.is_empty()); - rs - } - Err(Error::DbcReissueRequestDoesNotBalance) => { - // Verify that no inputs (outputs in this tx) were present and we got correct validation error. - assert!(input_amounts.is_empty()); - return Ok(()); - } - Err(e) => return Err(e), - }; + let reissue_share = match genesis_node.reissue(rr1.clone()) { + Ok(rs) => { + // Verify that at least one input (output in this tx) was present. + assert!(!input_amounts.is_empty()); + rs + } + Err(Error::DbcReissueRequestDoesNotBalance) => { + // Verify that no inputs (outputs in this tx) were present and we got correct validation error. + assert!(input_amounts.is_empty()); + return Ok(()); + } + Err(e) => return Err(e), + }; // Aggregate ReissueShare to build output DBCs let mut dbc_builder = DbcBuilder::new(rr1.transaction); @@ -657,44 +539,6 @@ mod tests { reissue_tx.outputs.insert(out_dbc_content); } - let dbcs_with_valid_ownership_proofs = inputs_to_create_owner_proofs - .into_iter() - .filter_map(|input_num| reissue_tx.inputs.iter().nth(input_num)) - .map(|dbc| { - let (_, owner) = &owner_amounts_and_keys[&dbc.owner()]; - let sig_share = owner - .secret_key_share - .derive_child(&dbc.spend_key_index()) - .sign(&reissue_tx.blinded().hash()); - let owner_key_set = &owner.public_key_set; - let sig = owner_key_set.combine_signatures(vec![(owner.index, &sig_share)])?; - Ok((dbc.spend_key(), sig)) - }) - .collect::, Error>>()?; - - let dbcs_with_invalid_ownership_proofs = inputs_to_create_invalid_owner_proofs - .into_iter() - .filter_map(|input_num| reissue_tx.inputs.iter().nth(input_num)) - .map(|dbc| { - let random_owner = crate::bls_dkg_id(); - let sig_share = random_owner - .secret_key_share - .sign(&reissue_tx.blinded().hash()); - let owner_key_set = random_owner.public_key_set; - let sig = - owner_key_set.combine_signatures(vec![(random_owner.index, &sig_share)])?; - - Ok((dbc.spend_key(), sig)) - }) - .collect::, Error>>()?; - - let input_ownership_proofs = HashMap::from_iter( - dbcs_with_valid_ownership_proofs - .clone() - .into_iter() - .chain(dbcs_with_invalid_ownership_proofs.clone().into_iter()), - ); - let dbc_output_amounts = reissue_tx .outputs .iter() @@ -702,49 +546,95 @@ mod tests { .collect::, _>>()?; let output_total_amount: Amount = dbc_output_amounts.iter().sum(); - let rr2 = ReissueRequest { - transaction: reissue_tx, - input_ownership_proofs, - }; + let mut rr2_builder = ReissueRequestBuilder::new(reissue_tx.clone()); - let many_to_many_result = genesis_node.reissue( - rr2.clone(), - BTreeSet::from_iter(rr2.transaction.blinded().inputs), - ); + for (_, in_dbc) in reissue_tx + .inputs + .iter() + .enumerate() + .filter(|(i, _)| valid_spent_proofs.contains(i)) + { + let (_, input_owner) = &owner_amounts_and_keys[&in_dbc.owner()]; + + let spend_sig = input_owner.public_key_set.combine_signatures([( + input_owner.index, + input_owner + .secret_key_share + .derive_child(&in_dbc.spend_key_index()) + .sign(reissue_tx.blinded().hash()), + )])?; + let spentbook_pks = genesis_node.key_manager.public_key_set()?; + let spentbook_sig_share = genesis_node.key_manager.sign(&SpentProof::proof_msg( + &reissue_tx.blinded().hash(), + &spend_sig, + ))?; + + rr2_builder = rr2_builder.add_spent_proof_share( + in_dbc.spend_key(), + SpentProofShare { + spend_sig, + spentbook_pks, + spentbook_sig_share, + }, + ); + } + + for (i, in_dbc) in reissue_tx + .inputs + .iter() + .enumerate() + .filter(|(i, _)| invalid_spent_proofs.contains(i)) + { + let input_owner = if i % 2 == 0 { + let (_, input_owner) = &owner_amounts_and_keys[&in_dbc.owner()]; + input_owner.clone() + } else { + crate::bls_dkg_id() + }; + + let spend_sig = input_owner.public_key_set.combine_signatures([( + input_owner.index, + input_owner + .secret_key_share + .derive_child(&in_dbc.spend_key_index()) + .sign(reissue_tx.blinded().hash()), + )])?; + + let tx_hash = if i % 2 == 1 { + reissue_tx.blinded().hash() + } else { + crate::Hash([0u8; 32]) + }; + + let spentbook_pks = genesis_node.key_manager.public_key_set()?; + let spentbook_sig_share = genesis_node + .key_manager + .sign(&SpentProof::proof_msg(&tx_hash, &spend_sig))?; + + rr2_builder = rr2_builder.add_spent_proof_share( + in_dbc.spend_key(), + SpentProofShare { + spend_sig, + spentbook_pks, + spentbook_sig_share, + }, + ); + } + + let rr2 = rr2_builder.build()?; + let many_to_many_result = genesis_node.reissue(rr2); match many_to_many_result { Ok(rs) => { assert_eq!(genesis_amount, output_total_amount); assert_eq!(dbcs_with_fuzzed_parents.len(), 0); + assert!(invalid_spent_proofs + .iter() + .all(|i| i >= &reissue_tx.inputs.len())); assert!( - input_amounts.is_empty() - || BTreeSet::from_iter(dbcs_with_invalid_ownership_proofs.keys().copied()) - .intersection(&BTreeSet::from_iter(owner_amounts_and_keys.keys().map( - |pk| { - rr2.transaction - .inputs - .iter() - .find(|dbc| dbc.owner() == *pk) - .unwrap() - .spend_key() - } - ))) - .next() - .is_none() + BTreeSet::from_iter(0..reissue_tx.inputs.len()).is_subset(&valid_spent_proofs) ); - assert!(BTreeSet::from_iter(owner_amounts_and_keys.keys().map(|pk| { - rr2.transaction - .inputs - .iter() - .find(|dbc| dbc.owner() == *pk) - .unwrap() - .spend_key() - })) - .is_subset(&BTreeSet::from_iter( - dbcs_with_valid_ownership_proofs.keys().copied() - ))); - // The output amounts should correspond to the output_amounts assert_eq!( BTreeSet::from_iter(dbc_output_amounts), @@ -752,7 +642,7 @@ mod tests { ); // Aggregate ReissueShare to build output DBCs - let mut dbc_builder = DbcBuilder::new(rr2.transaction); + let mut dbc_builder = DbcBuilder::new(reissue_tx); dbc_builder = dbc_builder.add_reissue_share(rs); let output_dbcs = dbc_builder.build()?; @@ -787,26 +677,21 @@ mod tests { Err(Error::DbcContentParentsDifferentFromTransactionInputs) => { assert_ne!(dbcs_with_fuzzed_parents.len(), 0) } - Err(Error::MissingInputOwnerProof) => { - assert!( - !BTreeSet::from_iter(owner_amounts_and_keys.keys().map(|pk| { - rr2.transaction - .inputs - .iter() - .find(|dbc| dbc.owner() == *pk) - .unwrap() - .spend_key() - })) - .is_subset(&BTreeSet::from_iter( - dbcs_with_valid_ownership_proofs.keys().copied() - )) - ); - } - Err(Error::FailedSignature) => { - assert_ne!(dbcs_with_invalid_ownership_proofs.len(), 0); + Err(Error::MissingSpentProof(key)) => { + let idx = reissue_tx + .inputs + .iter() + .position(|i| i.spend_key() == key) + .unwrap(); + assert!(!valid_spent_proofs.contains(&idx)); } - Err(Error::FailedUnblinding) => { - assert_ne!(dbcs_with_invalid_ownership_proofs.len(), 0); + Err(Error::InvalidSpentProofSignature(key)) => { + let idx = reissue_tx + .inputs + .iter() + .position(|i| i.spend_key() == key) + .unwrap(); + assert!(invalid_spent_proofs.contains(&idx)); } err => panic!("Unexpected reissue err {:#?}", err), } @@ -833,7 +718,7 @@ mod tests { SimpleSigner::from(genesis_owner.clone()), genesis_owner.public_key_set.public_key(), ); - let mut genesis_node = Mint::new(key_manager, SimpleSpendBook::new()); + let mut genesis_node = MintNode::new(key_manager); let input_owner = crate::bls_dkg_id(); let input_content = DbcContent::new( @@ -855,21 +740,18 @@ mod tests { let in_dbc_spend_keys = BTreeSet::from_iter([in_dbc.spend_key()]); - let fraudulant_reissue_result = genesis_node.reissue( - ReissueRequest { - transaction: ReissueTransaction { - inputs: HashSet::from_iter([in_dbc]), - outputs: HashSet::from_iter([DbcContent::new( - in_dbc_spend_keys.clone(), - 100, - crate::bls_dkg_id().public_key_set.public_key(), - DbcContent::random_blinding_factor(), - )?]), - }, - input_ownership_proofs: HashMap::default(), + let fraudulant_reissue_result = genesis_node.reissue(ReissueRequest { + transaction: ReissueTransaction { + inputs: HashSet::from_iter([in_dbc]), + outputs: HashSet::from_iter([DbcContent::new( + in_dbc_spend_keys, + 100, + crate::bls_dkg_id().public_key_set.public_key(), + DbcContent::random_blinding_factor(), + )?]), }, - in_dbc_spend_keys, - ); + spent_proofs: Default::default(), + }); assert!(fraudulant_reissue_result.is_err()); Ok(()) @@ -907,7 +789,7 @@ mod tests { SimpleSigner::from(genesis_owner.clone()), genesis_owner.public_key_set.public_key(), ); - let mut genesis_node = Mint::new(key_manager.clone(), SimpleSpendBook::new()); + let mut genesis_node = MintNode::new(key_manager.clone()); let genesis = genesis_node.issue_genesis_dbc(1000)?; let genesis_sig = genesis @@ -930,7 +812,7 @@ mod tests { let outputs_owner_pk = outputs_owner.public_key_set.public_key(); let output_amount = 1000; - let mut transaction = crate::TransactionBuilder::default() + let mut tx = crate::TransactionBuilder::default() .add_input(genesis_dbc.clone(), genesis_secrets) .add_output(crate::Output { amount: output_amount, @@ -944,7 +826,7 @@ mod tests { // Here we modify the transaction output to have a different committed amount than the secret amount. // The sn_dbc API does not allow this so we manually modify the reissue transaction. - let mut out_dbc_content = std::mem::take(&mut transaction.outputs) + let mut out_dbc_content = std::mem::take(&mut tx.outputs) .into_iter() .next() .expect("We should have a single output"); @@ -963,15 +845,7 @@ mod tests { outputs_owner_pk.encrypt(fudged_amount_secrets.to_bytes().as_slice()); // Add the fudged output back into the reissue transaction. - transaction.outputs.insert(out_dbc_content); - - let rr = ReissueRequestBuilder::new(transaction) - .add_dbc_signer( - genesis_dbc.spend_key(), - genesis_owner.public_key_set, - (genesis_owner.index, genesis_owner.secret_key_share), - ) - .build()?; + tx.outputs.insert(out_dbc_content); // The mint should reissue this without error because the output commitment sum matches the // input commitment sum. However the recipient will be unable to spend it using the received @@ -979,11 +853,32 @@ mod tests { // or guess it. And that's assuming the secret blinding_factor is correct, which it is in this // case, but might not be in the wild. So the output DBC could be considered to be in a // semi-unspendable state. - let reissue_share = - genesis_node.reissue(rr.clone(), BTreeSet::from_iter([genesis_dbc.spend_key()]))?; + let spend_sig = genesis_owner.public_key_set.combine_signatures(vec![( + genesis_owner.index, + genesis_owner + .secret_key_share + .derive_child(&genesis_dbc.spend_key_index()) + .sign(tx.blinded().hash()), + )])?; + let spentbook_pks = genesis_node.key_manager.public_key_set()?; + let spentbook_sig_share = genesis_node + .key_manager + .sign(&SpentProof::proof_msg(&tx.blinded().hash(), &spend_sig))?; + let rr = ReissueRequestBuilder::new(tx.clone()) + .add_spent_proof_share( + genesis_dbc.spend_key(), + SpentProofShare { + spend_sig, + spentbook_pks, + spentbook_sig_share, + }, + ) + .build()?; + + let reissue_share = genesis_node.reissue(rr)?; // Aggregate ReissueShare to build output DBCs - let mut dbc_builder = DbcBuilder::new(rr.transaction); + let mut dbc_builder = DbcBuilder::new(tx); dbc_builder = dbc_builder.add_reissue_share(reissue_share); let output_dbcs = dbc_builder.build()?; @@ -1030,7 +925,7 @@ mod tests { let input_dbc = output_dbc; let input_secrets = DbcHelper::decrypt_amount_secrets(&outputs_owner, &input_dbc.content)?; - let transaction = crate::TransactionBuilder::default() + let tx = crate::TransactionBuilder::default() .add_input(input_dbc.clone(), input_secrets) .add_output(crate::Output { amount: input_secrets.amount, @@ -1038,16 +933,30 @@ mod tests { }) .build()?; - let rr = ReissueRequestBuilder::new(transaction) - .add_dbc_signer( - input_dbc.spend_key(), - outputs_owner.public_key_set.clone(), - (outputs_owner.index, outputs_owner.secret_key_share.clone()), + let spend_sig = genesis_owner.public_key_set.combine_signatures(vec![( + genesis_owner.index, + genesis_owner + .secret_key_share + .derive_child(&genesis_dbc.spend_key_index()) + .sign(tx.blinded().hash()), + )])?; + let spentbook_pks = genesis_node.key_manager.public_key_set()?; + let spentbook_sig_share = genesis_node + .key_manager + .sign(&SpentProof::proof_msg(&tx.blinded().hash(), &spend_sig))?; + let rr = ReissueRequestBuilder::new(tx) + .add_spent_proof_share( + genesis_dbc.spend_key(), + SpentProofShare { + spend_sig, + spentbook_pks, + spentbook_sig_share, + }, ) .build()?; // The mint should give an error on reissue because the sum(inputs) does not equal sum(outputs) - let result = genesis_node.reissue(rr, BTreeSet::from_iter([input_dbc.spend_key()])); + let result = genesis_node.reissue(rr); match result { Err(Error::DbcReissueRequestDoesNotBalance) => {} @@ -1058,7 +967,7 @@ mod tests { // Phase 4. Successful reissue of mis-matched DBC using true committed amount. // ---------- - let transaction = crate::TransactionBuilder::default() + let tx = crate::TransactionBuilder::default() .add_input(input_dbc.clone(), input_secrets) .add_output(crate::Output { amount: output_amount, @@ -1066,16 +975,31 @@ mod tests { }) .build()?; - let rr = ReissueRequestBuilder::new(transaction) - .add_dbc_signer( + let spend_sig = outputs_owner.public_key_set.combine_signatures(vec![( + outputs_owner.index, + outputs_owner + .secret_key_share + .derive_child(&input_dbc.spend_key_index()) + .sign(tx.blinded().hash()), + )])?; + + let spentbook_pks = genesis_node.key_manager.public_key_set()?; + let spentbook_sig_share = genesis_node + .key_manager + .sign(&SpentProof::proof_msg(&tx.blinded().hash(), &spend_sig))?; + let rr = ReissueRequestBuilder::new(tx) + .add_spent_proof_share( input_dbc.spend_key(), - outputs_owner.public_key_set, - (outputs_owner.index, outputs_owner.secret_key_share), + SpentProofShare { + spend_sig, + spentbook_pks, + spentbook_sig_share, + }, ) .build()?; // The mint should reissue without error because the sum(inputs) does equal sum(outputs) - let result = genesis_node.reissue(rr, BTreeSet::from_iter([input_dbc.spend_key()])); + let result = genesis_node.reissue(rr); assert!(result.is_ok()); Ok(()) diff --git a/src/spend_book.rs b/src/spend_book.rs deleted file mode 100644 index 9fc3d0f..0000000 --- a/src/spend_book.rs +++ /dev/null @@ -1,112 +0,0 @@ -// Copyright 2021 MaidSafe.net limited. -// -// This SAFE Network Software is licensed to you under The General Public License (GPL), version 3. -// Unless required by applicable law or agreed to in writing, the SAFE Network Software distributed -// under the GPL Licence is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. Please review the Licences for the specific language governing -// permissions and limitations relating to use of the SAFE Network Software. - -// # SpendBook and Forced One-Time-Keys -// -// The SpendBook logs each spent DBC along with the reissue transaction it was spent in. -// To reissue a DBC, the reissue transaction must be signed with a one-time-key called -// the `Spend Key`. -// -// The Spend Key is calculated from the DBC owner by deriving a child key using the DBC hash -// as the derivation index. -// -// ``` -// spend_key = dbc_owner_key.derive_child(dbc.hash()) -// ``` -// -// The SpendBook is a mapping from a DBC's Spend Key to the reissue transaction that this DBC -// was spent in. -// -// The mint does not have direct control over the dbc's owner and so we can not enforce globally -// unique owners for each DBC that is minted. Instead we enforce globally unique spend keys by -// choosing an unpredictable but deterministic index: the dbc hash. -// Thus, the spend key derivation algorithm gives us a globally unique one-time-key that we -// use to uniquely reference a DBC, as well as giving DBC owners a mechanism to prove ownership -// of the DBC by demonstrating control of the spend key. - -use std::collections::BTreeMap; -use std::{error, fmt}; - -use serde::{Deserialize, Serialize}; - -use crate::{DbcTransaction, PublicKey}; - -#[derive(Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord, Serialize, Deserialize)] -pub struct SpendKey(pub PublicKey); - -// Display Hash value as hex in Debug output. consolidates 36 lines to 3 for pretty output -// and the hex value is the same as sn_dbc_mint display of DBC IDs. -impl fmt::Debug for SpendKey { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_tuple("SpendKey") - .field(&hex::encode(self.0.to_bytes())) - .finish() - } -} - -#[cfg(test)] -use rand::distributions::{Distribution, Standard}; -#[cfg(test)] -use rand::Rng; - -/// used when fuzzing DBC's in testing. -#[cfg(test)] -impl Distribution for Standard { - fn sample(&self, rng: &mut R) -> SpendKey { - SpendKey( - crate::genesis_dbc_input() - .0 - .derive_child(&rng.gen::<[u8; 32]>()), - ) - } -} - -/// The SpendBook logs all spent DBC's. -pub trait SpendBook: fmt::Debug + Clone { - type Error: error::Error; - - fn lookup(&self, spend_key: &SpendKey) -> Result, Self::Error>; - fn log(&mut self, spend_key: SpendKey, transaction: DbcTransaction) -> Result<(), Self::Error>; -} - -#[derive(Debug, Default, Clone, Serialize, Deserialize)] -pub struct SimpleSpendBook { - pub transactions: BTreeMap, -} - -impl SpendBook for SimpleSpendBook { - type Error = std::convert::Infallible; - - fn lookup(&self, spend_key: &SpendKey) -> Result, Self::Error> { - Ok(self.transactions.get(spend_key)) - } - - fn log(&mut self, spend_key: SpendKey, transaction: DbcTransaction) -> Result<(), Self::Error> { - self.transactions.insert(spend_key, transaction); - Ok(()) - } -} - -impl IntoIterator for SimpleSpendBook { - type Item = (SpendKey, DbcTransaction); - type IntoIter = std::collections::btree_map::IntoIter; - - fn into_iter(self) -> Self::IntoIter { - self.transactions.into_iter() - } -} - -impl SimpleSpendBook { - pub fn new() -> Self { - Self::default() - } - - pub fn iter(&self) -> std::collections::btree_map::Iter { - self.transactions.iter() - } -} diff --git a/src/spent_proof.rs b/src/spent_proof.rs new file mode 100644 index 0000000..4783271 --- /dev/null +++ b/src/spent_proof.rs @@ -0,0 +1,100 @@ +use crate::{ + Dbc, Error, Hash, KeyManager, NodeSignature, PublicKey, PublicKeySet, Result, Signature, +}; + +use serde::{Deserialize, Serialize}; + +#[derive(Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord, Serialize, Deserialize)] +pub struct SpendKey(pub PublicKey); + +// Display Hash value as hex in Debug output. consolidates 36 lines to 3 for pretty output +// and the hex value is the same as sn_dbc_mint display of DBC IDs. +impl std::fmt::Debug for SpendKey { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_tuple("SpendKey") + .field(&hex::encode(self.0.to_bytes())) + .finish() + } +} + +#[cfg(test)] +use rand::distributions::{Distribution, Standard}; +#[cfg(test)] +use rand::Rng; + +/// used when fuzzing DBC's in testing. +#[cfg(test)] +impl Distribution for Standard { + fn sample(&self, rng: &mut R) -> SpendKey { + SpendKey( + crate::genesis_dbc_input() + .0 + .derive_child(&rng.gen::<[u8; 32]>()), + ) + } +} + +/// A share of a SpentProof, combine enough of these to form a +/// SpentProof. +#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)] +pub struct SpentProofShare { + /// Signature from dbc.spend_key() over the transaction + pub spend_sig: Signature, + + /// The Spentbook who notarized that this DBC was spent. + pub spentbook_pks: PublicKeySet, + + pub spentbook_sig_share: NodeSignature, +} + +impl SpentProofShare { + pub fn spentbook_sig_share(&self) -> &NodeSignature { + &self.spentbook_sig_share + } + + pub fn spentbook_pks(&self) -> &PublicKeySet { + &self.spentbook_pks + } + + pub fn spentbook_public_key(&self) -> PublicKey { + self.spentbook_pks.public_key() + } +} + +/// SpentProof's are constructed when a DBC is logged to the spentbook. +#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)] +pub struct SpentProof { + /// Signature from dbc.spend_key() over the transaction + pub spend_sig: Signature, + + /// The Spentbook who notarized that this DBC was spent. + pub spentbook_pub_key: PublicKey, + + /// The Spentbook's signature notarizing the DBC was spent. + pub spentbook_sig: Signature, +} + +impl SpentProof { + pub fn validate(&self, dbc: &Dbc, tx: Hash, verifier: &K) -> Result<()> { + if !dbc.spend_key().0.verify(&self.spend_sig, tx) { + return Err(Error::FailedSignature); + } + let msg = Self::proof_msg(&tx, &self.spend_sig); + verifier + .verify(&msg, &self.spentbook_pub_key, &self.spentbook_sig) + .map_err(|_| Error::InvalidSpentProofSignature(dbc.spend_key()))?; + Ok(()) + } + + pub fn proof_msg(tx: &Hash, spend_sig: &Signature) -> Hash { + use tiny_keccak::{Hasher, Sha3}; + let mut sha3 = Sha3::v256(); + + sha3.update(&tx.0); + sha3.update(&spend_sig.to_bytes()); + + let mut hash = [0u8; 32]; + sha3.finalize(&mut hash); + Hash(hash) + } +}