@dcl/content-validator 2.2.2-20220706142436.commit-799369b → 2.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/content-validator.api.json +4 -13
- package/dist/the-graph-client/the-graph-client.d.ts.map +1 -1
- package/dist/the-graph-client/the-graph-client.js +31 -31
- package/dist/the-graph-client/the-graph-client.js.map +1 -1
- package/dist/types.d.ts +4 -5
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/validations/access-checker/profiles.d.ts +3 -4
- package/dist/validations/access-checker/profiles.d.ts.map +1 -1
- package/dist/validations/access-checker/profiles.js +65 -29
- package/dist/validations/access-checker/profiles.js.map +1 -1
- package/dist/validations/profile.d.ts +2 -0
- package/dist/validations/profile.d.ts.map +1 -1
- package/dist/validations/profile.js +39 -3
- package/dist/validations/profile.js.map +1 -1
- package/dist/validations/timestamps.d.ts +1 -1
- package/dist/validations/timestamps.js +2 -2
- package/package.json +3 -3
|
@@ -1022,7 +1022,7 @@
|
|
|
1022
1022
|
},
|
|
1023
1023
|
{
|
|
1024
1024
|
"kind": "Content",
|
|
1025
|
-
"text": "{\n
|
|
1025
|
+
"text": "{\n ownsNamesAtTimestamp: (ethAddress: "
|
|
1026
1026
|
},
|
|
1027
1027
|
{
|
|
1028
1028
|
"kind": "Reference",
|
|
@@ -1049,7 +1049,7 @@
|
|
|
1049
1049
|
},
|
|
1050
1050
|
{
|
|
1051
1051
|
"kind": "Content",
|
|
1052
|
-
"text": ">;\n
|
|
1052
|
+
"text": ">;\n ownsItemsAtTimestamp: (ethAddress: "
|
|
1053
1053
|
},
|
|
1054
1054
|
{
|
|
1055
1055
|
"kind": "Reference",
|
|
@@ -1058,16 +1058,7 @@
|
|
|
1058
1058
|
},
|
|
1059
1059
|
{
|
|
1060
1060
|
"kind": "Content",
|
|
1061
|
-
"text": ",
|
|
1062
|
-
},
|
|
1063
|
-
{
|
|
1064
|
-
"kind": "Reference",
|
|
1065
|
-
"text": "WearableId",
|
|
1066
|
-
"canonicalReference": "@dcl/schemas!WearableId:type"
|
|
1067
|
-
},
|
|
1068
|
-
{
|
|
1069
|
-
"kind": "Content",
|
|
1070
|
-
"text": "[], timestamp: number) => "
|
|
1061
|
+
"text": ", urnsToCheck: string[], timestamp: number) => "
|
|
1071
1062
|
},
|
|
1072
1063
|
{
|
|
1073
1064
|
"kind": "Reference",
|
|
@@ -1123,7 +1114,7 @@
|
|
|
1123
1114
|
"name": "TheGraphClient",
|
|
1124
1115
|
"typeTokenRange": {
|
|
1125
1116
|
"startIndex": 1,
|
|
1126
|
-
"endIndex":
|
|
1117
|
+
"endIndex": 20
|
|
1127
1118
|
}
|
|
1128
1119
|
},
|
|
1129
1120
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"the-graph-client.d.ts","sourceRoot":"","sources":["../../src/the-graph-client/the-graph-client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"the-graph-client.d.ts","sourceRoot":"","sources":["../../src/the-graph-client/the-graph-client.ts"],"names":[],"mappings":"AAGA,OAAO,EAAoB,0BAA0B,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AAEvF,oBAAY,gBAAgB,GAAG;IAC7B,MAAM,EAAE,OAAO,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;CACnB,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,oBAAoB,eACnB,KAAK,0BAA0B,EAAE,MAAM,GAAG,WAAW,CAAC,KACjE,cAgOF,CAAA"}
|
|
@@ -9,7 +9,7 @@ const createTheGraphClient = (components) => {
|
|
|
9
9
|
const logger = components.logs.getLogger('TheGraphClient');
|
|
10
10
|
const L1_NETWORKS = ['mainnet', 'ropsten', 'kovan', 'rinkeby', 'goerli'];
|
|
11
11
|
const L2_NETWORKS = ['matic', 'mumbai'];
|
|
12
|
-
const
|
|
12
|
+
const ownsNamesAtTimestamp = async (ethAddress, namesToCheck, timestamp) => {
|
|
13
13
|
if (namesToCheck.length === 0) {
|
|
14
14
|
return permissionOk();
|
|
15
15
|
}
|
|
@@ -47,19 +47,19 @@ const createTheGraphClient = (components) => {
|
|
|
47
47
|
}
|
|
48
48
|
return await hasPermissionOnBlock(blocks.blockNumberFiveMinBeforeDeployment);
|
|
49
49
|
};
|
|
50
|
-
const
|
|
50
|
+
const splitItemsByNetwork = async (urnsToCheck) => {
|
|
51
51
|
const ethereum = [];
|
|
52
52
|
const matic = [];
|
|
53
|
-
for (const
|
|
54
|
-
const parsed = await (0, urn_resolver_1.parseUrn)(
|
|
53
|
+
for (const urn of urnsToCheck) {
|
|
54
|
+
const parsed = await (0, urn_resolver_1.parseUrn)(urn);
|
|
55
55
|
if (parsed &&
|
|
56
56
|
'network' in parsed &&
|
|
57
57
|
['blockchain-collection-v1-asset', 'blockchain-collection-v2-asset'].includes(parsed.type)) {
|
|
58
58
|
if (L1_NETWORKS.includes(parsed.network)) {
|
|
59
|
-
ethereum.push(
|
|
59
|
+
ethereum.push(urn);
|
|
60
60
|
}
|
|
61
61
|
else if (L2_NETWORKS.includes(parsed.network)) {
|
|
62
|
-
matic.push(
|
|
62
|
+
matic.push(urn);
|
|
63
63
|
}
|
|
64
64
|
}
|
|
65
65
|
}
|
|
@@ -73,25 +73,25 @@ const createTheGraphClient = (components) => {
|
|
|
73
73
|
result: false,
|
|
74
74
|
failing: failing
|
|
75
75
|
});
|
|
76
|
-
const
|
|
77
|
-
if (
|
|
76
|
+
const ownsItemsAtTimestamp = async (ethAddress, urnsToCheck, timestamp) => {
|
|
77
|
+
if (urnsToCheck.length === 0) {
|
|
78
78
|
return permissionOk();
|
|
79
79
|
}
|
|
80
|
-
const { ethereum, matic } = await
|
|
81
|
-
const
|
|
82
|
-
const
|
|
83
|
-
const [
|
|
84
|
-
|
|
85
|
-
|
|
80
|
+
const { ethereum, matic } = await splitItemsByNetwork(urnsToCheck);
|
|
81
|
+
const ethereumItemsOwnersPromise = ownsItemsAtTimestampInBlockchain(ethAddress, ethereum, timestamp, components.subGraphs.L1.blocks, components.subGraphs.L1.collections);
|
|
82
|
+
const maticItemsOwnersPromise = ownsItemsAtTimestampInBlockchain(ethAddress, matic, timestamp, components.subGraphs.L2.blocks, components.subGraphs.L2.collections);
|
|
83
|
+
const [ethereumItemsOwnership, maticItemsOwnership] = await Promise.all([
|
|
84
|
+
ethereumItemsOwnersPromise,
|
|
85
|
+
maticItemsOwnersPromise
|
|
86
86
|
]);
|
|
87
|
-
if (
|
|
87
|
+
if (ethereumItemsOwnership.result && maticItemsOwnership.result)
|
|
88
88
|
return permissionOk();
|
|
89
89
|
else {
|
|
90
|
-
return permissionError([...(
|
|
90
|
+
return permissionError([...(ethereumItemsOwnership.failing ?? []), ...(maticItemsOwnership.failing ?? [])]);
|
|
91
91
|
}
|
|
92
92
|
};
|
|
93
|
-
const
|
|
94
|
-
if (
|
|
93
|
+
const ownsItemsAtTimestampInBlockchain = async (ethAddress, urnsToCheck, timestamp, blocksSubgraph, collectionsSubgraph) => {
|
|
94
|
+
if (urnsToCheck.length === 0) {
|
|
95
95
|
return permissionOk();
|
|
96
96
|
}
|
|
97
97
|
const blocks = await findBlocksForTimestamp(blocksSubgraph, timestamp);
|
|
@@ -99,26 +99,26 @@ const createTheGraphClient = (components) => {
|
|
|
99
99
|
if (!blockNumber) {
|
|
100
100
|
return permissionError();
|
|
101
101
|
}
|
|
102
|
-
const
|
|
102
|
+
const runOwnedItemsOnBlockQuery = async (blockNumber) => {
|
|
103
103
|
const query = {
|
|
104
|
-
description: 'check for
|
|
104
|
+
description: 'check for items ownership',
|
|
105
105
|
subgraph: collectionsSubgraph,
|
|
106
|
-
query:
|
|
107
|
-
mapper: (response) => new Set(response.
|
|
106
|
+
query: QUERY_ITEMS_FOR_ADDRESS_AT_BLOCK,
|
|
107
|
+
mapper: (response) => new Set(response.items.map(({ urn }) => urn))
|
|
108
108
|
};
|
|
109
109
|
return runQuery(query, {
|
|
110
110
|
block: blockNumber,
|
|
111
111
|
ethAddress,
|
|
112
|
-
urnList:
|
|
112
|
+
urnList: urnsToCheck
|
|
113
113
|
});
|
|
114
114
|
};
|
|
115
115
|
try {
|
|
116
|
-
const
|
|
117
|
-
const notOwned =
|
|
116
|
+
const ownedItems = await runOwnedItemsOnBlockQuery(blockNumber);
|
|
117
|
+
const notOwned = urnsToCheck.filter((name) => !ownedItems.has(name));
|
|
118
118
|
return notOwned.length > 0 ? permissionError(notOwned) : permissionOk();
|
|
119
119
|
}
|
|
120
120
|
catch (error) {
|
|
121
|
-
logger.error(`Error retrieving
|
|
121
|
+
logger.error(`Error retrieving items owned by address ${ethAddress} at block ${blocks.blockNumberAtDeployment}`);
|
|
122
122
|
return permissionError();
|
|
123
123
|
}
|
|
124
124
|
};
|
|
@@ -159,8 +159,8 @@ const createTheGraphClient = (components) => {
|
|
|
159
159
|
});
|
|
160
160
|
};
|
|
161
161
|
return {
|
|
162
|
-
|
|
163
|
-
|
|
162
|
+
ownsNamesAtTimestamp,
|
|
163
|
+
ownsItemsAtTimestamp,
|
|
164
164
|
findBlocksForTimestamp
|
|
165
165
|
};
|
|
166
166
|
};
|
|
@@ -194,9 +194,9 @@ query getNftNamesForBlock($block: Int!, $ethAddress: String!, $nameList: [String
|
|
|
194
194
|
name
|
|
195
195
|
}
|
|
196
196
|
}`;
|
|
197
|
-
const
|
|
198
|
-
query
|
|
199
|
-
|
|
197
|
+
const QUERY_ITEMS_FOR_ADDRESS_AT_BLOCK = `
|
|
198
|
+
query getNftItemsForBlock($block: Int!, $ethAddress: String!, $urnList: [String!]) {
|
|
199
|
+
items: nfts(
|
|
200
200
|
block: {number: $block}
|
|
201
201
|
where: {owner: $ethAddress, searchItemType_in: ["wearable_v1", "wearable_v2", "smart_wearable_v1", "emote_v1"] urn_in: $urnList}
|
|
202
202
|
first: 1000
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"the-graph-client.js","sourceRoot":"","sources":["../../src/the-graph-client/the-graph-client.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"the-graph-client.js","sourceRoot":"","sources":["../../src/the-graph-client/the-graph-client.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
import { AuthChain, Entity, EthAddress
|
|
1
|
+
import { AuthChain, Entity, EthAddress } from '@dcl/schemas';
|
|
2
2
|
import { ILoggerComponent } from '@well-known-components/interfaces';
|
|
3
|
+
import { ISubgraphComponent, Variables } from '@well-known-components/thegraph-component';
|
|
3
4
|
import { PermissionResult } from './the-graph-client/the-graph-client';
|
|
4
|
-
import { ISubgraphComponent } from '@well-known-components/thegraph-component';
|
|
5
|
-
import { Variables } from '@well-known-components/thegraph-component';
|
|
6
5
|
/**
|
|
7
6
|
* @public
|
|
8
7
|
*/
|
|
@@ -116,8 +115,8 @@ export declare type SubGraphs = {
|
|
|
116
115
|
* @public
|
|
117
116
|
*/
|
|
118
117
|
export declare type TheGraphClient = {
|
|
119
|
-
|
|
120
|
-
|
|
118
|
+
ownsNamesAtTimestamp: (ethAddress: EthAddress, namesToCheck: string[], timestamp: number) => Promise<PermissionResult>;
|
|
119
|
+
ownsItemsAtTimestamp: (ethAddress: EthAddress, urnsToCheck: string[], timestamp: number) => Promise<PermissionResult>;
|
|
121
120
|
findBlocksForTimestamp: (subgraph: ISubgraphComponent, timestamp: number) => Promise<BlockInformation>;
|
|
122
121
|
};
|
|
123
122
|
/**
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";;;AAsGA;;GAEG;AACU,QAAA,EAAE,GAAuB,EAAE,EAAE,EAAE,IAAI,EAAE,CAAA;AAElD;;GAEG;AACI,MAAM,gBAAgB,GAAG,CAAC,GAAG,KAAe,EAAsB,EAAE,CAAC,CAAC;IAC3E,EAAE,EAAE,KAAK;IACT,MAAM,EAAE,KAAK;CACd,CAAC,CAAA;AAHW,QAAA,gBAAgB,oBAG3B;AAEF;;GAEG;AACI,MAAM,UAAU,GAAG,CAAC,GAAG,MAAc,EAAsB,EAAE,CAAC,CAAC;IACpE,EAAE,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;CAC/C,CAAC,CAAA;AAHW,QAAA,UAAU,cAGrB"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { Validation } from '../../types';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
*/
|
|
2
|
+
export declare const pointerIsValid: Validation;
|
|
3
|
+
export declare const ownsNames: Validation;
|
|
4
|
+
export declare const ownsItems: Validation;
|
|
6
5
|
export declare const profiles: Validation;
|
|
7
6
|
//# sourceMappingURL=profiles.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"profiles.d.ts","sourceRoot":"","sources":["../../../src/validations/access-checker/profiles.ts"],"names":[],"mappings":"AAEA,OAAO,EAAM,UAAU,EAAoB,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"profiles.d.ts","sourceRoot":"","sources":["../../../src/validations/access-checker/profiles.ts"],"names":[],"mappings":"AAEA,OAAO,EAAM,UAAU,EAAoB,MAAM,aAAa,CAAA;AAK9D,eAAO,MAAM,cAAc,EAAE,UAsB5B,CAAA;AASD,eAAO,MAAM,SAAS,EAAE,UAatB,CAAA;AA0CF,eAAO,MAAM,SAAS,EAAE,UAiCvB,CAAA;AAED,eAAO,MAAM,QAAQ,EAAE,UAAkE,CAAA"}
|
|
@@ -1,17 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.profiles = void 0;
|
|
3
|
+
exports.profiles = exports.ownsItems = exports.ownsNames = exports.pointerIsValid = void 0;
|
|
4
4
|
const schemas_1 = require("@dcl/schemas");
|
|
5
5
|
const urn_resolver_1 = require("@dcl/urn-resolver");
|
|
6
6
|
const types_1 = require("../../types");
|
|
7
7
|
const profile_1 = require("../profile");
|
|
8
8
|
const timestamps_1 = require("../timestamps");
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
*/
|
|
13
|
-
exports.profiles = {
|
|
14
|
-
validate: async ({ externalCalls, theGraphClient }, deployment) => {
|
|
9
|
+
const validations_1 = require("../validations");
|
|
10
|
+
exports.pointerIsValid = {
|
|
11
|
+
validate: async ({ externalCalls }, deployment) => {
|
|
15
12
|
const pointers = deployment.entity.pointers;
|
|
16
13
|
const ethAddress = externalCalls.ownerAddress(deployment.auditInfo);
|
|
17
14
|
if (pointers.length !== 1)
|
|
@@ -27,41 +24,80 @@ exports.profiles = {
|
|
|
27
24
|
else if (pointer !== ethAddress.toLowerCase()) {
|
|
28
25
|
return (0, types_1.validationFailed)(`You can only alter your own profile. The pointer address and the signer address are different (pointer:${pointer} signer: ${ethAddress.toLowerCase()}).`);
|
|
29
26
|
}
|
|
30
|
-
|
|
31
|
-
|
|
27
|
+
return types_1.OK;
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
function allClaimedNames(entity) {
|
|
31
|
+
return entity.metadata.avatars
|
|
32
|
+
.filter((avatar) => avatar.hasClaimedName)
|
|
33
|
+
.map((avatar) => avatar.name)
|
|
34
|
+
.filter((name) => name && name.trim().length > 0);
|
|
35
|
+
}
|
|
36
|
+
exports.ownsNames = (0, validations_1.validationAfterADR75)({
|
|
37
|
+
validate: async ({ externalCalls, theGraphClient }, deployment) => {
|
|
38
|
+
const ethAddress = externalCalls.ownerAddress(deployment.auditInfo);
|
|
32
39
|
const names = allClaimedNames(deployment.entity);
|
|
33
|
-
const namesCheckResult = await theGraphClient.
|
|
40
|
+
const namesCheckResult = await theGraphClient.ownsNamesAtTimestamp(ethAddress, names, deployment.entity.timestamp);
|
|
34
41
|
if (!namesCheckResult.result)
|
|
35
42
|
return (0, types_1.validationFailed)(`The following names (${namesCheckResult.failing?.join(', ')}) are not owned by the address ${ethAddress.toLowerCase()}).`);
|
|
36
|
-
const wearableUrns = await allWearablesUrns(deployment.entity);
|
|
37
|
-
const wearablesCheckResult = await theGraphClient.checkForWearablesOwnershipWithTimestamp(ethAddress, wearableUrns, deployment.entity.timestamp);
|
|
38
|
-
if (!wearablesCheckResult.result) {
|
|
39
|
-
return (0, types_1.validationFailed)(`The following wearables (${wearablesCheckResult.failing?.join(', ')}) are not owned by the address ${ethAddress.toLowerCase()}).`);
|
|
40
|
-
}
|
|
41
43
|
return types_1.OK;
|
|
42
44
|
}
|
|
43
|
-
};
|
|
44
|
-
|
|
45
|
-
.
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
if (!wearableId.startsWith('dcl://')) {
|
|
51
|
-
return wearableId;
|
|
45
|
+
});
|
|
46
|
+
function isBaseAvatar(urn) {
|
|
47
|
+
return urn.includes('base-avatars');
|
|
48
|
+
}
|
|
49
|
+
async function sanitizeUrn(urn) {
|
|
50
|
+
if (!urn.startsWith('dcl://')) {
|
|
51
|
+
return urn;
|
|
52
52
|
}
|
|
53
|
-
const parsed = await (0, urn_resolver_1.parseUrn)(
|
|
53
|
+
const parsed = await (0, urn_resolver_1.parseUrn)(urn);
|
|
54
54
|
return parsed?.uri?.toString();
|
|
55
|
-
}
|
|
56
|
-
|
|
55
|
+
}
|
|
56
|
+
async function allOnChainWearableUrns(entity) {
|
|
57
57
|
const allWearablesInProfilePromises = [];
|
|
58
58
|
for (const avatar of entity.metadata.avatars) {
|
|
59
59
|
for (const wearableId of avatar.avatar.wearables) {
|
|
60
60
|
if (!isBaseAvatar(wearableId) && !(0, profile_1.isOldEmote)(wearableId)) {
|
|
61
|
-
allWearablesInProfilePromises.push(
|
|
61
|
+
allWearablesInProfilePromises.push(sanitizeUrn(wearableId));
|
|
62
62
|
}
|
|
63
63
|
}
|
|
64
64
|
}
|
|
65
65
|
return (await Promise.all(allWearablesInProfilePromises)).filter((wearableId) => !!wearableId);
|
|
66
|
-
}
|
|
66
|
+
}
|
|
67
|
+
async function allEmoteUrns(entity) {
|
|
68
|
+
const allEmotesInProfilePromises = [];
|
|
69
|
+
const allAvatars = entity.metadata?.avatars ?? [];
|
|
70
|
+
for (const avatar of allAvatars) {
|
|
71
|
+
const allEmotes = avatar.avatar.emotes ?? [];
|
|
72
|
+
for (const { urn } of allEmotes) {
|
|
73
|
+
if (!(0, profile_1.isOldEmote)(urn)) {
|
|
74
|
+
allEmotesInProfilePromises.push(sanitizeUrn(urn));
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return (await Promise.all(allEmotesInProfilePromises)).filter((wearableId) => !!wearableId);
|
|
79
|
+
}
|
|
80
|
+
exports.ownsItems = (0, validations_1.conditionalValidation)((deployment) => deployment.entity.timestamp >= timestamps_1.ADR_74_TIMESTAMP || deployment.entity.timestamp >= timestamps_1.ADR_75_TIMESTAMP, {
|
|
81
|
+
validate: async ({ externalCalls, theGraphClient }, deployment) => {
|
|
82
|
+
const ethAddress = externalCalls.ownerAddress(deployment.auditInfo);
|
|
83
|
+
const depoymentTimestamp = deployment.entity.timestamp;
|
|
84
|
+
const itemUrns = [];
|
|
85
|
+
if (depoymentTimestamp >= timestamps_1.ADR_75_TIMESTAMP) {
|
|
86
|
+
for (const urn of await allOnChainWearableUrns(deployment.entity)) {
|
|
87
|
+
itemUrns.push(urn);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
if (depoymentTimestamp >= timestamps_1.ADR_74_TIMESTAMP) {
|
|
91
|
+
for (const urn of await allEmoteUrns(deployment.entity)) {
|
|
92
|
+
itemUrns.push(urn);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
const itemsOwnershipResult = await theGraphClient.ownsItemsAtTimestamp(ethAddress, itemUrns, deployment.entity.timestamp);
|
|
96
|
+
if (!itemsOwnershipResult.result) {
|
|
97
|
+
return (0, types_1.validationFailed)(`The following items (${itemsOwnershipResult.failing?.join(', ')}) are not owned by the address ${ethAddress.toLowerCase()}).`);
|
|
98
|
+
}
|
|
99
|
+
return types_1.OK;
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
exports.profiles = (0, validations_1.validationGroup)(exports.pointerIsValid, exports.ownsNames, exports.ownsItems);
|
|
67
103
|
//# sourceMappingURL=profiles.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"profiles.js","sourceRoot":"","sources":["../../../src/validations/access-checker/profiles.ts"],"names":[],"mappings":";;;AAAA,0CAAyD;AACzD,oDAA4C;AAC5C,uCAA8D;AAC9D,wCAAuC;AACvC,
|
|
1
|
+
{"version":3,"file":"profiles.js","sourceRoot":"","sources":["../../../src/validations/access-checker/profiles.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,8 @@ import { Validation } from '../types';
|
|
|
2
2
|
export declare const isOldEmote: (wearable: string) => boolean;
|
|
3
3
|
export declare const faceThumbnail: Validation;
|
|
4
4
|
export declare const wearableUrns: Validation;
|
|
5
|
+
export declare const emoteUrns: Validation;
|
|
6
|
+
export declare const profileMustHaveEmotes: Validation;
|
|
5
7
|
/**
|
|
6
8
|
* Validate that given profile deployment includes the face256 file with the correct size
|
|
7
9
|
* * @public
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"profile.d.ts","sourceRoot":"","sources":["../../src/validations/profile.ts"],"names":[],"mappings":"AAGA,OAAO,
|
|
1
|
+
{"version":3,"file":"profile.d.ts","sourceRoot":"","sources":["../../src/validations/profile.ts"],"names":[],"mappings":"AAGA,OAAO,EAA4B,UAAU,EAAoB,MAAM,UAAU,CAAA;AAYjF,eAAO,MAAM,UAAU,aAAc,MAAM,KAAG,OAAqC,CAAA;AAEnF,eAAO,MAAM,aAAa,EAAE,UA8B1B,CAAA;AAEF,eAAO,MAAM,YAAY,EAAE,UAgBzB,CAAA;AAEF,eAAO,MAAM,SAAS,EAAE,UAmBtB,CAAA;AAYF,eAAO,MAAM,qBAAqB,EAAE,UAOlC,CAAA;AAEF;;;GAGG;AACH,eAAO,MAAM,OAAO,EAAE,UAGrB,CAAA"}
|
|
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.profile = exports.wearableUrns = exports.faceThumbnail = exports.isOldEmote = void 0;
|
|
6
|
+
exports.profile = exports.profileMustHaveEmotes = exports.emoteUrns = exports.wearableUrns = exports.faceThumbnail = exports.isOldEmote = void 0;
|
|
7
7
|
const schemas_1 = require("@dcl/schemas");
|
|
8
8
|
const urn_resolver_1 = require("@dcl/urn-resolver");
|
|
9
9
|
const sharp_1 = __importDefault(require("sharp"));
|
|
@@ -56,15 +56,51 @@ exports.wearableUrns = (0, validations_1.validationAfterADR75)({
|
|
|
56
56
|
continue;
|
|
57
57
|
const parsed = await (0, urn_resolver_1.parseUrn)(pointer);
|
|
58
58
|
if (!parsed)
|
|
59
|
-
return (0, types_1.validationFailed)(`Each profile pointer should be a urn, for example (urn:decentraland:{protocol}:collections-v2:{contract(0x[a-fA-F0-9]+)}:{name}). Invalid pointer: (${pointer})`);
|
|
59
|
+
return (0, types_1.validationFailed)(`Each profile wearable pointer should be a urn, for example (urn:decentraland:{protocol}:collections-v2:{contract(0x[a-fA-F0-9]+)}:{name}). Invalid pointer: (${pointer})`);
|
|
60
60
|
}
|
|
61
61
|
}
|
|
62
62
|
return types_1.OK;
|
|
63
63
|
}
|
|
64
64
|
});
|
|
65
|
+
exports.emoteUrns = (0, validations_1.validationAfterADR74)({
|
|
66
|
+
validate: async (components, deployment) => {
|
|
67
|
+
const allAvatars = deployment.entity.metadata?.avatars ?? [];
|
|
68
|
+
for (const avatar of allAvatars) {
|
|
69
|
+
const allEmotes = avatar.avatar.emotes ?? [];
|
|
70
|
+
for (const { slot, urn } of allEmotes) {
|
|
71
|
+
if ((0, exports.isOldEmote)(urn))
|
|
72
|
+
continue;
|
|
73
|
+
const parsed = await (0, urn_resolver_1.parseUrn)(urn);
|
|
74
|
+
if (!parsed)
|
|
75
|
+
return (0, types_1.validationFailed)(`Each profile emote pointer should be a urn, for example (urn:decentraland:{protocol}:collections-v2:{contract(0x[a-fA-F0-9]+)}:{name}). Invalid pointer: (${urn})`);
|
|
76
|
+
if (slot < 0 || slot > 9) {
|
|
77
|
+
return (0, types_1.validationFailed)(`The slot ${slot} of the emote ${urn} must be a number between 0 and 9 (inclusive).`);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return types_1.OK;
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
function profileHasEmotes(deployment) {
|
|
85
|
+
const allAvatars = deployment.entity.metadata?.avatars ?? [];
|
|
86
|
+
for (const avatar of allAvatars) {
|
|
87
|
+
if (avatar.avatar?.emotes) {
|
|
88
|
+
return true;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
93
|
+
exports.profileMustHaveEmotes = (0, validations_1.validationAfterADR74)({
|
|
94
|
+
validate: async (components, deployment) => {
|
|
95
|
+
if (!profileHasEmotes(deployment)) {
|
|
96
|
+
return (0, types_1.validationFailed)('Profile must have emotes after ADR 74.');
|
|
97
|
+
}
|
|
98
|
+
return types_1.OK;
|
|
99
|
+
}
|
|
100
|
+
});
|
|
65
101
|
/**
|
|
66
102
|
* Validate that given profile deployment includes the face256 file with the correct size
|
|
67
103
|
* * @public
|
|
68
104
|
*/
|
|
69
|
-
exports.profile = (0, validations_1.validationForType)(schemas_1.EntityType.PROFILE, (0, validations_1.validationGroup)(exports.faceThumbnail, exports.wearableUrns));
|
|
105
|
+
exports.profile = (0, validations_1.validationForType)(schemas_1.EntityType.PROFILE, (0, validations_1.validationGroup)(exports.faceThumbnail, exports.wearableUrns, exports.emoteUrns, exports.profileMustHaveEmotes));
|
|
70
106
|
//# sourceMappingURL=profile.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"profile.js","sourceRoot":"","sources":["../../src/validations/profile.ts"],"names":[],"mappings":";;;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"profile.js","sourceRoot":"","sources":["../../src/validations/profile.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.LEGACY_CONTENT_MIGRATION_TIMESTAMP = exports.ADR_75_TIMESTAMP = exports.ADR_45_TIMESTAMP = exports.ADR_74_TIMESTAMP = void 0;
|
|
4
4
|
/**
|
|
5
|
-
*
|
|
5
|
+
* 1657843200000 = 2022-07-25T00:00:00Z
|
|
6
6
|
* @public
|
|
7
7
|
*/
|
|
8
|
-
exports.ADR_74_TIMESTAMP = process.env.ADR_74_TIMESTAMP ? parseInt(process.env.ADR_74_TIMESTAMP) :
|
|
8
|
+
exports.ADR_74_TIMESTAMP = process.env.ADR_74_TIMESTAMP ? parseInt(process.env.ADR_74_TIMESTAMP) : 1658707200000;
|
|
9
9
|
/**
|
|
10
10
|
* 1652191200000 = 2022-05-10T14:00:00Z
|
|
11
11
|
* @public
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dcl/content-validator",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.3.0",
|
|
4
4
|
"description": "Catalyst content validations",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"typings": "dist/index.d.ts",
|
|
@@ -50,7 +50,7 @@
|
|
|
50
50
|
"dependencies": {
|
|
51
51
|
"@dcl/content-hash-tree": "^1.1.3",
|
|
52
52
|
"@dcl/hashing": "1.1.0",
|
|
53
|
-
"@dcl/schemas": "^5.0
|
|
53
|
+
"@dcl/schemas": "^5.4.0",
|
|
54
54
|
"@dcl/urn-resolver": "1.3.1",
|
|
55
55
|
"@well-known-components/interfaces": "1.1.1",
|
|
56
56
|
"@well-known-components/thegraph-component": "^1.2.0",
|
|
@@ -60,5 +60,5 @@
|
|
|
60
60
|
"files": [
|
|
61
61
|
"dist"
|
|
62
62
|
],
|
|
63
|
-
"commit": "
|
|
63
|
+
"commit": "97aee65ba65452a1a8bebf3f1bda0a5c67d1a251"
|
|
64
64
|
}
|