@dashevo/wasm-dpp 0.25.0-dev.12 → 0.25.0-dev.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. package/Cargo.toml +6 -5
  2. package/README.md +11 -6
  3. package/dist/wasm/wasm_dpp.d.ts +715 -653
  4. package/dist/wasm/wasm_dpp.js +1219 -1195
  5. package/dist/wasm/wasm_dpp_bg.js +1 -1
  6. package/lib/test/fixtures/getIdentityCreateTransitionFixture.js +2 -2
  7. package/lib/test/fixtures/js/generateRandomIdentifier.js +1 -0
  8. package/lib/test/fixtures/js/getChainAssetLockProofFixture.js +1 -0
  9. package/lib/test/fixtures/js/getDataContractFixture.js +1 -0
  10. package/lib/test/fixtures/js/getDocumentTransitionsFixture.js +1 -0
  11. package/lib/test/fixtures/js/getDocumentsFixture.js +1 -0
  12. package/lib/test/fixtures/js/getInstantAssetLockProofFixture.js +1 -0
  13. package/lib/test/mocks/createStateRepositoryMock.js +1 -0
  14. package/lib/wasm/wasm_dpp.d.ts +715 -653
  15. package/package.json +3 -3
  16. package/scripts/build-wasm.sh +32 -28
  17. package/src/data_contract/data_contract.rs +99 -54
  18. package/src/data_contract/data_contract_facade.rs +5 -2
  19. package/src/data_contract/state_transition/data_contract_update_transition/mod.rs +0 -5
  20. package/src/data_contract_factory/data_contract_factory.rs +5 -1
  21. package/src/document/document_facade.rs +12 -0
  22. package/src/document/factory.rs +17 -0
  23. package/src/document/mod.rs +4 -4
  24. package/src/errors/consensus/consensus_error.rs +5 -0
  25. package/src/errors/consensus/state/document/document_timestamps_are_equal_error.rs +42 -0
  26. package/src/errors/consensus/state/document/mod.rs +2 -0
  27. package/src/errors/value_error.rs +5 -0
  28. package/src/identity/mod.rs +8 -1
  29. package/src/identity/state_transition/mod.rs +1 -0
  30. package/src/identity/state_transition/transition_types.rs +30 -0
  31. package/src/lib.rs +1 -2
  32. package/src/protocol_version.rs +7 -0
  33. package/src/state_transition/errors/invalid_state_transition_error.rs +12 -1
  34. package/src/state_transition/state_transition_facade.rs +6 -1
  35. package/test/integration/dataContract/stateTransition/DataContractCreateTransition/validation/basic/validateDataContractCreateTransitionBasicFactory.spec.js +5 -5
  36. package/test/integration/dataContract/stateTransition/DataContractUpdateTransition/validation/basic/validateDataContractUpdateTransitionBasicFactory.spec.js +5 -5
  37. package/test/integration/dataContract/validation/validateDataContractFactory.spec.js +2 -2
  38. package/test/integration/document/DocumentFacade.spec.js +4 -4
  39. package/test/integration/document/stateTransition/DocumentsBatchTransition/DocumentBatchTransition.spec.js +5 -6
  40. package/test/integration/document/stateTransition/DocumentsBatchTransition/validation/basic/validateDocumentsBatchTransitionBasicFactory.spec.js +14 -14
  41. package/test/integration/document/stateTransition/DocumentsBatchTransition/validation/state/executeDataTriggersFactory.spec.js +1 -1
  42. package/test/integration/document/validation/validateDocumentFactory.spec.js +2 -2
  43. package/test/integration/identity/IdentityFacade.spec.js +8 -8
  44. package/test/integration/identity/stateTransition/IdentityCreateTransition/validation/basic/validateIdentityCreateTransitionBasicFactory.spec.js +4 -6
  45. package/test/integration/identity/stateTransition/IdentityTopUpTransition/validation/basic/validateIdentityTopUpTransitionBasicFactory.spec.js +3 -6
  46. package/test/integration/identity/stateTransition/IdentityUpdateTransition/validation/state/validateIdentityUpdateTransitionStateFactory.spec.js +20 -23
  47. package/test/integration/identity/stateTransition/IdentityUpdateTransition/validation/state/validatePublicKeysState.spec.js +1 -1
  48. package/test/integration/identity/stateTransition/assetLockProof/chain/validateChainAssetLockProofStructureFactory.spec.js +3 -3
  49. package/test/integration/identity/stateTransition/assetLockProof/fetchAssetLockTransactionOutputFactory.spec.js +5 -8
  50. package/test/integration/identity/stateTransition/assetLockProof/instant/validateInstantAssetLockProofStructureFactory.spec.js +3 -4
  51. package/test/integration/identity/stateTransition/assetLockProof/validateAssetLockTransactionFactory.spec.js +2 -3
  52. package/test/integration/identity/stateTransition/validatePublicKeySignaturesFactory.spec.js +2 -6
  53. package/test/integration/identity/validation/validateIdentityFactory.spec.js +6 -5
  54. package/test/integration/identity/validation/validatePublicKeysFactory.spec.js +4 -24
  55. package/test/integration/stateTransition/StateTransitionFacade.spec.js +11 -15
  56. package/test/unit/DashPlatformProtocol.spec.js +6 -7
  57. package/test/unit/dataContract/DataContract.spec.js +9 -9
  58. package/test/unit/dataContract/DataContractFactory.spec.js +3 -3
  59. package/test/unit/dataContract/createDataContract.spec.js +5 -5
  60. package/test/unit/dataContract/stateTransition/DataContractCreateTransition/DataContractCreateTransition.spec.js +14 -14
  61. package/test/unit/dataContract/stateTransition/DataContractCreateTransition/applyDataContractCreateTransitionFactory.spec.js +6 -8
  62. package/test/unit/dataContract/stateTransition/DataContractCreateTransition/validation/state/validateDataContractCreateTransitionStateFactory.spec.js +3 -3
  63. package/test/unit/dataContract/stateTransition/DataContractUpdateTransition/DataContractUpdateTransition.spec.js +14 -12
  64. package/test/unit/dataContract/stateTransition/DataContractUpdateTransition/applyDataContractUpdateTransitionFactory.spec.js +6 -6
  65. package/test/unit/dataContract/stateTransition/DataContractUpdateTransition/validation/basic/validateIndicesAreBackwardCompatible.spec.js +4 -4
  66. package/test/unit/dataContract/stateTransition/DataContractUpdateTransition/validation/state/validateDataContractUpdateTransitionStateFactory.spec.js +5 -5
  67. package/test/unit/dataContract/validation/validateDataContractPatterns.spec.js +6 -6
  68. package/test/unit/document/Document.spec.js +5 -4
  69. package/test/unit/document/stateTransition/DocumetsBatchTransition/applyDocumentsBatchTransitionFactory.spec.js +10 -11
  70. package/test/unit/document/stateTransition/DocumetsBatchTransition/validation/state/validateDocumentsBatchTransitionStateFactory.spec.js +8 -8
  71. package/test/unit/identity/Identity.spec.js +14 -6
  72. package/test/unit/identity/IdentityFactory.spec.js +11 -11
  73. package/test/unit/identity/IdentityPublicKey.spec.js +2 -2
  74. package/test/unit/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition.spec.js +13 -14
  75. package/test/unit/identity/stateTransition/IdentityCreateTransition/applyIdentityCreateTransitionFactory.spec.js +7 -13
  76. package/test/unit/identity/stateTransition/IdentityCreateTransition/validation/state/validateIdentityCreateTransitionStateFactory.spec.js +3 -7
  77. package/test/unit/identity/stateTransition/IdentityTopUpTransition/IdentityTopUpTransition.spec.js +13 -14
  78. package/test/unit/identity/stateTransition/IdentityTopUpTransition/applyIdentityTopUpTransitionFactory.spec.js +5 -9
  79. package/test/unit/identity/stateTransition/IdentityTopUpTransition/validation/state/validateIdentityTopUpTransitionStateFactory.spec.js +4 -8
  80. package/test/unit/identity/stateTransition/IdentityUpdateTransition/IdentityUpdateTransition.spec.js +11 -16
  81. package/test/unit/identity/stateTransition/IdentityUpdateTransition/applyIdentityUpdateTransitionFactory.spec.js +1 -1
  82. package/test/unit/stateTransition/StateTransitionFactory.spec.js +6 -7
  83. package/test/unit/stateTransition/createStateTransitionFactory.spec.js +41 -19
  84. package/test/unit/stateTransition/validation/validateStateTransitionKeySignatureFactory.spec.js +6 -12
  85. package/src/decode_protocol_entity.rs +0 -25
  86. package/test/integration/ajv/keywords/byteArray/addByteArrayKeyword.spec.js +0 -148
  87. package/test/integration/util/generateEntropy.spec.js +0 -17
  88. package/test/integration/util/serializer.spec.js +0 -24
  89. package/test/unit/decodeProtocolEntityFactory.spec.js +0 -72
  90. package/test/unit/identity/errors/InvalidIdentityError.spec.js +0 -46
  91. package/test/unit/stateTransition/errors/InvalidStateTransitionError.spec.js +0 -51
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dashevo/wasm-dpp",
3
- "version": "0.25.0-dev.12",
3
+ "version": "0.25.0-dev.14",
4
4
  "description": "The JavaScript implementation of the Dash Platform Protocol",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -44,8 +44,8 @@
44
44
  "@babel/core": "^7.15.5",
45
45
  "@babel/preset-env": "^7.15.4",
46
46
  "@dashevo/dashcore-lib": "~0.20.6",
47
- "@dashevo/dpns-contract": "0.25.0-dev.12",
48
- "@dashevo/dpp": "0.25.0-dev.12",
47
+ "@dashevo/dpns-contract": "0.25.0-dev.14",
48
+ "@dashevo/dpp": "0.25.0-dev.14",
49
49
  "@dashevo/wasm-re2": "~1.0.2",
50
50
  "@types/bs58": "^4.0.1",
51
51
  "@types/node": "^14.6.0",
@@ -1,46 +1,50 @@
1
1
  #!/usr/bin/env bash
2
+ # shellcheck disable=SC2312
3
+ set -ex
2
4
 
3
5
  TARGET=wasm32-unknown-unknown
4
6
 
5
- PROFILE_ARG=""
6
- PROFILE="debug"
7
-
8
- if [ -n "$CARGO_BUILD_PROFILE" ]; then
9
- if [ "$CARGO_BUILD_PROFILE" == "release" ]; then
10
- PROFILE_ARG="--release"
11
- PROFILE="release"
12
- elif [ "$CARGO_BUILD_PROFILE" != "debug" ]; then
13
- PROFILE_ARG="--profile $CARGO_BUILD_PROFILE"
14
- PROFILE="$CARGO_BUILD_PROFILE"
15
- fi
7
+ # "--profile release" is equivalent of "--release", see
8
+ # https://github.com/rust-lang/cargo/blob/13413c64ff88dd6c2824e9eb9374fc5f10895d28/src/cargo/util/command_prelude.rs#L426
9
+ CARGO_BUILD_PROFILE="${CARGO_BUILD_PROFILE:-dev}"
10
+ PROFILE_ARG="--profile ${CARGO_BUILD_PROFILE}"
11
+ PROFILE="${CARGO_BUILD_PROFILE}"
12
+ if [[ "${CARGO_BUILD_PROFILE}" == "dev" ]]; then
13
+ PROFILE=debug
16
14
  fi
17
15
 
18
- OUTPUT_DIR="$PWD/wasm"
19
- OUTPUT_FILE="$OUTPUT_DIR/wasm_dpp_bg.wasm"
20
- BUILD_COMMAND="cargo build --config net.git-fetch-with-cli=true --target=$TARGET $PROFILE_ARG"
21
- BINDGEN_COMMAND="wasm-bindgen --out-dir=$OUTPUT_DIR --target=web --omit-default-module-path ../../target/$TARGET/$PROFILE/wasm_dpp.wasm"
16
+ OUTPUT_DIR="${PWD}/wasm"
17
+ WORKSPACE_ROOT="$(dirname "$0")/../../.."
18
+ # shellcheck disable=SC2034
19
+ OUTPUT_FILE="${OUTPUT_DIR}/wasm_dpp_bg.wasm"
20
+ BUILD_COMMAND="cargo build --config net.git-fetch-with-cli=true --target=${TARGET} ${PROFILE_ARG}"
21
+ BINDGEN_COMMAND="wasm-bindgen --out-dir=${OUTPUT_DIR} --target=web --omit-default-module-path ../../target/${TARGET}/${PROFILE}/wasm_dpp.wasm"
22
22
 
23
-
24
- if ! [[ -d $OUTPUT_DIR ]]; then
25
- mkdir -p "$OUTPUT_DIR"
23
+ if ! [[ -d ${OUTPUT_DIR} ]]; then
24
+ mkdir -p "${OUTPUT_DIR}"
26
25
  fi
27
26
 
28
- if ! [ -x "$(command -v wasm-bindgen)" ]; then
29
- echo 'Wasm-bindgen CLI is not installed. Installing';
30
- cargo install -f wasm-bindgen-cli
27
+ if ! [[ -x "$(command -v cargo-lock)" ]]; then
28
+ echo 'cargo-lock is not installed. Installing'
29
+ cargo install cargo-lock --features=cli --profile "${CARGO_BUILD_PROFILE}"
31
30
  fi
32
31
 
32
+ WASM_BINDGEN_VERSION=$(cargo-lock list --file "${WORKSPACE_ROOT}/Cargo.lock" --package wasm-bindgen | grep -Eo '[0-9.]+')
33
+ if ! [[ "$(wasm-bindgen --version)" =~ ${WASM_BINDGEN_VERSION} ]]; then
34
+ echo "Wasm-bindgen CLI ${WASM_BINDGEN_VERSION} is not installed. Installing"
35
+ cargo install --config net.git-fetch-with-cli=true --profile "${CARGO_BUILD_PROFILE}" -f "wasm-bindgen-cli@${WASM_BINDGEN_VERSION}"
36
+ fi
33
37
 
34
38
  # On a mac, bundled clang won't work - you need to install LLVM manually through brew,
35
39
  # and then set the correct env for the build to work
36
- if [[ "$OSTYPE" == "darwin"* ]]; then
37
- AR_PATH=$(which llvm-ar)
38
- CLANG_PATH=$(which clang)
39
- AR=$AR_PATH CC=$CLANG_PATH $BUILD_COMMAND
40
- AR=$AR_PATH CC=$CLANG_PATH $BINDGEN_COMMAND
40
+ if [[ "${OSTYPE}" == "darwin"* ]]; then
41
+ AR_PATH=$(command -v llvm-ar)
42
+ CLANG_PATH=$(command -v clang)
43
+ AR=${AR_PATH} CC=${CLANG_PATH} ${BUILD_COMMAND}
44
+ AR=${AR_PATH} CC=${CLANG_PATH} ${BINDGEN_COMMAND}
41
45
  else
42
- $BUILD_COMMAND
43
- $BINDGEN_COMMAND
46
+ ${BUILD_COMMAND}
47
+ ${BINDGEN_COMMAND}
44
48
  fi
45
49
 
46
50
  # EMCC_CFLAGS="-s ERROR_ON_UNDEFINED_SYMBOLS=0 --no-entry" cargo build --target=wasm32-unknown-emscripten --release
@@ -1,45 +1,77 @@
1
1
  #![allow(clippy::from_over_into)]
2
2
 
3
3
  use std::collections::BTreeMap;
4
- use std::convert::{TryFrom, TryInto};
4
+ use std::convert::TryFrom;
5
5
 
6
6
  pub use serde::{Deserialize, Serialize};
7
7
  use serde_json::Value as JsonValue;
8
8
  use wasm_bindgen::prelude::*;
9
9
 
10
- use dpp::data_contract::{DataContract, SCHEMA_URI};
10
+ use dpp::data_contract::{CreatedDataContract, DataContract, SCHEMA_URI};
11
11
  use dpp::platform_value::string_encoding::Encoding;
12
12
  use dpp::platform_value::{Bytes32, Value};
13
13
 
14
14
  use dpp::serialization_traits::PlatformSerializable;
15
- use dpp::{platform_value, Convertible};
15
+ use dpp::{platform_value, Convertible, ProtocolError};
16
16
 
17
- use crate::errors::RustConversionError;
18
17
  use crate::identifier::identifier_from_js_value;
19
18
  use crate::metadata::MetadataWasm;
20
- use crate::utils::{IntoWasm, WithJsError};
19
+ use crate::utils::{Inner, IntoWasm, WithJsError};
21
20
  use crate::{bail_js, with_js_error};
22
21
  use crate::{buffer::Buffer, identifier::IdentifierWrapper};
23
22
 
24
23
  #[wasm_bindgen(js_name=DataContract)]
25
24
  #[derive(Debug, Clone)]
26
- pub struct DataContractWasm(pub(crate) DataContract);
25
+ pub struct DataContractWasm {
26
+ inner: DataContract,
27
+ entropy_used: Option<Vec<u8>>,
28
+ }
27
29
 
30
+ /// CreatedDataContract contains entropy and is used to create
31
+ /// DataContractCreateTransition
32
+ impl std::convert::From<CreatedDataContract> for DataContractWasm {
33
+ fn from(v: CreatedDataContract) -> Self {
34
+ DataContractWasm {
35
+ inner: v.data_contract,
36
+ entropy_used: Some(v.entropy_used.to_vec()),
37
+ }
38
+ }
39
+ }
40
+
41
+ /// Regular DataContract does not contain entropy and is used
42
+ /// in DataContractUpdateTransition
28
43
  impl std::convert::From<DataContract> for DataContractWasm {
29
44
  fn from(v: DataContract) -> Self {
30
- DataContractWasm(v)
45
+ DataContractWasm {
46
+ inner: v,
47
+ entropy_used: None,
48
+ }
31
49
  }
32
50
  }
33
51
 
34
52
  impl std::convert::From<&DataContractWasm> for DataContract {
35
53
  fn from(v: &DataContractWasm) -> Self {
36
- v.0.clone()
54
+ v.inner.clone()
55
+ }
56
+ }
57
+
58
+ impl std::convert::TryFrom<&DataContractWasm> for CreatedDataContract {
59
+ type Error = ProtocolError;
60
+ fn try_from(v: &DataContractWasm) -> Result<Self, Self::Error> {
61
+ Ok(Self {
62
+ data_contract: v.to_owned().into(),
63
+ entropy_used: if let Some(entropy_used) = &v.entropy_used {
64
+ Bytes32::from_vec(entropy_used.to_owned())?
65
+ } else {
66
+ Bytes32::default()
67
+ },
68
+ })
37
69
  }
38
70
  }
39
71
 
40
72
  impl std::convert::Into<DataContract> for DataContractWasm {
41
73
  fn into(self) -> DataContract {
42
- self.0
74
+ self.inner
43
75
  }
44
76
  }
45
77
 
@@ -96,54 +128,54 @@ impl DataContractWasm {
96
128
 
97
129
  #[wasm_bindgen(js_name=getProtocolVersion)]
98
130
  pub fn get_protocol_version(&self) -> u32 {
99
- self.0.protocol_version
131
+ self.inner.protocol_version
100
132
  }
101
133
 
102
134
  #[wasm_bindgen(js_name=getId)]
103
135
  pub fn get_id(&self) -> IdentifierWrapper {
104
- self.0.id.into()
136
+ self.inner.id.into()
105
137
  }
106
138
 
107
139
  #[wasm_bindgen(js_name=setId)]
108
140
  pub fn set_id(&mut self, id: &JsValue) -> Result<(), JsValue> {
109
141
  let id = identifier_from_js_value(id)?;
110
- self.0.id = id;
142
+ self.inner.id = id;
111
143
  Ok(())
112
144
  }
113
145
 
114
146
  #[wasm_bindgen(js_name=getOwnerId)]
115
147
  pub fn get_owner_id(&self) -> IdentifierWrapper {
116
- self.0.owner_id.into()
148
+ self.inner.owner_id.into()
117
149
  }
118
150
 
119
151
  #[wasm_bindgen(js_name=getVersion)]
120
152
  pub fn get_version(&self) -> u32 {
121
- self.0.version
153
+ self.inner.version
122
154
  }
123
155
 
124
156
  #[wasm_bindgen(js_name=setVersion)]
125
157
  pub fn set_version(&mut self, v: u32) {
126
- self.0.version = v;
158
+ self.inner.version = v;
127
159
  }
128
160
 
129
161
  #[wasm_bindgen(js_name=incrementVersion)]
130
162
  pub fn increment_version(&mut self) {
131
- self.0.increment_version()
163
+ self.inner.increment_version()
132
164
  }
133
165
 
134
166
  #[wasm_bindgen(js_name=getJsonSchemaId)]
135
167
  pub fn get_json_schema_id(&self) -> String {
136
- self.0.id.to_string(Encoding::Base58)
168
+ self.inner.id.to_string(Encoding::Base58)
137
169
  }
138
170
 
139
171
  #[wasm_bindgen(js_name=setJsonMetaSchema)]
140
172
  pub fn set_json_meta_schema(&mut self, schema: String) {
141
- self.0.schema = schema;
173
+ self.inner.schema = schema;
142
174
  }
143
175
 
144
176
  #[wasm_bindgen(js_name=getJsonMetaSchema)]
145
177
  pub fn get_json_meta_schema(&self) -> String {
146
- self.0.schema.clone()
178
+ self.inner.schema.clone()
147
179
  }
148
180
  #[wasm_bindgen(js_name=setDocuments)]
149
181
  pub fn set_documents(&mut self, documents: JsValue) -> Result<(), JsValue> {
@@ -157,7 +189,7 @@ impl DataContractWasm {
157
189
  }
158
190
  docs.insert(k, v);
159
191
  }
160
- self.0.documents = docs;
192
+ self.inner.documents = docs;
161
193
  } else {
162
194
  bail_js!("the parameter 'documents' is not an JS object")
163
195
  }
@@ -167,12 +199,12 @@ impl DataContractWasm {
167
199
  #[wasm_bindgen(js_name=getDocuments)]
168
200
  pub fn get_documents(&self) -> Result<JsValue, JsValue> {
169
201
  let serializer = serde_wasm_bindgen::Serializer::json_compatible();
170
- with_js_error!(self.0.documents.serialize(&serializer))
202
+ with_js_error!(self.inner.documents.serialize(&serializer))
171
203
  }
172
204
 
173
205
  #[wasm_bindgen(js_name=isDocumentDefined)]
174
206
  pub fn is_document_defined(&self, doc_type: String) -> bool {
175
- self.0.is_document_defined(&doc_type)
207
+ self.inner.is_document_defined(&doc_type)
176
208
  }
177
209
 
178
210
  #[wasm_bindgen(js_name=setDocumentSchema)]
@@ -182,7 +214,7 @@ impl DataContractWasm {
182
214
  schema: JsValue,
183
215
  ) -> Result<(), JsValue> {
184
216
  let json_schema: JsonValue = with_js_error!(serde_wasm_bindgen::from_value(schema))?;
185
- self.0
217
+ self.inner
186
218
  .set_document_schema(doc_type, json_schema)
187
219
  .with_js_error()?;
188
220
  Ok(())
@@ -190,7 +222,7 @@ impl DataContractWasm {
190
222
 
191
223
  #[wasm_bindgen(js_name=getDocumentSchema)]
192
224
  pub fn get_document_schema(&mut self, doc_type: &str) -> Result<JsValue, JsValue> {
193
- let doc_schema = self.0.get_document_schema(doc_type).with_js_error()?;
225
+ let doc_schema = self.inner.get_document_schema(doc_type).with_js_error()?;
194
226
  let serializer = serde_wasm_bindgen::Serializer::json_compatible();
195
227
  with_js_error!(doc_schema.serialize(&serializer))
196
228
  }
@@ -198,7 +230,10 @@ impl DataContractWasm {
198
230
  #[wasm_bindgen(js_name=getDocumentSchemaRef)]
199
231
  pub fn get_document_schema_ref(&self, doc_type: &str) -> Result<JsValue, JsValue> {
200
232
  with_js_error!(serde_wasm_bindgen::to_value(
201
- &self.0.get_document_schema_ref(doc_type).with_js_error()?
233
+ &self
234
+ .inner
235
+ .get_document_schema_ref(doc_type)
236
+ .with_js_error()?
202
237
  ))
203
238
  }
204
239
 
@@ -217,7 +252,7 @@ impl DataContractWasm {
217
252
  if definitions.is_empty() {
218
253
  bail_js!("`definitions` cannot be empty");
219
254
  }
220
- self.0.defs = Some(definitions);
255
+ self.inner.defs = Some(definitions);
221
256
  } else {
222
257
  bail_js!("the parameter 'definitions' is not an JS object");
223
258
  }
@@ -227,31 +262,28 @@ impl DataContractWasm {
227
262
  #[wasm_bindgen(js_name=getDefinitions)]
228
263
  pub fn get_definitions(&self) -> Result<JsValue, JsValue> {
229
264
  let serializer = serde_wasm_bindgen::Serializer::json_compatible();
230
- with_js_error!(self.0.defs.serialize(&serializer))
265
+ with_js_error!(self.inner.defs.serialize(&serializer))
231
266
  }
232
267
 
233
268
  #[wasm_bindgen(js_name=setEntropy)]
234
269
  pub fn set_entropy(&mut self, e: Vec<u8>) -> Result<(), JsValue> {
235
- let entropy: [u8; 32] = e.try_into().map_err(|_| {
236
- RustConversionError::Error(String::from(
237
- "unable to turn the data into 32 bytes array of bytes",
238
- ))
239
- .to_js_value()
240
- })?;
241
- self.0.entropy = Bytes32::new(entropy);
270
+ self.entropy_used = Some(e);
242
271
  Ok(())
243
272
  }
244
273
 
245
274
  #[wasm_bindgen(js_name=getEntropy)]
246
- pub fn get_entropy(&mut self) -> Buffer {
247
- Buffer::from_bytes_owned(self.0.entropy.to_vec())
275
+ pub fn get_entropy(&mut self) -> JsValue {
276
+ self.entropy_used
277
+ .as_ref()
278
+ .map(|e| Buffer::from_bytes(e.as_slice()).into())
279
+ .unwrap_or(JsValue::undefined())
248
280
  }
249
281
 
250
282
  #[wasm_bindgen(js_name=getBinaryProperties)]
251
283
  pub fn get_binary_properties(&self, doc_type: &str) -> Result<JsValue, JsValue> {
252
284
  let serializer = serde_wasm_bindgen::Serializer::json_compatible();
253
285
  with_js_error!(self
254
- .0
286
+ .inner
255
287
  .get_binary_properties(doc_type)
256
288
  .with_js_error()?
257
289
  .serialize(&serializer))
@@ -259,12 +291,12 @@ impl DataContractWasm {
259
291
 
260
292
  #[wasm_bindgen(js_name=getMetadata)]
261
293
  pub fn get_metadata(&self) -> Option<MetadataWasm> {
262
- self.0.metadata.clone().map(Into::into)
294
+ self.inner.metadata.clone().map(Into::into)
263
295
  }
264
296
 
265
297
  #[wasm_bindgen(js_name=setMetadata)]
266
298
  pub fn set_metadata(&mut self, metadata: JsValue) -> Result<(), JsValue> {
267
- self.0.metadata = if !metadata.is_falsy() {
299
+ self.inner.metadata = if !metadata.is_falsy() {
268
300
  let metadata = metadata.to_wasm::<MetadataWasm>("Metadata")?;
269
301
  Some(metadata.to_owned().into())
270
302
  } else {
@@ -276,20 +308,20 @@ impl DataContractWasm {
276
308
 
277
309
  #[wasm_bindgen(js_name=toObject)]
278
310
  pub fn to_object(&self) -> Result<JsValue, JsValue> {
279
- let value = self.0.to_cleaned_object().with_js_error()?;
311
+ let value = self.inner.to_cleaned_object().with_js_error()?;
280
312
  let serializer = serde_wasm_bindgen::Serializer::json_compatible();
281
313
  let object = with_js_error!(value.serialize(&serializer))?;
282
314
 
283
315
  js_sys::Reflect::set(
284
316
  &object,
285
317
  &Into::<JsValue>::into("$id".to_owned()),
286
- &Into::<JsValue>::into(Buffer::from_bytes_owned(self.0.id.to_vec())),
318
+ &Into::<JsValue>::into(Buffer::from_bytes_owned(self.inner.id.to_vec())),
287
319
  )
288
320
  .expect("target is an object");
289
321
  js_sys::Reflect::set(
290
322
  &object,
291
323
  &Into::<JsValue>::into("ownerId".to_owned()),
292
- &Into::<JsValue>::into(Buffer::from_bytes_owned(self.0.owner_id.to_vec())),
324
+ &Into::<JsValue>::into(Buffer::from_bytes_owned(self.inner.owner_id.to_vec())),
293
325
  )
294
326
  .expect("target is an object");
295
327
  Ok(object)
@@ -297,20 +329,20 @@ impl DataContractWasm {
297
329
 
298
330
  #[wasm_bindgen(js_name=toJSON)]
299
331
  pub fn to_json(&self) -> Result<JsValue, JsValue> {
300
- let json = self.0.to_json().with_js_error()?;
332
+ let json = self.inner.to_json().with_js_error()?;
301
333
  let serializer = serde_wasm_bindgen::Serializer::json_compatible();
302
334
  with_js_error!(json.serialize(&serializer))
303
335
  }
304
336
 
305
337
  #[wasm_bindgen(js_name=toBuffer)]
306
338
  pub fn to_buffer(&self) -> Result<Buffer, JsValue> {
307
- let bytes = PlatformSerializable::serialize(&self.0).with_js_error()?;
339
+ let bytes = PlatformSerializable::serialize(&self.inner).with_js_error()?;
308
340
  Ok(Buffer::from_bytes(&bytes))
309
341
  }
310
342
 
311
343
  #[wasm_bindgen(js_name=hash)]
312
344
  pub fn hash(&self) -> Result<Vec<u8>, JsValue> {
313
- self.0.hash().with_js_error()
345
+ self.inner.hash().with_js_error()
314
346
  }
315
347
 
316
348
  #[wasm_bindgen(js_name=from)]
@@ -333,6 +365,28 @@ impl DataContractWasm {
333
365
  }
334
366
  }
335
367
 
368
+ impl Inner for DataContractWasm {
369
+ type InnerItem = DataContract;
370
+
371
+ fn into_inner(self) -> DataContract {
372
+ self.inner
373
+ }
374
+
375
+ fn inner(&self) -> &DataContract {
376
+ &self.inner
377
+ }
378
+
379
+ fn inner_mut(&mut self) -> &mut DataContract {
380
+ &mut self.inner
381
+ }
382
+ }
383
+
384
+ impl DataContractWasm {
385
+ pub fn inner(&self) -> &DataContract {
386
+ &self.inner
387
+ }
388
+ }
389
+
336
390
  #[wasm_bindgen(js_name=DataContractDefaults)]
337
391
  pub struct DataContractDefaults;
338
392
 
@@ -343,12 +397,3 @@ impl DataContractDefaults {
343
397
  SCHEMA_URI.to_string()
344
398
  }
345
399
  }
346
-
347
- impl DataContractWasm {
348
- pub fn inner(&self) -> &DataContract {
349
- &self.0
350
- }
351
- }
352
-
353
- #[test]
354
- fn test_query_many() {}
@@ -1,10 +1,11 @@
1
1
  use crate::errors::protocol_error::from_protocol_error;
2
+ use std::convert::TryFrom;
2
3
 
3
4
  use crate::{
4
5
  js_value_to_data_contract_value, DataContractCreateTransitionWasm,
5
6
  DataContractUpdateTransitionWasm, DataContractWasm,
6
7
  };
7
- use dpp::data_contract::{DataContract, DataContractFacade};
8
+ use dpp::data_contract::{CreatedDataContract, DataContract, DataContractFacade};
8
9
  use dpp::identifier::Identifier;
9
10
  use dpp::version::ProtocolVersionValidator;
10
11
 
@@ -114,7 +115,9 @@ impl DataContractFacadeWasm {
114
115
  data_contract: &DataContractWasm,
115
116
  ) -> Result<DataContractCreateTransitionWasm, JsValue> {
116
117
  self.0
117
- .create_data_contract_create_transition(data_contract.clone().into())
118
+ .create_data_contract_create_transition(
119
+ CreatedDataContract::try_from(data_contract).with_js_error()?,
120
+ )
118
121
  .map(DataContractCreateTransitionWasm::from)
119
122
  .with_js_error()
120
123
  }
@@ -84,11 +84,6 @@ impl DataContractUpdateTransitionWasm {
84
84
  self.0.protocol_version
85
85
  }
86
86
 
87
- #[wasm_bindgen(js_name=getEntropy)]
88
- pub fn get_entropy(&self) -> Buffer {
89
- Buffer::from_bytes_owned(self.0.data_contract.entropy.to_vec())
90
- }
91
-
92
87
  #[wasm_bindgen(js_name=getOwnerId)]
93
88
  pub fn get_owner_id(&self) -> IdentifierWrapper {
94
89
  (*self.0.get_owner_id()).into()
@@ -1,5 +1,7 @@
1
+ use std::convert::TryFrom;
1
2
  use std::sync::Arc;
2
3
 
4
+ use dpp::data_contract::CreatedDataContract;
3
5
  use dpp::{
4
6
  data_contract::{
5
7
  validation::data_contract_validator::DataContractValidator, DataContractFactory,
@@ -156,7 +158,9 @@ impl DataContractFactoryWasm {
156
158
  data_contract: &DataContractWasm,
157
159
  ) -> Result<DataContractCreateTransitionWasm, JsValue> {
158
160
  self.0
159
- .create_data_contract_create_transition(data_contract.clone().into())
161
+ .create_data_contract_create_transition(
162
+ CreatedDataContract::try_from(data_contract).with_js_error()?,
163
+ )
160
164
  .map(Into::into)
161
165
  .with_js_error()
162
166
  }
@@ -89,6 +89,18 @@ impl DocumentFacadeWasm {
89
89
  .await
90
90
  }
91
91
 
92
+ // TODO(rs-drive-abci): add tests
93
+ #[wasm_bindgen(js_name=createExtendedDocumentFromDocumentBuffer)]
94
+ pub fn create_extended_from_document_buffer(
95
+ &self,
96
+ buffer: Vec<u8>,
97
+ document_type: &str,
98
+ data_contract: &DataContractWasm,
99
+ ) -> Result<ExtendedDocumentWasm, JsValue> {
100
+ self.factory
101
+ .create_extended_from_document_buffer(buffer, document_type, data_contract)
102
+ }
103
+
92
104
  /// Creates Documents State Transition
93
105
  #[wasm_bindgen(js_name=createStateTransition)]
94
106
  pub fn create_state_transition(
@@ -212,6 +212,23 @@ impl DocumentFactoryWASM {
212
212
 
213
213
  Ok(document.into())
214
214
  }
215
+
216
+ #[wasm_bindgen(js_name=createExtendedDocumentFromDocumentBuffer)]
217
+ pub fn create_extended_from_document_buffer(
218
+ &self,
219
+ buffer: Vec<u8>,
220
+ document_type: &str,
221
+ data_contract: &DataContractWasm,
222
+ ) -> Result<ExtendedDocumentWasm, JsValue> {
223
+ self.0
224
+ .create_extended_from_document_buffer(
225
+ buffer.as_slice(),
226
+ document_type,
227
+ &data_contract.to_owned().into(),
228
+ )
229
+ .map(|document| document.into())
230
+ .with_js_error()
231
+ }
215
232
  }
216
233
 
217
234
  fn extract_documents_by_action(
@@ -238,7 +238,7 @@ impl DocumentWasm {
238
238
  let mut value = self.0.to_object().with_js_error()?;
239
239
 
240
240
  let (identifiers_paths, binary_paths) =
241
- Document::get_identifiers_and_binary_paths(&data_contract.0, document_type_name)
241
+ Document::get_identifiers_and_binary_paths(data_contract.inner(), document_type_name)
242
242
  .with_js_error()?;
243
243
  let serializer = serde_wasm_bindgen::Serializer::json_compatible();
244
244
  let js_value = value.serialize(&serializer)?;
@@ -287,12 +287,12 @@ impl DocumentWasm {
287
287
  document_type_name: String,
288
288
  ) -> Result<Buffer, JsValue> {
289
289
  let document_type = data_contract
290
- .0
290
+ .inner()
291
291
  .document_type_for_name(document_type_name.as_str())
292
292
  .with_js_error()?;
293
293
  let bytes = self
294
294
  .0
295
- .hash(&data_contract.0, document_type)
295
+ .hash(data_contract.inner(), document_type)
296
296
  .with_js_error()?;
297
297
  Ok(Buffer::from_bytes(&bytes))
298
298
  }
@@ -311,7 +311,7 @@ impl DocumentWasm {
311
311
  document_type_name: String,
312
312
  ) -> BinaryType {
313
313
  let maybe_binary_properties = data_contract
314
- .0
314
+ .inner()
315
315
  .get_binary_properties(document_type_name.as_str());
316
316
 
317
317
  if let Ok(binary_properties) = maybe_binary_properties {
@@ -115,6 +115,8 @@ use crate::errors::consensus::fee::BalanceIsNotEnoughErrorWasm;
115
115
  use crate::errors::consensus::state::data_contract::data_trigger::DataTriggerInvalidResultErrorWasm;
116
116
  use crate::errors::consensus::value_error::ValueErrorWasm;
117
117
 
118
+ use super::state::document::DocumentTimestampsAreEqualErrorWasm;
119
+
118
120
  pub fn from_consensus_error_ref(e: &DPPConsensusError) -> JsValue {
119
121
  match e {
120
122
  DPPConsensusError::FeeError(e) => match e {
@@ -197,6 +199,9 @@ pub fn from_state_error(state_error: &StateError) -> JsValue {
197
199
  let wasm_error: IdentityInsufficientBalanceErrorWasm = e.into();
198
200
  wasm_error.into()
199
201
  }
202
+ StateError::DocumentTimestampsAreEqualError(e) => {
203
+ DocumentTimestampsAreEqualErrorWasm::from(e).into()
204
+ }
200
205
  }
201
206
  }
202
207
 
@@ -0,0 +1,42 @@
1
+ use crate::buffer::Buffer;
2
+ use dpp::consensus::codes::ErrorWithCode;
3
+ use dpp::consensus::state::document::document_timestamps_are_equal_error::DocumentTimestampsAreEqualError;
4
+ use dpp::consensus::ConsensusError;
5
+ use wasm_bindgen::prelude::*;
6
+
7
+ #[wasm_bindgen(js_name=DocumentTimestampsAreEqualError)]
8
+ pub struct DocumentTimestampsAreEqualErrorWasm {
9
+ inner: DocumentTimestampsAreEqualError,
10
+ }
11
+
12
+ impl From<&DocumentTimestampsAreEqualError> for DocumentTimestampsAreEqualErrorWasm {
13
+ fn from(e: &DocumentTimestampsAreEqualError) -> Self {
14
+ Self { inner: e.clone() }
15
+ }
16
+ }
17
+ #[wasm_bindgen(js_class=DocumentTimestampsAreEqualError)]
18
+ impl DocumentTimestampsAreEqualErrorWasm {
19
+ #[wasm_bindgen(js_name=getDocumentId)]
20
+ pub fn document_id(&self) -> Buffer {
21
+ Buffer::from_bytes(self.inner.document_id().as_bytes())
22
+ }
23
+
24
+ #[wasm_bindgen(js_name=getCode)]
25
+ pub fn get_code(&self) -> u32 {
26
+ ConsensusError::from(self.inner.clone()).code()
27
+ }
28
+
29
+ #[wasm_bindgen(getter)]
30
+ pub fn message(&self) -> String {
31
+ self.inner.to_string()
32
+ }
33
+
34
+ #[wasm_bindgen(js_name=serialize)]
35
+ pub fn serialize(&self) -> Result<Buffer, JsError> {
36
+ let bytes = ConsensusError::from(self.inner.clone())
37
+ .serialize()
38
+ .map_err(|e| JsError::from(e))?;
39
+
40
+ Ok(Buffer::from_bytes(bytes.as_slice()))
41
+ }
42
+ }
@@ -2,6 +2,7 @@ mod document_already_present_error;
2
2
  mod document_not_found_error;
3
3
  mod document_owner_id_mismatch_error;
4
4
  mod document_timestamp_window_violation_error;
5
+ mod document_timestamps_are_equal_error;
5
6
  mod document_timestamps_mismatch_error;
6
7
  mod duplicate_unique_index_error;
7
8
  mod invalid_document_revision_error;
@@ -10,6 +11,7 @@ pub use document_already_present_error::*;
10
11
  pub use document_not_found_error::*;
11
12
  pub use document_owner_id_mismatch_error::*;
12
13
  pub use document_timestamp_window_violation_error::*;
14
+ pub use document_timestamps_are_equal_error::*;
13
15
  pub use document_timestamps_mismatch_error::*;
14
16
  pub use duplicate_unique_index_error::*;
15
17
  pub use invalid_document_revision_error::*;