init
This commit is contained in:
commit
44f31f8b9f
402 changed files with 47865 additions and 0 deletions
113
store/snark.js
Normal file
113
store/snark.js
Normal file
|
@ -0,0 +1,113 @@
|
|||
/* 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 }
|
Loading…
Add table
Add a link
Reference in a new issue