From 1de054e4c59abd7d035110a83e33eacad8b44458 Mon Sep 17 00:00:00 2001 From: Anton Suprunchuk Date: Thu, 30 Mar 2023 16:11:09 +0800 Subject: [PATCH 01/14] feat(wasm-dpp): state_transition_fee_validator binding and tests --- .../src/state_transition/validation/mod.rs | 1 + .../state_transition_fee_validator.rs | 29 +++++++++++++++++++ 2 files changed, 30 insertions(+) create mode 100644 packages/wasm-dpp/src/state_transition/validation/state_transition_fee_validator.rs diff --git a/packages/wasm-dpp/src/state_transition/validation/mod.rs b/packages/wasm-dpp/src/state_transition/validation/mod.rs index 5d88fff9cb9..244d3f2558d 100644 --- a/packages/wasm-dpp/src/state_transition/validation/mod.rs +++ b/packages/wasm-dpp/src/state_transition/validation/mod.rs @@ -1 +1,2 @@ pub mod validate_state_transition_key_signature; +pub mod state_transition_fee_validator; diff --git a/packages/wasm-dpp/src/state_transition/validation/state_transition_fee_validator.rs b/packages/wasm-dpp/src/state_transition/validation/state_transition_fee_validator.rs new file mode 100644 index 00000000000..7fa835f6591 --- /dev/null +++ b/packages/wasm-dpp/src/state_transition/validation/state_transition_fee_validator.rs @@ -0,0 +1,29 @@ +use crate::state_repository::{ExternalStateRepositoryLike, ExternalStateRepositoryLikeWrapper}; +use dpp::state_transition::validation::validate_state_transition_fee::StateTransitionFeeValidator; +use std::sync::Arc; +use wasm_bindgen::JsValue; +use wasm_bindgen::prelude::wasm_bindgen; +use crate::state_transition::conversion::create_state_transition_from_wasm_instance; +use crate::utils::WithJsError; +use crate::validation::ValidationResultWasm; + +#[wasm_bindgen(js_name=StateTransitionFeeValidator)] +pub struct StateTransitionFeeValidatorWasm( + StateTransitionFeeValidator, +); + +#[wasm_bindgen(js_class=StateTransitionFeeValidator)] +impl StateTransitionFeeValidatorWasm { + #[wasm_bindgen(constructor)] + pub fn new(state_repository: ExternalStateRepositoryLike) -> Self { + Self(StateTransitionFeeValidator::new(Arc::new( + ExternalStateRepositoryLikeWrapper::new(state_repository), + ))) + } + + #[wasm_bindgen] + pub async fn validate(&self, state_transition: &JsValue) -> Result { + let st = create_state_transition_from_wasm_instance(state_transition)?; + Ok(self.0.validate(&st).await.map(|v| v.map(|_| JsValue::undefined())).with_js_error()?.into()) + } +} From ab34d4c05e5bd3b17d2ff816b2ae16e9b493e43c Mon Sep 17 00:00:00 2001 From: Anton Suprunchuk Date: Thu, 30 Mar 2023 21:07:48 +0800 Subject: [PATCH 02/14] fix some bugs and ported half of the tests --- .../validate_state_transition_fee.rs | 23 +-- .../fee/balance_is_not_enough_error.rs | 8 +- .../src/state_transition/conversion.rs | 34 ++++ .../wasm-dpp/src/state_transition/fee/mod.rs | 2 + .../operations/pre_calculated_operation.rs | 6 + .../fee/operations/read_operation.rs | 6 + .../signature_verification_operation.rs | 6 + packages/wasm-dpp/src/state_transition/mod.rs | 27 +++ .../state_transition_fee_validator.rs | 1 + .../validateStateTransitionFeeFactory.spec.js | 172 +++++++++--------- 10 files changed, 185 insertions(+), 100 deletions(-) diff --git a/packages/rs-dpp/src/state_transition/validation/validate_state_transition_fee.rs b/packages/rs-dpp/src/state_transition/validation/validate_state_transition_fee.rs index 994857e72f7..a8b9bdd809c 100644 --- a/packages/rs-dpp/src/state_transition/validation/validate_state_transition_fee.rs +++ b/packages/rs-dpp/src/state_transition/validation/validate_state_transition_fee.rs @@ -168,18 +168,19 @@ where st: &impl StateTransitionIdentitySigned, ) -> Result { let identity_id = st.get_owner_id(); - let identity = self + let maybe_balance = self .state_repository - .fetch_identity(identity_id, Some(st.get_execution_context())) - .await? - .map(TryInto::try_into) - .transpose() - .map_err(Into::into)? - .ok_or_else(|| { - ProtocolError::IdentityNotPresentError(IdentityNotPresentError::new(*identity_id)) - })?; - - Ok(identity.get_balance()) + .fetch_identity_balance(identity_id, Some(st.get_execution_context())) + .await + .map_err(ProtocolError::from)?; + + if let Some(balance) = maybe_balance { + Ok(balance) + } else { + Err(ProtocolError::IdentityNotPresentError( + IdentityNotPresentError::new(*identity_id), + )) + } } } diff --git a/packages/wasm-dpp/src/errors/consensus/fee/balance_is_not_enough_error.rs b/packages/wasm-dpp/src/errors/consensus/fee/balance_is_not_enough_error.rs index 729283a89da..1c02543b9d1 100644 --- a/packages/wasm-dpp/src/errors/consensus/fee/balance_is_not_enough_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/fee/balance_is_not_enough_error.rs @@ -17,13 +17,13 @@ impl BalanceIsNotEnoughErrorWasm { #[wasm_bindgen(js_class=BalanceIsNotEnoughError)] impl BalanceIsNotEnoughErrorWasm { #[wasm_bindgen(js_name=getBalance)] - pub fn get_balance(&self) -> Credits { - self.balance + pub fn get_balance(&self) -> f64 { + self.balance as f64 } #[wasm_bindgen(js_name=getFee)] - pub fn get_fee(&self) -> Credits { - self.fee + pub fn get_fee(&self) -> f64 { + self.fee as f64 } #[wasm_bindgen(js_name=getCode)] diff --git a/packages/wasm-dpp/src/state_transition/conversion.rs b/packages/wasm-dpp/src/state_transition/conversion.rs index 8ad03a49e51..4b7777897b0 100644 --- a/packages/wasm-dpp/src/state_transition/conversion.rs +++ b/packages/wasm-dpp/src/state_transition/conversion.rs @@ -12,6 +12,40 @@ use dpp::state_transition::{StateTransition, StateTransitionType}; use std::convert::TryInto; use wasm_bindgen::__rt::Ref; use wasm_bindgen::{JsCast, JsError, JsValue}; +use dpp::state_transition::fee::operations::Operation; +use crate::fee::{PreCalculatedOperationWasm, ReadOperationWasm, SignatureVerificationOperationWasm}; + +pub fn create_operation_from_wasm_instance(js_value: &JsValue) -> Result { + let maybe_signature_verification_operation: Result< + Ref, + JsValue, + > = generic_of_js_val::( + js_value, + "SignatureVerificationOperation", + ); + + if let Ok(operation) = maybe_signature_verification_operation { + return Ok(Operation::SignatureVerification( + operation.to_owned().into(), + )); + } + + let maybe_read_operation: Result, JsValue> = + generic_of_js_val::(js_value, "ReadOperation"); + + if let Ok(operation) = maybe_read_operation { + return Ok(Operation::Read(operation.to_owned().into())); + } + + let maybe_precalculated_operation: Result, JsValue> = + generic_of_js_val::(js_value, "PreCalculatedOperation"); + + if let Ok(operation) = maybe_precalculated_operation { + return Ok(Operation::PreCalculated(operation.to_owned().into())); + } + + Err(JsError::new("Unknown operation").into()) +} pub fn create_state_transition_from_wasm_instance( js_value: &JsValue, diff --git a/packages/wasm-dpp/src/state_transition/fee/mod.rs b/packages/wasm-dpp/src/state_transition/fee/mod.rs index 7f787f119d6..c3080b14bc2 100644 --- a/packages/wasm-dpp/src/state_transition/fee/mod.rs +++ b/packages/wasm-dpp/src/state_transition/fee/mod.rs @@ -1,6 +1,8 @@ use dpp::state_transition::fee::operations::Operation; use wasm_bindgen::prelude::*; +pub use operations::*; + use crate::utils::Inner; mod calculate_operation_fees; mod calculate_state_transition_fee; diff --git a/packages/wasm-dpp/src/state_transition/fee/operations/pre_calculated_operation.rs b/packages/wasm-dpp/src/state_transition/fee/operations/pre_calculated_operation.rs index 59bce03f0af..0ba6380d95d 100644 --- a/packages/wasm-dpp/src/state_transition/fee/operations/pre_calculated_operation.rs +++ b/packages/wasm-dpp/src/state_transition/fee/operations/pre_calculated_operation.rs @@ -21,6 +21,12 @@ impl From for PreCalculatedOperationWasm { } } +impl From for PreCalculatedOperation { + fn from(value: PreCalculatedOperationWasm) -> Self { + value.0 + } +} + #[wasm_bindgen(js_class=PreCalculatedOperation)] impl PreCalculatedOperationWasm { #[wasm_bindgen(constructor)] diff --git a/packages/wasm-dpp/src/state_transition/fee/operations/read_operation.rs b/packages/wasm-dpp/src/state_transition/fee/operations/read_operation.rs index 6971d484b0a..abb657d07cd 100644 --- a/packages/wasm-dpp/src/state_transition/fee/operations/read_operation.rs +++ b/packages/wasm-dpp/src/state_transition/fee/operations/read_operation.rs @@ -17,6 +17,12 @@ impl From for ReadOperationWasm { } } +impl From for ReadOperation { + fn from(value: ReadOperationWasm) -> Self { + value.0 + } +} + #[wasm_bindgen(js_class=ReadOperation)] impl ReadOperationWasm { #[wasm_bindgen(constructor)] diff --git a/packages/wasm-dpp/src/state_transition/fee/operations/signature_verification_operation.rs b/packages/wasm-dpp/src/state_transition/fee/operations/signature_verification_operation.rs index b09d6005000..ffa27dc4723 100644 --- a/packages/wasm-dpp/src/state_transition/fee/operations/signature_verification_operation.rs +++ b/packages/wasm-dpp/src/state_transition/fee/operations/signature_verification_operation.rs @@ -23,6 +23,12 @@ impl From for SignatureVerificationOperationWasm } } +impl From for SignatureVerificationOperation { + fn from(value: SignatureVerificationOperationWasm) -> Self { + value.0 + } +} + #[wasm_bindgen(js_class=SignatureVerificationOperation)] impl SignatureVerificationOperationWasm { #[wasm_bindgen(constructor)] diff --git a/packages/wasm-dpp/src/state_transition/mod.rs b/packages/wasm-dpp/src/state_transition/mod.rs index 2916d16696f..a2bdd800fa0 100644 --- a/packages/wasm-dpp/src/state_transition/mod.rs +++ b/packages/wasm-dpp/src/state_transition/mod.rs @@ -1,6 +1,7 @@ use dpp::state_transition::state_transition_execution_context::StateTransitionExecutionContext; use wasm_bindgen::prelude::*; +use dpp::state_transition::fee::operations::Operation; pub mod errors; pub mod state_transition_facade; @@ -10,6 +11,8 @@ pub mod fee; pub mod validation; use crate::utils::Inner; pub use validation::*; +use crate::fee::{PreCalculatedOperationWasm, ReadOperationWasm, SignatureVerificationOperationWasm}; +use crate::state_transition::conversion::create_operation_from_wasm_instance; pub(crate) mod conversion; @@ -69,6 +72,30 @@ impl StateTransitionExecutionContextWasm { pub fn disable_dry_run(&self) { self.0.disable_dry_run(); } + + #[wasm_bindgen(js_name=addOperation)] + pub fn add_operation(&self, operation: JsValue) -> Result<(), JsValue> { + let operation = create_operation_from_wasm_instance(&operation)?; + self.0.add_operation(operation); + Ok(()) + } + + #[wasm_bindgen(js_name=getOperations)] + pub fn get_operation(&self) -> Vec { + let operations = self.0.get_operations(); + operations + .iter() + .map(|operation| match operation { + Operation::PreCalculated(operation) => { + PreCalculatedOperationWasm::from(operation.to_owned()).into() + } + Operation::Read(operation) => ReadOperationWasm::from(operation.to_owned()).into(), + Operation::SignatureVerification(operation) => { + SignatureVerificationOperationWasm::from(operation.to_owned()).into() + } + }) + .collect() + } } impl Inner for StateTransitionExecutionContextWasm { diff --git a/packages/wasm-dpp/src/state_transition/validation/state_transition_fee_validator.rs b/packages/wasm-dpp/src/state_transition/validation/state_transition_fee_validator.rs index 7fa835f6591..36e9e2a2cbc 100644 --- a/packages/wasm-dpp/src/state_transition/validation/state_transition_fee_validator.rs +++ b/packages/wasm-dpp/src/state_transition/validation/state_transition_fee_validator.rs @@ -3,6 +3,7 @@ use dpp::state_transition::validation::validate_state_transition_fee::StateTrans use std::sync::Arc; use wasm_bindgen::JsValue; use wasm_bindgen::prelude::wasm_bindgen; +use dpp::state_transition::fee::FeeResult; use crate::state_transition::conversion::create_state_transition_from_wasm_instance; use crate::utils::WithJsError; use crate::validation::ValidationResultWasm; diff --git a/packages/wasm-dpp/test/unit/stateTransition/validation/validateStateTransitionFeeFactory.spec.js b/packages/wasm-dpp/test/unit/stateTransition/validation/validateStateTransitionFeeFactory.spec.js index 315dbea4fda..3aa98d81bd7 100644 --- a/packages/wasm-dpp/test/unit/stateTransition/validation/validateStateTransitionFeeFactory.spec.js +++ b/packages/wasm-dpp/test/unit/stateTransition/validation/validateStateTransitionFeeFactory.spec.js @@ -1,23 +1,26 @@ -const validateStateTransitionFeeFactory = require('@dashevo/dpp/lib/stateTransition/validation/validateStateTransitionFeeFactory'); - -const createStateRepositoryMock = require('@dashevo/dpp/lib/test/mocks/createStateRepositoryMock'); - -const getDocumentsFixture = require('@dashevo/dpp/lib/test/fixtures/getDocumentsFixture'); -const getDataContractFixture = require('@dashevo/dpp/lib/test/fixtures/getDataContractFixture'); const getIdentityCreateTransitionFixture = require('@dashevo/dpp/lib/test/fixtures/getIdentityCreateTransitionFixture'); -const getDocumentTransitionsFixture = require('@dashevo/dpp/lib/test/fixtures/getDocumentTransitionsFixture'); const getIdentityTopUpTransitionFixture = require('@dashevo/dpp/lib/test/fixtures/getIdentityTopUpTransitionFixture'); -const DataContractCreateTransition = require('@dashevo/dpp/lib/dataContract/stateTransition/DataContractCreateTransition/DataContractCreateTransition'); -const DocumentsBatchTransition = require('@dashevo/dpp/lib/document/stateTransition/DocumentsBatchTransition/DocumentsBatchTransition'); - -const { expectValidationError } = require('@dashevo/dpp/lib/test/expect/expectError'); - -const IdentityBalanceIsNotEnoughError = require('@dashevo/dpp/lib/errors/consensus/fee/BalanceIsNotEnoughError'); const InvalidStateTransitionTypeError = require('@dashevo/dpp/lib/stateTransition/errors/InvalidStateTransitionTypeError'); const { RATIO } = require('@dashevo/dpp/lib/identity/creditsConverter'); -const StateTransitionExecutionContext = require('@dashevo/dpp/lib/stateTransition/StateTransitionExecutionContext'); + +const { expectValidationError } = require('../../../../lib/test/expect/expectError'); +const getDocumentsFixture = require('../../../../lib/test/fixtures/getDocumentsFixture'); + +const createStateRepositoryMock = require('../../../../lib/test/mocks/createStateRepositoryMock'); +const getBlsMock = require('../../../../lib/test/mocks/getBlsAdapterMock'); + +const getDataContractFixture = require('../../../../lib/test/fixtures/getDataContractFixture'); + +let { + StateTransitionFeeValidator, + DashPlatformProtocol, + IdentityBalanceIsNotEnoughError, + StateTransitionExecutionContext, + PreCalculatedOperation, +} = require('../../../..'); +const { default: loadWasmDpp } = require('../../../..'); describe('validateStateTransitionFeeFactory', () => { let stateRepositoryMock; @@ -25,9 +28,20 @@ describe('validateStateTransitionFeeFactory', () => { let dataContract; let calculateStateTransitionFeeMock; let fetchAssetLockTransactionOutputMock; - - beforeEach(function beforeEach() { + let dpp; + let dataContractOwnerId; + let executionContext; + + beforeEach(async function beforeEach() { + ({ + StateTransitionFeeValidator, + IdentityBalanceIsNotEnoughError, + DashPlatformProtocol, + StateTransitionExecutionContext, + PreCalculatedOperation, + } = await loadWasmDpp()); stateRepositoryMock = createStateRepositoryMock(this.sinonSandbox); + stateRepositoryMock.fetchDataContract.resolves(undefined); const output = getIdentityCreateTransitionFixture().getAssetLockProof().getOutput(); @@ -35,133 +49,123 @@ describe('validateStateTransitionFeeFactory', () => { desiredAmount: 42, }); + dpp = new DashPlatformProtocol(getBlsMock(), stateRepositoryMock); fetchAssetLockTransactionOutputMock = this.sinonSandbox.stub().resolves(output); - validateStateTransitionFee = validateStateTransitionFeeFactory( - stateRepositoryMock, - calculateStateTransitionFeeMock, - fetchAssetLockTransactionOutputMock, - ); + const validator = new StateTransitionFeeValidator(stateRepositoryMock); + + validateStateTransitionFee = (st) => validator.validate(st); - dataContract = getDataContractFixture(); + executionContext = new StateTransitionExecutionContext(); + executionContext.disableDryRun(); + + dataContract = await getDataContractFixture(); }); describe('DataContractCreateTransition', () => { let dataContractCreateTransition; beforeEach(() => { - dataContractCreateTransition = new DataContractCreateTransition({ - dataContract: dataContract.toObject(), - entropy: dataContract.getEntropy(), - }); + dataContractOwnerId = dataContract.getOwnerId().toBuffer(); + dataContractCreateTransition = dpp.dataContract + .createDataContractCreateTransition(dataContract); }); it('should return invalid result if balance is not enough', async () => { + executionContext.addOperation(new PreCalculatedOperation(0, 42, [])); + dataContractCreateTransition.setExecutionContext(executionContext); stateRepositoryMock.fetchIdentityBalance.resolves(1); const result = await validateStateTransitionFee(dataContractCreateTransition); - expectValidationError(result, IdentityBalanceIsNotEnoughError); + await expectValidationError(result, IdentityBalanceIsNotEnoughError); const [error] = result.getErrors(); expect(error.getCode()).to.equal(3000); + // expect(error.getBalance()).to.equal(1); - expect(stateRepositoryMock.fetchIdentityBalance).to.be.calledOnceWithExactly( - dataContract.getOwnerId(), - dataContractCreateTransition.getExecutionContext(), - ); - - expect(calculateStateTransitionFeeMock).to.be.calledOnceWithExactly( - dataContractCreateTransition, - ); - - expect(fetchAssetLockTransactionOutputMock).to.not.be.called(); + expect(stateRepositoryMock.fetchIdentityBalance).to.be.calledOnce(); + expect( + stateRepositoryMock.fetchIdentityBalance.getCall(0).args[0].toBuffer(), + ).to.be.deep.equal(dataContractOwnerId); }); it('should return valid result', async () => { stateRepositoryMock.fetchIdentityBalance.resolves(42); + executionContext.addOperation(new PreCalculatedOperation(0, 42, [])); + dataContractCreateTransition.setExecutionContext(executionContext); + const result = await validateStateTransitionFee(dataContractCreateTransition); expect(result.isValid()).to.be.true(); + console.log(result.getErrors()[0]); - expect(stateRepositoryMock.fetchIdentityBalance).to.be.calledOnceWithExactly( - dataContract.getOwnerId(), - dataContractCreateTransition.getExecutionContext(), - ); - - expect(calculateStateTransitionFeeMock).to.be.calledOnceWithExactly( - dataContractCreateTransition, - ); - - expect(fetchAssetLockTransactionOutputMock).to.not.be.called(); + expect(stateRepositoryMock.fetchIdentityBalance).to.be.calledOnce(); + expect( + stateRepositoryMock.fetchIdentityBalance.getCall(0).args[0].toBuffer(), + ).to.be.deep.equal(dataContractOwnerId); }); }); describe('DocumentsBatchTransition', () => { let documentsBatchTransition; + let ownerId; - beforeEach(() => { - const documents = getDocumentsFixture(dataContract); - - const documentTransitions = getDocumentTransitionsFixture({ - create: documents, + beforeEach(async () => { + documentsBatchTransition = await dpp.document.createStateTransition({ + create: await getDocumentsFixture(), }); - documentsBatchTransition = new DocumentsBatchTransition({ - ownerId: getDocumentsFixture.ownerId, - contractId: dataContract.getId(), - transitions: documentTransitions.map((t) => t.toObject()), - }, [dataContract]); + ownerId = documentsBatchTransition.getOwnerId().toBuffer(); }); it('should return invalid result if balance is not enough', async () => { stateRepositoryMock.fetchIdentityBalance.resolves(1); + executionContext.addOperation(new PreCalculatedOperation(0, 42, [])); + documentsBatchTransition.setExecutionContext(executionContext); + const result = await validateStateTransitionFee(documentsBatchTransition); - expectValidationError(result, IdentityBalanceIsNotEnoughError); + await expectValidationError(result, IdentityBalanceIsNotEnoughError); const [error] = result.getErrors(); expect(error.getCode()).to.equal(3000); expect(error.getBalance()).to.equal(1); - expect(stateRepositoryMock.fetchIdentityBalance).to.be.calledOnceWithExactly( - getDocumentsFixture.ownerId, - documentsBatchTransition.getExecutionContext(), - ); - - expect(calculateStateTransitionFeeMock).to.be.calledOnceWithExactly( - documentsBatchTransition, - ); - - expect(fetchAssetLockTransactionOutputMock).to.not.be.called(); + expect(stateRepositoryMock.fetchIdentityBalance).to.be.calledOnce(); + expect( + stateRepositoryMock.fetchIdentityBalance.getCall(0).args[0].toBuffer(), + ).to.be.deep.equal(ownerId); }); it('should return valid result', async () => { stateRepositoryMock.fetchIdentityBalance.resolves(42); + executionContext.addOperation(new PreCalculatedOperation(0, 42, [])); + documentsBatchTransition.setExecutionContext(executionContext); + const result = await validateStateTransitionFee(documentsBatchTransition); expect(result.isValid()).to.be.true(); - expect(stateRepositoryMock.fetchIdentityBalance).to.be.calledOnceWithExactly( - getDocumentsFixture.ownerId, - documentsBatchTransition.getExecutionContext(), - ); - - expect(calculateStateTransitionFeeMock).to.be.calledOnceWithExactly( - documentsBatchTransition, - ); - - expect(fetchAssetLockTransactionOutputMock).to.not.be.called(); + expect(stateRepositoryMock.fetchIdentityBalance).to.be.calledOnce(); + expect( + stateRepositoryMock.fetchIdentityBalance.getCall(0).args[0].toBuffer(), + ).to.be.deep.equal(ownerId); }); it('should not increase balance on dry run', async () => { - documentsBatchTransition.getExecutionContext().enableDryRun(); + stateRepositoryMock.fetchIdentityBalance.resolves(1); + + executionContext.enableDryRun(); + + executionContext.addOperation(new PreCalculatedOperation(0, 42, [])); + documentsBatchTransition.setExecutionContext(executionContext); const result = await validateStateTransitionFee(documentsBatchTransition); @@ -169,12 +173,10 @@ describe('validateStateTransitionFeeFactory', () => { expect(result.isValid()).to.be.true(); - expect(calculateStateTransitionFeeMock).to.be.not.called(); - expect(stateRepositoryMock.fetchIdentityBalance).to.be.calledOnceWithExactly( - getDocumentsFixture.ownerId, - documentsBatchTransition.getExecutionContext(), - ); - expect(fetchAssetLockTransactionOutputMock).to.not.be.called(); + expect(stateRepositoryMock.fetchIdentityBalance).to.be.calledOnce(); + expect( + stateRepositoryMock.fetchIdentityBalance.getCall(0).args[0].toBuffer(), + ).to.be.deep.equal(ownerId); }); }); From c981dd5f572f16642d7b0c2e8435b59a5405e9a4 Mon Sep 17 00:00:00 2001 From: Anton Suprunchuk Date: Fri, 31 Mar 2023 14:29:20 +0800 Subject: [PATCH 03/14] fix the rest of the tests --- .../validate_state_transition_fee.rs | 1 + .../getIdentityTopUpTransitionFixture.js | 27 ++- .../src/identity/credits_converter.rs | 7 + packages/wasm-dpp/src/identity/mod.rs | 1 + .../validateStateTransitionFeeFactory.spec.js | 161 +++++------------- 5 files changed, 78 insertions(+), 119 deletions(-) create mode 100644 packages/wasm-dpp/src/identity/credits_converter.rs diff --git a/packages/rs-dpp/src/state_transition/validation/validate_state_transition_fee.rs b/packages/rs-dpp/src/state_transition/validation/validate_state_transition_fee.rs index a8b9bdd809c..9a1954e2492 100644 --- a/packages/rs-dpp/src/state_transition/validation/validate_state_transition_fee.rs +++ b/packages/rs-dpp/src/state_transition/validation/validate_state_transition_fee.rs @@ -140,6 +140,7 @@ where balance } StateTransition::IdentityCreditWithdrawal(_) => { + // TODO: make it as a top-up, but in reverse return Err(ProtocolError::InvalidStateTransitionTypeError( InvalidStateTransitionTypeError::new( StateTransitionType::IdentityCreditWithdrawal as u8, diff --git a/packages/wasm-dpp/lib/test/fixtures/getIdentityTopUpTransitionFixture.js b/packages/wasm-dpp/lib/test/fixtures/getIdentityTopUpTransitionFixture.js index 226b6f3fcff..27833bf7970 100644 --- a/packages/wasm-dpp/lib/test/fixtures/getIdentityTopUpTransitionFixture.js +++ b/packages/wasm-dpp/lib/test/fixtures/getIdentityTopUpTransitionFixture.js @@ -1 +1,26 @@ -module.exports = require('@dashevo/dpp/lib/test/fixtures/getIdentityTopUpTransitionFixture'); +const PrivateKey = require('@dashevo/dashcore-lib/lib/privatekey'); + +const getInstantAssetLockProofFixture = require('./getInstantAssetLockProofFixture'); +const generateRandomIdentifier = require('../utils/generateRandomIdentifierAsync'); + +const { default: loadWasmDpp } = require('../../..'); +let { IdentityTopUpTransition } = require('../../..'); + +/** + * @param {PrivateKey} oneTimePrivateKey + * + * @return {IdentityCreateTransition} + */ +module.exports = async function getIdentityCreateTransitionFixture( + oneTimePrivateKey = new PrivateKey(), +) { + ({ IdentityTopUpTransition } = await loadWasmDpp()); + const rawStateTransition = { + protocolVersion: 1, + type: 3, + assetLockProof: (await getInstantAssetLockProofFixture(oneTimePrivateKey)).toObject(), + identityId: await generateRandomIdentifier(), + }; + + return new IdentityTopUpTransition(rawStateTransition); +}; diff --git a/packages/wasm-dpp/src/identity/credits_converter.rs b/packages/wasm-dpp/src/identity/credits_converter.rs new file mode 100644 index 00000000000..cb5f0b9bb2b --- /dev/null +++ b/packages/wasm-dpp/src/identity/credits_converter.rs @@ -0,0 +1,7 @@ +use dpp::identity::RATIO; +use wasm_bindgen::prelude::wasm_bindgen; + +#[wasm_bindgen(js_name=getCreditsConversionRatio)] +pub fn credit_conversion_ratio() -> f64 { + RATIO as f64 +} \ No newline at end of file diff --git a/packages/wasm-dpp/src/identity/mod.rs b/packages/wasm-dpp/src/identity/mod.rs index fcabf210d07..ea23e78644c 100644 --- a/packages/wasm-dpp/src/identity/mod.rs +++ b/packages/wasm-dpp/src/identity/mod.rs @@ -24,6 +24,7 @@ pub use state_transition::*; pub mod errors; pub mod state_transition; +pub mod credits_converter; #[wasm_bindgen(js_name=Identity)] #[derive(Clone)] diff --git a/packages/wasm-dpp/test/unit/stateTransition/validation/validateStateTransitionFeeFactory.spec.js b/packages/wasm-dpp/test/unit/stateTransition/validation/validateStateTransitionFeeFactory.spec.js index 3aa98d81bd7..b6012b594cc 100644 --- a/packages/wasm-dpp/test/unit/stateTransition/validation/validateStateTransitionFeeFactory.spec.js +++ b/packages/wasm-dpp/test/unit/stateTransition/validation/validateStateTransitionFeeFactory.spec.js @@ -1,17 +1,12 @@ -const getIdentityCreateTransitionFixture = require('@dashevo/dpp/lib/test/fixtures/getIdentityCreateTransitionFixture'); -const getIdentityTopUpTransitionFixture = require('@dashevo/dpp/lib/test/fixtures/getIdentityTopUpTransitionFixture'); - -const InvalidStateTransitionTypeError = require('@dashevo/dpp/lib/stateTransition/errors/InvalidStateTransitionTypeError'); - -const { RATIO } = require('@dashevo/dpp/lib/identity/creditsConverter'); - const { expectValidationError } = require('../../../../lib/test/expect/expectError'); -const getDocumentsFixture = require('../../../../lib/test/fixtures/getDocumentsFixture'); const createStateRepositoryMock = require('../../../../lib/test/mocks/createStateRepositoryMock'); const getBlsMock = require('../../../../lib/test/mocks/getBlsAdapterMock'); const getDataContractFixture = require('../../../../lib/test/fixtures/getDataContractFixture'); +const getDocumentsFixture = require('../../../../lib/test/fixtures/getDocumentsFixture'); +const getIdentityCreateTransitionFixture = require('../../../../lib/test/fixtures/getIdentityCreateTransitionFixture'); +const getIdentityTopUpTransitionFixture = require('../../../../lib/test/fixtures/getIdentityTopUpTransitionFixture'); let { StateTransitionFeeValidator, @@ -19,6 +14,7 @@ let { IdentityBalanceIsNotEnoughError, StateTransitionExecutionContext, PreCalculatedOperation, + getCreditsConversionRatio, } = require('../../../..'); const { default: loadWasmDpp } = require('../../../..'); @@ -26,8 +22,6 @@ describe('validateStateTransitionFeeFactory', () => { let stateRepositoryMock; let validateStateTransitionFee; let dataContract; - let calculateStateTransitionFeeMock; - let fetchAssetLockTransactionOutputMock; let dpp; let dataContractOwnerId; let executionContext; @@ -39,18 +33,12 @@ describe('validateStateTransitionFeeFactory', () => { DashPlatformProtocol, StateTransitionExecutionContext, PreCalculatedOperation, + getCreditsConversionRatio, } = await loadWasmDpp()); stateRepositoryMock = createStateRepositoryMock(this.sinonSandbox); stateRepositoryMock.fetchDataContract.resolves(undefined); - const output = getIdentityCreateTransitionFixture().getAssetLockProof().getOutput(); - - calculateStateTransitionFeeMock = this.sinonSandbox.stub().returns({ - desiredAmount: 42, - }); - dpp = new DashPlatformProtocol(getBlsMock(), stateRepositoryMock); - fetchAssetLockTransactionOutputMock = this.sinonSandbox.stub().resolves(output); const validator = new StateTransitionFeeValidator(stateRepositoryMock); @@ -184,22 +172,23 @@ describe('validateStateTransitionFeeFactory', () => { let identityCreateTransition; let outputAmount; - beforeEach(() => { - identityCreateTransition = getIdentityCreateTransitionFixture(); + beforeEach(async () => { + identityCreateTransition = await getIdentityCreateTransitionFixture(); const { satoshis } = identityCreateTransition .getAssetLockProof() .getOutput(); - outputAmount = satoshis * RATIO; + outputAmount = satoshis * getCreditsConversionRatio(); }); it('should return invalid result if asset lock output amount is not enough', async () => { - calculateStateTransitionFeeMock.returns({ desiredAmount: outputAmount + 1 }); + executionContext.addOperation(new PreCalculatedOperation(0, outputAmount + 1, [])); + identityCreateTransition.setExecutionContext(executionContext); const result = await validateStateTransitionFee(identityCreateTransition); - expectValidationError(result, IdentityBalanceIsNotEnoughError); + await expectValidationError(result, IdentityBalanceIsNotEnoughError); const [error] = result.getErrors(); @@ -207,122 +196,91 @@ describe('validateStateTransitionFeeFactory', () => { expect(error.getBalance()).to.equal(outputAmount); expect(stateRepositoryMock.fetchIdentity).to.be.not.called(); - - expect(calculateStateTransitionFeeMock).to.be.calledOnceWithExactly( - identityCreateTransition, - ); - - expect(fetchAssetLockTransactionOutputMock).to.be.calledOnceWithExactly( - identityCreateTransition.getAssetLockProof(), - identityCreateTransition.getExecutionContext(), - ); }); it('should return valid result', async () => { - calculateStateTransitionFeeMock.returns(outputAmount); + executionContext.addOperation(new PreCalculatedOperation(0, outputAmount, [])); + identityCreateTransition.setExecutionContext(executionContext); const result = await validateStateTransitionFee(identityCreateTransition); expect(result.isValid()).to.be.true(); expect(stateRepositoryMock.fetchIdentity).to.be.not.called(); - - expect(calculateStateTransitionFeeMock).to.be.calledOnceWithExactly( - identityCreateTransition, - ); - - expect(fetchAssetLockTransactionOutputMock).to.be.calledOnceWithExactly( - identityCreateTransition.getAssetLockProof(), - identityCreateTransition.getExecutionContext(), - ); }); it('should not increase balance on dry run', async () => { - identityCreateTransition.getExecutionContext().enableDryRun(); + executionContext.enableDryRun(); + executionContext.addOperation(new PreCalculatedOperation(0, outputAmount + 1, [])); + identityCreateTransition.setExecutionContext(executionContext); const result = await validateStateTransitionFee(identityCreateTransition); identityCreateTransition.getExecutionContext().disableDryRun(); expect(result.isValid()).to.be.true(); - - expect(calculateStateTransitionFeeMock).to.be.not.called(); - expect(fetchAssetLockTransactionOutputMock).to.be.calledOnceWithExactly( - identityCreateTransition.getAssetLockProof(), - identityCreateTransition.getExecutionContext(), - ); }); }); describe('IdentityTopUpTransition', () => { let identityTopUpTransition; let outputAmount; + let identityId; - beforeEach(() => { - identityTopUpTransition = getIdentityTopUpTransitionFixture(); + beforeEach(async () => { + identityTopUpTransition = await getIdentityTopUpTransitionFixture(); + identityId = identityTopUpTransition.getIdentityId().toBuffer(); const { satoshis } = identityTopUpTransition .getAssetLockProof() .getOutput(); - outputAmount = satoshis * RATIO; + outputAmount = satoshis * getCreditsConversionRatio(); }); it('should return invalid result if sum of balance and asset lock output amount is not enough', async () => { stateRepositoryMock.fetchIdentityBalanceWithDebt.resolves(1); - calculateStateTransitionFeeMock.returns({ desiredAmount: outputAmount + 2 }); + executionContext.addOperation(new PreCalculatedOperation(0, outputAmount + 2, [])); + identityTopUpTransition.setExecutionContext(executionContext); const result = await validateStateTransitionFee(identityTopUpTransition); - expectValidationError(result, IdentityBalanceIsNotEnoughError); + await expectValidationError(result, IdentityBalanceIsNotEnoughError); const [error] = result.getErrors(); expect(error.getCode()).to.equal(3000); expect(error.getBalance()).to.equal(outputAmount + 1); - expect(stateRepositoryMock.fetchIdentityBalanceWithDebt).to.be.calledOnceWithExactly( - identityTopUpTransition.getIdentityId(), - identityTopUpTransition.getExecutionContext(), - ); - - expect(calculateStateTransitionFeeMock).to.be.calledOnceWithExactly( - identityTopUpTransition, - ); - - expect(fetchAssetLockTransactionOutputMock).to.be.calledOnceWithExactly( - identityTopUpTransition.getAssetLockProof(), - identityTopUpTransition.getExecutionContext(), - ); + expect(stateRepositoryMock.fetchIdentityBalanceWithDebt).to.be.calledOnce(); + expect( + stateRepositoryMock.fetchIdentityBalanceWithDebt.getCall(0).args[0].toBuffer(), + ).to.be.deep.equal(identityId); }); it('should return valid result', async () => { stateRepositoryMock.fetchIdentityBalanceWithDebt.resolves(41); - calculateStateTransitionFeeMock.returns(outputAmount - 1); + executionContext.addOperation(new PreCalculatedOperation(0, outputAmount - 1, [])); + identityTopUpTransition.setExecutionContext(executionContext); const result = await validateStateTransitionFee(identityTopUpTransition); expect(result.isValid()).to.be.true(); - expect(stateRepositoryMock.fetchIdentityBalanceWithDebt).to.be.calledOnceWithExactly( - identityTopUpTransition.getIdentityId(), - identityTopUpTransition.getExecutionContext(), - ); - - expect(calculateStateTransitionFeeMock).to.be.calledOnceWithExactly( - identityTopUpTransition, - ); - - expect(fetchAssetLockTransactionOutputMock).to.be.calledOnceWithExactly( - identityTopUpTransition.getAssetLockProof(), - identityTopUpTransition.getExecutionContext(), - ); + expect(stateRepositoryMock.fetchIdentityBalanceWithDebt).to.be.calledOnce(); + expect( + stateRepositoryMock.fetchIdentityBalanceWithDebt.getCall(0).args[0].toBuffer(), + ).to.be.deep.equal(identityId); }); it('should not increase balance on dry run', async () => { - identityTopUpTransition.getExecutionContext().enableDryRun(); + stateRepositoryMock.fetchIdentityBalanceWithDebt.resolves(1); + + executionContext.enableDryRun(); + executionContext.addOperation(new PreCalculatedOperation(0, outputAmount + 42, [])); + identityTopUpTransition.setExecutionContext(executionContext); const result = await validateStateTransitionFee(identityTopUpTransition); @@ -330,43 +288,10 @@ describe('validateStateTransitionFeeFactory', () => { expect(result.isValid()).to.be.true(); - expect(calculateStateTransitionFeeMock).to.be.not.called(); - expect(fetchAssetLockTransactionOutputMock).to.be.calledOnceWithExactly( - identityTopUpTransition.getAssetLockProof(), - identityTopUpTransition.getExecutionContext(), - ); - expect(stateRepositoryMock.fetchIdentityBalanceWithDebt).to.be.calledOnceWithExactly( - identityTopUpTransition.getIdentityId(), - identityTopUpTransition.getExecutionContext(), - ); + expect(stateRepositoryMock.fetchIdentityBalanceWithDebt).to.be.calledOnce(); + expect( + stateRepositoryMock.fetchIdentityBalanceWithDebt.getCall(0).args[0].toBuffer(), + ).to.be.deep.equal(identityId); }); }); - - it('should throw InvalidStateTransitionTypeError on invalid State Transition', async function it() { - const rawStateTransitionMock = { - data: 'sample data', - type: -1, - }; - - const stateTransitionMock = { - getType: this.sinonSandbox.stub().returns(rawStateTransitionMock.type), - toBuffer: this.sinonSandbox.stub().returns(Buffer.alloc(0)), - toObject: this.sinonSandbox.stub().returns(rawStateTransitionMock), - getExecutionContext: this.sinonSandbox.stub().returns(new StateTransitionExecutionContext()), - }; - - try { - await validateStateTransitionFee(stateTransitionMock); - - expect.fail('should throw InvalidStateTransitionTypeError'); - } catch (error) { - expect(error).to.be.an.instanceOf(InvalidStateTransitionTypeError); - expect(error.getType()).to.equal(rawStateTransitionMock.type); - - expect(calculateStateTransitionFeeMock).to.not.be.called(); - expect(stateRepositoryMock.fetchIdentity).to.not.be.called(); - - expect(fetchAssetLockTransactionOutputMock).to.not.be.called(); - } - }); }); From 7aed519a4af974bae81f86d1e362e27f31b4c276 Mon Sep 17 00:00:00 2001 From: Anton Suprunchuk Date: Fri, 31 Mar 2023 14:33:55 +0800 Subject: [PATCH 04/14] run cargo fix --- .../document/state_transition/document_batch_transition/mod.rs | 2 +- packages/wasm-dpp/src/state_transition/fee/refunds.rs | 2 +- .../validation/state_transition_fee_validator.rs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/wasm-dpp/src/document/state_transition/document_batch_transition/mod.rs b/packages/wasm-dpp/src/document/state_transition/document_batch_transition/mod.rs index 98ef0820ef9..8503e2dddb3 100644 --- a/packages/wasm-dpp/src/document/state_transition/document_batch_transition/mod.rs +++ b/packages/wasm-dpp/src/document/state_transition/document_batch_transition/mod.rs @@ -1,5 +1,5 @@ use dpp::identity::KeyID; -use dpp::state_transition::fee::calculate_state_transition_fee_factory::calculate_state_transition_fee; + use dpp::{ document::{ document_transition::document_base_transition, diff --git a/packages/wasm-dpp/src/state_transition/fee/refunds.rs b/packages/wasm-dpp/src/state_transition/fee/refunds.rs index a54bcb46dbd..e52d0a0c605 100644 --- a/packages/wasm-dpp/src/state_transition/fee/refunds.rs +++ b/packages/wasm-dpp/src/state_transition/fee/refunds.rs @@ -51,7 +51,7 @@ impl Inner for RefundsWasm { } pub fn convert_hashmap_to_jsmap(map: &HashMap) -> js_sys::Map { - let mut js_map = js_sys::Map::new(); + let js_map = js_sys::Map::new(); for (key, value) in map { js_map.set(&JsValue::from_str(&key), &BigInt::from(*value)); } diff --git a/packages/wasm-dpp/src/state_transition/validation/state_transition_fee_validator.rs b/packages/wasm-dpp/src/state_transition/validation/state_transition_fee_validator.rs index 36e9e2a2cbc..576dd5c30b3 100644 --- a/packages/wasm-dpp/src/state_transition/validation/state_transition_fee_validator.rs +++ b/packages/wasm-dpp/src/state_transition/validation/state_transition_fee_validator.rs @@ -3,7 +3,7 @@ use dpp::state_transition::validation::validate_state_transition_fee::StateTrans use std::sync::Arc; use wasm_bindgen::JsValue; use wasm_bindgen::prelude::wasm_bindgen; -use dpp::state_transition::fee::FeeResult; + use crate::state_transition::conversion::create_state_transition_from_wasm_instance; use crate::utils::WithJsError; use crate::validation::ValidationResultWasm; From 23289dea5a0f7c44e081bf09d0411f0f1ecc865e Mon Sep 17 00:00:00 2001 From: Anton Suprunchuk Date: Fri, 31 Mar 2023 14:35:44 +0800 Subject: [PATCH 05/14] fix clippy warnings --- packages/wasm-dpp/src/state_transition/fee/refunds.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/wasm-dpp/src/state_transition/fee/refunds.rs b/packages/wasm-dpp/src/state_transition/fee/refunds.rs index e52d0a0c605..10cbd37b5cd 100644 --- a/packages/wasm-dpp/src/state_transition/fee/refunds.rs +++ b/packages/wasm-dpp/src/state_transition/fee/refunds.rs @@ -53,7 +53,7 @@ impl Inner for RefundsWasm { pub fn convert_hashmap_to_jsmap(map: &HashMap) -> js_sys::Map { let js_map = js_sys::Map::new(); for (key, value) in map { - js_map.set(&JsValue::from_str(&key), &BigInt::from(*value)); + js_map.set(&JsValue::from_str(key), &BigInt::from(*value)); } js_map } From bb1e79d9f3c7a3b75e9b6c0025917e0d28b28dc4 Mon Sep 17 00:00:00 2001 From: Anton Suprunchuk Date: Fri, 31 Mar 2023 14:36:28 +0800 Subject: [PATCH 06/14] reformat --- .../wasm-dpp/src/identity/credits_converter.rs | 2 +- packages/wasm-dpp/src/identity/mod.rs | 2 +- .../wasm-dpp/src/state_transition/conversion.rs | 6 ++++-- packages/wasm-dpp/src/state_transition/mod.rs | 8 +++++--- .../src/state_transition/validation/mod.rs | 2 +- .../validation/state_transition_fee_validator.rs | 15 ++++++++++++--- 6 files changed, 24 insertions(+), 11 deletions(-) diff --git a/packages/wasm-dpp/src/identity/credits_converter.rs b/packages/wasm-dpp/src/identity/credits_converter.rs index cb5f0b9bb2b..d39f38d2953 100644 --- a/packages/wasm-dpp/src/identity/credits_converter.rs +++ b/packages/wasm-dpp/src/identity/credits_converter.rs @@ -4,4 +4,4 @@ use wasm_bindgen::prelude::wasm_bindgen; #[wasm_bindgen(js_name=getCreditsConversionRatio)] pub fn credit_conversion_ratio() -> f64 { RATIO as f64 -} \ No newline at end of file +} diff --git a/packages/wasm-dpp/src/identity/mod.rs b/packages/wasm-dpp/src/identity/mod.rs index ea23e78644c..1c0972d2390 100644 --- a/packages/wasm-dpp/src/identity/mod.rs +++ b/packages/wasm-dpp/src/identity/mod.rs @@ -22,9 +22,9 @@ pub use identity_public_key::*; pub use state_transition::*; +pub mod credits_converter; pub mod errors; pub mod state_transition; -pub mod credits_converter; #[wasm_bindgen(js_name=Identity)] #[derive(Clone)] diff --git a/packages/wasm-dpp/src/state_transition/conversion.rs b/packages/wasm-dpp/src/state_transition/conversion.rs index 4b7777897b0..c9a71e8ea34 100644 --- a/packages/wasm-dpp/src/state_transition/conversion.rs +++ b/packages/wasm-dpp/src/state_transition/conversion.rs @@ -1,4 +1,7 @@ use crate::errors::consensus_error::from_consensus_error; +use crate::fee::{ + PreCalculatedOperationWasm, ReadOperationWasm, SignatureVerificationOperationWasm, +}; use crate::utils::generic_of_js_val; use crate::{ DataContractCreateTransitionWasm, DataContractUpdateTransitionWasm, @@ -8,12 +11,11 @@ use crate::{ use dpp::consensus::basic::state_transition::InvalidStateTransitionTypeError; use dpp::consensus::basic::BasicError; use dpp::consensus::ConsensusError; +use dpp::state_transition::fee::operations::Operation; use dpp::state_transition::{StateTransition, StateTransitionType}; use std::convert::TryInto; use wasm_bindgen::__rt::Ref; use wasm_bindgen::{JsCast, JsError, JsValue}; -use dpp::state_transition::fee::operations::Operation; -use crate::fee::{PreCalculatedOperationWasm, ReadOperationWasm, SignatureVerificationOperationWasm}; pub fn create_operation_from_wasm_instance(js_value: &JsValue) -> Result { let maybe_signature_verification_operation: Result< diff --git a/packages/wasm-dpp/src/state_transition/mod.rs b/packages/wasm-dpp/src/state_transition/mod.rs index a2bdd800fa0..7873d8afd84 100644 --- a/packages/wasm-dpp/src/state_transition/mod.rs +++ b/packages/wasm-dpp/src/state_transition/mod.rs @@ -1,7 +1,7 @@ use dpp::state_transition::state_transition_execution_context::StateTransitionExecutionContext; -use wasm_bindgen::prelude::*; use dpp::state_transition::fee::operations::Operation; +use wasm_bindgen::prelude::*; pub mod errors; pub mod state_transition_facade; @@ -9,10 +9,12 @@ pub mod state_transition_factory; pub mod fee; pub mod validation; +use crate::fee::{ + PreCalculatedOperationWasm, ReadOperationWasm, SignatureVerificationOperationWasm, +}; +use crate::state_transition::conversion::create_operation_from_wasm_instance; use crate::utils::Inner; pub use validation::*; -use crate::fee::{PreCalculatedOperationWasm, ReadOperationWasm, SignatureVerificationOperationWasm}; -use crate::state_transition::conversion::create_operation_from_wasm_instance; pub(crate) mod conversion; diff --git a/packages/wasm-dpp/src/state_transition/validation/mod.rs b/packages/wasm-dpp/src/state_transition/validation/mod.rs index 244d3f2558d..a1d97a2a8a1 100644 --- a/packages/wasm-dpp/src/state_transition/validation/mod.rs +++ b/packages/wasm-dpp/src/state_transition/validation/mod.rs @@ -1,2 +1,2 @@ -pub mod validate_state_transition_key_signature; pub mod state_transition_fee_validator; +pub mod validate_state_transition_key_signature; diff --git a/packages/wasm-dpp/src/state_transition/validation/state_transition_fee_validator.rs b/packages/wasm-dpp/src/state_transition/validation/state_transition_fee_validator.rs index 576dd5c30b3..0c317efd27d 100644 --- a/packages/wasm-dpp/src/state_transition/validation/state_transition_fee_validator.rs +++ b/packages/wasm-dpp/src/state_transition/validation/state_transition_fee_validator.rs @@ -1,8 +1,8 @@ use crate::state_repository::{ExternalStateRepositoryLike, ExternalStateRepositoryLikeWrapper}; use dpp::state_transition::validation::validate_state_transition_fee::StateTransitionFeeValidator; use std::sync::Arc; -use wasm_bindgen::JsValue; use wasm_bindgen::prelude::wasm_bindgen; +use wasm_bindgen::JsValue; use crate::state_transition::conversion::create_state_transition_from_wasm_instance; use crate::utils::WithJsError; @@ -23,8 +23,17 @@ impl StateTransitionFeeValidatorWasm { } #[wasm_bindgen] - pub async fn validate(&self, state_transition: &JsValue) -> Result { + pub async fn validate( + &self, + state_transition: &JsValue, + ) -> Result { let st = create_state_transition_from_wasm_instance(state_transition)?; - Ok(self.0.validate(&st).await.map(|v| v.map(|_| JsValue::undefined())).with_js_error()?.into()) + Ok(self + .0 + .validate(&st) + .await + .map(|v| v.map(|_| JsValue::undefined())) + .with_js_error()? + .into()) } } From 0de4d489f66d2874d3f89c80155fb15b3b8d5975 Mon Sep 17 00:00:00 2001 From: Anton Suprunchuk Date: Fri, 31 Mar 2023 14:47:55 +0800 Subject: [PATCH 07/14] resolve merge conflicts --- packages/wasm-dpp/src/state_transition/conversion.rs | 3 --- 1 file changed, 3 deletions(-) diff --git a/packages/wasm-dpp/src/state_transition/conversion.rs b/packages/wasm-dpp/src/state_transition/conversion.rs index f96d05c4896..87cb3ff8a50 100644 --- a/packages/wasm-dpp/src/state_transition/conversion.rs +++ b/packages/wasm-dpp/src/state_transition/conversion.rs @@ -1,7 +1,4 @@ use crate::errors::consensus_error::from_consensus_error; -use crate::fee::{ - PreCalculatedOperationWasm, ReadOperationWasm, SignatureVerificationOperationWasm, -}; use crate::utils::generic_of_js_val; use crate::{ DataContractCreateTransitionWasm, DataContractUpdateTransitionWasm, From d59b438510bcb0d0c676e89a659cbb03f22b7256 Mon Sep 17 00:00:00 2001 From: Anton Suprunchuk Date: Fri, 31 Mar 2023 14:54:05 +0800 Subject: [PATCH 08/14] fix rs-dpp tests --- .../validate_state_transition_fee.rs | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/packages/rs-dpp/src/state_transition/validation/validate_state_transition_fee.rs b/packages/rs-dpp/src/state_transition/validation/validate_state_transition_fee.rs index 9a1954e2492..fcb6fabe6f0 100644 --- a/packages/rs-dpp/src/state_transition/validation/validate_state_transition_fee.rs +++ b/packages/rs-dpp/src/state_transition/validation/validate_state_transition_fee.rs @@ -254,8 +254,8 @@ mod test { identity.balance = 1; state_repository_mock - .expect_fetch_identity() - .returning(move |_, _| Ok(Some(identity.clone()))); + .expect_fetch_identity_balance() + .returning(move |_, _| Ok(Some(identity.get_balance()))); let data_contract = get_data_contract_fixture(None); let data_contract_create_transition = DataContractCreateTransition { @@ -286,8 +286,8 @@ mod test { identity.balance = 52; state_repository_mock - .expect_fetch_identity() - .returning(move |_, _| Ok(Some(identity.clone()))); + .expect_fetch_identity_balance() + .returning(move |_, _| Ok(Some(identity.get_balance()))); let data_contract = get_data_contract_fixture(None); let data_contract_create_transition = DataContractCreateTransition { @@ -312,8 +312,8 @@ mod test { identity.balance = 1; state_repository_mock - .expect_fetch_identity() - .returning(move |_, _| Ok(Some(identity.clone()))); + .expect_fetch_identity_balance() + .returning(move |_, _| Ok(Some(identity.get_balance()))); let data_contract = get_data_contract_fixture(None); let documents = @@ -347,8 +347,8 @@ mod test { identity.balance = 90; state_repository_mock - .expect_fetch_identity() - .returning(move |_, _| Ok(Some(identity.clone()))); + .expect_fetch_identity_balance() + .returning(move |_, _| Ok(Some(identity.get_balance()))); let data_contract = get_data_contract_fixture(None); let documents = @@ -376,8 +376,8 @@ mod test { identity.balance = 1; state_repository_mock - .expect_fetch_identity() - .returning(move |_, _| Ok(Some(identity.clone()))); + .expect_fetch_identity_balance() + .returning(move |_, _| Ok(Some(identity.get_balance()))); let data_contract = get_data_contract_fixture(None); let documents = From 0889ae614596f636b33d32f6b1c6ee2b04bda81d Mon Sep 17 00:00:00 2001 From: Anton Suprunchuk Date: Fri, 31 Mar 2023 15:36:51 +0800 Subject: [PATCH 09/14] fix old tests --- .../lib/test/fixtures/getIdentityTopUpTransitionFixtureJs.js | 1 + .../basic/validateIdentityTopUpTransitionBasicFactory.spec.js | 2 +- .../integration/stateTransition/StateTransitionFacade.spec.js | 2 ++ 3 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 packages/wasm-dpp/lib/test/fixtures/getIdentityTopUpTransitionFixtureJs.js diff --git a/packages/wasm-dpp/lib/test/fixtures/getIdentityTopUpTransitionFixtureJs.js b/packages/wasm-dpp/lib/test/fixtures/getIdentityTopUpTransitionFixtureJs.js new file mode 100644 index 00000000000..226b6f3fcff --- /dev/null +++ b/packages/wasm-dpp/lib/test/fixtures/getIdentityTopUpTransitionFixtureJs.js @@ -0,0 +1 @@ +module.exports = require('@dashevo/dpp/lib/test/fixtures/getIdentityTopUpTransitionFixture'); diff --git a/packages/wasm-dpp/test/integration/identity/stateTransition/IdentityTopUpTransition/validation/basic/validateIdentityTopUpTransitionBasicFactory.spec.js b/packages/wasm-dpp/test/integration/identity/stateTransition/IdentityTopUpTransition/validation/basic/validateIdentityTopUpTransitionBasicFactory.spec.js index ce51b8d3a1b..e22fdbbfb58 100644 --- a/packages/wasm-dpp/test/integration/identity/stateTransition/IdentityTopUpTransition/validation/basic/validateIdentityTopUpTransitionBasicFactory.spec.js +++ b/packages/wasm-dpp/test/integration/identity/stateTransition/IdentityTopUpTransition/validation/basic/validateIdentityTopUpTransitionBasicFactory.spec.js @@ -1,5 +1,5 @@ const createStateRepositoryMock = require('@dashevo/dpp/lib/test/mocks/createStateRepositoryMock'); -const getIdentityTopUpTransitionFixture = require('../../../../../../../lib/test/fixtures/getIdentityTopUpTransitionFixture'); +const getIdentityTopUpTransitionFixture = require('../../../../../../../lib/test/fixtures/getIdentityTopUpTransitionFixtureJs'); const { expectJsonSchemaError, diff --git a/packages/wasm-dpp/test/integration/stateTransition/StateTransitionFacade.spec.js b/packages/wasm-dpp/test/integration/stateTransition/StateTransitionFacade.spec.js index e0af52de689..467a5dad1a8 100644 --- a/packages/wasm-dpp/test/integration/stateTransition/StateTransitionFacade.spec.js +++ b/packages/wasm-dpp/test/integration/stateTransition/StateTransitionFacade.spec.js @@ -104,6 +104,7 @@ describe('StateTransitionFacade', () => { stateRepositoryMock = createStateRepositoryMock(this.sinonSandbox); stateRepositoryMock.fetchIdentity.resolves(identity); + stateRepositoryMock.fetchIdentityBalance.resolves(identity.getBalance()); stateRepositoryMock.fetchLatestPlatformBlockTime.resolves(blockTime); stateRepositoryMock.fetchDataContract.resolves(null); @@ -171,6 +172,7 @@ describe('StateTransitionFacade', () => { it('should return invalid result if not enough balance to pay fee for State Transition', async () => { identity.setBalance(0); + stateRepositoryMock.fetchIdentityBalance.resolves(0); const result = await dpp.stateTransition.validate(dataContractCreateTransition); expect(result).to.be.an.instanceOf(ValidationResult); From b48a313ffa1116a8cd3c1842eb957eec6003b904 Mon Sep 17 00:00:00 2001 From: Anton Suprunchuk Date: Fri, 31 Mar 2023 15:38:48 +0800 Subject: [PATCH 10/14] fix fixture usage --- .../validateStateTransitionKeySignatureFactory.spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/wasm-dpp/test/unit/stateTransition/validation/validateStateTransitionKeySignatureFactory.spec.js b/packages/wasm-dpp/test/unit/stateTransition/validation/validateStateTransitionKeySignatureFactory.spec.js index 1ce9b8cce9e..e72154045b2 100644 --- a/packages/wasm-dpp/test/unit/stateTransition/validation/validateStateTransitionKeySignatureFactory.spec.js +++ b/packages/wasm-dpp/test/unit/stateTransition/validation/validateStateTransitionKeySignatureFactory.spec.js @@ -2,7 +2,7 @@ const { Transaction, PrivateKey, Script } = require('@dashevo/dashcore-lib'); const createStateRepositoryMock = require('@dashevo/dpp/lib/test/mocks/createStateRepositoryMock'); const getIdentityCreateTransitionFixture = require('@dashevo/dpp/lib/test/fixtures/getIdentityCreateTransitionFixture'); -const getIdentityTopUpTransitionFixture = require('../../../../lib/test/fixtures/getIdentityTopUpTransitionFixture'); +const getIdentityTopUpTransitionFixture = require('../../../../lib/test/fixtures/getIdentityTopUpTransitionFixtureJs'); const { expectValidationError } = require('../../../../lib/test/expect/expectError'); const { default: loadWasmDpp } = require('../../../../dist'); From dba6001170df776759b007a4c2415ce051654bb8 Mon Sep 17 00:00:00 2001 From: Anton Suprunchuk Date: Fri, 31 Mar 2023 15:46:29 +0800 Subject: [PATCH 11/14] fix unnecessary console logs and comments --- .../validation/validateStateTransitionFeeFactory.spec.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/wasm-dpp/test/unit/stateTransition/validation/validateStateTransitionFeeFactory.spec.js b/packages/wasm-dpp/test/unit/stateTransition/validation/validateStateTransitionFeeFactory.spec.js index b6012b594cc..caac3067f61 100644 --- a/packages/wasm-dpp/test/unit/stateTransition/validation/validateStateTransitionFeeFactory.spec.js +++ b/packages/wasm-dpp/test/unit/stateTransition/validation/validateStateTransitionFeeFactory.spec.js @@ -71,7 +71,6 @@ describe('validateStateTransitionFeeFactory', () => { const [error] = result.getErrors(); expect(error.getCode()).to.equal(3000); - // expect(error.getBalance()).to.equal(1); expect(stateRepositoryMock.fetchIdentityBalance).to.be.calledOnce(); @@ -89,7 +88,6 @@ describe('validateStateTransitionFeeFactory', () => { const result = await validateStateTransitionFee(dataContractCreateTransition); expect(result.isValid()).to.be.true(); - console.log(result.getErrors()[0]); expect(stateRepositoryMock.fetchIdentityBalance).to.be.calledOnce(); expect( From 4abbaa72320778a5d15fbd270977326efd0a64f1 Mon Sep 17 00:00:00 2001 From: Anton Suprunchuk Date: Fri, 31 Mar 2023 15:49:12 +0800 Subject: [PATCH 12/14] reformat --- packages/wasm-dpp/src/state_transition/validation/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/wasm-dpp/src/state_transition/validation/mod.rs b/packages/wasm-dpp/src/state_transition/validation/mod.rs index 5c0c4e3b6d1..f85299ce15f 100644 --- a/packages/wasm-dpp/src/state_transition/validation/mod.rs +++ b/packages/wasm-dpp/src/state_transition/validation/mod.rs @@ -1,3 +1,3 @@ -pub mod validate_state_transition_identity_signature; pub mod state_transition_fee_validator; +pub mod validate_state_transition_identity_signature; pub mod validate_state_transition_key_signature; From 9626f01ee11a3660093f518445bb30b98a1c2299 Mon Sep 17 00:00:00 2001 From: Anton Suprunchuk Date: Mon, 3 Apr 2023 20:24:52 +0700 Subject: [PATCH 13/14] add getExecutionContext method to DataContractCreateTransition --- .../state_transition/data_contract_create_transition/mod.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/wasm-dpp/src/data_contract/state_transition/data_contract_create_transition/mod.rs b/packages/wasm-dpp/src/data_contract/state_transition/data_contract_create_transition/mod.rs index cf8ba08f1ca..3e8286f2e77 100644 --- a/packages/wasm-dpp/src/data_contract/state_transition/data_contract_create_transition/mod.rs +++ b/packages/wasm-dpp/src/data_contract/state_transition/data_contract_create_transition/mod.rs @@ -144,6 +144,11 @@ impl DataContractCreateTransitionWasm { self.0.set_execution_context(context.into()) } + #[wasm_bindgen(js_name=getExecutionContext)] + pub fn get_execution_context(&mut self) -> StateTransitionExecutionContextWasm { + self.0.get_execution_context().into() + } + #[wasm_bindgen(js_name=toObject)] pub fn to_object(&self, skip_signature: Option) -> Result { let serde_object = self From ead5db53fae2cf22f4115854eecc3bbfd6776521 Mon Sep 17 00:00:00 2001 From: Anton Suprunchuk Date: Wed, 5 Apr 2023 16:15:35 +0700 Subject: [PATCH 14/14] fix fees --- .../errors/consensus/fee/balance_is_not_enough_error.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/wasm-dpp/src/errors/consensus/fee/balance_is_not_enough_error.rs b/packages/wasm-dpp/src/errors/consensus/fee/balance_is_not_enough_error.rs index ad236f8055b..863c59d839c 100644 --- a/packages/wasm-dpp/src/errors/consensus/fee/balance_is_not_enough_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/fee/balance_is_not_enough_error.rs @@ -26,13 +26,13 @@ impl BalanceIsNotEnoughErrorWasm { } #[wasm_bindgen(js_name=getBalance)] - pub fn get_balance(&self) -> Credits { - self.inner.balance() + pub fn get_balance(&self) -> f64 { + self.inner.balance() as f64 } #[wasm_bindgen(js_name=getFee)] - pub fn get_fee(&self) -> Credits { - self.inner.fee() + pub fn get_fee(&self) -> f64 { + self.inner.fee() as f64 } #[wasm_bindgen(js_name=getCode)]