@dcl/content-validator 5.2.1-9716169795.commit-20a4b3d → 5.3.0
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.
- package/dist/utils.d.ts +4 -0
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +12 -1
- package/dist/utils.js.map +1 -1
- package/dist/validations/access/on-chain/third-party-asset.d.ts.map +1 -1
- package/dist/validations/access/on-chain/third-party-asset.js +3 -11
- package/dist/validations/access/on-chain/third-party-asset.js.map +1 -1
- package/dist/validations/access/subgraph/third-party-asset.d.ts.map +1 -1
- package/dist/validations/access/subgraph/third-party-asset.js +4 -12
- package/dist/validations/access/subgraph/third-party-asset.js.map +1 -1
- package/dist/validations/items/wearables.d.ts +2 -1
- package/dist/validations/items/wearables.d.ts.map +1 -1
- package/dist/validations/items/wearables.js +37 -3
- package/dist/validations/items/wearables.js.map +1 -1
- package/package.json +2 -2
package/dist/utils.d.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { BlockchainCollectionThirdParty } from '@dcl/urn-resolver';
|
|
1
3
|
type URNsByNetwork = {
|
|
2
4
|
ethereum: {
|
|
3
5
|
urn: string;
|
|
@@ -9,5 +11,7 @@ type URNsByNetwork = {
|
|
|
9
11
|
}[];
|
|
10
12
|
};
|
|
11
13
|
export declare function splitItemsURNsByNetwork(urnsToSplit: string[]): Promise<URNsByNetwork>;
|
|
14
|
+
export declare function getThirdPartyId(urn: BlockchainCollectionThirdParty): string;
|
|
15
|
+
export declare function toHexBuffer(value: string): Buffer;
|
|
12
16
|
export {};
|
|
13
17
|
//# sourceMappingURL=utils.d.ts.map
|
package/dist/utils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,8BAA8B,EAAY,MAAM,mBAAmB,CAAA;AAG5E,KAAK,aAAa,GAAG;IACnB,QAAQ,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;IACzC,KAAK,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;CACvC,CAAA;AASD,wBAAsB,uBAAuB,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,aAAa,CAAC,CA0B3F;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,8BAA8B,GAAG,MAAM,CAE3E;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAKjD"}
|
package/dist/utils.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.splitItemsURNsByNetwork = void 0;
|
|
3
|
+
exports.toHexBuffer = exports.getThirdPartyId = exports.splitItemsURNsByNetwork = void 0;
|
|
4
4
|
const urn_resolver_1 = require("@dcl/urn-resolver");
|
|
5
5
|
const types_1 = require("./types");
|
|
6
6
|
const ITEM_TYPES_TO_SPLIT = [
|
|
@@ -35,4 +35,15 @@ async function splitItemsURNsByNetwork(urnsToSplit) {
|
|
|
35
35
|
};
|
|
36
36
|
}
|
|
37
37
|
exports.splitItemsURNsByNetwork = splitItemsURNsByNetwork;
|
|
38
|
+
function getThirdPartyId(urn) {
|
|
39
|
+
return `urn:decentraland:${urn.network}:collections-thirdparty:${urn.thirdPartyName}`;
|
|
40
|
+
}
|
|
41
|
+
exports.getThirdPartyId = getThirdPartyId;
|
|
42
|
+
function toHexBuffer(value) {
|
|
43
|
+
if (value.startsWith('0x')) {
|
|
44
|
+
return Buffer.from(value.substring(2), 'hex'); // removing first 2 characters (0x)
|
|
45
|
+
}
|
|
46
|
+
return Buffer.from(value, 'hex');
|
|
47
|
+
}
|
|
48
|
+
exports.toHexBuffer = toHexBuffer;
|
|
38
49
|
//# sourceMappingURL=utils.js.map
|
package/dist/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":";;;AAAA,oDAA4E;AAC5E,mCAAkD;AAOlD,MAAM,mBAAmB,GAAG;IAC1B,gCAAgC;IAChC,+BAA+B;IAC/B,gCAAgC;IAChC,+BAA+B;CAChC,CAAA;AAEM,KAAK,UAAU,uBAAuB,CAAC,WAAqB;IACjE,MAAM,QAAQ,GAAoC,EAAE,CAAA;IACpD,MAAM,KAAK,GAAoC,EAAE,CAAA;IACjD,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE;QAC7B,kCAAkC;QAClC,iFAAiF;QACjF,IACE,CAAC,CAAC,GAAG,mBAAW,EAAE,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YACtE,CAAC,mBAAW,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,EACrD;YACA,SAAQ;SACT;QAED,MAAM,MAAM,GAAG,MAAM,IAAA,uBAAQ,EAAC,GAAG,CAAC,CAAA;QAClC,IAAI,MAAM,IAAI,SAAS,IAAI,MAAM,IAAI,mBAAmB,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;YAC9E,IAAI,mBAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE;gBACxC,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAA;aAC1C;iBAAM,IAAI,mBAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE;gBAC/C,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAA;aACvC;SACF;KACF;IACD,OAAO;QACL,QAAQ;QACR,KAAK;KACN,CAAA;AACH,CAAC;AA1BD,0DA0BC;AAED,SAAgB,eAAe,CAAC,GAAmC;IACjE,OAAO,oBAAoB,GAAG,CAAC,OAAO,2BAA2B,GAAG,CAAC,cAAc,EAAE,CAAA;AACvF,CAAC;AAFD,0CAEC;AAED,SAAgB,WAAW,CAAC,KAAa;IACvC,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE;QAC1B,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA,CAAC,mCAAmC;KAClF;IACD,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;AAClC,CAAC;AALD,kCAKC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"third-party-asset.d.ts","sourceRoot":"","sources":["../../../../src/validations/access/on-chain/third-party-asset.ts"],"names":[],"mappings":"AAGA,OAAO,EAGL,8BAA8B,EAC9B,yBAAyB,EAE1B,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"third-party-asset.d.ts","sourceRoot":"","sources":["../../../../src/validations/access/on-chain/third-party-asset.ts"],"names":[],"mappings":"AAGA,OAAO,EAGL,8BAA8B,EAC9B,yBAAyB,EAE1B,MAAM,gBAAgB,CAAA;AAGvB,wBAAgB,+BAA+B,CAC7C,UAAU,EAAE,IAAI,CAAC,8BAA8B,EAAE,eAAe,GAAG,MAAM,GAAG,QAAQ,GAAG,IAAI,CAAC,GAC3F,yBAAyB,CA4C3B"}
|
|
@@ -4,15 +4,7 @@ exports.createThirdPartyAssetValidateFn = void 0;
|
|
|
4
4
|
const content_hash_tree_1 = require("@dcl/content-hash-tree");
|
|
5
5
|
const schemas_1 = require("@dcl/schemas");
|
|
6
6
|
const types_1 = require("../../../types");
|
|
7
|
-
|
|
8
|
-
if (value.startsWith('0x')) {
|
|
9
|
-
return Buffer.from(value.substring(2), 'hex'); // removing first 2 characters (0x)
|
|
10
|
-
}
|
|
11
|
-
return Buffer.from(value, 'hex');
|
|
12
|
-
}
|
|
13
|
-
function getThirdPartyId(urn) {
|
|
14
|
-
return `urn:decentraland:${urn.network}:collections-thirdparty:${urn.thirdPartyName}`;
|
|
15
|
-
}
|
|
7
|
+
const utils_1 = require("../../../utils");
|
|
16
8
|
function createThirdPartyAssetValidateFn(components) {
|
|
17
9
|
return async function validateFn(asset, deployment) {
|
|
18
10
|
const logger = components.logs.getLogger('third-party-asset-validation');
|
|
@@ -23,8 +15,8 @@ function createThirdPartyAssetValidateFn(components) {
|
|
|
23
15
|
// This should always happen as the metadata validation ran before
|
|
24
16
|
const metadata = deployment.entity.metadata;
|
|
25
17
|
const merkleProof = metadata.merkleProof;
|
|
26
|
-
const thirdPartyId = getThirdPartyId(asset);
|
|
27
|
-
const bufferedProofs = merkleProof.proof.map((value) => toHexBuffer(value));
|
|
18
|
+
const thirdPartyId = (0, utils_1.getThirdPartyId)(asset);
|
|
19
|
+
const bufferedProofs = merkleProof.proof.map((value) => (0, utils_1.toHexBuffer)(value));
|
|
28
20
|
const root = (0, content_hash_tree_1.generateRoot)(merkleProof.index, merkleProof.entityHash, bufferedProofs);
|
|
29
21
|
const { blockNumberAtDeployment, blockNumberFiveMinBeforeDeployment } = await components.client.findBlocksForTimestamp(timestamp, components.L2.blockSearch);
|
|
30
22
|
const validateThirdParty = async (block) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"third-party-asset.js","sourceRoot":"","sources":["../../../../src/validations/access/on-chain/third-party-asset.ts"],"names":[],"mappings":";;;AAAA,8DAAqD;AACrD,0CAA4D;AAE5D,0CAMuB;
|
|
1
|
+
{"version":3,"file":"third-party-asset.js","sourceRoot":"","sources":["../../../../src/validations/access/on-chain/third-party-asset.ts"],"names":[],"mappings":";;;AAAA,8DAAqD;AACrD,0CAA4D;AAE5D,0CAMuB;AACvB,0CAA6D;AAE7D,SAAgB,+BAA+B,CAC7C,UAA4F;IAE5F,OAAO,KAAK,UAAU,UAAU,CAAC,KAAqC,EAAE,UAAgC;QACtG,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,8BAA8B,CAAC,CAAA;QACxE,MAAM,EAAE,OAAO,EAAE,GAAG,UAAU,CAAC,EAAE,CAAA;QAEjC,MAAM,EAAE,SAAS,EAAE,GAAG,UAAU,CAAC,MAAM,CAAA;QACvC,IAAI,QAAQ,GAAG,KAAK,CAAA;QAEpB,IAAI,IAAA,sBAAY,EAAC,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE;YAC5C,kEAAkE;YAClE,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,CAAC,QAA2B,CAAA;YAC9D,MAAM,WAAW,GAAG,QAAQ,CAAC,WAAW,CAAA;YAExC,MAAM,YAAY,GAAG,IAAA,uBAAe,EAAC,KAAK,CAAC,CAAA;YAE3C,MAAM,cAAc,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAA,mBAAW,EAAC,KAAK,CAAC,CAAC,CAAA;YAC3E,MAAM,IAAI,GAAG,IAAA,gCAAY,EAAC,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,UAAU,EAAE,cAAc,CAAC,CAAA;YAEpF,MAAM,EAAE,uBAAuB,EAAE,kCAAkC,EAAE,GACnE,MAAM,UAAU,CAAC,MAAM,CAAC,sBAAsB,CAAC,SAAS,EAAE,UAAU,CAAC,EAAE,CAAC,WAAW,CAAC,CAAA;YAEtF,MAAM,kBAAkB,GAAG,KAAK,EAAE,KAAa,EAAE,EAAE;gBACjD,IAAI;oBACF,OAAO,MAAM,OAAO,CAAC,kBAAkB,CAAC,YAAY,EAAE,IAAI,EAAE,KAAK,CAAC,CAAA;iBACnE;gBAAC,OAAO,GAAQ,EAAE;oBACjB,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;oBAChB,OAAO,KAAK,CAAA;iBACb;YACH,CAAC,CAAA;YAED,IAAI,uBAAuB,EAAE;gBAC3B,QAAQ,GAAG,MAAM,kBAAkB,CAAC,uBAAuB,CAAC,CAAA;aAC7D;YAED,IAAI,CAAC,QAAQ,IAAI,kCAAkC,EAAE;gBACnD,QAAQ,GAAG,MAAM,kBAAkB,CAAC,kCAAkC,CAAC,CAAA;aACxE;SACF;QAED,IAAI,CAAC,QAAQ,EAAE;YACb,OAAO,IAAA,wBAAgB,EAAC,uCAAuC,CAAC,CAAA;SACjE;QACD,OAAO,UAAE,CAAA;IACX,CAAC,CAAA;AACH,CAAC;AA9CD,0EA8CC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"third-party-asset.d.ts","sourceRoot":"","sources":["../../../../src/validations/access/subgraph/third-party-asset.ts"],"names":[],"mappings":"AAKA,OAAO,EAGL,+BAA+B,EAC/B,yBAAyB,EAE1B,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"third-party-asset.d.ts","sourceRoot":"","sources":["../../../../src/validations/access/subgraph/third-party-asset.ts"],"names":[],"mappings":"AAKA,OAAO,EAGL,+BAA+B,EAC/B,yBAAyB,EAE1B,MAAM,gBAAgB,CAAA;AAuGvB,wBAAgB,+BAA+B,CAC7C,UAAU,EAAE,IAAI,CAAC,+BAA+B,EAAE,eAAe,GAAG,MAAM,GAAG,gBAAgB,GAAG,WAAW,CAAC,GAC3G,yBAAyB,CAU3B"}
|
|
@@ -5,15 +5,7 @@ const content_hash_tree_1 = require("@dcl/content-hash-tree");
|
|
|
5
5
|
const hashing_1 = require("@dcl/hashing");
|
|
6
6
|
const schemas_1 = require("@dcl/schemas");
|
|
7
7
|
const types_1 = require("../../../types");
|
|
8
|
-
|
|
9
|
-
if (value.startsWith('0x')) {
|
|
10
|
-
return Buffer.from(value.substring(2), 'hex'); // removing first 2 characters (0x)
|
|
11
|
-
}
|
|
12
|
-
return Buffer.from(value, 'hex');
|
|
13
|
-
}
|
|
14
|
-
function getThirdPartyId(urn) {
|
|
15
|
-
return `urn:decentraland:${urn.network}:collections-thirdparty:${urn.thirdPartyName}`;
|
|
16
|
-
}
|
|
8
|
+
const utils_1 = require("../../../utils");
|
|
17
9
|
async function verifyHash(metadata, merkleRoot, logger) {
|
|
18
10
|
if (!schemas_1.MerkleProof.validate(metadata.merkleProof)) {
|
|
19
11
|
logger.debug('Merkle proof is not valid', {
|
|
@@ -32,8 +24,8 @@ async function verifyHash(metadata, merkleRoot, logger) {
|
|
|
32
24
|
return false;
|
|
33
25
|
}
|
|
34
26
|
// Verify if the entity belongs to the Merkle Tree.
|
|
35
|
-
const bufferedProofs = merkleProof.proof.map((value) => toHexBuffer(value));
|
|
36
|
-
const bufferedMerkleRoot = toHexBuffer(merkleRoot);
|
|
27
|
+
const bufferedProofs = merkleProof.proof.map((value) => (0, utils_1.toHexBuffer)(value));
|
|
28
|
+
const bufferedMerkleRoot = (0, utils_1.toHexBuffer)(merkleRoot);
|
|
37
29
|
return (0, content_hash_tree_1.verifyProof)(merkleProof.index, merkleProof.entityHash, bufferedProofs, bufferedMerkleRoot);
|
|
38
30
|
}
|
|
39
31
|
async function getMerkleRoot(components, block, thirdPartyId) {
|
|
@@ -58,7 +50,7 @@ async function verifyMerkleProofedEntity(components, urn, deployment, logger) {
|
|
|
58
50
|
// This should never happen as the metadata validation ran before
|
|
59
51
|
return false;
|
|
60
52
|
}
|
|
61
|
-
const thirdPartyId = getThirdPartyId(urn);
|
|
53
|
+
const thirdPartyId = (0, utils_1.getThirdPartyId)(urn);
|
|
62
54
|
const { blockNumberAtDeployment, blockNumberFiveMinBeforeDeployment } = await components.theGraphClient.findBlocksForTimestamp(components.subGraphs.L2.blocks, deployment.entity.timestamp);
|
|
63
55
|
const merkleRoots = [];
|
|
64
56
|
const hasPermissionOnBlock = async (blockNumber) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"third-party-asset.js","sourceRoot":"","sources":["../../../../src/validations/access/subgraph/third-party-asset.ts"],"names":[],"mappings":";;;AAAA,8DAAoD;AACpD,0CAA4C;AAC5C,0CAAyE;AAGzE,0CAMuB;
|
|
1
|
+
{"version":3,"file":"third-party-asset.js","sourceRoot":"","sources":["../../../../src/validations/access/subgraph/third-party-asset.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,9 +2,10 @@ import { DeploymentToValidate } from '../..';
|
|
|
2
2
|
import { ValidationResponse } from '../../types';
|
|
3
3
|
/** Validate wearable representations are referencing valid content */
|
|
4
4
|
export declare function wearableRepresentationContentValidateFn(deployment: DeploymentToValidate): Promise<ValidationResponse>;
|
|
5
|
+
export declare function thirdPartyWearableMerkleProofContentValidateFn(deployment: DeploymentToValidate): Promise<ValidationResponse>;
|
|
5
6
|
/**
|
|
6
7
|
* Validate that given wearable deployment includes the thumbnail and doesn't exceed file sizes
|
|
7
|
-
*
|
|
8
|
+
* @public
|
|
8
9
|
*/
|
|
9
10
|
export declare const wearableValidateFn: import("../..").ValidateFn;
|
|
10
11
|
//# sourceMappingURL=wearables.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wearables.d.ts","sourceRoot":"","sources":["../../../src/validations/items/wearables.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAA;AAC5C,OAAO,EAAwB,kBAAkB,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"wearables.d.ts","sourceRoot":"","sources":["../../../src/validations/items/wearables.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAA;AAC5C,OAAO,EAAwB,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAItE,sEAAsE;AACtE,wBAAsB,uCAAuC,CAC3D,UAAU,EAAE,oBAAoB,GAC/B,OAAO,CAAC,kBAAkB,CAAC,CAe7B;AAED,wBAAsB,8CAA8C,CAClE,UAAU,EAAE,oBAAoB,GAC/B,OAAO,CAAC,kBAAkB,CAAC,CAwC7B;AAED;;;GAGG;AACH,eAAO,MAAM,kBAAkB,4BAG9B,CAAA"}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.wearableValidateFn = exports.wearableRepresentationContentValidateFn = void 0;
|
|
3
|
+
exports.wearableValidateFn = exports.thirdPartyWearableMerkleProofContentValidateFn = exports.wearableRepresentationContentValidateFn = void 0;
|
|
4
4
|
const schemas_1 = require("@dcl/schemas");
|
|
5
5
|
const types_1 = require("../../types");
|
|
6
6
|
const validations_1 = require("../validations");
|
|
7
|
+
const hashing_1 = require("@dcl/hashing");
|
|
7
8
|
/** Validate wearable representations are referencing valid content */
|
|
8
9
|
async function wearableRepresentationContentValidateFn(deployment) {
|
|
9
10
|
const { entity } = deployment;
|
|
@@ -23,9 +24,42 @@ async function wearableRepresentationContentValidateFn(deployment) {
|
|
|
23
24
|
return types_1.OK;
|
|
24
25
|
}
|
|
25
26
|
exports.wearableRepresentationContentValidateFn = wearableRepresentationContentValidateFn;
|
|
27
|
+
async function thirdPartyWearableMerkleProofContentValidateFn(deployment) {
|
|
28
|
+
const { entity } = deployment;
|
|
29
|
+
if (!(0, schemas_1.isThirdParty)(entity.metadata)) {
|
|
30
|
+
return types_1.OK;
|
|
31
|
+
}
|
|
32
|
+
const wearableMetadata = entity.metadata;
|
|
33
|
+
// Check the id in the metadata matches the pointer being deployed
|
|
34
|
+
if (wearableMetadata.id !== entity.pointers[0]) {
|
|
35
|
+
return (0, types_1.validationFailed)(`The id '${wearableMetadata.id}' does not match the pointer '${entity.pointers[0]}'`);
|
|
36
|
+
}
|
|
37
|
+
// Check the content files declared inside the metadata is exactly the same as the files uploaded with the entity
|
|
38
|
+
const allContentInFiles = Object.keys(wearableMetadata.content).every((content) => {
|
|
39
|
+
const contentFile = entity.content.find((file) => file.file === content);
|
|
40
|
+
if (!contentFile) {
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
return contentFile.hash === wearableMetadata.content[content];
|
|
44
|
+
});
|
|
45
|
+
const allFilesInContent = entity.content.every((content) => {
|
|
46
|
+
return wearableMetadata.content[content.file] === content.hash;
|
|
47
|
+
});
|
|
48
|
+
if (!allContentInFiles || !allFilesInContent) {
|
|
49
|
+
return (0, types_1.validationFailed)('The content declared in the metadata does not match the files uploaded with the entity');
|
|
50
|
+
}
|
|
51
|
+
// Re-create the entity hash and check it matches the one provided in the metadata
|
|
52
|
+
const merkleProof = wearableMetadata.merkleProof;
|
|
53
|
+
const entityHash = (0, hashing_1.keccak256Hash)(wearableMetadata, merkleProof.hashingKeys);
|
|
54
|
+
if (entityHash !== merkleProof.entityHash) {
|
|
55
|
+
return (0, types_1.validationFailed)(`The entity hash provided '${merkleProof.entityHash}' is different to the one calculated from the metadata '${entityHash}'`);
|
|
56
|
+
}
|
|
57
|
+
return types_1.OK;
|
|
58
|
+
}
|
|
59
|
+
exports.thirdPartyWearableMerkleProofContentValidateFn = thirdPartyWearableMerkleProofContentValidateFn;
|
|
26
60
|
/**
|
|
27
61
|
* Validate that given wearable deployment includes the thumbnail and doesn't exceed file sizes
|
|
28
|
-
*
|
|
62
|
+
* @public
|
|
29
63
|
*/
|
|
30
|
-
exports.wearableValidateFn = (0, validations_1.validateIfTypeMatches)(schemas_1.EntityType.WEARABLE, wearableRepresentationContentValidateFn);
|
|
64
|
+
exports.wearableValidateFn = (0, validations_1.validateIfTypeMatches)(schemas_1.EntityType.WEARABLE, (0, validations_1.validateAll)(wearableRepresentationContentValidateFn, thirdPartyWearableMerkleProofContentValidateFn));
|
|
31
65
|
//# sourceMappingURL=wearables.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wearables.js","sourceRoot":"","sources":["../../../src/validations/items/wearables.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"wearables.js","sourceRoot":"","sources":["../../../src/validations/items/wearables.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dcl/content-validator",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.3.0",
|
|
4
4
|
"description": "Catalyst content validations",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"typings": "dist/index.d.ts",
|
|
@@ -53,5 +53,5 @@
|
|
|
53
53
|
"files": [
|
|
54
54
|
"dist"
|
|
55
55
|
],
|
|
56
|
-
"commit": "
|
|
56
|
+
"commit": "5ea1ac534fa13793c0724e43910b9ee4e15d9127"
|
|
57
57
|
}
|