Compare commits

..

7 Commits

205 changed files with 79 additions and 70 deletions

@ -1,13 +1,7 @@
PINATA_API_KEY= PINATA_API_KEY=
PINATA_SECRET_API_KEY= PINATA_SECRET_API_KEY=
INFURA_KEY= CHAINNODES_KEY=
ALCHEMY_MAINNET_KEY=
ALCHEMY_POLYGON_KEY=
ALCHEMY_OPTIMISM_KEY=
ALCHEMY_ARBITRUM_KEY=
ALCHEMY_GOERLI_KEY=
WC_BRIDGE= WC_BRIDGE=

@ -32,12 +32,7 @@ jobs:
- name: Build - name: Build
run: yarn generate run: yarn generate
env: env:
INFURA_KEY: ${{ secrets.INFURA_KEY }} CHAINNODES_KEY: ${{ secrets.CHAINNODES_KEY }}
ALCHEMY_MAINNET_KEY: ${{ secrets.ALCHEMY_MAINNET_KEY }}
ALCHEMY_POLYGON_KEY: ${{ secrets.ALCHEMY_POLYGON_KEY }}
ALCHEMY_OPTIMISM_KEY: ${{ secrets.ALCHEMY_OPTIMISM_KEY }}
ALCHEMY_ARBITRUM_KEY: ${{ secrets.ALCHEMY_ARBITRUM_KEY }}
ALCHEMY_GOERLI_KEY: ${{ secrets.ALCHEMY_GOERLI_KEY }}
WC_BRIDGE: ${{ secrets.WC_BRIDGE }} WC_BRIDGE: ${{ secrets.WC_BRIDGE }}
OLD_STORE_NAME: ${{ secrets.OLD_STORE_NAME }} OLD_STORE_NAME: ${{ secrets.OLD_STORE_NAME }}
STORE_NAME: ${{ secrets.STORE_NAME }} STORE_NAME: ${{ secrets.STORE_NAME }}

@ -72,6 +72,8 @@ export async function _encryptFormatTx({ dispatch, getters, rootGetters }, { eve
} }
} }
dispatch('loading/disable', {}, { root: true })
return formattingEvents(result) return formattingEvents(result)
} }

@ -1,6 +1,5 @@
export const blockSyncInterval = 10000 export const blockSyncInterval = 10000
export const enabledChains = ['1', '10', '56', '100', '137', '43114', '42161'] export const enabledChains = ['1', '5', '10', '56', '100', '137', '42161', '43114']
export const chainsWithEncryptedNotes = ['1', '5', '56', '100', '137']
export default { export default {
netId1: { netId1: {
rpcCallRetryAttempt: 15, rpcCallRetryAttempt: 15,
@ -78,9 +77,7 @@ export default {
usdc: { usdc: {
instanceAddress: { instanceAddress: {
'100': '0xd96f2B1c14Db8458374d9Aca76E26c3D18364307', '100': '0xd96f2B1c14Db8458374d9Aca76E26c3D18364307',
'1000': '0x4736dCf1b7A3d580672CcE6E7c65cd5cc9cFBa9D', '1000': '0x4736dCf1b7A3d580672CcE6E7c65cd5cc9cFBa9D'
'10000': '',
'100000': ''
}, },
tokenAddress: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48', tokenAddress: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',
symbol: 'USDC', symbol: 'USDC',
@ -90,9 +87,7 @@ export default {
usdt: { usdt: {
instanceAddress: { instanceAddress: {
'100': '0x169AD27A470D064DEDE56a2D3ff727986b15D52B', '100': '0x169AD27A470D064DEDE56a2D3ff727986b15D52B',
'1000': '0x0836222F2B2B24A3F36f98668Ed8F0B38D1a872f', '1000': '0x0836222F2B2B24A3F36f98668Ed8F0B38D1a872f'
'10000': '',
'100000': ''
}, },
tokenAddress: '0xdAC17F958D2ee523a2206206994597C13D831ec7', tokenAddress: '0xdAC17F958D2ee523a2206206994597C13D831ec7',
symbol: 'USDT', symbol: 'USDT',
@ -103,8 +98,7 @@ export default {
instanceAddress: { instanceAddress: {
'0.1': '0x178169B423a011fff22B9e3F3abeA13414dDD0F1', '0.1': '0x178169B423a011fff22B9e3F3abeA13414dDD0F1',
'1': '0x610B717796ad172B316836AC95a2ffad065CeaB4', '1': '0x610B717796ad172B316836AC95a2ffad065CeaB4',
'10': '0xbB93e510BbCD0B7beb5A853875f9eC60275CF498', '10': '0xbB93e510BbCD0B7beb5A853875f9eC60275CF498'
'100': ''
}, },
tokenAddress: '0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599', tokenAddress: '0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599',
symbol: 'WBTC', symbol: 'WBTC',
@ -407,17 +401,17 @@ export default {
multicall: '0xe86e3989c74293Acc962156cd3F525c07b6a1B6e', multicall: '0xe86e3989c74293Acc962156cd3F525c07b6a1B6e',
echoContractAccount: '0xa75BF2815618872f155b7C4B0C81bF990f5245E4', echoContractAccount: '0xa75BF2815618872f155b7C4B0C81bF990f5245E4',
rpcUrls: { rpcUrls: {
publicRpc1: {
name: 'Avalanche RPC',
url: 'https://endpoints.omniatech.io/v1/avax/mainnet/public'
},
meowRPC: {
name: 'Meow RPC',
url: 'https://avax.meowrpc.com'
},
communityRPC: { communityRPC: {
name: 'Tornado RPC', name: 'Tornado RPC',
url: 'https://avalanche-rpc.tornado.ws/ext/bc/C/rpc' url: 'https://avalanche-rpc.tornado.ws/ext/bc/C/rpc'
},
publicRpc1: {
name: 'Avalanche RPC',
url: 'https://api.avax.network/ext/bc/C/rpc'
},
oneRpc: {
name: '1RPC',
ulr: 'https://1rpc.io/avax/'
} }
}, },
tokens: { tokens: {
@ -505,9 +499,7 @@ export default {
usdc: { usdc: {
instanceAddress: { instanceAddress: {
'100': '0x05E0b5B40B7b66098C2161A5EE11C5740A3A7C45', '100': '0x05E0b5B40B7b66098C2161A5EE11C5740A3A7C45',
'1000': '0x23173fE8b96A4Ad8d2E17fB83EA5dcccdCa1Ae52', '1000': '0x23173fE8b96A4Ad8d2E17fB83EA5dcccdCa1Ae52'
'10000': '',
'100000': ''
}, },
tokenAddress: '0xD87Ba7A50B2E7E660f678A895E4B72E7CB4CCd9C', tokenAddress: '0xD87Ba7A50B2E7E660f678A895E4B72E7CB4CCd9C',
symbol: 'USDC', symbol: 'USDC',
@ -517,9 +509,7 @@ export default {
usdt: { usdt: {
instanceAddress: { instanceAddress: {
'100': '0x538Ab61E8A9fc1b2f93b3dd9011d662d89bE6FE6', '100': '0x538Ab61E8A9fc1b2f93b3dd9011d662d89bE6FE6',
'1000': '0x94Be88213a387E992Dd87DE56950a9aef34b9448', '1000': '0x94Be88213a387E992Dd87DE56950a9aef34b9448'
'10000': '',
'100000': ''
}, },
tokenAddress: '0xb7FC2023D96AEa94Ba0254AA5Aeb93141e4aad66', tokenAddress: '0xb7FC2023D96AEa94Ba0254AA5Aeb93141e4aad66',
symbol: 'USDT', symbol: 'USDT',
@ -530,8 +520,7 @@ export default {
instanceAddress: { instanceAddress: {
'0.1': '0x242654336ca2205714071898f67E254EB49ACdCe', '0.1': '0x242654336ca2205714071898f67E254EB49ACdCe',
'1': '0x776198CCF446DFa168347089d7338879273172cF', '1': '0x776198CCF446DFa168347089d7338879273172cF',
'10': '0xeDC5d01286f99A066559F60a585406f3878a033e', '10': '0xeDC5d01286f99A066559F60a585406f3878a033e'
'100': ''
}, },
tokenAddress: '0xC04B0d3107736C32e19F1c62b2aF67BE61d63a05', tokenAddress: '0xC04B0d3107736C32e19F1c62b2aF67BE61d63a05',
symbol: 'WBTC', symbol: 'WBTC',

@ -187,12 +187,7 @@ export default {
new webpack.IgnorePlugin(/worker_threads/), new webpack.IgnorePlugin(/worker_threads/),
new webpack.DefinePlugin({ new webpack.DefinePlugin({
'process.env': JSON.stringify({ 'process.env': JSON.stringify({
INFURA_KEY: process.env.INFURA_KEY, CHAINNODES_KEY: process.env.CHAINNODES_KEY,
ALCHEMY_MAINNET_KEY: process.env.ALCHEMY_MAINNET_KEY,
ALCHEMY_POLYGON_KEY: process.env.ALCHEMY_POLYGON_KEY,
ALCHEMY_OPTIMISM_KEY: process.env.ALCHEMY_OPTIMISM_KEY,
ALCHEMY_ARBITRUM_KEY: process.env.ALCHEMY_ARBITRUM_KEY,
ALCHEMY_GOERLI_KEY: process.env.ALCHEMY_GOERLI_KEY,
WC_BRIDGE: process.env.WC_BRIDGE, WC_BRIDGE: process.env.WC_BRIDGE,
OLD_STORE_NAME: process.env.OLD_STORE_NAME, OLD_STORE_NAME: process.env.OLD_STORE_NAME,
STORE_NAME: process.env.STORE_NAME, STORE_NAME: process.env.STORE_NAME,
@ -230,7 +225,7 @@ export default {
}, },
provider: { provider: {
rpcUrl: `https://mainnet.infura.io/v3/${process.env.INFURA_KEY}` rpcUrl: `https://mainnet.chainnodes.org/${process.env.CHAINNODES_KEY}`
}, },
// todo make custom loading page // todo make custom loading page

@ -39,10 +39,6 @@ export async function getPastEvents({ type, fromBlock, netId, events, contractAt
let [{ url: rpcUrl }] = Object.values(networkConfig[`netId${netId}`].rpcUrls) let [{ url: rpcUrl }] = Object.values(networkConfig[`netId${netId}`].rpcUrls)
if (netId === '5') {
rpcUrl = 'https://goerli.infura.io/v3/9aa3d95b3bc440fa88ea12eaa4456161'
}
const provider = new Web3.providers.HttpProvider(rpcUrl) const provider = new Web3.providers.HttpProvider(rpcUrl)
const web3 = new Web3(provider) const web3 = new Web3(provider)
const contract = new web3.eth.Contract(...contractAttrs) const contract = new web3.eth.Contract(...contractAttrs)

@ -1,6 +1,6 @@
import { uniqBy } from 'lodash' import { uniqBy } from 'lodash'
import networkConfig, { enabledChains, chainsWithEncryptedNotes } from '../networkConfig' import networkConfig, { enabledChains } from '../networkConfig'
import { loadCachedEvents, save } from './helpers' import { loadCachedEvents, save } from './helpers'
@ -68,7 +68,7 @@ async function main() {
for (let i = 0; i < enabledChains.length; i++) { for (let i = 0; i < enabledChains.length; i++) {
const netId = enabledChains[i] const netId = enabledChains[i]
if (netId === chainsWithEncryptedNotes[i]) updateEncrypted(netId) updateEncrypted(netId)
await updateCommon(netId) await updateCommon(netId)
} }

@ -2,7 +2,7 @@ import Web3 from 'web3'
import graph from '@/services/graph' import graph from '@/services/graph'
import { download } from '@/store/snark' import { download } from '@/store/snark'
import networkConfig, { enabledChains } from '@/networkConfig' import networkConfig, { enabledChains, blockSyncInterval } from '@/networkConfig'
import InstanceABI from '@/abis/Instance.abi.json' import InstanceABI from '@/abis/Instance.abi.json'
import { CONTRACT_INSTANCES, eventsType, httpConfig } from '@/constants' import { CONTRACT_INSTANCES, eventsType, httpConfig } from '@/constants'
import { sleep, flattenNArray, formatEvents, capitalizeFirstLetter } from '@/utils' import { sleep, flattenNArray, formatEvents, capitalizeFirstLetter } from '@/utils'
@ -178,7 +178,7 @@ class EventService {
return events return events
} }
const blockRange = 4950 const blockRange = Math.floor(blockSyncInterval / 2) - 1
const fromBlock = deployedBlock const fromBlock = deployedBlock
const { blockDifference, currentBlockNumber } = await this.getBlocksDiff({ fromBlock }) const { blockDifference, currentBlockNumber } = await this.getBlocksDiff({ fromBlock })
@ -244,7 +244,7 @@ class EventService {
} }
} }
getPastEvents({ fromBlock, toBlock, type }, shouldRetry = false, i = 0) { getPastEvents({ fromBlock, toBlock, type }, shouldRetry = false, retries = 0) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
this.contract this.contract
.getPastEvents(capitalizeFirstLetter(type), { .getPastEvents(capitalizeFirstLetter(type), {
@ -253,13 +253,23 @@ class EventService {
}) })
.then((events) => resolve(events)) .then((events) => resolve(events))
.catch((err) => { .catch((err) => {
i = i + 1 retries++
// If provider.getBlockNumber returned last block that isn't accepted (happened on Avalanche/Gnosis),
// get events to last accepted block
if (err.message.includes('after last accepted block')) {
const acceptedBlock = parseInt(err.message.split('after last accepted block ')[1])
toBlock = acceptedBlock
// Retries to 0, because it is not RPC error
retries = 0
}
// maximum 5 second buffer for rate-limiting // maximum 5 second buffer for rate-limiting
if (shouldRetry) { if (shouldRetry) {
const isRetry = i !== 5 const shouldRetryAgain = retries < 5
sleep(1000 * i).then(() => sleep(1000 * retries).then(() =>
this.getPastEvents({ fromBlock, toBlock, type }, isRetry, i) this.getPastEvents({ fromBlock, toBlock, type }, shouldRetryAgain, retries)
.then((events) => resolve(events)) .then((events) => resolve(events))
.catch((_) => resolve(undefined)) .catch((_) => resolve(undefined))
) )
@ -324,19 +334,18 @@ class EventService {
async getBatchEventsFromRpc({ fromBlock, type }) { async getBatchEventsFromRpc({ fromBlock, type }) {
try { try {
const batchSize = 10 const batchSize = 10
const blockRange = 10000
let [events, failed] = [[], []] let [events, failed] = [[], []]
let lastBlock = fromBlock let lastBlock = fromBlock
const { blockDifference, currentBlockNumber } = await this.getBlocksDiff({ fromBlock }) const { blockDifference, currentBlockNumber } = await this.getBlocksDiff({ fromBlock })
const batchDigest = blockDifference === 0 ? 1 : Math.ceil(blockDifference / blockRange) const batchDigest = blockDifference === 0 ? 1 : Math.ceil(blockDifference / blockSyncInterval)
const blockDenom = Math.ceil(blockDifference / batchDigest) const blockDenom = Math.ceil(blockDifference / batchDigest)
const batchCount = Math.ceil(batchDigest / batchSize) const batchCount = Math.ceil(batchDigest / batchSize)
if (fromBlock < currentBlockNumber) { if (fromBlock < currentBlockNumber) {
await this.updateEventProgress(0, type) this.updateEventProgress(0, type)
for (let batchIndex = 0; batchIndex < batchCount; batchIndex++) { for (let batchIndex = 0; batchIndex < batchCount; batchIndex++) {
const isLastBatch = batchIndex === batchCount - 1 const isLastBatch = batchIndex === batchCount - 1
@ -365,7 +374,7 @@ class EventService {
throw new Error('Failed to batch events') throw new Error('Failed to batch events')
} }
} }
await this.updateEventProgress(progressIndex / batchCount, type) this.updateEventProgress(progressIndex / batchCount, type)
} }
return { return {
@ -383,11 +392,10 @@ class EventService {
async getEventsFromRpc({ fromBlock, type }) { async getEventsFromRpc({ fromBlock, type }) {
try { try {
const { blockDifference } = await this.getBlocksDiff({ fromBlock }) const { blockDifference } = await this.getBlocksDiff({ fromBlock })
const blockRange = 10000
let events let events
if (blockDifference < blockRange) { if (blockDifference < blockSyncInterval) {
const rpcEvents = await this.getEventsPartFromRpc({ fromBlock, toBlock: 'latest', type }) const rpcEvents = await this.getEventsPartFromRpc({ fromBlock, toBlock: 'latest', type })
events = rpcEvents?.events || [] events = rpcEvents?.events || []
} else { } else {

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

@ -0,0 +1,2 @@
xÚ}ĐËjSQŕůyŠÍwđ_öËĚÄůâ`_i0&<26>¦ HßÝA-µ|_”~.)Ą´ŢŻë.­đCÄ
î­H=°m]¶,ŃöčĐ'R4µăáăŔőáµ7ÇXwiEÔ@Žěoy=_Ű·ĎĎß븭»<14>ŞDżłËóů|š§qűTž_ďq W±^<5E>J'<27>)-¬UíE´»ˇ)ąőaS©<53>RT\ŮU‡ľÝŢoĺňTÚýt˝üŻ Ęv'"˛ÜÍĘłeŤě•y ˘™zD*MÝ:4µG”uIéĺá_3lđDŽ®yşđFĽ/[Ű:€°Ú1äPŃĘ_fLh¨ŮÉB˙c†„úZés+G#Ă<>HÓ}­¤AÓ†9<14>ŽŤjs*śGŘśď˘ĺˇDx<08>MŇ>Ů@ϢӢ!dć†ÔÚ@'Ţ˝K†N„ëŇËňuůAČťŁ

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

@ -0,0 +1,2 @@
x<EFBFBD>ֱ1
€0 @ׁ»<D781>9C<39>$ַ)₪¬´U0המ¾<17>h<74><EFBFBD>?C7¡ת|<7C>^4¨«5»׀Ha <0A>;´<>~

@ -0,0 +1,2 @@
ÁK
ƒ0…ѽ|ã;øÕ˜Ê]Ž!”:ðÑBCöî9<C3AE>ž³xã1ÄYÿ¿ÄZ¯o-?ÜXïm+n]Ü{½ÜbÀ9‰/bÂ!NbÆ!2ŽÞûsý

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More