diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..171dc11 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,28 @@ +name: build + +on: + push: + branches: [ "main" ] + pull_request: + branches: [ "main" ] + +jobs: + build: + runs-on: ubuntu-latest + permissions: + packages: write + contents: read + steps: + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + - name: Login to GitHub Container Registry + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + - name: ${{ github.ref == 'refs/heads/main' && 'Build and Push Docker image' || 'Build Docker image' }} + uses: docker/build-push-action@v5 + with: + push: ${{ github.ref == 'refs/heads/main'}} + tags: ghcr.io/geniusyield/smart-order-router:latest diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..ebb9e17 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,67 @@ +FROM haskell:9.2.8-slim as builder + +ENV LANG C.UTF-8 + +RUN apt-get update && \ + apt-get install -y --no-install-recommends \ + autoconf \ + automake \ + build-essential \ + chrony \ + libncursesw5 \ + liblzma-dev \ + libpq-dev \ + libssl-dev \ + libsystemd-dev \ + libtool \ + pkg-config \ + procps \ + tmux && \ + rm -rf /var/lib/apt/lists/* + +# Libsodium: +RUN git clone https://github.com/input-output-hk/libsodium && \ + cd libsodium && \ + git checkout dbb48cc && \ + ./autogen.sh && \ + ./configure && \ + make && \ + make install + +# Libsecp256k1: +RUN git clone https://github.com/bitcoin-core/secp256k1 && \ + cd secp256k1 && \ + git checkout ac83be33d0956faf6b7f61a60ab524ef7d6a473a && \ + ./autogen.sh && \ + ./configure --prefix=/usr --enable-module-schnorrsig --enable-experimental && \ + make && \ + make install + +ENV LD_LIBRARY_PATH="/usr/local/lib:$LD_LIBRARY_PATH" +ENV PKG_CONFIG_PATH="/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH" + +# ==================================[ BUILD ]======================================== +WORKDIR /SOR + +COPY . . + +RUN cabal update +RUN cabal build all +RUN cabal test +RUN cabal install --global + +# =============================[ SMART ORDER ROUTER ]================================ +LABEL org.opencontainers.image.source="https://github.com/geniusyield/smart-order-router" + +# Default values: +ENV BOTC_FP_NFT_POLICY='compiled-scripts/minting-policy' +ENV BOTC_FP_ORDER_VALIDATOR='compiled-scripts/partial-order' +ENV BOTC_EXECUTION_STRAT='OneSellToManyBuy' +ENV BOTC_RESCAN_DELAY='30000000' +ENV BOTC_MAX_ORDERS_MATCHES='5' +ENV BOTC_MAX_TXS_PER_ITERATION='4' +ENV BOTC_RANDOMIZE_MATCHES_FOUND='True' +ENV BOTC_ASSET_FILTER='[{"commodityAsset":"c6e65ba7878b2f8ea0ad39287d3e2fd256dc5c4160fc19bdf4c4d87e.7447454e53","currencyAsset":"lovelace"},{"commodityAsset":"0254a6ffa78edb03ea8933dbd4ca078758dbfc0fc6bb0d28b7a9c89f.4c454e4649","currencyAsset":"lovelace"},{"commodityAsset":"8cafc9b387c9f6519cacdce48a8448c062670c810d8da4b232e56313.6d4e5458","currencyAsset":"lovelace"},{"commodityAsset":"171163f05e4f30b6be3c22668c37978e7d508b84f83558e523133cdf.74454d50","currencyAsset":"lovelace"}]' +ENV BOTC_POREFS='{"refAddr":"addr_test1wpgexmeunzsykesf42d4eqet5yvzeap6trjnflxqtkcf66g0kpnxt","refNftAC":"fae686ea8f21d567841d703dea4d4221c2af071a6f2b433ff07c0af2.e6a295bb83d06f53fcf91151f54acec0a63fbd6f0d924206d5d012e6da3b72af","refNftUtxoRef":"39f987a6beb9cc4c45bba149a21c28068f640f3593f15f8157f0b6022b431977#0","scriptRef":"39f987a6beb9cc4c45bba149a21c28068f640f3593f15f8157f0b6022b431977#1","nftPolicyRef":"39f987a6beb9cc4c45bba149a21c28068f640f3593f15f8157f0b6022b431977#0"}' + +ENTRYPOINT ["/bin/bash", "./start.sh"] diff --git a/README.md b/README.md index 7fa8090..dda85af 100644 --- a/README.md +++ b/README.md @@ -126,7 +126,70 @@ using these `18 tokenB` we buy back `9 tokenA` from the buy order, earning `2 to ### Docker -:construction: Coming Soon :construction: +A ready-to-run, containerized version of the Smart Order Router is availabe via the [GitHub Container Registry](ghcr.io/geniusyield/smart-order-router:latest). + +A Smart Order Router container instance using the Maestro backend can be started by using the following snippet: + +``` bash +# SMART ORDER INSTANCE ROUTER USING MAESTRO +# ========================================= +# Replace these values with your configuration: +PAYMENT_SIGNING_KEY_CBOR_HEX=5820d682e237a04d43ad011fdecd141acd485f6d3d634466692d58f6d75250f39134 +COLLATERAL_UTXO_REF=7cc7b044d26981d3fc73ae72994f289d99ba113ceefb5b83f4d7643bfb12682a#1 +MAESTRO_API_KEY=some_api_key +CARDANO_NETWORK=testnet-preprod + +docker run -it \ + -e BOTC_SKEY="{\"cborHex\": \"$PAYMENT_SIGNING_KEY_CBOR_HEX\", \"type\": \"PaymentSigningKeyShelley_ed25519\", \"description\": \"Payment Signing Key\"}" \ + -e BOTC_COLLATERAL="$COLLATERAL_UTXO_REF" \ + -e BOTC_CONFIG="{ \"coreProvider\": { \"maestroToken\": \"$MAESTRO_API_KEY\" }, \"networkId\": \"$CARDANO_NETWORK\", \"logging\": [{ \"type\": { \"tag\": \"stderr\" }, \"severity\": \"Info\", \"verbosity\": \"V2\" }],\"utxoCacheEnable\": false }" \ + ghcr.io/geniusyield/smart-order-router:latest +``` + +Please make sure to replace the placeholders with the actual values. + +Alternatively the Blockfrost or the Kupo backend could be used. + +This can be accomplished for Blockfrost by using the following commands: + +``` bash +# SMART ORDER ROUTER INSTANCE USING BLOCKFROST +# ============================================ +# Replace these values with your configuration: +PAYMENT_SIGNING_KEY_CBOR_HEX=5820d682e237a04d43ad011fdecd141acd485f6d3d634466692d58f6d75250f39134 +COLLATERAL_UTXO_REF=7cc7b044d26981d3fc73ae72994f289d99ba113ceefb5b83f4d7643bfb12682a#1 +BLOCKFROST_API_KEY=some_api_key +CARDANO_NETWORK=testnet-preprod + +docker run -it \ + -e BOTC_SKEY="{\"cborHex\": \"$PAYMENT_SIGNING_KEY_CBOR_HEX\", \"type\": \"PaymentSigningKeyShelley_ed25519\", \"description\": \"Payment Signing Key\"}" \ + -e BOTC_COLLATERAL="$COLLATERAL_UTXO_REF" \ + -e BOTC_CONFIG="{ \"coreProvider\": { \"blockfrostKey\": \"$BLOCKFROST_API_KEY\" }, \"networkId\": \"$CARDANO_NETWORK\", \"logging\": [{ \"type\": { \"tag\": \"stderr\" }, \"severity\": \"Info\", \"verbosity\": \"V2\" }],\"utxoCacheEnable\": false }" \ + ghcr.io/geniusyield/smart-order-router:latest +``` + +And the following commands can be used to start a Kupo backed instance: + +``` bash +# SMART ORDER ROUTER INSTANCE USING KUPO +# ====================================== +# Replace these values with your configuration: +PAYMENT_SIGNING_KEY_CBOR_HEX=5820d682e237a04d43ad011fdecd141acd485f6d3d634466692d58f6d75250f39134 +COLLATERAL_UTXO_REF=7cc7b044d26981d3fc73ae72994f289d99ba113ceefb5b83f4d7643bfb12682a#1 +KUPO_URL=http://some.url.to.your.kupo.instance:1442 +CARDANO_NODE_SOCKET_PATH=/cardano/node/socket +CARDANO_NETWORK=testnet-preprod + +docker run -it \ + -e BOTC_SKEY="{\"cborHex\": \"$PAYMENT_SIGNING_KEY_CBOR_HEX\", \"type\": \"PaymentSigningKeyShelley_ed25519\", \"description\": \"Payment Signing Key\"}" \ + -e BOTC_COLLATERAL="$COLLATERAL_UTXO_REF" \ + -e BOTC_CONFIG="{\"coreProvider\": { \"socketPath\": \"/cardano/node/socket\", \"kupoUrl\": \"$KUPO_URL\" }, \"networkId\": \"$CARDANO_NETWORK\", \"logging\": [{ \"type\": { \"tag\": \"stderr\" }, \"severity\": \"Info\", \"verbosity\": \"V2\" }], \"utxoCacheEnable\": false }" \ + -v $CARDANO_NODE_SOCKET_PATH:/cardano/node/socket + ghcr.io/geniusyield/smart-order-router:latest +``` + +> [!NOTE] +> :construction: Coming Soon: docker-compose :construction: ### Local build diff --git a/start.sh b/start.sh new file mode 100644 index 0000000..1a57904 --- /dev/null +++ b/start.sh @@ -0,0 +1,3 @@ +#!/bin/bash +echo $BOTC_CONFIG >> ~/config.json +geniusyield-orderbot-exe run ~/config.json