From a2ebf845ba16e940ac1a11f10b1d0e5e6d3c5497 Mon Sep 17 00:00:00 2001 From: Andrea Franz Date: Thu, 15 Feb 2024 09:35:47 +0100 Subject: [PATCH] Local dev env setup (#2923) * local dev env setup * rename dev commands * update readme --------- Co-authored-by: jaxcoder / --- docker-compose.yml | 97 ++++++++++------- packages/common/src/chains.ts | 8 +- scripts/README.md | 49 +++++++++ scripts/dev | 189 ++++++++++++++++++++++++++++++++++ 4 files changed, 304 insertions(+), 39 deletions(-) create mode 100644 scripts/README.md create mode 100755 scripts/dev diff --git a/docker-compose.yml b/docker-compose.yml index 98337c396f..b69426eb5b 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,60 +1,87 @@ version: '3.8' # Ports +# Dev chain 1: 8545 +# Dev chain 2: 8546 # Builder: 3000 # Explorer: 3001 # Manager: 3002 # Pinata: 3003 # Indexer: 3004 -# Dev chain 1: 3005 -# Subgraph dev chain 1: 3006 -# Dev chain 2: 3007 -# Subgraph dev chain 2: 3008 services: - pinata: + pina: image: ghcr.io/gitcoinco/pina:main + networks: + - grants-stack + ports: - '127.0.0.1:3003:8000' - localchain-1: - image: ghcr.io/gitcoinco/allo-contracts-v1:main + local-chain-1: + image: ghcr.io/foundry-rs/foundry:nightly-b174c3a4f80938636f18b3c9e49d45e6643f64a9 + networks: + - grants-stack ports: - - '127.0.0.1:3005:8545' + - '127.0.0.1:8545:8545' environment: - DEV_CHAIN_ID=313371 + entrypoint: ["anvil", "--host", "0.0.0.0", "--chain-id", "313371"] - # initializes localchain deploying contracts and populates with test data - dev-setup-1: - image: ghcr.io/gitcoinco/allo-contracts-v1:main - depends_on: - - pinata - - localchain-1 + local-chain-2: + image: ghcr.io/foundry-rs/foundry:nightly-b174c3a4f80938636f18b3c9e49d45e6643f64a9 + networks: + - grants-stack + ports: + - '127.0.0.1:8546:8545' environment: - - PINATA_HOST=pinata - - PINATA_PORT=8000 - - DEV_CHAIN_HOST=localchain-1 - - DEV_CHAIN_ID=313371 - restart: "no" - entrypoint: [ "bash", "-c", "sleep 2 && corepack enable && exec ./docker/deploy-contracts.sh"] + - DEV_CHAIN_ID=313372 + entrypoint: ["anvil", "--host", "0.0.0.0", "--chain-id", "313372"] - localchain-2: - image: ghcr.io/gitcoinco/allo-contracts-v1:pr-1 + indexer-db: + image: postgres:13 + networks: + - grants-stack ports: - - '127.0.0.1:3007:8545' + - "127.0.0.1:5432:5432" environment: - - DEV_CHAIN_ID=313372 + - POSTGRES_USER=postgres + - POSTGRES_PASSWORD=postgres + - POSTGRES_DB=postgres - # initializes localchain deploying contracts and populates with test data - dev-setup-2: - image: ghcr.io/gitcoinco/allo-contracts-v1:pr-1 + indexer: + image: ghcr.io/gravityblast/grants-stack-indexer:main + networks: + - grants-stack + ports: + - '127.0.0.1:3004:4000' depends_on: - - pinata - - localchain-2 + - indexer-db + - pina + - local-chain-1 + - local-chain-2 + volumes: + - ./tmp/indexer/passport_scores.leveldb:/var/indexer/passport_scores.leveldb environment: - - PINATA_HOST=pinata - - PINATA_PORT=8000 - - DEV_CHAIN_HOST=localchain-2 - - DEV_CHAIN_ID=313372 - restart: "no" - entrypoint: [ "bash", "-c", "sleep 2 && corepack enable && exec ./docker/deploy-contracts.sh"] + - STORAGE_DIR=/var/indexer + - DATABASE_URL=postgres://postgres:postgres@indexer-db:5432/postgres + - INDEXED_CHAINS=dev1,dev2 + - DEV1_RPC_URL=http://local-chain-1:8545 + - DEV2_RPC_URL=http://local-chain-2:8545 + - IPFS_GATEWAY=http://pina:8000 + - PASSPORT_SCORER_ID=335 + - PASSPORT_API_KEY=xn9e7AFv.aEfS0ioNhaVtww1jdwnsWtxnrNHspVsS + - COINGECKO_API_KEY=CG-9B9jhrcgAbCdN1QX9bVa1o7v + - PORT=4000 + - DEPLOYMENT_ENVIRONMENT=local + - LOG_LEVEL=debug + - ENABLE_RESOURCE_MONITOR=false + - BUILD_TAG=local + + entrypoint: ["bash", "-c", "sleep 2 && node dist/src/index.js --http-wait-for-sync=false --drop-db | ./node_modules/.bin/pino-pretty"] + +networks: + grants-stack: + name: grants-stack + driver: bridge + diff --git a/packages/common/src/chains.ts b/packages/common/src/chains.ts index b11ddb65e4..1a3ccb98b7 100644 --- a/packages/common/src/chains.ts +++ b/packages/common/src/chains.ts @@ -338,8 +338,8 @@ export const devChain1: Chain = { symbol: "ETH", }, rpcUrls: { - default: { http: ["http://localhost:3005"] }, - public: { http: ["http://localhost:3005"] }, + default: { http: ["http://localhost:8545"] }, + public: { http: ["http://localhost:8545"] }, }, blockExplorers: { default: { @@ -360,8 +360,8 @@ export const devChain2: Chain = { symbol: "ETH", }, rpcUrls: { - default: { http: ["http://localhost:3007"] }, - public: { http: ["http://localhost:3007"] }, + default: { http: ["http://localhost:8546"] }, + public: { http: ["http://localhost:8546"] }, }, blockExplorers: { default: { diff --git a/scripts/README.md b/scripts/README.md new file mode 100644 index 0000000000..1d13a27e74 --- /dev/null +++ b/scripts/README.md @@ -0,0 +1,49 @@ +## Summary + +Adds a full local development environment setup allowing local testing with all the services running on `docker-compose` and scripts to populate the environment with test data. + +With docker compose we run: + +* `piña`: a local dev only IPFS implementation with the Pinata API endpoint to pin files (https://github.com/gitcoinco/pina). +* 2 anvil instances running local chains with id `313371` and `313372` +* 1 postgres database used by the indexer +* an instance of our Indexer indexing the 2 local chains + +The `scripts/dev` script contains commands to: + +* deploy Allo V1 contracts to the 2 local chains +* populate the 2 chains with Allo V1 projects +* deploy Allo V2 contracts to the 2 local chains +* populate the 2 chains with Allo V2 profiles + +## Commands + +* `./scripts/dev start`: starts all the services with `docker-compose` in detached mode and follow logs. +* `./scripts/dev stop`: stops the services. +* `./scripts/dev setup`: calls the subcommands to deploy and populate Allo V1 and V2 in the 2 local chains. + +## Additional work + +* Dockerized allo-v1 scripts to deploy and populate Allo V1 https://github.com/gitcoinco/grants-stack-allo-contracts-v1 +* Dockerized allo-v2 scripts to deploy and populate Allo V2 https://github.com/gitcoinco/grants-stack-allo-contracts-v2 +* Custom dev-only ipfs server with the same Pinata APIs we use https://github.com/gitcoinco/pina +* Indexer with local chains support and with a temporary fix to make it work locally https://github.com/gravityblast/grants-stack-indexer + +## Allo V1 + +| Contract | Address | +| --- | --- | +| ProjectRegistry | 0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0 | +| ProgramFactory | 0xDc64a140Aa3E981100a9becA4E685f962f0cF6C9 | +| ProgramImplementation | 0x5FC8d32690cc91D4c39d9d3abcBD16989F875707 | +| QuadraticFundingVotingStrategyFactory | 0x2279B7A0a67DB372996a5FaB50D91eAA73d2eBe6 | +| QuadraticFundingVotingStrategyImplementation | 0x8A791620dd6260079BF849Dc5567aDC3F2FdC318 | +| MerklePayoutStrategyFactory | 0xA51c1fc2f0D1a1b8494Ed1FE312d7C3a78Ed91C0 | +| MerklePayoutStrategyImplementation | 0x0DCd1Bf9A1b36cE34237eEaFef220932846BCD82 | +| DirectPayoutStrategyFactory | 0x0B306BF915C4d645ff596e518fAf3F9669b97016 | +| DirectPayoutStrategyImplementation | 0x959922bE3CAee4b8Cd9a407cc3ac1C251C2007B1 | +| AlloSettings | 0x3Aa5ebB10DC797CAC828524e59A333d0A371443c | +| RoundFactory | 0xa85233C63b9Ee964Add6F2cffe00Fd84eb32338f | +| RoundImplementation | 0x4A679253410272dd5232B3Ff7cF5dbB88f295319 | + + diff --git a/scripts/dev b/scripts/dev new file mode 100755 index 0000000000..3524fab213 --- /dev/null +++ b/scripts/dev @@ -0,0 +1,189 @@ +#!/usr/bin/env bash + +ALLO_V1_SETUP_IMAGE="ghcr.io/gitcoinco/grants-stack-allo-contracts-v1:main" +ALLO_V2_SETUP_IMAGE="ghcr.io/gitcoinco/grants-stack-allo-contracts-v2:main" + +NETWORK_NAME="grants-stack" + +# We use the first two accounts from the test mnemonic +# test test test test test test test test test test test junk +# +# Account 0: 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 +# Account 1: 0x70997970C51812dc3A010C7d01b50e0d17dc79C8 +# +# To make sure the addresses of the deployed contracts are deterministic, +# we use ACCOUNT_0 to deploy V1 and ACCOUNT_1 to deploy V2. +# We also use ACCOUNT_0 to populate V1 and V2 with test data. +ACCOUNT_0_PK="0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80" +ACCOUNT_1_PK="0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d" + +# Deploy all Allo V1 contracts using the account 0 +deploy_v1() { + echo "👷 Deploying V1 contracts to dev chain 1..." + docker run \ + --network $NETWORK_NAME \ + -e DEPLOYER_PRIVATE_KEY="$ACCOUNT_0_PK" \ + -e DEV_CHAIN_HOST=${NETWORK_NAME}-local-chain-1-1 \ + -e DEV_CHAIN_ID=313371 \ + -e DEV_CHAIN_PORT=8545 \ + -e INFURA_ID="NOT_USED" \ + $ALLO_V1_SETUP_IMAGE \ + bash -c "./docker/deploy-contracts.sh" + + echo "👷 Deploying V1 contracts to dev chain 2..." + docker run \ + --network $NETWORK_NAME \ + -e DEPLOYER_PRIVATE_KEY="$ACCOUNT_0_PK" \ + -e DEV_CHAIN_HOST=${NETWORK_NAME}-local-chain-2-1 \ + -e DEV_CHAIN_ID=313372 \ + -e DEV_CHAIN_PORT=8545 \ + -e INFURA_ID="NOT_USED" \ + $ALLO_V1_SETUP_IMAGE \ + bash -c "./docker/deploy-contracts.sh" +} + +# Deploy all Allo V2 contracts using the account at index 1 +deploy_v2() { + echo "👷 Deploying V2 contracts to dev chain 1 and 2..." + docker run \ + --network $NETWORK_NAME \ + -e DEPLOYER_PRIVATE_KEY="$ACCOUNT_1_PK" \ + -e DEV1_CHAIN_ID=313371 \ + -e DEV1_CHAIN_HOST=${NETWORK_NAME}-local-chain-1-1 \ + -e DEV1_CHAIN_PORT=8545 \ + -e DEV2_CHAIN_ID=313372 \ + -e DEV2_CHAIN_HOST=${NETWORK_NAME}-local-chain-2-1 \ + -e DEV2_CHAIN_PORT=8545 \ + $ALLO_V2_SETUP_IMAGE \ + bash -c "./scripts/dev/deployAllDevNetworks.sh" +} + +# Populate Allo V1 using the account account 0 +populate_v1() { + echo "👷 Populating V1 in dev chain 1..." + docker run \ + --network $NETWORK_NAME \ + -e DEPLOYER_PRIVATE_KEY="$ACCOUNT_0_PK" \ + -e PINATA_HOST=pina \ + -e PINATA_PORT=8000 \ + -e DEV_CHAIN_HOST=${NETWORK_NAME}-local-chain-1-1 \ + -e DEV_CHAIN_ID=313371 \ + -e DEV_CHAIN_PORT=8545 \ + -e INFURA_ID="NOT_USED" \ + $ALLO_V1_SETUP_IMAGE \ + pnpm hardhat run scripts/dev/populate/projects.ts --network dev + + echo "👷 Populating V1 in dev chain 2..." + docker run \ + --network $NETWORK_NAME \ + -e DEPLOYER_PRIVATE_KEY="$ACCOUNT_0_PK" \ + -e PINATA_HOST=pina \ + -e PINATA_PORT=8000 \ + -e DEV_CHAIN_HOST=${NETWORK_NAME}-local-chain-2-1 \ + -e DEV_CHAIN_ID=313372 \ + -e DEV_CHAIN_PORT=8545 \ + -e INFURA_ID="NOT_USED" \ + $ALLO_V1_SETUP_IMAGE \ + pnpm hardhat run scripts/dev/populate/projects.ts --network dev +} + +# Populate Allo V2 contracts using account 0 +populate_v2() { + echo "👷 Populating V2 on dev chain 1..." + docker run \ + --network $NETWORK_NAME \ + -e DEPLOYER_PRIVATE_KEY="$ACCOUNT_0_PK" \ + -e PINATA_HOST=pina \ + -e PINATA_PORT=8000 \ + -e DEV1_CHAIN_ID=313371 \ + -e DEV1_CHAIN_HOST=${NETWORK_NAME}-local-chain-1-1 \ + -e DEV1_CHAIN_PORT=8545 \ + -e DEV2_CHAIN_ID=313372 \ + -e DEV2_CHAIN_HOST=${NETWORK_NAME}-local-chain-2-1 \ + -e DEV2_CHAIN_PORT=8545 \ + $ALLO_V2_SETUP_IMAGE \ + bash -c "npx hardhat run scripts/dev/populate.ts --no-compile --network dev1" + + echo "👷 Populating V2 on dev chain 2..." + docker run \ + --network $NETWORK_NAME \ + -e DEPLOYER_PRIVATE_KEY="$ACCOUNT_0_PK" \ + -e PINATA_HOST=pina \ + -e PINATA_PORT=8000 \ + -e DEV1_CHAIN_ID=313371 \ + -e DEV1_CHAIN_HOST=${NETWORK_NAME}-local-chain-1-1 \ + -e DEV1_CHAIN_PORT=8545 \ + -e DEV2_CHAIN_ID=313372 \ + -e DEV2_CHAIN_HOST=${NETWORK_NAME}-local-chain-2-1 \ + -e DEV2_CHAIN_PORT=8545 \ + $ALLO_V2_SETUP_IMAGE \ + bash -c "npx hardhat run scripts/dev/populate.ts --no-compile --network dev2" +} + +start() { + echo "Starting all services..." + docker-compose up -d + docker-compose logs -f +} + +stop() { + echo "Stopping all services..." + docker-compose down +} + +init() { + deploy_v1 && + deploy_v2 && + populate_v1 && + populate_v2 +} + +print_help() { + echo "Usage: $0 " + echo "Commands:" + echo " init Deploy and populate Allo V1 and V2" + echo " deploy-v1 Deploy Allo V1 contracts" + echo " deploy-v2 Deploy Allo V2 contracts" + echo " populate-v1 Populate Allo V1 contracts" + echo " populate-v2 Populate Allo V2 contracts" + echo " start Start all Docker Compose services and follow logs" + echo " stop Stop all Docker Compose services" + echo " help Display this help message" +} + +main() { + case "$1" in + init) + init + ;; + deploy-v1) + deploy_v1 + ;; + deploy-v2) + deploy_v2 + ;; + populate-v1) + populate_v1 + ;; + populate-v2) + populate_v2 + ;; + start) + start + ;; + stop) + stop + ;; + help) + print_help + ;; + *) + echo "Error: Unknown command '$1'" + print_help + exit 1 + ;; + esac +} + +main "$@" +