Skip to content

Stellar integrations#121

Merged
JoE11-y merged 3 commits intomainfrom
stellar-integrations
Apr 16, 2026
Merged

Stellar integrations#121
JoE11-y merged 3 commits intomainfrom
stellar-integrations

Conversation

@JoE11-y
Copy link
Copy Markdown
Contributor

@JoE11-y JoE11-y commented Apr 16, 2026

Summary by CodeRabbit

Release Notes

  • New Features

    • Users can now link wallets across Ethereum and Stellar networks separately, enabling cross-chain interactions.
    • Redesigned wallet connection interface for managing multiple chain wallets.
    • Support for local development chains.
  • Documentation

    • Updated environment configuration examples for Stellar network settings.

@JoE11-y JoE11-y merged commit fa43ac0 into main Apr 16, 2026
1 of 4 checks passed
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Apr 16, 2026

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 20816e3f-5cb2-4850-b847-55cab227683f

📥 Commits

Reviewing files that changed from the base of the PR and between 914365e and 35e62d5.

⛔ Files ignored due to path filters (2)
  • apps/frontend/public/assets/logos/stellar-logo.svg is excluded by !**/*.svg
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (63)
  • .github/workflows/contracts-release.yml
  • apps/backend-relayer/prisma/migrations/20260416000000_add_user_wallet/migration.sql
  • apps/backend-relayer/prisma/prisma.service.ts
  • apps/backend-relayer/prisma/schema.prisma
  • apps/backend-relayer/src/chain-adapters/adapters/chain-adapter.abstract.ts
  • apps/backend-relayer/src/libs/configs.ts
  • apps/backend-relayer/src/main.ts
  • apps/backend-relayer/src/modules/ads/ad.module.ts
  • apps/backend-relayer/src/modules/ads/ad.service.ts
  • apps/backend-relayer/src/modules/ads/dto/ad.dto.ts
  • apps/backend-relayer/src/modules/auth/auth.controller.ts
  • apps/backend-relayer/src/modules/auth/auth.service.ts
  • apps/backend-relayer/src/modules/auth/dto/auth.dto.ts
  • apps/backend-relayer/src/modules/auth/evm/evm-auth.service.ts
  • apps/backend-relayer/src/modules/auth/stellar/stellar-auth.service.spec.ts
  • apps/backend-relayer/src/modules/auth/stellar/stellar-auth.service.ts
  • apps/backend-relayer/src/modules/faucet/faucet.module.ts
  • apps/backend-relayer/src/modules/faucet/faucet.service.ts
  • apps/backend-relayer/src/modules/trades/dto/trade.dto.ts
  • apps/backend-relayer/src/modules/trades/trade.module.ts
  • apps/backend-relayer/src/modules/trades/trade.service.ts
  • apps/backend-relayer/src/modules/user/dto/user.dto.ts
  • apps/backend-relayer/src/modules/user/user.module.ts
  • apps/backend-relayer/src/modules/user/user.service.ts
  • apps/frontend/.env.example
  • apps/frontend/app/(app)/(auth-protected)/home/page.tsx
  • apps/frontend/components/ad-management-ui/AddLiquidity.tsx
  • apps/frontend/components/ad-management-ui/CreateAdSuccessModal.tsx
  • apps/frontend/components/bridge-ui/BridgeTab.tsx
  • apps/frontend/components/bridge-ui/TradeAd.tsx
  • apps/frontend/components/connect-wallet/ConnectHubModal.tsx
  • apps/frontend/components/connect-wallet/ConnectWalletButton.tsx
  • apps/frontend/components/connect-wallet/types.ts
  • apps/frontend/components/connect-wallet/useAdapters.ts
  • apps/frontend/components/connect-wallet/useEvmAdapter.ts
  • apps/frontend/components/connect-wallet/useStellarAdapter.ts
  • apps/frontend/components/dashboard/AdActionsModal.tsx
  • apps/frontend/components/providers/RainbowKit.tsx
  • apps/frontend/components/providers/StellarWallet.tsx
  • apps/frontend/components/shared/AntConfigProvider.tsx
  • apps/frontend/components/shared/Unauthenticated.tsx
  • apps/frontend/hooks/useCurrentUser.ts
  • apps/frontend/hooks/useEvmAuth.ts
  • apps/frontend/hooks/useStellarAuth.ts
  • apps/frontend/lib/chains.ts
  • apps/frontend/package.json
  • apps/frontend/services/api.instance.ts
  • apps/frontend/services/auth.service.ts
  • apps/frontend/services/user.service.ts
  • apps/frontend/types/ads.ts
  • apps/frontend/types/trades.ts
  • apps/frontend/utils/stellar/invoke.ts
  • apps/frontend/utils/stellar/trustline.ts
  • apps/frontend/utils/urls.ts
  • apps/frontend/utils/wagmi-config.ts
  • scripts/cross-chain-e2e/lib/deploy.ts
  • scripts/cross-chain-e2e/lib/evm.ts
  • scripts/cross-chain-e2e/run.ts
  • scripts/docker-local/docker-compose.yaml
  • scripts/docker-local/entrypoint.sh
  • scripts/docker-local/up.sh
  • scripts/relayer-e2e/lib/fund.ts
  • scripts/relayer-e2e/lib/seed.ts

📝 Walkthrough

Walkthrough

Introduces multi-chain wallet linking by replacing single per-user walletAddress with a UserWallet table supporting multiple wallets per chain kind. Refactors authentication to separate user creation from wallet attachment, updates service layers to use chain-specific wallet resolution, and replaces frontend RainbowKit auth with a unified chain-adapter model supporting both EVM and Stellar.

Changes

Cohort / File(s) Summary
Database Schema & Migrations
apps/backend-relayer/prisma/migrations/20260416000000_add_user_wallet/migration.sql, apps/backend-relayer/prisma/schema.prisma
Introduces UserWallet table with composite uniqueness (userId, chainKind) and (address, chainKind), foreign key to User, and timestamps. Migrates existing User.walletAddress into UserWallet rows, deriving chainKind from address length. Replaces single walletAddress field with wallets relationship in User model.
Auth Flow Refactoring
apps/backend-relayer/src/modules/auth/auth.service.ts, apps/backend-relayer/src/modules/auth/auth.controller.ts, apps/backend-relayer/src/modules/auth/dto/auth.dto.ts, apps/backend-relayer/src/modules/auth/evm/evm-auth.service.ts, apps/backend-relayer/src/modules/auth/stellar/stellar-auth.service.ts, apps/backend-relayer/src/modules/auth/stellar/stellar-auth.service.spec.ts
Separates user creation from wallet linking. Renames verifyLoginverifyAndConsume in chain-specific services, returning address instead of user. Adds linkWallet(userId, input) endpoint to attach additional wallets. Removes address claims from JWT tokens; user tokens now contain only id/username. Removes user upsert from chain-specific verification methods.
User Service Enhancements
apps/backend-relayer/src/modules/user/user.service.ts, apps/backend-relayer/src/modules/user/user.module.ts, apps/backend-relayer/src/modules/user/dto/user.dto.ts
Adds getWalletForChain(userId, chainKind): Promise<string> and getLinkedAddresses(userId): Promise<Set<string>> for wallet resolution. Exports UserService from module. Replaces walletAddress field with wallets: UserWalletDto[] in response DTO.
Ads Module Updates
apps/backend-relayer/src/modules/ads/ad.service.ts, apps/backend-relayer/src/modules/ads/ad.module.ts, apps/backend-relayer/src/modules/ads/dto/ad.dto.ts
Injects UserService and replaces direct user.walletAddress lookups with getWalletForChain() calls across create/fund/withdraw/close/confirmChainAction. Adds multi-address filtering via creatorAddresses?: string[] query param alongside single creatorAddress. Updates error messages from "Authenticated wallet" to "Linked wallet".
Faucet & Trades Modules
apps/backend-relayer/src/modules/faucet/faucet.service.ts, apps/backend-relayer/src/modules/faucet/faucet.module.ts, apps/backend-relayer/src/modules/trades/trade.service.ts, apps/backend-relayer/src/modules/trades/trade.module.ts, apps/backend-relayer/src/modules/trades/dto/trade.dto.ts
Both modules inject UserService and replace wallet-address equality checks with getLinkedAddresses() set membership checks. Trades service adds participantAddresses?: string[] multi-address filtering for ad creators/bridgers. Updates authorization logic to iterate linked addresses.
Prisma Service Cleanup
apps/backend-relayer/prisma/prisma.service.ts
Removes commented-out import of PrismaClient from local generated path; no functional change.
ChainAdapter Documentation
apps/backend-relayer/src/chain-adapters/adapters/chain-adapter.abstract.ts
Removes comment documentation above verifyOrderSignature abstract method; no signature change.
Config & Environment
apps/backend-relayer/src/libs/configs.ts, apps/backend-relayer/src/main.ts
Removes inline comments describing environment variable relationships and validation pipe behavior; no logic changes.
Frontend: Connect Wallet Integration
apps/frontend/components/connect-wallet/types.ts, apps/frontend/components/connect-wallet/useAdapters.ts, apps/frontend/components/connect-wallet/useEvmAdapter.ts, apps/frontend/components/connect-wallet/useStellarAdapter.ts, apps/frontend/components/connect-wallet/ConnectWalletButton.tsx, apps/frontend/components/connect-wallet/ConnectHubModal.tsx
Introduces ChainAdapter interface defining adapter identity, connection state, and methods. New useEvmAdapter and useStellarAdapter hooks implement adapters for each chain, managing connection state, sign-in flow, and wallet linking via useCurrentUser. Replaces RainbowKit-only ConnectWalletButton with unified modal-driven component supporting both chains.
Frontend: Auth & User Services
apps/frontend/hooks/useCurrentUser.ts, apps/frontend/hooks/useEvmAuth.ts, apps/frontend/hooks/useStellarAuth.ts, apps/frontend/services/user.service.ts, apps/frontend/services/auth.service.ts
New useCurrentUser hook queries getCurrentUser() from user service when auth_token exists. Both useEvmLogin and useStellarLogin now branch on wallet-link mode when token exists but wallet not linked. Adds submitLinkWallet() API call and new response DTO ILinkWalletResponse.
Frontend: RainbowKit & Providers
apps/frontend/components/providers/RainbowKit.tsx, apps/frontend/components/providers/StellarWallet.tsx, apps/frontend/components/shared/AntConfigProvider.tsx
Removes custom SIWE auth adapter from RainbowKit, leaving only bare provider with initialChain and darkTheme. Updates Stellar wallet provider to use STELLAR_NETWORK_PASSPHRASE environment variable instead of hard-coded Networks.TESTNET. Adds Ant Design React 19 patch import.
Frontend: Ad & Bridge UI
apps/frontend/components/ad-management-ui/AddLiquidity.tsx, apps/frontend/components/ad-management-ui/CreateAdSuccessModal.tsx, apps/frontend/components/bridge-ui/BridgeTab.tsx, apps/frontend/components/bridge-ui/TradeAd.tsx, apps/frontend/components/dashboard/AdActionsModal.tsx, apps/frontend/components/shared/Unauthenticated.tsx
AddLiquidity refactors to use chainId strings and derives chain metadata from loaded chains list; adds wallet-readiness gating. New CreateAdSuccessModal component displays ad creation summary. BridgeTab and TradeAd add conditional fallback rendering for missing chain icons. AdActionsModal resolves chain names via useGetAllChains and gates actions on wallet connection to ad chain. Unauthenticated updates copy and supported-wallet list for both Ethereum and Stellar.
Frontend: Configuration & Utilities
apps/frontend/lib/chains.ts, apps/frontend/utils/wagmi-config.ts, apps/frontend/utils/urls.ts, apps/frontend/utils/stellar/invoke.ts, apps/frontend/utils/stellar/trustline.ts, apps/frontend/services/api.instance.ts
Adds conditional foundry chain support via NEXT_PUBLIC_ENABLE_LOCAL_CHAINS flag. Centralized STELLAR_NETWORK_PASSPHRASE in urls object derived from env var with Networks.TESTNET fallback. Updates Stellar utilities to use centralized passphrase. Refines axios config with paramsSerializer and consistent return statements.
Frontend: Types & Home Page
apps/frontend/types/ads.ts, apps/frontend/types/trades.ts, apps/frontend/app/(app)/(auth-protected)/home/page.tsx
Adds creatorAddresses?: string[] and participantAddresses?: string[] filter params to ad/trade query types. Home page replaces useAccount() with useCurrentUser() to derive linkedAddresses from wallets array; updates all query calls to use plural address filters.
Frontend: Dependencies
apps/frontend/package.json
Adds @ant-design/v5-patch-for-react-19 dependency.
E2E Testing & Deployment
scripts/cross-chain-e2e/lib/deploy.ts, scripts/cross-chain-e2e/lib/evm.ts, scripts/cross-chain-e2e/run.ts, scripts/relayer-e2e/lib/fund.ts, scripts/relayer-e2e/lib/seed.ts
Replaces single-token deployment with arrays of EvmTokenDeployment and StellarTokenDeployment keyed by pairKey. Adds test_token WASM deployment for Stellar. Updates token initialization and route wiring to loop over token arrays. fund.ts and seed.ts iterate multiple tokens with per-token decimals and kinds. Introduces stellarMint CLI invocation for SEP-41 tokens.
Build & Release Scripts
.github/workflows/contracts-release.yml, scripts/docker-local/docker-compose.yaml, scripts/docker-local/entrypoint.sh, scripts/docker-local/up.sh
Adds stellar contract build --package test-token to WASM build. Updates docker-compose SIGN_DOMAIN to include port (localhost:3000). Expands artifact validation loops to check test_token.wasm and replace ERC20Mock with MockERC20. Adds STELLAR_NETWORK and STELLAR_SOURCE_ACCOUNT env vars for dev funding.

Sequence Diagrams

sequenceDiagram
    participant User
    participant Frontend
    participant AuthService
    participant ChainService as Chain Service<br/>(EVM/Stellar)
    participant UserService
    participant Database

    rect rgba(100, 150, 200, 0.5)
    note over User,Database: Initial Login on Chain 1 (e.g., EVM)
    User->>Frontend: Click "Sign In"
    Frontend->>ChainService: verifyAndConsume(signature)
    ChainService->>Database: Verify signature, extract address
    ChainService-->>Frontend: address (e.g., 0x123...)
    Frontend->>AuthService: login({ chainKind, message, signature })
    AuthService->>UserService: resolveOrCreateUser(address, chainKind)
    UserService->>Database: CREATE User + INSERT UserWallet
    Database-->>UserService: user.id, wallet
    AuthService->>Database: Mint tokens (user.id, username only)
    Database-->>AuthService: access_token, refresh_token
    AuthService-->>Frontend: tokens
    Frontend->>Frontend: Store auth_token, refresh_token cookies
    end

    rect rgba(150, 200, 100, 0.5)
    note over User,Database: Link Additional Wallet on Chain 2 (e.g., Stellar)
    User->>Frontend: Click "Link Stellar Wallet"
    Frontend->>ChainService: verifyAndConsume(transaction)
    ChainService-->>Frontend: address (stellar address)
    Frontend->>AuthService: linkWallet(userId, { chainKind, transaction })
    AuthService->>UserService: Check for conflict (duplicate address or existing wallet for chain)
    UserService->>Database: Verify no duplicate (address, chainKind)
    UserService->>Database: INSERT UserWallet (same userId, new chainKind)
    Database-->>UserService: new wallet row
    AuthService->>Database: Mint tokens (same user.id, username)
    Database-->>AuthService: access_token, refresh_token
    AuthService-->>Frontend: LinkWalletResponse { id, address, chainKind, createdAt }
    Frontend->>Frontend: Invalidate current-user cache
    end
Loading
sequenceDiagram
    participant User
    participant ConnectHubModal
    participant ChainAdapter as ChainAdapter<br/>(EVM/Stellar)
    participant WalletProvider as Wallet Provider
    participant AuthHook as Auth Hook<br/>(useEvmLogin)
    participant AuthService
    participant UserService as User Service

    rect rgba(100, 150, 200, 0.5)
    note over User,UserService: Unified Chain Connection & Sign-In Flow
    User->>ConnectHubModal: Open modal
    ConnectHubModal->>ChainAdapter: Render adapter row
    User->>ConnectHubModal: Click "Connect"
    ConnectHubModal->>ChainAdapter: call connect()
    ChainAdapter->>WalletProvider: Connect wallet
    WalletProvider-->>ChainAdapter: address, chainId (or error)
    ChainAdapter-->>ConnectHubModal: Update status → "connected"
    ConnectHubModal-->>User: Show "Sign in required" suffix
    end

    rect rgba(150, 200, 100, 0.5)
    note over User,UserService: Sign-In / Link Wallet Flow
    User->>ConnectHubModal: Click "Sign in required" / auth action
    ConnectHubModal->>AuthHook: call signIn()
    AuthHook->>AuthService: requestChallenge() + sign message/tx
    AuthService-->>AuthHook: challenge signed
    AuthHook->>AuthService: submitLogin() or submitLinkWallet()
    AuthService->>UserService: Verify signature, check wallet link status
    alt Wallet not linked (auth_token exists)
    UserService->>AuthService: Need to link
    AuthService-->>AuthHook: { mode: "link", data: LinkWalletResponse }
    else Fresh login
    AuthService-->>AuthHook: { mode: "login", data: LoginResponse }
    end
    AuthHook->>AuthHook: Store cookies, invalidate user cache
    AuthHook-->>ConnectHubModal: Update adapter status
    ConnectHubModal-->>User: Show "authenticated" or updated address
    end
Loading

Estimated code review effort

🎯 5 (Critical) | ⏱️ ~120 minutes

Possibly related PRs

Suggested reviewers

  • Ugo-X

Poem

🐰 A wallet garden blooms—one root, now many branches!
Multi-chain connections dance through linked addresses,
EVM meets Stellar in unified harmony,
Users roam freely across blockchain lands,
Our little rabbit hops through every chain! 🌟

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch stellar-integrations

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant