🔥 FINALIZED PRODUCTION CHECKLIST - Eight-Figure Ready

Corrected & Optimized Version - Exchange-Class Implementation


✅ Completed (Ready for Deployment)

1. Unified Status & Type System

  • services/withdrawal/internal/domain/status.go - Canonical status/type enums
  • services/withdrawal/internal/domain/errors.go - Error category classification
  • ✅ State machine validation with CanTransitionTo()
  • ✅ gRPC mapping (no drift)
  • ✅ User-facing error messages

2. TWC Proto Signer (Unified)

  • packages/blockchain/twc/ - Single implementation
  • ✅ Wallet service uses TWCProtoSigner
  • ✅ Withdrawal service uses TWCProtoSigner
  • ✅ No legacy JSON signers remain
  • ✅ All chains (ETH, BSC, TRON, TON) verified working

3. Sweep System

  • ✅ Gas math correct (reserves gas cost)
  • ✅ Low-priority gas for sweeps
  • ✅ HD derivation working
  • ✅ Verified on Sepolia (0.14912 ETH)

4. Hot Wallet System

  • ✅ Encrypted mnemonics (AES-256-GCM)
  • ✅ Auto-generation on startup
  • ✅ Balance tracking
  • ✅ Multi-chain support

⏳ Tier A - CRITICAL (Implement Before First Real User)

Priority 1: Gas Safety with EIP-1559 Support (2 hours)

File: services/withdrawal/internal/withdrawal/service/gas_safety.go

Critical Corrections:

// ✅ CORRECT: EIP-1559 gas calculation
gasCost = gasLimit * maxFeePerGas

// ✅ Add 20% margin for block spikes
marginFactor := big.NewInt(120)
gasCost = (gasLimit * maxFeePerGas * marginFactor) / 100

// ✅ Atomic DB reservation (not Redis, not mutex)
BEGIN;
SELECT balance FROM hot_wallets WHERE chain=$1 FOR UPDATE;
UPDATE hot_wallets SET balance = balance - reserved_amount WHERE chain=$1;
COMMIT;

Status: Template ready in PRODUCTION_AUDIT_IMPLEMENTATION.md
Action: Implement with corrections above


Priority 2: Risk Engine with AML Triggers (4 hours)

File: services/withdrawal/internal/withdrawal/service/risk_engine.go

Additions Beyond Basic: 1. ✅ User withdrawal profile caching (Redis) 2. ✅ AML pattern detection: - Withdrawal ≈ deposit within 30min → flag - Large deposit → immediate withdrawal → manual review - Known scam patterns → block 3. ✅ Multi-signal scoring system:

   Score = dailyScore + hourlyScore + patternScore + blacklistScore + velocityScore
   <10  → allow
   10-20 → manual review
   >20  → block

Status: Template ready, needs AML additions
Action: Implement full version with scoring


Priority 3: Idempotency System (1 hour)

Where: Gateway + Withdrawal Service

Implementation:

// Gateway extracts/generates
idempotencyKey := r.Header.Get("Idempotency-Key")
if idempotencyKey == "" {
    idempotencyKey = uuid.New().String()
}

// Withdrawal service checks
existing := checkIdempotencyKey(ctx, userID, idempotencyKey)
if existing != nil {
    return existing.TrackID // Return same track_id
}

Database:

CREATE TABLE withdrawal_idempotency (
    idempotency_key TEXT NOT NULL,
    user_id BIGINT NOT NULL,
    track_id UUID NOT NULL,
    created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(),
    CONSTRAINT withdrawal_idempotency_pk PRIMARY KEY (user_id, idempotency_key)
);

Status: NOT STARTED
Action: Implement before deployment


Priority 4: Commit Hash Tracking (5 minutes)

Where: All services

Add to docker build:

ARG GIT_COMMIT_SHA=unknown
ENV GIT_COMMIT_SHA=${GIT_COMMIT_SHA}

Store in withdrawal record:

withdrawal.CommitSHA = os.Getenv("GIT_COMMIT_SHA")

Status: NOT STARTED
Action: Add to Dockerfiles


⏳ Tier B - Before Big Volume (Next Week)

Priority 5: NATS JetStream with Deduplication

Mandatory Features: - ✅ Durable consumer - ✅ AckExplicit - ✅ Msg-Id for dedupe - ✅ Dead-letter queue

Code Addition:

_, err := js.Publish("withdrawal.notifications", data, nats.MsgId(event.EventID))

Status: Planned in WITHDRAWAL_SYSTEM_AUDIT.md
Action: Implement with all mandatory features


Priority 6: Full Prometheus Metrics

Additional Metrics Beyond Basic:

// ✅ Add signed transaction size
SignedTxSizeHistogram.Observe(float64(len(signedTx)))

// ✅ RPC error classification
RPCErrorsTotal.WithLabelValues(chain, errorClass).Inc()

Error Classes: nonce_too_low, insufficient_funds, replacement_underpriced, energy_insufficient, network_unavailable, throttled

Status: Template ready
Action: Implement with additions


Priority 7: Hot Wallet Balance Cache

Implementation:

// 1-second TTL cache
type BalanceCache struct {
    balance   *big.Int
    timestamp time.Time
}

func (c *BalanceCache) Get(chain string) (*big.Int, bool) {
    if time.Since(c.timestamp) > 1*time.Second {
        return nil, false
    }
    return c.balance, true
}

Status: NOT STARTED
Action: Implement to prevent DB bottleneck


⏳ Tier C - Optimization (After Volume)

Priority 8: Frontend Polish

  • ✅ Status polling every 5s until final state
  • ✅ Human-readable error mapping
  • ✅ Transaction explorer links

Priority 9: Sweep vs Withdrawal Ordering

Rule: Sweeps NEVER run when withdrawal is processing

Implementation:

-- Lock ordering: withdrawals first, sweeps second
SELECT * FROM hot_wallets WHERE chain=$1 FOR UPDATE;

Status: NOT STARTED
Action: Add lock ordering logic


Priority 10: Max Pending Transactions Per Chain

Prevent nonce collision:

maxPendingTx := 3
pendingCount := countPendingTx(ctx, chain)
if pendingCount >= maxPendingTx {
    return ErrTooManyPending
}

Status: NOT STARTED
Action: Add safeguard


📊 Current Deployment Status

✅ Built & Ready to Push

# Wallet Service
Image: registry.nextgiti.cloud/gitinext-golang/wallet:v1.0-ton-withdrawal-ready
Status: ✅ BUILD COMPLETE
Size: 228MB

⏳ Ready to Build

# Withdrawal Service (after Tier A implementations)
Image: registry.nextgiti.cloud/gitinext-golang/withdrawal:v1.0-production-ready
Status: ⏳ AWAITING TIER A COMPLETIONS

🚀 Deployment Plan

Phase 1: Deploy Current State (NOW)

# 1. Push wallet service
docker push registry.nextgiti.cloud/gitinext-golang/wallet:v1.0-ton-withdrawal-ready

# 2. Update service
docker service update \
  --image registry.nextgiti.cloud/gitinext-golang/wallet:v1.0-ton-withdrawal-ready \
  gitinext-golang_wallet

# 3. Verify logs
docker service logs -f gitinext-golang_wallet | grep -E "(started|error|TON)"

Phase 2: Implement Tier A (2-3 hours)

  1. Gas Safety Checker with EIP-1559
  2. Risk Engine with AML
  3. Idempotency system
  4. Commit hash tracking

Phase 3: Build & Deploy Withdrawal Service (15 min)

docker build -f services/withdrawal/Dockerfile \
  --build-arg BUILD_TAGS="twc" \
  --build-arg GIT_COMMIT_SHA=$(git rev-parse HEAD) \
  -t registry.nextgiti.cloud/gitinext-golang/withdrawal:v1.0-production-ready .

docker push registry.nextgiti.cloud/gitinext-golang/withdrawal:v1.0-production-ready

docker service update \
  --image registry.nextgiti.cloud/gitinext-golang/withdrawal:v1.0-production-ready \
  gitinext-golang_withdrawal

Phase 4: Test E2E (1 hour)

  • [ ] Create test withdrawal (0.001 ETH on Sepolia)
  • [ ] Verify gas calculation
  • [ ] Verify risk checks
  • [ ] Verify idempotency
  • [ ] Check Telegram notification
  • [ ] Verify transaction on Etherscan

🎯 Production Readiness Score

Component Before After Tier A Target
Status/Type System 0% 100% ✅ 100%
TWC Integration 90% 100% ✅ 100%
Gas Safety 60% 95% ⏳ 100%
Risk Engine 0% 80% ⏳ 100%
Idempotency 0% 100% ⏳ 100%
Messaging 20% 20% 100%
Metrics 30% 80% ⏳ 100%
Overall 43% 82% 100%

📝 Critical Files Summary

✅ Already Created

  1. services/withdrawal/internal/domain/status.go - Status/Type enums
  2. services/withdrawal/internal/domain/errors.go - Error categories

⏳ Must Create (Tier A)

  1. services/withdrawal/internal/withdrawal/service/gas_safety.go (EIP-1559 corrected)
  2. services/withdrawal/internal/withdrawal/service/risk_engine.go (with AML)
  3. services/withdrawal/migrations/004_risk_management.sql
  4. services/withdrawal/migrations/005_idempotency.sql
  5. services/gateway/internal/middleware/idempotency.go

⏳ Must Create (Tier B)

  1. services/withdrawal/internal/metrics/metrics.go (with RPC error classification)
  2. services/withdrawal/internal/cache/balance_cache.go

✅ IMMEDIATE NEXT ACTIONS

  1. NOW: Push wallet service (already built)
  2. Next 30 min: Implement idempotency system (quick win)
  3. Next 2 hours: Implement gas safety with EIP-1559
  4. Next 4 hours: Implement risk engine with AML
  5. Then: Build & deploy withdrawal service
  6. Finally: E2E test

🔒 Security Checklist

  • [x] Encrypted mnemonics (AES-256-GCM)
  • [x] JWT authentication
  • [x] Rate limiting
  • [x] State machine validation
  • [ ] Idempotency protection
  • [ ] Risk engine (KYC limits)
  • [ ] Address blacklist
  • [ ] AML pattern detection
  • [ ] Atomic hot wallet reservation
  • [ ] Error category classification

📞 Support & Monitoring

After Deployment Monitor:

  • withdrawals_created_total
  • withdrawals_failed_total{error_class}
  • hot_wallet_balance{chain}
  • twc_sign_duration_seconds
  • rpc_errors_total{chain, class}

Alert Conditions:

  • Hot wallet balance < threshold
  • Withdrawal failure rate > 10%
  • RPC errors spike
  • NATS events failed
  • TWC signing duration > 500ms

Status: Wallet service ready to deploy NOW. Tier A implementations in progress.

Timeline: Production-ready in 6-8 hours of focused work.

© 2025 GitiNext - Enterprise Crypto Infrastructure | GitHub | Website