Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 45 additions & 0 deletions .github/actions/setup-node-and-deps/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
name: Setup Node and Dependencies
description: Setup Node.js with Yarn and Turbo caching

inputs:
node-version:
description: 'Node.js version to use'
required: true
default: '22'

runs:
using: composite
steps:
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: ${{ inputs.node-version }}

- name: Enable Corepack
shell: bash
run: corepack enable

- name: Get yarn cache directory path
id: yarn-cache-dir-path
shell: bash
run: echo "dir=$(yarn config get cacheFolder)" >> $GITHUB_OUTPUT

- name: Cache yarn dependencies
uses: actions/cache@v4
with:
path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
restore-keys: |
${{ runner.os }}-yarn-

- name: Cache Turbo
uses: actions/cache@v4
with:
path: .turbo
key: ${{ runner.os }}-turbo-${{ github.sha }}
restore-keys: |
${{ runner.os }}-turbo-

- name: Install dependencies
shell: bash
run: yarn install --immutable
207 changes: 207 additions & 0 deletions .github/workflows/deploy.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,207 @@
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 }}
11 changes: 6 additions & 5 deletions apps/swap-service/.env.example
Original file line number Diff line number Diff line change
Expand Up @@ -60,16 +60,17 @@ VITE_MAYACHAIN_MIDGARD_URL="https://api.mayachain.shapeshift.com/midgard/v2"

# Swapper API URLs
VITE_COWSWAP_BASE_URL="https://api.cow.fi"
VITE_CHAINFLIP_API_KEY="09bc0796ff40435482c0a54fa6ae2784"
VITE_CHAINFLIP_API_URL="https://chainflip-broker.io"
VITE_RELAY_API_URL="https://api.relay.link"
VITE_PORTALS_BASE_URL="https://api.portals.fi"
VITE_ZRX_BASE_URL="https://api.proxy.shapeshift.com/api/v1/zrx/"
VITE_BEBOP_API_KEY=b4a7ffa9-2abb-45ae-8ddd-ec33bc377939
VITE_NEAR_INTENTS_API_KEY=eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IjIwMjUtMDQtMjMtdjEifQ.eyJ2IjoxLCJrZXlfdHlwZSI6ImludGVncmF0aW9ucyIsInBhcnRuZXJfaWQiOiJnb21lcy1zaGFwZS1zaGlmdCIsImlhdCI6MTc2MjgxNjQ3MCwiZXhwIjoxNzk0MzUyNDcwfQ.BHFPJ1y-UnVBN3Y_PtMfP9MRng-hKPowYDLOeLj4Cnsvs9lNgikgaC_e41PO4LduMKiRRrtwfRhzUfV5Usdsf8IS9U7mF1UrUwDqyEEOF10weJWYU36Gg6NyNuIFgJhvV8sFzwPShbenLHIR3gIZ97pyBmpJ8jTDZu7ncw6kVqY6hcsu6H9Pyl9jYNdSwhdWUgZ9UswPPTeecrF1wgQPpE3i3tNT-fTbDtj-DswmEIT3f8qgfgZBi7cde68gsGiVy7v0cSE2r8y9UwFWejuUoltUDrTEmF6lCJHGuCaKYqGqZs2MBiIr5xnYpzlsKFTYlUNa8cTTcXng_pzWd5LrsA

# Additional APIs (used in swaps service)
VITE_JUPITER_API_URL="https://quote-api.jup.ag/v6"

# API Keys
VITE_BEBOP_API_KEY=
VITE_CHAINFLIP_API_KEY=
VITE_NEAR_INTENTS_API_KEY=

# Service URLs
NOTIFICATIONS_SERVICE_URL="http://notifications-service:3003"
USER_SERVICE_URL="http://user-service:3003"
5 changes: 4 additions & 1 deletion apps/user-service/.env.example
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,7 @@
ACCOUNT_ID_SALT=

# Database Configuration
DATABASE_URL=postgresql://postgres:password@user-db:5432/user_service
DATABASE_URL=postgresql://postgres:password@user-db:5432/user_service

# Service URLs
SWAP_SERVICE_URL="http://swap-service:3003"
8 changes: 5 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,10 @@
"start": "turbo run start",
"start:dev": "turbo run start:dev",
"test": "jest",
"lint": "eslint \"{apps,packages}/**/*.ts\" --fix",
"format": "prettier --write \"**/*.{ts,js,json,md}\"",
"lint": "eslint --cache \"{apps,packages}/**/*.ts\"",
"lint:fix": "yarn lint --fix",
"format": "prettier --check \"**/*.{ts,js,json,md}\"",
"format:fix": "prettier --write \"**/*.{ts,js,json,md}\"",
"docker:build": "docker-compose build",
"docker:up": "docker-compose up -d",
"docker:down": "docker-compose down",
Expand Down Expand Up @@ -48,7 +50,7 @@
"@shapeshiftoss/swapper": "17.6.7",
"@shapeshiftoss/types": "8.6.5",
"@shapeshiftoss/unchained-client": "10.14.8",
"@shapeshiftoss/unchained-pulumi": "1.0.0",
"@shapeshiftoss/unchained-pulumi": "1.0.2",
"axios": "^1.7.4",
"dotenv": "^17.2.2",
"p-lazy": "3.1.0",
Expand Down
Loading
Loading