diff --git a/bindings/ergo-lib-wasm/Cargo.toml b/bindings/ergo-lib-wasm/Cargo.toml index 213b3f7fc..95495ac9f 100644 --- a/bindings/ergo-lib-wasm/Cargo.toml +++ b/bindings/ergo-lib-wasm/Cargo.toml @@ -45,4 +45,5 @@ default-features = false features = ["std"] [package.metadata.wasm-pack.profile.release] -wasm-opt = ["-O", "--enable-mutable-globals"] +# wasm-opt = ["-O", "--enable-mutable-globals"] +wasm-opt = false diff --git a/bindings/ergo-lib-wasm/src/ergo_box/box_builder.rs b/bindings/ergo-lib-wasm/src/ergo_box/box_builder.rs index 6cdc32b33..1473f2fbb 100644 --- a/bindings/ergo-lib-wasm/src/ergo_box/box_builder.rs +++ b/bindings/ergo-lib-wasm/src/ergo_box/box_builder.rs @@ -31,8 +31,8 @@ impl ErgoBoxCandidateBuilder { } /// Set minimal value (per byte of the serialized box size) - pub fn set_min_box_value_per_byte(self, new_min_value_per_byte: u32) -> Self { - ErgoBoxCandidateBuilder(self.0.set_min_box_value_per_byte(new_min_value_per_byte)) + pub fn set_min_box_value_per_byte(&mut self, new_min_value_per_byte: u32) { + self.0.set_min_box_value_per_byte(new_min_value_per_byte); } /// Get minimal value (per byte of the serialized box size) @@ -41,8 +41,8 @@ impl ErgoBoxCandidateBuilder { } /// Set new box value - pub fn set_value(self, new_value: BoxValue) -> Self { - ErgoBoxCandidateBuilder(self.0.set_value(new_value.into())) + pub fn set_value(&mut self, new_value: BoxValue) { + self.0.set_value(new_value.into()); } /// Get box value @@ -66,8 +66,9 @@ impl ErgoBoxCandidateBuilder { } /// Set register with a given id (R4-R9) to the given value - pub fn set_register_value(self, register_id: NonMandatoryRegisterId, value: Constant) -> Self { - ErgoBoxCandidateBuilder(self.0.set_register_value(register_id.into(), value.into())) + pub fn set_register_value(&mut self, register_id: NonMandatoryRegisterId, value: &Constant) { + self.0 + .set_register_value(register_id.into(), value.clone().into()); } /// Returns register value for the given register id (R4-R9), or None if the register is empty @@ -79,8 +80,8 @@ impl ErgoBoxCandidateBuilder { } /// Delete register value(make register empty) for the given register id (R4-R9) - pub fn delete_register_value(self, register_id: NonMandatoryRegisterId) -> Self { - ErgoBoxCandidateBuilder(self.0.delete_register_value(®ister_id.into())) + pub fn delete_register_value(&mut self, register_id: NonMandatoryRegisterId) { + self.0.delete_register_value(®ister_id.into()); } /// Build the box candidate diff --git a/bindings/ergo-lib-wasm/src/tx_builder.rs b/bindings/ergo-lib-wasm/src/tx_builder.rs index d92d9d2ec..b6ada9af6 100644 --- a/bindings/ergo-lib-wasm/src/tx_builder.rs +++ b/bindings/ergo-lib-wasm/src/tx_builder.rs @@ -47,8 +47,8 @@ impl TxBuilder { } /// Set transaction's data inputs - pub fn set_data_inputs(self, data_inputs: &DataInputs) -> TxBuilder { - TxBuilder(self.0.set_data_inputs(data_inputs.into())) + pub fn set_data_inputs(&mut self, data_inputs: &DataInputs) { + self.0.set_data_inputs(data_inputs.into()) } /// Build the unsigned transaction diff --git a/bindings/ergo-lib-wasm/tests/test_box_builder.js b/bindings/ergo-lib-wasm/tests/test_box_builder.js new file mode 100644 index 000000000..f03f68a71 --- /dev/null +++ b/bindings/ergo-lib-wasm/tests/test_box_builder.js @@ -0,0 +1,36 @@ +import { expect, assert } from 'chai'; + +import { + Address, Wallet, ErgoBox, ErgoBoxCandidateBuilder, Contract, + ErgoBoxes, ErgoBoxCandidates, + ErgoStateContext, TxBuilder, BoxValue, BoxSelector, SecretKey, TxId, DataInputs, NonMandatoryRegisterId, Constant +} from '../pkg/ergo_lib_wasm'; + +const recipient = Address.from_testnet_str('3WvsT2Gm4EpsM9Pg18PdY6XyhNNMqXDsvJTbbf6ihLvAmSb7u5RN'); +const contract = Contract.pay_to_address(recipient); + +it('ErgoBoxCandidateBuilder test', async () => { + const b = new ErgoBoxCandidateBuilder(BoxValue.from_u32(10000000), contract, 0).build(); + assert(b != null); +}); + +it('ErgoBoxCandidateBuilder set register value test', async () => { + let builder = new ErgoBoxCandidateBuilder(BoxValue.from_u32(10000000), contract, 0); + assert(builder.register_value(NonMandatoryRegisterId.R4) == null); + const c = Constant.from_i32(1); + builder.set_register_value(NonMandatoryRegisterId.R4, c); + assert(builder.register_value(NonMandatoryRegisterId.R4).to_i32() == c.to_i32()); + const b = builder.build(); + assert(b.register_value(NonMandatoryRegisterId.R4).to_i32 = c.to_i32); +}); + +it('ErgoBoxCandidateBuilder delete register value test', async () => { + let builder = new ErgoBoxCandidateBuilder(BoxValue.from_u32(10000000), contract, 0); + const c = Constant.from_i32(1); + builder.set_register_value(NonMandatoryRegisterId.R4, c); + assert(builder.register_value(NonMandatoryRegisterId.R4).to_i32() == c.to_i32()); + builder.delete_register_value(NonMandatoryRegisterId.R4); + assert(builder.register_value(NonMandatoryRegisterId.R4) == null); + const b = builder.build(); + assert(b.register_value(NonMandatoryRegisterId.R4) == null); +}); diff --git a/bindings/ergo-lib-wasm/tests/test_transaction.js b/bindings/ergo-lib-wasm/tests/test_transaction.js index c7fe5599d..a835f80e1 100644 --- a/bindings/ergo-lib-wasm/tests/test_transaction.js +++ b/bindings/ergo-lib-wasm/tests/test_transaction.js @@ -3,7 +3,7 @@ import { expect, assert } from 'chai'; import { Address, Wallet, ErgoBox, ErgoBoxCandidateBuilder, Contract, ErgoBoxes, ErgoBoxCandidates, - ErgoStateContext, TxBuilder, BoxValue, UnsignedTransaction, BoxSelector, SecretKey, TxId, DataInputs + ErgoStateContext, TxBuilder, BoxValue, BoxSelector, SecretKey, TxId, DataInputs } from '../pkg/ergo_lib_wasm'; it('TxBuilder test', async () => { @@ -27,13 +27,12 @@ it('TxBuilder test', async () => { const change_address = Address.from_testnet_str('3WvsT2Gm4EpsM9Pg18PdY6XyhNNMqXDsvJTbbf6ihLvAmSb7u5RN'); const min_change_value = BoxValue.SAFE_USER_MIN(); const data_inputs = new DataInputs(); - const tx_builder = TxBuilder.new(BoxSelector.SelectAll, unspent_boxes, tx_outputs, 0, fee, change_address, min_change_value) - .set_data_inputs(data_inputs); + const tx_builder = TxBuilder.new(BoxSelector.SelectAll, unspent_boxes, tx_outputs, 0, fee, change_address, min_change_value); + tx_builder.set_data_inputs(data_inputs); const tx = tx_builder.build(); assert(tx != null); }); - it('sign transaction', async () => { const sk = SecretKey.random_dlog(); // simulate existing box guarded by the sk key diff --git a/ergo-lib/src/chain/ergo_box/box_builder.rs b/ergo-lib/src/chain/ergo_box/box_builder.rs index 19b97e8ca..589ece6b1 100644 --- a/ergo-lib/src/chain/ergo_box/box_builder.rs +++ b/ergo-lib/src/chain/ergo_box/box_builder.rs @@ -34,6 +34,7 @@ pub enum ErgoBoxCandidateBuilderError { } /// ErgoBoxCandidate builder +#[derive(Debug, Clone)] pub struct ErgoBoxCandidateBuilder { min_value_per_byte: u32, value: BoxValue, @@ -66,9 +67,8 @@ impl ErgoBoxCandidateBuilder { } /// Set minimal value (per byte of the serialized box size) - pub fn set_min_box_value_per_byte(mut self, new_min_value_per_byte: u32) -> Self { + pub fn set_min_box_value_per_byte(&mut self, new_min_value_per_byte: u32) { self.min_value_per_byte = new_min_value_per_byte; - self } /// Get minimal value (per byte of the serialized box size) @@ -77,9 +77,8 @@ impl ErgoBoxCandidateBuilder { } /// Set new box value - pub fn set_value(mut self, new_value: BoxValue) -> Self { + pub fn set_value(&mut self, new_value: BoxValue) { self.value = new_value; - self } /// Get box value @@ -110,13 +109,8 @@ impl ErgoBoxCandidateBuilder { } /// Set register with a given id (R4-R9) to the given value - pub fn set_register_value( - mut self, - register_id: NonMandatoryRegisterId, - value: Constant, - ) -> Self { + pub fn set_register_value(&mut self, register_id: NonMandatoryRegisterId, value: Constant) { self.additional_registers.insert(register_id, value); - self } /// Returns register value for the given register id (R4-R9), or None if the register is empty @@ -125,9 +119,8 @@ impl ErgoBoxCandidateBuilder { } /// Delete register value(make register empty) for the given register id (R4-R9) - pub fn delete_register_value(mut self, register_id: &NonMandatoryRegisterId) -> Self { + pub fn delete_register_value(&mut self, register_id: &NonMandatoryRegisterId) { self.additional_registers.remove(register_id); - self } /// Build the box candidate @@ -179,9 +172,9 @@ mod tests { #[test] fn test_set_value() { let new_value = BoxValue::SAFE_USER_MIN.checked_mul_u32(10).unwrap(); - let builder = - ErgoBoxCandidateBuilder::new(BoxValue::SAFE_USER_MIN, force_any_val::(), 1) - .set_value(new_value); + let mut builder = + ErgoBoxCandidateBuilder::new(BoxValue::SAFE_USER_MIN, force_any_val::(), 1); + builder.set_value(new_value); assert_eq!(builder.value(), &new_value); let b = builder.build().unwrap(); assert_eq!(b.value, new_value); @@ -222,24 +215,24 @@ mod tests { #[test] fn test_set_get_register_value() { let reg_value: Constant = 1i32.into(); - let builder = + let mut builder = ErgoBoxCandidateBuilder::new(BoxValue::SAFE_USER_MIN, force_any_val::(), 1); assert!(builder.register_value(&R4).is_none()); - let builder2 = builder.set_register_value(R4, reg_value.clone()); - assert_eq!(builder2.register_value(&R4).unwrap(), ®_value); - let b = builder2.build().unwrap(); + builder.set_register_value(R4, reg_value.clone()); + assert_eq!(builder.register_value(&R4).unwrap(), ®_value); + let b = builder.build().unwrap(); assert_eq!(b.additional_registers.get(R4).unwrap(), ®_value); } #[test] fn test_delete_register_value() { let reg_value: Constant = 1i32.into(); - let builder = - ErgoBoxCandidateBuilder::new(BoxValue::SAFE_USER_MIN, force_any_val::(), 1) - .set_register_value(R4, reg_value); - let builder2 = builder.delete_register_value(&R4); - assert!(builder2.register_value(&R4).is_none()); - let b = builder2.build().unwrap(); + let mut builder = + ErgoBoxCandidateBuilder::new(BoxValue::SAFE_USER_MIN, force_any_val::(), 1); + builder.set_register_value(R4, reg_value); + builder.delete_register_value(&R4); + assert!(builder.register_value(&R4).is_none()); + let b = builder.build().unwrap(); assert!(b.additional_registers.get(R4).is_none()); } } diff --git a/ergo-lib/src/wallet/tx_builder.rs b/ergo-lib/src/wallet/tx_builder.rs index ea879a5d6..ec2904c24 100644 --- a/ergo-lib/src/wallet/tx_builder.rs +++ b/ergo-lib/src/wallet/tx_builder.rs @@ -67,9 +67,8 @@ impl TxBuilder { } /// Set transaction's data inputs - pub fn set_data_inputs(mut self, data_inputs: Vec) -> Self { + pub fn set_data_inputs(&mut self, data_inputs: Vec) { self.data_inputs = data_inputs; - self } /// Build the unsigned transaction @@ -239,7 +238,7 @@ mod tests { prop_assume!(all_outputs < all_inputs); - let tx_builder = TxBuilder::new( + let mut tx_builder = TxBuilder::new( SimpleBoxSelector::new(), inputs.clone(), outputs.clone(), @@ -247,8 +246,8 @@ mod tests { miners_fee, change_address.clone(), min_change_value, - ) - .set_data_inputs(data_inputs.clone()); + ); + tx_builder.set_data_inputs(data_inputs.clone()); let tx = tx_builder.build().unwrap(); prop_assert!(outputs.into_iter().all(|i| tx.output_candidates.iter().any(|o| *o == i)), "tx.output_candidates is missing some outputs");