Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/opensquare-network/collaboration
OpenSquare collaboration platform
https://github.com/opensquare-network/collaboration
Last synced: 2 months ago
JSON representation
OpenSquare collaboration platform
- Host: GitHub
- URL: https://github.com/opensquare-network/collaboration
- Owner: opensquare-network
- License: apache-2.0
- Created: 2021-08-25T08:08:19.000Z (over 3 years ago)
- Default Branch: main
- Last Pushed: 2024-11-07T03:28:00.000Z (2 months ago)
- Last Synced: 2024-11-07T04:27:28.568Z (2 months ago)
- Language: JavaScript
- Size: 16.4 MB
- Stars: 3
- Watchers: 2
- Forks: 4
- Open Issues: 13
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE
Awesome Lists containing this project
README
# OpenSquare Collaboration
OpenSquare Collaboration is an off-chain gas free collaboration platform.
Currently, off chain voting has been implemented while bounties and paid questions are in the plan.Off chain voting now support [substrate](https://github.com/paritytech/substrate) based chains and assets on Statemine/Statemint.
# Code structure
Code exists in 2 folders: [backend](./backend) and [next](./next). Backend is a yarn workspace containing 2 packages:
1. backend is a restful api server.
2. node-api serves apis to retrieve data by calling various chain RPCs.Make sure [yarn](https://yarnpkg.com/) is installed before going ahead. [Next](./next) hosts fronted code based on [next.js](https://nextjs.org/).
## node-api
This package maintains multiple [@polkadot/api](https://github.com/polkadot-js/api) instances or ethers [JsonRpcProvider](https://docs.ethers.io/v5/api/providers/jsonrpc-provider/)s
for target chains in case of a single endpoint failure. It is in charge of interaction with chain nodes and provides restful apis for caller to fetch on-chain data. The apis include:- [chain]/balance/[address]/[blockHashOrHeight?]: get the address balance at a block(by block hash or height).
- [chain]/proxy/[delegator]/[delegatee]/[blockHashOrHeight?]: get the proxy info between 2 addresses.
- [chain]/chain/height: get current chain height.
- [chain(statemine|karura|bifrost)]/token/[assetId]/account/[account]/[blockHashOrHeight?]: get the token/asset balance by asset id.
- /evm/chain/[chain]/erc20/contract/[contract]/address/[address]/height/[blockHeight]: get ERC20 token balance from evm chains.
- /evm/chain/[chain]/contract/height/[timestamp?]: get evm chains height by time.
- /issuance/token/[token]/[blockHashOrHeight?]: get predefined token total issuance at specified block height/hash.## backend
It integrates [koa.js](https://koajs.com/) as the backend server, and you can find the code under `packages/backend` folder.
The server provides apis for spaces, balances and proposals, check them
under `packages/backend/features` folder.It depends on [MongoDB](https://www.mongodb.com/) and related proposal and votes data are stored.
All votes data are signed with polkadot keys and uploaded to IPFS too. We use [decoo](https://decoo.io/)
as the IPFS service provider, so make sure to register an account and get the corresponding decoo api token and secret key.This package also depends on the node-api package to fetch on-chain info.
So don't forget to config the required `NODE_API_ENDPOINT` environment variable.Generally, Its features include:
- Providing restful apis for next page.
- Managing business data with MongoDB.
- Querying chain data from `node-api` package.## next
Next package depends on [next.js](https://nextjs.org/) and renders the fronted pages.
# How to run it
## Prerequisite
### MongoDB
Make sure mongodb is installed, while corresponding url is required to config in the next package.
Check [here](https://docs.mongodb.com/manual/installation/) to find a way to install it natively, or run it with docker:```bash
docker run -d --name mongo -p 27017:27017 mongo:4.4.2
```You may need more configuration for production environment.
### Infura ipfs project api key and secret
Register an [infura](https://infura.io/) account and get the api key and secret.
```dotenv
INFURA_PROJECT_ID=
INFURA_PROJECT_SECRET=
```## Run
### 1. Run node-api
```bash
cd backend/packages/node-api
yarn
cat .env.example > .env
```The default environment variables will work, but if you want to change some, just edit the '.env' file.
```dotenv
# You can change the chain endpoints, separated by ';'.
DOT_ENDPOINTS=wss://rpc.polkadot.io;wss://polkadot.api.onfinality.io/public-ws;wss://polkadot-rpc.dwellir.com
KSM_ENDPOINTS=wss://kusama-rpc.polkadot.io;wss://kusama.api.onfinality.io/public-ws;wss://kusama-rpc.dwellir.com
KAR_ENDPOINTS=wss://karura.api.onfinality.io/public-ws;wss://karura-rpc-0.aca-api.network;wss://karura-rpc-1.aca-api.network;wss://karura-rpc-2.aca-api.network/ws;wss://karura-rpc-3.aca-api.network/ws;wss://karura.polkawallet.io
KHA_ENDPOINTS=wss://khala.api.onfinality.io/public-ws
STATEMINE_ENDPOINTS=wss://statemine.api.onfinality.io/public-ws;wss://statemine-rpc.polkadot.io
BNC_ENDPOINTS=wss://bifrost-parachain.api.onfinality.io/public-ws;wss://bifrost-rpc.liebi.com/ws;wss://us.bifrost-rpc.liebi.com/ws;wss://eu.bifrost-rpc.liebi.com/ws
KINT_ENDPOINTS=wss://kintsugi.api.onfinality.io/public-ws;wss://api-kusama.interlay.io/parachain
INTR_ENDPOINTS=wss://interlay.api.onfinality.io/public-ws;wss://api.interlay.io/parachain# You need a infura key to call the ethereum rpcs
INFURA_KEY=xxx
# Alchemy.com api key. Optional, there will be no alchemy nodes if not set
ALCHEMY_KEY=xxxSERVER_PORT=3223 # keep it
```Then run
```bash
node src/index.js
```Well, the node-api should be ready.
### 2. Run [backend](./packages/backend) for the restful api server
Come back to the project root dir and run
```bash
cd backend/packages/backend
yarn
cat .env.example > .env
```Open the '.env' file and do necessary configuration
```dotenv
PORT=8081 # keep it, it will be the resutful api server portMONGO_URL=mongodb://localhost:27017 # set your mongodb url
MONGO_DB_NAME=voting # keep it or change it to any name you likeINFURA_PROJECT_ID=
INFURA_PROJECT_SECRET=
LOCAL_IPFS_NODE_URL=http://localhost:5001
USE_LOCAL_IPFS_NODE=false
IPFS_ENDPOINT=https://opensquare.infura-ipfs.io/ipfs/TEST_ACCOUNTS=xxx|yyy # ignore it, for test
TEST_ACCOUNT_BALANCE=100000000000 # ignore it, for test# The node api server url. Do not append '/' to the end.
NODE_API_ENDPOINT=http://localhost:3223
```Run following scripts to initialize the spaces in database
```bash
cd backend/packages/backend && node src/scripts/init-spaces.js
```Then run
```bash
yarn run dev
```or
```bash
node server.js
```The restful api server will be ready.
### 3. Run next package for the fronted
Come back to the project root dir and run
```bash
cd next
cat .env.example > .env
```Open the '.env' file and do necessary configuration
```dotenv
PORT=8001NEXT_PUBLIC_API_END_POINT=http://127.0.0.1:8001/
NEXT_PUBLIC_BACKEND_API_END_POINT=http://127.0.0.1:8081/NEXT_PUBLIC_IDENTITY_SERVER_HOST=https://id.statescan.io
```Then run
```bash
yarn run dev
```or
```bash
node server.js
```Do everything work well? Join [OpenSquare matrix room](https://matrix.to/#/#opensquare:matrix.org) if any problems.
## Links
**[Documentation](https://docs.opensquare.io/)**