Skip to content

Commit

Permalink
refactor(sdk): moved things around into a new src/ folder
Browse files Browse the repository at this point in the history
  • Loading branch information
jaybuidl committed Jan 12, 2024
1 parent 0ef5d26 commit 14d36d2
Show file tree
Hide file tree
Showing 33 changed files with 455 additions and 107 deletions.
27 changes: 0 additions & 27 deletions kleros-sdk/dataMappings/utils/actionTypeDetectors.ts

This file was deleted.

1 change: 0 additions & 1 deletion kleros-sdk/dataMappings/utils/isHexAddress.ts

This file was deleted.

1 change: 0 additions & 1 deletion kleros-sdk/dataMappings/utils/isHexId.ts

This file was deleted.

4 changes: 4 additions & 0 deletions kleros-sdk/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,10 @@
"repository": "[email protected]:kleros/kleros-v2.git",
"author": "Kleros",
"license": "MIT",
"alias": {
"src": "./src",
"dataMappings": "./src/dataMappings"
},
"packageManager": "[email protected]",
"engines": {
"node": ">=16.0.0"
Expand Down
File renamed without changes.
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { parseAbiItem } from "viem";
import { AbiCallMapping } from "../utils/actionTypes";
import { createResultObject } from "../utils/createResultObject";
import { configureSDK, getPublicClient } from "../utils/configureSDK";
import { AbiCallMapping } from "src/dataMappings/utils/actionTypes";
import { createResultObject } from "src/dataMappings/utils/createResultObject";
import { configureSDK, getPublicClient } from "src/sdk";

export const callAction = async (mapping: AbiCallMapping) => {
configureSDK({ apiKey: process.env.ALCHEMY_API_KEY });
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { parseAbiItem } from "viem";
import { AbiEventMapping } from "../utils/actionTypes";
import { createResultObject } from "../utils/createResultObject";
import { configureSDK, getPublicClient } from "../utils/configureSDK";
import { AbiEventMapping } from "src/dataMappings/utils/actionTypes";
import { createResultObject } from "src/dataMappings/utils/createResultObject";
import { configureSDK, getPublicClient } from "src/sdk";

export const eventAction = async (mapping: AbiEventMapping) => {
configureSDK({ apiKey: process.env.ALCHEMY_API_KEY });
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import fetch from "node-fetch";
import { FetchIpfsJsonMapping } from "../utils/actionTypes";
import { createResultObject } from "../utils/createResultObject";
import { MAX_BYTE_SIZE } from "../utils/maxByteSize";
import { FetchIpfsJsonMapping } from "src/dataMappings/utils/actionTypes";
import { createResultObject } from "src/dataMappings/utils/createResultObject";
import { MAX_BYTE_SIZE } from "src/consts";

export const fetchIpfsJsonAction = async (mapping: FetchIpfsJsonMapping) => {
const { ipfsUri, seek, populate } = mapping;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { JsonMapping } from "../utils/actionTypes";
import { createResultObject } from "../utils/createResultObject";
import { createResultObject } from "src/dataMappings/utils/createResultObject";

export const jsonAction = (mapping: JsonMapping) => {
const { value: source, seek, populate } = mapping;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import fetch from "node-fetch";
import { SubgraphMapping } from "../utils/actionTypes";
import { createResultObject } from "../utils/createResultObject";
import { createResultObject } from "src/dataMappings/utils/createResultObject";

export const subgraphAction = async (mapping: SubgraphMapping) => {
const { endpoint, query, variables, seek, populate } = mapping;
Expand Down
75 changes: 75 additions & 0 deletions kleros-sdk/src/dataMappings/dataMapping.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
[
{
"type": "subgraph",
"endpoint": "https://api.thegraph.com/subgraphs/name/uniswap/uniswap-v2",
"query": "query($id: ID!) { pair(id: $id) { id token0Price token1Price } }",
"seek": [
"token0Price",
"token1Price"
],
"populate": [
"price1",
"price2"
]
},
{
"type": "abi/event",
"abi": "event StakeSet(address indexed _address, uint256 _courtID, uint256 _amount)",
"address": "0x9f8f72aa9304c8b593d555f12ef6589cc3a579a2",
"eventFilter": {
"fromBlock": "36205881",
"toBlock": "latest",
"args": {
"_courtID": 1
}
},
"seek": [
"amount"
],
"populate": [
"amount"
]
},
{
"type": "abi/call",
"abi": "function appealCost(uint256 _disputeID) public view returns (uint256)",
"address": "0x5a2bC1477ABE705dB4955Cda7DE064eA79D563d1",
"args": [
"1"
],
"seek": [
"cost"
],
"populate": [
"cost"
]
},
{
"type": "json",
"value": {
"name": "John Doe",
"age": 30,
"email": "[email protected]"
},
"seek": [
"name",
"age",
"email"
],
"populate": [
"name",
"age",
"email"
]
},
{
"type": "fetch/ipfs/json",
"ipfsUri": "ipfs://QmZ3Cmnip8bmFNruuTuCdxPymEjyK9VcQEyf2beDYcaHaK/metaEvidence.json",
"seek": [
"title"
],
"populate": [
"title"
]
}
]
92 changes: 92 additions & 0 deletions kleros-sdk/src/dataMappings/dataMapping.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
export type SubgraphMapping = {
endpoint: string; // Subgraph endpoint
query: string; // Subgraph query
seek: string[]; // Subgraph query parameters value used to populate the template variables
populate: string[]; // Populated template variables
};

export type AbiEventMapping = {
abi: string; // ABI of the contract emitting the event
address: string; // Address of the contract emitting the event
eventFilter: {
// Event filter (eg. specific parameter value, block number range, event index)
fromBlock: BigInt | string; // Block number range start
toBlock: BigInt | string; // Block number range end
args: any; // Event parameter value to filter on
};
seek: string[]; // Event parameters value used to populate the template variables
populate: string[]; // Populated template variables
};

export type AbiCallMapping = {
abi: string; // ABI of the contract emitting the event
address: string; // Address of the contract emitting the event
args: any[]; // Function arguments
seek: string[]; // Call return parameters used to populate the template variables
populate: string[]; // Populated template variables
};

export type JsonMapping = {
value: object; // Hardcoded object, to be stringified.
seek: string[]; // JSON keys used to populate the template variables
populate: string[]; // Populated template variables
};

export type FetchIpfsJsonMapping = {
ipfsUri: string; // IPFS URL
seek: string[]; // JSON keys used to populate the template variables
populate: string[]; // Populated template variables
};

const subgraphMappingExample: SubgraphMapping = {
endpoint: "https://api.thegraph.com/subgraphs/name/uniswap/uniswap-v2",
query: `
query($id: ID!) {
pair(id: $id) {
id
token0Price
token1Price
}
}
`,
seek: ["token0Price", "token1Price"],
populate: ["price1", "price2"],
};

const abiEventMappingExample: AbiEventMapping = {
abi: "event StakeSet(address indexed _address, uint256 _courtID, uint256 _amount)",
address: "0x9f8f72aa9304c8b593d555f12ef6589cc3a579a2",
eventFilter: {
fromBlock: BigInt(36205881),
toBlock: "latest",
args: {
_courtID: 1,
},
},
seek: ["amount"],
populate: ["amount"],
};

const abiCallMappingExample: AbiCallMapping = {
abi: "function appealCost(uint256 _disputeID) public view returns (uint256)",
address: "0x5a2bC1477ABE705dB4955Cda7DE064eA79D563d1",
args: [BigInt(1)],
seek: ["cost"],
populate: ["cost"],
};

const jsonMappingExample: JsonMapping = {
value: {
name: "John Doe",
age: 30,
email: "[email protected]",
},
seek: ["name", "age", "email"],
populate: ["name", "age", "email"],
};

const fetchIpfsJsonMappingExample: FetchIpfsJsonMapping = {
ipfsUri: "ipfs://QmZ3Cmnip8bmFNruuTuCdxPymEjyK9VcQEyf2beDYcaHaK/metaEvidence.json",
seek: ["title"],
populate: ["title"],
};
55 changes: 55 additions & 0 deletions kleros-sdk/src/dataMappings/decoder.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
import request from "graphql-request";
import { TypedDocumentNode } from "@graphql-typed-document-node/core";
import { DisputeDetails } from "./disputeDetails";

export type Decoder = (externalDisputeID: string, disputeTemplate: Partial<DisputeDetails>) => Promise<DisputeDetails>;

// https://github.com/ChainAgnostic/CAIPs/blob/main/CAIPs/caip-10.md
export type CAIP10 = `eip155:${number}:0x${string}`;

export const graphqlQueryFnHelper = async (
url: string,
query: TypedDocumentNode<any, any>,
parametersObject: Record<string, any>,
chainId = 421613
) => {
return request(url, query, parametersObject);
};

// TODO: generate graphql query
const disputeTemplateQuery = graphql(`
query DisputeTemplate($id: ID!) {
disputeTemplate(id: $id) {
id
templateTag
templateData
templateDataMappings
}
}
`);

export const genericDecoder = async (
externalDisputeID: string,
arbitrableDisputeID: string,
disputeTemplateID: string,
disputeTemplateRegistry: CAIP10
): Promise<DisputeDetails> => {
let subgraphUrl;
switch (disputeTemplateRegistry) {
case "eip155:421613:0x22A58a17F12A718d18C9B6Acca3E311Da1b00A04": // Devnet
subgraphUrl = process.env.REACT_APP_DISPUTE_TEMPLATE_ARBGOERLI_SUBGRAPH_DEVNET;
break;
case "eip155:421613:0xA55D4b90c1F8D1fD0408232bF6FA498dD6786385": // Testnet
subgraphUrl = process.env.REACT_APP_DISPUTE_TEMPLATE_ARBGOERLI_SUBGRAPH_TESTNET;
break;
default:
throw new Error(`Unsupported dispute template registry: ${disputeTemplateRegistry}`);
}
const { disputeTemplate } = await request(subgraphUrl, disputeTemplateQuery, { id: disputeTemplateID.toString() });
switch (disputeTemplate.specification) {
case "KIP99":
return await kip99Decoder(externalDisputeID, disputeTemplate);
default:
throw new Error(`Unsupported dispute template specification: ${disputeTemplate.specification}`);
}
};
39 changes: 39 additions & 0 deletions kleros-sdk/src/dataMappings/disputeDetails.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
export type DisputeDetails = {
title: string;
description: string;
question: string;
type: QuestionType;
answers: Answer[];
policyURI: string;
attachment: Attachment;
frontendUrl: string;
arbitrableChainID: string;
arbitrableAddress: `0x${string}`;
arbitratorChainID: string;
arbitratorAddress: `0x${string}`;
category: string;
lang: string;
specification: string;
version: string;
// missing metadata
};

export enum QuestionType {
Bool = "bool",
Datetime = "datetime",
MultipleSelect = "multiple-select",
SingleSelect = "single-select",
Uint = "uint",
}

export type Answer = {
title: string;
description: string;
id: `0x${string}`;
reserved: boolean;
};

export type Attachment = {
label: string;
uri: string;
};
Loading

0 comments on commit 14d36d2

Please sign in to comment.