diff --git a/.github/actions/setup-node-and-deps/action.yml b/.github/actions/setup-node-and-deps/action.yml new file mode 100644 index 0000000..f22f12e --- /dev/null +++ b/.github/actions/setup-node-and-deps/action.yml @@ -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 diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml new file mode 100644 index 0000000..f263a5f --- /dev/null +++ b/.github/workflows/deploy.yml @@ -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 }} \ No newline at end of file diff --git a/apps/swap-service/.env.example b/apps/swap-service/.env.example index 758a3ee..5cc2e31 100644 --- a/apps/swap-service/.env.example +++ b/apps/swap-service/.env.example @@ -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" diff --git a/apps/user-service/.env.example b/apps/user-service/.env.example index 004e05b..a3ca25d 100644 --- a/apps/user-service/.env.example +++ b/apps/user-service/.env.example @@ -2,4 +2,7 @@ ACCOUNT_ID_SALT= # Database Configuration -DATABASE_URL=postgresql://postgres:password@user-db:5432/user_service \ No newline at end of file +DATABASE_URL=postgresql://postgres:password@user-db:5432/user_service + +# Service URLs +SWAP_SERVICE_URL="http://swap-service:3003" \ No newline at end of file diff --git a/package.json b/package.json index f046ef1..4da44bd 100644 --- a/package.json +++ b/package.json @@ -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", @@ -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", diff --git a/yarn.lock b/yarn.lock index fd5b30f..3af4574 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4875,16 +4875,16 @@ __metadata: languageName: node linkType: hard -"@shapeshiftoss/cluster-launcher@npm:^0.22.3": - version: 0.22.3 - resolution: "@shapeshiftoss/cluster-launcher@npm:0.22.3" +"@shapeshiftoss/cluster-launcher@npm:^0.22.5": + version: 0.22.5 + resolution: "@shapeshiftoss/cluster-launcher@npm:0.22.5" dependencies: "@pulumi/aws": "npm:6.83.0" "@pulumi/awsx": "npm:2.22.0" "@pulumi/eks": "npm:3.9.1" "@pulumi/kubernetes": "npm:4.23.0" "@pulumi/pulumi": "npm:3.160.0" - checksum: 10/3a2d693f42e348fbcde715bd5a91429815cba813d0e08028e017819b36aa859d907643c62d4a711e44569984c66f3006d0b7c55bceef84017dbe997373ee9e55 + checksum: 10/0055fe4b8b54c493d2d698864059f952b09de30be31fd123dd7b4da84695a5faf51029740b592e16672ee4ab1ffaa8b0320d79c7f0604440355f6dfbd267fa86 languageName: node linkType: hard @@ -5050,12 +5050,13 @@ __metadata: languageName: node linkType: hard -"@shapeshiftoss/unchained-pulumi@npm:1.0.0": - version: 1.0.0 - resolution: "@shapeshiftoss/unchained-pulumi@npm:1.0.0" +"@shapeshiftoss/unchained-pulumi@npm:1.0.2": + version: 1.0.2 + resolution: "@shapeshiftoss/unchained-pulumi@npm:1.0.2" dependencies: - "@shapeshiftoss/cluster-launcher": "npm:^0.22.3" - checksum: 10/94d86e318be33b5f522ac26850a0e93c652485cfc894943a571aac3a0fbd629764839c99015f9c054c4ffb39936c25243d3a6436f0834491d2525459a8ff7b52 + "@shapeshiftoss/cluster-launcher": "npm:^0.22.5" + folder-hash: "npm:^4.0.4" + checksum: 10/803fd980570239dd4bc5dcc340e7463419cd9fb303e7e04e1df641befea6ffd3e32234f3ac77208c46a781e046b0be44f8be504c837711e563898e55884052d3 languageName: node linkType: hard @@ -8959,6 +8960,18 @@ __metadata: languageName: node linkType: hard +"debug@npm:4.4.0": + version: 4.4.0 + resolution: "debug@npm:4.4.0" + dependencies: + ms: "npm:^2.1.3" + peerDependenciesMeta: + supports-color: + optional: true + checksum: 10/1847944c2e3c2c732514b93d11886575625686056cd765336212dc15de2d2b29612b6cd80e1afba767bb8e1803b778caf9973e98169ef1a24a7a7009e1820367 + languageName: node + linkType: hard + "debug@npm:~4.3.1, debug@npm:~4.3.2, debug@npm:~4.3.4": version: 4.3.7 resolution: "debug@npm:4.3.7" @@ -10361,6 +10374,18 @@ __metadata: languageName: node linkType: hard +"folder-hash@npm:^4.0.4": + version: 4.1.1 + resolution: "folder-hash@npm:4.1.1" + dependencies: + debug: "npm:4.4.0" + minimatch: "npm:7.4.6" + bin: + folder-hash: bin/folder-hash + checksum: 10/85b7e9bc9ddc887ba247b81946adccf8ae654507fa1a81d7fc3f07d94181327f6d62e746efb09ec318de7dcc330655939660deb4f445cd7893b3c45cab94a98a + languageName: node + linkType: hard + "follow-redirects@npm:^1.14.0, follow-redirects@npm:^1.14.9, follow-redirects@npm:^1.15.6": version: 1.15.11 resolution: "follow-redirects@npm:1.15.11" @@ -13040,6 +13065,15 @@ __metadata: languageName: node linkType: hard +"minimatch@npm:7.4.6": + version: 7.4.6 + resolution: "minimatch@npm:7.4.6" + dependencies: + brace-expansion: "npm:^2.0.1" + checksum: 10/0046ba1161ac6414bde1b07c440792ebcdb2ed93e6714c85c73974332b709b7e692801550bc9da22028a8613407b3f13861e17dd0dd44f4babdeacd44950430b + languageName: node + linkType: hard + "minimatch@npm:^10.0.3": version: 10.1.1 resolution: "minimatch@npm:10.1.1" @@ -15366,7 +15400,7 @@ __metadata: "@shapeshiftoss/swapper": "npm:17.6.7" "@shapeshiftoss/types": "npm:8.6.5" "@shapeshiftoss/unchained-client": "npm:10.14.8" - "@shapeshiftoss/unchained-pulumi": "npm:1.0.0" + "@shapeshiftoss/unchained-pulumi": "npm:1.0.2" "@types/express": "npm:^5.0.5" "@types/jest": "npm:^30.0.0" "@types/node": "npm:^22.10.7"