diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index bd2842742..adc5cddc5 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -12,8 +12,7 @@ jobs: runs-on: ${{ matrix.os }} strategy: matrix: - os: [macos-14] - arch: [arm64, x64] + os: [macos-14, macos-14-large] steps: - uses: actions/checkout@v3 @@ -36,8 +35,12 @@ jobs: # Set OS_ARCH env - name: Set architecture environment variable - run: - echo "OS_ARCH=${{ matrix.arch }}" >> $GITHUB_ENV; + run: | + if [ "${{ matrix.os }}" == "macos-14-large" ]; then + echo "OS_ARCH=x64" >> $GITHUB_ENV; + else + echo "OS_ARCH=arm64" >> $GITHUB_ENV; + fi # Cache Poetry dependencies with unique key for each environment and architecture - name: Cache Poetry dependencies @@ -47,9 +50,9 @@ jobs: ~/.cache/pypoetry ~/.cache/pip ~/.venv - key: poetry-${{ matrix.arch }}-${{ hashFiles('**/poetry.lock') }} + key: poetry-${{ env.OS_ARCH }}-${{ hashFiles('**/poetry.lock') }} restore-keys: | - poetry-${{ matrix.arch }}- + poetry-${{ env.OS_ARCH }}- - name: Install dependencies run: poetry install @@ -69,27 +72,40 @@ jobs: - name: Build with PyInstaller run: | poetry run pyinstaller operate/services/utils/tendermint.py --onefile + cp dist/tendermint dist/tendermint_bin # patch open aea in place rm -fr ./open-aea git clone https://github.com/valory-xyz/open-aea.git -b fix/1.5.2_encoding poetry run pip install ./open-aea/ - poetry run pyinstaller --collect-data eth_account --collect-all aea --collect-all autonomy --collect-all operate --collect-all aea_ledger_ethereum --collect-all aea_ledger_cosmos --collect-all aea_ledger_ethereum_flashbots --hidden-import aea_ledger_ethereum --hidden-import aea_ledger_cosmos --hidden-import aea_ledger_ethereum_flashbots operate/pearl.py --add-binary dist/aea_bin:. --add-binary dist/tendermint:. --onefile --name pearl_${{ env.OS_ARCH }} + poetry run pyinstaller --collect-data eth_account --collect-all aea --collect-all autonomy --collect-all operate --collect-all aea_ledger_ethereum --collect-all aea_ledger_cosmos --collect-all aea_ledger_ethereum_flashbots --hidden-import aea_ledger_ethereum --hidden-import aea_ledger_cosmos --hidden-import aea_ledger_ethereum_flashbots operate/pearl.py --onefile --name pearl_${{ env.OS_ARCH }} - name: Upload Release Assets uses: actions/upload-artifact@v4 with: - name: pearl_${{ matrix.arch }} - path: dist/pearl_${{ matrix.arch }} + name: pearl_${{ env.OS_ARCH }} + path: dist/pearl_${{ env.OS_ARCH }} + + - name: Upload Tendermint + uses: actions/upload-artifact@v4 + with: + name: tendermint_${{ env.OS_ARCH }} + path: dist/tendermint_bin + + - name: Upload aea + uses: actions/upload-artifact@v4 + with: + name: aea_bin_${{ env.OS_ARCH }} + path: ./dist/aea_bin # Jobs for production and development, running separately for x64 and arm64 build-release: - runs-on: macos-14 + runs-on: ${{ matrix.os }} strategy: matrix: env: [production, development] - arch: [arm64, x64] + os: [macos-14, macos-14-large] needs: build-macos-pyinstaller @@ -108,17 +124,55 @@ jobs: yarn config set network-retries 10 # Retry up to 10 times yarn config set network-concurrency 2 # Reduce concurrency to 2 connections - + # Set OS_ARCH env + - name: Set architecture environment variable + run: | + if [ "${{ matrix.os }}" == "macos-14-large" ]; then + echo "OS_ARCH=x64" >> $GITHUB_ENV; + else + echo "OS_ARCH=arm64" >> $GITHUB_ENV; + fi # Download the appropriate architecture artifact - name: Download Pearl binary for architecture uses: actions/download-artifact@v4 with: - name: pearl_${{ matrix.arch }} + name: pearl_${{ env.OS_ARCH }} + path: electron/bins/ + + - name: Download aea binary for architecture + uses: actions/download-artifact@v4 + with: + name: aea_bin_${{ env.OS_ARCH }} + path: electron/bins/ + + - name: Download tendermint binary for architecture + uses: actions/download-artifact@v4 + with: + name: tendermint_${{ env.OS_ARCH }} path: electron/bins/ + + # Configure Yarn network settings for timeout, retries, and reduced concurrency + - name: Configure Yarn network settings + run: | + ls electron/bins/ + + # download TM + - name: Set architecture environment variable + run: | + + if [ "${{ matrix.os }}" == "macos-14-large" ]; then + export TM_DOWNLOAD_URL=https://github.com/tendermint/tendermint/releases/download/v0.34.19/tendermint_0.34.19_darwin_amd64.tar.gz + else + export TM_DOWNLOAD_URL=https://github.com/tendermint/tendermint/releases/download/v0.34.19/tendermint_0.34.19_darwin_arm64.tar.gz + fi + curl $TM_DOWNLOAD_URL -L -o tendermint.tar.gz + tar -xvf tendermint.tar.gz + cp ./tendermint electron/bins/tendermint + chmod +x electron/bins/tendermint # Add execution permissions to the binaries - name: Add exec permissions - run: chmod +x electron/bins/pearl_${{ matrix.arch }} + run: chmod +x electron/bins/* # Cache electron node_modules with unique key for each environment and architecture - name: Restore electron node_modules cache @@ -126,7 +180,7 @@ jobs: uses: actions/cache@v3 with: path: node_modules - key: electron-node-modules-${{ runner.os }}-${{ matrix.arch }}-${{ matrix.env }}-${{ hashFiles('yarn.lock') }} + key: electron-node-modules-${{ runner.os }}-${{ env.OS_ARCH }}-${{ matrix.env }}-${{ hashFiles('yarn.lock') }} # Install electron dependencies if cache miss - name: Install electron dependencies @@ -139,7 +193,7 @@ jobs: uses: actions/cache@v3 with: path: frontend/node_modules - key: frontend-node-modules-${{ runner.os }}-${{ matrix.arch }}-${{ matrix.env }}-${{ hashFiles('frontend/yarn.lock') }} + key: frontend-node-modules-${{ runner.os }}-${{ env.OS_ARCH }}-${{ matrix.env }}-${{ hashFiles('frontend/yarn.lock') }} # Install frontend dependencies if cache miss - name: Install frontend dependencies @@ -157,6 +211,7 @@ jobs: BASE_RPC: https://rpc-gate.autonolas.tech/base-rpc/ GNOSIS_RPC: https://rpc-gate.autonolas.tech/gnosis-rpc/ ETHEREUM_RPC: https://rpc-gate.autonolas.tech/ethereum-rpc/ + MODE_RPC: https://mainnet.mode.network # Build frontend for development @@ -167,9 +222,10 @@ jobs: NODE_ENV: ${{ matrix.env }} IS_STAGING: ${{ github.ref != 'refs/heads/main' && 'true' || 'false' }} OPTIMISM_RPC: https://rpc-gate.autonolas.tech/optimism-rpc/ - BASE_RPC: https://rpc-gate.autonolas.tech/base-rpc/ - GNOSIS_RPC: https://rpc-gate.autonolas.tech/gnosis-rpc/ + BASE_RPC: https://virtual.base.rpc.tenderly.co/2a91611a-3251-48a6-8095-b86815de84bf + GNOSIS_RPC: https://virtual.gnosis.rpc.tenderly.co/7de511da-9ad7-4e9f-98c1-e99052e92b15 ETHEREUM_RPC: https://rpc-gate.autonolas.tech/ethereum-rpc/ + MODE_RPC: https://mainnet.mode.network # Run the build and notarization process for production - name: Build, notarize, and publish (Production) @@ -182,12 +238,19 @@ jobs: CSC_LINK: ${{ secrets.CSC_LINK }} GH_TOKEN: ${{ secrets.github_token }} NODE_ENV: ${{ matrix.env }} - ARCH: ${{ matrix.arch }} + ARCH: ${{ env.OS_ARCH }} OPTIMISM_RPC: https://rpc-gate.autonolas.tech/optimism-rpc/ BASE_RPC: https://rpc-gate.autonolas.tech/base-rpc/ GNOSIS_RPC: https://rpc-gate.autonolas.tech/gnosis-rpc/ ETHEREUM_RPC: https://rpc-gate.autonolas.tech/ethereum-rpc/ - run: node build.js + MODE_RPC: https://mainnet.mode.network + run: | + echo "OPTIMISM_RPC=https://rpc-gate.autonolas.tech/optimism-rpc/" >> .env + echo "BASE_RPC=https://rpc-gate.autonolas.tech/base-rpc/" >> .env + echo "GNOSIS_RPC=https://rpc-gate.autonolas.tech/gnosis-rpc/" >> .env + echo "ETHEREUM_RPC=https://rpc-gate.autonolas.tech/ethereum-rpc/" >> .env + echo "MODE_RPC=https://mainnet.mode.network" >> .env + node build.js # Run the build and notarization process for development - name: Build, notarize, and publish (Development) @@ -200,9 +263,16 @@ jobs: CSC_LINK: ${{ secrets.CSC_LINK }} GH_TOKEN: ${{ secrets.github_token }} NODE_ENV: ${{ matrix.env }} - ARCH: ${{ matrix.arch }} - OPTIMISM_RPC: https://rpc-gate.autonolas.tech/optimism-rpc/ - BASE_RPC: https://rpc-gate.autonolas.tech/base-rpc/ - GNOSIS_RPC: https://rpc-gate.autonolas.tech/gnosis-rpc/ + ARCH: ${{ env.OS_ARCH }} + OPTIMISM_RPC: https://rpc-gate.autonolas.tech/optimism-rpc/ + BASE_RPC: https://virtual.base.rpc.tenderly.co/2a91611a-3251-48a6-8095-b86815de84bf + GNOSIS_RPC: https://virtual.gnosis.rpc.tenderly.co/7de511da-9ad7-4e9f-98c1-e99052e92b15 ETHEREUM_RPC: https://rpc-gate.autonolas.tech/ethereum-rpc/ - run: node build.js + MODE_RPC: https://mainnet.mode.network + run: | + echo "OPTIMISM_RPC=https://rpc-gate.autonolas.tech/optimism-rpc/" >> .env + echo "BASE_RPC=https://virtual.base.rpc.tenderly.co/2a91611a-3251-48a6-8095-b86815de84bf" >> .env + echo "GNOSIS_RPC=https://virtual.gnosis.rpc.tenderly.co/7de511da-9ad7-4e9f-98c1-e99052e92b15" >> .env + echo "ETHEREUM_RPC=https://rpc-gate.autonolas.tech/ethereum-rpc/" >> .env + echo "MODE_RPC=https://mainnet.mode.network" >> .env + node build.js diff --git a/.github/workflows/release_win.yml b/.github/workflows/release_win.yml index 609800a7d..4beeb0659 100644 --- a/.github/workflows/release_win.yml +++ b/.github/workflows/release_win.yml @@ -16,12 +16,14 @@ jobs: BASE_RPC: "https://rpc-gate.autonolas.tech/base-rpc/" GNOSIS_RPC: "https://rpc-gate.autonolas.tech/gnosis-rpc/" ETHEREUM_RPC: "https://rpc-gate.autonolas.tech/ethereum-rpc/" + MODE_RPC: "https://mainnet.mode.network" arch: "x64" - env: "development" OPTIMISM_RPC: "https://rpc-gate.autonolas.tech/optimism-rpc/" - BASE_RPC: "https://rpc-gate.autonolas.tech/base-rpc/" - GNOSIS_RPC: "https://virtual.gnosis.rpc.tenderly.co/80ff70d1-71fd-4c9e-9402-913f0c4c58b0" - ETHEREUM_RPC: "https://rpc-gate.autonolas.tech/ethereum-rpc/" + BASE_RPC: "https://virtual.base.rpc.tenderly.co/2a91611a-3251-48a6-8095-b86815de84bf" + GNOSIS_RPC: "https://virtual.gnosis.rpc.tenderly.co/7de511da-9ad7-4e9f-98c1-e99052e92b15" + ETHEREUM_RPC: "https://rpc-gate.autonolas.tech/ethereum-rpc/" + MODE_RPC: "https://mainnet.mode.network" arch: "x64" defaults: run: @@ -100,6 +102,35 @@ jobs: run: yarn install:frontend + - name: Setup Certificate + run: | + echo "${{secrets.SM_CLIENT_CERT_FILE_B64 }}" | base64 --decode > /d/Certificate_pkcs12.p12 + shell: bash + + - name: Set variables + id: variables + run: | + echo "::set-output name=version::${GITHUB_REF#refs/tags/v}" + echo "SM_HOST=${{ secrets.SM_HOST }}" >> "$GITHUB_ENV" + echo "SM_API_KEY=${{ secrets.SM_API_KEY }}" >> "$GITHUB_ENV" + echo "SM_KEY_PAIR_ALIAS=${{ secrets.SM_KEY_PAIR_ALIAS }}" >> "$GITHUB_ENV" + echo "SM_CLIENT_CERT_FILE=D:\\Certificate_pkcs12.p12" >> "$GITHUB_ENV" + echo "SM_CLIENT_CERT_PASSWORD=${{ secrets.SM_CLIENT_CERT_PASSWORD }}" >> "$GITHUB_ENV" + echo "C:\Program Files (x86)\Windows Kits\10\App Certification Kit" >> $GITHUB_PATH + echo "C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.8 Tools" >> $GITHUB_PATH + echo "C:\Program Files\DigiCert\DigiCert One Signing Manager Tools" >> $GITHUB_PATH + shell: bash + + - name: Setup SSM KSP on windows latest + run: | + curl -X GET https://one.digicert.com/signingmanager/api-ui/v1/releases/smtools-windows-x64.msi/download -H "x-api-key:%SM_API_KEY%" -o smtools-windows-x64.msi + msiexec /i smtools-windows-x64.msi /quiet /qn + smksp_registrar.exe list + smctl.exe keypair ls + C:\Windows\System32\certutil.exe -csp "DigiCert Signing Manager KSP" -key -user + smksp_cert_sync.exe + + shell: cmd - name: set env vars to prod.env env: NODE_ENV: ${{ matrix.env }} @@ -107,6 +138,7 @@ jobs: BASE_RPC: ${{ matrix.BASE_RPC }} ETHEREUM_RPC: ${{ matrix.ETHEREUM_RPC }} OPTIMISM_RPC: ${{ matrix.OPTIMISM_RPC }} + MODE_RPC: ${{ matrix.MODE_RPC }} IS_STAGING: ${{ github.ref != 'refs/heads/main' && 'true' || 'false' }} GH_TOKEN: ${{ secrets.github_token}} run: | @@ -116,6 +148,7 @@ jobs: echo BASE_RPC=$BASE_RPC >> prod.env echo ETHEREUM_RPC=$ETHEREUM_RPC >> prod.env echo GNOSIS_RPC=$GNOSIS_RPC >> prod.env + echo MODE_RPC=$MODE_RPC >> prod.env cat prod.env echo GH_TOKEN=$GH_TOKEN >> prod.env - run: rm -rf /dist diff --git a/Makefile b/Makefile index ea7348c80..6b9b599e4 100644 --- a/Makefile +++ b/Makefile @@ -10,30 +10,32 @@ endef ./trader/: pwd - git clone https://github.com/valory-xyz/trader.git + git clone https://github.com/valory-xyz/meme-ooorr.git -./dist/aea_win.exe: ./trader/ +./dist/aea_win.exe: ./electron/bins/ ./trader/ mkdir -p dist - cd trader && poetry install && rm -fr ./open-aea && git clone https://github.com/valory-xyz/open-aea.git -b fix/1.5.2_encoding && poetry run pip install ./open-aea/ && poetry run pyinstaller --collect-data eth_account --collect-all aea --collect-all autonomy --collect-all operate --collect-all aea_ledger_ethereum --collect-all aea_ledger_cosmos --collect-all aea_ledger_ethereum_flashbots --hidden-import aea_ledger_ethereum --hidden-import aea_ledger_cosmos --hidden-import aea_ledger_ethereum_flashbots --hidden-import grpc --hidden-import openapi_core --collect-all google.protobuf --collect-all openapi_core --collect-all openapi_spec_validator --collect-all asn1crypto --hidden-import py_ecc --hidden-import pytz --onefile pyinstaller/trader_bin.py --name trader_win - cp -f trader/dist/trader_win.exe ./dist/aea_win.exe + cd meme-ooorr && poetry lock --no-update && poetry install && rm -fr ./open-aea && git clone https://github.com/valory-xyz/open-aea.git -b fix/1.5.2_encoding && poetry run pip install ./open-aea/ && poetry run pyinstaller --collect-all twitter_text --collect-all google.generativeai --collect-all peewee --collect-data eth_account --collect-all aea --collect-all autonomy --collect-all operate --collect-all aea_ledger_ethereum --collect-all aea_ledger_cosmos --collect-all aea_ledger_ethereum_flashbots --hidden-import aea_ledger_ethereum --hidden-import aea_ledger_cosmos --hidden-import aea_ledger_ethereum_flashbots --hidden-import grpc --hidden-import openapi_core --collect-all google.protobuf --collect-all openapi_core --collect-all openapi_spec_validator --collect-all asn1crypto --hidden-import py_ecc --hidden-import pytz --collect-all twikit --collect-all twitter_text_parser --collect-all textblob --onefile pyinstaller/memeooorr_bin.py --name trader_win + cp -f meme-ooorr/dist/trader_win.exe ./dist/aea_win.exe + cp -f meme-ooorr/dist/trader_win.exe ./electron/bins/aea_win.exe pwd ./dist/aea_bin: ./trader/ mkdir -p dist - cd trader && poetry install && rm -fr ./open-aea && git clone https://github.com/valory-xyz/open-aea.git -b fix/1.5.2_encoding && poetry run pip install ./open-aea/ && poetry run pyinstaller --collect-data eth_account --collect-all aea --collect-all autonomy --collect-all operate --collect-all aea_ledger_ethereum --collect-all aea_ledger_cosmos --collect-all aea_ledger_ethereum_flashbots --hidden-import aea_ledger_ethereum --hidden-import aea_ledger_cosmos --hidden-import aea_ledger_ethereum_flashbots --hidden-import grpc --hidden-import openapi_core --collect-all google.protobuf --collect-all openapi_core --collect-all openapi_spec_validator --collect-all asn1crypto --hidden-import py_ecc --hidden-import pytz --onefile pyinstaller/trader_bin.py --name trader_bin - cp -f trader/dist/trader_bin ./dist/aea_bin + cd meme-ooorr && poetry lock --no-update && poetry install && rm -fr ./open-aea && git clone https://github.com/valory-xyz/open-aea.git -b fix/1.5.2_encoding && poetry run pip install ./open-aea/ && poetry run pyinstaller --collect-all twitter_text --collect-data eth_account --collect-all peewee --collect-all google.generativeai --collect-all aea --collect-all autonomy --collect-all operate --collect-all aea_ledger_ethereum --collect-all aea_ledger_cosmos --collect-all aea_ledger_ethereum_flashbots --hidden-import aea_ledger_ethereum --hidden-import aea_ledger_cosmos --hidden-import aea_ledger_ethereum_flashbots --hidden-import grpc --hidden-import openapi_core --collect-all google.protobuf --collect-all openapi_core --collect-all openapi_spec_validator --collect-all asn1crypto --hidden-import py_ecc --hidden-import pytz --collect-all twikit --collect-all twitter_text_parser --collect-all textblob --onefile pyinstaller/memeooorr_bin.py --name trader_bin + cp -f meme-ooorr/dist/trader_bin ./dist/aea_bin pwd -./dist/tendermint_win.exe: ./operate/ +./dist/tendermint_win.exe: ./electron/bins/ ./operate/ pwd poetry install && poetry run pyinstaller operate/services/utils/tendermint.py --onefile --name tendermint_win + cp dist/tendermint_win.exe ./electron/bins/tendermint_win.exe ./dist/pearl_win.exe: ./operate/ ./dist/aea_win.exe ./dist/tendermint_win.exe pwd - poetry install && rm -fr ./open-aea && git clone https://github.com/valory-xyz/open-aea.git -b fix/1.5.2_encoding && poetry run pip install ./open-aea/ && poetry run pyinstaller --collect-data eth_account --collect-all aea --collect-all coincurve --collect-all autonomy --collect-all operate --collect-all aea_ledger_ethereum --collect-all aea_ledger_cosmos --collect-all aea_ledger_ethereum_flashbots --hidden-import aea_ledger_ethereum --hidden-import aea_ledger_cosmos --hidden-import aea_ledger_ethereum_flashbots operate/pearl.py --add-binary dist/aea_win.exe:. --add-binary dist/tendermint_win.exe:. --onefile --name pearl_win + poetry install && rm -fr ./open-aea && git clone https://github.com/valory-xyz/open-aea.git -b fix/1.5.2_encoding && poetry run pip install ./open-aea/ && poetry run pyinstaller --collect-data eth_account --collect-all aea --collect-all coincurve --collect-all autonomy --collect-all operate --collect-all aea_ledger_ethereum --collect-all aea_ledger_cosmos --collect-all aea_ledger_ethereum_flashbots --hidden-import aea_ledger_ethereum --hidden-import aea_ledger_cosmos --hidden-import aea_ledger_ethereum_flashbots operate/pearl.py --onefile --name pearl_win ./electron/bins/: @@ -48,13 +50,13 @@ endef build: ./dist/pearl_win.exe ./electron/bins/tendermint.exe $(call setup_env, prod) cp -f dist/pearl_win.exe ./electron/bins/pearl_win.exe - NODE_ENV=${NODE_ENV} GNOSIS_RPC=${GNOSIS_RPC} OPTIMISM_RPC=${OPTIMISM_RPC} BASE_RPC=${BASE_RPC} ETHEREUM_RPC=${ETHEREUM_RPC} yarn build:frontend - NODE_ENV=${NODE_ENV} GNOSIS_RPC=${GNOSIS_RPC} OPTIMISM_RPC=${OPTIMISM_RPC} BASE_RPC=${BASE_RPC} ETHEREUM_RPC=${ETHEREUM_RPC} GH_TOKEN=${GH_TOKEN} node build-win.js + NODE_ENV=${NODE_ENV} GNOSIS_RPC=${GNOSIS_RPC} OPTIMISM_RPC=${OPTIMISM_RPC} BASE_RPC=${BASE_RPC} ETHEREUM_RPC=${ETHEREUM_RPC} MODE_RPC=${MODE_RPC} yarn build:frontend + NODE_ENV=${NODE_ENV} GNOSIS_RPC=${GNOSIS_RPC} OPTIMISM_RPC=${OPTIMISM_RPC} BASE_RPC=${BASE_RPC} ETHEREUM_RPC=${ETHEREUM_RPC} MODE_RPC=${MODE_RPC} GH_TOKEN=${GH_TOKEN} node build-win.js .PHONY: build-tenderly build-tenderly: ./dist/pearl_win.exe $(call setup_env, dev-tenderly) cp -f dist/pearl_win.exe ./electron/bins/pearl_win.exe - NODE_ENV=${NODE_ENV} GNOSIS_RPC=${GNOSIS_RPC} OPTIMISM_RPC=${OPTIMISM_RPC} BASE_RPC=${BASE_RPC} ETHEREUM_RPC=${ETHEREUM_RPC} yarn build:frontend - GH_TOKEN=${GH_TOKEN} node build-win-tenderly.js \ No newline at end of file + NODE_ENV=${NODE_ENV} GNOSIS_RPC=${GNOSIS_RPC} OPTIMISM_RPC=${OPTIMISM_RPC} BASE_RPC=${BASE_RPC} ETHEREUM_RPC=${ETHEREUM_RPC} MODE_RPC=${MODE_RPC} yarn build:frontend + GH_TOKEN=${GH_TOKEN} node build-win-tenderly.js diff --git a/api.md b/api.md index c199f57fa..dff57591c 100644 --- a/api.md +++ b/api.md @@ -203,7 +203,7 @@ Returns a list of available wallets Returns a list of available wallets with enriched information. It executes on-chain requests to populate the list of owners of each safe, and provides the attributes - `consistent_backup_owner`: This flag is `true` when all safes across the chains have exactly the same set of backup owner addresses. It ensures that ownership is identical across all safes, regardless of the number of owners. -- `consistent_backup_owner_count`: This flag is `true` when all safes have the same number of owners, and that number is either 0 (no backup owners) or 1 (exactly one backup owner). It checks for uniformity in the count of owners and restricts the count to these two cases. +- `consistent_backup_owner_count`: This flag is `true` when all safes have exactly one backup owner. - `consistent_safe_address`: This flag is `true` when all chains have the same safe address. It ensures there is a single safe address consistently used across all chains.
@@ -313,6 +313,7 @@ Creates a Gnosis safe for given chain. ```js { "chain": Chain, + "fund_amount": 10000000000000000 } ``` @@ -888,6 +889,43 @@ Delete local deployment ```json ``` +--- +#### `POST /api/services/{service}/onchain/withdraw` + +Withdraw all the funds from the service safe, service signer(s), master safe, and master signer. + +
+ Request + +```json +{ + "withdrawal_address": "0x0000000000000000000000000000000000000000" +} +``` + +
+ +
+ Response 200 + +```json +{ + "error": null +} +``` + +
+ +
+ Response 500 + +```json +{ + "error": "Insufficient funds", + "traceback": "" +} +``` +