← Back to blog
·4 min·The SwyDex team

What we learned shipping the first 100 wallets

By the end of October we'd created exactly 100 wallets — internal smoke tests, a handful of pre-launch design partners, and our own demo tenant. Things we learned:

  1. UTXO sweeping is cheaper than EVM sweeping. Bitcoin batch-spends are a single transaction with multiple inputs. EVM means you pay gas per slave wallet to sweep into the master. Our gas vault math has to bake this in.
  2. Tron USDT is the dark horse. Three of our first six design partners were doing 90% of their volume on Tron USDT. We had Tron in scope but underweighted it in our test data. Now Tron has full feature parity with EVM and Bitcoin.
  3. External IDs deserve a unique constraint. Wallet #67 collided when one of our partners' staging environment retried a wallet-create with the same external ID. Our schema accepted both. We added a (tenant_id, external_id) unique index that night.
  4. Webhooks need a tracing UUID we set, not the customer. Two partners independently asked “is this the same event you sent yesterday?” Our webhook payloads now have a stable event_id from us so de-duplication is trivial on their end.

The bug at #67 felt embarrassing. It was also useful — turns out a unique-on-external-id constraint is one of those things you only know you needed once you've had the duplicate.


More posts