Skip to content

Commit

Permalink
add common workspace
Browse files Browse the repository at this point in the history
  • Loading branch information
yuetloo committed Aug 17, 2023
1 parent 02bed53 commit c658601
Show file tree
Hide file tree
Showing 8 changed files with 161 additions and 0 deletions.
2 changes: 2 additions & 0 deletions common/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
build
node_modules
1 change: 1 addition & 0 deletions common/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# Common clr.fund utility functions used by contracts and vue-app
28 changes: 28 additions & 0 deletions common/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
{
"name": "@clrfund/common",
"version": "0.0.1",
"description": "Common utility functions used by clrfund scripts and app",
"main": "src/index",
"scripts": {
"build": "tsc",
"lint": "eslint 'src/**/*.ts'",
"clean": "rm -rf build"
},
"license": "GPL-3.0",
"devDependencies": {
"eslint": "^8.31.0",
"typescript": "^4.9.3"
},
"dependencies": {
"ethers": "^5.7.2"
},
"repository": {
"type": "git",
"url": "git+https://github.com/clrfund/monorepo.git"
},
"author": "",
"bugs": {
"url": "https://github.com/clrfund/monorepo/issues"
},
"homepage": "https://github.com/clrfund/monorepo#readme"
}
20 changes: 20 additions & 0 deletions common/src/block.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import { providers } from 'ethers'

export interface Block {
blockNumber: number
hash: string
stateRoot: string
}

/*
* get the block stateRoot using eth_getBlockByHash
*/
export async function getBlock(
blockNumber: number,
provider: providers.JsonRpcProvider
): Promise<Block> {
const block = await provider.getBlock(blockNumber)
const blockParams = [block.hash, false]
const rawBlock = await provider.send('eth_getBlockByHash', blockParams)
return { blockNumber, hash: block.hash, stateRoot: rawBlock.stateRoot }
}
2 changes: 2 additions & 0 deletions common/src/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
export * from './block'
export * from './proof'
85 changes: 85 additions & 0 deletions common/src/proof.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
import { utils, providers } from 'ethers'

/**
* RLP encode the proof returned from eth_getProof
* @param proof proof from the eth_getProof
* @returns
*/
export function rlpEncodeProof(proof: string[]) {
const decodedProof = proof.map((node: string) => utils.RLP.decode(node))

return utils.RLP.encode(decodedProof)
}

/**
* The storage key used in eth_getProof and eth_getStorageAt
* @param account Account address
* @param slotIndex Slot index of the balanceOf storage
* @returns storage key used in the eth_getProof params
*/
export function getStorageKey(account: string, slotIndex: number) {
return utils.keccak256(
utils.concat([
utils.hexZeroPad(account, 32),
utils.hexZeroPad(utils.hexValue(slotIndex), 32),
])
)
}

/**
* Get proof from eth_getProof
* @param params Parameter fro eth_getProof
* @returns proof returned from eth_getProof
*/
async function getProof(
params: Array<string | string[]>,
provider: providers.JsonRpcProvider
): Promise<any> {
try {
const proof = await provider.send('eth_getProof', params)
return proof
} catch (err) {
console.error(
'Unable to get proof. Your node may not support eth_getProof. Try a different provider such as Infura',
err
)
throw err
}
}
/**
* Get the storage proof
* @param token Token contract address
* @param blockHash The block hash to get the proof for
* @param provider provider to connect to the node
* @returns proof returned from eth_getProof
*/
export async function getAccountProof(
token: string,
blockHash: string,
provider: providers.JsonRpcProvider
): Promise<any> {
const params = [token, [], blockHash]
return getProof(params, provider)
}

/**
* Get the storage proof
* @param token Token contract address
* @param blockHash The block hash to get the storage proof for
* @param userAccount User account to get the proof for
* @param storageSlotIndex The storage index for the balanceOf storage
* @param provider provider to connect to the node
* @returns proof returned from eth_getProof
*/
export async function getStorageProof(
token: string,
blockHash: string,
userAccount: string,
storageSlotIndex: number,
provider: providers.JsonRpcProvider
): Promise<any> {
const storageKey = getStorageKey(userAccount, storageSlotIndex)

const params = [token, [storageKey], blockHash]
return getProof(params, provider)
}
22 changes: 22 additions & 0 deletions common/tsconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
{
"compilerOptions": {
"skipLibCheck": true,
"experimentalDecorators": true,
"alwaysStrict": true,
"noImplicitAny": false,
"forceConsistentCasingInFileNames": true,
"noUnusedLocals": false,
"noUnusedParameters": false,
"noImplicitReturns": true,
"noFallthroughCasesInSwitch": true,
"sourceMap": true,
"strict": true,
"outDir": "./build",
"target": "es2018",
"esModuleInterop": true,
"module": "commonjs",
"declaration": true
},
"exclude": ["node_modules/**"],
"include": ["./src"]
}
1 change: 1 addition & 0 deletions contracts/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
},
"devDependencies": {
"@clrfund/maci-utils": "^0.0.1",
"@clrfund/common": "^0.0.1",
"@ethereum-waffle/mock-contract": "^3.4.4",
"@kleros/gtcr-encoder": "^1.4.0",
"@nomiclabs/hardhat-ethers": "^2.2.1",
Expand Down

0 comments on commit c658601

Please sign in to comment.