@dcl/content-validator 4.3.0 → 4.3.1-4346672765.commit-51a4f9f

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 (168) hide show
  1. package/dist/index.d.ts +2 -3
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +9 -12
  4. package/dist/index.js.map +1 -1
  5. package/dist/types.d.ts +60 -24
  6. package/dist/types.d.ts.map +1 -1
  7. package/dist/types.js.map +1 -1
  8. package/dist/validations/ADR45.d.ts +2 -2
  9. package/dist/validations/ADR45.d.ts.map +1 -1
  10. package/dist/validations/ADR45.js +3 -3
  11. package/dist/validations/ADR45.js.map +1 -1
  12. package/dist/validations/access/common/items.d.ts +10 -0
  13. package/dist/validations/access/common/items.d.ts.map +1 -0
  14. package/dist/validations/access/common/items.js +94 -0
  15. package/dist/validations/access/common/items.js.map +1 -0
  16. package/dist/validations/access/common/profiles.d.ts +3 -0
  17. package/dist/validations/access/common/profiles.d.ts.map +1 -0
  18. package/dist/validations/access/common/profiles.js +28 -0
  19. package/dist/validations/access/common/profiles.js.map +1 -0
  20. package/dist/validations/access/common/stores.d.ts +7 -0
  21. package/dist/validations/access/common/stores.d.ts.map +1 -0
  22. package/dist/validations/access/common/stores.js +35 -0
  23. package/dist/validations/access/common/stores.js.map +1 -0
  24. package/dist/validations/access/index.d.ts +8 -0
  25. package/dist/validations/access/index.d.ts.map +1 -0
  26. package/dist/validations/access/index.js +30 -0
  27. package/dist/validations/access/index.js.map +1 -0
  28. package/dist/validations/access/on-chain/client.d.ts +14 -0
  29. package/dist/validations/access/on-chain/client.d.ts.map +1 -0
  30. package/dist/validations/access/on-chain/client.js +177 -0
  31. package/dist/validations/access/on-chain/client.js.map +1 -0
  32. package/dist/validations/access/on-chain/collection-asset.d.ts +3 -0
  33. package/dist/validations/access/on-chain/collection-asset.d.ts.map +1 -0
  34. package/dist/validations/access/on-chain/collection-asset.js +66 -0
  35. package/dist/validations/access/on-chain/collection-asset.js.map +1 -0
  36. package/dist/validations/access/on-chain/index.d.ts +4 -0
  37. package/dist/validations/access/on-chain/index.d.ts.map +1 -0
  38. package/dist/validations/access/on-chain/index.js +23 -0
  39. package/dist/validations/access/on-chain/index.js.map +1 -0
  40. package/dist/validations/access/on-chain/profiles.d.ts +5 -0
  41. package/dist/validations/access/on-chain/profiles.d.ts.map +1 -0
  42. package/dist/validations/access/on-chain/profiles.js +84 -0
  43. package/dist/validations/access/on-chain/profiles.js.map +1 -0
  44. package/dist/validations/access/on-chain/scenes.d.ts +7 -0
  45. package/dist/validations/access/on-chain/scenes.d.ts.map +1 -0
  46. package/dist/validations/access/on-chain/scenes.js +53 -0
  47. package/dist/validations/access/on-chain/scenes.js.map +1 -0
  48. package/dist/validations/access/on-chain/third-party-asset.d.ts +3 -0
  49. package/dist/validations/access/on-chain/third-party-asset.d.ts.map +1 -0
  50. package/dist/validations/access/on-chain/third-party-asset.js +53 -0
  51. package/dist/validations/access/on-chain/third-party-asset.js.map +1 -0
  52. package/dist/validations/access/subgraph/collection-asset.d.ts +15 -0
  53. package/dist/validations/access/subgraph/collection-asset.d.ts.map +1 -0
  54. package/dist/validations/{access-checker/items → access/subgraph}/collection-asset.js +10 -13
  55. package/dist/validations/access/subgraph/collection-asset.js.map +1 -0
  56. package/dist/validations/access/subgraph/index.d.ts +4 -0
  57. package/dist/validations/access/subgraph/index.d.ts.map +1 -0
  58. package/dist/validations/access/subgraph/index.js +23 -0
  59. package/dist/validations/access/subgraph/index.js.map +1 -0
  60. package/dist/validations/access/subgraph/profiles.d.ts +5 -0
  61. package/dist/validations/access/subgraph/profiles.d.ts.map +1 -0
  62. package/dist/validations/access/subgraph/profiles.js +84 -0
  63. package/dist/validations/access/subgraph/profiles.js.map +1 -0
  64. package/dist/validations/access/subgraph/scenes.d.ts +7 -0
  65. package/dist/validations/access/subgraph/scenes.d.ts.map +1 -0
  66. package/dist/validations/access/subgraph/scenes.js +262 -0
  67. package/dist/validations/access/subgraph/scenes.js.map +1 -0
  68. package/dist/validations/access/subgraph/the-graph-client.d.ts +10 -0
  69. package/dist/validations/access/subgraph/the-graph-client.d.ts.map +1 -0
  70. package/dist/validations/access/subgraph/the-graph-client.js.map +1 -0
  71. package/dist/validations/access/subgraph/third-party-asset.d.ts +3 -0
  72. package/dist/validations/access/subgraph/third-party-asset.d.ts.map +1 -0
  73. package/dist/validations/{access-checker/items → access/subgraph}/third-party-asset.js +6 -8
  74. package/dist/validations/access/subgraph/third-party-asset.js.map +1 -0
  75. package/dist/validations/content.d.ts +6 -10
  76. package/dist/validations/content.d.ts.map +1 -1
  77. package/dist/validations/content.js +29 -24
  78. package/dist/validations/content.js.map +1 -1
  79. package/dist/validations/entity-structure.d.ts +2 -2
  80. package/dist/validations/entity-structure.d.ts.map +1 -1
  81. package/dist/validations/entity-structure.js +3 -3
  82. package/dist/validations/entity-structure.js.map +1 -1
  83. package/dist/validations/index.d.ts +2 -18
  84. package/dist/validations/index.d.ts.map +1 -1
  85. package/dist/validations/index.js +20 -15
  86. package/dist/validations/index.js.map +1 -1
  87. package/dist/validations/ipfs-hashing.d.ts +1 -2
  88. package/dist/validations/ipfs-hashing.d.ts.map +1 -1
  89. package/dist/validations/ipfs-hashing.js +2 -2
  90. package/dist/validations/ipfs-hashing.js.map +1 -1
  91. package/dist/validations/items/emotes.d.ts +4 -4
  92. package/dist/validations/items/emotes.d.ts.map +1 -1
  93. package/dist/validations/items/emotes.js +6 -6
  94. package/dist/validations/items/emotes.js.map +1 -1
  95. package/dist/validations/items/items.d.ts +4 -4
  96. package/dist/validations/items/items.d.ts.map +1 -1
  97. package/dist/validations/items/items.js +67 -52
  98. package/dist/validations/items/items.js.map +1 -1
  99. package/dist/validations/items/wearables.d.ts +3 -3
  100. package/dist/validations/items/wearables.d.ts.map +1 -1
  101. package/dist/validations/items/wearables.js +4 -4
  102. package/dist/validations/items/wearables.js.map +1 -1
  103. package/dist/validations/metadata-schema.d.ts +10 -1
  104. package/dist/validations/metadata-schema.d.ts.map +1 -1
  105. package/dist/validations/metadata-schema.js +9 -6
  106. package/dist/validations/metadata-schema.js.map +1 -1
  107. package/dist/validations/profile.d.ts +7 -10
  108. package/dist/validations/profile.d.ts.map +1 -1
  109. package/dist/validations/profile.js +57 -37
  110. package/dist/validations/profile.js.map +1 -1
  111. package/dist/validations/scene.d.ts +2 -2
  112. package/dist/validations/scene.d.ts.map +1 -1
  113. package/dist/validations/scene.js +8 -7
  114. package/dist/validations/scene.js.map +1 -1
  115. package/dist/validations/signature.d.ts +2 -2
  116. package/dist/validations/signature.d.ts.map +1 -1
  117. package/dist/validations/signature.js +8 -6
  118. package/dist/validations/signature.js.map +1 -1
  119. package/dist/validations/size.d.ts +2 -2
  120. package/dist/validations/size.d.ts.map +1 -1
  121. package/dist/validations/size.js +31 -29
  122. package/dist/validations/size.js.map +1 -1
  123. package/dist/validations/validations.d.ts.map +1 -1
  124. package/dist/validations/validations.js +6 -5
  125. package/dist/validations/validations.js.map +1 -1
  126. package/package.json +7 -4
  127. package/dist/the-graph-client/the-graph-client.d.ts +0 -10
  128. package/dist/the-graph-client/the-graph-client.d.ts.map +0 -1
  129. package/dist/the-graph-client/the-graph-client.js.map +0 -1
  130. package/dist/validations/access-checker/access.d.ts +0 -7
  131. package/dist/validations/access-checker/access.d.ts.map +0 -1
  132. package/dist/validations/access-checker/access.js +0 -42
  133. package/dist/validations/access-checker/access.js.map +0 -1
  134. package/dist/validations/access-checker/emotes.d.ts +0 -3
  135. package/dist/validations/access-checker/emotes.d.ts.map +0 -1
  136. package/dist/validations/access-checker/emotes.js +0 -12
  137. package/dist/validations/access-checker/emotes.js.map +0 -1
  138. package/dist/validations/access-checker/items/collection-asset.d.ts +0 -15
  139. package/dist/validations/access-checker/items/collection-asset.d.ts.map +0 -1
  140. package/dist/validations/access-checker/items/collection-asset.js.map +0 -1
  141. package/dist/validations/access-checker/items/items.d.ts +0 -11
  142. package/dist/validations/access-checker/items/items.d.ts.map +0 -1
  143. package/dist/validations/access-checker/items/items.js +0 -67
  144. package/dist/validations/access-checker/items/items.js.map +0 -1
  145. package/dist/validations/access-checker/items/off-chain-asset.d.ts +0 -3
  146. package/dist/validations/access-checker/items/off-chain-asset.d.ts.map +0 -1
  147. package/dist/validations/access-checker/items/off-chain-asset.js +0 -17
  148. package/dist/validations/access-checker/items/off-chain-asset.js.map +0 -1
  149. package/dist/validations/access-checker/items/third-party-asset.d.ts +0 -3
  150. package/dist/validations/access-checker/items/third-party-asset.d.ts.map +0 -1
  151. package/dist/validations/access-checker/items/third-party-asset.js.map +0 -1
  152. package/dist/validations/access-checker/profiles.d.ts +0 -7
  153. package/dist/validations/access-checker/profiles.d.ts.map +0 -1
  154. package/dist/validations/access-checker/profiles.js +0 -114
  155. package/dist/validations/access-checker/profiles.js.map +0 -1
  156. package/dist/validations/access-checker/scenes.d.ts +0 -7
  157. package/dist/validations/access-checker/scenes.d.ts.map +0 -1
  158. package/dist/validations/access-checker/scenes.js +0 -261
  159. package/dist/validations/access-checker/scenes.js.map +0 -1
  160. package/dist/validations/access-checker/stores.d.ts +0 -7
  161. package/dist/validations/access-checker/stores.d.ts.map +0 -1
  162. package/dist/validations/access-checker/stores.js +0 -33
  163. package/dist/validations/access-checker/stores.js.map +0 -1
  164. package/dist/validations/access-checker/wearables.d.ts +0 -3
  165. package/dist/validations/access-checker/wearables.d.ts.map +0 -1
  166. package/dist/validations/access-checker/wearables.js +0 -14
  167. package/dist/validations/access-checker/wearables.js.map +0 -1
  168. /package/dist/{the-graph-client → validations/access/subgraph}/the-graph-client.js +0 -0
@@ -0,0 +1,177 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createOnChainClient = exports.timestampBounds = void 0;
4
+ const urn_resolver_1 = require("@dcl/urn-resolver");
5
+ function timestampBounds(timestampMs) {
6
+ /*
7
+ * This mimics original behavior of looking up to 8 seconds after the entity timestamp
8
+ * and up to 5 minutes and 7 seconds before
9
+ */
10
+ const timestampSec = Math.ceil(timestampMs / 1000) + 8;
11
+ const timestamp5MinAgo = Math.max(timestampSec - 60 * 5 - 7, 0);
12
+ return {
13
+ upper: timestampSec,
14
+ lower: timestamp5MinAgo
15
+ };
16
+ }
17
+ exports.timestampBounds = timestampBounds;
18
+ /**
19
+ * @public
20
+ */
21
+ const createOnChainClient = (components) => {
22
+ const logger = components.logs.getLogger('TheGraphClient');
23
+ const L1_NETWORKS = ['mainnet', 'kovan', 'rinkeby', 'goerli'];
24
+ const L2_NETWORKS = ['matic', 'mumbai'];
25
+ const ownsNamesAtTimestamp = async (ethAddress, namesToCheck, timestamp) => {
26
+ if (namesToCheck.length === 0) {
27
+ return permissionOk();
28
+ }
29
+ const blocks = await findBlocksForTimestamp(timestamp, components.L1.blockSearch);
30
+ const hasPermissionOnBlock = async (blockNumber) => {
31
+ if (!blockNumber) {
32
+ return permissionError();
33
+ }
34
+ try {
35
+ const result = await components.L1.checker.checkNames(ethAddress, namesToCheck, blockNumber);
36
+ const notOwned = [];
37
+ for (let i = 0; i < namesToCheck.length; i++) {
38
+ if (!result[i]) {
39
+ notOwned.push(namesToCheck[i]);
40
+ }
41
+ }
42
+ return notOwned.length > 0 ? permissionError(notOwned) : permissionOk();
43
+ }
44
+ catch {
45
+ logger.error(`Error retrieving names owned by address ${ethAddress} at block ${blockNumber}`);
46
+ return permissionError();
47
+ }
48
+ };
49
+ const permissionMostRecentBlock = await hasPermissionOnBlock(blocks.blockNumberAtDeployment);
50
+ if (permissionMostRecentBlock.result) {
51
+ return permissionMostRecentBlock;
52
+ }
53
+ return await hasPermissionOnBlock(blocks.blockNumberFiveMinBeforeDeployment);
54
+ };
55
+ const splitItemsByNetwork = async (urnsToCheck) => {
56
+ const ethereum = [];
57
+ const matic = [];
58
+ for (const urn of urnsToCheck) {
59
+ const parsed = await (0, urn_resolver_1.parseUrn)(urn);
60
+ if (parsed &&
61
+ 'network' in parsed &&
62
+ ['blockchain-collection-v1-asset', 'blockchain-collection-v2-asset'].includes(parsed.type)) {
63
+ if (L1_NETWORKS.includes(parsed.network)) {
64
+ ethereum.push(urn);
65
+ }
66
+ else if (L2_NETWORKS.includes(parsed.network)) {
67
+ matic.push(urn);
68
+ }
69
+ }
70
+ }
71
+ return {
72
+ ethereum,
73
+ matic
74
+ };
75
+ };
76
+ const permissionOk = () => ({ result: true });
77
+ const permissionError = (failing) => ({
78
+ result: false,
79
+ failing: failing
80
+ });
81
+ const ownsItemsAtTimestamp = async (ethAddress, urnsToCheck, timestamp) => {
82
+ if (urnsToCheck.length === 0) {
83
+ return permissionOk();
84
+ }
85
+ const { ethereum, matic } = await splitItemsByNetwork(urnsToCheck);
86
+ const ethereumItemsOwnersPromise = ownsItemsAtTimestampInBlockchain(ethAddress, ethereum, timestamp, components.L1.collections, components.L1.blockSearch);
87
+ const maticItemsOwnersPromise = ownsItemsAtTimestampInBlockchain(ethAddress, matic, timestamp, components.L2.collections, components.L2.blockSearch);
88
+ const [ethereumItemsOwnership, maticItemsOwnership] = await Promise.all([
89
+ ethereumItemsOwnersPromise,
90
+ maticItemsOwnersPromise
91
+ ]);
92
+ if (ethereumItemsOwnership.result && maticItemsOwnership.result)
93
+ return permissionOk();
94
+ else {
95
+ return permissionError([...(ethereumItemsOwnership.failing ?? []), ...(maticItemsOwnership.failing ?? [])]);
96
+ }
97
+ };
98
+ const ownsItemsAtTimestampInBlockchain = async (ethAddress, urnsToCheck, timestamp, collectionsSubgraph, blockSearch) => {
99
+ if (urnsToCheck.length === 0) {
100
+ return permissionOk();
101
+ }
102
+ const blocks = await findBlocksForTimestamp(timestamp, blockSearch);
103
+ const hasPermissionOnBlock = async (blockNumber) => {
104
+ if (!blockNumber) {
105
+ return permissionError();
106
+ }
107
+ const runOwnedItemsOnBlockQuery = async (blockNumber) => {
108
+ const query = {
109
+ description: 'check for items ownership',
110
+ subgraph: collectionsSubgraph,
111
+ query: QUERY_ITEMS_FOR_ADDRESS_AT_BLOCK,
112
+ mapper: (response) => new Set(response.items.map(({ urn }) => urn))
113
+ };
114
+ return runQuery(query, {
115
+ block: blockNumber,
116
+ ethAddress,
117
+ urnList: urnsToCheck
118
+ });
119
+ };
120
+ try {
121
+ const ownedItems = await runOwnedItemsOnBlockQuery(blockNumber);
122
+ const notOwned = urnsToCheck.filter((name) => !ownedItems.has(name));
123
+ return notOwned.length > 0 ? permissionError(notOwned) : permissionOk();
124
+ }
125
+ catch (error) {
126
+ logger.error(`Error retrieving items owned by address ${ethAddress} at block ${blocks.blockNumberAtDeployment}`);
127
+ return permissionError();
128
+ }
129
+ };
130
+ const permissionMostRecentBlock = await hasPermissionOnBlock(blocks.blockNumberAtDeployment);
131
+ if (permissionMostRecentBlock.result) {
132
+ return permissionMostRecentBlock;
133
+ }
134
+ return await hasPermissionOnBlock(blocks.blockNumberFiveMinBeforeDeployment);
135
+ };
136
+ const runQuery = async (query, variables) => {
137
+ const response = await query.subgraph.query(query.query, variables);
138
+ return query.mapper(response);
139
+ };
140
+ const findBlocksForTimestamp = async (timestamp, blockSearch) => {
141
+ const { lower, upper } = timestampBounds(timestamp);
142
+ const result = await Promise.all([
143
+ blockSearch.findBlockForTimestamp(upper),
144
+ blockSearch.findBlockForTimestamp(lower)
145
+ ]);
146
+ const blockNumberAtDeployment = result[0];
147
+ let blockNumberFiveMinBeforeDeployment = result[1];
148
+ if (blockNumberFiveMinBeforeDeployment && blockNumberFiveMinBeforeDeployment.timestamp < lower) {
149
+ // Mimic the way TheGraph was calculating this
150
+ blockNumberFiveMinBeforeDeployment = {
151
+ ...blockNumberFiveMinBeforeDeployment,
152
+ block: blockNumberFiveMinBeforeDeployment.block + 1
153
+ };
154
+ }
155
+ return {
156
+ blockNumberAtDeployment: blockNumberAtDeployment?.block,
157
+ blockNumberFiveMinBeforeDeployment: blockNumberFiveMinBeforeDeployment?.block
158
+ };
159
+ };
160
+ return {
161
+ ownsNamesAtTimestamp,
162
+ ownsItemsAtTimestamp,
163
+ findBlocksForTimestamp
164
+ };
165
+ };
166
+ exports.createOnChainClient = createOnChainClient;
167
+ const QUERY_ITEMS_FOR_ADDRESS_AT_BLOCK = `
168
+ query getNftItemsForBlock($block: Int!, $ethAddress: String!, $urnList: [String!]) {
169
+ items: nfts(
170
+ block: {number: $block}
171
+ where: {owner: $ethAddress, searchItemType_in: ["wearable_v1", "wearable_v2", "smart_wearable_v1", "emote_v1"] urn_in: $urnList}
172
+ first: 1000
173
+ ) {
174
+ urn
175
+ }
176
+ }`;
177
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../../src/validations/access/on-chain/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { OnChainAccessCheckerComponents, V1andV2collectionAssetValidateFn } from '../../../types';
2
+ export declare function createV1andV2collectionAssetValidateFn({ externalCalls, L2, client, logs }: Pick<OnChainAccessCheckerComponents, 'externalCalls' | 'logs' | 'client' | 'L2'>): V1andV2collectionAssetValidateFn;
3
+ //# sourceMappingURL=collection-asset.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collection-asset.d.ts","sourceRoot":"","sources":["../../../../src/validations/access/on-chain/collection-asset.ts"],"names":[],"mappings":"AAEA,OAAO,EAGL,8BAA8B,EAC9B,gCAAgC,EAEjC,MAAM,gBAAgB,CAAA;AAKvB,wBAAgB,sCAAsC,CAAC,EACrD,aAAa,EACb,EAAE,EACF,MAAM,EACN,IAAI,EACL,EAAE,IAAI,CAAC,8BAA8B,EAAE,eAAe,GAAG,MAAM,GAAG,QAAQ,GAAG,IAAI,CAAC,GAAG,gCAAgC,CAqErH"}
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createV1andV2collectionAssetValidateFn = void 0;
4
+ const hashing_1 = require("@dcl/hashing");
5
+ const types_1 = require("../../../types");
6
+ const L1_NETWORKS = ['mainnet', 'kovan', 'rinkeby', 'goerli'];
7
+ const L2_NETWORKS = ['matic', 'mumbai'];
8
+ function createV1andV2collectionAssetValidateFn({ externalCalls, L2, client, logs }) {
9
+ return async function validateFn(asset, deployment) {
10
+ const ethAddress = externalCalls.ownerAddress(deployment.auditInfo);
11
+ const logger = logs.getLogger('collection asset access validation');
12
+ const network = asset.network;
13
+ if (L1_NETWORKS.includes(network)) {
14
+ // L1 collections are deployed by Decentraland Address
15
+ const isAllowlistedCollection = asset.uri.toString().startsWith('urn:decentraland:ethereum:collections-v1');
16
+ if (!externalCalls.isAddressOwnedByDecentraland(ethAddress) || !isAllowlistedCollection) {
17
+ return (0, types_1.validationFailed)(`The provided Eth Address '${ethAddress}' does not have access to the following item: '${asset.uri}'`);
18
+ }
19
+ return types_1.OK;
20
+ }
21
+ else if (L2_NETWORKS.includes(network)) {
22
+ const { timestamp, content, metadata } = deployment.entity;
23
+ const calculateHashes = () => {
24
+ // Compare both by key and hash
25
+ const compare = (a, b) => {
26
+ if (a.hash > b.hash)
27
+ return 1;
28
+ else if (a.hash < b.hash)
29
+ return -1;
30
+ else
31
+ return a.key > b.key ? 1 : -1;
32
+ };
33
+ const contentAsJson = (content ?? []).map(({ file, hash }) => ({ key: file, hash })).sort(compare);
34
+ const buffer = Buffer.from(JSON.stringify({ content: contentAsJson, metadata }));
35
+ return Promise.all([(0, hashing_1.hashV0)(buffer), (0, hashing_1.hashV1)(buffer)]);
36
+ };
37
+ const validateWearable = async (hashes, block) => {
38
+ try {
39
+ return await L2.checker.validateWearables(ethAddress, asset.contractAddress, asset.id, hashes, block);
40
+ }
41
+ catch (err) {
42
+ logger.warn(err);
43
+ return false;
44
+ }
45
+ };
46
+ let hasAccess = false;
47
+ const { blockNumberAtDeployment, blockNumberFiveMinBeforeDeployment } = await client.findBlocksForTimestamp(timestamp, L2.blockSearch);
48
+ const hashes = await calculateHashes();
49
+ if (blockNumberAtDeployment) {
50
+ hasAccess = await validateWearable(hashes, blockNumberAtDeployment);
51
+ }
52
+ if (!hasAccess && blockNumberFiveMinBeforeDeployment) {
53
+ hasAccess = await validateWearable(hashes, blockNumberFiveMinBeforeDeployment);
54
+ }
55
+ if (!hasAccess) {
56
+ return (0, types_1.validationFailed)(`The provided Eth Address '${ethAddress}' does not have access to the following item: (${asset.contractAddress}, ${asset.id})`);
57
+ }
58
+ return types_1.OK;
59
+ }
60
+ else {
61
+ return (0, types_1.validationFailed)(`Found an unknown network on the urn '${network}'`);
62
+ }
63
+ };
64
+ }
65
+ exports.createV1andV2collectionAssetValidateFn = createV1andV2collectionAssetValidateFn;
66
+ //# sourceMappingURL=collection-asset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collection-asset.js","sourceRoot":"","sources":["../../../../src/validations/access/on-chain/collection-asset.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { EntityType } from '@dcl/schemas';
2
+ import { OnChainAccessCheckerComponents, ValidateFn } from '../../../types';
3
+ export declare function createOnChainAccessCheckValidateFns(components: OnChainAccessCheckerComponents): Record<EntityType, ValidateFn>;
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/validations/access/on-chain/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AACzC,OAAO,EAAE,8BAA8B,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAQ3E,wBAAgB,mCAAmC,CACjD,UAAU,EAAE,8BAA8B,GACzC,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,CAchC"}
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createOnChainAccessCheckValidateFns = void 0;
4
+ const schemas_1 = require("@dcl/schemas");
5
+ const items_1 = require("../common/items");
6
+ const stores_1 = require("../common/stores");
7
+ const collection_asset_1 = require("./collection-asset");
8
+ const profiles_1 = require("./profiles");
9
+ const scenes_1 = require("./scenes");
10
+ const third_party_asset_1 = require("./third-party-asset");
11
+ function createOnChainAccessCheckValidateFns(components) {
12
+ const v1andV2collectionAssetValidateFn = (0, collection_asset_1.createV1andV2collectionAssetValidateFn)(components);
13
+ const thirdPartyAssetValidateFn = (0, third_party_asset_1.createThirdPartyAssetValidateFn)(components);
14
+ return {
15
+ [schemas_1.EntityType.PROFILE]: (0, profiles_1.createProfileValidateFn)(components),
16
+ [schemas_1.EntityType.SCENE]: (0, scenes_1.createSceneValidateFn)(components),
17
+ [schemas_1.EntityType.WEARABLE]: (0, items_1.createWearableValidateFn)(components, v1andV2collectionAssetValidateFn, thirdPartyAssetValidateFn),
18
+ [schemas_1.EntityType.STORE]: (0, stores_1.createStoreValidateFn)(components),
19
+ [schemas_1.EntityType.EMOTE]: (0, items_1.createEmoteValidateFn)(components, v1andV2collectionAssetValidateFn, thirdPartyAssetValidateFn)
20
+ };
21
+ }
22
+ exports.createOnChainAccessCheckValidateFns = createOnChainAccessCheckValidateFns;
23
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/validations/access/on-chain/index.ts"],"names":[],"mappings":";;;AAAA,0CAAyC;AAEzC,2CAAiF;AACjF,6CAAwD;AACxD,yDAA2E;AAC3E,yCAAoD;AACpD,qCAAgD;AAChD,2DAAqE;AAErE,SAAgB,mCAAmC,CACjD,UAA0C;IAE1C,MAAM,gCAAgC,GAAG,IAAA,yDAAsC,EAAC,UAAU,CAAC,CAAA;IAC3F,MAAM,yBAAyB,GAAG,IAAA,mDAA+B,EAAC,UAAU,CAAC,CAAA;IAC7E,OAAO;QACL,CAAC,oBAAU,CAAC,OAAO,CAAC,EAAE,IAAA,kCAAuB,EAAC,UAAU,CAAC;QACzD,CAAC,oBAAU,CAAC,KAAK,CAAC,EAAE,IAAA,8BAAqB,EAAC,UAAU,CAAC;QACrD,CAAC,oBAAU,CAAC,QAAQ,CAAC,EAAE,IAAA,gCAAwB,EAC7C,UAAU,EACV,gCAAgC,EAChC,yBAAyB,CAC1B;QACD,CAAC,oBAAU,CAAC,KAAK,CAAC,EAAE,IAAA,8BAAqB,EAAC,UAAU,CAAC;QACrD,CAAC,oBAAU,CAAC,KAAK,CAAC,EAAE,IAAA,6BAAqB,EAAC,UAAU,EAAE,gCAAgC,EAAE,yBAAyB,CAAC;KACnH,CAAA;AACH,CAAC;AAhBD,kFAgBC"}
@@ -0,0 +1,5 @@
1
+ import { OnChainAccessCheckerComponents, ValidateFn } from '../../../types';
2
+ export declare function createNamesOwnershipValidateFn({ externalCalls, client }: Pick<OnChainAccessCheckerComponents, 'externalCalls' | 'client'>): ValidateFn;
3
+ export declare function createItemOwnershipValidateFn({ externalCalls, client }: Pick<OnChainAccessCheckerComponents, 'externalCalls' | 'client'>): ValidateFn;
4
+ export declare function createProfileValidateFn(components: Pick<OnChainAccessCheckerComponents, 'client' | 'externalCalls'>): ValidateFn;
5
+ //# sourceMappingURL=profiles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profiles.d.ts","sourceRoot":"","sources":["../../../../src/validations/access/on-chain/profiles.ts"],"names":[],"mappings":"AAEA,OAAO,EAGL,8BAA8B,EAC9B,UAAU,EAGX,MAAM,gBAAgB,CAAA;AAMvB,wBAAgB,8BAA8B,CAAC,EAC7C,aAAa,EACb,MAAM,EACP,EAAE,IAAI,CAAC,8BAA8B,EAAE,eAAe,GAAG,QAAQ,CAAC,GAAG,UAAU,CAkB/E;AAED,wBAAgB,6BAA6B,CAAC,EAC5C,aAAa,EACb,MAAM,EACP,EAAE,IAAI,CAAC,8BAA8B,EAAE,eAAe,GAAG,QAAQ,CAAC,GAAG,UAAU,CA+D/E;AAED,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,IAAI,CAAC,8BAA8B,EAAE,QAAQ,GAAG,eAAe,CAAC,cAMnH"}
@@ -0,0 +1,84 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createProfileValidateFn = exports.createItemOwnershipValidateFn = exports.createNamesOwnershipValidateFn = void 0;
4
+ const urn_resolver_1 = require("@dcl/urn-resolver");
5
+ const types_1 = require("../../../types");
6
+ const profile_1 = require("../../profile");
7
+ const timestamps_1 = require("../../timestamps");
8
+ const validations_1 = require("../../validations");
9
+ const profiles_1 = require("../common/profiles");
10
+ function createNamesOwnershipValidateFn({ externalCalls, client }) {
11
+ async function validateFn(deployment) {
12
+ const ethAddress = externalCalls.ownerAddress(deployment.auditInfo);
13
+ const names = deployment.entity.metadata.avatars
14
+ .filter((avatar) => avatar.hasClaimedName)
15
+ .map((avatar) => avatar.name)
16
+ .filter((name) => name && name.trim().length > 0);
17
+ const namesCheckResult = await client.ownsNamesAtTimestamp(ethAddress, names, deployment.entity.timestamp);
18
+ if (!namesCheckResult.result)
19
+ return (0, types_1.validationFailed)(`The following names (${namesCheckResult.failing?.join(', ')}) are not owned by the address ${ethAddress.toLowerCase()}).`);
20
+ return types_1.OK;
21
+ }
22
+ return (0, validations_1.validateAfterADR75)(validateFn);
23
+ }
24
+ exports.createNamesOwnershipValidateFn = createNamesOwnershipValidateFn;
25
+ function createItemOwnershipValidateFn({ externalCalls, client }) {
26
+ async function sanitizeUrn(urn) {
27
+ if (!urn.startsWith('dcl://')) {
28
+ return urn;
29
+ }
30
+ const parsed = await (0, urn_resolver_1.parseUrn)(urn);
31
+ return parsed?.uri?.toString();
32
+ }
33
+ async function allOnChainWearableUrns(entity) {
34
+ const allWearablesInProfilePromises = [];
35
+ for (const avatar of entity.metadata.avatars) {
36
+ for (const wearableId of avatar.avatar.wearables) {
37
+ const isBaseAvatar = wearableId.includes('base-avatars');
38
+ if (!isBaseAvatar && !(0, profile_1.isOldEmote)(wearableId)) {
39
+ allWearablesInProfilePromises.push(sanitizeUrn(wearableId));
40
+ }
41
+ }
42
+ }
43
+ return (await Promise.all(allWearablesInProfilePromises)).filter((wearableId) => !!wearableId);
44
+ }
45
+ async function allEmoteUrns(entity) {
46
+ const allEmotesInProfilePromises = [];
47
+ const allAvatars = entity.metadata?.avatars ?? [];
48
+ for (const avatar of allAvatars) {
49
+ const allEmotes = avatar.avatar.emotes ?? [];
50
+ for (const { urn } of allEmotes) {
51
+ if (!(0, profile_1.isOldEmote)(urn)) {
52
+ allEmotesInProfilePromises.push(sanitizeUrn(urn));
53
+ }
54
+ }
55
+ }
56
+ return (await Promise.all(allEmotesInProfilePromises)).filter((wearableId) => !!wearableId);
57
+ }
58
+ return async function validateFn(deployment) {
59
+ const ethAddress = externalCalls.ownerAddress(deployment.auditInfo);
60
+ const depoymentTimestamp = deployment.entity.timestamp;
61
+ const itemUrns = [];
62
+ if (depoymentTimestamp >= timestamps_1.ADR_75_TIMESTAMP) {
63
+ for (const urn of await allOnChainWearableUrns(deployment.entity)) {
64
+ itemUrns.push(urn);
65
+ }
66
+ }
67
+ if (depoymentTimestamp >= timestamps_1.ADR_74_TIMESTAMP) {
68
+ for (const urn of await allEmoteUrns(deployment.entity)) {
69
+ itemUrns.push(urn);
70
+ }
71
+ }
72
+ const itemsOwnershipResult = await client.ownsItemsAtTimestamp(ethAddress, itemUrns, deployment.entity.timestamp);
73
+ if (!itemsOwnershipResult.result) {
74
+ return (0, types_1.validationFailed)(`The following items (${itemsOwnershipResult.failing?.join(', ')}) are not owned by the address ${ethAddress.toLowerCase()}).`);
75
+ }
76
+ return types_1.OK;
77
+ };
78
+ }
79
+ exports.createItemOwnershipValidateFn = createItemOwnershipValidateFn;
80
+ function createProfileValidateFn(components) {
81
+ return (0, validations_1.validateAll)(createNamesOwnershipValidateFn(components), createItemOwnershipValidateFn(components), (0, profiles_1.createPointerValidateFn)(components));
82
+ }
83
+ exports.createProfileValidateFn = createProfileValidateFn;
84
+ //# sourceMappingURL=profiles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profiles.js","sourceRoot":"","sources":["../../../../src/validations/access/on-chain/profiles.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { DeploymentToValidate, OnChainAccessCheckerComponents, ValidationResponse } from '../../../types';
2
+ /**
3
+ * Checks if the given address has access to the given parcel at the given timestamp.
4
+ * @public
5
+ */
6
+ export declare function createSceneValidateFn({ externalCalls, client, L1, logs }: Pick<OnChainAccessCheckerComponents, 'externalCalls' | 'logs' | 'client' | 'L1'>): (deployment: DeploymentToValidate) => Promise<ValidationResponse>;
7
+ //# sourceMappingURL=scenes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scenes.d.ts","sourceRoot":"","sources":["../../../../src/validations/access/on-chain/scenes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAc,8BAA8B,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AAErH;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,EACpC,aAAa,EACb,MAAM,EACN,EAAE,EACF,IAAI,EACL,EAAE,IAAI,CAAC,8BAA8B,EAAE,eAAe,GAAG,MAAM,GAAG,QAAQ,GAAG,IAAI,CAAC,gBAGpC,oBAAoB,KAAG,QAAQ,kBAAkB,CAAC,CAoDhG"}
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createSceneValidateFn = void 0;
4
+ const types_1 = require("../../../types");
5
+ /**
6
+ * Checks if the given address has access to the given parcel at the given timestamp.
7
+ * @public
8
+ */
9
+ function createSceneValidateFn({ externalCalls, client, L1, logs }) {
10
+ const logger = logs.getLogger('scenes access validator');
11
+ return async function validateFn(deployment) {
12
+ const { entity } = deployment;
13
+ const { pointers, timestamp } = entity;
14
+ const ethAddress = externalCalls.ownerAddress(deployment.auditInfo);
15
+ const errors = [];
16
+ const lowerCasePointers = pointers.map((pointer) => pointer.toLowerCase());
17
+ const batch = [];
18
+ for (const pointer of lowerCasePointers) {
19
+ const pointerParts = pointer.split(',');
20
+ if (pointerParts.length === 2) {
21
+ const x = parseInt(pointerParts[0], 10);
22
+ const y = parseInt(pointerParts[1], 10);
23
+ batch.push([x, y]);
24
+ }
25
+ else {
26
+ errors.push(`Scene pointers should only contain two integers separated by a comma, for example (10,10) or (120,-45). Invalid pointer: ${pointer}`);
27
+ }
28
+ }
29
+ const { blockNumberAtDeployment, blockNumberFiveMinBeforeDeployment } = await client.findBlocksForTimestamp(timestamp, L1.blockSearch);
30
+ try {
31
+ const accessAtBlock = blockNumberAtDeployment
32
+ ? await L1.checker.checkLAND(ethAddress, batch, blockNumberAtDeployment)
33
+ : batch.map(() => false);
34
+ const accessAtFiveMinBeforeBlock = blockNumberFiveMinBeforeDeployment
35
+ ? await L1.checker.checkLAND(ethAddress, batch, blockNumberFiveMinBeforeDeployment)
36
+ : batch.map(() => false);
37
+ for (let i = 0; i < batch.length; i++) {
38
+ const [x, y] = batch[i];
39
+ const hasAccess = accessAtBlock[i] || accessAtFiveMinBeforeBlock[i];
40
+ if (!hasAccess) {
41
+ errors.push(`The provided Eth Address does not have access to the following parcel: (${x},${y})`);
42
+ }
43
+ }
44
+ }
45
+ catch (err) {
46
+ logger.error(err);
47
+ return (0, types_1.fromErrors)(`Cannot validate deployment`);
48
+ }
49
+ return (0, types_1.fromErrors)(...errors);
50
+ };
51
+ }
52
+ exports.createSceneValidateFn = createSceneValidateFn;
53
+ //# sourceMappingURL=scenes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scenes.js","sourceRoot":"","sources":["../../../../src/validations/access/on-chain/scenes.ts"],"names":[],"mappings":";;;AAAA,0CAAqH;AAErH;;;GAGG;AACH,SAAgB,qBAAqB,CAAC,EACpC,aAAa,EACb,MAAM,EACN,EAAE,EACF,IAAI,EAC6E;IACjF,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,yBAAyB,CAAC,CAAA;IAExD,OAAO,KAAK,UAAU,UAAU,CAAC,UAAgC;QAC/D,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAA;QAC7B,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,MAAM,CAAA;QAEtC,MAAM,UAAU,GAAG,aAAa,CAAC,YAAY,CAAC,UAAU,CAAC,SAAS,CAAC,CAAA;QAEnE,MAAM,MAAM,GAAG,EAAE,CAAA;QACjB,MAAM,iBAAiB,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAA;QAE1E,MAAM,KAAK,GAAuB,EAAE,CAAA;QAEpC,KAAK,MAAM,OAAO,IAAI,iBAAiB,EAAE;YACvC,MAAM,YAAY,GAAa,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;YACjD,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE;gBAC7B,MAAM,CAAC,GAAW,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;gBAC/C,MAAM,CAAC,GAAW,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;gBAE/C,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;aACnB;iBAAM;gBACL,MAAM,CAAC,IAAI,CACT,4HAA4H,OAAO,EAAE,CACtI,CAAA;aACF;SACF;QAED,MAAM,EAAE,uBAAuB,EAAE,kCAAkC,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CACzG,SAAS,EACT,EAAE,CAAC,WAAW,CACf,CAAA;QAED,IAAI;YACF,MAAM,aAAa,GAAG,uBAAuB;gBAC3C,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,UAAU,EAAE,KAAK,EAAE,uBAAuB,CAAC;gBACxE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAA;YAC1B,MAAM,0BAA0B,GAAG,kCAAkC;gBACnE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,UAAU,EAAE,KAAK,EAAE,kCAAkC,CAAC;gBACnF,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAA;YAE1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBACrC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;gBACvB,MAAM,SAAS,GAAG,aAAa,CAAC,CAAC,CAAC,IAAI,0BAA0B,CAAC,CAAC,CAAC,CAAA;gBACnE,IAAI,CAAC,SAAS,EAAE;oBACd,MAAM,CAAC,IAAI,CAAC,2EAA2E,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;iBAClG;aACF;SACF;QAAC,OAAO,GAAQ,EAAE;YACjB,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;YACjB,OAAO,IAAA,kBAAU,EAAC,4BAA4B,CAAC,CAAA;SAChD;QAED,OAAO,IAAA,kBAAU,EAAC,GAAG,MAAM,CAAC,CAAA;IAC9B,CAAC,CAAA;AACH,CAAC;AA5DD,sDA4DC"}
@@ -0,0 +1,3 @@
1
+ import { OnChainAccessCheckerComponents, ThirdPartyAssetValidateFn } from '../../../types';
2
+ export declare function createThirdPartyAssetValidateFn(components: Pick<OnChainAccessCheckerComponents, 'externalCalls' | 'logs' | 'client' | 'L2'>): ThirdPartyAssetValidateFn;
3
+ //# sourceMappingURL=third-party-asset.d.ts.map
@@ -0,0 +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;AAavB,wBAAgB,+BAA+B,CAC7C,UAAU,EAAE,IAAI,CAAC,8BAA8B,EAAE,eAAe,GAAG,MAAM,GAAG,QAAQ,GAAG,IAAI,CAAC,GAC3F,yBAAyB,CA4C3B"}
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createThirdPartyAssetValidateFn = void 0;
4
+ const content_hash_tree_1 = require("@dcl/content-hash-tree");
5
+ const schemas_1 = require("@dcl/schemas");
6
+ const types_1 = require("../../../types");
7
+ function toHexBuffer(value) {
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
+ }
16
+ function createThirdPartyAssetValidateFn(components) {
17
+ return async function validateFn(asset, deployment) {
18
+ const logger = components.logs.getLogger('third-party-asset-validation');
19
+ const { checker } = components.L2;
20
+ const { timestamp } = deployment.entity;
21
+ let verified = false;
22
+ if ((0, schemas_1.isThirdParty)(deployment.entity.metadata)) {
23
+ // This should always happen as the metadata validation ran before
24
+ const metadata = deployment.entity.metadata;
25
+ const merkleProof = metadata.merkleProof;
26
+ const thirdPartyId = getThirdPartyId(asset);
27
+ const bufferedProofs = merkleProof.proof.map((value) => toHexBuffer(value));
28
+ const root = (0, content_hash_tree_1.generateRoot)(merkleProof.index, merkleProof.entityHash, bufferedProofs);
29
+ const { blockNumberAtDeployment, blockNumberFiveMinBeforeDeployment } = await components.client.findBlocksForTimestamp(timestamp, components.L2.blockSearch);
30
+ const validateThirdParty = async (block) => {
31
+ try {
32
+ return await checker.validateThirdParty(thirdPartyId, root, block);
33
+ }
34
+ catch (err) {
35
+ logger.warn(err);
36
+ return false;
37
+ }
38
+ };
39
+ if (blockNumberAtDeployment) {
40
+ verified = await validateThirdParty(blockNumberAtDeployment);
41
+ }
42
+ if (!verified && blockNumberFiveMinBeforeDeployment) {
43
+ verified = await validateThirdParty(blockNumberFiveMinBeforeDeployment);
44
+ }
45
+ }
46
+ if (!verified) {
47
+ return (0, types_1.validationFailed)(`Couldn't verify merkle proofed entity`);
48
+ }
49
+ return types_1.OK;
50
+ };
51
+ }
52
+ exports.createThirdPartyAssetValidateFn = createThirdPartyAssetValidateFn;
53
+ //# sourceMappingURL=third-party-asset.js.map
@@ -0,0 +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;AAEvB,SAAS,WAAW,CAAC,KAAa;IAChC,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;AAED,SAAS,eAAe,CAAC,GAAmC;IAC1D,OAAO,oBAAoB,GAAG,CAAC,OAAO,2BAA2B,GAAG,CAAC,cAAc,EAAE,CAAA;AACvF,CAAC;AAED,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,eAAe,CAAC,KAAK,CAAC,CAAA;YAE3C,MAAM,cAAc,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,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"}
@@ -0,0 +1,15 @@
1
+ import { SubgraphAccessCheckerComponents, V1andV2collectionAssetValidateFn } from '../../../types';
2
+ declare type CollectionItem = {
3
+ managers: string[];
4
+ contentHash: string;
5
+ };
6
+ export declare type ItemCollection = {
7
+ creator: string;
8
+ managers: string[];
9
+ isApproved: boolean;
10
+ isCompleted: boolean;
11
+ items: CollectionItem[];
12
+ };
13
+ export declare function createV1andV2collectionAssetValidateFn(components: Pick<SubgraphAccessCheckerComponents, 'externalCalls' | 'logs' | 'subGraphs' | 'theGraphClient'>): V1andV2collectionAssetValidateFn;
14
+ export {};
15
+ //# sourceMappingURL=collection-asset.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collection-asset.d.ts","sourceRoot":"","sources":["../../../../src/validations/access/subgraph/collection-asset.ts"],"names":[],"mappings":"AAKA,OAAO,EAIL,+BAA+B,EAC/B,gCAAgC,EAEjC,MAAM,gBAAgB,CAAA;AAoBvB,aAAK,cAAc,GAAG;IACpB,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB,WAAW,EAAE,MAAM,CAAA;CACpB,CAAA;AAED,oBAAY,cAAc,GAAG;IAC3B,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB,UAAU,EAAE,OAAO,CAAA;IACnB,WAAW,EAAE,OAAO,CAAA;IACpB,KAAK,EAAE,cAAc,EAAE,CAAA;CACxB,CAAA;AAmID,wBAAgB,sCAAsC,CACpD,UAAU,EAAE,IAAI,CAAC,+BAA+B,EAAE,eAAe,GAAG,MAAM,GAAG,WAAW,GAAG,gBAAgB,CAAC,GAC3G,gCAAgC,CAiDlC"}