diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml deleted file mode 100644 index a33d7e596..000000000 --- a/.github/workflows/build.yml +++ /dev/null @@ -1,484 +0,0 @@ -name: Build - -on: - push: - branches: - - main - - "test/*" - pull_request: - types: [assigned, opened, synchronize, reopened, labeled] - paths: - - ".github/workflows/build.yml" - - # C++ - - "CMakeLists.txt" - - "contracts/**" - - "external/CMakeLists.txt" - - "libraries/**" - - "native/**" - - "programs/**" - - "wasm/**" - - # box, webapp - - ".eslintignore" - - ".eslintrc.js" - - ".prettierrc.json" - - "lerna.json" - - "package.json" - - "packages/common/**" - - "tsconfig.build.json" - - "tsconfig.json" - - "yarn.lock" - - # box - - "docker/eden-box.Dockerfile" - - "packages/box/**" - - # webapp - - "docker/eden-webapp.Dockerfile" - - "packages/webapp/**" -jobs: - build-cpp: - name: Build C++ - runs-on: ubuntu-latest - container: ghcr.io/gofractally/eden-builder:latest - - steps: - - name: โœ… Checkout code - uses: actions/checkout@v2 - - - uses: dorny/paths-filter@v2 - id: filter - with: - filters: | - src: - - ".github/workflows/build.yml" - - - "CMakeLists.txt" - - "contracts/**" - - "external/CMakeLists.txt" - - "libraries/**" - - "native/**" - - "programs/**" - - "wasm/**" - - - name: Prepare ccache timestamp - if: steps.filter.outputs.src == 'true' - id: ccache_cache_timestamp - shell: cmake -P {0} - run: | - string(TIMESTAMP current_date "%Y-%m-%d-%H-%M-%S" UTC) - message("::set-output name=timestamp::${current_date}") - - - name: show_cache - if: steps.filter.outputs.src == 'true' - id: show_cache - run: | - echo "${{ runner.os }}-ccache_whole-${{ steps.ccache_cache_timestamp.outputs.timestamp }}" - echo "${{ runner.os }}-product_cache-${{ steps.ccache_cache_timestamp.outputs.timestamp }}" - - - name: ccache cache files - if: steps.filter.outputs.src == 'true' - uses: actions/cache@v1.1.0 - with: - path: .ccache - key: ${{ runner.os }}-ccache_whole-${{ steps.ccache_cache_timestamp.outputs.timestamp }} - restore-keys: | - ${{ runner.os }}-ccache_whole- - - - name: product cache files - uses: actions/cache@v1.1.0 - with: - path: product_cache - key: ${{ runner.os }}-product_cache-${{ steps.ccache_cache_timestamp.outputs.timestamp }} - restore-keys: | - ${{ runner.os }}-product_cache- - - - name: ๐Ÿ›  Build - if: steps.filter.outputs.src == 'true' - run: | - set -e - export CCACHE_DIR=${GITHUB_WORKSPACE}/.ccache - export CCACHE_CONFIGPATH=${GITHUB_WORKSPACE}/.github/ccache.conf - echo ===== - pwd - echo ${GITHUB_WORKSPACE} - echo ===== - ccache -s - echo ===== - - git submodule update --init --recursive - mkdir build - cd build - cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_C_COMPILER_LAUNCHER=ccache -DSKIP_TS=Yes -DEDEN_ATOMIC_ASSETS_ACCOUNT=atomicassets -DEDEN_ATOMIC_MARKET_ACCOUNT=atomicmarket -DEDEN_SCHEMA_NAME=members .. - make -j$(nproc) - - tar czf clsdk-ubuntu-20-04.tar.gz clsdk - rm -rf ../product_cache - mkdir -p ../product_cache/clsdk/contracts - cp clsdk-ubuntu-20-04.tar.gz ../product_cache - cp atomicassets.abi ../product_cache - cp atomicassets.wasm ../product_cache - cp atomicmarket.abi ../product_cache - cp atomicmarket.wasm ../product_cache - cp clsdk/contracts/bios.wasm ../product_cache/clsdk/contracts/bios.wasm - cp boot.wasm ../product_cache - cp eden-micro-chain.wasm ../product_cache - cp eden.abi ../product_cache - cp eden.wasm ../product_cache - cp run-elections.wasm ../product_cache - cp run-genesis.wasm ../product_cache - cp run-complete-elections.wasm ../product_cache - cp token.abi ../product_cache - cp token.wasm ../product_cache - - echo ===== - ls -la ${GITHUB_WORKSPACE} - echo ===== - ccache -s - echo ===== - - - name: ๐Ÿงช Run tests with CTest - if: steps.filter.outputs.src == 'true' - run: cd build && ctest -j$(nproc) -V - - - name: ๐Ÿ“ƒ Upload ccache.log - if: steps.filter.outputs.src == 'true' - uses: actions/upload-artifact@v2 - with: - name: ccache_log - path: | - ccache.log - - - name: ๐Ÿ“ƒ Upload clsdk - uses: actions/upload-artifact@v2 - with: - name: clsdk - path: | - product_cache/clsdk-ubuntu-20-04.tar.gz - - - name: ๐Ÿ“ƒ Upload Eden Smart Contract - uses: actions/upload-artifact@v2 - with: - name: Eden Smart Contract - path: | - product_cache/eden.abi - product_cache/eden.wasm - product_cache/eden-micro-chain.wasm - - - name: ๐Ÿ“ƒ Upload Ephemeral Eden Chains Runners - uses: actions/upload-artifact@v2 - with: - name: Ephemeral Eden Chains Runners - path: | - product_cache/atomicassets.abi - product_cache/atomicassets.wasm - product_cache/atomicmarket.abi - product_cache/atomicmarket.wasm - product_cache/clsdk/contracts/bios.wasm - product_cache/boot.wasm - product_cache/eden.abi - product_cache/eden.wasm - product_cache/token.abi - product_cache/token.wasm - product_cache/run-genesis.wasm - product_cache/run-elections.wasm - product_cache/run-complete-elections.wasm - - build-micro-chain: - name: Build Micro Chain - runs-on: ubuntu-latest - container: ghcr.io/gofractally/eden-builder:latest - - steps: - - name: โœ… Checkout code - uses: actions/checkout@v2 - - - name: Prepare ccache timestamp - id: ccache_cache_timestamp - shell: cmake -P {0} - run: | - string(TIMESTAMP current_date "%Y-%m-%d-%H-%M-%S" UTC) - message("::set-output name=timestamp::${current_date}") - - - name: show_cache - id: show_cache - run: echo "${{ runner.os }}-ccache_microchain-${{ steps.ccache_cache_timestamp.outputs.timestamp }}" - - - name: ccache cache files - uses: actions/cache@v1.1.0 - with: - path: .ccache - key: ${{ runner.os }}-ccache_microchain-${{ steps.ccache_cache_timestamp.outputs.timestamp }} - restore-keys: | - ${{ runner.os }}-ccache_microchain- - - - name: ๐Ÿ›  Build - run: | - set -e - export CCACHE_DIR=${GITHUB_WORKSPACE}/.ccache - export CCACHE_CONFIGPATH=${GITHUB_WORKSPACE}/.github/ccache.conf - echo ===== - pwd - echo ${GITHUB_WORKSPACE} - echo ===== - ccache -s - echo ===== - - git submodule update --init external/atomicassets-contract - git submodule update --init external/Catch2 - git submodule update --init external/fmt - git submodule update --init external/rapidjson - mkdir build - cd build - cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_C_COMPILER_LAUNCHER=ccache -DSKIP_TS=Yes -DEDEN_ATOMIC_ASSETS_ACCOUNT=atomicassets -DEDEN_ATOMIC_MARKET_ACCOUNT=atomicmarket -DEDEN_SCHEMA_NAME=members -DBUILD_NATIVE=OFF .. - make -j$(nproc) wasm-configure - bash -c "cd wasm && make -j$(nproc) eden-micro-chain" - - echo ===== - ls -la ${GITHUB_WORKSPACE} - echo ===== - ccache -s - echo ===== - - - name: ๐Ÿ“ƒ Upload ccache.log - uses: actions/upload-artifact@v2 - with: - name: microchain_ccache_log - path: | - ccache.log - - - name: ๐Ÿ“ƒ Upload Eden Microchain - uses: actions/upload-artifact@v2 - with: - name: Eden Microchain - path: | - build/eden-micro-chain.wasm - - box-build: - needs: build-micro-chain - name: Build Eden Box - runs-on: ubuntu-latest - - steps: - - name: โœ… Checkout code - uses: actions/checkout@v2 - - - uses: dorny/paths-filter@v2 - id: filter - with: - filters: | - src: - - ".github/workflows/build.yml" - - - ".eslintignore" - - ".eslintrc.js" - - ".prettierrc.json" - - "lerna.json" - - "package.json" - - "packages/common/**" - - "tsconfig.build.json" - - "tsconfig.json" - - "yarn.lock" - - - "docker/eden-box.Dockerfile" - - "packages/box/**" - - - name: Download Eden Microchain - if: steps.filter.outputs.src == 'true' - uses: actions/download-artifact@v2 - with: - name: Eden Microchain - path: build - - - name: Image Preparation - if: steps.filter.outputs.src == 'true' - id: prep - run: | - REGISTRY="ghcr.io" - IMAGE="${REGISTRY}/${{ github.repository_owner }}/eden-box" - TAGS="${IMAGE}:${{ github.sha }}" - if [[ $GITHUB_REF == ref/head/master ]]; then - TAGS="${TAGS},${IMAGE}:latest" - fi - echo ::set-output name=tags::${TAGS,,} - - - name: Showtag - if: steps.filter.outputs.src == 'true' - id: showtag - run: echo ${{ steps.prep.outputs.tags }} - - - name: Docker Buildx setup - if: steps.filter.outputs.src == 'true' - uses: docker/setup-buildx-action@v1 - - - name: Login in to registry - if: steps.filter.outputs.src == 'true' - uses: docker/login-action@v1 - with: - registry: ghcr.io - username: ${{ github.repository_owner }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: ๐Ÿ›  Build & Publish Image - if: steps.filter.outputs.src == 'true' - uses: docker/build-push-action@v2 - with: - push: true - file: docker/eden-box.Dockerfile - tags: ${{ steps.prep.outputs.tags }} - context: . - - e2e: - needs: [build-cpp, build-micro-chain] - name: E2E Tests - environment: e2e_tests - runs-on: ubuntu-latest - - steps: - - name: โœ… Checkout code - uses: actions/checkout@v2 - - - uses: dorny/paths-filter@v2 - id: filter - with: - filters: | - src: - - ".github/workflows/build.yml" - - - ".eslintignore" - - ".eslintrc.js" - - ".prettierrc.json" - - "lerna.json" - - "package.json" - - "packages/common/**" - - "tsconfig.build.json" - - "tsconfig.json" - - "yarn.lock" - - "scripts/eden_chain_runner.sh" - - - "packages/**" - - "contracts/**" - - - name: Download Eden Microchain - if: steps.filter.outputs.src == 'true' - uses: actions/download-artifact@v2 - with: - name: Eden Microchain - path: build - - - name: Download Ephemeral Eden Chain Runners - if: steps.filter.outputs.src == 'true' - uses: actions/download-artifact@v2 - with: - name: Ephemeral Eden Chains Runners - path: build - - - name: Download clsdk - if: steps.filter.outputs.src == 'true' - uses: actions/download-artifact@v2 - with: - name: clsdk - path: build - - - name: Start Genesis Ephemeral Chain - if: steps.filter.outputs.src == 'true' - run: | - cp ./scripts/eden_chain_runner.sh ./build - cd build - tar -xvf clsdk-ubuntu-20-04.tar.gz clsdk/bin - ls -la - sh -x ./eden_chain_runner.sh run-genesis.wasm - - - name: ๐Ÿ›  Build and Start WebApp - if: steps.filter.outputs.src == 'true' - run: | - export DFUSE_PREVENT_CONNECT=1 - export NODE_ENV=test - env - yarn - yarn build --stream --ignore @edenos/example-history-app - yarn start-test --stream --ignore @edenos/example-history-app & - env: - IPFS_PINATA_JWT: ${{ secrets.IPFS_PINATA_JWT }} - - - name: ๐Ÿงช Run E2E - if: steps.filter.outputs.src == 'true' - run: | - yarn test --stream - - - name: ๐ŸŽฅ Upload Cypress Results - if: always() && steps.filter.outputs.src == 'true' - uses: actions/upload-artifact@v2 - with: - name: Cypress E2E Videos and Screenshots - path: | - packages/webapp/cypress/screenshots - packages/webapp/cypress/videos - - webapp-build: - needs: build-micro-chain - name: Build Eden Community WebApp - runs-on: ubuntu-latest - - steps: - - name: โœ… Checkout code - uses: actions/checkout@v2 - - - uses: dorny/paths-filter@v2 - id: filter - with: - filters: | - src: - - ".github/workflows/build.yml" - - - ".eslintignore" - - ".eslintrc.js" - - ".prettierrc.json" - - "lerna.json" - - "package.json" - - "packages/common/**" - - "tsconfig.build.json" - - "tsconfig.json" - - "yarn.lock" - - - "docker/eden-webapp.Dockerfile" - - "packages/webapp/**" - - - name: Image Preparation - if: steps.filter.outputs.src == 'true' - id: prep - run: | - REGISTRY="ghcr.io" - IMAGE="${REGISTRY}/${{ github.repository_owner }}/eden-webapp" - TAGS="${IMAGE}:${{ github.sha }}" - if [[ $GITHUB_REF == ref/head/master ]]; then - TAGS="${TAGS},${IMAGE}:latest" - fi - echo ::set-output name=tags::${TAGS,,} - - - name: Showtag - if: steps.filter.outputs.src == 'true' - id: showtag - run: echo ${{ steps.prep.outputs.tags }} - - - name: Docker Buildx setup - if: steps.filter.outputs.src == 'true' - uses: docker/setup-buildx-action@v1 - - - name: Login in to registry - if: steps.filter.outputs.src == 'true' - uses: docker/login-action@v1 - with: - registry: ghcr.io - username: ${{ github.repository_owner }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: ๐Ÿ›  Build & Publish Image - if: steps.filter.outputs.src == 'true' - uses: docker/build-push-action@v2 - with: - push: true - file: docker/eden-webapp.Dockerfile - tags: ${{ steps.prep.outputs.tags }} - context: . diff --git a/.github/workflows/eden-builder.yml b/.github/workflows/eden-builder.yml index fbcca5043..f0f65ed47 100644 --- a/.github/workflows/eden-builder.yml +++ b/.github/workflows/eden-builder.yml @@ -4,12 +4,7 @@ on: workflow_dispatch: push: branches: - - main - - "test/*" - paths: - - "docker/eden-builder.Dockerfile" - pull_request: - types: [assigned, opened, synchronize, reopened, labeled] + - dev paths: - "docker/eden-builder.Dockerfile" @@ -28,9 +23,7 @@ jobs: REGISTRY="ghcr.io" IMAGE="${REGISTRY}/${{ github.repository_owner }}/eden-builder" TAGS="${IMAGE}:${{ github.sha }}" - if [[ $GITHUB_REF == ref/head/main ]]; then - TAGS="${TAGS},${IMAGE}:latest" - fi + TAGS="${TAGS},${IMAGE}:latest" echo ::set-output name=tags::${TAGS,,} - name: Showtag diff --git a/.github/workflows/push-dev-environment.yaml b/.github/workflows/push-dev-environment.yaml new file mode 100644 index 000000000..d94182022 --- /dev/null +++ b/.github/workflows/push-dev-environment.yaml @@ -0,0 +1,599 @@ +name: Build images webapp and box from latest dev branch + +on: + workflow_dispatch: + push: + branches: + - dev + +jobs: + + # build-cpp: + # name: Build C++ + # runs-on: ubuntu-latest + # container: ghcr.io/eden/eden-builder:latest + # + # steps: + # - name: โœ… Checkout code + # uses: actions/checkout@v2 + # + # - uses: dorny/paths-filter@v2 + # id: filter + # with: + # filters: | + # src: + # - ".github/workflows/build.yml" + # + # - "CMakeLists.txt" + # - "contracts/**" + # - "external/CMakeLists.txt" + # - "libraries/**" + # - "native/**" + # - "programs/**" + # - "wasm/**" + # + # - name: Prepare ccache timestamp + # if: steps.filter.outputs.src == 'true' + # id: ccache_cache_timestamp + # shell: cmake -P {0} + # run: | + # string(TIMESTAMP current_date "%Y-%m-%d-%H-%M-%S" UTC) + # message("::set-output name=timestamp::${current_date}") + # + # - name: show_cache + # if: steps.filter.outputs.src == 'true' + # id: show_cache + # run: | + # echo "${{ runner.os }}-ccache_whole-${{ steps.ccache_cache_timestamp.outputs.timestamp }}" + # echo "${{ runner.os }}-product_cache-${{ steps.ccache_cache_timestamp.outputs.timestamp }}" + # + # - name: ccache cache files + # if: steps.filter.outputs.src == 'true' + # uses: actions/cache@v1.1.0 + # with: + # path: .ccache + # key: ${{ runner.os }}-ccache_whole-${{ steps.ccache_cache_timestamp.outputs.timestamp }} + # restore-keys: | + # ${{ runner.os }}-ccache_whole- + # + # - name: product cache files + # uses: actions/cache@v1.1.0 + # with: + # path: product_cache + # key: ${{ runner.os }}-product_cache-${{ steps.ccache_cache_timestamp.outputs.timestamp }} + # restore-keys: | + # ${{ runner.os }}-product_cache- + # + # - name: ๐Ÿ›  Build + # if: steps.filter.outputs.src == 'true' + # run: | + # set -e + # export CCACHE_DIR=${GITHUB_WORKSPACE}/.ccache + # export CCACHE_CONFIGPATH=${GITHUB_WORKSPACE}/.github/ccache.conf + # echo ===== + # pwd + # echo ${GITHUB_WORKSPACE} + # echo ===== + # ccache -s + # echo ===== + # + # git submodule update --init --recursive + # mkdir build + # cd build + # cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_C_COMPILER_LAUNCHER=ccache -DSKIP_TS=Yes -DEDEN_ATOMIC_ASSETS_ACCOUNT=atomicassets -DEDEN_ATOMIC_MARKET_ACCOUNT=atomicmarket -DEDEN_SCHEMA_NAME=members .. + # make -j$(nproc) + # + # tar czf clsdk-ubuntu-20-04.tar.gz clsdk + # rm -rf ../product_cache + # mkdir -p ../product_cache/clsdk/contracts + # cp clsdk-ubuntu-20-04.tar.gz ../product_cache + # cp atomicassets.abi ../product_cache + # cp atomicassets.wasm ../product_cache + # cp atomicmarket.abi ../product_cache + # cp atomicmarket.wasm ../product_cache + # cp clsdk/contracts/bios.wasm ../product_cache/clsdk/contracts/bios.wasm + # cp boot.wasm ../product_cache + # cp eden-micro-chain.wasm ../product_cache + # cp eden.abi ../product_cache + # cp eden.wasm ../product_cache + # cp run-elections.wasm ../product_cache + # cp run-genesis.wasm ../product_cache + # cp run-complete-elections.wasm ../product_cache + # cp token.abi ../product_cache + # cp token.wasm ../product_cache + # + # echo ===== + # ls -la ${GITHUB_WORKSPACE} + # echo ===== + # ccache -s + # echo ===== + # + # - name: ๐Ÿงช Run tests with CTest + # if: steps.filter.outputs.src == 'true' + # run: cd build && ctest -j$(nproc) -V + # + # - name: ๐Ÿ“ƒ Upload ccache.log + # if: steps.filter.outputs.src == 'true' + # uses: actions/upload-artifact@v2 + # with: + # name: ccache_log + # path: | + # ccache.log + # + # - name: ๐Ÿ“ƒ Upload clsdk + # uses: actions/upload-artifact@v2 + # with: + # name: clsdk + # path: | + # product_cache/clsdk-ubuntu-20-04.tar.gz + # + # - name: ๐Ÿ“ƒ Upload Eden Smart Contract + # uses: actions/upload-artifact@v2 + # with: + # name: Eden Smart Contract + # path: | + # product_cache/eden.abi + # product_cache/eden.wasm + # product_cache/eden-micro-chain.wasm + # + # - name: ๐Ÿ“ƒ Upload Ephemeral Eden Chains Runners + # uses: actions/upload-artifact@v2 + # with: + # name: Ephemeral Eden Chains Runners + # path: | + # product_cache/atomicassets.abi + # product_cache/atomicassets.wasm + # product_cache/atomicmarket.abi + # product_cache/atomicmarket.wasm + # product_cache/clsdk/contracts/bios.wasm + # product_cache/boot.wasm + # product_cache/eden.abi + # product_cache/eden.wasm + # product_cache/token.abi + # product_cache/token.wasm + # product_cache/run-genesis.wasm + # product_cache/run-elections.wasm + # product_cache/run-complete-elections.wasm + + build-micro-chain: + name: Build Micro Chain + runs-on: ubuntu-latest + container: ghcr.io/edenia/eden-builder:latest + + steps: + - name: โœ… Checkout code + uses: actions/checkout@v3 + + - name: Prepare ccache timestamp + id: ccache_cache_timestamp + shell: cmake -P {0} + run: | + string(TIMESTAMP current_date "%Y-%m-%d-%H-%M-%S" UTC) + message("name=timestamp>>${current_date}") + + - name: show_cache + id: show_cache + run: echo "${{ runner.os }}-ccache_microchain-${{ steps.ccache_cache_timestamp.outputs.timestamp }}" + + - name: ccache cache files + uses: actions/cache@v3 + with: + path: .ccache + key: ${{ runner.os }}-ccache_microchain-${{ steps.ccache_cache_timestamp.outputs.timestamp }} + restore-keys: | + ${{ runner.os }}-ccache_microchain- + + - name: ๐Ÿ›  Build + run: | + git config --global --add safe.directory "*" + set -e + export CCACHE_DIR=${GITHUB_WORKSPACE}/.ccache + export CCACHE_CONFIGPATH=${GITHUB_WORKSPACE}/.github/ccache.conf + echo ===== + pwd + echo ${GITHUB_WORKSPACE} + echo ===== + ccache -s + echo ===== + + + git submodule update --init external/atomicassets-contract + git submodule update --init external/Catch2 + git submodule update --init external/fmt + git submodule update --init external/rapidjson + mkdir build + cd build + cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_C_COMPILER_LAUNCHER=ccache -DSKIP_TS=Yes -DEDEN_ATOMIC_ASSETS_ACCOUNT=atomicassets -DEDEN_ATOMIC_MARKET_ACCOUNT=atomicmarket -DEDEN_SCHEMA_NAME=members -DBUILD_NATIVE=OFF .. + make -j$(nproc) wasm-configure + bash -c "cd wasm && make -j$(nproc) eden-micro-chain" + + echo ===== + ls -la ${GITHUB_WORKSPACE} + echo ===== + ccache -s + echo ===== + + - name: ๐Ÿ“ƒ Upload ccache.log + uses: actions/upload-artifact@v3 + with: + name: microchain_ccache_log + path: | + ccache.log + + - name: ๐Ÿ“ƒ Upload Eden Microchain + uses: actions/upload-artifact@v3 + with: + name: Eden Microchain + path: | + build/eden-micro-chain.wasm + + box-build: + needs: build-micro-chain + name: Build Eden Box + runs-on: ubuntu-latest + + steps: + - name: โœ… Checkout code + uses: actions/checkout@v3 + + - uses: dorny/paths-filter@v2 + id: filter + with: + filters: | + src: + - ".github/workflows/push-dev-environment.yml" + + - ".eslintignore" + - ".eslintrc.js" + - ".prettierrc.json" + - "lerna.json" + - "package.json" + - "packages/common/**" + - "tsconfig.build.json" + - "tsconfig.json" + - "yarn.lock" + + - "docker/eden-box.Dockerfile" + - "packages/box/**" + + - name: Download Eden Microchain + # if: steps.filter.outputs.src == 'true' + uses: actions/download-artifact@v3 + with: + name: Eden Microchain + path: build + + - name: Image Preparation + # if: steps.filter.outputs.src == 'true' + id: prep + run: | + REGISTRY="ghcr.io" + IMAGE="${REGISTRY}/${{ github.repository_owner }}/eden-box" + TAGS="${IMAGE}:$(git rev-parse --short HEAD)" + echo "tags_box=${TAGS}" >> $GITHUB_OUTPUT + + - name: Showtag + # if: steps.filter.outputs.src == 'true' + id: showtag + run: echo ${{ steps.prep.outputs.tags_box }} + + - name: Docker Buildx setup + # if: steps.filter.outputs.src == 'true' + uses: docker/setup-buildx-action@v2 + + - name: Login in to registry + # if: steps.filter.outputs.src == 'true' + uses: docker/login-action@v2 + with: + registry: ghcr.io + username: ${{ github.repository_owner }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Build env files box + id: build-env-files-box + run: | + make \ + build-env-files-box + env: + ENVIRONMENT: dev + DEV_SERVER_HOST: ${{ secrets.DEV_SERVER_HOST }} + DEV_SERVER_PORT: ${{ secrets.DEV_SERVER_PORT }} + DEV_EOS_CHAIN_ID: ${{ secrets.DEV_EOS_CHAIN_ID }} + EOS_RPC_PROTOCOL: https + EOS_RPC_HOST: jungle4.api.eosnation.io + EOS_RPC_PORT: 443 + TAPOS_MANAGER_INTERVAL_MINS: 30 + DEV_EDEN_CONTRACT_ACCOUNT: ${{ secrets.DEV_EDEN_CONTRACT_ACCOUNT }} + DEV_IPFS_PINATA_JWT_BOX: ${{ secrets.DEV_IPFS_PINATA_JWT_BOX }} + DEV_SUBCHAIN_EDEN_CONTRACT: ${{ secrets.DEV_SUBCHAIN_EDEN_CONTRACT }} + DEV_SUBCHAIN_TOKEN_CONTRACT: ${{ secrets.DEV_SUBCHAIN_TOKEN_CONTRACT }} + DEV_SUBCHAIN_AA_CONTRACT: ${{ secrets.DEV_SUBCHAIN_AA_CONTRACT }} + DEV_SUBCHAIN_AA_MARKET_CONTRACT: ${{ secrets.DEV_SUBCHAIN_AA_MARKET_CONTRACT }} + DEV_SUBCHAIN_WASM: ${{ secrets.DEV_SUBCHAIN_WASM }} + SUBCHAIN_STATE: state + DFUSE_API_KEY: + DEV_DFUSE_API_NETWORK: ${{ secrets.DEV_DFUSE_API_NETWORK }} + DFUSE_AUTH_NETWORK: ${{ secrets.DFUSE_AUTH_NETWORK }} + DFUSE_FIRST_BLOCK: 35955488 + DEV_DFUSE_JSON_TRX_FILE: ${{ secrets.DEV_DFUSE_JSON_TRX_FILE }} + DFUSE_INTERVAL: 30 + DEV_SERVER_PAYS_PRIVATE_KEY: ${{ secrets.DEV_SERVER_PAYS_PRIVATE_KEY }} + DEV_SERVER_PAYS_ACCOUNT: ${{ secrets.DEV_SERVER_PAYS_ACCOUNT }} + DEV_SERVER_PAYS_PERMISSION: ${{ secrets.DEV_SERVER_PAYS_PERMISSION }} + DEV_SERVER_PAYS_NOOP_CONTRACT: ${{ secrets.DEV_SERVER_PAYS_NOOP_CONTRACT }} + DEV_SERVER_PAYS_NOOP_ACTION: ${{ secrets.DEV_SERVER_PAYS_NOOP_ACTION }} + DEV_SERVER_PAYS_CREATE_ABI: ${{ secrets.DEV_SERVER_PAYS_CREATE_ABI }} + SESSIONS_ENABLE: true + + - name: ๐Ÿ›  Build & Publish Image + # if: steps.filter.outputs.src == 'true' + uses: docker/build-push-action@v3 + with: + push: true + file: docker/eden-box.Dockerfile + tags: ${{ steps.prep.outputs.tags_box }} + context: . + +# e2e: +# needs: [build-cpp, build-micro-chain] +# name: E2E Tests +# environment: e2e_tests +# runs-on: ubuntu-latest +# +# steps: +# - name: โœ… Checkout code +# uses: actions/checkout@v2 +# +# - uses: dorny/paths-filter@v2 +# id: filter +# with: +# filters: | +# src: +# - ".github/workflows/build.yml" +# +# - ".eslintignore" +# - ".eslintrc.js" +# - ".prettierrc.json" +# - "lerna.json" +# - "package.json" +# - "packages/common/**" +# - "tsconfig.build.json" +# - "tsconfig.json" +# - "yarn.lock" +# - "scripts/eden_chain_runner.sh" +# +# - "packages/**" +# - "contracts/**" +# +# - name: Download Eden Microchain +# if: steps.filter.outputs.src == 'true' +# uses: actions/download-artifact@v2 +# with: +# name: Eden Microchain +# path: build +# +# - name: Download Ephemeral Eden Chain Runners +# if: steps.filter.outputs.src == 'true' +# uses: actions/download-artifact@v2 +# with: +# name: Ephemeral Eden Chains Runners +# path: build +# +# - name: Download clsdk +# if: steps.filter.outputs.src == 'true' +# uses: actions/download-artifact@v2 +# with: +# name: clsdk +# path: build +# +# - name: Start Genesis Ephemeral Chain +# if: steps.filter.outputs.src == 'true' +# run: | +# cp ./scripts/eden_chain_runner.sh ./build +# cd build +# tar -xvf clsdk-ubuntu-20-04.tar.gz clsdk/bin +# ls -la +# sh -x ./eden_chain_runner.sh run-genesis.wasm +# +# - name: ๐Ÿ›  Build and Start WebApp +# if: steps.filter.outputs.src == 'true' +# run: | +# export DFUSE_PREVENT_CONNECT=1 +# export NODE_ENV=test +# env +# yarn +# yarn build --stream --ignore @edenos/example-history-app +# yarn start-test --stream --ignore @edenos/example-history-app & +# env: +# IPFS_PINATA_JWT: ${{ secrets.IPFS_PINATA_JWT }} +# +# - name: ๐Ÿงช Run E2E +# if: steps.filter.outputs.src == 'true' +# run: | +# yarn test --stream +# +# - name: ๐ŸŽฅ Upload Cypress Results +# if: always() && steps.filter.outputs.src == 'true' +# uses: actions/upload-artifact@v2 +# with: +# name: Cypress E2E Videos and Screenshots +# path: | +# packages/webapp/cypress/screenshots +# packages/webapp/cypress/videos + + webapp-build: + needs: build-micro-chain + name: Build Eden Community WebApp + runs-on: ubuntu-latest + + steps: + - name: โœ… Checkout code + uses: actions/checkout@v3 + + - uses: dorny/paths-filter@v2 + id: filter + with: + filters: | + src: + - ".github/workflows/push-dev-environment.yml" + + - ".eslintignore" + - ".eslintrc.js" + - ".prettierrc.json" + - "lerna.json" + - "package.json" + - "packages/common/**" + - "tsconfig.build.json" + - "tsconfig.json" + - "yarn.lock" + + - "docker/eden-webapp.Dockerfile" + - "packages/webapp/**" + + - name: Image Preparation + # if: steps.filter.outputs.src == 'true' + id: prep + run: | + REGISTRY="ghcr.io" + IMAGE="${REGISTRY}/${{ github.repository_owner }}/eden-webapp" + TAGS="${IMAGE}:$(git rev-parse --short HEAD)" + echo "tags_webapp=${TAGS}" >> $GITHUB_OUTPUT + + - name: Showtag + # if: steps.filter.outputs.src == 'true' + id: showtag + run: echo ${{ steps.prep.outputs.tags_webapp }} + + - name: Docker Buildx setup + # if: steps.filter.outputs.src == 'true' + uses: docker/setup-buildx-action@v2 + + - name: Login in to registry + # if: steps.filter.outputs.src == 'true' + uses: docker/login-action@v2 + with: + registry: ghcr.io + username: ${{ github.repository_owner }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Build env files webapp + id: build-env-files-webapp + run: | + make \ + build-env-files-webapp + env: + ENVIRONMENT: dev + NEXT_PUBLIC_APP_NAME: Eden Community App + NEXT_PUBLIC_APP_SHORT_NAME: eden-community-app + NEXT_PUBLIC_BASE_URL: https://eden.edenia.cloud + DEV_NEXT_PUBLIC_EOS_CHAIN_ID: ${{ secrets.DEV_NEXT_PUBLIC_EOS_CHAIN_ID }} + NEXT_PUBLIC_EOS_RPC_PROTOCOL: https + NEXT_PUBLIC_EOS_RPC_HOST: jungle4.api.eosnation.io + NEXT_PUBLIC_EOS_RPC_PORT: 443 + NEXT_PUBLIC_EOS_READ_RPC_URLS: https://jungle4.api.eosnation.io + NEXT_PUBLIC_TABLE_ROWS_MAX_FETCH_PER_SEC: 20 + NEXT_PUBLIC_EDEN_CONTRACT_ACCOUNT: genesis.eden + NEXT_PUBLIC_AA_FETCH_AFTER: 35955488 + NEXT_PUBLIC_TOKEN_CONTRACT: eosio.token + NEXT_PUBLIC_TOKEN_SYMBOL: EOS + NEXT_PUBLIC_TOKEN_PRECISION: 4 + NEXT_PUBLIC_AA_BASE_URL: https://jungle-aa.edenia.cloud/atomicassets/v1 + NEXT_PUBLIC_AA_MARKET_URL: https://jungle-aa.edenia.cloud/atomicmarket/v1 + NEXT_PUBLIC_AA_HUB_URL: https://wax-test.atomichub.io + NEXT_PUBLIC_AA_CONTRACT: atomicassets + NEXT_PUBLIC_AA_MARKET_CONTRACT: atomicmarket + NEXT_PUBLIC_AA_COLLECTION_NAME: genesis.eden + NEXT_PUBLIC_AA_SCHEMA_NAME: members + NEXT_PUBLIC_BLOCKEXPLORER_ACCOUNT_BASE_URL: https://wax-test.bloks.io/account + NEXT_PUBLIC_BLOCKEXPLORER_TRANSACTION_BASE_URL: https://wax-test.bloks.io/transaction + NEXT_PUBLIC_APP_MINIMUM_DONATION_AMOUNT: 3.0000 EOS + NEXT_PUBLIC_ENABLED_WALLETS: ANCHOR,LEDGER,SOFTKEY + NEXT_PUBLIC_IPFS_BASE_URL: https://infura-ipfs.io/ipfs + NEXT_PUBLIC_DEV_USE_FIXTURE_DATA: false + DEV_NEXT_PUBLIC_ZOOM_CLIENT_ID: ${{ secrets.DEV_NEXT_PUBLIC_ZOOM_CLIENT_ID }} + NEXT_PUBLIC_FREEFORM_MEETING_LINKS_ENABLED: false + NEXT_PUBLIC_ELECTION_MEETING_DURATION_MS: 2400000 + DEV_NEXT_PUBLIC_ELECTION_COMMUNITY_ROOM_URL: ${{ secrets.DEV_NEXT_PUBLIC_ELECTION_COMMUNITY_ROOM_URL }} + NEXT_PUBLIC_SUBCHAIN_WASM_URL: https://eden-box.edenia.cloud/v1/subchain/eden-micro-chain.wasm + NEXT_PUBLIC_SUBCHAIN_STATE_URL: https://eden-box.edenia.cloud/v1/subchain/state + NEXT_PUBLIC_SUBCHAIN_WS_URL: wss://eden-box.edenia.cloud/v1/subchain/eden-microchain + NEXT_PUBLIC_SUBCHAIN_SLOW_MO: false + NEXT_PUBLIC_BOX_ADDRESS: https://eden-box.edenia.cloud + NEXT_PUBLIC_BOX_UPLOAD_IPFS: true + DEV_IPFS_PINATA_JWT_WEBAPP: ${{ secrets.DEV_IPFS_PINATA_JWT_WEBAPP }} + DEV_IPFS_PINATA_API: ${{ secrets.DEV_IPFS_PINATA_API }} + DEV_JOBS_AUTH_GC: ${{ secrets.DEV_JOBS_AUTH_GC }} + DEV_EOS_PRIVATE_KEY_GC_JOB: ${{ secrets.DEV_EOS_PRIVATE_KEY_GC_JOB }} + DEV_ZOOM_CLIENT_SECRET: ${{ secrets.DEV_ZOOM_CLIENT_SECRET }} + DEV_MEETINGS_SECRET_KEY: ${{ secrets.DEV_MEETINGS_SECRET_KEY }} + + - name: ๐Ÿ›  Build & Publish Image + # if: steps.filter.outputs.src == 'true' + uses: docker/build-push-action@v3 + with: + push: true + file: docker/eden-webapp.Dockerfile + tags: ${{ steps.prep.outputs.tags_webapp }} + context: . + + deploy-kubernetes-dev: + needs: [box-build, webapp-build] + runs-on: ubuntu-latest + steps: + + - name: โœ… Checkout code + uses: actions/checkout@v3 + + - name: Build kubernetes files + id: build_kubernetes_files + run: | + make \ + build-kubernetes + + env: + # general + ENVIRONMENT: dev + VERSION_DISTRIBUTE: ${{secrets.VERSION_DISTRIBUTE}} + VERSION_WATCHER: ${{secrets.VERSION_WATCHER}} + DEV_EOS_API_ENDPOINT: ${{secrets.DEV_EOS_API_ENDPOINT}} + DEV_EOS_API_CHAIN_ID: ${{secrets.DEV_EOS_API_CHAIN_ID}} + DEV_EOS_DISTRIBUTE_ACCOUNT: ${{secrets.DEV_EOS_DISTRIBUTE_ACCOUNT}} + DEV_EOS_DISTRIBUTE_PERMISSION: ${{secrets.DEV_EOS_DISTRIBUTE_PERMISSION}} + DEV_EOS_DISTRIBUTE_PRIVATE_KEY: ${{secrets.DEV_EOS_DISTRIBUTE_PRIVATE_KEY}} + DEV_EOS_DISTRIBUTE_MAX_STEPS: ${{secrets.DEV_EOS_DISTRIBUTE_MAX_STEPS}} + DEV_EOS_EDEN_ACCOUNT: ${{secrets.DEV_EOS_EDEN_ACCOUNT}} + DEV_EOS_PAYER_ACCOUNT: ${{secrets.DEV_EOS_PAYER_ACCOUNT}} + DEV_EOS_PAYER_PERMISION: ${{secrets.DEV_EOS_PAYER_PERMISION}} + DEV_EOS_PAYER_PRIVATE_KEY: ${{secrets.DEV_EOS_PAYER_PRIVATE_KEY}} + DEV_EOS_WATCH_ACCOUNT: ${{secrets.DEV_EOS_WATCH_ACCOUNT}} + DEV_EOS_POWERUP_THRESHOLD: ${{secrets.DEV_EOS_POWERUP_THRESHOLD}} + DEV_EOS_NET_FRAC: ${{secrets.DEV_EOS_NET_FRAC}} + DEV_EOS_CPU_FRAC: ${{secrets.DEV_EOS_CPU_FRAC}} + DEV_EOS_POWERUP_AMOUNT: ${{secrets.DEV_EOS_POWERUP_AMOUNT}} + + - name: Deploy kubernetes files + + uses: steebchen/kubectl@v1.1.0 + env: + KUBE_CONFIG_DATA: ${{ secrets.DEV_KUBE_CONFIG_DATA }} + ENVIRONMENT: dev + NAMESPACE: eden + VERSION_DISTRIBUTE: ${{secrets.VERSION_DISTRIBUTE}} + VERSION_WATCHER: ${{secrets.VERSION_WATCHER}} + DEV_EOS_API_ENDPOINT: ${{secrets.DEV_EOS_API_ENDPOINT}} + DEV_EOS_API_CHAIN_ID: ${{secrets.DEV_EOS_API_CHAIN_ID}} + DEV_EOS_DISTRIBUTE_ACCOUNT: ${{secrets.DEV_EOS_DISTRIBUTE_ACCOUNT}} + DEV_EOS_DISTRIBUTE_PERMISSION: ${{secrets.DEV_EOS_DISTRIBUTE_PERMISSION}} + DEV_EOS_DISTRIBUTE_PRIVATE_KEY: ${{secrets.DEV_EOS_DISTRIBUTE_PRIVATE_KEY}} + DEV_EOS_DISTRIBUTE_MAX_STEPS: ${{secrets.DEV_EOS_DISTRIBUTE_MAX_STEPS}} + DEV_EOS_EDEN_ACCOUNT: ${{secrets.DEV_EOS_EDEN_ACCOUNT}} + DEV_EOS_PAYER_ACCOUNT: ${{secrets.DEV_EOS_PAYER_ACCOUNT}} + DEV_EOS_PAYER_PERMISION: ${{secrets.DEV_EOS_PAYER_PERMISION}} + DEV_EOS_PAYER_PRIVATE_KEY: ${{secrets.DEV_EOS_PAYER_PRIVATE_KEY}} + DEV_EOS_WATCH_ACCOUNT: ${{secrets.DEV_EOS_WATCH_ACCOUNT}} + DEV_EOS_POWERUP_THRESHOLD: ${{secrets.DEV_EOS_POWERUP_THRESHOLD}} + DEV_EOS_NET_FRAC: ${{secrets.DEV_EOS_NET_FRAC}} + DEV_EOS_CPU_FRAC: ${{secrets.DEV_EOS_CPU_FRAC}} + DEV_EOS_POWERUP_AMOUNT: ${{secrets.DEV_EOS_POWERUP_AMOUNT}} + with: + args: version && make deploy-kubernetes diff --git a/.github/workflows/push-pdn-environment.yaml b/.github/workflows/push-pdn-environment.yaml new file mode 100644 index 000000000..e8acd1b4b --- /dev/null +++ b/.github/workflows/push-pdn-environment.yaml @@ -0,0 +1,606 @@ +name: Deploy production environment + +on: + push: + tags: + - v* + +jobs: + + # build-cpp: + # name: Build C++ + # runs-on: ubuntu-latest + # container: ghcr.io/eden/eden-builder:latest + # + # steps: + # - name: โœ… Checkout code + # uses: actions/checkout@v2 + # + # - uses: dorny/paths-filter@v2 + # id: filter + # with: + # filters: | + # src: + # - ".github/workflows/build.yml" + # + # - "CMakeLists.txt" + # - "contracts/**" + # - "external/CMakeLists.txt" + # - "libraries/**" + # - "native/**" + # - "programs/**" + # - "wasm/**" + # + # - name: Prepare ccache timestamp + # if: steps.filter.outputs.src == 'true' + # id: ccache_cache_timestamp + # shell: cmake -P {0} + # run: | + # string(TIMESTAMP current_date "%Y-%m-%d-%H-%M-%S" UTC) + # message("::set-output name=timestamp::${current_date}") + # + # - name: show_cache + # if: steps.filter.outputs.src == 'true' + # id: show_cache + # run: | + # echo "${{ runner.os }}-ccache_whole-${{ steps.ccache_cache_timestamp.outputs.timestamp }}" + # echo "${{ runner.os }}-product_cache-${{ steps.ccache_cache_timestamp.outputs.timestamp }}" + # + # - name: ccache cache files + # if: steps.filter.outputs.src == 'true' + # uses: actions/cache@v1.1.0 + # with: + # path: .ccache + # key: ${{ runner.os }}-ccache_whole-${{ steps.ccache_cache_timestamp.outputs.timestamp }} + # restore-keys: | + # ${{ runner.os }}-ccache_whole- + # + # - name: product cache files + # uses: actions/cache@v1.1.0 + # with: + # path: product_cache + # key: ${{ runner.os }}-product_cache-${{ steps.ccache_cache_timestamp.outputs.timestamp }} + # restore-keys: | + # ${{ runner.os }}-product_cache- + # + # - name: ๐Ÿ›  Build + # if: steps.filter.outputs.src == 'true' + # run: | + # set -e + # export CCACHE_DIR=${GITHUB_WORKSPACE}/.ccache + # export CCACHE_CONFIGPATH=${GITHUB_WORKSPACE}/.github/ccache.conf + # echo ===== + # pwd + # echo ${GITHUB_WORKSPACE} + # echo ===== + # ccache -s + # echo ===== + # + # git submodule update --init --recursive + # mkdir build + # cd build + # cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_C_COMPILER_LAUNCHER=ccache -DSKIP_TS=Yes -DEDEN_ATOMIC_ASSETS_ACCOUNT=atomicassets -DEDEN_ATOMIC_MARKET_ACCOUNT=atomicmarket -DEDEN_SCHEMA_NAME=members .. + # make -j$(nproc) + # + # tar czf clsdk-ubuntu-20-04.tar.gz clsdk + # rm -rf ../product_cache + # mkdir -p ../product_cache/clsdk/contracts + # cp clsdk-ubuntu-20-04.tar.gz ../product_cache + # cp atomicassets.abi ../product_cache + # cp atomicassets.wasm ../product_cache + # cp atomicmarket.abi ../product_cache + # cp atomicmarket.wasm ../product_cache + # cp clsdk/contracts/bios.wasm ../product_cache/clsdk/contracts/bios.wasm + # cp boot.wasm ../product_cache + # cp eden-micro-chain.wasm ../product_cache + # cp eden.abi ../product_cache + # cp eden.wasm ../product_cache + # cp run-elections.wasm ../product_cache + # cp run-genesis.wasm ../product_cache + # cp run-complete-elections.wasm ../product_cache + # cp token.abi ../product_cache + # cp token.wasm ../product_cache + # + # echo ===== + # ls -la ${GITHUB_WORKSPACE} + # echo ===== + # ccache -s + # echo ===== + # + # - name: ๐Ÿงช Run tests with CTest + # if: steps.filter.outputs.src == 'true' + # run: cd build && ctest -j$(nproc) -V + # + # - name: ๐Ÿ“ƒ Upload ccache.log + # if: steps.filter.outputs.src == 'true' + # uses: actions/upload-artifact@v2 + # with: + # name: ccache_log + # path: | + # ccache.log + # + # - name: ๐Ÿ“ƒ Upload clsdk + # uses: actions/upload-artifact@v2 + # with: + # name: clsdk + # path: | + # product_cache/clsdk-ubuntu-20-04.tar.gz + # + # - name: ๐Ÿ“ƒ Upload Eden Smart Contract + # uses: actions/upload-artifact@v2 + # with: + # name: Eden Smart Contract + # path: | + # product_cache/eden.abi + # product_cache/eden.wasm + # product_cache/eden-micro-chain.wasm + # + # - name: ๐Ÿ“ƒ Upload Ephemeral Eden Chains Runners + # uses: actions/upload-artifact@v2 + # with: + # name: Ephemeral Eden Chains Runners + # path: | + # product_cache/atomicassets.abi + # product_cache/atomicassets.wasm + # product_cache/atomicmarket.abi + # product_cache/atomicmarket.wasm + # product_cache/clsdk/contracts/bios.wasm + # product_cache/boot.wasm + # product_cache/eden.abi + # product_cache/eden.wasm + # product_cache/token.abi + # product_cache/token.wasm + # product_cache/run-genesis.wasm + # product_cache/run-elections.wasm + # product_cache/run-complete-elections.wasm + + build-micro-chain: + name: Build Micro Chain + runs-on: ubuntu-latest + container: ghcr.io/edenia/eden-builder:latest + + steps: + - name: โœ… Checkout code + uses: actions/checkout@v3 + + - name: Prepare ccache timestamp + id: ccache_cache_timestamp + shell: cmake -P {0} + run: | + string(TIMESTAMP current_date "%Y-%m-%d-%H-%M-%S" UTC) + message("name=timestamp>>${current_date}") + + - name: show_cache + id: show_cache + run: echo "${{ runner.os }}-ccache_microchain-${{ steps.ccache_cache_timestamp.outputs.timestamp }}" + + - name: ccache cache files + uses: actions/cache@v3 + with: + path: .ccache + key: ${{ runner.os }}-ccache_microchain-${{ steps.ccache_cache_timestamp.outputs.timestamp }} + restore-keys: | + ${{ runner.os }}-ccache_microchain- + + - name: ๐Ÿ›  Build + run: | + git config --global --add safe.directory "*" + set -e + export CCACHE_DIR=${GITHUB_WORKSPACE}/.ccache + export CCACHE_CONFIGPATH=${GITHUB_WORKSPACE}/.github/ccache.conf + echo ===== + pwd + echo ${GITHUB_WORKSPACE} + echo ===== + ccache -s + echo ===== + + + git submodule update --init external/atomicassets-contract + git submodule update --init external/Catch2 + git submodule update --init external/fmt + git submodule update --init external/rapidjson + mkdir build + cd build + cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_C_COMPILER_LAUNCHER=ccache -DSKIP_TS=Yes -DEDEN_ATOMIC_ASSETS_ACCOUNT=atomicassets -DEDEN_ATOMIC_MARKET_ACCOUNT=atomicmarket -DEDEN_SCHEMA_NAME=members -DBUILD_NATIVE=OFF .. + make -j$(nproc) wasm-configure + bash -c "cd wasm && make -j$(nproc) eden-micro-chain" + + echo ===== + ls -la ${GITHUB_WORKSPACE} + echo ===== + ccache -s + echo ===== + + - name: ๐Ÿ“ƒ Upload ccache.log + uses: actions/upload-artifact@v3 + with: + name: microchain_ccache_log + path: | + ccache.log + + - name: ๐Ÿ“ƒ Upload Eden Microchain + uses: actions/upload-artifact@v3 + with: + name: Eden Microchain + path: | + build/eden-micro-chain.wasm + + box-build: + needs: build-micro-chain + name: Build Eden Box + runs-on: ubuntu-latest + + steps: + - name: โœ… Checkout code + uses: actions/checkout@v3 + + - uses: dorny/paths-filter@v2 + id: filter + with: + filters: | + src: + - ".github/workflows/push-pdn-environment.yml" + + - ".eslintignore" + - ".eslintrc.js" + - ".prettierrc.json" + - "lerna.json" + - "package.json" + - "packages/common/**" + - "tsconfig.build.json" + - "tsconfig.json" + - "yarn.lock" + + - "docker/eden-box.Dockerfile" + - "packages/box/**" + + - name: Download Eden Microchain + # if: steps.filter.outputs.src == 'true' + uses: actions/download-artifact@v3 + with: + name: Eden Microchain + path: build + + - name: Image Preparation + # if: steps.filter.outputs.src == 'true' + id: prep + run: | + REGISTRY="ghcr.io" + IMAGE="${REGISTRY}/${{ github.repository_owner }}/eden-box-pdn" + TAGS="${IMAGE}:$(git rev-parse --short HEAD)" + echo "tags_box=${TAGS}" >> $GITHUB_OUTPUT + + - name: Showtag + # if: steps.filter.outputs.src == 'true' + id: showtag + run: echo ${{ steps.prep.outputs.tags_box }} + + - name: Docker Buildx setup + # if: steps.filter.outputs.src == 'true' + uses: docker/setup-buildx-action@v2 + + - name: Login in to registry + # if: steps.filter.outputs.src == 'true' + uses: docker/login-action@v2 + with: + registry: ghcr.io + username: ${{ github.repository_owner }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Build env files box + id: build-env-files-box + run: | + make \ + build-env-files-box + env: + ENVIRONMENT: pdn + PDN_SERVER_HOST: ${{ secrets.PDN_SERVER_HOST }} + PDN_SERVER_PORT: ${{ secrets.PDN_SERVER_PORT }} + PDN_EOS_CHAIN_ID: ${{ secrets.PDN_EOS_CHAIN_ID }} + EOS_RPC_PROTOCOL: https + EOS_RPC_HOST: eos.api.eosnation.io + EOS_RPC_PORT: 443 + TAPOS_MANAGER_INTERVAL_MINS: 30 + PDN_EDEN_CONTRACT_ACCOUNT: ${{ secrets.PDN_EDEN_CONTRACT_ACCOUNT }} + PDN_IPFS_PINATA_JWT_BOX: ${{ secrets.PDN_IPFS_PINATA_JWT_BOX }} + PDN_SUBCHAIN_EDEN_CONTRACT: ${{ secrets.PDN_SUBCHAIN_EDEN_CONTRACT }} + PDN_SUBCHAIN_TOKEN_CONTRACT: ${{ secrets.PDN_SUBCHAIN_TOKEN_CONTRACT }} + PDN_SUBCHAIN_AA_CONTRACT: ${{ secrets.PDN_SUBCHAIN_AA_CONTRACT }} + PDN_SUBCHAIN_AA_MARKET_CONTRACT: ${{ secrets.PDN_SUBCHAIN_AA_MARKET_CONTRACT }} + PDN_SUBCHAIN_WASM: ${{ secrets.PDN_SUBCHAIN_WASM }} + SUBCHAIN_STATE: state + PDN_DFUSE_API_KEY: ${{ secrets.PDN_DFUSE_API_KEY }} + PDN_DFUSE_API_NETWORK: ${{ secrets.PDN_DFUSE_API_NETWORK }} + PDN_DFUSE_AUTH_NETWORK: ${{ secrets.PDN_DFUSE_AUTH_NETWORK }} + DFUSE_FIRST_BLOCK: 183705819 + PDN_DFUSE_JSON_TRX_FILE: ${{ secrets.PDN_DFUSE_JSON_TRX_FILE }} + DFUSE_INTERVAL: 1 + PDN_DEBUG: ${{ secrets.PDN_DEBUG }} + PDN_SERVER_PAYS_PRIVATE_KEY: ${{ secrets.PDN_SERVER_PAYS_PRIVATE_KEY }} + PDN_SERVER_PAYS_ACCOUNT: ${{ secrets.PDN_SERVER_PAYS_ACCOUNT }} + PDN_SERVER_PAYS_PERMISSION: ${{ secrets.PDN_SERVER_PAYS_PERMISSION }} + PDN_SERVER_PAYS_NOOP_CONTRACT: ${{ secrets.PDN_SERVER_PAYS_NOOP_CONTRACT }} + PDN_SERVER_PAYS_NOOP_ACTION: ${{ secrets.PDN_SERVER_PAYS_NOOP_ACTION }} + PDN_SERVER_PAYS_CREATE_ABI: ${{ secrets._SERVER_PAYS_CREATE_ABI }} + SESSIONS_ENABLE: true + + - name: ๐Ÿ›  Build & Publish Image + # if: steps.filter.outputs.src == 'true' + uses: docker/build-push-action@v3 + with: + push: true + file: docker/eden-box.Dockerfile + tags: ${{ steps.prep.outputs.tags_box }} + context: . + +# e2e: +# needs: [build-cpp, build-micro-chain] +# name: E2E Tests +# environment: e2e_tests +# runs-on: ubuntu-latest +# +# steps: +# - name: โœ… Checkout code +# uses: actions/checkout@v2 +# +# - uses: dorny/paths-filter@v2 +# id: filter +# with: +# filters: | +# src: +# - ".github/workflows/build.yml" +# +# - ".eslintignore" +# - ".eslintrc.js" +# - ".prettierrc.json" +# - "lerna.json" +# - "package.json" +# - "packages/common/**" +# - "tsconfig.build.json" +# - "tsconfig.json" +# - "yarn.lock" +# - "scripts/eden_chain_runner.sh" +# +# - "packages/**" +# - "contracts/**" +# +# - name: Download Eden Microchain +# if: steps.filter.outputs.src == 'true' +# uses: actions/download-artifact@v2 +# with: +# name: Eden Microchain +# path: build +# +# - name: Download Ephemeral Eden Chain Runners +# if: steps.filter.outputs.src == 'true' +# uses: actions/download-artifact@v2 +# with: +# name: Ephemeral Eden Chains Runners +# path: build +# +# - name: Download clsdk +# if: steps.filter.outputs.src == 'true' +# uses: actions/download-artifact@v2 +# with: +# name: clsdk +# path: build +# +# - name: Start Genesis Ephemeral Chain +# if: steps.filter.outputs.src == 'true' +# run: | +# cp ./scripts/eden_chain_runner.sh ./build +# cd build +# tar -xvf clsdk-ubuntu-20-04.tar.gz clsdk/bin +# ls -la +# sh -x ./eden_chain_runner.sh run-genesis.wasm +# +# - name: ๐Ÿ›  Build and Start WebApp +# if: steps.filter.outputs.src == 'true' +# run: | +# export DFUSE_PREVENT_CONNECT=1 +# export NODE_ENV=test +# env +# yarn +# yarn build --stream --ignore @edenos/example-history-app +# yarn start-test --stream --ignore @edenos/example-history-app & +# env: +# IPFS_PINATA_JWT: ${{ secrets.IPFS_PINATA_JWT }} +# +# - name: ๐Ÿงช Run E2E +# if: steps.filter.outputs.src == 'true' +# run: | +# yarn test --stream +# +# - name: ๐ŸŽฅ Upload Cypress Results +# if: always() && steps.filter.outputs.src == 'true' +# uses: actions/upload-artifact@v2 +# with: +# name: Cypress E2E Videos and Screenshots +# path: | +# packages/webapp/cypress/screenshots +# packages/webapp/cypress/videos + + webapp-build: + needs: build-micro-chain + name: Build Eden Community WebApp + runs-on: ubuntu-latest + + steps: + - name: โœ… Checkout code + uses: actions/checkout@v3 + + - uses: dorny/paths-filter@v2 + id: filter + with: + filters: | + src: + - ".github/workflows/push-pdn-environment.yml" + + - ".eslintignore" + - ".eslintrc.js" + - ".prettierrc.json" + - "lerna.json" + - "package.json" + - "packages/common/**" + - "tsconfig.build.json" + - "tsconfig.json" + - "yarn.lock" + + - "docker/eden-webapp.Dockerfile" + - "packages/webapp/**" + + - name: Image Preparation + # if: steps.filter.outputs.src == 'true' + id: prep + run: | + REGISTRY="ghcr.io" + IMAGE="${REGISTRY}/${{ github.repository_owner }}/eden-webapp-pdn" + TAGS="${IMAGE}:$(git rev-parse --short HEAD)" + echo "tags_webapp=${TAGS}" >> $GITHUB_OUTPUT + + - name: Showtag + # if: steps.filter.outputs.src == 'true' + id: showtag + run: echo ${{ steps.prep.outputs.tags_webapp }} + + - name: Docker Buildx setup + # if: steps.filter.outputs.src == 'true' + uses: docker/setup-buildx-action@v2 + + - name: Login in to registry + # if: steps.filter.outputs.src == 'true' + uses: docker/login-action@v2 + with: + registry: ghcr.io + username: ${{ github.repository_owner }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Build env files webapp + id: build-env-files-webapp + run: | + make \ + build-env-files-webapp + env: + ENVIRONMENT: pdn + NEXT_PUBLIC_APP_NAME: Genesis Eden Community + NEXT_PUBLIC_APP_SHORT_NAME: eden-community-app + NEXT_PUBLIC_BASE_URL: https://genesis.eden.eoscommunity.org + PDN_NEXT_PUBLIC_EOS_CHAIN_ID: ${{ secrets.PDN_NEXT_PUBLIC_EOS_CHAIN_ID }} + NEXT_PUBLIC_EOS_RPC_PROTOCOL: https + NEXT_PUBLIC_EOS_RPC_HOST: eos.api.eosnation.io + NEXT_PUBLIC_EOS_RPC_PORT: 443 + NEXT_PUBLIC_EOS_READ_RPC_URLS: https://eos.api.eosnation.io,https://eos.greymass.com + NEXT_PUBLIC_TABLE_ROWS_MAX_FETCH_PER_SEC: 25 + NEXT_PUBLIC_EDEN_CONTRACT_ACCOUNT: genesis.eden + NEXT_PUBLIC_AA_FETCH_AFTER: 1619827201000 + NEXT_PUBLIC_TOKEN_CONTRACT: eosio.token + NEXT_PUBLIC_TOKEN_SYMBOL: EOS + NEXT_PUBLIC_TOKEN_PRECISION: 4 + NEXT_PUBLIC_AA_BASE_URL: https://eden-eos-aa.global.binfra.one/atomicassets/v1 + NEXT_PUBLIC_AA_MARKET_URL: https://eden-eos-aa.global.binfra.one/atomicmarket/v1 + NEXT_PUBLIC_AA_HUB_URL: https://eos.atomichub.io + NEXT_PUBLIC_AA_CONTRACT: atomicassets + NEXT_PUBLIC_AA_MARKET_CONTRACT: atomicmarket + NEXT_PUBLIC_AA_COLLECTION_NAME: genesis.eden + NEXT_PUBLIC_AA_SCHEMA_NAME: members + NEXT_PUBLIC_BLOCKEXPLORER_ACCOUNT_BASE_URL: https://bloks.io/account + NEXT_PUBLIC_BLOCKEXPLORER_TRANSACTION_BASE_URL: https://bloks.io/transaction + NEXT_PUBLIC_APP_MINIMUM_DONATION_AMOUNT: 3.0000 EOS + NEXT_PUBLIC_ENABLED_WALLETS: ANCHOR,LEDGER + NEXT_PUBLIC_IPFS_BASE_URL: https://eden-genesis.mypinata.cloud/ipfs + NEXT_PUBLIC_DEV_USE_FIXTURE_DATA: false + PDN_NEXT_PUBLIC_ZOOM_CLIENT_ID: ${{ secrets.PDN_NEXT_PUBLIC_ZOOM_CLIENT_ID }} + NEXT_PUBLIC_FREEFORM_MEETING_LINKS_ENABLED: false + NEXT_PUBLIC_ELECTION_MEETING_DURATION_MS: 2400000 + PDN_NEXT_PUBLIC_ELECTION_COMMUNITY_ROOM_URL: ${{ secrets.PDN_NEXT_PUBLIC_ELECTION_COMMUNITY_ROOM_URL }} + NEXT_PUBLIC_SUBCHAIN_WASM_URL: https://edenbox.eoscommunity.org/v1/subchain/eden-micro-chain.wasm + NEXT_PUBLIC_SUBCHAIN_STATE_URL: https://edenbox.eoscommunity.org/v1/subchain/state + NEXT_PUBLIC_SUBCHAIN_WS_URL: wss://edenbox.eoscommunity.org/v1/subchain/eden-microchain + NEXT_PUBLIC_SUBCHAIN_SLOW_MO: false + NEXT_PUBLIC_BOX_ADDRESS: https://edenbox.eoscommunity.org + IPFS_UPLOAD_ENDPOINT_URL: https://api.pinata.cloud/pinning/pinFileToIPFS + NEXT_PUBLIC_BOX_UPLOAD_IPFS: true + PDN_IPFS_PINATA_JWT_WEBAPP: ${{ secrets.PDN_IPFS_PINATA_JWT_WEBAPP }} + PDN_IPFS_PINATA_API: ${{ secrets.PDN_IPFS_PINATA_API }} + PDN_JOBS_AUTH_GC: ${{ secrets.PDN_JOBS_AUTH_GC }} + PDN_EOS_PRIVATE_KEY_GC_JOB: ${{ secrets.PDN_EOS_PRIVATE_KEY_GC_JOB }} + PDN_ZOOM_CLIENT_SECRET: ${{ secrets.PDN_ZOOM_CLIENT_SECRET }} + PDN_MEETINGS_SECRET_KEY: ${{ secrets.PDN_MEETINGS_SECRET_KEY }} + + - name: ๐Ÿ›  Build & Publish Image + # if: steps.filter.outputs.src == 'true' + uses: docker/build-push-action@v3 + with: + push: true + file: docker/eden-webapp.Dockerfile + tags: ${{ steps.prep.outputs.tags_webapp }} + context: . + + deploy-kubernetes-pdn: + needs: [box-build, webapp-build] + runs-on: ubuntu-latest + steps: + + - name: โœ… Checkout code + uses: actions/checkout@v3 + + - name: Build kubernetes files + id: build_kubernetes_files + run: | + make \ + build-kubernetes + + env: + # general + ENVIRONMENT: pdn + VERSION_DISTRIBUTE: ${{secrets.VERSION_DISTRIBUTE}} + VERSION_WATCHER: ${{secrets.VERSION_WATCHER}} + PDN_EOS_API_ENDPOINT: ${{secrets.PDN_EOS_API_ENDPOINT}} + PDN_EOS_API_CHAIN_ID: ${{secrets.PDN_EOS_API_CHAIN_ID}} + PDN_EOS_DISTRIBUTE_ACCOUNT: ${{secrets.PDN_EOS_DISTRIBUTE_ACCOUNT}} + PDN_EOS_DISTRIBUTE_PERMISSION: ${{secrets.PDN_EOS_DISTRIBUTE_PERMISSION}} + PDN_EOS_DISTRIBUTE_PRIVATE_KEY: ${{secrets.PDN_EOS_DISTRIBUTE_PRIVATE_KEY}} + PDN_EOS_DISTRIBUTE_MAX_STEPS: ${{secrets.PDN_EOS_DISTRIBUTE_MAX_STEPS}} + PDN_EOS_EDEN_ACCOUNT: ${{secrets.PDN_EOS_EDEN_ACCOUNT}} + PDN_EOS_PAYER_ACCOUNT: ${{secrets.PDN_EOS_PAYER_ACCOUNT}} + PDN_EOS_PAYER_PERMISION: ${{secrets.PDN_EOS_PAYER_PERMISION}} + PDN_EOS_PAYER_PRIVATE_KEY: ${{secrets.PDN_EOS_PAYER_PRIVATE_KEY}} + PDN_EOS_WATCH_ACCOUNT: ${{secrets.PDN_EOS_WATCH_ACCOUNT}} + PDN_EOS_POWERUP_THRESHOLD: ${{secrets.PDN_EOS_POWERUP_THRESHOLD}} + PDN_EOS_NET_FRAC: ${{secrets.PDN_EOS_NET_FRAC}} + PDN_EOS_CPU_FRAC: ${{secrets.PDN_EOS_CPU_FRAC}} + PDN_EOS_POWERUP_AMOUNT: ${{secrets.PDN_EOS_POWERUP_AMOUNT}} + + - name: Deploy kubernetes files + uses: steebchen/kubectl@v1.1.0 + env: + KUBE_CONFIG_DATA: ${{ secrets.PDN_KUBE_CONFIG_DATA }} + ENVIRONMENT: pdn + NAMESPACE: eden + VERSION_DISTRIBUTE: ${{secrets.VERSION_DISTRIBUTE}} + VERSION_WATCHER: ${{secrets.VERSION_WATCHER}} + PDN_EOS_API_ENDPOINT: ${{secrets.PDN_EOS_API_ENDPOINT}} + PDN_EOS_API_CHAIN_ID: ${{secrets.PDN_EOS_API_CHAIN_ID}} + PDN_EOS_DISTRIBUTE_ACCOUNT: ${{secrets.PDN_EOS_DISTRIBUTE_ACCOUNT}} + PDN_EOS_DISTRIBUTE_PERMISSION: ${{secrets.PDN_EOS_DISTRIBUTE_PERMISSION}} + PDN_EOS_DISTRIBUTE_PRIVATE_KEY: ${{secrets.PDN_EOS_DISTRIBUTE_PRIVATE_KEY}} + PDN_EOS_DISTRIBUTE_MAX_STEPS: ${{secrets.PDN_EOS_DISTRIBUTE_MAX_STEPS}} + PDN_EOS_EDEN_ACCOUNT: ${{secrets.PDN_EOS_EDEN_ACCOUNT}} + PDN_EOS_PAYER_ACCOUNT: ${{secrets.PDN_EOS_PAYER_ACCOUNT}} + PDN_EOS_PAYER_PERMISION: ${{secrets.PDN_EOS_PAYER_PERMISION}} + PDN_EOS_PAYER_PRIVATE_KEY: ${{secrets.PDN_EOS_PAYER_PRIVATE_KEY}} + PDN_EOS_WATCH_ACCOUNT: ${{secrets.PDN_EOS_WATCH_ACCOUNT}} + PDN_EOS_POWERUP_THRESHOLD: ${{secrets.PDN_EOS_POWERUP_THRESHOLD}} + PDN_EOS_NET_FRAC: ${{secrets.PDN_EOS_NET_FRAC}} + PDN_EOS_CPU_FRAC: ${{secrets.PDN_EOS_CPU_FRAC}} + PDN_EOS_POWERUP_AMOUNT: ${{secrets.PDN_EOS_POWERUP_AMOUNT}} + with: + args: version && make deploy-kubernetes + + - name: Create Release + id: create_release + uses: marvinpinto/action-automatic-releases@latest + with: + repo_token: ${{ secrets.GITHUB_TOKEN }} + prerelease: false diff --git a/CMakeLists.txt b/CMakeLists.txt index 9ba09da1e..8910dd2cf 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -25,6 +25,7 @@ if(DEFINED WASI_SDK_PREFIX) set(EDEN_ATOMIC_ASSETS_ACCOUNT atomicassets CACHE STRING "The account holding the atomicassets contract") set(EDEN_ATOMIC_MARKET_ACCOUNT atomicmarket CACHE STRING "The account holding the atomicmarket contract") set(EDEN_SCHEMA_NAME members CACHE STRING "The atomicassets schema to use for NFTS") + set(EDEN_SBT_ACCOUNT orgint.rep CACHE STRING "The account holding the sbt contract") set(EDEN_ENABLE_SET_TABLE_ROWS "no" CACHE BOOL "Enable the settablerows action") ExternalProject_Add(wasm @@ -45,6 +46,7 @@ if(DEFINED WASI_SDK_PREFIX) -DEDEN_ATOMIC_ASSETS_ACCOUNT:STRING=${EDEN_ATOMIC_ASSETS_ACCOUNT} -DEDEN_ATOMIC_MARKET_ACCOUNT:STRING=${EDEN_ATOMIC_MARKET_ACCOUNT} -DEDEN_SCHEMA_NAME:STRING=${EDEN_SCHEMA_NAME} + -DEDEN_SBT_ACCOUNT:STRING=${EDEN_SBT_ACCOUNT} -DEDEN_ENABLE_SET_TABLE_ROWS:BOOL=${EDEN_ENABLE_SET_TABLE_ROWS} -DCMAKE_SYSROOT=${WASI_SDK_PREFIX}/share/wasi-sysroot -DFORCE_COLORED_OUTPUT=${FORCE_COLORED_OUTPUT} @@ -78,4 +80,4 @@ if(NOT DEFINED SKIP_TS OR NOT SKIP_TS) DEPENDS yarn COMMAND yarn dev --stream ) -endif() +endif() \ No newline at end of file diff --git a/build.sh b/build.sh new file mode 100755 index 000000000..755973e1e --- /dev/null +++ b/build.sh @@ -0,0 +1,9 @@ +#!/bin/bash +set -e + +mkdir -p build +cd build +cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_C_COMPILER_LAUNCHER=ccache .. +make -j $(nproc) +ctest -j10 -V --rerun-failed --output-on-failure +cd .. \ No newline at end of file diff --git a/contracts/CMakeLists.txt b/contracts/CMakeLists.txt index 8736bcc9c..e4f279abc 100644 --- a/contracts/CMakeLists.txt +++ b/contracts/CMakeLists.txt @@ -1,6 +1,7 @@ add_subdirectory(eden) add_subdirectory(token) add_subdirectory(boot) +add_subdirectory(eden-badge) add_subdirectory(bios) add_subdirectory(bios2) add_subdirectory(bios3) diff --git a/contracts/eden-badge/CMakeLists.txt b/contracts/eden-badge/CMakeLists.txt new file mode 100644 index 000000000..c836a2a65 --- /dev/null +++ b/contracts/eden-badge/CMakeLists.txt @@ -0,0 +1,38 @@ +configure_file(include/badgechecker/_config.hpp.in ${CMAKE_BINARY_DIR}/generated/config_badge.hpp) +include_directories(${CMAKE_BINARY_DIR}/generated/) + +function(add_badgechecker suffix) + add_executable(badgechecker${suffix} src/badgechecker.cpp) + target_include_directories(badgechecker${suffix} PUBLIC include/badgechecker) + target_link_libraries(badgechecker${suffix} eosio-contract-simple-malloc${suffix}) + set_target_properties(badgechecker${suffix} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${ROOT_BINARY_DIR}) +endfunction() +add_badgechecker("") +add_badgechecker("-debug") + +function(clsdk_badgechecker suffix) + add_badgechecker("${suffix}-clsdk") + set_target_properties(badgechecker${suffix}-clsdk PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${ROOT_BINARY_DIR}/clsdk/contracts) + set_target_properties(badgechecker${suffix}-clsdk PROPERTIES OUTPUT_NAME badgechecker${suffix}) +endfunction() +clsdk_badgechecker("") +clsdk_badgechecker("-debug") + +add_executable(badgechecker-abigen src/badgechecker.cpp) +target_include_directories(badgechecker-abigen PUBLIC include/badgechecker) +target_link_libraries(badgechecker-abigen eosio-contract-abigen) +add_custom_command(TARGET badgechecker-abigen POST_BUILD + COMMAND mkdir -p ${ROOT_BINARY_DIR}/clsdk/contracts + COMMAND ${ROOT_BINARY_DIR}/cltester badgechecker-abigen.wasm >${ROOT_BINARY_DIR}/badgechecker.abi + COMMAND cp -a ${ROOT_BINARY_DIR}/badgechecker.abi ${ROOT_BINARY_DIR}/clsdk/contracts +) + +configure_file(include/badgechecker/badgechecker.hpp ${ROOT_BINARY_DIR}/clsdk/contracts/badgechecker/include/badgechecker/badgechecker.hpp COPYONLY) +# configure_file(include/badgechecker/badgechecker_ricardian.hpp ${ROOT_BINARY_DIR}/clsdk/contracts/badgechecker/include/badgechecker/badgechecker_ricardian.hpp COPYONLY) +configure_file(src/badgechecker.cpp ${ROOT_BINARY_DIR}/clsdk/contracts/badgechecker/src/badgechecker.cpp COPYONLY) + +add_executable(test-badgechecker tests/test-badgechecker.cpp) +target_include_directories(test-badgechecker PUBLIC include/badgechecker) +target_link_libraries(test-badgechecker catch2 cltestlib) +set_target_properties(test-badgechecker PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${ROOT_BINARY_DIR}) +eden_tester_test(test-badgechecker) diff --git a/contracts/eden-badge/README.md b/contracts/eden-badge/README.md new file mode 100644 index 000000000..ea2a625a7 --- /dev/null +++ b/contracts/eden-badge/README.md @@ -0,0 +1 @@ +Implementation of `badgechecker` to validate issuance of sbt diff --git a/contracts/eden-badge/include/badgechecker/_config.hpp.in b/contracts/eden-badge/include/badgechecker/_config.hpp.in new file mode 100644 index 000000000..c3a502818 --- /dev/null +++ b/contracts/eden-badge/include/badgechecker/_config.hpp.in @@ -0,0 +1,8 @@ +#pragma once + +#include + +namespace eden +{ + inline constexpr eosio::name sbt_account = "${EDEN_SBT_ACCOUNT}"_n; +} // namespace eden diff --git a/contracts/eden-badge/include/badgechecker/badgechecker.hpp b/contracts/eden-badge/include/badgechecker/badgechecker.hpp new file mode 100644 index 000000000..74efc38f9 --- /dev/null +++ b/contracts/eden-badge/include/badgechecker/badgechecker.hpp @@ -0,0 +1,60 @@ +#pragma once + +#include + +#include +#include +#include +#include + +namespace eden +{ + struct permission_v0 + { + eosio::name badge; + std::vector accounts; + + auto primary_key() const { return badge.value; } + }; + EOSIO_REFLECT(permission_v0, badge, accounts) + + using permission_variant = std::variant; + + struct permission + { + permission_variant value; + EDEN_FORWARD_MEMBERS(value, badge, accounts) + EDEN_FORWARD_FUNCTIONS(value, primary_key) + }; + EOSIO_REFLECT(permission, value) + + using permission_table_type = eosio::multi_index<"permission"_n, permission>; + + class contract : public eosio::contract + { + public: + using eosio::contract::contract; + + void check_authorization(eosio::name action, eosio::name badge, eosio::name authorizer); + void notify_initsimple(eosio::name org, + eosio::name creator, + eosio::name badge, + std::vector parent_badges, + std::string offchain_lookup_data, + std::string onchain_lookup_data, + std::vector consumers, + std::string memo); + void notify_givesimple(eosio::name org, + eosio::name badge, + eosio::name authorizer, + eosio::name to, + std::string memo); + void setauth(eosio::name action, eosio::name badge, std::vector accounts); + }; + + EOSIO_ACTIONS(contract, + "badgechecker"_n, + action(setauth, action, badge, accounts), + notify(sbt_account, initsimple), + notify(sbt_account, givesimple)) +} // namespace eden \ No newline at end of file diff --git a/contracts/eden-badge/include/badgechecker/constants.hpp b/contracts/eden-badge/include/badgechecker/constants.hpp new file mode 100644 index 000000000..4f3bd45fc --- /dev/null +++ b/contracts/eden-badge/include/badgechecker/constants.hpp @@ -0,0 +1,10 @@ +#pragma once + +#include + +namespace eden +{ + inline constexpr auto eden_account = "genesis.eden"_n; + inline const std::vector allowed_actions = {"givesimple"_n, "initsimple"_n}; + inline constexpr uint8_t max_accounts = 5; +} // namespace eden \ No newline at end of file diff --git a/contracts/eden-badge/include/badgechecker/utils.hpp b/contracts/eden-badge/include/badgechecker/utils.hpp new file mode 100644 index 000000000..281929223 --- /dev/null +++ b/contracts/eden-badge/include/badgechecker/utils.hpp @@ -0,0 +1,84 @@ +#pragma once + +#include +#include +#include + +namespace eden +{ + inline static uint128_t combine_names(const eosio::name a, const eosio::name b) + { + return uint128_t{a.value} << 64 | b.value; + } + +#define EDEN_FORWARD_FUNCTION(var, fun) \ + auto fun() const \ + { \ + return std::visit([](auto& value) { return value.fun(); }, var); \ + } +#define EDEN_FORWARD_FUNCTIONS(var, ...) \ + EOSIO_MAP_REUSE_ARG0(EDEN_FORWARD_FUNCTION, var, __VA_ARGS__) + +#define EDEN_FORWARD_MEMBER(var, member) \ + decltype(auto) member() \ + { \ + return std::visit([](auto& value) -> decltype(auto) { return (value.member); }, var); \ + } \ + decltype(auto) member() const \ + { \ + return std::visit([](auto& value) -> decltype(auto) { return (value.member); }, var); \ + } +#define EDEN_FORWARD_MEMBERS(var, ...) EOSIO_MAP_REUSE_ARG0(EDEN_FORWARD_MEMBER, var, __VA_ARGS__) + + template + void clear_secondary_index(Index idx) + { + using secondary_key_type = typename Index::secondary_key_type; + secondary_key_type secondary = + eosio::_multi_index_detail::secondary_key_traits::true_lowest(); + using traits = eosio::_multi_index_detail::secondary_index_db_functions; + uint64_t primary; + int itr = traits::db_idx_lowerbound(idx.get_code().value, idx.get_scope(), idx.name(), + secondary, primary); + while (itr >= 0) + { + auto tmp = itr; + uint64_t primary; + itr = traits::db_idx_next(itr, &primary); + traits::db_idx_remove(tmp); + } + } + + template + void clear_secondary(eosio::multi_index& tb) + { + (clear_secondary_index( + tb.template get_index(Indices::index_name)>()), + ...); + } + + template + void clear_primary(eosio::multi_index& tb) + { + auto itr = eosio::internal_use_do_not_use::db_lowerbound_i64( + tb.get_code().value, tb.get_scope(), static_cast(TableName), 0); + while (itr >= 0) + { + auto tmp = itr; + uint64_t primary; + itr = eosio::internal_use_do_not_use::db_next_i64(itr, &primary); + eosio::internal_use_do_not_use::db_remove_i64(tmp); + } + } + + // Warning: this leaves the multi_index with a bad cache. + // However, it will work even if the data in the table does not + // match the type of the multi_index. + template + void clear_table(T&& tb) + { + clear_secondary(tb); + clear_primary(tb); + } + +} // namespace eden diff --git a/contracts/eden-badge/src/badgechecker.cpp b/contracts/eden-badge/src/badgechecker.cpp new file mode 100644 index 000000000..217348ae5 --- /dev/null +++ b/contracts/eden-badge/src/badgechecker.cpp @@ -0,0 +1,80 @@ +#include + +namespace eden +{ + void contract::check_authorization(eosio::name action, eosio::name badge, eosio::name authorizer) + { + permission_table_type permission_tb(get_self(), action.value); + auto itr = permission_tb.find(badge.value); + + eosio::check(itr != permission_tb.end(), + "Badge is pending to be configured with permissions"); + + bool is_account_authorized = + std::any_of(itr->accounts().begin(), itr->accounts().end(), + [&](eosio::name temp_acc) { return temp_acc == authorizer; }); + + eosio::check(is_account_authorized, "Action denied: missing permission"); + } + + void contract::notify_initsimple(eosio::name org, + eosio::name creator, + eosio::name badge, + std::vector parent_badges, + std::string offchain_lookup_data, + std::string onchain_lookup_data, + std::vector consumers, + std::string memo) + { + if (!eosio::has_auth(org)) + { + check_authorization("initsimple"_n, badge, creator); + } + } + + void contract::notify_givesimple(eosio::name org, + eosio::name badge, + eosio::name authorizer, + eosio::name to, + std::string memo) + { + if (!eosio::has_auth(org)) + { + check_authorization("givesimple"_n, badge, authorizer); + } + } + + void contract::setauth(eosio::name action, eosio::name badge, std::vector accounts) + { + require_auth(eden_account); + + bool is_valid_action = std::any_of(allowed_actions.begin(), allowed_actions.end(), + [&](eosio::name temp_act) { return temp_act == action; }); + + eosio::check(is_valid_action, "Action " + action.to_string() + + " is not allowed by: " + eden_account.to_string()); + eosio::check(accounts.size() <= max_accounts, "An action can only have a maximum of " + + std::to_string(max_accounts) + " accounts"); + + permission_table_type permission_tb(get_self(), action.value); + auto itr = permission_tb.find(badge.value); + + if (itr == permission_tb.end()) + { + permission_tb.emplace(eden_account, + [&](auto& row) + { + row.badge() = badge; + row.accounts() = accounts; + }); + } + else + { + permission_tb.modify(itr, eosio::same_payer, + [&](auto& row) { row.accounts() = accounts; }); + } + } +} // namespace eden + +EOSIO_ACTION_DISPATCHER(eden::actions) +EOSIO_ABIGEN(actions(eden::actions), table("permission"_n, eden::permission_variant)) \ No newline at end of file diff --git a/contracts/eden-badge/tests/test-badgechecker.cpp b/contracts/eden-badge/tests/test-badgechecker.cpp new file mode 100644 index 000000000..e5afccca2 --- /dev/null +++ b/contracts/eden-badge/tests/test-badgechecker.cpp @@ -0,0 +1,103 @@ +#include +#include + +#define CATCH_CONFIG_MAIN +#include + +using namespace eosio; +using user_context = test_chain::user_context; + +void checker_setup(test_chain& t) +{ + t.create_code_account("badgechecker"_n); + t.set_code("badgechecker"_n, "badgechecker.wasm"); +} + +struct checker_tester +{ + test_chain chain; + user_context badgechecker = chain.as("badgechecker"_n); + user_context genesiseden = chain.as("genesis.eden"_n); + user_context alice = chain.as("alice"_n); + user_context bob = chain.as("bob"_n); + user_context pip = chain.as("pip"_n); + + checker_tester() + { + checker_setup(chain); + + chain.create_account("alice"_n); + chain.create_account("bob"_n); + chain.create_account("pip"_n); + chain.create_account("genesis.eden"_n); + } + + auto get_permission(eosio::name action) const + { + std::map> result; + eden::permission_table_type permission_tb{"badgechecker"_n, action.value}; + + for (auto t : permission_tb) + { + result.insert(std::pair(t.badge(), t.accounts())); + } + + return result; + }; +}; // checker_tester + +TEST_CASE("Create permission") +{ + checker_tester t; + + std::vector accounts = {"alice"_n, "bob"_n, "pip"_n}; + + expect(t.alice.trace("fakeaction"_n, "badge"_n, accounts), + "Missing required authority"); + + expect(t.genesiseden.trace("fakeaction"_n, "badge"_n, accounts), + "Action fakeaction is not allowed by: genesis.eden"); + + t.genesiseden.act("givesimple"_n, "badge"_n, accounts); + t.genesiseden.act("initsimple"_n, "badge"_n, accounts); + + std::map> expected_givesimple = {{"badge"_n, accounts}}; + std::map> expected_initsimple = {{"badge"_n, accounts}}; + + CHECK(t.get_permission("givesimple"_n) == expected_givesimple); + CHECK(t.get_permission("initsimple"_n) == expected_initsimple); + + accounts.erase(accounts.begin()); + expected_givesimple["badge"_n].erase(expected_givesimple["badge"_n].begin()); + + // remove one account for givesimple and check that initsimple does not get affected + t.genesiseden.act("givesimple"_n, "badge"_n, accounts); + + CHECK(t.get_permission("givesimple"_n) == expected_givesimple); + CHECK(t.get_permission("initsimple"_n) == expected_initsimple); + + expected_initsimple["badge"_n].erase(expected_initsimple["badge"_n].begin()); + + t.genesiseden.act("initsimple"_n, "badge"_n, accounts); + + CHECK(t.get_permission("givesimple"_n) == expected_givesimple); + CHECK(t.get_permission("initsimple"_n) == expected_initsimple); + + std::vector max_accounts = {"acc"_n, "acc2"_n, "acc3"_n, "acc4"_n, "acc5"_n}; + + t.genesiseden.act("initsimple"_n, "badge"_n, max_accounts); + + max_accounts.push_back("acc11"_n); + std::vector no_accounts; + + expect(t.genesiseden.trace("initsimple"_n, "badge"_n, max_accounts), + "An action can only have a maximum of 5 accounts"); + + t.genesiseden.act("initsimple"_n, "badge"_n, no_accounts); + + std::map> expected_initsimple_no_accounts = { + {"badge"_n, no_accounts}}; + + CHECK(t.get_permission("givesimple"_n) == expected_givesimple); + CHECK(t.get_permission("initsimple"_n) == expected_initsimple_no_accounts); +} diff --git a/contracts/eden/CMakeLists.txt b/contracts/eden/CMakeLists.txt index 7bea822e6..2fb1be306 100644 --- a/contracts/eden/CMakeLists.txt +++ b/contracts/eden/CMakeLists.txt @@ -3,34 +3,37 @@ include_directories(${CMAKE_BINARY_DIR}/generated/) set(extra-sources) set(EDEN_ENABLE_SET_TABLE_ROWS "no" CACHE BOOL "Enable the settablerows action") + if(EDEN_ENABLE_SET_TABLE_ROWS) - add_definitions(-DENABLE_SET_TABLE_ROWS) + add_definitions(-DENABLE_SET_TABLE_ROWS) endif() add_executable(eden - src/actions/accounts.cpp - src/actions/genesis.cpp - src/actions/induct.cpp - src/actions/elect.cpp - src/actions/notify_assets.cpp - src/actions/bylaws.cpp - src/actions/migrate.cpp - src/actions/encrypt.cpp - src/actions/tables.cpp - src/actions/sessions.cpp - src/eden.cpp - src/events.cpp - src/accounts.cpp - src/globals.cpp - src/inductions.cpp - src/members.cpp - src/auctions.cpp - src/migrations.cpp - src/atomicassets.cpp - src/elections.cpp - src/bylaws.cpp - src/distributions.cpp - src/encrypt.cpp + src/actions/accounts.cpp + src/actions/genesis.cpp + src/actions/induct.cpp + src/actions/elect.cpp + src/actions/notify_assets.cpp + src/actions/bylaws.cpp + src/actions/migrate.cpp + src/actions/encrypt.cpp + src/actions/tables.cpp + src/actions/sessions.cpp + src/actions/distributions.cpp + src/eden.cpp + src/events.cpp + src/accounts.cpp + src/globals.cpp + src/inductions.cpp + src/members.cpp + src/auctions.cpp + src/migrations.cpp + src/atomicassets.cpp + src/elections.cpp + src/bylaws.cpp + src/distributions.cpp + src/encrypt.cpp + src/badges.cpp ) target_include_directories(eden PUBLIC include ../token/include PRIVATE ../../external/atomicassets-contract/include) target_compile_options(eden PUBLIC -flto) @@ -92,5 +95,7 @@ function(add_eden_microchain suffix) ) add_dependencies(eden-micro-chain${suffix} eden) endfunction() + add_eden_microchain("") + # add_eden_microchain("-debug") diff --git a/contracts/eden/include/_config.hpp.in b/contracts/eden/include/_config.hpp.in index 677883874..22fae5a72 100644 --- a/contracts/eden/include/_config.hpp.in +++ b/contracts/eden/include/_config.hpp.in @@ -8,4 +8,5 @@ namespace eden inline constexpr eosio::name atomic_assets_account = "${EDEN_ATOMIC_ASSETS_ACCOUNT}"_n; inline constexpr eosio::name atomic_market_account = "${EDEN_ATOMIC_MARKET_ACCOUNT}"_n; inline constexpr eosio::name schema_name = "${EDEN_SCHEMA_NAME}"_n; + inline constexpr eosio::name sbt_account = "${EDEN_SBT_ACCOUNT}"_n; } // namespace eden diff --git a/contracts/eden/include/badges.hpp b/contracts/eden/include/badges.hpp new file mode 100644 index 000000000..2d32f0cd5 --- /dev/null +++ b/contracts/eden/include/badges.hpp @@ -0,0 +1,67 @@ +#pragma once + +#include +#include + +#include +#include +#include + +namespace eden +{ + + inline uint128_t round_account_key(eosio::name account, + eosio::time_point end_vote_time, + uint8_t round) + { + return (static_cast(account.value) << 64) | + (static_cast(end_vote_time.sec_since_epoch()) << 32) | round; + } + + struct badge_v0 + { + uint64_t id; + eosio::name account; + uint8_t round; + eosio::time_point vote_time; + eosio::time_point end_vote_time; + + uint64_t primary_key() const { return id; } + uint128_t by_round() const { return round_account_key(account, end_vote_time, round); } + uint64_t by_vote_time() const { return vote_time.sec_since_epoch(); } + }; + EOSIO_REFLECT(badge_v0, id, account, round, vote_time, end_vote_time) + using badge_variant = std::variant; + + struct badge + { + badge_variant value; + EDEN_FORWARD_MEMBERS(value, id, account, round, vote_time, end_vote_time) + EDEN_FORWARD_FUNCTIONS(value, primary_key, by_round, by_vote_time) + }; + EOSIO_REFLECT(badge, value) + using badge_table_type = eosio::multi_index< + "badge"_n, + badge, + eosio::indexed_by<"byround"_n, eosio::const_mem_fun>, + eosio::indexed_by<"byvotetime"_n, + eosio::const_mem_fun>>; + + class badges + { + private: + eosio::name contract; + badge_table_type badge_tb; + globals globals; + + public: + badges(eosio::name contract) + : contract(contract), badge_tb(contract, default_scope), globals(contract) + { + } + + void create_badge(eosio::name account); + uint32_t send_badges(uint32_t max_steps); + }; + +} // namespace eden \ No newline at end of file diff --git a/contracts/eden/include/distributions.hpp b/contracts/eden/include/distributions.hpp index bd2fee025..1dc4d3894 100644 --- a/contracts/eden/include/distributions.hpp +++ b/contracts/eden/include/distributions.hpp @@ -78,6 +78,7 @@ namespace eden eosio::block_timestamp init = {}); uint32_t distribute_monthly(eosio::name contract, uint32_t max_steps); void init_pools(eosio::name contract); + void set_distribution_pct(eosio::name contract, uint8_t pct); void process_election_distribution(eosio::name contract); struct distribution_account_v0 @@ -127,6 +128,7 @@ namespace eden uint32_t on_election_kick(eosio::name member, uint32_t max_steps); void on_resign(const member& member); void on_rename(eosio::name old_account, eosio::name new_account); + uint32_t on_collectfunds(uint32_t max_steps); void clear_all(); }; } // namespace eden diff --git a/contracts/eden/include/eden.hpp b/contracts/eden/include/eden.hpp index 832176ca9..aa187b6a1 100644 --- a/contracts/eden/include/eden.hpp +++ b/contracts/eden/include/eden.hpp @@ -15,6 +15,7 @@ #ifdef ENABLE_SET_TABLE_ROWS #include #include +#include #include #include #include @@ -106,6 +107,8 @@ namespace eden uint8_t election_day, const std::string& election_time); + void setmindonfee(eosio::asset new_minimum_donation); + void addtogenesis(eosio::name new_genesis_member, eosio::time_point expiration); void gensetexpire(uint64_t induction_id, eosio::time_point new_expiration); @@ -147,6 +150,8 @@ namespace eden void resign(eosio::name member); + void removemember(eosio::name account, const std::string& memo); + void rename(eosio::name member, eosio::name newaccount); void setencpubkey(eosio::name member, const eosio::public_key& key); @@ -179,6 +184,11 @@ namespace eden void electprocess(uint32_t max_steps); void distribute(uint32_t max_steps); + void givesbt(uint32_t max_steps); + + void setdistpct(uint8_t pct); + void collectfunds(uint32_t max_steps); + void setcoltime(uint8_t months); void fundtransfer(eosio::name from, eosio::block_timestamp distribution_time, @@ -250,6 +260,7 @@ namespace eden election_day, election_time, ricardian_contract(genesis_ricardian)), + action(setmindonfee, new_minimum_donation), action(addtogenesis, account, expiration), action(gensetexpire, id, new_expiration), action(clearall, ricardian_contract(clearall_ricardian)), @@ -286,10 +297,15 @@ namespace eden action(bylawsapprove, approver, bylaws_hash), action(bylawsratify, approver, bylaws_hash), action(distribute, max_steps), + action(givesbt, max_steps), + action(setdistpct, pct), + action(collectfunds, max_steps), + action(setcoltime, months), action(inductdonate, payer, id, quantity, ricardian_contract(inductdonate_ricardian)), eden_verb(inductcancel, 9, account, id, ricardian_contract(inductcancel_ricardian)), action(inducted, inductee, ricardian_contract(inducted_ricardian)), action(resign, account), + action(removemember, account, memo), action(rename, old_account, new_account), action(gc, limit, ricardian_contract(gc_ricardian)), action(migrate, limit), diff --git a/contracts/eden/include/elections.hpp b/contracts/eden/include/elections.hpp index c7c087ae4..1a4b488a3 100644 --- a/contracts/eden/include/elections.hpp +++ b/contracts/eden/include/elections.hpp @@ -232,7 +232,8 @@ namespace eden T* get_if_derived(current_election_state* state) { return std::visit( - [](auto& s) -> T* { + [](auto& s) -> T* + { if constexpr (std::is_base_of_v>) { return &s; @@ -263,7 +264,6 @@ namespace eden vote_table_type vote_tb; current_election_state_singleton state_sing; globals globals; - current_election_state_active check_active(); void set_state_sing(const current_election_state& new_value); void add_voter(election_rng& rng, uint8_t round, uint16_t& next_index, eosio::name member); @@ -280,6 +280,8 @@ namespace eden globals(contract) { } + current_election_state_active check_active(); + void set_board_permission(const std::vector& board); void link_board_permission(); std::optional get_next_election_time(); @@ -299,6 +301,7 @@ namespace eden boost::logic::tribool can_upload_video(uint8_t round, eosio::name voter); uint64_t get_group_id(eosio::name voter, uint8_t round); std::vector get_group_members(uint64_t group_id); + eosio::time_point get_round_time_point(); void clear_all(); }; diff --git a/contracts/eden/include/globals.hpp b/contracts/eden/include/globals.hpp index c71105bf6..0d2f22f30 100644 --- a/contracts/eden/include/globals.hpp +++ b/contracts/eden/include/globals.hpp @@ -14,7 +14,7 @@ namespace eden active }; - struct global_data_v1; + struct global_data_v2; struct global_data_v0 { @@ -23,7 +23,7 @@ namespace eden eosio::asset auction_starting_bid; uint32_t auction_duration; contract_stage_type stage; - global_data_v1 upgrade() const; + global_data_v2 upgrade() const; }; EOSIO_REFLECT(global_data_v0, community, @@ -36,11 +36,18 @@ namespace eden { uint32_t election_start_time = 0xffffffffu; // seconds from the start of Sunday uint32_t election_round_time_sec = 60 * 60; - auto upgrade() const { return *this; } + global_data_v2 upgrade() const; }; EOSIO_REFLECT(global_data_v1, base global_data_v0, election_start_time, election_round_time_sec); - using global_variant = std::variant; + struct global_data_v2 : global_data_v1 + { + uint8_t max_month_withdraw = 3; + global_data_v2 upgrade() const { return *this; } + }; + EOSIO_REFLECT(global_data_v2, base global_data_v1, max_month_withdraw); + + using global_variant = std::variant; using global_singleton = eosio::singleton<"global"_n, global_variant>; global_singleton& get_global_singleton(eosio::name contract); @@ -52,16 +59,18 @@ namespace eden { private: eosio::name contract; - global_data_v1 data; + global_data_v2 data; public: explicit globals(eosio::name contract); - explicit globals(eosio::name contract, const global_data_v1& initial_value); - const global_data_v1& get() { return data; } + explicit globals(eosio::name contract, const global_data_v2& initial_value); + const global_data_v2& get() { return data; } void check_active() const; eosio::symbol default_token() const { return data.minimum_donation.symbol; } void set_stage(contract_stage stage); void set_election_start_time(uint32_t time); void set_election_round_duration(uint32_t duration); + void set_minimum_donation_fee(eosio::asset new_minimum_donation); + void set_max_month_withdraw(uint8_t months); }; } // namespace eden diff --git a/contracts/eden/src/actions/distributions.cpp b/contracts/eden/src/actions/distributions.cpp new file mode 100644 index 000000000..27a4ecd0b --- /dev/null +++ b/contracts/eden/src/actions/distributions.cpp @@ -0,0 +1,31 @@ +#include +#include +#include +#include + +namespace eden +{ + void eden::setdistpct(uint8_t pct) + { + require_auth(get_self()); + eosio::check(pct >= 1 && pct <= 15, "Proposed distribution is out of the valid range"); + + set_distribution_pct(get_self(), pct); + } + + void eden::collectfunds(uint32_t max_steps) + { + eosio::check(distributions{get_self()}.on_collectfunds(max_steps) != max_steps, + "Nothing to do"); + } + + void eden::setcoltime(uint8_t months) + { + require_auth(get_self()); + + eosio::check(months >= 1 && months <= 3, + "Proposed collecting time is out of the valid range"); + globals{get_self()}.set_max_month_withdraw(months); + } + +} // namespace eden diff --git a/contracts/eden/src/actions/elect.cpp b/contracts/eden/src/actions/elect.cpp index 61dad28a4..053dc7059 100644 --- a/contracts/eden/src/actions/elect.cpp +++ b/contracts/eden/src/actions/elect.cpp @@ -1,4 +1,5 @@ #include +#include #include #include #include @@ -67,6 +68,8 @@ namespace eden current_session.value.require_auth(voter); elections elections(get_self()); elections.vote(round, voter, candidate); + // badges badges(get_self()); + // badges.create_badge(voter); } void eden::electvideo(const eosio::not_in_abi& current_session, @@ -96,4 +99,10 @@ namespace eden remaining = elections.finish_round(remaining); eosio::check(remaining != max_steps, "Nothing to do"); } + + void eden::givesbt(uint32_t max_steps) + { + badges badges(get_self()); + eosio::check(badges.send_badges(max_steps) != max_steps, "Nothing to do"); + } } // namespace eden diff --git a/contracts/eden/src/actions/genesis.cpp b/contracts/eden/src/actions/genesis.cpp index bd101d7cb..e966da899 100644 --- a/contracts/eden/src/actions/genesis.cpp +++ b/contracts/eden/src/actions/genesis.cpp @@ -117,11 +117,11 @@ namespace eden migrations{get_self()}.init(); globals{get_self(), - {{.community = community, - .minimum_donation = minimum_donation, - .auction_starting_bid = auction_starting_bid, - .auction_duration = auction_duration, - .stage = contract_stage::genesis}}}; + {{{.community = community, + .minimum_donation = minimum_donation, + .auction_starting_bid = auction_starting_bid, + .auction_duration = auction_duration, + .stage = contract_stage::genesis}}}}; members members{get_self()}; inductions inductions{get_self()}; @@ -161,4 +161,16 @@ namespace eden initial_market_fee, collection_attributes); } + void eden::setmindonfee(eosio::asset new_minimum_donation) + { + require_auth(get_self()); + + globals globals{get_self()}; + + eosio::check(globals.get().minimum_donation.symbol == new_minimum_donation.symbol, + "community symbol does not match minimum donation"); + + globals.set_minimum_donation_fee(new_minimum_donation); + } + } // namespace eden diff --git a/contracts/eden/src/actions/induct.cpp b/contracts/eden/src/actions/induct.cpp index 39dff64cd..e5d7482f4 100644 --- a/contracts/eden/src/actions/induct.cpp +++ b/contracts/eden/src/actions/induct.cpp @@ -10,6 +10,22 @@ namespace eden { + void on_resign(eosio::name contract, eosio::name account, bool check_active = true) + { + members members{contract}; + if (check_active) + { + members.check_active_member(account); + } + distributions dist{contract}; + dist.on_resign(members.get_member(account)); + elections elections{contract}; + elections.on_resign(account); + members.remove(account); + bylaws bylaws{contract}; + bylaws.on_resign(account); + } + void eden::inductinit(const eosio::not_in_abi& current_session, uint64_t id, eosio::name inviter, @@ -226,15 +242,13 @@ namespace eden void eden::resign(eosio::name account) { eosio::require_auth(account); - members members{get_self()}; - members.check_active_member(account); - distributions dist{get_self()}; - dist.on_resign(members.get_member(account)); - elections elections{get_self()}; - elections.on_resign(account); - members.remove(account); - bylaws bylaws{get_self()}; - bylaws.on_resign(account); + on_resign(get_self(), account); + } + + void eden::removemember(eosio::name account, const std::string& memo) + { + eosio::require_auth(get_self()); + on_resign(get_self(), account, false); } void eden::rename(eosio::name account, eosio::name new_account) diff --git a/contracts/eden/src/badges.cpp b/contracts/eden/src/badges.cpp new file mode 100644 index 000000000..63cdb38fa --- /dev/null +++ b/contracts/eden/src/badges.cpp @@ -0,0 +1,61 @@ +#include +#include + +namespace eden +{ + void badges::create_badge(eosio::name account) + { + const auto& state = elections(contract).check_active(); + auto vote_time = eosio::current_time_point(); + auto badge_idx = badge_tb.get_index<"byround"_n>(); + auto badge_iter = + badge_idx.find(round_account_key(account, state.round_end.to_time_point(), state.round)); + + if (badge_iter == badge_idx.end()) + { + badge_tb.emplace(contract, + [&](auto& row) + { + row.value = badge_v0{ + .id = badge_tb.available_primary_key(), + .account = account, + .round = state.round, + .vote_time = vote_time, + .end_vote_time = state.round_end.to_time_point(), + }; + }); + } + else + { + badge_idx.modify(badge_iter, eosio::same_payer, + [&](auto& row) { row.vote_time() = vote_time; }); + } + } + + uint32_t badges::send_badges(uint32_t max_steps) + { + auto max_round_duration_sec = globals.get().election_round_time_sec; + auto badge_idx = badge_tb.get_index<"byvotetime"_n>(); + auto round_time_point = elections(contract).get_round_time_point(); + uint64_t max_round_time = round_time_point > eosio::time_point() + ? round_time_point.sec_since_epoch() - max_round_duration_sec + : eosio::current_time_point().sec_since_epoch(); + + for (auto it = badge_idx.lower_bound(eosio::time_point().sec_since_epoch()), + end_it = badge_idx.lower_bound(max_round_time); + it != end_it && max_steps > 0; --max_steps) + { + eosio::action{{contract, "active"_n}, + sbt_account, + "givesimple"_n, + std::tuple(contract, "epvi"_n, contract, it->account(), + std::string("round " + std::to_string(it->round()) + ", " + + std::to_string(it->vote_time().sec_since_epoch())))} + .send(); + + it = badge_idx.erase(it); + } + + return max_steps; + } +} // namespace eden \ No newline at end of file diff --git a/contracts/eden/src/bylaws.cpp b/contracts/eden/src/bylaws.cpp index ba0010297..2807ecab2 100644 --- a/contracts/eden/src/bylaws.cpp +++ b/contracts/eden/src/bylaws.cpp @@ -53,9 +53,9 @@ namespace eden if (next_state == ratified) { eosio::check( - pos->time().to_time_point() + eosio::days(90) <= + pos->time().to_time_point() + eosio::days(14) <= state.last_election_time.to_time_point(), - "Bylaws can only be approved if they were proposed at least 90 days before the last " + "Bylaws can only be approved if they were proposed at least 14 days before the last " "election."); } if (pos->approvals().size() >= state.board.size() * 2 / 3) diff --git a/contracts/eden/src/distributions.cpp b/contracts/eden/src/distributions.cpp index 788510bc4..0a768ce4b 100644 --- a/contracts/eden/src/distributions.cpp +++ b/contracts/eden/src/distributions.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #include #include @@ -19,6 +20,22 @@ namespace eden pool_tb.emplace(contract, [](auto& row) { row.value = pool_v0{"master"_n, 5}; }); } + void set_distribution_pct(eosio::name contract, uint8_t pct) + { + pool_table_type pool_tb{contract, default_scope}; + auto pool_iter = pool_tb.find("master"_n.value); + + eosio::check(pool_iter != pool_tb.end(), "Distribution pool does not exist"); + + push_event( + set_pool_event{ + .pool = "master"_n, + .monthly_distribution_pct = pct, + }, + contract); + pool_tb.modify(pool_iter, contract, [&](auto& row) { row.value = pool_v0{"master"_n, pct}; }); + } + static current_distribution make_distribution(eosio::name contract, eosio::block_timestamp start_time, eosio::asset& amount) @@ -26,22 +43,30 @@ namespace eden members members{contract}; current_distribution result{start_time, eosio::name()}; auto ranks = members.stats().ranks; - auto per_rank = amount / (ranks.size() - 1); + // Exclude paid HCD rank if election ended and took more than 1 round + uint16_t rank_factor = ranks.size() >= 3 && ranks.back() == 1 ? 1 : 0; + auto per_rank = amount / (ranks.size() - 1 - rank_factor); eosio::asset used{0, amount.symbol}; uint16_t total = 0; for (auto iter = ranks.end() - 1, end = ranks.begin(); iter != end; --iter) { total += *iter; - if (total > 0) + if (total > rank_factor) { auto this_rank = per_rank / total; used += this_rank * total; result.rank_distribution.push_back(this_rank); } + else + { + // Pay 0 to HCD rank + result.rank_distribution.push_back(used); + } } std::reverse(result.rank_distribution.begin(), result.rank_distribution.end()); if (ranks.back() != 0) { + // HCD rank may receive a fractional difference amount result.rank_distribution.back() += (amount - used); } else @@ -247,30 +272,34 @@ namespace eden for (uint8_t rank = 0; rank < iter->election_rank(); ++rank) { auto amount = dist.rank_distribution[rank]; - dist_accounts_tb.emplace(contract, [&](auto& row) { - auto fund = distribution_account_v0{.id = dist_accounts_tb.available_primary_key(), - .owner = iter->account(), - .distribution_time = dist.distribution_time, - .rank = static_cast(rank + 1), - .balance = amount}; - push_event( - distribution_event_fund{ - .owner = fund.owner, - .distribution_time = fund.distribution_time, - .rank = fund.rank, - .balance = fund.balance, - }, - contract); - row.value = fund; - }); - if (dist_iter != dist_idx.end()) + // Exclude HCD rank which its value is 0 unless HCD rank receive the fractional difference + if (amount.amount > 0) { - dist_accounts_tb.modify(*dist_iter, contract, - [&](auto& row) { row.balance() -= amount; }); - } - else - { - eosio::check(amount.amount == 0, "Overdrawn balance"); + dist_accounts_tb.emplace(contract, [&](auto& row) { + auto fund = distribution_account_v0{.id = dist_accounts_tb.available_primary_key(), + .owner = iter->account(), + .distribution_time = dist.distribution_time, + .rank = static_cast(rank + 1), + .balance = amount}; + push_event( + distribution_event_fund{ + .owner = fund.owner, + .distribution_time = fund.distribution_time, + .rank = fund.rank, + .balance = fund.balance, + }, + contract); + row.value = fund; + }); + if (dist_iter != dist_idx.end()) + { + dist_accounts_tb.modify(*dist_iter, contract, + [&](auto& row) { row.balance() -= amount; }); + } + else + { + eosio::check(amount.amount == 0, "Overdrawn balance"); + } } } dist.last_processed = iter->account(); @@ -473,6 +502,43 @@ namespace eden } } + uint32_t distributions::on_collectfunds(uint32_t max_steps) + { + uint32_t copy_max_steps = max_steps; + bool has_returned = false; + auto months_to_withdraw = globals{contract}.get().max_month_withdraw; + + accounts owned_accounts{contract, "owned"_n}; + setup_distribution(contract, owned_accounts); + for (auto iter = distribution_account_tb.begin(), end = distribution_account_tb.end(); + max_steps > 0 && iter != end; --max_steps) + { + if (iter->distribution_time() < + eosio::current_time_point() - eosio::days(30 * months_to_withdraw)) + { + push_event( + distribution_event_return{ + .owner = iter->owner(), + .distribution_time = iter->distribution_time(), + .rank = iter->rank(), + .amount = iter->balance(), + .pool = "master"_n, + }, + contract); + owned_accounts.add_balance("master"_n, iter->balance(), false); + iter = distribution_account_tb.erase(iter); + + has_returned = true; + } + else + { + ++iter; + } + } + + return has_returned ? max_steps : copy_max_steps; + } + void distributions::clear_all() { clear_table(distribution_account_tb); diff --git a/contracts/eden/src/eden-micro-chain.cpp b/contracts/eden/src/eden-micro-chain.cpp index 874dd7980..33d36dae1 100644 --- a/contracts/eden/src/eden-micro-chain.cpp +++ b/contracts/eden/src/eden-micro-chain.cpp @@ -1241,14 +1241,16 @@ DistributionFundConnection Member::distributionFunds(std::optional(db.balances, account, [&](bool is_new, auto& a) { - if (is_new) - { - a.account = account; - a.amount = delta; - } - else - a.amount += delta; - result = a.amount; - }); + add_or_modify(db.balances, account, + [&](bool is_new, auto& a) + { + if (is_new) + { + a.account = account; + a.amount = delta; + } + else + a.amount += delta; + result = a.amount; + }); return result; } @@ -1390,22 +1394,26 @@ void transfer_funds(eosio::block_timestamp time, { auto new_from = add_balance(from, -amount); auto new_to = add_balance(to, amount); - db.balance_history.emplace([&](auto& h) { - h.time = time; - h.account = from; - h.delta = -amount; - h.new_amount = new_from; - h.other_account = to; - h.description = description; - }); - db.balance_history.emplace([&](auto& h) { - h.time = time; - h.account = to; - h.delta = amount; - h.new_amount = new_to; - h.other_account = from; - h.description = description; - }); + db.balance_history.emplace( + [&](auto& h) + { + h.time = time; + h.account = from; + h.delta = -amount; + h.new_amount = new_from; + h.other_account = to; + h.description = description; + }); + db.balance_history.emplace( + [&](auto& h) + { + h.time = time; + h.account = to; + h.delta = amount; + h.new_amount = new_to; + h.other_account = from; + h.description = description; + }); } void notify_transfer(const action_context& context, @@ -1499,19 +1507,21 @@ void genesis(std::string community, { auto& idx = db.status.get(); eosio::check(idx.empty(), "duplicate genesis action"); - db.status.emplace([&](auto& obj) { - obj.status.community = std::move(community); - obj.status.communitySymbol = std::move(community_symbol); - obj.status.minimumDonation = std::move(minimum_donation); - obj.status.initialMembers = std::move(initial_members); - obj.status.genesisVideo = std::move(genesis_video); - obj.status.collectionAttributes = std::move(collection_attributes); - obj.status.auctionStartingBid = std::move(auction_starting_bid); - obj.status.auctionDuration = std::move(auction_duration); - obj.status.memo = std::move(memo); - for (auto& member : obj.status.initialMembers) - add_genesis_member(obj.status, member); - }); + db.status.emplace( + [&](auto& obj) + { + obj.status.community = std::move(community); + obj.status.communitySymbol = std::move(community_symbol); + obj.status.minimumDonation = std::move(minimum_donation); + obj.status.initialMembers = std::move(initial_members); + obj.status.genesisVideo = std::move(genesis_video); + obj.status.collectionAttributes = std::move(collection_attributes); + obj.status.auctionStartingBid = std::move(auction_starting_bid); + obj.status.auctionDuration = std::move(auction_duration); + obj.status.memo = std::move(memo); + for (auto& member : obj.status.initialMembers) + add_genesis_member(obj.status, member); + }); } void addtogenesis(eosio::name new_genesis_member) @@ -1520,9 +1530,10 @@ void addtogenesis(eosio::name new_genesis_member) db.status.modify(get_status(), [&](auto& obj) { obj.status.initialMembers.push_back(new_genesis_member); }); for (auto& obj : db.inductions) - db.inductions.modify(obj, [&](auto& obj) { - obj.induction.witnesses.push_back({new_genesis_member, false}); - }); + db.inductions.modify(obj, + [&](auto& obj) { + obj.induction.witnesses.push_back({new_genesis_member, false}); + }); add_genesis_member(status.status, new_genesis_member); } @@ -1543,27 +1554,32 @@ void inductinit(const action_context& context, witnesses.push_back(InductionEndorser{witness, false}); } - add_or_replace(db.inductions, id, [&](auto& obj) { - obj.induction.id = id; - obj.induction.inviter = {inviter, false}; - obj.induction.invitee = invitee; - obj.induction.witnesses = witnesses; - obj.induction.createdAt = eosio::block_timestamp(context.block.timestamp); - }); + add_or_replace(db.inductions, id, + [&](auto& obj) + { + obj.induction.id = id; + obj.induction.inviter = {inviter, false}; + obj.induction.invitee = invitee; + obj.induction.witnesses = witnesses; + obj.induction.createdAt = + eosio::block_timestamp(context.block.timestamp); + }); } void inductprofil(uint64_t id, eden::new_member_profile profile) { - modify(db.inductions, id, [&](auto& obj) { - obj.induction.profile = profile; + modify(db.inductions, id, + [&](auto& obj) + { + obj.induction.profile = profile; - // reset endorsements - obj.induction.inviter.second = false; - for (auto& witness : obj.induction.witnesses) - { - witness.second = false; - } - }); + // reset endorsements + obj.induction.inviter.second = false; + for (auto& witness : obj.induction.witnesses) + { + witness.second = false; + } + }); } void inductmeetin(eosio::name account, @@ -1576,16 +1592,18 @@ void inductmeetin(eosio::name account, void inductvideo(eosio::name account, uint64_t id, std::string video) { - modify(db.inductions, id, [&](auto& obj) { - obj.induction.video = video; + modify(db.inductions, id, + [&](auto& obj) + { + obj.induction.video = video; - // reset endorsements - obj.induction.inviter.second = false; - for (auto& witness : obj.induction.witnesses) - { - witness.second = false; - } - }); + // reset endorsements + obj.induction.inviter.second = false; + for (auto& witness : obj.induction.witnesses) + { + witness.second = false; + } + }); } void inductcancel(eosio::name account, uint64_t id) @@ -1600,23 +1618,25 @@ void inductdonate(const action_context& context, { auto& induction = get(db.inductions, id); - auto& member = db.members.emplace([&](auto& obj) { - obj.member.account = induction.induction.invitee; - obj.member.inviter = induction.induction.inviter.first; - - std::vector inductionWitnesses; - for (const auto& witness : induction.induction.witnesses) - { - inductionWitnesses.push_back(witness.first); - } - obj.member.inductionWitnesses = std::move(inductionWitnesses); - - obj.member.profile = induction.induction.profile; - obj.member.inductionVideo = induction.induction.video; - obj.member.createdAt = eosio::block_timestamp(context.block.timestamp); - if (obj.member.inductionVideo.empty()) - obj.member.inductionVideo = get_status().status.genesisVideo; - }); + auto& member = db.members.emplace( + [&](auto& obj) + { + obj.member.account = induction.induction.invitee; + obj.member.inviter = induction.induction.inviter.first; + + std::vector inductionWitnesses; + for (const auto& witness : induction.induction.witnesses) + { + inductionWitnesses.push_back(witness.first); + } + obj.member.inductionWitnesses = std::move(inductionWitnesses); + + obj.member.profile = induction.induction.profile; + obj.member.inductionVideo = induction.induction.video; + obj.member.createdAt = eosio::block_timestamp(context.block.timestamp); + if (obj.member.inductionVideo.empty()) + obj.member.inductionVideo = get_status().status.genesisVideo; + }); transfer_funds(context.block.timestamp, payer, master_pool, quantity, history_desc::inductdonate); @@ -1638,23 +1658,25 @@ void inductendors(const action_context& context, eosio::checksum256 induction_data_hash) { auto& induction = get(db.inductions, id); - modify(db.inductions, id, [&](auto& obj) { - if (account == obj.induction.inviter.first) - { - obj.induction.inviter.second = true; - } - else - { - for (auto& witness : obj.induction.witnesses) - { - if (witness.first == account) - { - witness.second = true; - break; - } - } - } - }); + modify(db.inductions, id, + [&](auto& obj) + { + if (account == obj.induction.inviter.first) + { + obj.induction.inviter.second = true; + } + else + { + for (auto& witness : obj.induction.witnesses) + { + if (witness.first == account) + { + witness.second = true; + break; + } + } + } + }); } void resign(eosio::name account) @@ -1662,15 +1684,20 @@ void resign(eosio::name account) remove_if_exists(db.members, account); } +void removemember(eosio::name account, const std::string& memo) +{ + remove_if_exists(db.members, account); +} + void rename(eosio::name old_account, eosio::name new_account) { - auto update = [&](auto& acc) { + auto update = [&](auto& acc) + { if (acc == old_account) acc = new_account; }; - auto update_vec = [&](auto& vec) { - std::replace(vec.begin(), vec.end(), old_account, new_account); - }; + auto update_vec = [&](auto& vec) + { std::replace(vec.begin(), vec.end(), old_account, new_account); }; db.status.modify(get_status(), [&](auto& status) { update_vec(status.status.initialMembers); }); @@ -1678,40 +1705,50 @@ void rename(eosio::name old_account, eosio::name new_account) db.balances.modify(*obj, [&](auto& obj) { obj.account = new_account; }); for (auto& obj : db.balance_history) - db.balance_history.modify(obj, [&](auto& obj) { - update(obj.account); - update(obj.other_account); - }); + db.balance_history.modify(obj, + [&](auto& obj) + { + update(obj.account); + update(obj.other_account); + }); if (auto* obj = get_ptr(db.encryption_keys, old_account)) db.encryption_keys.modify(*obj, [&](auto& obj) { obj.account = new_account; }); for (auto& obj : db.inductions) - db.inductions.modify(obj, [&](auto& obj) { - update(obj.induction.inviter.first); - for (auto& w : obj.induction.witnesses) - update(w.first); - }); + db.inductions.modify(obj, + [&](auto& obj) + { + update(obj.induction.inviter.first); + for (auto& w : obj.induction.witnesses) + update(w.first); + }); for (auto& obj : db.members) - db.members.modify(obj, [&](auto& obj) { - update(obj.member.account); - update(obj.member.inviter); - update_vec(obj.member.inductionWitnesses); - }); + db.members.modify(obj, + [&](auto& obj) + { + update(obj.member.account); + update(obj.member.inviter); + update_vec(obj.member.inductionWitnesses); + }); for (auto& obj : db.election_groups) - db.election_groups.modify(obj, [&](auto& obj) { - // first_member is kept as is since it's only used by events - // which have already occurred, and it isn't exposed to the UI - update(obj.winner); - }); + db.election_groups.modify(obj, + [&](auto& obj) + { + // first_member is kept as is since it's only used by events + // which have already occurred, and it isn't exposed to the UI + update(obj.winner); + }); for (auto& obj : db.votes) - db.votes.modify(obj, [&](auto& obj) { - update(obj.voter); - update(obj.candidate); - }); + db.votes.modify(obj, + [&](auto& obj) + { + update(obj.voter); + update(obj.candidate); + }); { auto& idx = db.distribution_funds.get(); @@ -1762,9 +1799,8 @@ void clear_participating() void electopt(eosio::name voter, bool participating) { modify(db.members, voter, [&](auto& obj) { obj.member.participating = participating; }); - db.status.modify(get_status(), [&](auto& status) { - status.status.numElectionParticipants += participating ? 1 : -1; - }); + db.status.modify(get_status(), [&](auto& status) + { status.status.numElectionParticipants += participating ? 1 : -1; }); } void electvote(uint8_t round, eosio::name voter, eosio::name candidate) @@ -1797,10 +1833,12 @@ void electvideo(uint8_t round, eosio::name voter, const std::string& video) void setencpubkey(eosio::name member, eosio::public_key key) { - add_or_modify(db.encryption_keys, member, [&](bool is_new, auto& row) { - row.account = member; - row.encryptionKey = key; - }); + add_or_modify(db.encryption_keys, member, + [&](bool is_new, auto& row) + { + row.account = member; + row.encryptionKey = key; + }); } void logmint(const action_context& context, @@ -1834,14 +1872,16 @@ void logmint(const action_context& context, template_mint++; } - db.nfts.emplace([&](auto& nft) { - nft.member = member_account; - nft.owner = new_asset_owner; - nft.templateId = template_id; - nft.assetId = asset_id; - nft.templateMint = template_mint; - nft.createdAt = eosio::block_timestamp(context.block.timestamp); - }); + db.nfts.emplace( + [&](auto& nft) + { + nft.member = member_account; + nft.owner = new_asset_owner; + nft.templateId = template_id; + nft.assetId = asset_id; + nft.templateMint = template_mint; + nft.createdAt = eosio::block_timestamp(context.block.timestamp); + }); } void logtransfer(const action_context& context, @@ -1876,10 +1916,12 @@ void handle_event(const eden::migration_event& event) void handle_event(const eden::election_event_schedule& event) { - db.status.modify(get_status(), [&](auto& status) { - status.status.nextElection = event.election_time; - status.status.electionThreshold = event.election_threshold; - }); + db.status.modify(get_status(), + [&](auto& status) + { + status.status.nextElection = event.election_time; + status.status.electionThreshold = event.election_threshold; + }); for (auto& member : db.members) { db.members.modify(member, [&](auto& member) { member.member.participating = false; }); @@ -1893,65 +1935,78 @@ void handle_event(const eden::election_event_begin& event) void handle_event(const eden::election_event_seeding& event) { - modify(db.elections, event.election_time, [&](auto& election) { - election.seeding = true; - election.seeding_start_time = event.start_time; - election.seeding_end_time = event.end_time; - election.seed = event.seed; - }); + modify(db.elections, event.election_time, + [&](auto& election) + { + election.seeding = true; + election.seeding_start_time = event.start_time; + election.seeding_end_time = event.end_time; + election.seed = event.seed; + }); } void handle_event(const eden::election_event_end_seeding& event) { - modify(db.elections, event.election_time, [&](auto& election) { - election.seeding = false; - election.seeding_start_time = std::nullopt; - election.seeding_end_time = std::nullopt; - }); + modify(db.elections, event.election_time, + [&](auto& election) + { + election.seeding = false; + election.seeding_start_time = std::nullopt; + election.seeding_end_time = std::nullopt; + }); } void handle_event(const eden::election_event_config_summary& event) { - modify(db.elections, event.election_time, [&](auto& election) { - election.num_rounds = event.num_rounds; - election.num_participants = event.num_participants; - }); + modify(db.elections, event.election_time, + [&](auto& election) + { + election.num_rounds = event.num_rounds; + election.num_participants = event.num_participants; + }); } void handle_event(const eden::election_event_create_round& event) { - db.election_rounds.emplace([&](auto& round) { - round.election_time = event.election_time; - round.round = event.round; - round.num_participants = event.num_participants; - round.num_groups = event.num_groups; - round.requires_voting = event.requires_voting; - }); + db.election_rounds.emplace( + [&](auto& round) + { + round.election_time = event.election_time; + round.round = event.round; + round.num_participants = event.num_participants; + round.num_groups = event.num_groups; + round.requires_voting = event.requires_voting; + }); } void handle_event(const eden::election_event_create_group& event) { eosio::check(!event.voters.empty(), "group has no voters"); - auto& group = db.election_groups.emplace([&](auto& group) { - group.election_time = event.election_time; - group.round = event.round; - group.first_member = *std::min_element(event.voters.begin(), event.voters.end()); - }); + auto& group = db.election_groups.emplace( + [&](auto& group) + { + group.election_time = event.election_time; + group.round = event.round; + group.first_member = *std::min_element(event.voters.begin(), event.voters.end()); + }); for (auto voter : event.voters) { - db.votes.emplace([&](auto& vote) { - vote.election_time = group.election_time; - vote.round = event.round; - vote.group_id = group.id._id; - vote.voter = voter; - }); + db.votes.emplace( + [&](auto& vote) + { + vote.election_time = group.election_time; + vote.round = event.round; + vote.group_id = group.id._id; + vote.voter = voter; + }); } } void handle_event(const eden::election_event_begin_round_voting& event) { modify(db.election_rounds, ElectionRoundKey{event.election_time, event.round}, - [&](auto& round) { + [&](auto& round) + { round.groups_available = true; round.voting_started = true; round.voting_begin = event.voting_begin; @@ -1968,10 +2023,9 @@ void handle_event(const eden::election_event_end_round_voting& event) void handle_event(const eden::election_event_report_group& event) { eosio::check(!event.votes.empty(), "group has no votes"); - auto first_member = - std::min_element(event.votes.begin(), event.votes.end(), [](auto& a, auto& b) { - return a.voter < b.voter; - })->voter; + auto first_member = std::min_element(event.votes.begin(), event.votes.end(), + [](auto& a, auto& b) { return a.voter < b.voter; }) + ->voter; auto& group = get(db.election_groups, ElectionGroupKey{event.election_time, event.round, first_member}); db.election_groups.modify(group, [&](auto& group) { group.winner = event.winner; }); @@ -1990,17 +2044,19 @@ void handle_event(const eden::election_event_end_round& event) void handle_event(const eden::election_event_end& event) { - modify(db.elections, event.election_time, [&](auto& election) { - election.results_available = true; - if (!election.num_rounds) - return; - auto& idx = db.election_groups.get(); - auto it = - idx.lower_bound(ElectionGroupKey{event.election_time, *election.num_rounds - 1, ""_n}); - if (it != idx.end() && it->election_time == event.election_time && - it->round == *election.num_rounds - 1) - election.final_group_id = it->id._id; - }); + modify(db.elections, event.election_time, + [&](auto& election) + { + election.results_available = true; + if (!election.num_rounds) + return; + auto& idx = db.election_groups.get(); + auto it = idx.lower_bound( + ElectionGroupKey{event.election_time, *election.num_rounds - 1, ""_n}); + if (it != idx.end() && it->election_time == event.election_time && + it->round == *election.num_rounds - 1) + election.final_group_id = it->id._id; + }); clear_participating(); } @@ -2011,19 +2067,24 @@ void handle_event(const eden::distribution_event_schedule& event) void handle_event(const action_context& context, const eden::distribution_event_reserve& event) { - modify(db.distributions, event.distribution_time, [&](auto& dist) { - transfer_funds(context.block.timestamp, pool_account(event.pool), distribution_fund, - event.target_amount, history_desc::reserve_distribution); - dist.target_amount = event.target_amount; - }); + modify(db.distributions, event.distribution_time, + [&](auto& dist) + { + transfer_funds(context.block.timestamp, pool_account(event.pool), + distribution_fund, event.target_amount, + history_desc::reserve_distribution); + dist.target_amount = event.target_amount; + }); } void handle_event(const eden::distribution_event_begin& event) { - modify(db.distributions, event.distribution_time, [&](auto& dist) { - dist.started = true; - dist.target_rank_distribution = event.rank_distribution; - }); + modify(db.distributions, event.distribution_time, + [&](auto& dist) + { + dist.started = true; + dist.target_rank_distribution = event.rank_distribution; + }); } void handle_event(const action_context& context, @@ -2044,23 +2105,27 @@ void handle_event(const action_context& context, const eden::distribution_event_ void handle_event(const eden::distribution_event_fund& event) { - db.distribution_funds.emplace([&](auto& fund) { - fund.owner = event.owner; - fund.distribution_time = event.distribution_time; - fund.rank = event.rank; - fund.initial_balance = event.balance; - fund.current_balance = event.balance; - }); + db.distribution_funds.emplace( + [&](auto& fund) + { + fund.owner = event.owner; + fund.distribution_time = event.distribution_time; + fund.rank = event.rank; + fund.initial_balance = event.balance; + fund.current_balance = event.balance; + }); } void handle_event(const eden::session_new_event& event) { - db.sessions.emplace([&](auto& session) { - session.eden_account = event.eden_account; - session.key = event.key; - session.expiration = event.expiration; - session.description = event.description; - }); + db.sessions.emplace( + [&](auto& session) + { + session.eden_account = event.eden_account; + session.key = event.key; + session.expiration = event.expiration; + session.description = event.description; + }); } void handle_event(const eden::session_del_event& event) @@ -2191,6 +2256,8 @@ bool dispatch(eosio::name action_name, const action_context& context, eosio::inp call(inductendors, context, s); else if (action_name == "resign"_n) call(resign, context, s); + else if (action_name == "removemember"_n) + call(removemember, context, s); else if (action_name == "rename"_n) call(rename, context, s); else if (action_name == "electopt"_n) @@ -2261,7 +2328,8 @@ std::vector ship_to_eden_transactions( for (const auto& transaction_trace : traces) { std::visit( - [&](const auto& trx_trace) { + [&](const auto& trx_trace) + { subchain::transaction transaction{ .id = trx_trace.id, }; @@ -2269,14 +2337,17 @@ std::vector ship_to_eden_transactions( for (const auto& action_trace : trx_trace.action_traces) { std::visit( - [&](const auto& act_trace) { + [&](const auto& act_trace) + { std::optional creatorAction; if (act_trace.creator_action_ordinal.value > 0) { std::visit( - [&](const auto& creator_action_trace) { + [&](const auto& creator_action_trace) + { std::visit( - [&](const auto& receipt) { + [&](const auto& receipt) + { creatorAction = subchain::creator_action{ .seq = receipt.global_sequence, .receiver = creator_action_trace.receiver, @@ -2291,7 +2362,8 @@ std::vector ship_to_eden_transactions( eosio::bytes hexData{data}; std::visit( - [&](const auto& receipt) { + [&](const auto& receipt) + { subchain::action action{ .seq = receipt.global_sequence, .firstReceiver = act_trace.act.account, diff --git a/contracts/eden/src/eden.cpp b/contracts/eden/src/eden.cpp index dddaee508..f32718d5d 100644 --- a/contracts/eden/src/eden.cpp +++ b/contracts/eden/src/eden.cpp @@ -1,5 +1,6 @@ #include #include +#include #include #include #include @@ -58,6 +59,7 @@ EOSIO_ABIGEN( table("bylaws"_n, eden::bylaws_variant), table("distaccount"_n, eden::distribution_account_variant), table("distribution"_n, eden::distribution_variant), + table("badge"_n, eden::badge_variant), table("endorsement"_n, eden::endorsement_variant), table("elect.curr"_n, eden::current_election_state), table("elect.state"_n, eden::election_state_variant), diff --git a/contracts/eden/src/elections.cpp b/contracts/eden/src/elections.cpp index 3e252000a..d829b5f32 100644 --- a/contracts/eden/src/elections.cpp +++ b/contracts/eden/src/elections.cpp @@ -245,11 +245,13 @@ namespace eden const auto& old = group_idx.get((round << 16) | pos); group_idx.modify(old, eosio::same_payer, [&](auto& row) { row.index = next_index; }); } - vote_tb.emplace(contract, [&](auto& row) { - row.member = member; - row.round = round; - row.index = pos; - }); + vote_tb.emplace(contract, + [&](auto& row) + { + row.member = member; + row.round = round; + row.index = pos; + }); ++next_index; } @@ -336,7 +338,8 @@ namespace eden void elections::set_time(uint8_t day, const std::string& time) { - auto get_digit = [](char ch) { + auto get_digit = [](char ch) + { eosio::check(ch >= '0' && ch <= '9', "Expected HH:MM"); return ch - '0'; }; @@ -367,7 +370,7 @@ namespace eden uint16_t new_threshold = active_members + (active_members + 9) / 10; new_threshold = std::clamp(new_threshold, min_election_threshold, max_active_members); set_state_sing(current_election_state_registration_v1{ - get_election_time(state.election_start_time, origin_time + eosio::days(180)), + get_election_time(state.election_start_time, origin_time + eosio::days(90)), new_threshold}); } @@ -629,6 +632,23 @@ namespace eden return result; } + eosio::time_point elections::get_round_time_point() + { + if (!state_sing.exists()) + { + return eosio::time_point(); + } + + auto state = state_sing.get(); + + if (auto* result = std::get_if(&state)) + { + return result->round_end.to_time_point(); + } + + return eosio::time_point(); + } + static eosio::checksum256 adjust_seed(const eosio::checksum256& seed) { char buf[36]; @@ -676,9 +696,9 @@ namespace eden } iter = group_idx.erase(iter); } - auto best = std::max_element( - votes_by_candidate.begin(), votes_by_candidate.end(), - [](const auto& lhs, const auto& rhs) { return lhs.second < rhs.second; }); + auto best = std::max_element(votes_by_candidate.begin(), votes_by_candidate.end(), + [](const auto& lhs, const auto& rhs) + { return lhs.second < rhs.second; }); if (!votes_by_candidate.empty() && 3 * best->second > (2 * total_votes + 3 * group_size)) { result.winner = best->first; @@ -720,9 +740,9 @@ namespace eden { auth.accounts.push_back({{member, "active"_n}, 1}); } - std::sort(auth.accounts.begin(), auth.accounts.end(), [](const auto& lhs, const auto& rhs) { - return lhs.permission.actor < rhs.permission.actor; - }); + std::sort(auth.accounts.begin(), auth.accounts.end(), + [](const auto& lhs, const auto& rhs) + { return lhs.permission.actor < rhs.permission.actor; }); eosio::action{{contract, "active"_n}, "eosio"_n, "updateauth"_n, diff --git a/contracts/eden/src/globals.cpp b/contracts/eden/src/globals.cpp index 09d55052c..bc558f4e4 100644 --- a/contracts/eden/src/globals.cpp +++ b/contracts/eden/src/globals.cpp @@ -3,7 +3,15 @@ namespace eden { - global_data_v1 global_data_v0::upgrade() const { return {*this}; } + global_data_v2 global_data_v0::upgrade() const + { + return {{*this}}; + } + + global_data_v2 global_data_v1::upgrade() const + { + return {*this}; + } static std::optional global_singleton_inst; @@ -23,7 +31,7 @@ namespace eden { } - globals::globals(eosio::name contract, const global_data_v1& initial_value) + globals::globals(eosio::name contract, const global_data_v2& initial_value) : contract(contract), data(initial_value) { auto& singleton = get_global_singleton(contract); @@ -53,4 +61,16 @@ namespace eden data.election_round_time_sec = duration; get_global_singleton(contract).set(data, eosio::same_payer); } + + void globals::set_minimum_donation_fee(eosio::asset new_minimum_donation) + { + data.minimum_donation = new_minimum_donation; + get_global_singleton(contract).set(data, eosio::same_payer); + } + + void globals::set_max_month_withdraw(uint8_t months) + { + data.max_month_withdraw = months; + get_global_singleton(contract).set(data, eosio::same_payer); + } } // namespace eden diff --git a/contracts/eden/tests/data/test-election.expected b/contracts/eden/tests/data/test-election.expected index 7a1229c9d..089adf3a3 100644 --- a/contracts/eden/tests/data/test-election.expected +++ b/contracts/eden/tests/data/test-election.expected @@ -14,41 +14,41 @@ [ "election_event_schedule", { - "election_time": "2020-07-04T15:30:00.000", + "election_time": "2020-04-04T15:30:00.000", "election_threshold": 1000 } ] [ "election_event_begin", { - "election_time": "2020-07-04T15:30:00.000" + "election_time": "2020-04-04T15:30:00.000" } ] [ "election_event_seeding", { - "election_time": "2020-07-04T15:30:00.000", - "start_time": "2020-07-03T15:30:00.000", - "end_time": "2020-07-04T15:30:00.000", - "seed": "79BC69E1EF2D91BDFD54CF74E8B3784EEDC110F7A0BA571297FAD90DEC3B97C7" + "election_time": "2020-04-04T15:30:00.000", + "start_time": "2020-04-03T15:30:00.000", + "end_time": "2020-04-04T15:30:00.000", + "seed": "E06B14D3F14B6D466FD2060F6E50F0D7E9F740E2CEF4E4652A0C9779AD501CF4" } ] [ "election_event_end_seeding", { - "election_time": "2020-07-04T15:30:00.000" + "election_time": "2020-04-04T15:30:00.000" } ] [ "distribution_event_schedule", { - "distribution_time": "2020-07-04T15:30:00.000" + "distribution_time": "2020-04-04T15:30:00.000" } ] [ "distribution_event_reserve", { - "distribution_time": "2020-07-04T15:30:00.000", + "distribution_time": "2020-04-04T15:30:00.000", "pool": "master", "target_amount": "1.5000 EOS" } @@ -56,13 +56,13 @@ [ "distribution_event_schedule", { - "distribution_time": "2020-08-03T15:30:00.000" + "distribution_time": "2020-05-04T15:30:00.000" } ] [ "election_event_config_summary", { - "election_time": "2020-07-04T15:30:00.000", + "election_time": "2020-04-04T15:30:00.000", "num_rounds": 1, "num_participants": 3 } @@ -70,7 +70,7 @@ [ "election_event_create_round", { - "election_time": "2020-07-04T15:30:00.000", + "election_time": "2020-04-04T15:30:00.000", "round": 0, "requires_voting": false, "num_participants": 3, @@ -80,28 +80,28 @@ [ "election_event_create_group", { - "election_time": "2020-07-04T15:30:00.000", + "election_time": "2020-04-04T15:30:00.000", "round": 0, "voters": [ - "alice", + "egeon", "pip", - "egeon" + "alice" ] } ] [ "election_event_begin_round_voting", { - "election_time": "2020-07-04T15:30:00.000", + "election_time": "2020-04-04T15:30:00.000", "round": 0, - "voting_begin": "2020-07-04T15:30:00.000", - "voting_end": "2020-07-04T15:30:00.000" + "voting_begin": "2020-04-04T15:30:00.000", + "voting_end": "2020-04-04T15:30:00.000" } ] [ "distribution_event_begin", { - "distribution_time": "2020-07-04T15:30:00.000", + "distribution_time": "2020-04-04T15:30:00.000", "rank_distribution": [ "1.5000 EOS" ] @@ -110,19 +110,19 @@ [ "election_event_end_round_voting", { - "election_time": "2020-07-04T15:30:00.000", + "election_time": "2020-04-04T15:30:00.000", "round": 0 } ] [ "election_event_report_group", { - "election_time": "2020-07-04T15:30:00.000", + "election_time": "2020-04-04T15:30:00.000", "round": 0, - "winner": "alice", + "winner": "egeon", "votes": [ { - "voter": "alice", + "voter": "egeon", "candidate": "" }, { @@ -130,7 +130,7 @@ "candidate": "" }, { - "voter": "egeon", + "voter": "alice", "candidate": "" } ] @@ -139,48 +139,48 @@ [ "election_event_end_round", { - "election_time": "2020-07-04T15:30:00.000", + "election_time": "2020-04-04T15:30:00.000", "round": 0 } ] [ "election_event_end", { - "election_time": "2020-07-04T15:30:00.000" + "election_time": "2020-04-04T15:30:00.000" } ] [ "election_event_schedule", { - "election_time": "2021-01-02T15:30:00.000", + "election_time": "2020-07-04T15:30:00.000", "election_threshold": 1000 } ] [ "election_event_begin", { - "election_time": "2021-01-02T15:30:00.000" + "election_time": "2020-07-04T15:30:00.000" } ] [ "election_event_seeding", { - "election_time": "2021-01-02T15:30:00.000", - "start_time": "2021-01-01T15:30:00.000", - "end_time": "2021-01-02T15:30:00.000", - "seed": "BDCB31DA20299AD2F7368BAB02BA78BC311D6CAAA39A5865E5AACB12D1D9E207" + "election_time": "2020-07-04T15:30:00.000", + "start_time": "2020-07-03T15:30:00.000", + "end_time": "2020-07-04T15:30:00.000", + "seed": "79BC69E1EF2D91BDFD54CF74E8B3784EEDC110F7A0BA571297FAD90DEC3B97C7" } ] [ "election_event_end_seeding", { - "election_time": "2021-01-02T15:30:00.000" + "election_time": "2020-07-04T15:30:00.000" } ] [ "distribution_event_reserve", { - "distribution_time": "2020-08-03T15:30:00.000", + "distribution_time": "2020-05-04T15:30:00.000", "pool": "master", "target_amount": "51.4250 EOS" } @@ -188,7 +188,7 @@ [ "distribution_event_begin", { - "distribution_time": "2020-08-03T15:30:00.000", + "distribution_time": "2020-05-04T15:30:00.000", "rank_distribution": [ "51.4250 EOS" ] @@ -197,13 +197,13 @@ [ "distribution_event_schedule", { - "distribution_time": "2020-09-02T15:30:00.000" + "distribution_time": "2020-06-03T15:30:00.000" } ] [ "distribution_event_reserve", { - "distribution_time": "2020-09-02T15:30:00.000", + "distribution_time": "2020-06-03T15:30:00.000", "pool": "master", "target_amount": "48.8537 EOS" } @@ -211,7 +211,7 @@ [ "distribution_event_begin", { - "distribution_time": "2020-09-02T15:30:00.000", + "distribution_time": "2020-06-03T15:30:00.000", "rank_distribution": [ "48.8537 EOS" ] @@ -220,120 +220,51 @@ [ "distribution_event_schedule", { - "distribution_time": "2020-10-02T15:30:00.000" - } -] -[ - "distribution_event_reserve", - { - "distribution_time": "2020-10-02T15:30:00.000", - "pool": "master", - "target_amount": "46.4110 EOS" - } -] -[ - "distribution_event_begin", - { - "distribution_time": "2020-10-02T15:30:00.000", - "rank_distribution": [ - "46.4110 EOS" - ] - } -] -[ - "distribution_event_schedule", - { - "distribution_time": "2020-11-01T15:30:00.000" - } -] -[ - "distribution_event_reserve", - { - "distribution_time": "2020-11-01T15:30:00.000", - "pool": "master", - "target_amount": "44.0905 EOS" - } -] -[ - "distribution_event_begin", - { - "distribution_time": "2020-11-01T15:30:00.000", - "rank_distribution": [ - "44.0905 EOS" - ] - } -] -[ - "distribution_event_schedule", - { - "distribution_time": "2020-12-01T15:30:00.000" - } -] -[ - "distribution_event_reserve", - { - "distribution_time": "2020-12-01T15:30:00.000", - "pool": "master", - "target_amount": "41.8859 EOS" - } -] -[ - "distribution_event_begin", - { - "distribution_time": "2020-12-01T15:30:00.000", - "rank_distribution": [ - "41.8859 EOS" - ] - } -] -[ - "distribution_event_schedule", - { - "distribution_time": "2020-12-31T15:30:00.000" + "distribution_time": "2020-07-03T15:30:00.000" } ] [ "distribution_event_reserve", { - "distribution_time": "2020-12-31T15:30:00.000", + "distribution_time": "2020-07-03T15:30:00.000", "pool": "master", - "target_amount": "2.6527 EOS" + "target_amount": "1.5470 EOS" } ] [ "distribution_event_begin", { - "distribution_time": "2020-12-31T15:30:00.000", + "distribution_time": "2020-07-03T15:30:00.000", "rank_distribution": [ - "2.6527 EOS" + "1.5470 EOS" ] } ] [ "distribution_event_schedule", { - "distribution_time": "2021-01-02T15:30:00.000" + "distribution_time": "2020-07-04T15:30:00.000" } ] [ "distribution_event_reserve", { - "distribution_time": "2021-01-02T15:30:00.000", + "distribution_time": "2020-07-04T15:30:00.000", "pool": "master", - "target_amount": "39.6590 EOS" + "target_amount": "46.3337 EOS" } ] [ "distribution_event_schedule", { - "distribution_time": "2021-02-01T15:30:00.000" + "distribution_time": "2020-08-03T15:30:00.000" } ] [ "distribution_event_fund", { - "owner": "alice", - "distribution_time": "2020-07-04T15:30:00.000", + "owner": "egeon", + "distribution_time": "2020-04-04T15:30:00.000", "rank": 1, "balance": "1.5000 EOS" } @@ -341,14 +272,14 @@ [ "distribution_event_end", { - "distribution_time": "2020-07-04T15:30:00.000" + "distribution_time": "2020-04-04T15:30:00.000" } ] [ "distribution_event_fund", { - "owner": "alice", - "distribution_time": "2020-08-03T15:30:00.000", + "owner": "egeon", + "distribution_time": "2020-05-04T15:30:00.000", "rank": 1, "balance": "51.4250 EOS" } @@ -356,14 +287,14 @@ [ "distribution_event_end", { - "distribution_time": "2020-08-03T15:30:00.000" + "distribution_time": "2020-05-04T15:30:00.000" } ] [ "distribution_event_fund", { - "owner": "alice", - "distribution_time": "2020-09-02T15:30:00.000", + "owner": "egeon", + "distribution_time": "2020-06-03T15:30:00.000", "rank": 1, "balance": "48.8537 EOS" } @@ -371,73 +302,28 @@ [ "distribution_event_end", { - "distribution_time": "2020-09-02T15:30:00.000" - } -] -[ - "distribution_event_fund", - { - "owner": "alice", - "distribution_time": "2020-10-02T15:30:00.000", - "rank": 1, - "balance": "46.4110 EOS" - } -] -[ - "distribution_event_end", - { - "distribution_time": "2020-10-02T15:30:00.000" - } -] -[ - "distribution_event_fund", - { - "owner": "alice", - "distribution_time": "2020-11-01T15:30:00.000", - "rank": 1, - "balance": "44.0905 EOS" - } -] -[ - "distribution_event_end", - { - "distribution_time": "2020-11-01T15:30:00.000" - } -] -[ - "distribution_event_fund", - { - "owner": "alice", - "distribution_time": "2020-12-01T15:30:00.000", - "rank": 1, - "balance": "41.8859 EOS" - } -] -[ - "distribution_event_end", - { - "distribution_time": "2020-12-01T15:30:00.000" + "distribution_time": "2020-06-03T15:30:00.000" } ] [ "distribution_event_fund", { - "owner": "alice", - "distribution_time": "2020-12-31T15:30:00.000", + "owner": "egeon", + "distribution_time": "2020-07-03T15:30:00.000", "rank": 1, - "balance": "2.6527 EOS" + "balance": "1.5470 EOS" } ] [ "distribution_event_end", { - "distribution_time": "2020-12-31T15:30:00.000" + "distribution_time": "2020-07-03T15:30:00.000" } ] [ "election_event_config_summary", { - "election_time": "2021-01-02T15:30:00.000", + "election_time": "2020-07-04T15:30:00.000", "num_rounds": 3, "num_participants": 103 } @@ -445,7 +331,7 @@ [ "election_event_create_round", { - "election_time": "2021-01-02T15:30:00.000", + "election_time": "2020-07-04T15:30:00.000", "round": 0, "requires_voting": true, "num_participants": 103, @@ -455,54 +341,54 @@ [ "election_event_create_group", { - "election_time": "2021-01-02T15:30:00.000", + "election_time": "2020-07-04T15:30:00.000", "round": 0, "voters": [ - "edenmember2v", - "edenmember24", + "edenmember2p", + "edenmember43", "edenmember2l", - "edenmember3v", - "edenmember3k" + "edenmember1m", + "edenmember3q" ] } ] [ "election_event_create_group", { - "election_time": "2021-01-02T15:30:00.000", + "election_time": "2020-07-04T15:30:00.000", "round": 0, "voters": [ - "edenmember1d", - "egeon", - "edenmember33", - "edenmember2h", - "edenmember3m" + "edenmember44", + "edenmember3t", + "edenmember12", + "edenmember22", + "edenmember1n" ] } ] [ "election_event_create_group", { - "election_time": "2021-01-02T15:30:00.000", + "election_time": "2020-07-04T15:30:00.000", "round": 0, "voters": [ - "edenmember41", - "edenmember2m", - "edenmember11", - "edenmember4a", - "edenmember1o" + "edenmember21", + "edenmember3d", + "edenmember13", + "edenmember3w", + "edenmember2q" ] } ] [ "election_event_create_group", { - "election_time": "2021-01-02T15:30:00.000", + "election_time": "2020-07-04T15:30:00.000", "round": 0, "voters": [ - "edenmember1h", - "edenmember2k", - "edenmember3i", + "edenmember2n", + "edenmember3g", + "edenmember1o", "edenmember2t" ] } @@ -510,207 +396,207 @@ [ "election_event_create_group", { - "election_time": "2021-01-02T15:30:00.000", + "election_time": "2020-07-04T15:30:00.000", "round": 0, "voters": [ - "edenmember1e", - "edenmember3r", - "pip", - "edenmember2p" + "edenmember3p", + "edenmember1k", + "edenmember2b", + "edenmember3z" ] } ] [ "election_event_create_group", { - "election_time": "2021-01-02T15:30:00.000", + "election_time": "2020-07-04T15:30:00.000", "round": 0, "voters": [ - "edenmember3h", - "edenmember3c", - "edenmember42", - "edenmember1p" + "edenmember3a", + "edenmember1v", + "edenmember3s", + "edenmember15" ] } ] [ "election_event_create_group", { - "election_time": "2021-01-02T15:30:00.000", + "election_time": "2020-07-04T15:30:00.000", "round": 0, "voters": [ - "edenmember3e", - "edenmember31", - "edenmember1m", - "edenmember1t" + "edenmember1a", + "edenmember3j", + "edenmember1t", + "edenmember1z" ] } ] [ "election_event_create_group", { - "election_time": "2021-01-02T15:30:00.000", + "election_time": "2020-07-04T15:30:00.000", "round": 0, "voters": [ - "edenmember3j", - "edenmember1q", + "edenmember3b", "edenmember23", - "edenmember1r" + "edenmember2m", + "edenmember2i" ] } ] [ "election_event_create_group", { - "election_time": "2021-01-02T15:30:00.000", + "election_time": "2020-07-04T15:30:00.000", "round": 0, "voters": [ - "edenmember2u", - "edenmember3g", - "edenmember2d", - "edenmember1y" + "edenmember3x", + "edenmember3h", + "edenmember24", + "edenmember1q" ] } ] [ "election_event_create_group", { - "election_time": "2021-01-02T15:30:00.000", + "election_time": "2020-07-04T15:30:00.000", "round": 0, "voters": [ - "edenmember3q", - "edenmember2w", - "edenmember3a", - "edenmember1s" + "edenmember1j", + "alice", + "edenmember1s", + "edenmember1b" ] } ] [ "election_event_create_group", { - "election_time": "2021-01-02T15:30:00.000", + "election_time": "2020-07-04T15:30:00.000", "round": 0, "voters": [ - "edenmember1x", - "edenmember43", - "alice", - "edenmember2z" + "edenmember1h", + "edenmember4b", + "edenmember41", + "edenmember3u" ] } ] [ "election_event_create_group", { - "election_time": "2021-01-02T15:30:00.000", + "election_time": "2020-07-04T15:30:00.000", "round": 0, "voters": [ - "edenmember1f", - "edenmember3p", - "edenmember1w", - "edenmember3s" + "edenmember1x", + "edenmember3l", + "edenmember35", + "edenmember1f" ] } ] [ "election_event_create_group", { - "election_time": "2021-01-02T15:30:00.000", + "election_time": "2020-07-04T15:30:00.000", "round": 0, "voters": [ - "edenmember25", - "edenmember3u", - "edenmember13", - "edenmember1v" + "egeon", + "edenmember2u", + "edenmember2s", + "edenmember25" ] } ] [ "election_event_create_group", { - "election_time": "2021-01-02T15:30:00.000", + "election_time": "2020-07-04T15:30:00.000", "round": 0, "voters": [ - "edenmember3f", - "edenmember2e", - "edenmember1n", - "edenmember45" + "edenmember2d", + "edenmember2k", + "edenmember3m", + "edenmember3v" ] } ] [ "election_event_create_group", { - "election_time": "2021-01-02T15:30:00.000", + "election_time": "2020-07-04T15:30:00.000", "round": 0, "voters": [ - "edenmember1z", - "edenmember2f", - "edenmember32", - "edenmember1i" + "edenmember3o", + "edenmember33", + "edenmember3n", + "edenmember45" ] } ] [ "election_event_create_group", { - "election_time": "2021-01-02T15:30:00.000", + "election_time": "2020-07-04T15:30:00.000", "round": 0, "voters": [ - "edenmember3w", - "edenmember1l", - "edenmember2g", - "edenmember21" + "edenmember4a", + "edenmember2v", + "edenmember2o", + "edenmember1y" ] } ] [ "election_event_create_group", { - "election_time": "2021-01-02T15:30:00.000", + "election_time": "2020-07-04T15:30:00.000", "round": 0, "voters": [ - "edenmember22", - "edenmember1a", - "edenmember1c", - "edenmember3b" + "edenmember2f", + "edenmember2e", + "edenmember1i", + "edenmember2y" ] } ] [ "election_event_create_group", { - "election_time": "2021-01-02T15:30:00.000", + "election_time": "2020-07-04T15:30:00.000", "round": 0, "voters": [ - "edenmember1k", - "edenmember12", - "edenmember3d", - "edenmember3l" + "edenmember1c", + "edenmember32", + "edenmember3e", + "edenmember3k" ] } ] [ "election_event_create_group", { - "election_time": "2021-01-02T15:30:00.000", + "election_time": "2020-07-04T15:30:00.000", "round": 0, "voters": [ - "edenmember1b", - "edenmember15", - "edenmember1u", - "edenmember2b" + "edenmember3y", + "edenmember2w", + "edenmember2r", + "edenmember2x" ] } ] [ "election_event_create_group", { - "election_time": "2021-01-02T15:30:00.000", + "election_time": "2020-07-04T15:30:00.000", "round": 0, "voters": [ - "edenmember3z", - "edenmember2x", - "edenmember2y", + "edenmember3c", + "edenmember34", + "edenmember1e", "edenmember1g" ] } @@ -718,110 +604,110 @@ [ "election_event_create_group", { - "election_time": "2021-01-02T15:30:00.000", + "election_time": "2020-07-04T15:30:00.000", "round": 0, "voters": [ - "edenmember4b", - "edenmember2o", "edenmember2j", - "edenmember34" + "edenmember2h", + "edenmember2a", + "edenmember3f" ] } ] [ "election_event_create_group", { - "election_time": "2021-01-02T15:30:00.000", + "election_time": "2020-07-04T15:30:00.000", "round": 0, "voters": [ - "edenmember44", - "edenmember2a", - "edenmember2c", - "edenmember35" + "edenmember1p", + "edenmember31", + "edenmember3i", + "edenmember1d" ] } ] [ "election_event_create_group", { - "election_time": "2021-01-02T15:30:00.000", + "election_time": "2020-07-04T15:30:00.000", "round": 0, "voters": [ - "edenmember2n", - "edenmember2i", - "edenmember2s", - "edenmember3x" + "edenmember11", + "edenmember42", + "edenmember3r", + "edenmember1r" ] } ] [ "election_event_create_group", { - "election_time": "2021-01-02T15:30:00.000", + "election_time": "2020-07-04T15:30:00.000", "round": 0, "voters": [ - "edenmember2q", - "edenmember1j", - "edenmember3n", - "edenmember14" + "edenmember1l", + "edenmember14", + "edenmember1w", + "pip" ] } ] [ "election_event_create_group", { - "election_time": "2021-01-02T15:30:00.000", + "election_time": "2020-07-04T15:30:00.000", "round": 0, "voters": [ - "edenmember2r", - "edenmember3y", - "edenmember3o", - "edenmember3t" + "edenmember2c", + "edenmember2z", + "edenmember1u", + "edenmember2g" ] } ] [ "election_event_begin_round_voting", { - "election_time": "2021-01-02T15:30:00.000", + "election_time": "2020-07-04T15:30:00.000", "round": 0, - "voting_begin": "2021-01-02T15:30:00.000", - "voting_end": "2021-01-02T16:30:00.000" + "voting_begin": "2020-07-04T15:30:00.000", + "voting_end": "2020-07-04T16:30:00.000" } ] [ "election_event_end_round_voting", { - "election_time": "2021-01-02T15:30:00.000", + "election_time": "2020-07-04T15:30:00.000", "round": 0 } ] [ "election_event_report_group", { - "election_time": "2021-01-02T15:30:00.000", + "election_time": "2020-07-04T15:30:00.000", "round": 0, - "winner": "edenmember24", + "winner": "edenmember1m", "votes": [ { - "voter": "edenmember2v", - "candidate": "edenmember24" + "voter": "edenmember2p", + "candidate": "edenmember1m" }, { - "voter": "edenmember24", - "candidate": "edenmember24" + "voter": "edenmember43", + "candidate": "edenmember1m" }, { "voter": "edenmember2l", - "candidate": "edenmember24" + "candidate": "edenmember1m" }, { - "voter": "edenmember3v", - "candidate": "edenmember24" + "voter": "edenmember1m", + "candidate": "edenmember1m" }, { - "voter": "edenmember3k", - "candidate": "edenmember24" + "voter": "edenmember3q", + "candidate": "edenmember1m" } ] } @@ -829,29 +715,29 @@ [ "election_event_report_group", { - "election_time": "2021-01-02T15:30:00.000", + "election_time": "2020-07-04T15:30:00.000", "round": 0, - "winner": "edenmember1d", + "winner": "edenmember12", "votes": [ { - "voter": "edenmember1d", - "candidate": "edenmember1d" + "voter": "edenmember44", + "candidate": "edenmember12" }, { - "voter": "egeon", - "candidate": "edenmember1d" + "voter": "edenmember3t", + "candidate": "edenmember12" }, { - "voter": "edenmember33", - "candidate": "edenmember1d" + "voter": "edenmember12", + "candidate": "edenmember12" }, { - "voter": "edenmember2h", - "candidate": "edenmember1d" + "voter": "edenmember22", + "candidate": "edenmember12" }, { - "voter": "edenmember3m", - "candidate": "edenmember1d" + "voter": "edenmember1n", + "candidate": "edenmember12" } ] } @@ -859,29 +745,29 @@ [ "election_event_report_group", { - "election_time": "2021-01-02T15:30:00.000", + "election_time": "2020-07-04T15:30:00.000", "round": 0, - "winner": "edenmember11", + "winner": "edenmember13", "votes": [ { - "voter": "edenmember41", - "candidate": "edenmember11" + "voter": "edenmember21", + "candidate": "edenmember13" }, { - "voter": "edenmember2m", - "candidate": "edenmember11" + "voter": "edenmember3d", + "candidate": "edenmember13" }, { - "voter": "edenmember11", - "candidate": "edenmember11" + "voter": "edenmember13", + "candidate": "edenmember13" }, { - "voter": "edenmember4a", - "candidate": "edenmember11" + "voter": "edenmember3w", + "candidate": "edenmember13" }, { - "voter": "edenmember1o", - "candidate": "edenmember11" + "voter": "edenmember2q", + "candidate": "edenmember13" } ] } @@ -889,25 +775,25 @@ [ "election_event_report_group", { - "election_time": "2021-01-02T15:30:00.000", + "election_time": "2020-07-04T15:30:00.000", "round": 0, - "winner": "edenmember1h", + "winner": "edenmember1o", "votes": [ { - "voter": "edenmember1h", - "candidate": "edenmember1h" + "voter": "edenmember2n", + "candidate": "edenmember1o" }, { - "voter": "edenmember2k", - "candidate": "edenmember1h" + "voter": "edenmember3g", + "candidate": "edenmember1o" }, { - "voter": "edenmember3i", - "candidate": "edenmember1h" + "voter": "edenmember1o", + "candidate": "edenmember1o" }, { "voter": "edenmember2t", - "candidate": "edenmember1h" + "candidate": "edenmember1o" } ] } @@ -915,25 +801,25 @@ [ "election_event_report_group", { - "election_time": "2021-01-02T15:30:00.000", + "election_time": "2020-07-04T15:30:00.000", "round": 0, - "winner": "edenmember1e", + "winner": "edenmember1k", "votes": [ { - "voter": "edenmember1e", - "candidate": "edenmember1e" + "voter": "edenmember3p", + "candidate": "edenmember1k" }, { - "voter": "edenmember3r", - "candidate": "edenmember1e" + "voter": "edenmember1k", + "candidate": "edenmember1k" }, { - "voter": "pip", - "candidate": "edenmember1e" + "voter": "edenmember2b", + "candidate": "edenmember1k" }, { - "voter": "edenmember2p", - "candidate": "edenmember1e" + "voter": "edenmember3z", + "candidate": "edenmember1k" } ] } @@ -941,25 +827,25 @@ [ "election_event_report_group", { - "election_time": "2021-01-02T15:30:00.000", + "election_time": "2020-07-04T15:30:00.000", "round": 0, - "winner": "edenmember1p", + "winner": "edenmember15", "votes": [ { - "voter": "edenmember3h", - "candidate": "edenmember1p" + "voter": "edenmember3a", + "candidate": "edenmember15" }, { - "voter": "edenmember3c", - "candidate": "edenmember1p" + "voter": "edenmember1v", + "candidate": "edenmember15" }, { - "voter": "edenmember42", - "candidate": "edenmember1p" + "voter": "edenmember3s", + "candidate": "edenmember15" }, { - "voter": "edenmember1p", - "candidate": "edenmember1p" + "voter": "edenmember15", + "candidate": "edenmember15" } ] } @@ -967,25 +853,25 @@ [ "election_event_report_group", { - "election_time": "2021-01-02T15:30:00.000", + "election_time": "2020-07-04T15:30:00.000", "round": 0, - "winner": "edenmember1m", + "winner": "edenmember1a", "votes": [ { - "voter": "edenmember3e", - "candidate": "edenmember1m" + "voter": "edenmember1a", + "candidate": "edenmember1a" }, { - "voter": "edenmember31", - "candidate": "edenmember1m" + "voter": "edenmember3j", + "candidate": "edenmember1a" }, { - "voter": "edenmember1m", - "candidate": "edenmember1m" + "voter": "edenmember1t", + "candidate": "edenmember1a" }, { - "voter": "edenmember1t", - "candidate": "edenmember1m" + "voter": "edenmember1z", + "candidate": "edenmember1a" } ] } @@ -993,25 +879,25 @@ [ "election_event_report_group", { - "election_time": "2021-01-02T15:30:00.000", + "election_time": "2020-07-04T15:30:00.000", "round": 0, - "winner": "edenmember1q", + "winner": "edenmember23", "votes": [ { - "voter": "edenmember3j", - "candidate": "edenmember1q" + "voter": "edenmember3b", + "candidate": "edenmember23" }, { - "voter": "edenmember1q", - "candidate": "edenmember1q" + "voter": "edenmember23", + "candidate": "edenmember23" }, { - "voter": "edenmember23", - "candidate": "edenmember1q" + "voter": "edenmember2m", + "candidate": "edenmember23" }, { - "voter": "edenmember1r", - "candidate": "edenmember1q" + "voter": "edenmember2i", + "candidate": "edenmember23" } ] } @@ -1019,25 +905,25 @@ [ "election_event_report_group", { - "election_time": "2021-01-02T15:30:00.000", + "election_time": "2020-07-04T15:30:00.000", "round": 0, - "winner": "edenmember1y", + "winner": "edenmember1q", "votes": [ { - "voter": "edenmember2u", - "candidate": "edenmember1y" + "voter": "edenmember3x", + "candidate": "edenmember1q" }, { - "voter": "edenmember3g", - "candidate": "edenmember1y" + "voter": "edenmember3h", + "candidate": "edenmember1q" }, { - "voter": "edenmember2d", - "candidate": "edenmember1y" + "voter": "edenmember24", + "candidate": "edenmember1q" }, { - "voter": "edenmember1y", - "candidate": "edenmember1y" + "voter": "edenmember1q", + "candidate": "edenmember1q" } ] } @@ -1045,25 +931,25 @@ [ "election_event_report_group", { - "election_time": "2021-01-02T15:30:00.000", + "election_time": "2020-07-04T15:30:00.000", "round": 0, - "winner": "edenmember1s", + "winner": "alice", "votes": [ { - "voter": "edenmember3q", - "candidate": "edenmember1s" + "voter": "edenmember1j", + "candidate": "alice" }, { - "voter": "edenmember2w", - "candidate": "edenmember1s" + "voter": "alice", + "candidate": "alice" }, { - "voter": "edenmember3a", - "candidate": "edenmember1s" + "voter": "edenmember1s", + "candidate": "alice" }, { - "voter": "edenmember1s", - "candidate": "edenmember1s" + "voter": "edenmember1b", + "candidate": "alice" } ] } @@ -1071,25 +957,25 @@ [ "election_event_report_group", { - "election_time": "2021-01-02T15:30:00.000", + "election_time": "2020-07-04T15:30:00.000", "round": 0, - "winner": "alice", + "winner": "edenmember1h", "votes": [ { - "voter": "edenmember1x", - "candidate": "alice" + "voter": "edenmember1h", + "candidate": "edenmember1h" }, { - "voter": "edenmember43", - "candidate": "alice" + "voter": "edenmember4b", + "candidate": "edenmember1h" }, { - "voter": "alice", - "candidate": "alice" + "voter": "edenmember41", + "candidate": "edenmember1h" }, { - "voter": "edenmember2z", - "candidate": "alice" + "voter": "edenmember3u", + "candidate": "edenmember1h" } ] } @@ -1097,24 +983,24 @@ [ "election_event_report_group", { - "election_time": "2021-01-02T15:30:00.000", + "election_time": "2020-07-04T15:30:00.000", "round": 0, "winner": "edenmember1f", "votes": [ { - "voter": "edenmember1f", + "voter": "edenmember1x", "candidate": "edenmember1f" }, { - "voter": "edenmember3p", + "voter": "edenmember3l", "candidate": "edenmember1f" }, { - "voter": "edenmember1w", + "voter": "edenmember35", "candidate": "edenmember1f" }, { - "voter": "edenmember3s", + "voter": "edenmember1f", "candidate": "edenmember1f" } ] @@ -1123,25 +1009,25 @@ [ "election_event_report_group", { - "election_time": "2021-01-02T15:30:00.000", + "election_time": "2020-07-04T15:30:00.000", "round": 0, - "winner": "edenmember13", + "winner": "edenmember25", "votes": [ { - "voter": "edenmember25", - "candidate": "edenmember13" + "voter": "egeon", + "candidate": "edenmember25" }, { - "voter": "edenmember3u", - "candidate": "edenmember13" + "voter": "edenmember2u", + "candidate": "edenmember25" }, { - "voter": "edenmember13", - "candidate": "edenmember13" + "voter": "edenmember2s", + "candidate": "edenmember25" }, { - "voter": "edenmember1v", - "candidate": "edenmember13" + "voter": "edenmember25", + "candidate": "edenmember25" } ] } @@ -1149,25 +1035,25 @@ [ "election_event_report_group", { - "election_time": "2021-01-02T15:30:00.000", + "election_time": "2020-07-04T15:30:00.000", "round": 0, - "winner": "edenmember1n", + "winner": "edenmember2d", "votes": [ { - "voter": "edenmember3f", - "candidate": "edenmember1n" + "voter": "edenmember2d", + "candidate": "edenmember2d" }, { - "voter": "edenmember2e", - "candidate": "edenmember1n" + "voter": "edenmember2k", + "candidate": "edenmember2d" }, { - "voter": "edenmember1n", - "candidate": "edenmember1n" + "voter": "edenmember3m", + "candidate": "edenmember2d" }, { - "voter": "edenmember45", - "candidate": "edenmember1n" + "voter": "edenmember3v", + "candidate": "edenmember2d" } ] } @@ -1175,25 +1061,25 @@ [ "election_event_report_group", { - "election_time": "2021-01-02T15:30:00.000", + "election_time": "2020-07-04T15:30:00.000", "round": 0, - "winner": "edenmember1i", + "winner": "edenmember33", "votes": [ { - "voter": "edenmember1z", - "candidate": "edenmember1i" + "voter": "edenmember3o", + "candidate": "edenmember33" }, { - "voter": "edenmember2f", - "candidate": "edenmember1i" + "voter": "edenmember33", + "candidate": "edenmember33" }, { - "voter": "edenmember32", - "candidate": "edenmember1i" + "voter": "edenmember3n", + "candidate": "edenmember33" }, { - "voter": "edenmember1i", - "candidate": "edenmember1i" + "voter": "edenmember45", + "candidate": "edenmember33" } ] } @@ -1201,25 +1087,25 @@ [ "election_event_report_group", { - "election_time": "2021-01-02T15:30:00.000", + "election_time": "2020-07-04T15:30:00.000", "round": 0, - "winner": "edenmember1l", + "winner": "edenmember1y", "votes": [ { - "voter": "edenmember3w", - "candidate": "edenmember1l" + "voter": "edenmember4a", + "candidate": "edenmember1y" }, { - "voter": "edenmember1l", - "candidate": "edenmember1l" + "voter": "edenmember2v", + "candidate": "edenmember1y" }, { - "voter": "edenmember2g", - "candidate": "edenmember1l" + "voter": "edenmember2o", + "candidate": "edenmember1y" }, { - "voter": "edenmember21", - "candidate": "edenmember1l" + "voter": "edenmember1y", + "candidate": "edenmember1y" } ] } @@ -1227,25 +1113,25 @@ [ "election_event_report_group", { - "election_time": "2021-01-02T15:30:00.000", + "election_time": "2020-07-04T15:30:00.000", "round": 0, - "winner": "edenmember1a", + "winner": "edenmember1i", "votes": [ { - "voter": "edenmember22", - "candidate": "edenmember1a" + "voter": "edenmember2f", + "candidate": "edenmember1i" }, { - "voter": "edenmember1a", - "candidate": "edenmember1a" + "voter": "edenmember2e", + "candidate": "edenmember1i" }, { - "voter": "edenmember1c", - "candidate": "edenmember1a" + "voter": "edenmember1i", + "candidate": "edenmember1i" }, { - "voter": "edenmember3b", - "candidate": "edenmember1a" + "voter": "edenmember2y", + "candidate": "edenmember1i" } ] } @@ -1253,25 +1139,25 @@ [ "election_event_report_group", { - "election_time": "2021-01-02T15:30:00.000", + "election_time": "2020-07-04T15:30:00.000", "round": 0, - "winner": "edenmember12", + "winner": "edenmember1c", "votes": [ { - "voter": "edenmember1k", - "candidate": "edenmember12" + "voter": "edenmember1c", + "candidate": "edenmember1c" }, { - "voter": "edenmember12", - "candidate": "edenmember12" + "voter": "edenmember32", + "candidate": "edenmember1c" }, { - "voter": "edenmember3d", - "candidate": "edenmember12" + "voter": "edenmember3e", + "candidate": "edenmember1c" }, { - "voter": "edenmember3l", - "candidate": "edenmember12" + "voter": "edenmember3k", + "candidate": "edenmember1c" } ] } @@ -1279,25 +1165,25 @@ [ "election_event_report_group", { - "election_time": "2021-01-02T15:30:00.000", + "election_time": "2020-07-04T15:30:00.000", "round": 0, - "winner": "edenmember15", + "winner": "edenmember2r", "votes": [ { - "voter": "edenmember1b", - "candidate": "edenmember15" + "voter": "edenmember3y", + "candidate": "edenmember2r" }, { - "voter": "edenmember15", - "candidate": "edenmember15" + "voter": "edenmember2w", + "candidate": "edenmember2r" }, { - "voter": "edenmember1u", - "candidate": "edenmember15" + "voter": "edenmember2r", + "candidate": "edenmember2r" }, { - "voter": "edenmember2b", - "candidate": "edenmember15" + "voter": "edenmember2x", + "candidate": "edenmember2r" } ] } @@ -1305,25 +1191,25 @@ [ "election_event_report_group", { - "election_time": "2021-01-02T15:30:00.000", + "election_time": "2020-07-04T15:30:00.000", "round": 0, - "winner": "edenmember1g", + "winner": "edenmember1e", "votes": [ { - "voter": "edenmember3z", - "candidate": "edenmember1g" + "voter": "edenmember3c", + "candidate": "edenmember1e" }, { - "voter": "edenmember2x", - "candidate": "edenmember1g" + "voter": "edenmember34", + "candidate": "edenmember1e" }, { - "voter": "edenmember2y", - "candidate": "edenmember1g" + "voter": "edenmember1e", + "candidate": "edenmember1e" }, { "voter": "edenmember1g", - "candidate": "edenmember1g" + "candidate": "edenmember1e" } ] } @@ -1331,25 +1217,25 @@ [ "election_event_report_group", { - "election_time": "2021-01-02T15:30:00.000", + "election_time": "2020-07-04T15:30:00.000", "round": 0, - "winner": "edenmember2j", + "winner": "edenmember2a", "votes": [ { - "voter": "edenmember4b", - "candidate": "edenmember2j" + "voter": "edenmember2j", + "candidate": "edenmember2a" }, { - "voter": "edenmember2o", - "candidate": "edenmember2j" + "voter": "edenmember2h", + "candidate": "edenmember2a" }, { - "voter": "edenmember2j", - "candidate": "edenmember2j" + "voter": "edenmember2a", + "candidate": "edenmember2a" }, { - "voter": "edenmember34", - "candidate": "edenmember2j" + "voter": "edenmember3f", + "candidate": "edenmember2a" } ] } @@ -1357,25 +1243,25 @@ [ "election_event_report_group", { - "election_time": "2021-01-02T15:30:00.000", + "election_time": "2020-07-04T15:30:00.000", "round": 0, - "winner": "edenmember2a", + "winner": "edenmember1d", "votes": [ { - "voter": "edenmember44", - "candidate": "edenmember2a" + "voter": "edenmember1p", + "candidate": "edenmember1d" }, { - "voter": "edenmember2a", - "candidate": "edenmember2a" + "voter": "edenmember31", + "candidate": "edenmember1d" }, { - "voter": "edenmember2c", - "candidate": "edenmember2a" + "voter": "edenmember3i", + "candidate": "edenmember1d" }, { - "voter": "edenmember35", - "candidate": "edenmember2a" + "voter": "edenmember1d", + "candidate": "edenmember1d" } ] } @@ -1383,25 +1269,25 @@ [ "election_event_report_group", { - "election_time": "2021-01-02T15:30:00.000", + "election_time": "2020-07-04T15:30:00.000", "round": 0, - "winner": "edenmember2i", + "winner": "edenmember11", "votes": [ { - "voter": "edenmember2n", - "candidate": "edenmember2i" + "voter": "edenmember11", + "candidate": "edenmember11" }, { - "voter": "edenmember2i", - "candidate": "edenmember2i" + "voter": "edenmember42", + "candidate": "edenmember11" }, { - "voter": "edenmember2s", - "candidate": "edenmember2i" + "voter": "edenmember3r", + "candidate": "edenmember11" }, { - "voter": "edenmember3x", - "candidate": "edenmember2i" + "voter": "edenmember1r", + "candidate": "edenmember11" } ] } @@ -1409,24 +1295,24 @@ [ "election_event_report_group", { - "election_time": "2021-01-02T15:30:00.000", + "election_time": "2020-07-04T15:30:00.000", "round": 0, "winner": "edenmember14", "votes": [ { - "voter": "edenmember2q", + "voter": "edenmember1l", "candidate": "edenmember14" }, { - "voter": "edenmember1j", + "voter": "edenmember14", "candidate": "edenmember14" }, { - "voter": "edenmember3n", + "voter": "edenmember1w", "candidate": "edenmember14" }, { - "voter": "edenmember14", + "voter": "pip", "candidate": "edenmember14" } ] @@ -1435,25 +1321,25 @@ [ "election_event_report_group", { - "election_time": "2021-01-02T15:30:00.000", + "election_time": "2020-07-04T15:30:00.000", "round": 0, - "winner": "edenmember2r", + "winner": "edenmember1u", "votes": [ { - "voter": "edenmember2r", - "candidate": "edenmember2r" + "voter": "edenmember2c", + "candidate": "edenmember1u" }, { - "voter": "edenmember3y", - "candidate": "edenmember2r" + "voter": "edenmember2z", + "candidate": "edenmember1u" }, { - "voter": "edenmember3o", - "candidate": "edenmember2r" + "voter": "edenmember1u", + "candidate": "edenmember1u" }, { - "voter": "edenmember3t", - "candidate": "edenmember2r" + "voter": "edenmember2g", + "candidate": "edenmember1u" } ] } @@ -1461,14 +1347,14 @@ [ "election_event_end_round", { - "election_time": "2021-01-02T15:30:00.000", + "election_time": "2020-07-04T15:30:00.000", "round": 0 } ] [ "election_event_create_round", { - "election_time": "2021-01-02T15:30:00.000", + "election_time": "2020-07-04T15:30:00.000", "round": 1, "requires_voting": true, "num_participants": 25, @@ -1478,115 +1364,115 @@ [ "election_event_create_group", { - "election_time": "2021-01-02T15:30:00.000", + "election_time": "2020-07-04T15:30:00.000", "round": 1, "voters": [ - "edenmember1g", - "edenmember1p", + "edenmember11", + "edenmember1f", "edenmember1d", - "edenmember1q", - "edenmember1h" + "edenmember1i", + "edenmember2d" ] } ] [ "election_event_create_group", { - "election_time": "2021-01-02T15:30:00.000", + "election_time": "2020-07-04T15:30:00.000", "round": 1, "voters": [ - "edenmember11", "edenmember15", - "edenmember12", - "edenmember1s", - "edenmember24" + "alice", + "edenmember23", + "edenmember33", + "edenmember1a" ] } ] [ "election_event_create_group", { - "election_time": "2021-01-02T15:30:00.000", + "election_time": "2020-07-04T15:30:00.000", "round": 1, "voters": [ - "edenmember1f", - "edenmember1a", - "edenmember1n", "edenmember13", - "edenmember2i" + "edenmember12", + "edenmember1q", + "edenmember1u", + "edenmember1e" ] } ] [ "election_event_create_group", { - "election_time": "2021-01-02T15:30:00.000", + "election_time": "2020-07-04T15:30:00.000", "round": 1, "voters": [ + "edenmember14", + "edenmember1h", + "edenmember1k", "edenmember2r", - "edenmember1y", - "edenmember1m", - "edenmember2a", - "edenmember1l" + "edenmember1m" ] } ] [ "election_event_create_group", { - "election_time": "2021-01-02T15:30:00.000", + "election_time": "2020-07-04T15:30:00.000", "round": 1, "voters": [ - "edenmember1e", - "edenmember2j", - "edenmember14", - "alice", - "edenmember1i" + "edenmember1c", + "edenmember25", + "edenmember1o", + "edenmember1y", + "edenmember2a" ] } ] [ "election_event_begin_round_voting", { - "election_time": "2021-01-02T15:30:00.000", + "election_time": "2020-07-04T15:30:00.000", "round": 1, - "voting_begin": "2021-01-02T16:30:13.500", - "voting_end": "2021-01-02T17:30:13.500" + "voting_begin": "2020-07-04T16:30:13.500", + "voting_end": "2020-07-04T17:30:13.500" } ] [ "election_event_end_round_voting", { - "election_time": "2021-01-02T15:30:00.000", + "election_time": "2020-07-04T15:30:00.000", "round": 1 } ] [ "election_event_report_group", { - "election_time": "2021-01-02T15:30:00.000", + "election_time": "2020-07-04T15:30:00.000", "round": 1, - "winner": "edenmember1d", + "winner": "edenmember11", "votes": [ { - "voter": "edenmember1g", - "candidate": "edenmember1d" + "voter": "edenmember11", + "candidate": "edenmember11" }, { - "voter": "edenmember1p", - "candidate": "edenmember1d" + "voter": "edenmember1f", + "candidate": "edenmember11" }, { "voter": "edenmember1d", - "candidate": "edenmember1d" + "candidate": "edenmember11" }, - { - "voter": "edenmember1q", - "candidate": "edenmember1d" + { + "voter": "edenmember1i", + "candidate": "edenmember11" }, { - "voter": "edenmember1h", - "candidate": "edenmember1d" + "voter": "edenmember2d", + "candidate": "edenmember11" } ] } @@ -1594,29 +1480,29 @@ [ "election_event_report_group", { - "election_time": "2021-01-02T15:30:00.000", + "election_time": "2020-07-04T15:30:00.000", "round": 1, - "winner": "edenmember11", + "winner": "alice", "votes": [ { - "voter": "edenmember11", - "candidate": "edenmember11" + "voter": "edenmember15", + "candidate": "alice" }, { - "voter": "edenmember15", - "candidate": "edenmember11" + "voter": "alice", + "candidate": "alice" }, { - "voter": "edenmember12", - "candidate": "edenmember11" + "voter": "edenmember23", + "candidate": "alice" }, { - "voter": "edenmember1s", - "candidate": "edenmember11" + "voter": "edenmember33", + "candidate": "alice" }, { - "voter": "edenmember24", - "candidate": "edenmember11" + "voter": "edenmember1a", + "candidate": "alice" } ] } @@ -1624,29 +1510,29 @@ [ "election_event_report_group", { - "election_time": "2021-01-02T15:30:00.000", + "election_time": "2020-07-04T15:30:00.000", "round": 1, - "winner": "edenmember13", + "winner": "edenmember12", "votes": [ { - "voter": "edenmember1f", - "candidate": "edenmember13" + "voter": "edenmember13", + "candidate": "edenmember12" }, { - "voter": "edenmember1a", - "candidate": "edenmember13" + "voter": "edenmember12", + "candidate": "edenmember12" }, { - "voter": "edenmember1n", - "candidate": "edenmember13" + "voter": "edenmember1q", + "candidate": "edenmember12" }, { - "voter": "edenmember13", - "candidate": "edenmember13" + "voter": "edenmember1u", + "candidate": "edenmember12" }, { - "voter": "edenmember2i", - "candidate": "edenmember13" + "voter": "edenmember1e", + "candidate": "edenmember12" } ] } @@ -1654,29 +1540,29 @@ [ "election_event_report_group", { - "election_time": "2021-01-02T15:30:00.000", + "election_time": "2020-07-04T15:30:00.000", "round": 1, - "winner": "edenmember1l", + "winner": "edenmember14", "votes": [ { - "voter": "edenmember2r", - "candidate": "edenmember1l" + "voter": "edenmember14", + "candidate": "edenmember14" }, { - "voter": "edenmember1y", - "candidate": "edenmember1l" + "voter": "edenmember1h", + "candidate": "edenmember14" }, { - "voter": "edenmember1m", - "candidate": "edenmember1l" + "voter": "edenmember1k", + "candidate": "edenmember14" }, { - "voter": "edenmember2a", - "candidate": "edenmember1l" + "voter": "edenmember2r", + "candidate": "edenmember14" }, { - "voter": "edenmember1l", - "candidate": "edenmember1l" + "voter": "edenmember1m", + "candidate": "edenmember14" } ] } @@ -1684,29 +1570,29 @@ [ "election_event_report_group", { - "election_time": "2021-01-02T15:30:00.000", + "election_time": "2020-07-04T15:30:00.000", "round": 1, - "winner": "alice", + "winner": "edenmember1c", "votes": [ { - "voter": "edenmember1e", - "candidate": "alice" + "voter": "edenmember1c", + "candidate": "edenmember1c" }, { - "voter": "edenmember2j", - "candidate": "alice" + "voter": "edenmember25", + "candidate": "edenmember1c" }, { - "voter": "edenmember14", - "candidate": "alice" + "voter": "edenmember1o", + "candidate": "edenmember1c" }, { - "voter": "alice", - "candidate": "alice" + "voter": "edenmember1y", + "candidate": "edenmember1c" }, { - "voter": "edenmember1i", - "candidate": "alice" + "voter": "edenmember2a", + "candidate": "edenmember1c" } ] } @@ -1714,14 +1600,14 @@ [ "election_event_end_round", { - "election_time": "2021-01-02T15:30:00.000", + "election_time": "2020-07-04T15:30:00.000", "round": 1 } ] [ "election_event_create_round", { - "election_time": "2021-01-02T15:30:00.000", + "election_time": "2020-07-04T15:30:00.000", "round": 2, "requires_voting": false, "num_participants": 5, @@ -1731,93 +1617,93 @@ [ "election_event_create_group", { - "election_time": "2021-01-02T15:30:00.000", + "election_time": "2020-07-04T15:30:00.000", "round": 2, "voters": [ - "edenmember13", + "edenmember14", + "edenmember11", + "edenmember1c", "alice", - "edenmember1d", - "edenmember1l", - "edenmember11" + "edenmember12" ] } ] [ "election_event_begin_round_voting", { - "election_time": "2021-01-02T15:30:00.000", + "election_time": "2020-07-04T15:30:00.000", "round": 2, - "voting_begin": "2021-01-02T17:30:16.500", - "voting_end": "2021-01-02T19:30:16.500" + "voting_begin": "2020-07-04T17:30:16.500", + "voting_end": "2020-07-04T19:30:16.500" } ] [ "election_event_seeding", { - "election_time": "2021-01-02T15:30:00.000", - "start_time": "2021-01-02T17:30:16.500", - "end_time": "2021-01-02T19:30:16.500", + "election_time": "2020-07-04T15:30:00.000", + "start_time": "2020-07-04T17:30:16.500", + "end_time": "2020-07-04T19:30:16.500", "seed": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" } ] [ "election_event_seeding", { - "election_time": "2021-01-02T15:30:00.000", - "start_time": "2021-01-02T17:30:16.500", - "end_time": "2021-01-02T19:30:16.500", - "seed": "9FD11AF9710DAF0229ADB090582845910EB25DFAF877980DAC8ABFEEAF4874E5" + "election_time": "2020-07-04T15:30:00.000", + "start_time": "2020-07-04T17:30:16.500", + "end_time": "2020-07-04T19:30:16.500", + "seed": "0C240C2D7A1341B2BEAF7A6753C80A84E02F5B891BDB91AB9751519396FCA263" } ] [ "distribution_event_begin", { - "distribution_time": "2021-01-02T15:30:00.000", + "distribution_time": "2020-07-04T15:30:00.000", "rank_distribution": [ - "0.5287 EOS", - "2.6439 EOS", - "13.2220 EOS" + "0.9266 EOS", + "4.6333 EOS", + "0.0022 EOS" ] } ] [ "election_event_end_seeding", { - "election_time": "2021-01-02T15:30:00.000" + "election_time": "2020-07-04T15:30:00.000" } ] [ "election_event_end_round_voting", { - "election_time": "2021-01-02T15:30:00.000", + "election_time": "2020-07-04T15:30:00.000", "round": 2 } ] [ "election_event_report_group", { - "election_time": "2021-01-02T15:30:00.000", + "election_time": "2020-07-04T15:30:00.000", "round": 2, - "winner": "edenmember13", + "winner": "edenmember11", "votes": [ { - "voter": "edenmember13", + "voter": "edenmember14", "candidate": "" }, { - "voter": "alice", + "voter": "edenmember11", "candidate": "" }, { - "voter": "edenmember1d", + "voter": "edenmember1c", "candidate": "" }, { - "voter": "edenmember1l", + "voter": "alice", "candidate": "" }, { - "voter": "edenmember11", + "voter": "edenmember12", "candidate": "" } ] @@ -1826,615 +1712,615 @@ [ "election_event_end_round", { - "election_time": "2021-01-02T15:30:00.000", + "election_time": "2020-07-04T15:30:00.000", "round": 2 } ] [ "election_event_end", { - "election_time": "2021-01-02T15:30:00.000" + "election_time": "2020-07-04T15:30:00.000" } ] [ "election_event_schedule", { - "election_time": "2021-07-03T15:30:00.000", + "election_time": "2020-10-03T15:30:00.000", "election_threshold": 1000 } ] [ "distribution_event_reserve", { - "distribution_time": "2021-02-01T15:30:00.000", + "distribution_time": "2020-08-03T15:30:00.000", "pool": "master", - "target_amount": "37.6761 EOS" + "target_amount": "44.0170 EOS" } ] [ "distribution_event_begin", { - "distribution_time": "2021-02-01T15:30:00.000", + "distribution_time": "2020-08-03T15:30:00.000", "rank_distribution": [ - "0.5023 EOS", - "2.5117 EOS", - "12.5601 EOS" + "0.8803 EOS", + "4.4017 EOS", + "0.0010 EOS" ] } ] [ "distribution_event_schedule", { - "distribution_time": "2021-03-03T15:30:00.000" + "distribution_time": "2020-09-02T15:30:00.000" } ] [ "distribution_event_fund", { "owner": "alice", - "distribution_time": "2021-01-02T15:30:00.000", + "distribution_time": "2020-07-04T15:30:00.000", "rank": 1, - "balance": "0.5287 EOS" + "balance": "0.9266 EOS" } ] [ "distribution_event_fund", { "owner": "alice", - "distribution_time": "2021-01-02T15:30:00.000", + "distribution_time": "2020-07-04T15:30:00.000", "rank": 2, - "balance": "2.6439 EOS" + "balance": "4.6333 EOS" } ] [ "distribution_event_fund", { "owner": "edenmember11", - "distribution_time": "2021-01-02T15:30:00.000", + "distribution_time": "2020-07-04T15:30:00.000", "rank": 1, - "balance": "0.5287 EOS" + "balance": "0.9266 EOS" } ] [ "distribution_event_fund", { "owner": "edenmember11", - "distribution_time": "2021-01-02T15:30:00.000", + "distribution_time": "2020-07-04T15:30:00.000", "rank": 2, - "balance": "2.6439 EOS" + "balance": "4.6333 EOS" } ] [ "distribution_event_fund", { - "owner": "edenmember12", - "distribution_time": "2021-01-02T15:30:00.000", - "rank": 1, - "balance": "0.5287 EOS" + "owner": "edenmember11", + "distribution_time": "2020-07-04T15:30:00.000", + "rank": 3, + "balance": "0.0022 EOS" } ] [ "distribution_event_fund", { - "owner": "edenmember13", - "distribution_time": "2021-01-02T15:30:00.000", + "owner": "edenmember12", + "distribution_time": "2020-07-04T15:30:00.000", "rank": 1, - "balance": "0.5287 EOS" + "balance": "0.9266 EOS" } ] [ "distribution_event_fund", { - "owner": "edenmember13", - "distribution_time": "2021-01-02T15:30:00.000", + "owner": "edenmember12", + "distribution_time": "2020-07-04T15:30:00.000", "rank": 2, - "balance": "2.6439 EOS" + "balance": "4.6333 EOS" } ] [ "distribution_event_fund", { "owner": "edenmember13", - "distribution_time": "2021-01-02T15:30:00.000", - "rank": 3, - "balance": "13.2220 EOS" + "distribution_time": "2020-07-04T15:30:00.000", + "rank": 1, + "balance": "0.9266 EOS" } ] [ "distribution_event_fund", { "owner": "edenmember14", - "distribution_time": "2021-01-02T15:30:00.000", + "distribution_time": "2020-07-04T15:30:00.000", "rank": 1, - "balance": "0.5287 EOS" + "balance": "0.9266 EOS" + } +] +[ + "distribution_event_fund", + { + "owner": "edenmember14", + "distribution_time": "2020-07-04T15:30:00.000", + "rank": 2, + "balance": "4.6333 EOS" } ] [ "distribution_event_fund", { "owner": "edenmember15", - "distribution_time": "2021-01-02T15:30:00.000", + "distribution_time": "2020-07-04T15:30:00.000", "rank": 1, - "balance": "0.5287 EOS" + "balance": "0.9266 EOS" } ] [ "distribution_event_fund", { "owner": "edenmember1a", - "distribution_time": "2021-01-02T15:30:00.000", + "distribution_time": "2020-07-04T15:30:00.000", "rank": 1, - "balance": "0.5287 EOS" + "balance": "0.9266 EOS" } ] [ "distribution_event_fund", { - "owner": "edenmember1d", - "distribution_time": "2021-01-02T15:30:00.000", + "owner": "edenmember1c", + "distribution_time": "2020-07-04T15:30:00.000", "rank": 1, - "balance": "0.5287 EOS" + "balance": "0.9266 EOS" } ] [ "distribution_event_fund", { - "owner": "edenmember1d", - "distribution_time": "2021-01-02T15:30:00.000", + "owner": "edenmember1c", + "distribution_time": "2020-07-04T15:30:00.000", "rank": 2, - "balance": "2.6439 EOS" + "balance": "4.6333 EOS" } ] [ "distribution_event_fund", { - "owner": "edenmember1e", - "distribution_time": "2021-01-02T15:30:00.000", + "owner": "edenmember1d", + "distribution_time": "2020-07-04T15:30:00.000", "rank": 1, - "balance": "0.5287 EOS" + "balance": "0.9266 EOS" } ] [ "distribution_event_fund", { - "owner": "edenmember1f", - "distribution_time": "2021-01-02T15:30:00.000", + "owner": "edenmember1e", + "distribution_time": "2020-07-04T15:30:00.000", "rank": 1, - "balance": "0.5287 EOS" + "balance": "0.9266 EOS" } ] [ "distribution_event_fund", { - "owner": "edenmember1g", - "distribution_time": "2021-01-02T15:30:00.000", + "owner": "edenmember1f", + "distribution_time": "2020-07-04T15:30:00.000", "rank": 1, - "balance": "0.5287 EOS" + "balance": "0.9266 EOS" } ] [ "distribution_event_fund", { "owner": "edenmember1h", - "distribution_time": "2021-01-02T15:30:00.000", + "distribution_time": "2020-07-04T15:30:00.000", "rank": 1, - "balance": "0.5287 EOS" + "balance": "0.9266 EOS" } ] [ "distribution_event_fund", { "owner": "edenmember1i", - "distribution_time": "2021-01-02T15:30:00.000", + "distribution_time": "2020-07-04T15:30:00.000", "rank": 1, - "balance": "0.5287 EOS" + "balance": "0.9266 EOS" } ] [ "distribution_event_fund", { - "owner": "edenmember1l", - "distribution_time": "2021-01-02T15:30:00.000", + "owner": "edenmember1k", + "distribution_time": "2020-07-04T15:30:00.000", "rank": 1, - "balance": "0.5287 EOS" - } -] -[ - "distribution_event_fund", - { - "owner": "edenmember1l", - "distribution_time": "2021-01-02T15:30:00.000", - "rank": 2, - "balance": "2.6439 EOS" + "balance": "0.9266 EOS" } ] [ "distribution_event_fund", { "owner": "edenmember1m", - "distribution_time": "2021-01-02T15:30:00.000", + "distribution_time": "2020-07-04T15:30:00.000", "rank": 1, - "balance": "0.5287 EOS" + "balance": "0.9266 EOS" } ] [ "distribution_event_fund", { - "owner": "edenmember1n", - "distribution_time": "2021-01-02T15:30:00.000", + "owner": "edenmember1o", + "distribution_time": "2020-07-04T15:30:00.000", "rank": 1, - "balance": "0.5287 EOS" + "balance": "0.9266 EOS" } ] [ "distribution_event_fund", { - "owner": "edenmember1p", - "distribution_time": "2021-01-02T15:30:00.000", + "owner": "edenmember1q", + "distribution_time": "2020-07-04T15:30:00.000", "rank": 1, - "balance": "0.5287 EOS" + "balance": "0.9266 EOS" } ] [ "distribution_event_fund", { - "owner": "edenmember1q", - "distribution_time": "2021-01-02T15:30:00.000", + "owner": "edenmember1u", + "distribution_time": "2020-07-04T15:30:00.000", "rank": 1, - "balance": "0.5287 EOS" + "balance": "0.9266 EOS" } ] [ "distribution_event_fund", { - "owner": "edenmember1s", - "distribution_time": "2021-01-02T15:30:00.000", + "owner": "edenmember1y", + "distribution_time": "2020-07-04T15:30:00.000", "rank": 1, - "balance": "0.5287 EOS" + "balance": "0.9266 EOS" } ] [ "distribution_event_fund", { - "owner": "edenmember1y", - "distribution_time": "2021-01-02T15:30:00.000", + "owner": "edenmember23", + "distribution_time": "2020-07-04T15:30:00.000", "rank": 1, - "balance": "0.5287 EOS" + "balance": "0.9266 EOS" } ] [ "distribution_event_fund", { - "owner": "edenmember24", - "distribution_time": "2021-01-02T15:30:00.000", + "owner": "edenmember25", + "distribution_time": "2020-07-04T15:30:00.000", "rank": 1, - "balance": "0.5287 EOS" + "balance": "0.9266 EOS" } ] [ "distribution_event_fund", { "owner": "edenmember2a", - "distribution_time": "2021-01-02T15:30:00.000", + "distribution_time": "2020-07-04T15:30:00.000", "rank": 1, - "balance": "0.5287 EOS" + "balance": "0.9266 EOS" } ] [ "distribution_event_fund", { - "owner": "edenmember2i", - "distribution_time": "2021-01-02T15:30:00.000", + "owner": "edenmember2d", + "distribution_time": "2020-07-04T15:30:00.000", "rank": 1, - "balance": "0.5287 EOS" + "balance": "0.9266 EOS" } ] [ "distribution_event_fund", { - "owner": "edenmember2j", - "distribution_time": "2021-01-02T15:30:00.000", + "owner": "edenmember2r", + "distribution_time": "2020-07-04T15:30:00.000", "rank": 1, - "balance": "0.5287 EOS" + "balance": "0.9266 EOS" } ] [ "distribution_event_fund", { - "owner": "edenmember2r", - "distribution_time": "2021-01-02T15:30:00.000", + "owner": "edenmember33", + "distribution_time": "2020-07-04T15:30:00.000", "rank": 1, - "balance": "0.5287 EOS" + "balance": "0.9266 EOS" } ] [ "distribution_event_end", { - "distribution_time": "2021-01-02T15:30:00.000" + "distribution_time": "2020-07-04T15:30:00.000" } ] [ "distribution_event_fund", { "owner": "alice", - "distribution_time": "2021-02-01T15:30:00.000", + "distribution_time": "2020-08-03T15:30:00.000", "rank": 1, - "balance": "0.5023 EOS" + "balance": "0.8803 EOS" } ] [ "distribution_event_fund", { "owner": "alice", - "distribution_time": "2021-02-01T15:30:00.000", + "distribution_time": "2020-08-03T15:30:00.000", "rank": 2, - "balance": "2.5117 EOS" + "balance": "4.4017 EOS" } ] [ "distribution_event_fund", { "owner": "edenmember11", - "distribution_time": "2021-02-01T15:30:00.000", + "distribution_time": "2020-08-03T15:30:00.000", "rank": 1, - "balance": "0.5023 EOS" + "balance": "0.8803 EOS" } ] [ "distribution_event_fund", { "owner": "edenmember11", - "distribution_time": "2021-02-01T15:30:00.000", + "distribution_time": "2020-08-03T15:30:00.000", "rank": 2, - "balance": "2.5117 EOS" + "balance": "4.4017 EOS" } ] [ "distribution_event_fund", { - "owner": "edenmember12", - "distribution_time": "2021-02-01T15:30:00.000", - "rank": 1, - "balance": "0.5023 EOS" + "owner": "edenmember11", + "distribution_time": "2020-08-03T15:30:00.000", + "rank": 3, + "balance": "0.0010 EOS" } ] [ "distribution_event_fund", { - "owner": "edenmember13", - "distribution_time": "2021-02-01T15:30:00.000", + "owner": "edenmember12", + "distribution_time": "2020-08-03T15:30:00.000", "rank": 1, - "balance": "0.5023 EOS" + "balance": "0.8803 EOS" } ] [ "distribution_event_fund", { - "owner": "edenmember13", - "distribution_time": "2021-02-01T15:30:00.000", + "owner": "edenmember12", + "distribution_time": "2020-08-03T15:30:00.000", "rank": 2, - "balance": "2.5117 EOS" + "balance": "4.4017 EOS" } ] [ "distribution_event_fund", { "owner": "edenmember13", - "distribution_time": "2021-02-01T15:30:00.000", - "rank": 3, - "balance": "12.5601 EOS" + "distribution_time": "2020-08-03T15:30:00.000", + "rank": 1, + "balance": "0.8803 EOS" } ] [ "distribution_event_fund", { "owner": "edenmember14", - "distribution_time": "2021-02-01T15:30:00.000", + "distribution_time": "2020-08-03T15:30:00.000", "rank": 1, - "balance": "0.5023 EOS" + "balance": "0.8803 EOS" + } +] +[ + "distribution_event_fund", + { + "owner": "edenmember14", + "distribution_time": "2020-08-03T15:30:00.000", + "rank": 2, + "balance": "4.4017 EOS" } ] [ "distribution_event_fund", { "owner": "edenmember15", - "distribution_time": "2021-02-01T15:30:00.000", + "distribution_time": "2020-08-03T15:30:00.000", "rank": 1, - "balance": "0.5023 EOS" + "balance": "0.8803 EOS" } ] [ "distribution_event_fund", { "owner": "edenmember1a", - "distribution_time": "2021-02-01T15:30:00.000", + "distribution_time": "2020-08-03T15:30:00.000", "rank": 1, - "balance": "0.5023 EOS" + "balance": "0.8803 EOS" } ] [ "distribution_event_fund", { - "owner": "edenmember1d", - "distribution_time": "2021-02-01T15:30:00.000", + "owner": "edenmember1c", + "distribution_time": "2020-08-03T15:30:00.000", "rank": 1, - "balance": "0.5023 EOS" + "balance": "0.8803 EOS" } ] [ "distribution_event_fund", { - "owner": "edenmember1d", - "distribution_time": "2021-02-01T15:30:00.000", + "owner": "edenmember1c", + "distribution_time": "2020-08-03T15:30:00.000", "rank": 2, - "balance": "2.5117 EOS" + "balance": "4.4017 EOS" } ] [ "distribution_event_fund", { - "owner": "edenmember1e", - "distribution_time": "2021-02-01T15:30:00.000", + "owner": "edenmember1d", + "distribution_time": "2020-08-03T15:30:00.000", "rank": 1, - "balance": "0.5023 EOS" + "balance": "0.8803 EOS" } ] [ "distribution_event_fund", { - "owner": "edenmember1f", - "distribution_time": "2021-02-01T15:30:00.000", + "owner": "edenmember1e", + "distribution_time": "2020-08-03T15:30:00.000", "rank": 1, - "balance": "0.5023 EOS" + "balance": "0.8803 EOS" } ] [ "distribution_event_fund", { - "owner": "edenmember1g", - "distribution_time": "2021-02-01T15:30:00.000", + "owner": "edenmember1f", + "distribution_time": "2020-08-03T15:30:00.000", "rank": 1, - "balance": "0.5023 EOS" + "balance": "0.8803 EOS" } ] [ "distribution_event_fund", { "owner": "edenmember1h", - "distribution_time": "2021-02-01T15:30:00.000", + "distribution_time": "2020-08-03T15:30:00.000", "rank": 1, - "balance": "0.5023 EOS" + "balance": "0.8803 EOS" } ] [ "distribution_event_fund", { "owner": "edenmember1i", - "distribution_time": "2021-02-01T15:30:00.000", + "distribution_time": "2020-08-03T15:30:00.000", "rank": 1, - "balance": "0.5023 EOS" + "balance": "0.8803 EOS" } ] [ "distribution_event_fund", { - "owner": "edenmember1l", - "distribution_time": "2021-02-01T15:30:00.000", + "owner": "edenmember1k", + "distribution_time": "2020-08-03T15:30:00.000", "rank": 1, - "balance": "0.5023 EOS" - } -] -[ - "distribution_event_fund", - { - "owner": "edenmember1l", - "distribution_time": "2021-02-01T15:30:00.000", - "rank": 2, - "balance": "2.5117 EOS" + "balance": "0.8803 EOS" } ] [ "distribution_event_fund", { "owner": "edenmember1m", - "distribution_time": "2021-02-01T15:30:00.000", + "distribution_time": "2020-08-03T15:30:00.000", "rank": 1, - "balance": "0.5023 EOS" + "balance": "0.8803 EOS" } ] [ "distribution_event_fund", { - "owner": "edenmember1n", - "distribution_time": "2021-02-01T15:30:00.000", + "owner": "edenmember1o", + "distribution_time": "2020-08-03T15:30:00.000", "rank": 1, - "balance": "0.5023 EOS" + "balance": "0.8803 EOS" } ] [ "distribution_event_fund", { - "owner": "edenmember1p", - "distribution_time": "2021-02-01T15:30:00.000", + "owner": "edenmember1q", + "distribution_time": "2020-08-03T15:30:00.000", "rank": 1, - "balance": "0.5023 EOS" + "balance": "0.8803 EOS" } ] [ "distribution_event_fund", { - "owner": "edenmember1q", - "distribution_time": "2021-02-01T15:30:00.000", + "owner": "edenmember1u", + "distribution_time": "2020-08-03T15:30:00.000", "rank": 1, - "balance": "0.5023 EOS" + "balance": "0.8803 EOS" } ] [ "distribution_event_fund", { - "owner": "edenmember1s", - "distribution_time": "2021-02-01T15:30:00.000", + "owner": "edenmember1y", + "distribution_time": "2020-08-03T15:30:00.000", "rank": 1, - "balance": "0.5023 EOS" + "balance": "0.8803 EOS" } ] [ "distribution_event_fund", { - "owner": "edenmember1y", - "distribution_time": "2021-02-01T15:30:00.000", + "owner": "edenmember23", + "distribution_time": "2020-08-03T15:30:00.000", "rank": 1, - "balance": "0.5023 EOS" + "balance": "0.8803 EOS" } ] [ "distribution_event_fund", { - "owner": "edenmember24", - "distribution_time": "2021-02-01T15:30:00.000", + "owner": "edenmember25", + "distribution_time": "2020-08-03T15:30:00.000", "rank": 1, - "balance": "0.5023 EOS" + "balance": "0.8803 EOS" } ] [ "distribution_event_fund", { "owner": "edenmember2a", - "distribution_time": "2021-02-01T15:30:00.000", + "distribution_time": "2020-08-03T15:30:00.000", "rank": 1, - "balance": "0.5023 EOS" + "balance": "0.8803 EOS" } ] [ "distribution_event_fund", { - "owner": "edenmember2i", - "distribution_time": "2021-02-01T15:30:00.000", + "owner": "edenmember2d", + "distribution_time": "2020-08-03T15:30:00.000", "rank": 1, - "balance": "0.5023 EOS" + "balance": "0.8803 EOS" } ] [ "distribution_event_fund", { - "owner": "edenmember2j", - "distribution_time": "2021-02-01T15:30:00.000", + "owner": "edenmember2r", + "distribution_time": "2020-08-03T15:30:00.000", "rank": 1, - "balance": "0.5023 EOS" + "balance": "0.8803 EOS" } ] [ "distribution_event_fund", { - "owner": "edenmember2r", - "distribution_time": "2021-02-01T15:30:00.000", + "owner": "edenmember33", + "distribution_time": "2020-08-03T15:30:00.000", "rank": 1, - "balance": "0.5023 EOS" + "balance": "0.8803 EOS" } ] [ "distribution_event_end", { - "distribution_time": "2021-02-01T15:30:00.000" + "distribution_time": "2020-08-03T15:30:00.000" } ] diff --git a/contracts/eden/tests/include/tester-base.hpp b/contracts/eden/tests/include/tester-base.hpp index e8fc22e3c..33d121322 100644 --- a/contracts/eden/tests/include/tester-base.hpp +++ b/contracts/eden/tests/include/tester-base.hpp @@ -1,6 +1,7 @@ #pragma once #include +#include #include #include #include @@ -209,6 +210,8 @@ struct eden_tester user_context bertie = chain.as("bertie"_n); user_context ahab = chain.as("ahab"_n); + user_context organization = chain.as("orgint.rep"_n); + explicit eden_tester(std::function f = [] {}) { chain_setup(chain); @@ -217,6 +220,7 @@ struct eden_tester f(); eden_setup(chain); chain.create_account("payer"_n); + chain.create_account("orgint.rep"_n); for (auto account : {"alice"_n, "pip"_n, "egeon"_n, "bertie"_n, "ahab"_n}) { chain.create_account(account); @@ -239,9 +243,9 @@ struct eden_tester pip.act(2, pip_profile); egeon.act(3, egeon_profile); - alice.act("alice"_n, "eden.gm"_n, s2a("100.0000 EOS"), "memo"); + alice.act("alice"_n, "eden.gm"_n, s2a("10.0000 EOS"), "memo"); pip.act("pip"_n, "eden.gm"_n, s2a("10.0000 EOS"), "memo"); - egeon.act("egeon"_n, "eden.gm"_n, s2a("10.0000 EOS"), "memo"); + egeon.act("egeon"_n, "eden.gm"_n, s2a("100.0000 EOS"), "memo"); alice.act("alice"_n, 1, s2a("10.0000 EOS")); pip.act("pip"_n, 2, s2a("10.0000 EOS")); @@ -259,6 +263,11 @@ struct eden_tester } } + void set_minimum_donation_fee(eosio::asset amount) + { + eden_gm.act(amount); + } + auto hash_induction(const std::string& video, const eden::new_member_profile& profile) { auto hash_data = eosio::convert_to_bin(std::tuple(video, profile)); @@ -268,7 +277,8 @@ struct eden_tester void finish_induction(uint64_t induction_id, eosio::name inviter, eosio::name invitee, - const std::vector& witnesses) + const std::vector& witnesses, + bool with_minimum_donation = false) { chain.as(invitee).act(invitee, "eden.gm"_n, s2a("10.0000 EOS"), "memo"); @@ -289,24 +299,25 @@ struct eden_tester { chain.as(witness).act(witness, induction_id, induction_hash); } - chain.as(invitee).act(invitee, induction_id, s2a("10.0000 EOS")); + chain.as(invitee).act( + invitee, induction_id, s2a(!with_minimum_donation ? "10.0000 EOS" : "3.0000 EOS")); CHECK(get_eden_membership(invitee).status() == eden::member_status::active_member); }; - void induct(eosio::name account) + void induct(eosio::name account, bool with_minimum_donation = false) { alice.act(42, "alice"_n, account, std::vector{"pip"_n, "egeon"_n}); - finish_induction(42, "alice"_n, account, {"pip"_n, "egeon"_n}); + finish_induction(42, "alice"_n, account, {"pip"_n, "egeon"_n}, with_minimum_donation); } - void induct_n(std::size_t count) + void induct_n(std::size_t count, bool with_minimum_donation = false) { auto members = make_names(count); create_accounts(members); for (auto a : members) { chain.start_block(); - induct(a); + induct(a, with_minimum_donation); } } @@ -497,6 +508,26 @@ struct eden_tester return get_total_balance(distributions); }; + template + eden::current_distribution get_rank_balance(const T& table) + { + eden::current_distribution result; + for (auto item : table) + { + if (auto* current = std::get_if(&item.value)) + { + return *current; + } + } + return result; + } + + eden::current_distribution get_rank_budget() + { + eden::distribution_table_type distributions{"eden.gm"_n, eden::default_scope}; + return get_rank_balance(distributions); + }; + auto get_budgets_by_period() const { std::map result; @@ -509,6 +540,30 @@ struct eden_tester return result; }; + auto get_badges() const + { + std::vector result; + eden::badge_table_type badges{"eden.gm"_n, eden::default_scope}; + for (auto t : badges) + { + result.push_back(t.account()); + } + return result; + }; + + uint8_t get_pool_ptc(eosio::name pool) const + { + eden::pool_table_type pool_tb("eden.gm"_n, eden::default_scope); + auto pool_iter = pool_tb.find(pool.value); + + if (pool_iter != pool_tb.end()) + { + return pool_iter->monthly_distribution_pct(); + } + + return 0; + }; + /* void newsession(eosio::name authorizer, eosio::name eden_account, diff --git a/contracts/eden/tests/test-eden.cpp b/contracts/eden/tests/test-eden.cpp index 21936440a..d401b1dbd 100644 --- a/contracts/eden/tests/test-eden.cpp +++ b/contracts/eden/tests/test-eden.cpp @@ -72,11 +72,13 @@ struct CompareFile for (auto& ttrace : history->traces) { std::visit( - [&](auto& ttrace) { + [&](auto& ttrace) + { for (auto& atrace : ttrace.action_traces) { std::visit( - [&](auto& atrace) { + [&](auto& atrace) + { if (atrace.receiver == "eosio.null"_n && atrace.act.name == "eden.events"_n) { @@ -435,7 +437,8 @@ TEST_CASE("induction") "alice"_n, 4, eosio::sha256(hash_data.data(), hash_data.size() - 1)), "Outdated endorsement"); - auto endorse_all = [&] { + auto endorse_all = [&] + { t.alice.act("alice"_n, 4, induction_hash); t.pip.act("pip"_n, 4, induction_hash); t.egeon.act("egeon"_n, 4, induction_hash); @@ -463,6 +466,16 @@ TEST_CASE("induction") CHECK(get_table_size("induction"_n) == 0); } +TEST_CASE("induction with minimun donation fee") +{ + eden_tester t; + t.genesis(); + t.set_minimum_donation_fee(s2a("3.0000 EOS")); + + CHECK(get_globals().minimum_donation == s2a("3.0000 EOS")); + t.induct_n(4, true); +} + TEST_CASE("resignation") { eden_tester t; @@ -482,25 +495,37 @@ TEST_CASE("board resignation") t.pip.act("pip"_n); } +TEST_CASE("remove member by active signature") +{ + eden_tester t; + t.genesis(); + t.run_election(); + CHECK(get_table_size() == 3); + expect(t.egeon.trace("egeon"_n, "bad actions"), + "Missing required authority"); + t.eden_gm.act("alice"_n, "bad actions"); + CHECK(get_table_size() == 2); +} + TEST_CASE("renaming") { eden_tester t; t.genesis(); auto distribution_time = t.next_election_time(); t.run_election(); - t.alice.act(100); - t.alice.act("alice"_n, distribution_time, 1, "alice"_n, s2a("0.0001 EOS"), + t.egeon.act(100); + t.egeon.act("egeon"_n, distribution_time, 1, "egeon"_n, s2a("0.0001 EOS"), ""); test_chain::user_context{t.chain, {{"eden.gm"_n, "board.major"_n}, {"ahab"_n, "active"_n}}} - .act("alice"_n, "ahab"_n); + .act("egeon"_n, "ahab"_n); - expect(t.alice.trace("alice"_n, s2a("0.0001 EOS")), "insufficient balance"); + expect(t.egeon.trace("egeon"_n, s2a("0.0001 EOS")), "insufficient balance"); t.ahab.act("ahab"_n, s2a("0.0001 EOS")); t.chain.start_block(); - expect(t.alice.trace("alice"_n, distribution_time, 1, "alice"_n, + expect(t.egeon.trace("egeon"_n, distribution_time, 1, "egeon"_n, s2a("0.0001 EOS"), ""), - "member alice not found"); + "member egeon not found"); t.ahab.act("ahab"_n, distribution_time, 1, "ahab"_n, s2a("0.0001 EOS"), ""); @@ -723,7 +748,8 @@ TEST_CASE("deposit and spend") TEST_CASE("election config") { - auto verify_cfg = [](const auto& config, uint16_t num_participants) { + auto verify_cfg = [](const auto& config, uint16_t num_participants) + { INFO("participants: " << num_participants) if (num_participants < 1) { @@ -770,13 +796,13 @@ TEST_CASE("election") { eden::current_election_state_singleton state("eden.gm"_n, eden::default_scope); auto current = std::get(state.get()); - CHECK(eosio::convert_to_json(current.start_time) == "\"2020-07-04T15:30:00.000\""); + CHECK(eosio::convert_to_json(current.start_time) == "\"2020-04-04T15:30:00.000\""); } - t.skip_to("2020-07-03T15:29:59.500"); - t.electseed(eosio::time_point_sec(0x5f009260u), "Cannot start seeding yet"); + t.skip_to("2020-04-03T15:29:59.500"); + t.electseed(eosio::time_point_sec(0x5e883068u), "Cannot start seeding yet"); t.chain.start_block(); - t.electseed(eosio::time_point_sec(0x5f009260u)); - t.skip_to("2020-07-04T15:29:59.500"); + t.electseed(eosio::time_point_sec(0x5e883068u)); + t.skip_to("2020-04-04T15:29:59.500"); expect(t.alice.trace(1), "Seeding window is still open"); t.chain.start_block(); t.setup_election(); @@ -784,7 +810,7 @@ TEST_CASE("election") eden::election_state_singleton results("eden.gm"_n, eden::default_scope); auto result = std::get(results.get()); // This is likely to change as it depends on the exact random number algorithm and seed - CHECK(result.lead_representative == "egeon"_n); + CHECK(result.lead_representative == "pip"_n); std::sort(result.board.begin(), result.board.end()); CHECK(result.board == std::vector{"alice"_n, "egeon"_n, "pip"_n}); } @@ -809,29 +835,29 @@ TEST_CASE("mid-election induction") t.electdonate_all(); SECTION("pre-registration") { - t.skip_to("2020-06-04T15:29:59.500"); + t.skip_to("2020-03-04T15:29:59.500"); has_bertie = true; t.induct("bertie"_n); } SECTION("registration") { - t.skip_to("2020-06-04T15:30:00.000"); + t.skip_to("2020-03-04T15:30:00.000"); has_bertie = true; t.induct("bertie"_n); } - t.skip_to("2020-07-03T15:30:00.000"); + t.skip_to("2020-04-03T15:30:00.000"); SECTION("pre-seed") { has_bertie = true; t.induct("bertie"_n); } - t.electseed(s2t("2020-07-03T15:30:00.000")); + t.electseed(s2t("2020-04-03T15:30:00.000")); SECTION("post-seed") { has_bertie = true; t.induct("bertie"_n); } - t.skip_to("2020-07-04T15:30:00.000"); + t.skip_to("2020-04-04T15:30:00.000"); for (int i = 0;; ++i) { DYNAMIC_SECTION("electprocess" << i) @@ -941,44 +967,45 @@ TEST_CASE("budget distribution") t.set_balance(s2a("36.0000 EOS")); t.run_election(); - t.alice.act(250); + t.egeon.act(250); CHECK(t.get_total_budget() == s2a("1.8000 EOS")); // Skip forward to the next distribution - t.skip_to("2020-08-03T15:29:59.500"); - expect(t.alice.trace(250), "Nothing to do"); + t.skip_to("2020-05-04T15:29:59.500"); + expect(t.egeon.trace(250), "Nothing to do"); t.chain.start_block(); - t.alice.act(250); + t.egeon.act(250); CHECK(t.get_total_budget() == s2a("3.5100 EOS")); // Skip into the next election - t.skip_to("2021-01-02T15:30:00.000"); - t.alice.act(1); - t.alice.act(5000); - CHECK(t.get_total_budget() == s2a("10.9435 EOS")); + t.skip_to("2020-07-04T15:30:00.000"); + t.egeon.act(1); + t.egeon.act(5000); + CHECK(t.get_total_budget() == s2a("6.7266 EOS")); - expect(t.alice.trace("alice"_n, s2t("2020-07-04T15:30:00.000"), 1, - "egeon"_n, s2a("1.8001 EOS"), "memo"), + expect(t.egeon.trace("egeon"_n, s2t("2020-04-04T15:30:00.000"), 1, + "alice"_n, s2a("1.8001 EOS"), "memo"), "insufficient balance"); - expect(t.alice.trace("alice"_n, s2t("2020-07-04T15:30:00.000"), 1, - "egeon"_n, s2a("-1.0000 EOS"), "memo"), + expect(t.egeon.trace("egeon"_n, s2t("2020-04-04T15:30:00.000"), 1, + "alice"_n, s2a("-1.0000 EOS"), "memo"), "amount must be positive"); - expect(t.alice.trace("alice"_n, s2t("2020-07-04T15:30:00.000"), 1, + expect(t.egeon.trace("egeon"_n, s2t("2020-04-04T15:30:00.000"), 1, "ahab"_n, s2a("1.0000 EOS"), "memo"), "member ahab not found"); - t.alice.act("alice"_n, s2t("2020-07-04T15:30:00.000"), 1, "egeon"_n, + t.egeon.act("egeon"_n, s2t("2020-04-04T15:30:00.000"), 1, "alice"_n, s2a("1.8000 EOS"), "memo"); - CHECK(get_eden_account("egeon"_n)->balance() == s2a("1.8000 EOS")); - expect(t.alice.trace("alice"_n, "ahab"_n, s2a("10.0000 EOS"), "memo"), + CHECK(get_eden_account("alice"_n)->balance() == s2a("1.8000 EOS")); + + expect(t.egeon.trace("egeon"_n, "ahab"_n, s2a("10.0000 EOS"), "memo"), "member ahab not found"); t.ahab.act("ahab"_n, "eden.gm"_n, s2a("10.0000 EOS"), "memo"); - expect(t.ahab.trace("ahab"_n, "egeon"_n, s2a("10.0000 EOS"), "memo"), + expect(t.ahab.trace("ahab"_n, "alice"_n, s2a("10.0000 EOS"), "memo"), "member ahab not found"); - expect(t.alice.trace("alice"_n, "egeon"_n, s2a("-1.0000 EOS"), "memo"), + expect(t.egeon.trace("egeon"_n, "alice"_n, s2a("-1.0000 EOS"), "memo"), "amount must be positive"); - t.alice.act("alice"_n, "egeon"_n, s2a("10.0000 EOS"), "memo"); - CHECK(get_eden_account("egeon"_n)->balance() == s2a("11.8000 EOS")); - CHECK(get_eden_account("alice"_n)->balance() == s2a("80.0000 EOS")); + t.egeon.act("egeon"_n, "alice"_n, s2a("10.0000 EOS"), "memo"); + CHECK(get_eden_account("egeon"_n)->balance() == s2a("80.0000 EOS")); + CHECK(get_eden_account("alice"_n)->balance() == s2a("11.8000 EOS")); CHECK(get_eden_account("ahab"_n)->balance() == s2a("10.0000 EOS")); } @@ -991,21 +1018,21 @@ TEST_CASE("budget distribution triggered by donation") t.run_election(); t.distribute(1); CHECK(t.get_total_budget() == s2a("5.0000 EOS")); - t.skip_to("2020-08-03T15:29:59.500"); + t.skip_to("2020-05-03T15:29:59.500"); t.set_balance(s2a("100.0000 EOS")); t.chain.start_block(); CHECK(t.get_total_budget() == s2a("5.0000 EOS")); t.eosio_token.act("eosio.token"_n, "eden.gm"_n, s2a("5.0000 EOS"), "memo"); - CHECK(t.get_total_budget() == s2a("10.0000 EOS")); - t.skip_to("2020-09-02T15:30:00.0000"); + CHECK(t.get_total_budget() == s2a("5.0000 EOS")); + t.skip_to("2020-06-02T15:30:00.0000"); t.eosio_token.act("eosio.token"_n, "eden.gm"_n, s2a("5.0000 EOS"), "memo"); - CHECK(t.get_total_budget() == s2a("15.0000 EOS")); - t.skip_to("2020-10-02T15:30:00.0000"); + CHECK(t.get_total_budget() == s2a("10.2500 EOS")); + t.skip_to("2020-07-02T15:30:00.0000"); t.eosio_token.act("eosio.token"_n, "eden.gm"_n, s2a("5.0000 EOS"), "memo"); - CHECK(t.get_total_budget() == s2a("20.0000 EOS")); + CHECK(t.get_total_budget() == s2a("15.4875 EOS")); } TEST_CASE("budget distribution minimum period") @@ -1015,14 +1042,14 @@ TEST_CASE("budget distribution minimum period") t.set_balance(s2a("36.0000 EOS")); t.run_election(); t.set_balance(s2a("100000.0000 EOS")); - t.eden_gm.act(s2t("2020-09-02T15:30:01.000")); + t.eden_gm.act(s2t("2020-06-03T15:30:01.000")); t.electdonate_all(); t.run_election(); std::map expected{ - {s2t("2020-07-04T15:30:00.000"), s2a("1.8000 EOS")}, - {s2t("2020-08-03T15:30:00.000"), s2a("5000.0000 EOS")}, - {s2t("2020-09-02T15:30:00.000"), s2a("0.0018 EOS")}, - {s2t("2020-09-02T15:30:01.000"), s2a("4749.9999 EOS")}}; + {s2t("2020-04-04T15:30:00.000"), s2a("1.8000 EOS")}, + {s2t("2020-05-04T15:30:00.000"), s2a("5000.0000 EOS")}, + {s2t("2020-06-03T15:30:00.000"), s2a("0.0018 EOS")}, + {s2t("2020-06-03T15:30:01.000"), s2a("4749.9999 EOS")}}; CHECK(t.get_budgets_by_period() == expected); } @@ -1033,12 +1060,12 @@ TEST_CASE("budget distribution exact") t.set_balance(s2a("36.0000 EOS")); t.run_election(); t.set_balance(s2a("1000.0000 EOS")); - t.eden_gm.act(s2t("2020-09-02T15:30:00.000")); + t.eden_gm.act(s2t("2020-06-03T15:30:00.000")); t.run_election(); std::map expected{ - {s2t("2020-07-04T15:30:00.000"), s2a("1.8000 EOS")}, - {s2t("2020-08-03T15:30:00.000"), s2a("50.0000 EOS")}, - {s2t("2020-09-02T15:30:00.000"), s2a("47.5000 EOS")}}; + {s2t("2020-04-04T15:30:00.000"), s2a("1.8000 EOS")}, + {s2t("2020-05-04T15:30:00.000"), s2a("50.0000 EOS")}, + {s2t("2020-06-03T15:30:00.000"), s2a("47.5000 EOS")}}; CHECK(t.get_budgets_by_period() == expected); } @@ -1049,12 +1076,12 @@ TEST_CASE("budget distribution underflow") t.set_balance(s2a("36.0000 EOS")); t.run_election(); t.set_balance(s2a("1000.0000 EOS")); - t.eden_gm.act(s2t("2020-09-02T15:30:01.000")); + t.eden_gm.act(s2t("2020-06-03T15:30:01.000")); t.run_election(); std::map expected{ - {s2t("2020-07-04T15:30:00.000"), s2a("1.8000 EOS")}, - {s2t("2020-08-03T15:30:00.000"), s2a("50.0000 EOS")}, - {s2t("2020-09-02T15:30:01.000"), s2a("47.5000 EOS")}}; + {s2t("2020-04-04T15:30:00.000"), s2a("1.8000 EOS")}, + {s2t("2020-05-04T15:30:00.000"), s2a("50.0000 EOS")}, + {s2t("2020-06-03T15:30:01.000"), s2a("47.5000 EOS")}}; CHECK(t.get_budgets_by_period() == expected); } @@ -1091,12 +1118,12 @@ TEST_CASE("budget adjustment on resignation") t.set_balance(s2a("36.0000 EOS")); t.run_election(); t.set_balance(s2a("1000.0000 EOS")); - t.skip_to("2020-09-02T15:30:00.000"); - // alice is satoshi, and receives the whole budget - t.alice.act("alice"_n); + t.skip_to("2020-05-04T15:30:00.000"); + // egeon is satoshi, and receives the whole budget + t.egeon.act("egeon"_n); std::map expected{}; CHECK(t.get_budgets_by_period() == expected); - t.skip_to("2020-10-02T15:30:00.000"); + t.skip_to("2020-06-05T15:30:00.000"); t.distribute(); CHECK(t.get_budgets_by_period() == expected); CHECK(accounts{"eden.gm"_n, "owned"_n}.get_account("master"_n)->balance() == @@ -1117,20 +1144,98 @@ TEST_CASE("multi budget adjustment on resignation") t.set_balance(s2a("1236.0000 EOS")); t.run_election(); t.set_balance(s2a("10000.0000 EOS")); - t.skip_to("2020-09-02T15:30:00.000"); + t.skip_to("2020-06-03T15:30:00.000"); auto lead_representative = std::get( eden::election_state_singleton{"eden.gm"_n, eden::default_scope}.get()) .lead_representative; t.chain.as(lead_representative).act(lead_representative); std::map expected{ - {s2t("2020-07-04T15:30:00.000"), s2a("36.2560 EOS")}, - {s2t("2020-08-03T15:30:00.000"), s2a("293.3316 EOS")}, - {s2t("2020-09-02T15:30:00.000"), s2a("278.6656 EOS")}}; + {s2t("2020-04-04T15:30:00.000"), s2a("54.3840 EOS")}, + {s2t("2020-05-04T15:30:00.000"), s2a("440.0000 EOS")}, + {s2t("2020-06-03T15:30:00.000"), s2a("418.0000 EOS")}}; CHECK(t.get_budgets_by_period() == expected); - t.skip_to("2020-10-02T15:30:00.000"); + t.skip_to("2020-07-03T15:30:00.000"); + t.distribute(); + expected.insert({s2t("2020-07-03T15:30:00.000"), s2a("10.1636 EOS")}); + CHECK(t.get_budgets_by_period() == expected); +} + +TEST_CASE("HCD is paid when rank is equal to 1") +{ + eden_tester t; + t.genesis(); + t.set_balance(s2a("36.0000 EOS")); + t.run_election(); + std::vector expected{s2a("1.8000 EOS")}; + CHECK(t.get_rank_budget().rank_distribution == expected); +} + +TEST_CASE("HCD is non-paid when rank is 2 or more") +{ + // With 200 members, there should be three rounds + constexpr std::size_t num_accounts = 200; // 10000 takes too long + eden_tester t; + t.genesis(); + t.eden_gm.act(s2t("2020-07-04T15:30:00.000")); + auto test_accounts = make_names(num_accounts - 3); + t.create_accounts(test_accounts); + + for (auto account : test_accounts) + { + t.chain.start_block(); + t.alice.act(42, "alice"_n, account, std::vector{"pip"_n, "egeon"_n}); + t.finish_induction(42, "alice"_n, account, {"pip"_n, "egeon"_n}); + } + t.electdonate_all(); + + t.skip_to("2020-07-03T15:30:00.000"); + t.electseed(eosio::time_point_sec(0x5f009260)); + t.skip_to("2020-07-04T15:30:00.000"); + t.setup_election(); + + uint8_t round = 0; + t.generic_group_vote(t.get_current_groups(), round++); + t.generic_group_vote(t.get_current_groups(), round++); + t.generic_group_vote(t.get_current_groups(), round++); + t.electseed(s2t("2020-07-04T19:30:00.000")); + t.chain.start_block((15 * 60 + 30) * 60 * 1000); + t.chain.start_block(2 * 60 * 60 * 1000); + t.alice.act(256); + + eden::election_state_singleton results("eden.gm"_n, eden::default_scope); + auto result = std::get(results.get()); + + t.get_total_balance(); + + // HCD is not paid but receives a small amount due to the fractional difference (0.0031 EOS) + std::vector expected{s2a("0.6944 EOS"), s2a("2.7777 EOS"), s2a("11.1111 EOS"), + s2a("0.0031 EOS")}; + CHECK(t.get_rank_budget().rank_distribution == expected); +} + +TEST_CASE("increase pool pct") +{ + eden_tester t; + t.genesis(); + t.set_balance(s2a("36.0000 EOS")); + t.run_election(); + t.distribute(); + std::map expected{ + {s2t("2020-04-04T15:30:00.000"), s2a("1.8000 EOS")}}; + CHECK(t.get_budgets_by_period() == expected); + + // before monthly distribution pct is 5, then the amount for + // 2020-05-04T15:30:00.000 is 1.7100 EOS but with the 10 increase (15 in total), + // now it is 5.1300 EOS + t.eden_gm.act(15); + CHECK(t.get_pool_ptc("master"_n) == 15); + + expected.insert({s2t("2020-05-04T15:30:00.000"), s2a("5.1300 EOS")}); + expected.insert({s2t("2020-06-03T15:30:00.000"), s2a("4.3605 EOS")}); + expected.insert({s2t("2020-07-03T15:30:00.000"), s2a("0.1235 EOS")}); + t.skip_to("2020-07-03T15:30:00.000"); t.distribute(); - expected.insert({s2t("2020-10-02T15:30:00.000"), s2a("10.5028 EOS")}); CHECK(t.get_budgets_by_period() == expected); } @@ -1179,6 +1284,176 @@ TEST_CASE("bylaws") } } +// TEST_CASE("distribute sbt on vote") +// { +// constexpr std::size_t num_accounts = 12; +// eden_tester t; +// t.genesis(); +// t.eden_gm.act(s2t("2020-07-04T15:30:00.000")); +// auto test_accounts = make_names(num_accounts - 3); +// t.create_accounts(test_accounts); + +// for (auto account : test_accounts) +// { +// t.chain.start_block(); +// t.alice.act(42, "alice"_n, account, std::vector{"pip"_n, "egeon"_n}); +// t.finish_induction(42, "alice"_n, account, {"pip"_n, "egeon"_n}); +// } +// t.electdonate_all(); + +// t.skip_to("2020-07-03T15:30:00.000"); +// t.electseed(eosio::time_point_sec(0x5f009260)); +// t.skip_to("2020-07-04T15:30:00.000"); +// t.setup_election(); + +// uint8_t round = 0; +// t.generic_group_vote(t.get_current_groups(), round++); + +// std::vector expected{"edenmember11"_n, "alice"_n, "egeon"_n, +// "edenmember1c"_n, "edenmember1b"_n, "edenmember1d"_n, +// "edenmember1a"_n, "edenmember15"_n, "edenmember13"_n, +// "edenmember14"_n, "edenmember12"_n, "pip"_n}; +// CHECK(t.get_badges() == expected); + +// t.eden_gm.act(2); +// expected.erase(expected.begin(), expected.begin() + 2); + +// CHECK(t.get_badges() == expected); + +// t.eden_gm.act(100); + +// CHECK(t.get_badges() == std::vector{}); +// expect(t.eden_gm.trace(1), "Nothing to do"); +// } + +// TEST_CASE("distribute sbt in the second election") +// { +// constexpr std::size_t num_accounts = 12; +// eden_tester t; +// t.genesis(); +// t.eden_gm.act(s2t("2020-07-04T15:30:00.000")); +// auto test_accounts = make_names(num_accounts - 3); +// t.create_accounts(test_accounts); + +// for (auto account : test_accounts) +// { +// t.chain.start_block(); +// t.alice.act(42, "alice"_n, account, std::vector{"pip"_n, "egeon"_n}); +// t.finish_induction(42, "alice"_n, account, {"pip"_n, "egeon"_n}); +// } + +// t.run_election(); + +// std::vector expected{"alice"_n, "edenmember14"_n, "egeon"_n, +// "edenmember13"_n, "edenmember1d"_n, "edenmember15"_n, +// "edenmember11"_n, "edenmember12"_n, "edenmember1b"_n, +// "pip"_n, "edenmember1a"_n, "edenmember1c"_n}; +// CHECK(t.get_badges() == expected); + +// std::vector expected_extended{"edenmember1a"_n, "edenmember1d"_n, "edenmember12"_n, +// "edenmember15"_n, "alice"_n, "pip"_n, +// "edenmember13"_n, "edenmember11"_n, "edenmember14"_n, +// "egeon"_n, "edenmember1c"_n, "edenmember1b"_n}; +// expected.insert(expected.end(), expected_extended.begin(), expected_extended.end()); + +// t.run_election(); + +// CHECK(t.get_badges() == expected); +// } + +// TEST_CASE("cannot distribute sbt if round has not finished") +// { +// constexpr std::size_t num_accounts = 12; +// eden_tester t; +// t.genesis(); +// t.eden_gm.act(s2t("2020-07-04T15:30:00.000")); +// auto test_accounts = make_names(num_accounts - 3); +// t.create_accounts(test_accounts); + +// for (auto account : test_accounts) +// { +// t.chain.start_block(); +// t.alice.act(42, "alice"_n, account, std::vector{"pip"_n, "egeon"_n}); +// t.finish_induction(42, "alice"_n, account, {"pip"_n, "egeon"_n}); +// } +// t.electdonate_all(); + +// t.skip_to("2020-07-03T15:30:00.000"); +// t.electseed(eosio::time_point_sec(0x5f009260)); +// t.skip_to("2020-07-04T15:30:00.000"); +// t.setup_election(); + +// uint8_t round = 0; +// /* +// GROUPS INFO + +// GROUP_ID: 0 +// MEMBER: edenmember11 +// MEMBER: alice +// MEMBER: egeon +// MEMBER: edenmember1c + +// GROUP_ID: 1 +// MEMBER: edenmember1b +// MEMBER: edenmember1d +// MEMBER: edenmember1a +// MEMBER: edenmember15 + +// GROUP_ID: 2 +// MEMBER: edenmember13 +// MEMBER: edenmember14 +// MEMBER: edenmember12 +// MEMBER: pip +// */ + +// // GROUP_ID: 0 +// t.skip_to("2020-07-04T15:35:00.000"); +// t.chain.as("edenmember11"_n).act(round, "edenmember11"_n, "alice"_n); +// t.alice.act(round, "alice"_n, "alice"_n); +// t.egeon.act(round, "egeon"_n, "alice"_n); +// t.chain.as("edenmember1c"_n).act(round, "edenmember1c"_n, "alice"_n); + +// expect(t.eden_gm.trace(100), "Nothing to do"); + +// // GROUP_ID: 1 +// t.skip_to("2020-07-04T15:55:00.000"); +// t.chain.as("edenmember1b"_n).act(round, "edenmember1b"_n, "edenmember1b"_n); +// t.chain.as("edenmember1d"_n).act(round, "edenmember1d"_n, "edenmember1b"_n); +// t.chain.as("edenmember1a"_n).act(round, "edenmember1a"_n, "edenmember1b"_n); +// t.chain.as("edenmember15"_n).act(round, "edenmember15"_n, "edenmember1b"_n); + +// expect(t.eden_gm.trace(100), "Nothing to do"); + +// // GROUP_ID: 2 +// t.skip_to("2020-07-04T16:15:00.000"); +// t.chain.as("edenmember13"_n).act(round, "edenmember13"_n, "edenmember13"_n); +// t.chain.as("edenmember14"_n).act(round, "edenmember14"_n, "edenmember13"_n); +// t.chain.as("edenmember12"_n).act(round, "edenmember12"_n, "edenmember13"_n); +// // can only get 1 sbt even though there are multiple votes +// t.pip.act(round, "pip"_n, "edenmember13"_n); +// t.chain.start_block(); +// t.pip.act(round, "pip"_n, "edenmember14"_n); +// t.chain.start_block(); +// t.pip.act(round, "pip"_n, "edenmember12"_n); +// t.chain.start_block(); +// t.pip.act(round, "pip"_n, "edenmember13"_n); + +// expect(t.eden_gm.trace(100), "Nothing to do"); + +// // finish election +// t.skip_to("2020-07-04T16:30:00.000"); +// t.alice.act(256); +// t.eden_gm.act(10); + +// std::vector expected{"edenmember12"_n, "pip"_n}; + +// CHECK(t.get_badges() == expected); + +// t.eden_gm.act(2); + +// CHECK(t.get_badges() == std::vector{}); +// } + TEST_CASE("accounting") { eden_tester t; @@ -1189,10 +1464,11 @@ TEST_CASE("accounting") TEST_CASE("pre-genesis balance") { - eden_tester t{[&] { - t.eosio_token.act("eosio.token"_n, "eden.gm"_n, s2a("3.1415 EOS"), - ""); - }}; + eden_tester t{[&] + { + t.eosio_token.act("eosio.token"_n, "eden.gm"_n, + s2a("3.1415 EOS"), ""); + }}; t.genesis(); CHECK(get_token_balance("eden.gm"_n) == t.get_total_balance()); } @@ -1210,11 +1486,86 @@ TEST_CASE("clearall") t.genesis(); } +TEST_CASE("migrate to include max_month_withdraw") +{ + eden_tester t; + t.genesis(); + + const uint8_t default_max_month_withdraw = 3; + + CHECK(get_globals().max_month_withdraw == default_max_month_withdraw); +} + +TEST_CASE("change the max month to transfer funds") +{ + eden_tester t; + t.genesis(); + + const uint8_t default_max_month_withdraw = 3; + const uint8_t new_max_month_withdraw = 1; + + CHECK(get_globals().max_month_withdraw == default_max_month_withdraw); + expect(t.eden_gm.trace(0), + "Proposed collecting time is out of the valid range"); + expect(t.eden_gm.trace(4), + "Proposed collecting time is out of the valid range"); + t.eden_gm.act(new_max_month_withdraw); + CHECK(get_globals().max_month_withdraw == new_max_month_withdraw); +} + +TEST_CASE("return funds to master by collecting them") +{ + eden_tester t; + t.genesis(); + t.set_balance(s2a("36.0000 EOS")); + + t.run_election(); + + t.eden_gm.act(2); + t.egeon.act(250); + t.skip_to("2020-05-04T15:30:00.000"); + t.egeon.act(250); + t.skip_to("2020-07-04T15:30:00.000"); + t.egeon.act(250); + + std::map expected{ + {s2t("2020-04-04T15:30:00.000"), s2a("1.8000 EOS")}, + {s2t("2020-05-04T15:30:00.000"), s2a("1.7100 EOS")}, + {s2t("2020-06-03T15:30:00.000"), s2a("1.6245 EOS")}, + {s2t("2020-07-03T15:30:00.000"), s2a("0.0514 EOS")}, + {s2t("2020-07-04T15:30:00.000"), s2a("1.5407 EOS")}}; + + // remove because the max time to collect the funds is 2 months + t.egeon.act(100); + t.chain.start_block(); + expect(t.egeon.trace(100), "Nothing to do"); + expected.erase(s2t("2020-04-04T15:30:00.000")); + expected.erase(s2t("2020-05-04T15:30:00.000")); + // validate funds are returned to master: 29.2734 EOS + 1.8000 EOS + 1.7100 EOS = 32.7834 EOS + CHECK(t.get_budgets_by_period() == expected); + CHECK(accounts{"eden.gm"_n, "owned"_n}.get_account("master"_n)->balance() == s2a("32.7834 EOS")); + + t.skip_to("2020-08-03T15:30:00.000"); + t.egeon.act(100); + // from 2020-06-03T15:30:00.000 to 2020-08-03T15:30:00.000 there are 61 days + expected.erase(s2t("2020-06-03T15:30:00.000")); + expected[s2t("2020-08-03T15:30:00.000")] = s2a("1.6391 EOS"); + CHECK(t.get_budgets_by_period() == expected); + CHECK(accounts{"eden.gm"_n, "owned"_n}.get_account("master"_n)->balance() == s2a("32.7688 EOS")); + + t.eden_gm.act(3); + t.skip_to("2020-09-02T15:30:00.000"); + expect(t.egeon.trace(100), "Nothing to do"); + // no deletion is required since the max month to withdraw funds has changed to 90 days + // and no distribution is done since no funds to return are available +} + TEST_CASE("account migration") { eden_tester t; t.genesis(); - auto sum_accounts = [](eden::account_table_type& table) { + auto sum_accounts = [](eden::account_table_type& table) + { auto total = s2a("0.0000 EOS"); for (auto iter = table.begin(), end = table.end(); iter != end; ++iter) { @@ -1290,7 +1641,7 @@ TEST_CASE("election-events") t.run_election(true, 10000, true); t.induct_n(100); t.run_election(true, 10000, true); - t.skip_to("2021-02-01T15:30:00.000"); + t.skip_to("2020-08-03T15:30:00.000"); t.alice.act(250); test_chain::user_context{t.chain, {{"eden.gm"_n, "board.major"_n}, {"ahab"_n, "active"_n}}} .act("alice"_n, "ahab"_n); diff --git a/docker/eden-box.Dockerfile b/docker/eden-box.Dockerfile index f72957bb4..895c67389 100644 --- a/docker/eden-box.Dockerfile +++ b/docker/eden-box.Dockerfile @@ -1,5 +1,5 @@ -# Install dependencies only when needed -FROM node:lts-alpine AS deps +# Install dependencies only when needed. +FROM node:lts-alpine3.14 AS deps RUN apk add --no-cache libc6-compat WORKDIR /app @@ -13,8 +13,8 @@ COPY ./packages/box/package.json ./packages/box/ RUN yarn install --frozen-lockfile -# Rebuild the source code only when needed -FROM node:lts-alpine AS builder +# Rebuild the source code only when needed. +FROM node:lts-alpine3.14 AS builder WORKDIR /app COPY ./packages/common ./packages/common @@ -29,13 +29,13 @@ COPY ./build/eden-micro-chain.wasm /app/build/ RUN yarn build --stream -# Production image, copy all the files and run next -FROM node:lts-alpine AS runner +# Production image, copy all the files and run next. +FROM node:lts-alpine3.14 AS runner WORKDIR /app ENV NODE_ENV production -# You only need to copy next.config.js if you are NOT using the default configuration +# You only need to copy next.config.js if you are NOT using the default configuration. COPY --from=builder /app . RUN addgroup -g 1001 -S nodejs diff --git a/docker/eden-webapp.Dockerfile b/docker/eden-webapp.Dockerfile index 52e810a48..b3de1799c 100644 --- a/docker/eden-webapp.Dockerfile +++ b/docker/eden-webapp.Dockerfile @@ -1,5 +1,5 @@ # Install dependencies only when needed -FROM node:lts-alpine AS deps +FROM node:lts-alpine3.14 AS deps RUN apk add --no-cache libc6-compat WORKDIR /app @@ -14,7 +14,7 @@ COPY ./packages/webapp/package.json ./packages/webapp/ RUN yarn install --frozen-lockfile # Rebuild the source code only when needed -FROM node:lts-alpine AS builder +FROM node:lts-alpine3.14 AS builder WORKDIR /app COPY ./packages/common ./packages/common @@ -29,7 +29,7 @@ COPY --from=deps /app/packages/webapp/node_modules ./packages/webapp/node_module RUN yarn build --stream # Production image, copy all the files and run next -FROM node:lts-alpine AS runner +FROM node:lts-alpine3.14 AS runner WORKDIR /app ENV NODE_ENV production @@ -44,8 +44,8 @@ USER nextjs EXPOSE 3000 -# Next.js collects completely anonymous telemetry data about general usage. +# Next.js collects completely anonymous telemetry data about general usage # Learn more here: https://nextjs.org/telemetry -# Uncomment the following line in case you want to disable telemetry. +# Uncomment the following line in case you want to disable telemetry # RUN npx next telemetry disable CMD ["yarn", "start", "--stream"] diff --git a/env-templates/.env-box-dev b/env-templates/.env-box-dev new file mode 100644 index 000000000..82101277c --- /dev/null +++ b/env-templates/.env-box-dev @@ -0,0 +1,34 @@ +SERVER_HOST = "${DEV_SERVER_HOST}" +SERVER_PORT = "${DEV_SERVER_PORT}" +EOS_CHAIN_ID = "${DEV_EOS_CHAIN_ID}" +EOS_RPC_PROTOCOL = "${EOS_RPC_PROTOCOL}" +EOS_RPC_HOST = "${EOS_RPC_HOST}" +EOS_RPC_PORT = "${EOS_RPC_PORT}" +TAPOS_MANAGER_INTERVAL_MINS = "${TAPOS_MANAGER_INTERVAL_MINS}" +EDEN_CONTRACT_ACCOUNT = "${DEV_EDEN_CONTRACT_ACCOUNT}" +IPFS_PINATA_JWT = "${DEV_IPFS_PINATA_JWT_BOX}" + +SUBCHAIN_EDEN_CONTRACT = "${DEV_SUBCHAIN_EDEN_CONTRACT}" +SUBCHAIN_TOKEN_CONTRACT = "${DEV_SUBCHAIN_TOKEN_CONTRACT}" +SUBCHAIN_AA_CONTRACT = "${DEV_SUBCHAIN_AA_CONTRACT}" +SUBCHAIN_AA_MARKET_CONTRACT = "${DEV_SUBCHAIN_AA_MARKET_CONTRACT}" +SUBCHAIN_WASM = "${DEV_SUBCHAIN_WASM}" +SUBCHAIN_STATE = "${SUBCHAIN_STATE}" + +DFUSE_API_KEY = "${DFUSE_API_KEY}" +DFUSE_API_NETWORK = "${DEV_DFUSE_API_NETWORK}" +DFUSE_AUTH_NETWORK = "${DFUSE_AUTH_NETWORK}" +DFUSE_FIRST_BLOCK = "${DFUSE_FIRST_BLOCK}" +DFUSE_JSON_TRX_FILE = "${DEV_DFUSE_JSON_TRX_FILE}" +DFUSE_INTERVAL = ${DFUSE_INTERVAL} +DEBUG = "dfuse:*" + +# serverpays config +SERVER_PAYS_PRIVATE_KEY = "${DEV_SERVER_PAYS_PRIVATE_KEY}" +SERVER_PAYS_ACCOUNT = "${DEV_SERVER_PAYS_ACCOUNT}" +SERVER_PAYS_PERMISSION = "${DEV_SERVER_PAYS_PERMISSION}" +SERVER_PAYS_NOOP_CONTRACT = "${DEV_SERVER_PAYS_NOOP_CONTRACT}" +SERVER_PAYS_NOOP_ACTION = "${DEV_SERVER_PAYS_NOOP_ACTION}" +SERVER_PAYS_CREATE_ABI = "${DEV_SERVER_PAYS_CREATE_ABI}" + +SESSIONS_ENABLE = "${SESSIONS_ENABLE}" diff --git a/env-templates/.env-box-pdn b/env-templates/.env-box-pdn new file mode 100644 index 000000000..218ab2d65 --- /dev/null +++ b/env-templates/.env-box-pdn @@ -0,0 +1,34 @@ +SERVER_HOST = "${PDN_SERVER_HOST}" +SERVER_PORT = "${PDN_SERVER_PORT}" +EOS_CHAIN_ID = "${PDN_EOS_CHAIN_ID}" +EOS_RPC_PROTOCOL = "${EOS_RPC_PROTOCOL}" +EOS_RPC_HOST = "${EOS_RPC_HOST}" +EOS_RPC_PORT = "${EOS_RPC_PORT}" +TAPOS_MANAGER_INTERVAL_MINS = "${TAPOS_MANAGER_INTERVAL_MINS}" +EDEN_CONTRACT_ACCOUNT = "${PDN_EDEN_CONTRACT_ACCOUNT}" +IPFS_PINATA_JWT = "${PDN_IPFS_PINATA_JWT_BOX}" + +SUBCHAIN_EDEN_CONTRACT = "${PDN_SUBCHAIN_EDEN_CONTRACT}" +SUBCHAIN_TOKEN_CONTRACT = "${PDN_SUBCHAIN_TOKEN_CONTRACT}" +SUBCHAIN_AA_CONTRACT = "${PDN_SUBCHAIN_AA_CONTRACT}" +SUBCHAIN_AA_MARKET_CONTRACT = "${PDN_SUBCHAIN_AA_MARKET_CONTRACT}" +SUBCHAIN_WASM = "${PDN_SUBCHAIN_WASM}" +SUBCHAIN_STATE = "${SUBCHAIN_STATE}" + +DFUSE_API_KEY = "${PDN_DFUSE_API_KEY}" +DFUSE_API_NETWORK = "${PDN_DFUSE_API_NETWORK}" +DFUSE_AUTH_NETWORK = "${PDN_DFUSE_AUTH_NETWORK}" +DFUSE_FIRST_BLOCK = "${DFUSE_FIRST_BLOCK}" +DFUSE_JSON_TRX_FILE = "${PDN_DFUSE_JSON_TRX_FILE}" +DFUSE_INTERVAL = ${DFUSE_INTERVAL} +DEBUG = "${PDN_DEBUG}" + +# serverpays config +SERVER_PAYS_PRIVATE_KEY = "${PDN_SERVER_PAYS_PRIVATE_KEY}" +SERVER_PAYS_ACCOUNT = "${PDN_SERVER_PAYS_ACCOUNT}" +SERVER_PAYS_PERMISSION = "${PDN_SERVER_PAYS_PERMISSION}" +SERVER_PAYS_NOOP_CONTRACT = "${PDN_SERVER_PAYS_NOOP_CONTRACT}" +SERVER_PAYS_NOOP_ACTION = "${PDN_SERVER_PAYS_NOOP_ACTION}" +SERVER_PAYS_CREATE_ABI = "${PDN_SERVER_PAYS_CREATE_ABI}" + +SESSIONS_ENABLE = "${SESSIONS_ENABLE}" diff --git a/env-templates/.env-webapp-dev b/env-templates/.env-webapp-dev new file mode 100644 index 000000000..3c7fc3b23 --- /dev/null +++ b/env-templates/.env-webapp-dev @@ -0,0 +1,60 @@ +# GENERAL APP +NEXT_PUBLIC_APP_NAME = "${NEXT_PUBLIC_APP_NAME}" +NEXT_PUBLIC_APP_SHORT_NAME = "${NEXT_PUBLIC_APP_SHORT_NAME}" +NEXT_PUBLIC_BASE_URL = "${NEXT_PUBLIC_BASE_URL}" + +# CHAIN/RPC +NEXT_PUBLIC_EOS_CHAIN_ID = "${DEV_NEXT_PUBLIC_EOS_CHAIN_ID}" +NEXT_PUBLIC_EOS_RPC_PROTOCOL = "${NEXT_PUBLIC_EOS_RPC_PROTOCOL}" +NEXT_PUBLIC_EOS_RPC_HOST = "${NEXT_PUBLIC_EOS_RPC_HOST}" +NEXT_PUBLIC_EOS_RPC_PORT = "${NEXT_PUBLIC_EOS_RPC_PORT}" +NEXT_PUBLIC_EOS_READ_RPC_URLS = "${NEXT_PUBLIC_EOS_READ_RPC_URLS}" +NEXT_PUBLIC_TABLE_ROWS_MAX_FETCH_PER_SEC = "${NEXT_PUBLIC_TABLE_ROWS_MAX_FETCH_PER_SEC}" + +# CONTRACT +NEXT_PUBLIC_EDEN_CONTRACT_ACCOUNT = "${NEXT_PUBLIC_EDEN_CONTRACT_ACCOUNT}" +NEXT_PUBLIC_AA_FETCH_AFTER= "${NEXT_PUBLIC_AA_FETCH_AFTER}" +NEXT_PUBLIC_TOKEN_CONTRACT = "${NEXT_PUBLIC_TOKEN_CONTRACT}" +NEXT_PUBLIC_TOKEN_SYMBOL = "${NEXT_PUBLIC_TOKEN_SYMBOL}" +NEXT_PUBLIC_TOKEN_PRECISION = "${NEXT_PUBLIC_TOKEN_PRECISION}" + +# ATOMICHUB +NEXT_PUBLIC_AA_BASE_URL = "${NEXT_PUBLIC_AA_BASE_URL}" +NEXT_PUBLIC_AA_MARKET_URL = "${NEXT_PUBLIC_AA_MARKET_URL}" +NEXT_PUBLIC_AA_HUB_URL = "${NEXT_PUBLIC_AA_HUB_URL}" +NEXT_PUBLIC_AA_CONTRACT = "${NEXT_PUBLIC_AA_CONTRACT}" +NEXT_PUBLIC_AA_MARKET_CONTRACT = "${NEXT_PUBLIC_AA_MARKET_CONTRACT}" +NEXT_PUBLIC_AA_COLLECTION_NAME = "${NEXT_PUBLIC_AA_COLLECTION_NAME}" +NEXT_PUBLIC_AA_SCHEMA_NAME = "${NEXT_PUBLIC_AA_SCHEMA_NAME}" + +# OTHER +NEXT_PUBLIC_BLOCKEXPLORER_ACCOUNT_BASE_URL = "${NEXT_PUBLIC_BLOCKEXPLORER_ACCOUNT_BASE_URL}" +NEXT_PUBLIC_BLOCKEXPLORER_TRANSACTION_BASE_URL = "${NEXT_PUBLIC_BLOCKEXPLORER_TRANSACTION_BASE_URL}" +NEXT_PUBLIC_APP_MINIMUM_DONATION_AMOUNT = "${NEXT_PUBLIC_APP_MINIMUM_DONATION_AMOUNT}" +NEXT_PUBLIC_ENABLED_WALLETS = "${NEXT_PUBLIC_ENABLED_WALLETS}" +NEXT_PUBLIC_IPFS_BASE_URL = "${NEXT_PUBLIC_IPFS_BASE_URL}" +NEXT_PUBLIC_DEV_USE_FIXTURE_DATA = "${NEXT_PUBLIC_DEV_USE_FIXTURE_DATA}" + +# ELECTIONS +NEXT_PUBLIC_ZOOM_CLIENT_ID = "${DEV_NEXT_PUBLIC_ZOOM_CLIENT_ID}" +NEXT_PUBLIC_FREEFORM_MEETING_LINKS_ENABLED = "${NEXT_PUBLIC_FREEFORM_MEETING_LINKS_ENABLED}" +NEXT_PUBLIC_ELECTION_MEETING_DURATION_MS = "${NEXT_PUBLIC_ELECTION_MEETING_DURATION_MS}" +NEXT_PUBLIC_ELECTION_COMMUNITY_ROOM_URL = "${DEV_NEXT_PUBLIC_ELECTION_COMMUNITY_ROOM_URL}" + +# BOX: SUBCHAIN +NEXT_PUBLIC_SUBCHAIN_WASM_URL = "${NEXT_PUBLIC_SUBCHAIN_WASM_URL}" +NEXT_PUBLIC_SUBCHAIN_STATE_URL = "${NEXT_PUBLIC_SUBCHAIN_STATE_URL}" +NEXT_PUBLIC_SUBCHAIN_WS_URL = "${NEXT_PUBLIC_SUBCHAIN_WS_URL}" +NEXT_PUBLIC_SUBCHAIN_SLOW_MO = "${NEXT_PUBLIC_SUBCHAIN_SLOW_MO}" + +# BOX: IPFS +NEXT_PUBLIC_BOX_ADDRESS = "${NEXT_PUBLIC_BOX_ADDRESS}" +NEXT_PUBLIC_BOX_UPLOAD_IPFS = "${NEXT_PUBLIC_BOX_UPLOAD_IPFS}" + +# SECRETS DEFAULTS +IPFS_PINATA_JWT = "${DEV_IPFS_PINATA_JWT_WEBAPP}" +IPFS_PINATA_API = "${DEV_IPFS_PINATA_API}" +JOBS_AUTH_GC = "${DEV_JOBS_AUTH_GC}" +EOS_PRIVATE_KEY_GC_JOB = "${DEV_EOS_PRIVATE_KEY_GC_JOB}" +ZOOM_CLIENT_SECRET = "${DEV_ZOOM_CLIENT_SECRET}" +MEETINGS_SECRET_KEY = "${DEV_MEETINGS_SECRET_KEY}" diff --git a/env-templates/.env-webapp-pdn b/env-templates/.env-webapp-pdn new file mode 100644 index 000000000..500760690 --- /dev/null +++ b/env-templates/.env-webapp-pdn @@ -0,0 +1,61 @@ +# GENERAL APP +NEXT_PUBLIC_APP_NAME = "${NEXT_PUBLIC_APP_NAME}" +NEXT_PUBLIC_APP_SHORT_NAME = "${NEXT_PUBLIC_APP_SHORT_NAME}" +NEXT_PUBLIC_BASE_URL = "${NEXT_PUBLIC_BASE_URL}" + +# CHAIN/RPC +NEXT_PUBLIC_EOS_CHAIN_ID = "${PDN_NEXT_PUBLIC_EOS_CHAIN_ID}" +NEXT_PUBLIC_EOS_RPC_PROTOCOL = "${NEXT_PUBLIC_EOS_RPC_PROTOCOL}" +NEXT_PUBLIC_EOS_RPC_HOST = "${NEXT_PUBLIC_EOS_RPC_HOST}" +NEXT_PUBLIC_EOS_RPC_PORT = "${NEXT_PUBLIC_EOS_RPC_PORT}" +NEXT_PUBLIC_EOS_READ_RPC_URLS = "${NEXT_PUBLIC_EOS_READ_RPC_URLS}" +NEXT_PUBLIC_TABLE_ROWS_MAX_FETCH_PER_SEC = "${NEXT_PUBLIC_TABLE_ROWS_MAX_FETCH_PER_SEC}" + +# CONTRACT +NEXT_PUBLIC_EDEN_CONTRACT_ACCOUNT = "${NEXT_PUBLIC_EDEN_CONTRACT_ACCOUNT}" +NEXT_PUBLIC_AA_FETCH_AFTER= "${NEXT_PUBLIC_AA_FETCH_AFTER}" +NEXT_PUBLIC_TOKEN_CONTRACT = "${NEXT_PUBLIC_TOKEN_CONTRACT}" +NEXT_PUBLIC_TOKEN_SYMBOL = "${NEXT_PUBLIC_TOKEN_SYMBOL}" +NEXT_PUBLIC_TOKEN_PRECISION = "${NEXT_PUBLIC_TOKEN_PRECISION}" + +# ATOMICHUB +NEXT_PUBLIC_AA_BASE_URL = "${NEXT_PUBLIC_AA_BASE_URL}" +NEXT_PUBLIC_AA_MARKET_URL = "${NEXT_PUBLIC_AA_MARKET_URL}" +NEXT_PUBLIC_AA_HUB_URL = "${NEXT_PUBLIC_AA_HUB_URL}" +NEXT_PUBLIC_AA_CONTRACT = "${NEXT_PUBLIC_AA_CONTRACT}" +NEXT_PUBLIC_AA_MARKET_CONTRACT = "${NEXT_PUBLIC_AA_MARKET_CONTRACT}" +NEXT_PUBLIC_AA_COLLECTION_NAME = "${NEXT_PUBLIC_AA_COLLECTION_NAME}" +NEXT_PUBLIC_AA_SCHEMA_NAME = "${NEXT_PUBLIC_AA_SCHEMA_NAME}" + +# OTHER +NEXT_PUBLIC_BLOCKEXPLORER_ACCOUNT_BASE_URL = "${NEXT_PUBLIC_BLOCKEXPLORER_ACCOUNT_BASE_URL}" +NEXT_PUBLIC_BLOCKEXPLORER_TRANSACTION_BASE_URL = "${NEXT_PUBLIC_BLOCKEXPLORER_TRANSACTION_BASE_URL}" +NEXT_PUBLIC_APP_MINIMUM_DONATION_AMOUNT = "${NEXT_PUBLIC_APP_MINIMUM_DONATION_AMOUNT}" +NEXT_PUBLIC_ENABLED_WALLETS = "${NEXT_PUBLIC_ENABLED_WALLETS}" +NEXT_PUBLIC_IPFS_BASE_URL = "${NEXT_PUBLIC_IPFS_BASE_URL}" +NEXT_PUBLIC_DEV_USE_FIXTURE_DATA = "${NEXT_PUBLIC_DEV_USE_FIXTURE_DATA}" + +# ELECTIONS +NEXT_PUBLIC_ZOOM_CLIENT_ID = "${PDN_NEXT_PUBLIC_ZOOM_CLIENT_ID}" +NEXT_PUBLIC_FREEFORM_MEETING_LINKS_ENABLED = "${NEXT_PUBLIC_FREEFORM_MEETING_LINKS_ENABLED}" +NEXT_PUBLIC_ELECTION_MEETING_DURATION_MS = "${NEXT_PUBLIC_ELECTION_MEETING_DURATION_MS}" +NEXT_PUBLIC_ELECTION_COMMUNITY_ROOM_URL = "${PDN_NEXT_PUBLIC_ELECTION_COMMUNITY_ROOM_URL}" + +# BOX: SUBCHAIN +NEXT_PUBLIC_SUBCHAIN_WASM_URL = "${NEXT_PUBLIC_SUBCHAIN_WASM_URL}" +NEXT_PUBLIC_SUBCHAIN_STATE_URL = "${NEXT_PUBLIC_SUBCHAIN_STATE_URL}" +NEXT_PUBLIC_SUBCHAIN_WS_URL = "${NEXT_PUBLIC_SUBCHAIN_WS_URL}" +NEXT_PUBLIC_SUBCHAIN_SLOW_MO = "${NEXT_PUBLIC_SUBCHAIN_SLOW_MO}" + +# BOX: IPFS +NEXT_PUBLIC_BOX_ADDRESS = "${NEXT_PUBLIC_BOX_ADDRESS}" +IPFS_UPLOAD_ENDPOINT_URL= "${IPFS_UPLOAD_ENDPOINT_URL}" +NEXT_PUBLIC_BOX_UPLOAD_IPFS = "${NEXT_PUBLIC_BOX_UPLOAD_IPFS}" + +# SECRETS DEFAULTS +IPFS_PINATA_JWT = "${PDN_IPFS_PINATA_JWT_WEBAPP}" +IPFS_PINATA_API = "${PDN_IPFS_PINATA_API}" +JOBS_AUTH_GC = "${PDN_JOBS_AUTH_GC}" +EOS_PRIVATE_KEY_GC_JOB ="${PDN_EOS_PRIVATE_KEY_GC_JOB}" +ZOOM_CLIENT_SECRET = "${PDN_ZOOM_CLIENT_SECRET}" +MEETINGS_SECRET_KEY = "${PDN_MEETINGS_SECRET_KEY}" diff --git a/kubernetes-dev/box-deployment.yaml b/kubernetes-dev/box-deployment.yaml new file mode 100644 index 000000000..5f9edda5d --- /dev/null +++ b/kubernetes-dev/box-deployment.yaml @@ -0,0 +1,23 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app: box + name: box +spec: + replicas: 1 + selector: + matchLabels: + app: box + template: + metadata: + labels: + app: box + spec: + containers: + - image: ghcr.io/edenia/eden-box:${VERSION} + imagePullPolicy: "Always" + name: eden-box + ports: + - containerPort: 3032 + restartPolicy: Always diff --git a/kubernetes-dev/box-service.yaml b/kubernetes-dev/box-service.yaml new file mode 100644 index 000000000..ab35fb75c --- /dev/null +++ b/kubernetes-dev/box-service.yaml @@ -0,0 +1,14 @@ +apiVersion: v1 +kind: Service +metadata: + labels: + app: box + name: box +spec: + ports: + - name: http + port: 3032 + targetPort: 3032 + protocol: TCP + selector: + app: box \ No newline at end of file diff --git a/kubernetes-dev/eden-distribute-cronjob.yaml b/kubernetes-dev/eden-distribute-cronjob.yaml new file mode 100644 index 000000000..e956c7d3a --- /dev/null +++ b/kubernetes-dev/eden-distribute-cronjob.yaml @@ -0,0 +1,32 @@ +apiVersion: batch/v1 +kind: CronJob +metadata: + name: eden-distribute +spec: + schedule: "0 22 27 * *" + successfulJobsHistoryLimit: 1 + failedJobsHistoryLimit: 1 + jobTemplate: + spec: + template: + spec: + containers: + - name: eden-distribute + image: ghcr.io/eoscostarica/eden-distribute:${VERSION_DISTRIBUTE} + imagePullPolicy: IfNotPresent + env: + - name: EOS_API_ENDPOINT + value: "${DEV_EOS_API_ENDPOINT}" + - name: EOS_API_CHAIN_ID + value: "${DEV_EOS_API_CHAIN_ID}" + - name: EOS_DISTRIBUTE_ACCOUNT + value: "${DEV_EOS_DISTRIBUTE_ACCOUNT}" + - name: EOS_DISTRIBUTE_PERMISSION + value: "${DEV_EOS_DISTRIBUTE_PERMISSION}" + - name: EOS_DISTRIBUTE_PRIVATE_KEY + value: "${DEV_EOS_DISTRIBUTE_PRIVATE_KEY}" + - name: EOS_DISTRIBUTE_MAX_STEPS + value: "${DEV_EOS_DISTRIBUTE_MAX_STEPS}" + - name: EOS_EDEN_ACCOUNT + value: "${DEV_EOS_EDEN_ACCOUNT}" + restartPolicy: Never \ No newline at end of file diff --git a/kubernetes-dev/eos-resource-watcher-cronjob.yaml b/kubernetes-dev/eos-resource-watcher-cronjob.yaml new file mode 100644 index 000000000..4abacb785 --- /dev/null +++ b/kubernetes-dev/eos-resource-watcher-cronjob.yaml @@ -0,0 +1,38 @@ +apiVersion: batch/v1 +kind: CronJob +metadata: + name: eos-resource-watcher +spec: + schedule: "* */4 * * *" + successfulJobsHistoryLimit: 1 + failedJobsHistoryLimit: 1 + jobTemplate: + spec: + template: + spec: + containers: + - name: eos-resource-watcher + image: ghcr.io/eoscostarica/eos-resource-watcher:${VERSION_WATCHER} + imagePullPolicy: IfNotPresent + env: + - name: EOS_API_ENDPOINT + value: "${DEV_EOS_API_ENDPOINT}" + - name: EOS_API_CHAIN_ID + value: "${DEV_EOS_API_CHAIN_ID}" + - name: EOS_PAYER_ACCOUNT + value: "${DEV_EOS_PAYER_ACCOUNT}" + - name: EOS_PAYER_PERMISION + value: "${DEV_EOS_PAYER_PERMISION}" + - name: EOS_PAYER_PRIVATE_KEY + value: "${DEV_EOS_PAYER_PRIVATE_KEY}" + - name: EOS_WATCH_ACCOUNT + value: "${DEV_EOS_WATCH_ACCOUNT}" + - name: EOS_POWERUP_THRESHOLD + value: "${DEV_EOS_POWERUP_THRESHOLD}" + - name: EOS_NET_FRAC + value: "${DEV_EOS_NET_FRAC}" + - name: EOS_CPU_FRAC + value: "${DEV_EOS_CPU_FRAC}" + - name: EOS_POWERUP_AMOUNT + value: "${DEV_EOS_POWERUP_AMOUNT}" + restartPolicy: Never \ No newline at end of file diff --git a/kubernetes-dev/ingress.yaml b/kubernetes-dev/ingress.yaml new file mode 100644 index 000000000..73a61a3e8 --- /dev/null +++ b/kubernetes-dev/ingress.yaml @@ -0,0 +1,63 @@ +apiVersion: traefik.containo.us/v1alpha1 +kind: IngressRoute +metadata: + name: http +spec: + entryPoints: + - web + routes: + - kind: Rule + match: Host(`eden.edenia.cloud`) + services: + - kind: Service + name: webapp + port: 3000 +--- +apiVersion: traefik.containo.us/v1alpha1 +kind: IngressRoute +metadata: + name: https +spec: + entryPoints: + - websecure + routes: + - kind: Rule + match: Host(`eden.edenia.cloud`) + services: + - kind: Service + name: webapp + port: 3000 + tls: + certResolver: myresolver +--- +apiVersion: traefik.containo.us/v1alpha1 +kind: IngressRoute +metadata: + name: box-http +spec: + entryPoints: + - web + routes: + - kind: Rule + match: Host(`eden-box.edenia.cloud`) + services: + - kind: Service + name: box + port: 3032 +--- +apiVersion: traefik.containo.us/v1alpha1 +kind: IngressRoute +metadata: + name: box-https +spec: + entryPoints: + - websecure + routes: + - kind: Rule + match: Host(`eden-box.edenia.cloud`) + services: + - kind: Service + name: box + port: 3032 + tls: + certResolver: myresolver \ No newline at end of file diff --git a/kubernetes-dev/storageclass.yaml b/kubernetes-dev/storageclass.yaml new file mode 100644 index 000000000..16b810313 --- /dev/null +++ b/kubernetes-dev/storageclass.yaml @@ -0,0 +1,12 @@ +apiVersion: storage.k8s.io/v1 +kind: StorageClass +metadata: + name: eden-storage +parameters: + fromBackup: "" + numberOfReplicas: "1" + staleReplicaTimeout: "2880" +provisioner: driver.longhorn.io +reclaimPolicy: Retain +volumeBindingMode: WaitForFirstConsumer +allowVolumeExpansion: true \ No newline at end of file diff --git a/kubernetes-dev/webapp-deployment.yaml b/kubernetes-dev/webapp-deployment.yaml new file mode 100644 index 000000000..61ab4e977 --- /dev/null +++ b/kubernetes-dev/webapp-deployment.yaml @@ -0,0 +1,23 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app: webapp + name: webapp +spec: + replicas: 1 + selector: + matchLabels: + app: webapp + template: + metadata: + labels: + app: webapp + spec: + containers: + - image: ghcr.io/edenia/eden-webapp:${VERSION} + imagePullPolicy: "Always" + name: eden-webapp + ports: + - containerPort: 3000 + restartPolicy: Always diff --git a/kubernetes-dev/webapp-service.yaml b/kubernetes-dev/webapp-service.yaml new file mode 100644 index 000000000..910a9adfe --- /dev/null +++ b/kubernetes-dev/webapp-service.yaml @@ -0,0 +1,14 @@ +apiVersion: v1 +kind: Service +metadata: + labels: + app: webapp + name: webapp +spec: + ports: + - name: http + port: 3000 + targetPort: 3000 + protocol: TCP + selector: + app: webapp \ No newline at end of file diff --git a/kubernetes-pdn/box-deployment.yaml b/kubernetes-pdn/box-deployment.yaml new file mode 100644 index 000000000..274f0bac5 --- /dev/null +++ b/kubernetes-pdn/box-deployment.yaml @@ -0,0 +1,23 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app: box + name: box +spec: + replicas: 2 + selector: + matchLabels: + app: box + template: + metadata: + labels: + app: box + spec: + containers: + - image: ghcr.io/edenia/eden-box-pdn:${VERSION} + imagePullPolicy: "Always" + name: eden-box + ports: + - containerPort: 3032 + restartPolicy: Always diff --git a/kubernetes-pdn/box-service.yaml b/kubernetes-pdn/box-service.yaml new file mode 100644 index 000000000..ab35fb75c --- /dev/null +++ b/kubernetes-pdn/box-service.yaml @@ -0,0 +1,14 @@ +apiVersion: v1 +kind: Service +metadata: + labels: + app: box + name: box +spec: + ports: + - name: http + port: 3032 + targetPort: 3032 + protocol: TCP + selector: + app: box \ No newline at end of file diff --git a/kubernetes-pdn/eden-distribute-cronjob.yaml b/kubernetes-pdn/eden-distribute-cronjob.yaml new file mode 100644 index 000000000..0ab81ae3d --- /dev/null +++ b/kubernetes-pdn/eden-distribute-cronjob.yaml @@ -0,0 +1,32 @@ +apiVersion: batch/v1 +kind: CronJob +metadata: + name: eden-distribute +spec: + schedule: "0 18 8 * *" + successfulJobsHistoryLimit: 1 + failedJobsHistoryLimit: 1 + jobTemplate: + spec: + template: + spec: + containers: + - name: eden-distribute + image: ghcr.io/eoscostarica/eden-distribute:${VERSION_DISTRIBUTE} + imagePullPolicy: IfNotPresent + env: + - name: EOS_API_ENDPOINT + value: "${PDN_EOS_API_ENDPOINT}" + - name: EOS_API_CHAIN_ID + value: "${PDN_EOS_API_CHAIN_ID}" + - name: EOS_DISTRIBUTE_ACCOUNT + value: "${PDN_EOS_DISTRIBUTE_ACCOUNT}" + - name: EOS_DISTRIBUTE_PERMISSION + value: "${PDN_EOS_DISTRIBUTE_PERMISSION}" + - name: EOS_DISTRIBUTE_PRIVATE_KEY + value: "${PDN_EOS_DISTRIBUTE_PRIVATE_KEY}" + - name: EOS_DISTRIBUTE_MAX_STEPS + value: "${PDN_EOS_DISTRIBUTE_MAX_STEPS}" + - name: EOS_EDEN_ACCOUNT + value: "${PDN_EOS_EDEN_ACCOUNT}" + restartPolicy: Never diff --git a/kubernetes-pdn/ingress.yaml b/kubernetes-pdn/ingress.yaml new file mode 100644 index 000000000..3770ac53a --- /dev/null +++ b/kubernetes-pdn/ingress.yaml @@ -0,0 +1,63 @@ +apiVersion: traefik.containo.us/v1alpha1 +kind: IngressRoute +metadata: + name: http +spec: + entryPoints: + - web + routes: + - kind: Rule + match: Host(`genesis.eden.eoscommunity.org`) + services: + - kind: Service + name: webapp + port: 3000 +--- +apiVersion: traefik.containo.us/v1alpha1 +kind: IngressRoute +metadata: + name: https +spec: + entryPoints: + - websecure + routes: + - kind: Rule + match: Host(`genesis.eden.eoscommunity.org`) + services: + - kind: Service + name: webapp + port: 3000 + tls: + certResolver: myresolver +--- +apiVersion: traefik.containo.us/v1alpha1 +kind: IngressRoute +metadata: + name: box-http +spec: + entryPoints: + - web + routes: + - kind: Rule + match: Host(`edenbox.eoscommunity.org`) + services: + - kind: Service + name: box + port: 3032 +--- +apiVersion: traefik.containo.us/v1alpha1 +kind: IngressRoute +metadata: + name: box-https +spec: + entryPoints: + - websecure + routes: + - kind: Rule + match: Host(`edenbox.eoscommunity.org`) + services: + - kind: Service + name: box + port: 3032 + tls: + certResolver: myresolver \ No newline at end of file diff --git a/kubernetes-pdn/storageclass.yaml b/kubernetes-pdn/storageclass.yaml new file mode 100644 index 000000000..16b810313 --- /dev/null +++ b/kubernetes-pdn/storageclass.yaml @@ -0,0 +1,12 @@ +apiVersion: storage.k8s.io/v1 +kind: StorageClass +metadata: + name: eden-storage +parameters: + fromBackup: "" + numberOfReplicas: "1" + staleReplicaTimeout: "2880" +provisioner: driver.longhorn.io +reclaimPolicy: Retain +volumeBindingMode: WaitForFirstConsumer +allowVolumeExpansion: true \ No newline at end of file diff --git a/kubernetes-pdn/webapp-deployment.yaml b/kubernetes-pdn/webapp-deployment.yaml new file mode 100644 index 000000000..df447e9ad --- /dev/null +++ b/kubernetes-pdn/webapp-deployment.yaml @@ -0,0 +1,23 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app: webapp + name: webapp +spec: + replicas: 2 + selector: + matchLabels: + app: webapp + template: + metadata: + labels: + app: webapp + spec: + containers: + - image: ghcr.io/edenia/eden-webapp-pdn:${VERSION} + imagePullPolicy: "Always" + name: eden-webapp + ports: + - containerPort: 3000 + restartPolicy: Always diff --git a/kubernetes-pdn/webapp-service.yaml b/kubernetes-pdn/webapp-service.yaml new file mode 100644 index 000000000..910a9adfe --- /dev/null +++ b/kubernetes-pdn/webapp-service.yaml @@ -0,0 +1,14 @@ +apiVersion: v1 +kind: Service +metadata: + labels: + app: webapp + name: webapp +spec: + ports: + - name: http + port: 3000 + targetPort: 3000 + protocol: TCP + selector: + app: webapp \ No newline at end of file diff --git a/makefile b/makefile new file mode 100644 index 000000000..0bc7c2893 --- /dev/null +++ b/makefile @@ -0,0 +1,45 @@ +include utils/meta.mk utils/help.mk + +SHELL := /bin/bash +BLUE := $(shell tput -Txterm setaf 6) +RESET := $(shell tput -Txterm sgr0) +WEBAPP_BUILD_DIR := ./build-env-webapp +BOX_BUILD_DIR := ./build-env-box +K8S_BUILD_DIR ?= ./build_k8s +K8S_FILES := $(shell find ./kubernetes-$(ENVIRONMENT) -name '*.yaml' | sed 's:./kubernetes-$(ENVIRONMENT)/::g') + +build-env-files-webapp: ##@devops Generate proper dev files webapp based on the templates +build-env-files-webapp: ./env-templates + @echo "Build dev webapp files..." + @rm -Rf $(WEBAPP_BUILD_DIR) && mkdir -p $(WEBAPP_BUILD_DIR) + @cp ./env-templates/.env-webapp-$(ENVIRONMENT) $(WEBAPP_BUILD_DIR)/.env-webapp-$(ENVIRONMENT) + @cat $(WEBAPP_BUILD_DIR)/.env-webapp-$(ENVIRONMENT) + @envsubst <$(WEBAPP_BUILD_DIR)/.env-webapp-$(ENVIRONMENT) >./packages/webapp/.env + @cat ./packages/webapp/.env + +build-env-files-box: ##@devops Generate proper dev files box based on the templates +build-env-files-box: ./env-templates + @echo "Build dev box files..." + @rm -Rf $(BOX_BUILD_DIR) && mkdir -p $(BOX_BUILD_DIR) + @cp ./env-templates/.env-box-$(ENVIRONMENT) $(BOX_BUILD_DIR)/.env-box-$(ENVIRONMENT) + @cat $(BOX_BUILD_DIR)/.env-box-$(ENVIRONMENT) + @envsubst <$(BOX_BUILD_DIR)/.env-box-$(ENVIRONMENT) >./packages/box/.env + @cat ./packages/box/.env + +build-kubernetes: ##@devops Generate proper k8s files based on the templates +build-kubernetes: ./kubernetes-$(ENVIRONMENT) + @echo "Build kubernetes files..." + @rm -Rf $(K8S_BUILD_DIR) && mkdir -p $(K8S_BUILD_DIR) + @for file in $(K8S_FILES); do \ + mkdir -p `dirname "$(K8S_BUILD_DIR)/$$file"`; \ + $(SHELL_EXPORT) envsubst <./kubernetes-$(ENVIRONMENT)/$$file >$(K8S_BUILD_DIR)/$$file; \ + cat $(K8S_BUILD_DIR)/$$file; \ + done + +deploy-kubernetes: ##@devops Publish the build k8s files +deploy-kubernetes: $(K8S_BUILD_DIR) + @kubectl create ns $(NAMESPACE) || echo "Namespace '$(NAMESPACE)' already exists."; + @echo "Applying kubernetes files..." + @for file in $(shell find $(K8S_BUILD_DIR) -name '*.yaml' | sed 's:$(K8S_BUILD_DIR)/::g'); do \ + kubectl apply -f $(K8S_BUILD_DIR)/$$file -n $(NAMESPACE) || echo "${file} Cannot be updated."; \ + done \ No newline at end of file diff --git a/packages/box/.env b/packages/box/.env index cedf30fda..2f5aa56f4 100644 --- a/packages/box/.env +++ b/packages/box/.env @@ -1,11 +1,11 @@ SERVER_HOST = "localhost" SERVER_PORT = "3032" -EOS_CHAIN_ID = "f16b1833c747c43682f4386fca9cbb327929334a762755ebec17f6f23c9b8a12" +EOS_CHAIN_ID = "73e4385a2708e6d7048834fbc1079f2fabb17b3c125b146af438971e90716c4d" EOS_RPC_PROTOCOL = "https" -EOS_RPC_HOST = "wax-test.eosdac.io" +EOS_RPC_HOST = "jungle4.api.eosnation.io" EOS_RPC_PORT = "443" TAPOS_MANAGER_INTERVAL_MINS = "30" -EDEN_CONTRACT_ACCOUNT = "test.edev" +EDEN_CONTRACT_ACCOUNT = "genesis.eden" IPFS_PINATA_JWT = "" SUBCHAIN_EDEN_CONTRACT = "genesis.eden" @@ -16,14 +16,14 @@ SUBCHAIN_WASM = "../../build/eden-micro-chain.wasm" SUBCHAIN_STATE = "state" DFUSE_API_KEY = "" -DFUSE_API_NETWORK = "eos.dfuse.eosnation.io" +DFUSE_API_NETWORK = "jungle4.dfuse.eosnation.io" DFUSE_AUTH_NETWORK = "https://auth.eosnation.io" -DFUSE_FIRST_BLOCK = "183705819" +DFUSE_FIRST_BLOCK = "35348269" DFUSE_JSON_TRX_FILE = "dfuse-transactions.json" DFUSE_INTERVAL = 30 # serverpays config -SERVER_PAYS_PRIVATE_KEY = "5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3" +SERVER_PAYS_PRIVATE_KEY = "5K...." SERVER_PAYS_ACCOUNT = "payer" SERVER_PAYS_PERMISSION = "active" SERVER_PAYS_NOOP_CONTRACT = "payer" diff --git a/packages/box/.gitignore b/packages/box/.gitignore index 26583f0b4..8f7ff90fe 100644 --- a/packages/box/.gitignore +++ b/packages/box/.gitignore @@ -2,3 +2,4 @@ tmp/ .env.local dfuse-transactions*.json state +.env diff --git a/packages/box/src/config.ts b/packages/box/src/config.ts index 82914f9da..866ed6210 100644 --- a/packages/box/src/config.ts +++ b/packages/box/src/config.ts @@ -141,4 +141,4 @@ if (subchainConfig.enable) { } } -logger.info("<== Env Configs Loaded!"); +logger.info("<== Env Configs Loaded!"); \ No newline at end of file diff --git a/packages/webapp/.env b/packages/webapp/.env index 06bd418c9..57f886278 100644 --- a/packages/webapp/.env +++ b/packages/webapp/.env @@ -4,19 +4,19 @@ NEXT_PUBLIC_APP_SHORT_NAME = "eden-community-app" NEXT_PUBLIC_BASE_URL = "http://localhost:3000" # CHAIN/RPC -NEXT_PUBLIC_EOS_CHAIN_ID = "f16b1833c747c43682f4386fca9cbb327929334a762755ebec17f6f23c9b8a12" +NEXT_PUBLIC_EOS_CHAIN_ID = "73e4385a2708e6d7048834fbc1079f2fabb17b3c125b146af438971e90716c4d" NEXT_PUBLIC_EOS_RPC_PROTOCOL = "https" -NEXT_PUBLIC_EOS_RPC_HOST = "waxtest.eosn.io" +NEXT_PUBLIC_EOS_RPC_HOST = "jungle4.api.eosnation.io" NEXT_PUBLIC_EOS_RPC_PORT = "443" -NEXT_PUBLIC_EOS_READ_RPC_URLS = "https://api.waxtest.alohaeos.com,https://wax-testnet.cryptolions.io,https://testnet.wax.pink.gg,https://testnet.waxsweden.org" +NEXT_PUBLIC_EOS_READ_RPC_URLS = "https://jungle4.api.eosnation.io" NEXT_PUBLIC_TABLE_ROWS_MAX_FETCH_PER_SEC = "10" # CONTRACT -NEXT_PUBLIC_EDEN_CONTRACT_ACCOUNT = "test.edev" -NEXT_PUBLIC_AA_FETCH_AFTER="1633883520000" +NEXT_PUBLIC_EDEN_CONTRACT_ACCOUNT = "genesis.eden" +NEXT_PUBLIC_AA_FETCH_AFTER= "35348269" NEXT_PUBLIC_TOKEN_CONTRACT = "eosio.token" -NEXT_PUBLIC_TOKEN_SYMBOL = "WAX" -NEXT_PUBLIC_TOKEN_PRECISION = "8" +NEXT_PUBLIC_TOKEN_SYMBOL = "EOS" +NEXT_PUBLIC_TOKEN_PRECISION = "4" # ATOMICHUB NEXT_PUBLIC_AA_BASE_URL = "https://test.wax.api.atomicassets.io/atomicassets/v1" @@ -24,13 +24,13 @@ NEXT_PUBLIC_AA_MARKET_URL = "https://test.wax.api.atomicassets.io/atomicmarket/v NEXT_PUBLIC_AA_HUB_URL = "https://wax-test.atomichub.io" NEXT_PUBLIC_AA_CONTRACT = "atomicassets" NEXT_PUBLIC_AA_MARKET_CONTRACT = "atomicmarket" -NEXT_PUBLIC_AA_COLLECTION_NAME = "test.edev" +NEXT_PUBLIC_AA_COLLECTION_NAME = "genesis.eden" NEXT_PUBLIC_AA_SCHEMA_NAME = "members" # OTHER NEXT_PUBLIC_BLOCKEXPLORER_ACCOUNT_BASE_URL = "https://wax-test.bloks.io/account" NEXT_PUBLIC_BLOCKEXPLORER_TRANSACTION_BASE_URL = "https://wax-test.bloks.io/transaction" -NEXT_PUBLIC_APP_MINIMUM_DONATION_AMOUNT = "10.00000000 WAX" +NEXT_PUBLIC_APP_MINIMUM_DONATION_AMOUNT = "10.0000 EOS" NEXT_PUBLIC_ENABLED_WALLETS = "ANCHOR,LEDGER,SOFTKEY" NEXT_PUBLIC_IPFS_BASE_URL = "https://infura-ipfs.io/ipfs" NEXT_PUBLIC_DEV_USE_FIXTURE_DATA = "false" @@ -57,4 +57,4 @@ IPFS_PINATA_API = "https://api.pinata.cloud/psa" JOBS_AUTH_GC = "" EOS_PRIVATE_KEY_GC_JOB = "" ZOOM_CLIENT_SECRET = "" -MEETINGS_SECRET_KEY = "" +MEETINGS_SECRET_KEY = "" \ No newline at end of file diff --git a/packages/webapp/public/images/clarion-logo.svg b/packages/webapp/public/images/clarion-logo.svg deleted file mode 100644 index 4378fd973..000000000 --- a/packages/webapp/public/images/clarion-logo.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/packages/webapp/public/images/edenia.svg b/packages/webapp/public/images/edenia.svg new file mode 100644 index 000000000..4d449f64e --- /dev/null +++ b/packages/webapp/public/images/edenia.svg @@ -0,0 +1,28 @@ + + + + + + + + + + diff --git a/packages/webapp/src/_app/styles/nprogress.tailwind.css b/packages/webapp/src/_app/styles/nprogress.tailwind.css index 303a98dc5..177361eba 100644 --- a/packages/webapp/src/_app/styles/nprogress.tailwind.css +++ b/packages/webapp/src/_app/styles/nprogress.tailwind.css @@ -63,6 +63,32 @@ position: absolute; } +/* Tooltip container */ +.tooltip { + position: relative; + display: inline-block; +} + +/* Tooltip text */ +.tooltip .tooltiptext { + visibility: hidden; + width: 260px; + background-color: gray; + color: #fff; + text-align: center; + padding: 6px 4px; + border-radius: 6px; + + /* Position the tooltip text - see examples below! */ + position: absolute; + z-index: 1; +} + +/* Show the tooltip text when you mouse over the tooltip container */ +.tooltip:hover .tooltiptext { + visibility: visible; +} + @-webkit-keyframes nprogress-spinner { 0% { -webkit-transform: rotate(0deg); diff --git a/packages/webapp/src/_app/ui/footer.tsx b/packages/webapp/src/_app/ui/footer.tsx index 50229972c..83eb37249 100644 --- a/packages/webapp/src/_app/ui/footer.tsx +++ b/packages/webapp/src/_app/ui/footer.tsx @@ -5,7 +5,7 @@ export const Footer = () => (