USDC Swap with DID E2E Tests
Comprehensive end-to-end tests for USDC swap functionality with DID-based Interchain Accounts (ICA) on Noble testnet.
Overview
This test suite validates the complete USDC swap flow including:
- DID creation and management
- DEX account registration via ICA
- Cross-chain USDC swaps (SNR ↔ USDC)
- Noble testnet IBC integration
- Swap routing and slippage protection
- Event verification and transaction history
Prerequisites
Network Setup
- Sonr Testnet: Running local testnet with DEX module enabled
- Noble Testnet Connection: IBC connection established to Noble testnet (grand-1)
- IBC Relayer: Active relayer between Sonr and Noble chains
- Test Tokens:
- SNR tokens for gas and swaps
- USDC tokens on Noble testnet (optional for full E2E)
Configuration
The tests use these default configurations:
// Noble Testnet
NobleChainID = "noble-grand-1"
NobleConnectionID = "connection-noble" // Update with actual connection
NobleUSDCDenom = "uusdc"
// Test Amounts
USDCTestAmount = 1_000_000 // 1 USDC (6 decimals)
SNRSwapAmount = 1_000_000 // 1 SNR (6 decimals)
SlippageTolerance = 0.05 // 5% slippage
Test Suite Structure
Test Cases
01. Verify Noble Configuration
Purpose: Validates Noble chain configuration and constants Validates:
- Noble chain ID recognition
- USDC denomination configuration
- Decimal places (6 for USDC)
- Chain type detection
02. Create DID Document
Purpose: Creates a test DID for swap operations Operations:
- Generate unique DID for test
- Create DID document on-chain
- Verify DID can be queried
- Validate DID structure
03. Register DEX Account
Purpose: Registers an ICA account on Noble connection Operations:
- Register DEX account with Noble connection
- Enable swap and liquidity features
- Wait for ICA channel handshake
- Verify account status and ICA address
Expected States:
ACCOUNT_STATUS_PENDING: Initial state during handshakeACCOUNT_STATUS_ACTIVE: Account ready for operationsACCOUNT_STATUS_FAILED: Handshake failed
04. Execute USDC Swap (SNR → USDC)
Purpose: Tests swapping SNR to USDC on Noble Flow:
- Setup DID and DEX account
- Calculate minimum output with slippage
- Execute swap via ICA
- Verify transaction success
- Check swap event emission
Parameters:
Amount: 1_000_000 usnr (1 SNR)
MinAmountOut: 950_000 uusdc (0.95 USDC - 5% slippage)
Timeout: 60 seconds
05. Execute USDC Swap (USDC → SNR)
Purpose: Tests reverse swap (USDC to SNR) Flow: Same as Test 04 but with reversed denoms
06. Swap With Invalid Parameters
Purpose: Tests error handling and validation Test Cases:
- Zero amount swap
- Same source/target denom
- Negative minimum output
- Invalid connection ID
Expected: All cases should fail gracefully
07. Swap With UCAN Permission
Purpose: Tests UCAN-authorized delegated swaps Status: Currently skipped (requires full UCAN setup) Features:
- UCAN token generation
- Permission validation
- Delegated execution
08. Query DEX History
Purpose: Verifies transaction history tracking Validates:
- History query endpoint
- Activity records
- Transaction metadata
- Status tracking
09. Multiple Sequential Swaps
Purpose: Tests executing multiple swaps in sequence Operations:
- Execute 3 swaps sequentially
- Verify each transaction succeeds
- Check for nonce/sequence handling
- Validate no race conditions
Running the Tests
Quick Start
# Navigate to test directory
cd test/e2e/usdc-swap-did
# Run all tests
go test -v
# Run specific test
go test -v -run TestUSDCSwapE2E/Test04_ExecuteUSDCSwap_SNRToUSDC
# Run with timeout
go test -v -timeout 10m
Prerequisites Check
Before running tests, ensure:
# 1. Verify Noble connection exists
snrd query ibc connection end connection-noble
# 2. Check connection is open
# Expected output: state: STATE_OPEN
# 3. Verify ICA channel
snrd query ibc channel channels --node tcp://localhost:26657
# 4. Check DEX module is enabled
snrd query dex params
Full E2E Setup
# 1. Start Sonr testnet
make testnet
# 2. Establish Noble connection (one-time setup)
# This requires:
# - Noble testnet access
# - IBC relayer configuration
# - Channel creation
# 3. Fund test accounts
# The tests will auto-fund via faucet, but you can pre-fund:
snrd tx bank send validator <test-address> 100000000usnr --yes
# 4. Run tests
cd test/e2e/usdc-swap-did && go test -v
Test Utilities
Helper Functions
DID Operations
// Create test DID
did, err := CreateTestDID(ctx, cfg, account, didID)
// Query DID
did, err := QueryDID(ctx, cfg, didID)
DEX Operations
// Query DEX account
account, err := QueryDEXAccount(ctx, cfg, didID, connectionID)
// Query transaction history
history, err := QueryDEXHistory(ctx, cfg, didID)
// Wait for account activation
active, err := WaitForDEXAccountActivation(ctx, cfg, didID, connectionID, timeout)
Swap Utilities
// Validate parameters
err := ValidateSwapParameters(sourceDenom, targetDenom, amount, minOut)
// Calculate slippage
minOut := CalculateMinimumOutput(amount, slippagePct)
// Format amounts for display
formatted := FormatUSDCAmount(1000000) // "1.000000 USDC"
formatted = FormatSNRAmount(1000000) // "1.000000 SNR"
Assertions
The test suite uses testify/suite and testify/require for assertions:
// Transaction success
require.NoError(t, err)
require.Equal(t, uint32(0), txResp.Code)
// Balance checks
balance := s.getBalance(address, denom)
require.True(t, balance.GT(minAmount))
// Event verification
s.verifySwapEvent(txHash, did, connectionID)
Configuration
Update Connection ID
Before running tests, update the Noble connection ID in usdc_swap_test.go:
const (
NobleConnectionID = "connection-0" // Replace with actual connection ID
)
To find the connection ID:
# List all connections
snrd query ibc connection connections
# Look for connection to Noble (grand-1)
# Update NobleConnectionID constant with the correct value
Custom Test Configuration
Create a custom config for your environment:
cfg := &utils.TestConfig{
ChainID: "sonrtest_1-1",
BaseURL: "http://localhost:1317",
NobleConnection: "connection-0", // Your Noble connection
// ... other settings
}
Troubleshooting
Common Issues
1. Connection Not Found
Error: connection connection-noble not found
Solution: Update NobleConnectionID constant with actual connection ID
2. ICA Account Pending
⚠ ICA address pending (channel handshake may be in progress)
Solution: Wait for ICA channel handshake to complete (can take 1-2 minutes)
3. Swap Transaction Fails
Error: DEX account not active
Solution: Ensure ICA account is in ACCOUNT_STATUS_ACTIVE state
4. Insufficient Funds
Error: insufficient funds
Solution: Fund test account with SNR tokens
Debug Mode
Enable verbose logging:
# Run with verbose output
go test -v -run TestUSDCSwapE2E 2>&1 | tee test.log
# Check specific test output
grep "Test 04" test.log
# View all swap events
grep "Swap" test.log
Verify IBC Setup
# Check IBC clients
snrd query ibc client states
# Check channels
snrd query ibc channel channels
# Check connections
snrd query ibc connection connections
# Monitor relayer
# (depends on your relayer setup)
Integration with CI/CD
GitHub Actions
name: USDC Swap E2E Tests
on: [push, pull_request]
jobs:
e2e-usdc-swap:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-go@v4
with:
go-version: '1.21'
- name: Start Testnet
run: make testnet
- name: Wait for Network
run: sleep 30
- name: Run E2E Tests
run: |
cd test/e2e/usdc-swap-did
go test -v -timeout 10m
Expected Output
Successful Test Run
=== RUN TestUSDCSwapE2E
=== RUN TestUSDCSwapE2E/Test01_VerifyNobleConfiguration
=== Test 01: Verify Noble Configuration ===
✓ Noble configuration verified successfully
=== RUN TestUSDCSwapE2E/Test02_CreateDIDDocument
=== Test 02: Create DID Document ===
✓ DID document created: did:snr:test_1234567890
✓ DID query verification successful
=== RUN TestUSDCSwapE2E/Test03_RegisterDEXAccount
=== Test 03: Register DEX Account ===
✓ DEX account registered, tx hash: ABC123...
✓ DEX account status: ACCOUNT_STATUS_ACTIVE
✓ ICA port ID: icacontroller-did:snr:test_1234567890-connection-0
✓ ICA address: noble1abc...xyz
=== RUN TestUSDCSwapE2E/Test04_ExecuteUSDCSwap_SNRToUSDC
=== Test 04: Execute USDC Swap (SNR → USDC) ===
Initial SNR balance: 10000000
✓ Swap transaction broadcasted, tx hash: DEF456...
✓ Found swap event for DID: did:snr:test_1234567890
✓ Swap execution test completed
...
--- PASS: TestUSDCSwapE2E (45.23s)
PASS
ok github.com/sonr-io/sonr/test/e2e/usdc-swap-did 45.234s
Future Enhancements
Planned Features
- Multi-hop Swaps: Route through multiple pools/chains
- Liquidity Provision: Add/remove liquidity tests
- Limit Orders: Create and execute limit orders
- UCAN Integration: Full delegation testing
- Performance Tests: Load testing and benchmarks
- Failure Recovery: Test ICA timeout handling
Contributing
When adding new tests:
- Follow existing naming convention (Test##_Description)
- Add helper functions to
helpers.go - Update this README with new test documentation
- Ensure tests are idempotent
- Add appropriate logging for debugging