forked from tornadocash/nova-ui
Compare commits
6 Commits
events-tsl
...
11ee25dbce
| Author | SHA1 | Date | |
|---|---|---|---|
|
11ee25dbce
|
|||
|
9414b751f7
|
|||
|
d86d3ff125
|
|||
|
6447563ea0
|
|||
|
28a83b6ec4
|
|||
|
f090e06026
|
16
README.md
16
README.md
@@ -2,29 +2,19 @@
|
||||
|
||||
## Build Setup
|
||||
|
||||
If you use the latest Node.js version, you should modify your NODE_OPTIONS env
|
||||
|
||||
```bash
|
||||
export NODE_OPTIONS="--openssl-legacy-provider"
|
||||
```
|
||||
|
||||
```bash
|
||||
# install dependencies
|
||||
$ yarn install
|
||||
|
||||
# serve with hot reload at localhost:3000
|
||||
$ yarn dev
|
||||
|
||||
# build for production and launch server
|
||||
$ yarn build
|
||||
$ yarn start
|
||||
|
||||
# generate static project
|
||||
$ yarn generate
|
||||
|
||||
# serve with hot reload at localhost:3000
|
||||
# should do yarn build first if worker files are changed
|
||||
$ yarn dev
|
||||
|
||||
# update cached events from node & subgraphs
|
||||
$ yarn update:events
|
||||
```
|
||||
|
||||
For detailed explanation on how things work, check out [Nuxt.js docs](https://nuxtjs.org).
|
||||
|
||||
@@ -4,14 +4,13 @@ import { BigNumber, Contract } from 'ethers'
|
||||
import { poseidon } from '@tornado/circomlib'
|
||||
import { decrypt } from 'eth-sig-util'
|
||||
|
||||
import { IndexedDB } from '../services/idb'
|
||||
import { BatchEventsService } from '../services/events/batch'
|
||||
import { getAllCommitments } from '../services/graph'
|
||||
import { ExtendedProvider } from '../services/provider'
|
||||
import { IndexedDB } from './services/idb'
|
||||
import { BatchEventsService } from './services/batch'
|
||||
import { getAllCommitments } from './services/graph'
|
||||
import { ExtendedProvider } from './services/provider'
|
||||
import { POOL_CONTRACT, RPC_LIST, FALLBACK_RPC_LIST, workerEvents, numbers } from './services/constants'
|
||||
import { sleep } from './services/utilities'
|
||||
import { poolAbi } from './services/pool'
|
||||
import { downloadEvents } from './services/downloadEvents'
|
||||
|
||||
const getProviderWithSigner = (chainId) => {
|
||||
return new ExtendedProvider(RPC_LIST[chainId], chainId, FALLBACK_RPC_LIST[chainId])
|
||||
@@ -166,14 +165,6 @@ const getCommitments = async ({ withCache, lastSyncBlock }) => {
|
||||
return { commitmentEvents: cachedEvents }
|
||||
}
|
||||
blockFrom = newBlockFrom > currentBlock ? currentBlock : newBlockFrom
|
||||
} else {
|
||||
const downloadedEvents = await downloadEvents(`commitments_${self.chainId}.json`, blockFrom)
|
||||
|
||||
if (downloadedEvents.events.length) {
|
||||
cachedEvents.push(...downloadedEvents.events)
|
||||
|
||||
blockFrom = downloadedEvents.lastBlock
|
||||
}
|
||||
}
|
||||
|
||||
const commitmentEvents = await getCommitmentBatch({ blockFrom, blockTo: currentBlock, cachedEvents, withCache })
|
||||
|
||||
@@ -1,14 +1,13 @@
|
||||
import { isEmpty } from 'lodash'
|
||||
import { BigNumber, Contract } from 'ethers'
|
||||
|
||||
import { IndexedDB } from '../services/idb'
|
||||
import { BatchEventsService } from '../services/events/batch'
|
||||
import { getAllNullifiers } from '../services/graph'
|
||||
import { ExtendedProvider } from '../services/provider'
|
||||
import { IndexedDB } from './services/idb'
|
||||
import { BatchEventsService } from './services/batch'
|
||||
import { getAllNullifiers } from './services/graph'
|
||||
import { ExtendedProvider } from './services/provider'
|
||||
import { POOL_CONTRACT, RPC_LIST, FALLBACK_RPC_LIST, workerEvents, numbers } from './services/constants'
|
||||
import { sleep } from './services/utilities'
|
||||
import { poolAbi } from './services/pool'
|
||||
import { downloadEvents } from './services/downloadEvents'
|
||||
|
||||
const getProviderWithSigner = (chainId) => {
|
||||
return new ExtendedProvider(RPC_LIST[chainId], chainId, FALLBACK_RPC_LIST[chainId])
|
||||
@@ -121,14 +120,6 @@ const getCachedEvents = async () => {
|
||||
return { blockFrom, cachedEvents }
|
||||
}
|
||||
blockFrom = newBlockFrom > currentBlock ? currentBlock : newBlockFrom
|
||||
} else {
|
||||
const downloadedEvents = await downloadEvents(`nullifiers_${self.chainId}.json`, blockFrom)
|
||||
|
||||
if (downloadedEvents.events.length) {
|
||||
cachedEvents.push(...downloadedEvents.events)
|
||||
|
||||
blockFrom = downloadedEvents.lastBlock
|
||||
}
|
||||
}
|
||||
|
||||
return { blockFrom, cachedEvents }
|
||||
|
||||
@@ -1,37 +0,0 @@
|
||||
import { unzipAsync } from "./zip"
|
||||
|
||||
export async function downloadEvents(fileName, deployedBlock) {
|
||||
fileName = fileName.toLowerCase()
|
||||
|
||||
// @ts-ignore
|
||||
const prefix = __webpack_public_path__.slice(0, -7)
|
||||
|
||||
try {
|
||||
const resp = await fetch(`${prefix}/${fileName}.zip`, {
|
||||
method: 'GET',
|
||||
headers: {
|
||||
'Content-Type': 'application/x-www-form-urlencoded',
|
||||
}
|
||||
})
|
||||
|
||||
const arrayBuffer = await resp.arrayBuffer()
|
||||
|
||||
const { [fileName]: content } = await unzipAsync(new Uint8Array(arrayBuffer))
|
||||
|
||||
const events = JSON.parse(new TextDecoder().decode(content))
|
||||
|
||||
const lastBlock = events && Array.isArray(events) && events[events.length - 1]
|
||||
? events[events.length - 1].blockNumber
|
||||
: deployedBlock
|
||||
|
||||
return {
|
||||
events,
|
||||
lastBlock
|
||||
}
|
||||
} catch {
|
||||
return {
|
||||
events: [],
|
||||
lastBlock: deployedBlock
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -55,6 +55,7 @@ export default {
|
||||
'setProvider',
|
||||
'changeChain',
|
||||
'checkNetwork',
|
||||
'checkSanction',
|
||||
'setWalletParams',
|
||||
'getWalletBalance',
|
||||
]),
|
||||
@@ -92,6 +93,9 @@ export default {
|
||||
const address = await provider.setupProvider()
|
||||
const network = await provider.checkNetworkVersion()
|
||||
|
||||
if (address) {
|
||||
await this.checkSanction(address)
|
||||
}
|
||||
await this.setProvider({ network, name: key })
|
||||
await this.setAccountData(address)
|
||||
|
||||
@@ -122,6 +126,8 @@ export default {
|
||||
if (address) {
|
||||
const checksumAddress = toChecksumAddress(address)
|
||||
|
||||
await this.checkSanction(checksumAddress)
|
||||
|
||||
if (!this.isConnected) {
|
||||
return
|
||||
}
|
||||
|
||||
@@ -7,7 +7,6 @@ import { isEmpty, sleep, toChecksumAddress } from '@/utilities'
|
||||
import { getBridgeHelper, getBridgeProxy, getAmbBridge } from '@/contracts'
|
||||
|
||||
import { EventsClass, GetAffirmationParams, GetRelayedMessageParams, SaveEventsParams } from './@types'
|
||||
import { downloadEvents } from './load'
|
||||
|
||||
export * from './batch'
|
||||
|
||||
@@ -34,31 +33,19 @@ class EventAggregator implements EventsClass {
|
||||
storeName: `${IndexDBStores.ACCOUNT_EVENTS}_${chainId}`,
|
||||
})
|
||||
|
||||
const newEvents = []
|
||||
|
||||
if (cachedEvents?.length) {
|
||||
const [latestEvent] = cachedEvents.slice(-numbers.ONE)
|
||||
blockFrom = Number(latestEvent.blockNumber) + numbers.ONE
|
||||
} else {
|
||||
const downloadedEvents = await downloadEvents(`accounts_${chainId}.json`, blockFrom)
|
||||
|
||||
if (downloadedEvents.events.length) {
|
||||
newEvents.push(...downloadedEvents.events)
|
||||
|
||||
blockFrom = downloadedEvents.lastBlock
|
||||
}
|
||||
}
|
||||
|
||||
const { events: graphEvents, lastSyncBlock } = await getAllAccounts({ fromBlock: blockFrom, chainId })
|
||||
|
||||
newEvents.push(...graphEvents)
|
||||
|
||||
const [account] = newEvents.filter((e: { key: string }) => e.key === publicKey)
|
||||
const [account] = graphEvents.filter((e: { key: string }) => e.key === publicKey)
|
||||
|
||||
if (account) {
|
||||
this.saveEvents({
|
||||
chainId,
|
||||
events: newEvents,
|
||||
events: graphEvents,
|
||||
storeName: IndexDBStores.ACCOUNT_EVENTS,
|
||||
})
|
||||
return account.owner
|
||||
@@ -81,7 +68,7 @@ class EventAggregator implements EventsClass {
|
||||
}
|
||||
})
|
||||
|
||||
newEvents.push(...accountEvents)
|
||||
const newEvents = graphEvents.concat(accountEvents)
|
||||
|
||||
this.saveEvents({
|
||||
chainId,
|
||||
@@ -89,7 +76,7 @@ class EventAggregator implements EventsClass {
|
||||
storeName: IndexDBStores.ACCOUNT_EVENTS,
|
||||
})
|
||||
|
||||
const events = newEvents.filter((e: { key: string }) => e.key === publicKey)
|
||||
const events = cachedEvents.concat(newEvents).filter((e: { key: string }) => e.key === publicKey)
|
||||
|
||||
if (isEmpty(events)) {
|
||||
return undefined
|
||||
@@ -100,7 +87,6 @@ class EventAggregator implements EventsClass {
|
||||
|
||||
return event.owner
|
||||
} catch (err) {
|
||||
console.log(err)
|
||||
return undefined
|
||||
}
|
||||
}
|
||||
@@ -127,30 +113,19 @@ class EventAggregator implements EventsClass {
|
||||
storeName: `${IndexDBStores.ACCOUNT_EVENTS}_${chainId}`,
|
||||
})
|
||||
|
||||
const newEvents = []
|
||||
|
||||
if (cachedEvents?.length) {
|
||||
const [latestEvent] = cachedEvents.slice(-numbers.ONE)
|
||||
blockFrom = Number(latestEvent.blockNumber) + numbers.ONE
|
||||
} else {
|
||||
const downloadedEvents = await downloadEvents(`accounts_${chainId}.json`, blockFrom)
|
||||
|
||||
if (downloadedEvents.events.length) {
|
||||
newEvents.push(...downloadedEvents.events)
|
||||
|
||||
blockFrom = downloadedEvents.lastBlock
|
||||
}
|
||||
}
|
||||
|
||||
const { events: graphEvents, lastSyncBlock } = await getAllAccounts({ fromBlock: blockFrom, chainId })
|
||||
newEvents.push(...graphEvents)
|
||||
|
||||
const [account] = newEvents.filter((e: { owner: string }) => toChecksumAddress(e.owner) === toChecksumAddress(address))
|
||||
const [account] = graphEvents.filter((e: { owner: string }) => toChecksumAddress(e.owner) === toChecksumAddress(address))
|
||||
|
||||
if (account) {
|
||||
this.saveEvents({
|
||||
chainId,
|
||||
events: newEvents,
|
||||
events: graphEvents,
|
||||
storeName: IndexDBStores.ACCOUNT_EVENTS,
|
||||
})
|
||||
return account.key
|
||||
@@ -173,7 +148,7 @@ class EventAggregator implements EventsClass {
|
||||
}
|
||||
})
|
||||
|
||||
newEvents.push(...accountEvents)
|
||||
const newEvents = graphEvents.concat(accountEvents)
|
||||
|
||||
this.saveEvents({
|
||||
chainId,
|
||||
@@ -194,7 +169,6 @@ class EventAggregator implements EventsClass {
|
||||
|
||||
return event.key
|
||||
} catch (err) {
|
||||
console.log(err)
|
||||
return undefined
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,49 +0,0 @@
|
||||
import { unzip } from 'fflate'
|
||||
|
||||
export function unzipAsync(data: Uint8Array) {
|
||||
return new Promise((res, rej) => {
|
||||
unzip(data, {}, (err, data) => {
|
||||
if (err) {
|
||||
rej(err);
|
||||
return;
|
||||
}
|
||||
res(data);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
export async function downloadEvents(fileName: string, deployedBlock: number) {
|
||||
fileName = fileName.toLowerCase()
|
||||
|
||||
// @ts-ignore
|
||||
const prefix = __webpack_public_path__.slice(0, -7)
|
||||
|
||||
try {
|
||||
const resp = await fetch(`${prefix}/${fileName}.zip`, {
|
||||
method: 'GET',
|
||||
headers: {
|
||||
'Content-Type': 'application/x-www-form-urlencoded',
|
||||
}
|
||||
})
|
||||
|
||||
const arrayBuffer = await resp.arrayBuffer()
|
||||
|
||||
const { [fileName]: content } = (await unzipAsync(new Uint8Array(arrayBuffer))) as any
|
||||
|
||||
const events = JSON.parse(new TextDecoder().decode(content))
|
||||
|
||||
const lastBlock = events && Array.isArray(events) && events[events.length - 1]
|
||||
? events[events.length - 1].blockNumber
|
||||
: deployedBlock
|
||||
|
||||
return {
|
||||
events,
|
||||
lastBlock
|
||||
}
|
||||
} catch {
|
||||
return {
|
||||
events: [],
|
||||
lastBlock: deployedBlock
|
||||
}
|
||||
}
|
||||
}
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -19,6 +19,17 @@ export const actions: ActionTree<WalletState, RootState> = {
|
||||
}
|
||||
},
|
||||
|
||||
async checkSanction({ getters }, address) {
|
||||
const contract = getSanctionList(getters.dependencies.l1ChainId)
|
||||
|
||||
const isSanctioned = await contract.callStatic.isSanctioned(address)
|
||||
if (isSanctioned) {
|
||||
window.onbeforeunload = null
|
||||
// ToDo add type
|
||||
// @ts-expect-error
|
||||
window.location = 'https://twitter.com/TornadoCash/status/1514904975037669386'
|
||||
}
|
||||
},
|
||||
checkAppNetwork({ commit }, network) {
|
||||
try {
|
||||
// TODO create a selector for active network
|
||||
|
||||
@@ -60018,15 +60018,13 @@ async function getAllCommitments({ fromBlock, toBlock, chainId }) {
|
||||
}
|
||||
}
|
||||
|
||||
const data = commitments
|
||||
.map((e) => ({
|
||||
blockNumber: Number(e.blockNumber),
|
||||
transactionHash: e.transactionHash,
|
||||
index: Number(e.index),
|
||||
commitment: e.commitment,
|
||||
encryptedOutput: e.encryptedOutput
|
||||
}))
|
||||
.sort((a, b) => a.index - b.index)
|
||||
const data = commitments.map((e) => ({
|
||||
blockNumber: Number(e.blockNumber),
|
||||
transactionHash: e.transactionHash,
|
||||
index: Number(e.index),
|
||||
commitment: e.commitment,
|
||||
encryptedOutput: e.encryptedOutput
|
||||
}))
|
||||
|
||||
const [lastEvent] = data.slice(-numbers.ONE)
|
||||
|
||||
|
||||
@@ -1,49 +0,0 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"target": "ES2018",
|
||||
"module": "ESNext",
|
||||
"lib": [
|
||||
"ESNext",
|
||||
"ESNext.AsyncIterable",
|
||||
"DOM"
|
||||
],
|
||||
"importHelpers": true,
|
||||
"moduleResolution": "node",
|
||||
"experimentalDecorators": true,
|
||||
"sourceMap": true,
|
||||
"noImplicitAny": true,
|
||||
"allowJs": true,
|
||||
"skipLibCheck": true,
|
||||
"esModuleInterop": true,
|
||||
"checkJs": false,
|
||||
"noUnusedLocals": true,
|
||||
"strictNullChecks": true,
|
||||
"noImplicitThis": true,
|
||||
"noImplicitReturns": true,
|
||||
"allowSyntheticDefaultImports": true,
|
||||
"strictFunctionTypes": true,
|
||||
"forceConsistentCasingInFileNames": true,
|
||||
"resolveJsonModule": true,
|
||||
"isolatedModules": true,
|
||||
"noEmit": true,
|
||||
"baseUrl": ".",
|
||||
"paths": {
|
||||
"~/*": [
|
||||
"./*"
|
||||
],
|
||||
"@/*": [
|
||||
"./*"
|
||||
]
|
||||
},
|
||||
"types": [
|
||||
"@nuxt/types",
|
||||
"@types/node"
|
||||
],
|
||||
},
|
||||
"include": ["**/*.ts", "types"],
|
||||
"exclude": [
|
||||
"node_modules",
|
||||
".nuxt",
|
||||
"dist"
|
||||
]
|
||||
}
|
||||
@@ -5,23 +5,6 @@ export default [
|
||||
{
|
||||
mode: 'production',
|
||||
entry: './assets/events.worker.js',
|
||||
module: {
|
||||
rules: [
|
||||
{
|
||||
test: /\.(tsx|ts)?$/,
|
||||
exclude: /node_modules/,
|
||||
use: {
|
||||
loader: 'ts-loader',
|
||||
options: {
|
||||
configFile: 'tsconfig.worker.json'
|
||||
}
|
||||
}
|
||||
},
|
||||
],
|
||||
},
|
||||
resolve: {
|
||||
extensions: ['.tsx', '.ts', '.js'],
|
||||
},
|
||||
output: {
|
||||
path: path.resolve('static'),
|
||||
filename: 'events.worker.js',
|
||||
@@ -30,23 +13,6 @@ export default [
|
||||
{
|
||||
mode: 'production',
|
||||
entry: './assets/nullifier.worker.js',
|
||||
module: {
|
||||
rules: [
|
||||
{
|
||||
test: /\.(tsx|ts)?$/,
|
||||
exclude: /node_modules/,
|
||||
use: {
|
||||
loader: 'ts-loader',
|
||||
options: {
|
||||
configFile: 'tsconfig.worker.json'
|
||||
}
|
||||
}
|
||||
},
|
||||
],
|
||||
},
|
||||
resolve: {
|
||||
extensions: ['.tsx', '.ts', '.js'],
|
||||
},
|
||||
output: {
|
||||
path: path.resolve('static'),
|
||||
filename: 'nullifier.worker.js',
|
||||
|
||||
Reference in New Issue
Block a user