123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 |
- /* eslint-disable no-console */
- import Web3 from 'web3'
- import Jszip from 'jszip'
- import axios from 'axios'
- import ENS, { getEnsAddress } from '@ensdomains/ensjs'
- import { detectMob } from '@/utils'
- import networkConfig from '@/networkConfig'
- const { APP_ENS_NAME } = process.env
- const groth16 = require('websnark/src/groth16')
- const jszip = new Jszip()
- function buildGroth16() {
- const isMobile = detectMob()
- const wasmMemory = isMobile ? 1000 : 2000
- return groth16({ wasmInitialMemory: wasmMemory })
- }
- function getEns() {
- const provider = new Web3.providers.HttpProvider(networkConfig.netId1.rpcUrls.Infura.url)
- return new ENS({ provider, ensAddress: getEnsAddress('1') })
- }
- async function getTornadoKeys(getProgress) {
- try {
- const keys = await Promise.all([
- download({ name: 'tornado.json.zip', contentType: 'string' }),
- download({ name: 'tornadoProvingKey.bin.zip', contentType: 'arraybuffer', getProgress })
- ])
- return { circuit: JSON.parse(keys[0]), provingKey: keys[1] }
- } catch (err) {
- throw err
- }
- }
- async function getIPFSIdFromENS(ensName) {
- try {
- const ens = getEns()
- const ensInterface = await ens.name(ensName)
- const { value } = await ensInterface.getContent(ensName)
- const [, id] = value.split('://')
- return id
- } catch (err) {
- throw new Error(err)
- }
- }
- async function fetchFile({ url, name, getProgress, id, retryAttempt = 0 }) {
- try {
- const response = await axios.get(`${url}/${name}`, {
- responseType: 'blob',
- headers: {
- 'Content-Type': 'application/x-www-form-urlencoded'
- },
- onDownloadProgress: (progressEvent) => {
- if (typeof getProgress === 'function') {
- const progress = Math.round((progressEvent.loaded * 100) / 9626311)
- getProgress(progress)
- }
- }
- })
- return response
- } catch (err) {
- if (!id) {
- id = await getIPFSIdFromENS(APP_ENS_NAME)
- }
- const knownResources = [
- url,
- `https://ipfs.io/ipfs/${id}`,
- `https://dweb.link/ipfs/${id}`,
- `https://gateway.pinata.cloud/ipfs/${id}`
- ]
- if (retryAttempt < knownResources.length) {
- const fallbackUrl = knownResources[retryAttempt]
- retryAttempt++
- const response = await fetchFile({ name, getProgress, retryAttempt, id, url: fallbackUrl })
- return response
- }
- throw err
- }
- }
- /**
- * Function to download
- * @param {*} name filename
- * @param {'base64'|'string'|'binarystring'|'text'|'blob'|'uint8array'|'arraybuffer'|'array'|'nodebuffer'} contentType type of the content.
- * @param getProgress function
- */
- async function download({ name, contentType, getProgress, eventName = 'events' }) {
- try {
- // eslint-disable-next-line no-undef
- const prefix = __webpack_public_path__.slice(0, -7)
- const response = await fetchFile({ getProgress, url: prefix, name })
- const zip = await jszip.loadAsync(response.data)
- const file = zip.file(name.replace(`${eventName}/`, '').slice(0, -4))
- const content = await file.async(contentType)
- return content
- } catch (err) {
- throw err
- }
- }
- export { getTornadoKeys, buildGroth16, download }
|