Skip to content

Commit 6a3e461

Browse files
authored
Merge pull request #29 from kleros/feat/fix-request-requester
Chore/migrate to file data source and fix request requester
2 parents 782de7b + 05a353c commit 6a3e461

11 files changed

+180
-53
lines changed

package.json

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,19 @@
66
"fix-schema.ts": "replace-in-file '/(;\\s*if \\()value === null/mg' '$1value === null || value.kind === ValueKind.NULL' generated/schema.ts --isRegex",
77
"codegen:gnosis": "node render-templates.js gnosis && graph codegen && yarn fix-schema.ts",
88
"build:gnosis": "yarn codegen:gnosis && graph build",
9-
"publish:gnosis": "yarn build:gnosis && graph deploy --product hosted-service kleros/legacy-curate-gnosis",
10-
"publish:gnosis-goldsky": "yarn build:gnosis && yarn goldsky subgraph deploy legacy-curate-gnosis/latest",
9+
"publish:gnosis": "yarn build:gnosis && graph deploy --studio legacy-curate-gnosis",
10+
"codegen:gnosis-goldsky": "node render-templates.js xdai && graph codegen && yarn fix-schema.ts",
11+
"build:gnosis-goldsky": "yarn codegen:gnosis-goldsky && graph build",
12+
"publish:gnosis-goldsky": "yarn build:gnosis-goldsky && yarn goldsky subgraph deploy legacy-curate-gnosis/v${npm_package_version}",
1113
"codegen:mainnet": "node render-templates.js mainnet && graph codegen && yarn fix-schema.ts",
1214
"build:mainnet": "yarn codegen:mainnet && graph build",
13-
"publish:mainnet": "yarn build:mainnet && graph deploy --product hosted-service kleros/curate",
15+
"publish:mainnet": "yarn build:mainnet && graph deploy --studio legacy-curate-mainnet",
1416
"codegen:goerli": "node render-templates.js goerli && graph codegen && yarn fix-schema.ts",
1517
"build:goerli": "yarn codegen:goerli && graph build",
1618
"publish:goerli": "yarn build:goerli && graph deploy --product hosted-service kleros/curate-goerli",
1719
"codegen:sepolia": "node render-templates.js sepolia && graph codegen && yarn fix-schema.ts",
1820
"build:sepolia": "yarn codegen:sepolia && graph build",
19-
"publish:sepolia": "yarn build:sepolia && graph deploy --studio kleros/curate-sepolia",
21+
"publish:sepolia": "yarn build:sepolia && graph deploy --studio legacy-curate-sepolia",
2022
"lint:eslint": "eslint . --ext .ts,.tsx",
2123
"lint:prettier": "prettier --config .prettierrc 'src/**/*.ts' --check",
2224
"lint": "yarn lint:eslint && yarn lint:prettier && yarn lint:secrets",
@@ -40,7 +42,7 @@
4042
"@assemblyscript/loader": "^0.14.11",
4143
"@assemblyscript/node": "github:AssemblyScript/node",
4244
"@gnosis.pm/truffle-nice-tools": "^1.3.1",
43-
"@goldskycom/cli": "^11.2.0",
45+
"@goldskycom/cli": "^11.3.0",
4446
"@graphprotocol/graph-cli": "^0.71.0",
4547
"@kleros/erc-792": "3.0.0",
4648
"@kleros/gtcr-encoder": "^1.1.3",
@@ -65,6 +67,9 @@
6567
"typescript": "^4.3.5",
6668
"wait-on": "^5.2.0"
6769
},
70+
"resolutions": {
71+
"ejs": "^3.1.10"
72+
},
6873
"volta": {
6974
"node": "20.11.0",
7075
"yarn": "1.22.19"

render-templates.js

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ const mustache = require('mustache');
33

44
const chainNameToChainId = {
55
gnosis: 100,
6+
xdai: 100, // For Goldsky: https://docs.goldsky.com/chains/supported-networks
67
mainnet: 1,
78
goerli: 5,
89
sepolia: 11155111,
@@ -12,14 +13,10 @@ async function main() {
1213
const networkName = process.argv[2];
1314
const chainId = chainNameToChainId[networkName];
1415
const deployments = JSON.parse(fs.readFileSync('networks.json', 'utf8'));
15-
const {
16-
address: lgtcrFactoryAddr,
17-
startBlock: lgtcrFactoryStartBlock,
18-
} = deployments['LightGTCRFactory'][chainId];
19-
const {
20-
address: gtcrFactoryAddr,
21-
startBlock: gtcrFactoryStartBlock,
22-
} = deployments['GTCRFactory'][chainId];
16+
const { address: lgtcrFactoryAddr, startBlock: lgtcrFactoryStartBlock } =
17+
deployments['LightGTCRFactory'][chainId];
18+
const { address: gtcrFactoryAddr, startBlock: gtcrFactoryStartBlock } =
19+
deployments['GTCRFactory'][chainId];
2320
const templateData = {
2421
network: networkName,
2522
};

schema.graphql

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ type Evidence @entity {
5757
metadata: EvidenceMetadata
5858
}
5959

60-
type EvidenceMetadata @entity {
60+
type EvidenceMetadata @entity(immutable: true) {
6161
id: ID!
6262
"Name of the evidence"
6363
name: String
@@ -116,8 +116,24 @@ type LRegistry @entity {
116116
numberOfChallengedClearing: BigInt!
117117
"Connected TCR. Can be the 0 address. In practice, will never be null."
118118
connectedTCR: Bytes
119+
metadata: LRegistryMetadata
119120
}
120121

122+
type LRegistryMetadata @entity {
123+
id: ID!
124+
title: String
125+
description: String
126+
itemName: String
127+
itemNamePlural: String
128+
isConnectedTCR: Boolean
129+
requireRemovalEvidence: Boolean
130+
isTCRofTcrs: Boolean
131+
parentTCRAddress: String
132+
relTcrDisabled: Boolean
133+
registry: LRegistry @derivedFrom(field: "metadata")
134+
}
135+
136+
121137
type MetaEvidence @entity {
122138
"The meta evidence ID."
123139
id: ID!
@@ -155,8 +171,8 @@ type LItem @entity {
155171
metadata: LItemMetadata
156172
}
157173

158-
type LItemMetadata @entity {
159-
"ipfs cid"
174+
type LItemMetadata @entity(immutable: true) {
175+
"ipfs cid - Litem ID"
160176
id: ID!
161177
"The parsed data describing the item."
162178
props: [ItemProp!]! @derivedFrom(field: "item")
@@ -183,8 +199,14 @@ type _Schema_
183199
algorithm: rank
184200
include: [{ entity: "LItemMetadata", fields: [{ name: "keywords" }] }]
185201
)
202+
@fulltext(
203+
name: "registrySearch"
204+
language: en
205+
algorithm: rank
206+
include: [{ entity: "LRegistryMetadata", fields: [{ name: "title" }, { name: "description" }, { name: "itemName" }] }]
207+
)
186208

187-
type ItemProp @entity {
209+
type ItemProp @entity(immutable: true) {
188210
id: ID!
189211
type: String!
190212
label: String!

src/GeneralizedTCRMapping.ts

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
/* eslint-disable prefer-const */
2-
import { Bytes, BigInt, Address, log } from '@graphprotocol/graph-ts';
2+
import {
3+
Bytes,
4+
BigInt,
5+
Address,
6+
log,
7+
DataSourceContext,
8+
} from '@graphprotocol/graph-ts';
39
import {
410
Item,
511
Request,
@@ -127,13 +133,15 @@ export function handleRequestSubmitted(event: RequestEvidenceGroupID): void {
127133

128134
let requestID =
129135
graphItemID + '-' + itemInfo.value2.minus(BigInt.fromI32(1)).toString();
136+
let requestIndex = item.numberOfRequests.minus(BigInt.fromI32(1));
137+
let requestInfo = tcr.getRequestInfo(event.params._itemID, requestIndex);
130138

131139
let request = new Request(requestID);
132140
request.disputed = false;
133141
request.arbitrator = tcr.arbitrator();
134142
request.arbitratorExtraData = tcr.arbitratorExtraData();
135143
request.challenger = ZERO_ADDRESS;
136-
request.requester = event.transaction.from;
144+
request.requester = requestInfo.value4[1];
137145
request.item = item.id;
138146
request.registry = registry.id;
139147
request.registryAddress = event.address;
@@ -257,16 +265,16 @@ export function handleRequestChallenged(event: Dispute): void {
257265
log.error(`Request of requestID {} not found.`, [requestID]);
258266
return;
259267
}
268+
let requestInfo = tcr.getRequestInfo(
269+
itemID,
270+
itemInfo.value2.minus(BigInt.fromI32(1)),
271+
);
260272

261273
request.disputed = true;
262-
request.challenger = event.transaction.from;
274+
request.challenger = requestInfo.value4[2];
263275
request.numberOfRounds = BigInt.fromI32(2);
264276
request.disputeID = event.params._disputeID;
265277

266-
let requestInfo = tcr.getRequestInfo(
267-
itemID,
268-
itemInfo.value2.minus(BigInt.fromI32(1)),
269-
);
270278
let roundID =
271279
requestID + '-' + requestInfo.value5.minus(BigInt.fromI32(2)).toString();
272280
let round = Round.load(roundID);
@@ -612,8 +620,12 @@ export function handleEvidence(event: EvidenceEvent): void {
612620
);
613621

614622
const ipfsHash = extractPath(event.params._evidence);
615-
evidence.metadata = ipfsHash;
616-
EvidenceMetadataTemplate.create(ipfsHash);
623+
evidence.metadata = `${ipfsHash}-${evidence.id}`;
624+
625+
const context = new DataSourceContext();
626+
context.setString('evidenceId', evidence.id);
627+
628+
EvidenceMetadataTemplate.createWithContext(ipfsHash, context);
617629

618630
evidenceGroup.save();
619631
evidence.save();

src/LightGeneralizedTCRMapping.ts

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import {
2525
LIArbitrator as IArbitratorDataSourceTemplate,
2626
LGTCREvidence as EvidenceMetadataTemplate,
2727
LItemMetadata as LItemMetadataTemplate,
28+
LRegistryMetadata as LRegistryMetadataTemplate,
2829
} from '../generated/templates';
2930
import {
3031
Contribution,
@@ -250,7 +251,9 @@ export function handleNewItem(event: NewItem): void {
250251
item.latestRequestSubmissionTime = BigInt.fromI32(0);
251252

252253
const ipfsHash = extractPath(event.params._data);
253-
item.metadata = ipfsHash;
254+
item.metadata = `${ipfsHash}-${graphItemID}`;
255+
256+
log.debug('Creating datasource for ipfs hash : {}', [ipfsHash]);
254257

255258
const context = new DataSourceContext();
256259
context.setString('graphItemID', graphItemID);
@@ -298,14 +301,15 @@ export function handleRequestSubmitted(event: RequestSubmitted): void {
298301
let newStatus = getExtendedStatus(item.disputed, item.status);
299302

300303
let requestIndex = item.numberOfRequests.minus(BigInt.fromI32(1));
304+
let requestInfo = tcr.getRequestInfo(event.params._itemID, requestIndex);
301305
let requestID = graphItemID + '-' + requestIndex.toString();
302306

303307
let request = new LRequest(requestID);
304308
request.disputed = false;
305309
request.arbitrator = tcr.arbitrator();
306310
request.arbitratorExtraData = tcr.arbitratorExtraData();
307311
request.challenger = ZERO_ADDRESS;
308-
request.requester = event.transaction.from;
312+
request.requester = requestInfo.value4[1];
309313
request.item = item.id;
310314
request.registry = registry.id;
311315
request.registryAddress = event.address;
@@ -446,6 +450,7 @@ export function handleRequestChallenged(event: Dispute): void {
446450
let newStatus = getExtendedStatus(item.disputed, item.status);
447451

448452
let requestIndex = item.numberOfRequests.minus(BigInt.fromI32(1));
453+
let requestInfo = tcr.getRequestInfo(itemID, requestIndex);
449454
let requestID = graphItemID + '-' + requestIndex.toString();
450455
let request = LRequest.load(requestID);
451456
if (!request) {
@@ -454,7 +459,7 @@ export function handleRequestChallenged(event: Dispute): void {
454459
}
455460

456461
request.disputed = true;
457-
request.challenger = event.transaction.from;
462+
request.challenger = requestInfo.value4[2];
458463
request.numberOfRounds = BigInt.fromI32(2);
459464
request.disputeID = event.params._disputeID;
460465

@@ -790,6 +795,18 @@ export function handleMetaEvidence(event: MetaEvidenceEvent): void {
790795
}
791796

792797
metaEvidence.URI = event.params._evidence;
798+
799+
const ipfsHash = extractPath(event.params._evidence);
800+
registry.metadata = `${ipfsHash}-${event.address.toHexString()}-${
801+
registry.metaEvidenceCount
802+
}`;
803+
804+
const context = new DataSourceContext();
805+
context.setString('address', event.address.toHexString());
806+
context.setBigInt('count', registry.metaEvidenceCount);
807+
808+
LRegistryMetadataTemplate.createWithContext(ipfsHash, context);
809+
793810
metaEvidence.save();
794811

795812
if (
@@ -848,8 +865,11 @@ export function handleEvidence(event: EvidenceEvent): void {
848865
);
849866

850867
const ipfsHash = extractPath(event.params._evidence);
851-
evidence.metadata = ipfsHash;
852-
EvidenceMetadataTemplate.create(ipfsHash);
868+
evidence.metadata = `${ipfsHash}-${evidence.id}`;
869+
870+
const context = new DataSourceContext();
871+
context.setString('evidenceId', evidence.id);
872+
EvidenceMetadataTemplate.createWithContext(ipfsHash, context);
853873

854874
evidenceGroup.save();
855875
evidence.save();

src/fileHandlers/EvidenceMetadataHandler.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,11 @@ import { EvidenceMetadata } from '../../generated/schema';
33

44
export function handleGTCREvidenceMetadata(content: Bytes): void {
55
const id = dataSource.stringParam();
6-
const evidence = new EvidenceMetadata(id);
6+
7+
const context = dataSource.context();
8+
const evidenceId = context.getString('evidenceId');
9+
10+
const evidence = new EvidenceMetadata(`${id}-${evidenceId}`);
711
const value = json.fromBytes(content).toObject();
812

913
log.debug(`ipfs hash : {}, content : {}`, [id, content.toString()]);

src/fileHandlers/LEvidenceMetadataHandler.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,10 @@ import { EvidenceMetadata } from '../../generated/schema';
33

44
export function handleLGTCREvidenceMetadata(content: Bytes): void {
55
const id = dataSource.stringParam();
6-
const evidence = new EvidenceMetadata(id);
6+
const context = dataSource.context();
7+
const evidenceId = context.getString('evidenceId');
8+
9+
const evidence = new EvidenceMetadata(`${id}-${evidenceId}`);
710
const value = json.fromBytes(content).toObject();
811

912
log.debug(`ipfs hash : {}, content : {}`, [id, content.toString()]);

src/fileHandlers/LItemMetadataHandler.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,21 @@ import { ItemProp, LItemMetadata } from '../../generated/schema';
33
import { JSONValueToBool, JSONValueToMaybeString } from '../utils';
44

55
export function handleLItemMetadata(content: Bytes): void {
6-
const id = dataSource.stringParam();
7-
const metadata = new LItemMetadata(id);
6+
const ipfsHash = dataSource.stringParam();
87

98
const value = json.fromBytes(content).toObject();
10-
const context = dataSource.context();
119

10+
const context = dataSource.context();
1211
const graphItemID = context.getString('graphItemID');
1312
const address = context.getString('address');
1413

14+
const id = `${ipfsHash}-${graphItemID}`;
15+
16+
const metadata = new LItemMetadata(id);
17+
1518
metadata.keywords = address;
1619

17-
log.debug(`ipfs hash : {}, content : {}`, [id, content.toString()]);
20+
log.debug(`ipfs hash : {}, content : {}`, [ipfsHash, content.toString()]);
1821

1922
if (!value) {
2023
log.warning(`Error converting object for graphItemId {}`, [graphItemID]);
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
import { Bytes, dataSource, json, log } from '@graphprotocol/graph-ts';
2+
import { LRegistryMetadata } from '../../generated/schema';
3+
import { JSONValueToBool, JSONValueToMaybeString } from '../utils';
4+
5+
export function handleLRegistryMetadata(content: Bytes): void {
6+
const ipfsHash = dataSource.stringParam();
7+
8+
const value = json.fromBytes(content).toObject();
9+
10+
const context = dataSource.context();
11+
const count = context.getBigInt('count');
12+
const address = context.getString('address');
13+
14+
const id = `${ipfsHash}-${address}-${count.toString()}`;
15+
16+
const metadata = new LRegistryMetadata(id);
17+
18+
log.debug(`ipfs hash : {}, content : {}`, [ipfsHash, content.toString()]);
19+
20+
if (!value) {
21+
log.warning(`Error converting object for hash {}`, [ipfsHash]);
22+
metadata.save();
23+
return;
24+
}
25+
26+
const metadataValue = value.get('metadata');
27+
if (!metadataValue) {
28+
log.error(`Error getting metadata values from ipfs hash {}`, [ipfsHash]);
29+
metadata.save();
30+
return;
31+
}
32+
33+
const data = metadataValue.toObject();
34+
35+
const title = data.get('tcrTitle');
36+
const description = data.get('tcrDescription');
37+
const itemName = data.get('itemName');
38+
const itemNamePlural = data.get('itemNamePlural');
39+
const isConnectedTCR = data.get('isConnectedTCR');
40+
const requireRemovalEvidence = data.get('requireRemovalEvidence');
41+
const isTCRofTcrs = data.get('isTCRofTcrs');
42+
const parentTCRAddress = data.get('parentTCRAddress');
43+
const relTcrDisabled = data.get('relTcrDisabled');
44+
45+
metadata.title = JSONValueToMaybeString(title);
46+
metadata.description = JSONValueToMaybeString(description);
47+
metadata.itemName = JSONValueToMaybeString(itemName);
48+
metadata.parentTCRAddress = JSONValueToMaybeString(parentTCRAddress);
49+
metadata.itemNamePlural = JSONValueToMaybeString(itemNamePlural);
50+
metadata.isConnectedTCR = JSONValueToBool(isConnectedTCR);
51+
metadata.requireRemovalEvidence = JSONValueToBool(requireRemovalEvidence);
52+
metadata.isTCRofTcrs = JSONValueToBool(isTCRofTcrs);
53+
metadata.relTcrDisabled = JSONValueToBool(relTcrDisabled);
54+
55+
metadata.save();
56+
}

0 commit comments

Comments
 (0)