From fef03a336d9d2c9d96c602e9edd1e5e222884811 Mon Sep 17 00:00:00 2001 From: jaybuidl Date: Fri, 26 May 2023 02:13:27 +0100 Subject: [PATCH] feat: vea sdk published --- contracts/scripts/publish.sh | 2 +- validator-cli/package.json | 15 ++----- validator-cli/src/ArbToEth/index.ts | 7 ---- validator-cli/src/ArbToEth/watcher.ts | 59 +++++++++++---------------- validator-cli/src/index.ts | 0 validator-cli/src/utils/contracts.ts | 31 -------------- validator-cli/src/utils/envVar.ts | 16 -------- validator-cli/src/utils/logger.ts | 28 ------------- validator-cli/tsconfig.json | 11 ----- vea-sdk/.npmignore | 3 ++ vea-sdk/README.md | 32 ++++++++++++++- vea-sdk/package.json | 22 +++++++--- vea-sdk/tsconfig.json | 11 ++++- yarn.lock | 8 +--- 14 files changed, 90 insertions(+), 155 deletions(-) delete mode 100644 validator-cli/src/ArbToEth/index.ts delete mode 100644 validator-cli/src/index.ts delete mode 100644 validator-cli/src/utils/contracts.ts delete mode 100644 validator-cli/src/utils/envVar.ts delete mode 100644 validator-cli/src/utils/logger.ts create mode 100644 vea-sdk/.npmignore diff --git a/contracts/scripts/publish.sh b/contracts/scripts/publish.sh index 3fe76910..32a3c894 100755 --- a/contracts/scripts/publish.sh +++ b/contracts/scripts/publish.sh @@ -23,7 +23,7 @@ trap _finally EXIT yarn version $1 mkdir dist -cp -pr README.md deployments src/ dist/ +cp -pr README.md deployments typechain-types src/ dist/ rm -rf dist/test jq 'del(.scripts.prepare)' package.json > dist/package.json diff --git a/validator-cli/package.json b/validator-cli/package.json index 54ba8578..f6c18f62 100644 --- a/validator-cli/package.json +++ b/validator-cli/package.json @@ -10,25 +10,18 @@ "yarn": "3.3.1" }, "scripts": { - "start": "NODE_NO_WARNINGS=1 NODE_OPTIONS=--experimental-fetch ts-node ./src/ArbToEth/index.ts", - "pm2:start": "pm2 start 'yarn start' --name watcher --cron '*/10 * * * *' --no-autorestart", - "start-chiado-devnet": "NODE_NO_WARNINGS=1 NODE_OPTIONS=--experimental-fetch ts-node ./src/devnet/arbToChiado/happyPath.ts", - "start-goerli-devnet": "NODE_NO_WARNINGS=1 NODE_OPTIONS=--experimental-fetch ts-node ./src/devnet/arbToGoerli/happyPath.ts" + "start": "npx ts-node ./src/ArbToEth/watcher.ts", + "start-chiado-devnet": "npx ts-node ./src/devnet/arbToChiado/happyPath.ts", + "start-goerli-devnet": "npx ts-node ./src/devnet/arbToGoerli/happyPath.ts" }, "dependencies": { "@arbitrum/sdk": "^3.1.2", "@kleros/vea-contracts": "workspace:^", - "@logtail/pino": "^0.4.0", "@typechain/ethers-v5": "^10.2.0", "dotenv": "^16.0.3", - "pino": "^8.14.1", - "pino-pretty": "^10.0.0", "pm2": "^5.2.2", + "typescript": "^4.9.5", "web3": "^1.10.0", "web3-batched-send": "^1.0.3" - }, - "devDependencies": { - "ts-node": "^10.9.1", - "typescript": "^4.9.5" } } diff --git a/validator-cli/src/ArbToEth/index.ts b/validator-cli/src/ArbToEth/index.ts deleted file mode 100644 index c26b2c8d..00000000 --- a/validator-cli/src/ArbToEth/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -import watch from "./watcher"; - -try { - watch(); -} catch (error) { - console.log("error", error); -} diff --git a/validator-cli/src/ArbToEth/watcher.ts b/validator-cli/src/ArbToEth/watcher.ts index f21022cf..d25c0403 100644 --- a/validator-cli/src/ArbToEth/watcher.ts +++ b/validator-cli/src/ArbToEth/watcher.ts @@ -1,44 +1,34 @@ import { getVeaOutboxArbToEthProvider, getVeaInboxArbToEth } from "../utils/ethers"; import { JsonRpcProvider } from "@ethersproject/providers"; -import { arbToEthDevnet, IBridge } from "../utils/contracts"; -import envVar from "../utils/envVar"; -import baseLogger from "../utils/logger"; + +require("dotenv").config(); const watch = async () => { - const bridge: IBridge = arbToEthDevnet; - const logger = baseLogger.child({ - bridge: bridge.label, - inbox: bridge.inboxAddress, - outbox: bridge.outboxAddress, - }); - logger.info("Watching for claims..."); - logger.debug("Inbox RPC: %s", bridge.inboxRpc); - logger.debug("Outbox RPC: %s", bridge.outboxRpc); + const l1provider = new JsonRpcProvider(process.env.RPC_VEAOUTBOX); - const privateKey = envVar("PRIVATE_KEY"); - const rpcProviderOutbox = new JsonRpcProvider(bridge.outboxRpc); - const veaOutbox = getVeaOutboxArbToEthProvider(bridge.outboxAddress, privateKey, rpcProviderOutbox); - const veaInbox = getVeaInboxArbToEth(bridge.inboxAddress, privateKey, bridge.inboxRpc); + const veaOutbox = getVeaOutboxArbToEthProvider(process.env.VEAOUTBOX_ADDRESS, process.env.PRIVATE_KEY, l1provider); + + const veaInbox = getVeaInboxArbToEth(process.env.VEAINBOX_ADDRESS, process.env.PRIVATE_KEY, process.env.RPC_VEAINBOX); const deposit = await veaOutbox.deposit(); const epochPeriod = (await veaOutbox.epochPeriod()).toNumber(); const claimDelay = (await veaOutbox.claimDelay()).toNumber(); const challengePeriod = (await veaOutbox.challengePeriod()).toNumber(); - const currentBlockNumber = await rpcProviderOutbox.getBlockNumber(); - const challengeableTimeStart = Math.floor(Date.now() / 1000) - challengePeriod; - const challengeableBlockStart = currentBlockNumber - Math.ceil((challengePeriod * 2) / 12); + const currentBlockNumber = await l1provider.getBlockNumber(); + const challengableTimeStart = Math.floor(Date.now() / 1000) - challengePeriod; + const challengableBlockStart = currentBlockNumber - Math.ceil((challengePeriod * 2) / 12); - const logs = await rpcProviderOutbox.getLogs({ - address: bridge.outboxAddress, + const logs = await l1provider.getLogs({ + address: process.env.VEAOUTBOX_ADDRESS, topics: veaOutbox.filters.Claimed(null, null).topics, - fromBlock: challengeableBlockStart, + fromBlock: challengableBlockStart, }); - logger.info("Claim events found: %d", logs.length); - for (var log of logs) { - const claimedTimestamp = (await rpcProviderOutbox.getBlock(log.blockNumber)).timestamp; - logger.info({ + for (let i = 0; i < logs.length; i++) { + const log = logs[i]; + const claimedTimestamp = (await l1provider.getBlock(log.blockNumber)).timestamp; + console.log({ stateRoot: log.data, claimer: "0x" + log.topics[1].substring(26), timestamp: claimedTimestamp, @@ -46,14 +36,14 @@ const watch = async () => { honest: "0", challenger: "0x0000000000000000000000000000000000000000", }); - if (claimedTimestamp < challengeableTimeStart) { + if (claimedTimestamp < challengableTimeStart) { continue; } else { const claimedStateRoot = log.data; const claimedEpoch = Math.floor((claimedTimestamp - claimDelay) / epochPeriod); const inboxStateRoot = await veaInbox.snapshots(claimedEpoch); if (claimedStateRoot !== inboxStateRoot) { - logger.warn(`Challenging claim ${claimedStateRoot} at epoch ${claimedEpoch}.`); + console.log(`Challenging claim ${claimedStateRoot} at epoch ${claimedEpoch}.`); const unchallengedClaim = { stateRoot: claimedStateRoot, claimer: "0x" + log.topics[1].substring(26), @@ -64,20 +54,17 @@ const watch = async () => { }; const unchallengedClaimHash = await veaOutbox.hashClaim(unchallengedClaim); const claimHash = await veaOutbox.claimHashes(claimedEpoch); - logger.warn(unchallengedClaim); - logger.warn(unchallengedClaimHash); - logger.warn(claimHash); - logger.warn(claimedEpoch); + console.log(unchallengedClaim); + console.log(unchallengedClaimHash); + console.log(claimHash); + console.log(claimedEpoch); if (unchallengedClaimHash == claimHash) { const txn = await veaOutbox.challenge(claimedEpoch, unchallengedClaim, { value: deposit }); - logger.warn(`Challenge Txn: ${txn.hash}`); + console.log(`Challenge Txn: ${txn.hash}`); } } } } - - // TODO: make this env var optional, skip fetch if undefined - fetch(envVar("HEARTBEAT_URL")); }; export default watch; diff --git a/validator-cli/src/index.ts b/validator-cli/src/index.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/validator-cli/src/utils/contracts.ts b/validator-cli/src/utils/contracts.ts deleted file mode 100644 index a894e67b..00000000 --- a/validator-cli/src/utils/contracts.ts +++ /dev/null @@ -1,31 +0,0 @@ -import VeaInboxArbToGnosisDevnet from "@kleros/vea-contracts/deployments/arbitrumGoerli/VeaInboxArbToGnosisDevnet.json"; -import VeaOutboxArbToGnosisDevnet from "@kleros/vea-contracts/deployments/chiado/VeaOutboxArbToGnosisDevnet.json"; - -import VeaInboxArbToEthDevnet from "@kleros/vea-contracts/deployments/arbitrumGoerli/VeaInboxArbToEthDevnet.json"; -import VeaOutboxArbToEthDevnet from "@kleros/vea-contracts/deployments/goerli/VeaOutboxArbToEthDevnet.json"; - -import envVar from "./envVar"; - -export interface IBridge { - label: string; - inboxAddress: `0x${string}`; - outboxAddress: `0x${string}`; - inboxRpc: string; - outboxRpc: string; -} - -export const arbToGnosisDevnet: IBridge = { - label: "Arbitrum to Chiado Devnet", - inboxAddress: VeaInboxArbToGnosisDevnet.address as `0x${string}`, - outboxAddress: VeaOutboxArbToGnosisDevnet.address as `0x${string}`, - inboxRpc: envVar("RPC_ARB_GOERLI"), - outboxRpc: envVar("RPC_CHIADO"), -}; - -export const arbToEthDevnet: IBridge = { - label: "Arbitrum to Goerli Devnet", - inboxAddress: VeaInboxArbToEthDevnet.address as `0x${string}`, - outboxAddress: VeaOutboxArbToEthDevnet.address as `0x${string}`, - inboxRpc: envVar("RPC_ARB_GOERLI"), - outboxRpc: envVar("RPC_GOERLI"), -}; diff --git a/validator-cli/src/utils/envVar.ts b/validator-cli/src/utils/envVar.ts deleted file mode 100644 index a81b674e..00000000 --- a/validator-cli/src/utils/envVar.ts +++ /dev/null @@ -1,16 +0,0 @@ -import dotenv from "dotenv"; -import logger from "./logger"; - -dotenv.config(); - -function envVar(key: string): string { - const value = process.env[key]; - if (value === undefined) { - const error = new Error(`Environment variable ${key} is undefined`); - logger.error(error); - throw error; - } - return value; -} - -export default envVar; diff --git a/validator-cli/src/utils/logger.ts b/validator-cli/src/utils/logger.ts deleted file mode 100644 index a3e9a648..00000000 --- a/validator-cli/src/utils/logger.ts +++ /dev/null @@ -1,28 +0,0 @@ -import pino from "pino"; -import envVar from "./envVar"; - -// TODO: make this env var optional, skip fetch if undefined -const logtailToken = envVar("LOGTAIL_TOKEN"); -const transport = pino.transport({ - targets: [ - { - target: "@logtail/pino", - options: { sourceToken: logtailToken }, - level: "debug", - }, - { - target: "pino-pretty", - options: {}, - level: "debug", - }, - ], -}); -const logger = pino( - { - level: envVar("LOG_LEVEL"), // TODO: set it to info if not defined - timestamp: pino.stdTimeFunctions.isoTime, - }, - transport -); - -export default logger; diff --git a/validator-cli/tsconfig.json b/validator-cli/tsconfig.json index 8395e045..dbe3a5ab 100644 --- a/validator-cli/tsconfig.json +++ b/validator-cli/tsconfig.json @@ -1,15 +1,4 @@ { - "compilerOptions": { - "target": "es2021", - "module": "commonjs", - "strict": true, - "esModuleInterop": true, - "outDir": "dist", - "declaration": true, - "sourceMap": true, - "noImplicitAny": false, - "resolveJsonModule": true - }, "include": [ "src" ] diff --git a/vea-sdk/.npmignore b/vea-sdk/.npmignore new file mode 100644 index 00000000..b8b7024b --- /dev/null +++ b/vea-sdk/.npmignore @@ -0,0 +1,3 @@ +scripts +tsconfig.json +.env* diff --git a/vea-sdk/README.md b/vea-sdk/README.md index 329111fe..bfb50f10 100644 --- a/vea-sdk/README.md +++ b/vea-sdk/README.md @@ -1,3 +1,31 @@ -# Vea SDK +# Vea SDK npm -Something useful +This package facilitates the interactions with the Vea protocol. + +## Getting Started + +```bash +yarn add @kleros/vea-sdk +# or +npm install @kleros/vea-sdk +``` + +## Example + +```typescript +import { Wallet } from "@ethersproject/wallet"; +import VeaSdk from "../src/index"; +import envVar from "../src/utils/envVar"; + +// Create the Vea client +const vea = VeaSdk.ClientFactory.arbitrumGoerliToChiadoDevnet(envVar("RPC_ARB_GOERLI"), envVar("RPC_CHIADO")); + +// Get the message info +const messageId = 42; +const messageInfo = await vea.getMessageInfo(messageId); + +// Relay the message +const privateKey = envVar("PRIVATE_KEY"); +const wallet = new Wallet(privateKey, vea.outboxProvider); +await vea.relay(messageInfo, wallet); +``` diff --git a/vea-sdk/package.json b/vea-sdk/package.json index 980ea55f..e77c52b4 100644 --- a/vea-sdk/package.json +++ b/vea-sdk/package.json @@ -1,7 +1,9 @@ { "name": "@kleros/vea-sdk", - "version": "0.1.14", + "version": "0.2.0", "description": "SDK for the development of cross-chain apps on Vea", + "main": "dist/index.js", + "types": "dist/index.d.ts", "repository": { "type": "git", "url": "git+ssh://git@github.com/kleros/vea.git" @@ -10,7 +12,7 @@ "bugs": { "url": "https://github.com/kleros/vea/issues" }, - "homepage": "https://github.com/kleros/vea#readme", + "homepage": "https://vea.ninja", "license": "MIT", "packageManager": "yarn@3.3.1", "engines": { @@ -25,10 +27,15 @@ "tag": "latest" }, "scripts": { - "start": "NODE_NO_WARNINGS=1 NODE_OPTIONS=--experimental-fetch ts-node ./src/run.ts" + "start": "NODE_NO_WARNINGS=1 NODE_OPTIONS=--experimental-fetch ts-node ./src/run.ts", + "release:patch": "yarn version patch && yarn npm publish", + "release:minor": "yarn version minor && yarn npm publish", + "release:major": "yarn version major && yarn npm publish", + "clean": "rm -rf dist", + "prepublish": "yarn tsc || echo" }, "dependencies": { - "@kleros/vea-contracts": "workspace:^", + "@kleros/vea-contracts": "workspace:^0.2.1", "@logtail/pino": "^0.4.0", "@typechain/ethers-v5": "^10.2.0", "dotenv": "^16.0.3", @@ -42,5 +49,10 @@ "devDependencies": { "ts-node": "^10.9.1", "typescript": "^4.9.5" - } + }, + "files": [ + "dist", + "src", + "examples" + ] } diff --git a/vea-sdk/tsconfig.json b/vea-sdk/tsconfig.json index 8395e045..cdb804a4 100644 --- a/vea-sdk/tsconfig.json +++ b/vea-sdk/tsconfig.json @@ -8,9 +8,18 @@ "declaration": true, "sourceMap": true, "noImplicitAny": false, - "resolveJsonModule": true + "resolveJsonModule": true, + "paths": { + "@kleros/vea-contracts": [ + "../contracts" + ] + } }, "include": [ "src" + ], + "exclude": [ + "node_modules", + "dist" ] } diff --git a/yarn.lock b/yarn.lock index c58ff8f1..9ee6cf30 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3357,7 +3357,7 @@ __metadata: languageName: node linkType: hard -"@kleros/vea-contracts@workspace:^, @kleros/vea-contracts@workspace:contracts": +"@kleros/vea-contracts@workspace:^, @kleros/vea-contracts@workspace:^0.2.1, @kleros/vea-contracts@workspace:contracts": version: 0.0.0-use.local resolution: "@kleros/vea-contracts@workspace:contracts" dependencies: @@ -3425,7 +3425,7 @@ __metadata: version: 0.0.0-use.local resolution: "@kleros/vea-sdk@workspace:vea-sdk" dependencies: - "@kleros/vea-contracts": "workspace:^" + "@kleros/vea-contracts": "workspace:^0.2.1" "@logtail/pino": ^0.4.0 "@typechain/ethers-v5": ^10.2.0 dotenv: ^16.0.3 @@ -3446,13 +3446,9 @@ __metadata: dependencies: "@arbitrum/sdk": ^3.1.2 "@kleros/vea-contracts": "workspace:^" - "@logtail/pino": ^0.4.0 "@typechain/ethers-v5": ^10.2.0 dotenv: ^16.0.3 - pino: ^8.14.1 - pino-pretty: ^10.0.0 pm2: ^5.2.2 - ts-node: ^10.9.1 typescript: ^4.9.5 web3: ^1.10.0 web3-batched-send: ^1.0.3