Skip to content

Commit

Permalink
rewrite builders to take &mut self in setters and return nothing;
Browse files Browse the repository at this point in the history
add JS tests for box builder;
  • Loading branch information
greenhat committed Oct 13, 2020
1 parent cbce839 commit 854b9ab
Show file tree
Hide file tree
Showing 7 changed files with 74 additions and 45 deletions.
3 changes: 2 additions & 1 deletion bindings/ergo-lib-wasm/Cargo.toml
Expand Up @@ -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
17 changes: 9 additions & 8 deletions bindings/ergo-lib-wasm/src/ergo_box/box_builder.rs
Expand Up @@ -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)
Expand All @@ -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
Expand All @@ -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
Expand All @@ -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(&register_id.into()))
pub fn delete_register_value(&mut self, register_id: NonMandatoryRegisterId) {
self.0.delete_register_value(&register_id.into());
}

/// Build the box candidate
Expand Down
4 changes: 2 additions & 2 deletions bindings/ergo-lib-wasm/src/tx_builder.rs
Expand Up @@ -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
Expand Down
36 changes: 36 additions & 0 deletions 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);
});
7 changes: 3 additions & 4 deletions bindings/ergo-lib-wasm/tests/test_transaction.js
Expand Up @@ -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 () => {
Expand All @@ -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
Expand Down
43 changes: 18 additions & 25 deletions ergo-lib/src/chain/ergo_box/box_builder.rs
Expand Up @@ -34,6 +34,7 @@ pub enum ErgoBoxCandidateBuilderError {
}

/// ErgoBoxCandidate builder
#[derive(Debug, Clone)]
pub struct ErgoBoxCandidateBuilder {
min_value_per_byte: u32,
value: BoxValue,
Expand Down Expand Up @@ -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)
Expand All @@ -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
Expand Down Expand Up @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -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::<ErgoTree>(), 1)
.set_value(new_value);
let mut builder =
ErgoBoxCandidateBuilder::new(BoxValue::SAFE_USER_MIN, force_any_val::<ErgoTree>(), 1);
builder.set_value(new_value);
assert_eq!(builder.value(), &new_value);
let b = builder.build().unwrap();
assert_eq!(b.value, new_value);
Expand Down Expand Up @@ -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::<ErgoTree>(), 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(), &reg_value);
let b = builder2.build().unwrap();
builder.set_register_value(R4, reg_value.clone());
assert_eq!(builder.register_value(&R4).unwrap(), &reg_value);
let b = builder.build().unwrap();
assert_eq!(b.additional_registers.get(R4).unwrap(), &reg_value);
}

#[test]
fn test_delete_register_value() {
let reg_value: Constant = 1i32.into();
let builder =
ErgoBoxCandidateBuilder::new(BoxValue::SAFE_USER_MIN, force_any_val::<ErgoTree>(), 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::<ErgoTree>(), 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());
}
}
9 changes: 4 additions & 5 deletions ergo-lib/src/wallet/tx_builder.rs
Expand Up @@ -67,9 +67,8 @@ impl<S: ErgoBoxAssets + ErgoBoxId + Clone> TxBuilder<S> {
}

/// Set transaction's data inputs
pub fn set_data_inputs(mut self, data_inputs: Vec<DataInput>) -> Self {
pub fn set_data_inputs(&mut self, data_inputs: Vec<DataInput>) {
self.data_inputs = data_inputs;
self
}

/// Build the unsigned transaction
Expand Down Expand Up @@ -239,16 +238,16 @@ 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(),
1,
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");
Expand Down

0 comments on commit 854b9ab

Please sign in to comment.