·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:
- 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.
- 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.
- 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. - 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_idfrom 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.