About
Experience
worked as - Founding Software Developer
I've been deep in the Avalanche ecosystem lately, and one of the most interesting things I built is Bango Payments — a small but real cross-chain bridge that lets you move tokens from Avalanche C-Chain over to Bango L1 (Bango's own chain) so you can use them inside the Bango app.
I'm writing this so you can see what the product does, how the bridge actually works under the hood (especially the ICTT contracts), and why I made some of the choices I did. Think of it as a mix of "what I built" and "how the plumbing works."

Avalanche Interchain Bridge
In one sentence: Bango Payments is a web app where you connect your wallet, pick a token and amount, confirm your Bango account, and bridge those tokens from Avalanche to your wallet on Bango L1.
So you're not sending to a random address — you're sending to your Bango account. That account is tied to your identity in the Bango app (username, profile, etc.), and the app fetches your Bango wallet address for you. You just log in, confirm it's you, and hit "Bridge Now."
Right now we support USDC and $ERROR on Avalanche. You see your balance, enter an amount (or hit Max), get a rough USD value from live prices, and after you confirm, one transaction on Avalanche kicks off the cross-chain transfer. A couple of minutes later, the tokens show up on Bango L1.
If you've used DeFi or any multi-chain app, you know the pain: your funds are on Chain A, but the app you care about lives on Chain B. You need a safe, predictable way to get tokens from A to B.
Bango runs on its own L1 (chain ID 5506). To use the app, you need assets there. So the "product" here is: get your Avalanche tokens onto Bango L1 with minimal friction. No manual address copying, no guessing which chain you're on — the app knows your Bango account and guides you through one flow.
I wanted it to feel like a product, not a generic bridge UI: login with Bango, see your destination address, confirm, and bridge. The blockchain part does the heavy lifting; the front-end tries to stay out of your way.
Here's the flow in plain words:
So from your point of view: connect → login → confirm → choose token & amount → one or two signatures → done. The rest is infrastructure.
This is the part I really want to explain, because it's what makes the bridge possible.
ICTT is the protocol we use to move tokens from Avalanche C-Chain to Bango L1. It's a contract-based design: one set of contracts on the "home" chain (Avalanche) and another on the "remote" chain (Bango L1). When you call the right function on the home side with the right parameters, the protocol takes care of locking/burning and minting/releasing on the other chain.
So "bridge" in practice means: you call send() on the home contract with the remote chain ID, remote contract address, and your Bango address; the protocol moves the tokens cross-chain and the remote contract updates your balance.
For each token we support, we have a fixed ICTT config: home chain ID, home contract address, remote chain ID, remote contract address, and the blockchain IDs (bytes32) that the protocol uses internally to route the message. Those aren't just "chain IDs" in the EVM sense — they're the identifiers the ICTT protocol uses to know which chain and which contract to talk to.
When you click "Bridge Now," the app:
After that, it's all protocol: the home side and the cross-chain messaging layer handle the rest; the remote contract on Bango L1 credits you. We don't run validators or relayers — we're just calling the same ICTT contracts that the ecosystem uses.
Because the destination is always "your Bango wallet," we can hide a lot of complexity. You don't paste addresses or pick "remote contract" — the app gets your Bango address from the backend and plugs it into the ICTT send() call. So the UX is "bridge to my Bango account," and the contracts do "bridge to this address on this chain."
[Placeholder: Simple diagram — User on Avalanche → approve + send() on Home Contract → ICTT / cross-chain layer → Remote Contract on Bango L1 → User's Bango wallet.]
So the "product" is: a focused bridge UX on top of existing ICTT contracts, with clear constraints (supported tokens, one destination type) so the code stays understandable and the behavior predictable.
So that's Bango Payments in a nutshell: a small bridge product that gets your tokens from Avalanche to Bango L1 so you can use them in the Bango app, with the heavy lifting done by ICTT — home contract on Avalanche, remote contract on Bango, and one send() call with the right parameters. The fun part for me was making that feel like a single, coherent flow (login → confirm → bridge) instead of a generic "paste address and hope" bridge.
If you're into cross-chain stuff or building on Avalanche, I'm happy to go deeper on any part — the contract ABIs, the config shape, or the front-end flow. Drop a message; I'd love to hear what you're building too.
Tech stack (for the curious): Next.js 15, React 19, TypeScript, Tailwind, Wagmi v2, Viem, Reown AppKit (WalletConnect), TanStack Query. Server Actions for Bango API and DexScreener; cookie-based auth for "login with Bango."