mirror of https://gitlab.com/ecentrics/concordia
Apostolos Fanakis
4 years ago
9 changed files with 743 additions and 339 deletions
@ -0,0 +1,60 @@ |
|||||
|
module.exports = { |
||||
|
env: { |
||||
|
browser: true, |
||||
|
es6: true, |
||||
|
jest: true, |
||||
|
}, |
||||
|
extends: [ |
||||
|
'plugin:react/recommended', |
||||
|
'airbnb', |
||||
|
], |
||||
|
globals: { |
||||
|
Atomics: 'readonly', |
||||
|
SharedArrayBuffer: 'readonly', |
||||
|
}, |
||||
|
parser: 'babel-eslint', |
||||
|
parserOptions: { |
||||
|
ecmaFeatures: { |
||||
|
jsx: true, |
||||
|
}, |
||||
|
ecmaVersion: 2018, |
||||
|
sourceType: 'module', |
||||
|
}, |
||||
|
plugins: [ |
||||
|
'react', |
||||
|
'react-hooks', |
||||
|
], |
||||
|
rules: { |
||||
|
'react/jsx-props-no-spreading': 'off', |
||||
|
'import/extensions': 'off', |
||||
|
'react/jsx-indent': [ |
||||
|
'error', |
||||
|
4, |
||||
|
{ |
||||
|
checkAttributes: true, |
||||
|
indentLogicalExpressions: true, |
||||
|
}, |
||||
|
], |
||||
|
'react/require-default-props': 'off', |
||||
|
'react/prop-types': 'off', |
||||
|
'react-hooks/rules-of-hooks': 'error', |
||||
|
'react-hooks/exhaustive-deps': 'error', |
||||
|
'max-len': ['warn', { code: 120, tabWidth: 4 }], |
||||
|
'no-unused-vars': 'warn', |
||||
|
'no-console': 'off', |
||||
|
'no-shadow': 'warn', |
||||
|
'no-multi-str': 'warn', |
||||
|
'jsx-a11y/label-has-associated-control': [2, { |
||||
|
labelAttributes: ['label'], |
||||
|
controlComponents: ['Input'], |
||||
|
depth: 3, |
||||
|
}], |
||||
|
}, |
||||
|
settings: { |
||||
|
'import/resolver': { |
||||
|
node: { |
||||
|
extensions: ['.js', '.jsx'], |
||||
|
}, |
||||
|
}, |
||||
|
}, |
||||
|
}; |
@ -1,60 +1,80 @@ |
|||||
import Web3 from 'web3'; |
import Web3 from 'web3'; |
||||
import Contract from 'web3-eth-contract'; |
import Contract from 'web3-eth-contract'; |
||||
import IPFS from 'ipfs'; |
import IPFS from 'ipfs'; |
||||
import { forumContract } from 'concordia-contracts'; |
import { contracts } from 'concordia-contracts'; |
||||
|
import { FORUM_CONTRACT } from 'concordia-app/src/constants/contracts/ContractNames'; |
||||
import { createOrbitInstance, getPeerDatabases, openKVDBs } from './utils/orbitUtils'; |
import { createOrbitInstance, getPeerDatabases, openKVDBs } from './utils/orbitUtils'; |
||||
import ipfsOptions from './options/ipfsOptions'; |
import ipfsOptions from './options/ipfsOptions'; |
||||
import { WEB3_PROVIDER_URL } from './constants'; |
import { WEB3_PROVIDER_URL } from './constants'; |
||||
import { startAPI } from './app'; |
import startAPI from './app'; |
||||
|
|
||||
process.on('unhandledRejection', error => { |
process.on('unhandledRejection', (error) => { |
||||
// This happens when attempting to initialize without any available Swarm addresses (e.g. Rendezvous)
|
// This happens when attempting to initialize without any available Swarm addresses (e.g. Rendezvous)
|
||||
if (error.code === 'ERR_NO_VALID_ADDRESSES') { |
if (error.code === 'ERR_NO_VALID_ADDRESSES') { |
||||
console.error('unhandledRejection', error.message); |
console.error('unhandledRejection', error.message); |
||||
process.exit(1); |
process.exit(1); |
||||
} |
} |
||||
}); |
|
||||
|
|
||||
async function main () { |
// Don't swallow other errors
|
||||
console.log('Initializing...'); |
console.error(error); |
||||
const web3 = new Web3(new Web3.providers.WebsocketProvider(WEB3_PROVIDER_URL)); |
throw error; |
||||
const networkId = await web3.eth.net.getId(); |
}); |
||||
|
|
||||
const contractAddress = forumContract.networks[networkId].address; |
const getDeployedContract = async (web3) => { |
||||
|
const forumContract = contracts.find((contract) => contract.contractName === FORUM_CONTRACT); |
||||
|
|
||||
|
return web3.eth.net.getId() |
||||
|
.then((networkId) => forumContract.networks[networkId].address) |
||||
|
.then((contractAddress) => { |
||||
Contract.setProvider(WEB3_PROVIDER_URL); |
Contract.setProvider(WEB3_PROVIDER_URL); |
||||
const contract = new Contract(forumContract.abi, contractAddress); |
const contract = new Contract(forumContract.abi, contractAddress); |
||||
|
|
||||
const ipfs = await IPFS.create(ipfsOptions); |
return { contract, contractAddress }; |
||||
const orbit = await createOrbitInstance(ipfs, contractAddress); |
}); |
||||
|
}; |
||||
|
|
||||
// Open & replicate databases of existing users
|
// Open & replicate databases of existing users
|
||||
const userAddresses = await contract.methods.getUserAddresses().call(); |
const openExistingUsersDatabases = async (contract, orbit) => contract.methods.getUserAddresses().call() |
||||
const peerDBs = await getPeerDatabases(orbit, userAddresses); |
.then((userAddresses) => getPeerDatabases(orbit, userAddresses)) |
||||
await openKVDBs(orbit, peerDBs); |
.then((peerDBs) => openKVDBs(orbit, peerDBs)); |
||||
|
|
||||
// Listen for new users and subscribe to their databases
|
const handleWeb3LogEvent = (web3, eventJsonInterface, orbit) => (error, result) => { |
||||
const eventJsonInterface = web3.utils._.find( |
|
||||
contract._jsonInterface, |
|
||||
obj => obj.name === "UserSignedUp" && obj.type === 'event' |
|
||||
); |
|
||||
web3.eth.subscribe('logs', { |
|
||||
address: contractAddress, |
|
||||
topics: [eventJsonInterface.signature] |
|
||||
}, function(error, result){ |
|
||||
if (!error) { |
if (!error) { |
||||
const eventObj = web3.eth.abi.decodeLog( |
const eventObj = web3.eth.abi.decodeLog( |
||||
eventJsonInterface.inputs, |
eventJsonInterface.inputs, |
||||
result.data, |
result.data, |
||||
result.topics.slice(1) |
result.topics.slice(1), |
||||
) |
); |
||||
const userAddress = eventObj[1]; |
const userAddress = eventObj[1]; |
||||
console.log(`User signed up:`, userAddress); |
console.log('User signed up:', userAddress); |
||||
getPeerDatabases(orbit, [userAddress]).then(peerDBs => openKVDBs(orbit, peerDBs)); |
getPeerDatabases(orbit, [userAddress]) |
||||
|
.then((peerDBs) => openKVDBs(orbit, peerDBs)); |
||||
} |
} |
||||
}); |
}; |
||||
|
|
||||
|
const main = async () => { |
||||
|
console.log('Initializing...'); |
||||
|
const web3 = new Web3(new Web3.providers.WebsocketProvider(WEB3_PROVIDER_URL)); |
||||
|
|
||||
|
getDeployedContract(web3) |
||||
|
.then(({ contract, contractAddress }) => IPFS.create(ipfsOptions) |
||||
|
.then((ipfs) => createOrbitInstance(ipfs, contractAddress)) |
||||
|
.then((orbit) => openExistingUsersDatabases(contract, orbit) |
||||
|
.then(() => { |
||||
|
// Listen for new users and subscribe to their databases
|
||||
|
const eventJsonInterface = web3.utils._.find( |
||||
|
// eslint-disable-next-line no-underscore-dangle
|
||||
|
contract._jsonInterface, |
||||
|
(obj) => obj.name === 'UserSignedUp' && obj.type === 'event', |
||||
|
); |
||||
|
|
||||
|
web3.eth.subscribe('logs', { |
||||
|
address: contractAddress, |
||||
|
topics: [eventJsonInterface.signature], |
||||
|
}, handleWeb3LogEvent(web3, eventJsonInterface, orbit)); |
||||
|
|
||||
startAPI(orbit); |
startAPI(orbit); |
||||
} |
}))); |
||||
|
}; |
||||
|
|
||||
main(); |
main(); |
||||
|
File diff suppressed because it is too large
Loading…
Reference in new issue