Skip to content

feat: attempt at doing swap as a service #24

feat: attempt at doing swap as a service

feat: attempt at doing swap as a service #24

Workflow file for this run

name: Build and Deploy
on:
push:
branches:
- main
pull_request:
branches:
- main
env:
NODE_VERSION: '22.5.1'
jobs:
lint-and-test:
name: Lint and Test
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup Node and Dependencies
uses: ./.github/actions/setup-node-and-deps
with:
node-version: ${{ env.NODE_VERSION }}
- name: Lint
run: yarn lint
continue-on-error: true
- name: Run tests
run: yarn test
continue-on-error: true
deploy:
name: Deploy ${{ matrix.service }} (${{ matrix.environment }})
runs-on: ubuntu-latest
needs: lint-and-test
if: github.event_name == 'push'
environment: ${{ matrix.environment }}
concurrency:
group: deploy-${{ matrix.environment }}-${{ matrix.service }}
cancel-in-progress: false
strategy:
matrix:
include:
# Development environment
- service: notifications-service
environment: dev
pulumi_stack: public-dev-us-east-2
db_secret: NOTIFICATIONS_SERVICE_DATABASE_URL
cpu_limit: 250m
memory_limit: 250Mi
replicas: 1
- service: swap-service
environment: dev
pulumi_stack: public-dev-us-east-2
db_secret: SWAP_SERVICE_DATABASE_URL
cpu_limit: 250m
memory_limit: 250Mi
replicas: 1
- service: user-service
environment: dev
pulumi_stack: public-dev-us-east-2
db_secret: USER_SERVICE_DATABASE_URL
cpu_limit: 250m
memory_limit: 250Mi
replicas: 1
# Production environment
#- service: notifications-service
# environment: prod
# pulumi_stack: public-us-east-2
# db_secret: NOTIFICATIONS_SERVICE_DATABASE_URL
# cpu_limit: 250m
# memory_limit: 250Mi
# replicas: 2
#- service: swap-service
# environment: prod
# pulumi_stack: public-us-east-2
# db_secret: SWAP_SERVICE_DATABASE_URL
# cpu_limit: 250m
# memory_limit: 250Mi
# replicas: 2
#- service: user-service
# environment: prod
# pulumi_stack: public-us-east-2
# db_secret: USER_SERVICE_DATABASE_URL
# cpu_limit: 250m
# memory_limit: 250Mi
# replicas: 2
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup Node and Dependencies
uses: ./.github/actions/setup-node-and-deps
with:
node-version: ${{ env.NODE_VERSION }}
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Configure AWS Credentials
uses: aws-actions/configure-aws-credentials@v4
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: us-east-2
- name: Install Pulumi CLI
uses: pulumi/actions@v5
- name: Configure and Deploy with Pulumi
working-directory: apps/${{ matrix.service }}/pulumi
run: |
pulumi stack select unchained/${{ matrix.pulumi_stack }}
pulumi config set --path unchained:coinstack.assetName ${{ matrix.service }}
pulumi config set --path unchained:coinstack.stack unchained/common/dependencies-us-east-2
${{ matrix.environment == 'dev' && 'pulumi config set --path unchained:coinstack.environment dev' || 'echo "Skipping environment config for prod"' }}
pulumi config set --path unchained:coinstack.network mainnet
pulumi config set --path unchained:coinstack.api.cpuLimit ${{ matrix.cpu_limit }}
pulumi config set --path unchained:coinstack.api.memoryLimit ${{ matrix.memory_limit }}
pulumi config set --path unchained:coinstack.api.replicas ${{ matrix.replicas }}
pulumi up -f --yes --refresh --suppress-outputs
env:
ADDITIONAL_ROOT_DOMAIN_NAME: shapeshift.com
DOCKER_BUILDKIT: 1
PULUMI_ACCESS_TOKEN: ${{ secrets.PULUMI_ACCESS_TOKEN }}
# Service URLs
USER_SERVICE_URL: http://user-service-svc.unchained${{ matrix.environment == 'dev' && '-dev' || '' }}.svc.cluster.local:3000
NOTIFICATIONS_SERVICE_URL: http://notifications-service-svc.unchained${{ matrix.environment == 'dev' && '-dev' || '' }}.svc.cluster.local:3000
SWAP_SERVICE_URL: http://swap-service-svc.unchained${{ matrix.environment == 'dev' && '-dev' || '' }}.svc.cluster.local:3000
# Unchained API URLs (dynamic based on environment)
VITE_UNCHAINED_ETHEREUM_HTTP_URL: https://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.ethereum.shapeshift.com
VITE_UNCHAINED_ETHEREUM_WS_URL: wss://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.ethereum.shapeshift.com
VITE_UNCHAINED_AVALANCHE_HTTP_URL: https://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.avalanche.shapeshift.com
VITE_UNCHAINED_AVALANCHE_WS_URL: wss://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.avalanche.shapeshift.com
VITE_UNCHAINED_OPTIMISM_HTTP_URL: https://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.optimism.shapeshift.com
VITE_UNCHAINED_OPTIMISM_WS_URL: wss://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.optimism.shapeshift.com
VITE_UNCHAINED_BNBSMARTCHAIN_HTTP_URL: https://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.bnbsmartchain.shapeshift.com
VITE_UNCHAINED_BNBSMARTCHAIN_WS_URL: wss://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.bnbsmartchain.shapeshift.com
VITE_UNCHAINED_POLYGON_HTTP_URL: https://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.polygon.shapeshift.com
VITE_UNCHAINED_POLYGON_WS_URL: wss://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.polygon.shapeshift.com
VITE_UNCHAINED_GNOSIS_HTTP_URL: https://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.gnosis.shapeshift.com
VITE_UNCHAINED_GNOSIS_WS_URL: wss://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.gnosis.shapeshift.com
VITE_UNCHAINED_ARBITRUM_HTTP_URL: https://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.arbitrum.shapeshift.com
VITE_UNCHAINED_ARBITRUM_WS_URL: wss://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.arbitrum.shapeshift.com
VITE_UNCHAINED_ARBITRUM_NOVA_HTTP_URL: https://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.arbitrum-nova.shapeshift.com
VITE_UNCHAINED_ARBITRUM_NOVA_WS_URL: wss://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.arbitrum-nova.shapeshift.com
VITE_UNCHAINED_BASE_HTTP_URL: https://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.base.shapeshift.com
VITE_UNCHAINED_BASE_WS_URL: wss://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.base.shapeshift.com
VITE_UNCHAINED_BITCOIN_HTTP_URL: https://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.bitcoin.shapeshift.com
VITE_UNCHAINED_BITCOIN_WS_URL: wss://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.bitcoin.shapeshift.com
VITE_UNCHAINED_DOGECOIN_HTTP_URL: https://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.dogecoin.shapeshift.com
VITE_UNCHAINED_DOGECOIN_WS_URL: wss://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.dogecoin.shapeshift.com
VITE_UNCHAINED_LITECOIN_HTTP_URL: https://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.litecoin.shapeshift.com
VITE_UNCHAINED_LITECOIN_WS_URL: wss://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.litecoin.shapeshift.com
VITE_UNCHAINED_BITCOINCASH_HTTP_URL: https://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.bitcoincash.shapeshift.com
VITE_UNCHAINED_BITCOINCASH_WS_URL: wss://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.bitcoincash.shapeshift.com
VITE_UNCHAINED_COSMOS_HTTP_URL: https://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.cosmos.shapeshift.com
VITE_UNCHAINED_COSMOS_WS_URL: wss://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.cosmos.shapeshift.com
VITE_UNCHAINED_THORCHAIN_HTTP_URL: https://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.thorchain.shapeshift.com
VITE_UNCHAINED_THORCHAIN_WS_URL: wss://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.thorchain.shapeshift.com
VITE_UNCHAINED_MAYACHAIN_HTTP_URL: https://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.mayachain.shapeshift.com
VITE_UNCHAINED_MAYACHAIN_WS_URL: wss://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.mayachain.shapeshift.com
VITE_UNCHAINED_SOLANA_HTTP_URL: https://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.solana.shapeshift.com
VITE_UNCHAINED_SOLANA_WS_URL: wss://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.solana.shapeshift.com
# Node URLs (dynamic based on environment)
VITE_ETHEREUM_NODE_URL: https://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.ethereum.shapeshift.com/api/v1/jsonrpc
VITE_AVALANCHE_NODE_URL: https://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.avalanche.shapeshift.com/api/v1/jsonrpc
VITE_OPTIMISM_NODE_URL: https://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.optimism.shapeshift.com/api/v1/jsonrpc
VITE_BNBSMARTCHAIN_NODE_URL: https://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.bnbsmartchain.shapeshift.com/api/v1/jsonrpc
VITE_POLYGON_NODE_URL: https://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.polygon.shapeshift.com/api/v1/jsonrpc
VITE_GNOSIS_NODE_URL: https://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.gnosis.shapeshift.com/api/v1/jsonrpc
VITE_ARBITRUM_NODE_URL: https://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.arbitrum.shapeshift.com/api/v1/jsonrpc
VITE_ARBITRUM_NOVA_NODE_URL: https://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.arbitrum-nova.shapeshift.com/api/v1/jsonrpc
VITE_BASE_NODE_URL: https://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.base.shapeshift.com/api/v1/jsonrpc
VITE_THORCHAIN_NODE_URL: https://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.thorchain.shapeshift.com/lcd
VITE_MAYACHAIN_NODE_URL: https://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.mayachain.shapeshift.com/lcd
VITE_SOLANA_NODE_URL: https://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.solana.shapeshift.com/api/v1/jsonrpc
# Midgard URLs (dynamic based on environment)
VITE_THORCHAIN_MIDGARD_URL: https://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.thorchain.shapeshift.com/midgard/v2
VITE_MAYACHAIN_MIDGARD_URL: https://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.mayachain.shapeshift.com/midgard/v2
# DEX/Swapper URLs
VITE_CHAINFLIP_API_URL: https://chainflip-broker.io
VITE_COWSWAP_BASE_URL: https://api.cow.fi
VITE_JUPITER_API_URL: https://quote-api.jup.ag/v6
VITE_PORTALS_BASE_URL: https://api.portals.fi
VITE_RELAY_API_URL: https://api.relay.link
VITE_ZRX_BASE_URL: https://${{ matrix.environment == 'dev' && 'dev-' || '' }}api.proxy.shapeshift.com/api/v1/zrx/
# Secrets (from GitHub Secrets)
ACCOUNT_ID_SALT: ${{ secrets.ACCOUNT_ID_SALT }}
DATABASE_URL: ${{ secrets[matrix.db_secret] }}
EXPO_ACCESS_TOKEN: ${{ secrets.EXPO_ACCESS_TOKEN }}
VITE_BEBOP_API_KEY: ${{ secrets.BEBOP_API_KEY }}
VITE_CHAINFLIP_API_KEY: ${{ secrets.CHAINFLIP_API_KEY }}
VITE_NEAR_INTENTS_API_KEY: ${{ secrets.NEAR_INTENTS_API_KEY }}