Skip to content

Commit

Permalink
Merge pull request #454 from kleros/fix/retry-metaevidence-loading
Browse files Browse the repository at this point in the history
Fix: add retries to getmetaevidence
  • Loading branch information
alcercu authored Jan 20, 2025
2 parents c5597ba + eddaefd commit 3b17d6c
Show file tree
Hide file tree
Showing 2 changed files with 90 additions and 79 deletions.
160 changes: 83 additions & 77 deletions src/bootstrap/dataloader.js
Original file line number Diff line number Diff line change
Expand Up @@ -89,92 +89,98 @@ const fetchDataFromScript = async (scriptString, scriptParameters) => {

const funcs = {
async getMetaEvidence(chainID, arbitrated, arbitrator, disputeId) {
try {
const metaEvidenceUriData = await axios.get(
`${process.env.REACT_APP_METAEVIDENCE_URL}?chainId=${chainID}&disputeId=${disputeId}`
);

const uri = metaEvidenceUriData.data?.metaEvidenceUri;
if (!uri) throw new Error(`No MetaEvidence log for disputeId ${disputeId} on chainID ${chainID}`);

let metaEvidenceJSON = (await axios.get(getHttpUri(uri))).data;

const updateDict = {
evidenceDisplayInterfaceURL: "evidenceDisplayInterfaceURI",
evidenceDisplayInterfaceURLHash: "evidenceDisplayInterfaceHash",
};

const replacePairs = Object.entries(updateDict);
for (const [legacyKey, updatedKey] of replacePairs) {
if (!metaEvidenceJSON[legacyKey]) continue;
const value = metaEvidenceJSON[legacyKey];
delete metaEvidenceJSON[legacyKey];
metaEvidenceJSON[updatedKey] = value;
}

if (metaEvidenceJSON.rulingOptions && !metaEvidenceJSON.rulingOptions.type)
metaEvidenceJSON.rulingOptions.type = "single-select";

if (metaEvidenceJSON.dynamicScriptURI) {
const scriptURI =
chainID === 1 && disputeId === "1621"
? getHttpUri("/ipfs/Qmf1k727vP7qZv21MDB8vwL6tfVEKPCUQAiw8CTfHStkjf")
: getHttpUri(metaEvidenceJSON.dynamicScriptURI);

console.info("Fetching dynamic script file at", scriptURI);
const startTime = Date.now();
const maxTime = 120000;
const waitTime = 5000;
while (Date.now() - startTime < maxTime) {
try {
const metaEvidenceUriData = await axios.get(
`${process.env.REACT_APP_METAEVIDENCE_URL}?chainId=${chainID}&disputeId=${disputeId}`
);

const uri = metaEvidenceUriData.data?.metaEvidenceUri;
if (!uri) throw new Error(`No MetaEvidence log for disputeId ${disputeId} on chainID ${chainID}`);

let metaEvidenceJSON = (await axios.get(getHttpUri(uri))).data;

const updateDict = {
evidenceDisplayInterfaceURL: "evidenceDisplayInterfaceURI",
evidenceDisplayInterfaceURLHash: "evidenceDisplayInterfaceHash",
};

const fileResponse = await axios.get(scriptURI);
const replacePairs = Object.entries(updateDict);
for (const [legacyKey, updatedKey] of replacePairs) {
if (!metaEvidenceJSON[legacyKey]) continue;
const value = metaEvidenceJSON[legacyKey];
delete metaEvidenceJSON[legacyKey];
metaEvidenceJSON[updatedKey] = value;
}

if (fileResponse.status !== 200) throw new Error(`Unable to fetch dynamic script file at ${scriptURI}.`);
if (metaEvidenceJSON.rulingOptions && !metaEvidenceJSON.rulingOptions.type)
metaEvidenceJSON.rulingOptions.type = "single-select";

if (metaEvidenceJSON.dynamicScriptURI) {
const scriptURI =
chainID === 1 && disputeId === "1621"
? getHttpUri("/ipfs/Qmf1k727vP7qZv21MDB8vwL6tfVEKPCUQAiw8CTfHStkjf")
: getHttpUri(metaEvidenceJSON.dynamicScriptURI);

console.info("Fetching dynamic script file at", scriptURI);

const fileResponse = await axios.get(scriptURI);

if (fileResponse.status !== 200) throw new Error(`Unable to fetch dynamic script file at ${scriptURI}.`);

const injectedParameters = {
arbitratorChainID: metaEvidenceJSON.arbitratorChainID || chainID,
arbitrableChainID: metaEvidenceJSON.arbitrableChainID || chainID,
disputeID: disputeId,
};

injectedParameters.arbitrableContractAddress = injectedParameters.arbitrableContractAddress || arbitrated;
injectedParameters.arbitratorJsonRpcUrl =
injectedParameters.arbitratorJsonRpcUrl || getReadOnlyRpcUrl(injectedParameters.arbitratorChainID);
injectedParameters.arbitrableChainID = injectedParameters.arbitrableChainID || arbitrator;
injectedParameters.arbitrableJsonRpcUrl =
injectedParameters.arbitrableJsonRpcUrl || getReadOnlyRpcUrl(injectedParameters.arbitrableChainID);

if (
injectedParameters.arbitratorChainID !== undefined &&
injectedParameters.arbitratorJsonRpcUrl === undefined
) {
console.warn(
`Could not obtain a valid 'arbitratorJsonRpcUrl' for chain ID ${injectedParameters.arbitratorChainID} on the Arbitrator side.`
);
}

const injectedParameters = {
arbitratorChainID: metaEvidenceJSON.arbitratorChainID || chainID,
arbitrableChainID: metaEvidenceJSON.arbitrableChainID || chainID,
disputeID: disputeId,
};
if (
injectedParameters.arbitrableChainID !== undefined &&
injectedParameters.arbitrableJsonRpcUrl === undefined
) {
console.warn(
`Could not obtain a valid 'arbitrableJsonRpcUrl' for chain ID ${injectedParameters.arbitrableChainID} on the Arbitrable side.`
);
}

injectedParameters.arbitrableContractAddress = injectedParameters.arbitrableContractAddress || arbitrated;
injectedParameters.arbitratorJsonRpcUrl =
injectedParameters.arbitratorJsonRpcUrl || getReadOnlyRpcUrl(injectedParameters.arbitratorChainID);
injectedParameters.arbitrableChainID = injectedParameters.arbitrableChainID || arbitrator;
injectedParameters.arbitrableJsonRpcUrl =
injectedParameters.arbitrableJsonRpcUrl || getReadOnlyRpcUrl(injectedParameters.arbitrableChainID);

if (
injectedParameters.arbitratorChainID !== undefined &&
injectedParameters.arbitratorJsonRpcUrl === undefined
) {
console.warn(
`Could not obtain a valid 'arbitratorJsonRpcUrl' for chain ID ${injectedParameters.arbitratorChainID} on the Arbitrator side.`
);
}
const metaEvidenceEdits = await fetchDataFromScript(fileResponse.data, injectedParameters);

if (
injectedParameters.arbitrableChainID !== undefined &&
injectedParameters.arbitrableJsonRpcUrl === undefined
) {
console.warn(
`Could not obtain a valid 'arbitrableJsonRpcUrl' for chain ID ${injectedParameters.arbitrableChainID} on the Arbitrable side.`
);
metaEvidenceJSON = {
...metaEvidenceJSON,
...metaEvidenceEdits,
};
}

const metaEvidenceEdits = await fetchDataFromScript(fileResponse.data, injectedParameters);

metaEvidenceJSON = {
...metaEvidenceJSON,
...metaEvidenceEdits,
};
return metaEvidenceJSON;
} catch (err) {
await new Promise((r) => setTimeout(() => r(), waitTime));
console.warn("Failed to get the evidence:", err);
}

return metaEvidenceJSON;
} catch (err) {
console.warn("Failed to get the evidence:", err);
return {
description:
"The data for this case is not formatted correctly or has been tampered since the time of its submission. Please refresh the page and refuse to arbitrate if the problem persists.",
title: "Invalid or tampered case data, refuse to arbitrate.",
};
}
return {
description:
"The data for this case is not formatted correctly or has been tampered since the time of its submission. Please refresh the page and refuse to arbitrate if the problem persists.",
title: "Invalid or tampered case data, refuse to arbitrate.",
};
},
async loadPolicy(URI) {
if (!URI) {
Expand Down
9 changes: 7 additions & 2 deletions src/components/case-details-card.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -424,12 +424,17 @@ export default function CaseDetailsCard({ ID }) {
]);

useEffect(() => {
if (dispute?.arbitrated && !arbitrableWhitelist[arbitrableChainID]?.includes(dispute?.arbitrated.toLowerCase())) {
if (
metaEvidence &&
metaEvidence.title !== "Invalid or tampered case data, refuse to arbitrate." &&
dispute?.arbitrated &&
!arbitrableWhitelist[arbitrableChainID]?.includes(dispute?.arbitrated.toLowerCase())
) {
console.warn("Arbitrable NOT included in whitelist for evidence display: ", dispute?.arbitrated);
} else {
console.info("Arbitrable included in whitelist for evidence display: ", dispute?.arbitrated);
}
}, [dispute?.arbitrated, arbitrableChainID]);
}, [dispute?.arbitrated, arbitrableChainID, metaEvidence]);

const evidenceDisplayInterfaceURL = useMemo(() => {
const normalizeIPFSUri = (uri) => uri.replace(/^\/ipfs\//, "https://cdn.kleros.link/ipfs/");
Expand Down

0 comments on commit 3b17d6c

Please sign in to comment.