# Bankr's Migration to Doppler Protocol: A Technical Deep Dive

## What Happened

Bankr has migrated their token launcher from Clanker to **Doppler Protocol**, the same professional-grade infrastructure used by Zora, Paragraph, and Noice. This isn't a fork or a copy: Bankr is using the **canonical Doppler contracts** on Base, deployed and maintained by Whetstone Research.

This article breaks down the technical architecture, explains the liquidity mechanics, and clarifies what this means if you're trading these tokens.

> **Note:** Bankr's initial Feb 10 deployment used `ScheduledMulticurveInitializer`. Within three days, they switched to `DecayMulticurveInitializer` with a significantly different curve structure. The article documents both setups. Skip to [Current Setup](#current-setup-feb-13-decaymulticurveinitializer) if you only care about how it works now.

* * *

## The Core Infrastructure

### The Airlock Pattern

Doppler uses a modular "Airlock" architecture where a central orchestrator contract delegates to specialized components:

```plaintext
Airlock (0x660eAaEdEBc968f8f3694354FA8EC0b4c5Ba8D12)
    ├── TokenFactory80 → Deploys DERC20 tokens
    │
    ├── Pool Initializer (one of):
    │     ├─ ScheduledMulticurveInitializer (0xA36715d..., Feb 10)
    │     │    └── Hook: binary start-time gate
    │     │
    │     └─ DecayMulticurveInitializer (0xd59ce43..., Feb 13+) ← CURRENT
    │          └── Hook: 80% → 1.2% fee decay over 10s
    │
    ├── NoOpGovernanceFactory → Immutable, no admin controls
    ├── NoOpMigrator → Required param (always reverts)
    └── StreamableFeesLockerV2 → Locks positions, streams fees
```

**Key takeaway:** Once deployed, these tokens are fully immutable. No admin can change parameters, pause trading, or rug the liquidity.

* * *

## Original Liquidity Design: Scheduled Multicurve (Feb 10)

> **Historical:** This section describes Bankr's initial setup which was replaced on Feb 13. See [Current Setup](#current-setup-feb-13-decaymulticurveinitializer) for the active configuration.

Bankr's initial deployment used Doppler's **Uniswap V4 Scheduled Multicurve** with four overlapping curve definitions subdivided into ~21 segments.

### What This Means Technically

Instead of a single liquidity position or full-range V3 LP, Bankr tokens launch with:

<table style="min-width: 50px;"><colgroup><col style="min-width: 25px;"><col style="min-width: 25px;"></colgroup><tbody><tr><th colspan="1" rowspan="1"><p>Component</p></th><th colspan="1" rowspan="1"><p>Specification</p></th></tr><tr><td colspan="1" rowspan="1"><p><strong>DEX Version</strong></p></td><td colspan="1" rowspan="1"><p>Uniswap V4</p></td></tr><tr><td colspan="1" rowspan="1"><p><strong>Fee Tier</strong></p></td><td colspan="1" rowspan="1"><p>1.2% (12,000 pips)</p></td></tr><tr><td colspan="1" rowspan="1"><p><strong>Tick Spacing</strong></p></td><td colspan="1" rowspan="1"><p>200</p></td></tr><tr><td colspan="1" rowspan="1"><p><strong>Curve Structure</strong></p></td><td colspan="1" rowspan="1"><p>4 curves → ~21 segments</p></td></tr><tr><td colspan="1" rowspan="1"><p><strong>Liquidity Lock</strong></p></td><td colspan="1" rowspan="1"><p>StreamableFeesLockerV2 (time-locked)</p></td></tr><tr><td colspan="1" rowspan="1"><p><strong>Trading Gate</strong></p></td><td colspan="1" rowspan="1"><p><code>startingTime</code> timestamp on hook</p></td></tr></tbody></table>

### The Four Curves (Example: BlueWhale deployment)

<table style="min-width: 125px;"><colgroup><col style="min-width: 25px;"><col style="min-width: 25px;"><col style="min-width: 25px;"><col style="min-width: 25px;"><col style="min-width: 25px;"></colgroup><tbody><tr><th colspan="1" rowspan="1"><p>Curve</p></th><th colspan="1" rowspan="1"><p>Tick Range</p></th><th colspan="1" rowspan="1"><p>Segments</p></th><th colspan="1" rowspan="1"><p>ETH/Segment</p></th><th colspan="1" rowspan="1"><p>Purpose</p></th></tr><tr><td colspan="1" rowspan="1"><p>1</p></td><td colspan="1" rowspan="1"><p>[-230,200 → -219,200]</p></td><td colspan="1" rowspan="1"><p>10</p></td><td colspan="1" rowspan="1"><p>0.2 ETH</p></td><td colspan="1" rowspan="1"><p>Core range — widest coverage</p></td></tr><tr><td colspan="1" rowspan="1"><p>2</p></td><td colspan="1" rowspan="1"><p>[-222,000 → -215,200]</p></td><td colspan="1" rowspan="1"><p>5</p></td><td colspan="1" rowspan="1"><p>0.25 ETH</p></td><td colspan="1" rowspan="1"><p>Mid concentration</p></td></tr><tr><td colspan="1" rowspan="1"><p>3</p></td><td colspan="1" rowspan="1"><p>[-216,200 → -210,000]</p></td><td colspan="1" rowspan="1"><p>5</p></td><td colspan="1" rowspan="1"><p>0.35 ETH</p></td><td colspan="1" rowspan="1"><p>Tightest concentration</p></td></tr><tr><td colspan="1" rowspan="1"><p>4</p></td><td colspan="1" rowspan="1"><p>[-210,800 → +887,200]</p></td><td colspan="1" rowspan="1"><p>1</p></td><td colspan="1" rowspan="1"><p>0.2 ETH</p></td><td colspan="1" rowspan="1"><p>Safety net (thin)</p></td></tr></tbody></table>

**Total deployed:** ~4.55 ETH across 21 positions

### Market Cap Depth Map (WETH @ ~$2,700)

<table style="min-width: 75px;"><colgroup><col style="min-width: 25px;"><col style="min-width: 25px;"><col style="min-width: 25px;"></colgroup><tbody><tr><th colspan="1" rowspan="1"><p>Zone</p></th><th colspan="1" rowspan="1"><p>Mcap Range</p></th><th colspan="1" rowspan="1"><p>Depth Characteristic</p></th></tr><tr><td colspan="1" rowspan="1"><p>$27K → $61K</p></td><td colspan="1" rowspan="1"><p>Curve 1 only</p></td><td colspan="1" rowspan="1"><p>Thin, easy to push through</p></td></tr><tr><td colspan="1" rowspan="1"><p><strong>$61K → $82K</strong></p></td><td colspan="1" rowspan="1"><p><strong>Curves 1+2 overlap</strong></p></td><td colspan="1" rowspan="1"><p><strong>~2x depth</strong></p></td></tr><tr><td colspan="1" rowspan="1"><p>$82K → $108K</p></td><td colspan="1" rowspan="1"><p>Curve 2 only</p></td><td colspan="1" rowspan="1"><p>Moderate</p></td></tr><tr><td colspan="1" rowspan="1"><p><strong>$108K → $122K</strong></p></td><td colspan="1" rowspan="1"><p><strong>Curves 2+3 overlap</strong></p></td><td colspan="1" rowspan="1"><p><strong>~2x depth</strong></p></td></tr><tr><td colspan="1" rowspan="1"><p>$122K → $189K</p></td><td colspan="1" rowspan="1"><p>Curve 3 only</p></td><td colspan="1" rowspan="1"><p>Moderate</p></td></tr><tr><td colspan="1" rowspan="1"><p><strong>$189K → $205K</strong></p></td><td colspan="1" rowspan="1"><p><strong>Curves 3+4 overlap</strong></p></td><td colspan="1" rowspan="1"><p><strong>~2x depth</strong></p></td></tr><tr><td colspan="1" rowspan="1"><p>$205K+</p></td><td colspan="1" rowspan="1"><p>Curve 4 only</p></td><td colspan="1" rowspan="1"><p><strong>Extremely thin — cliff edge</strong></p></td></tr></tbody></table>

* * *

## Critical Trading Implications

### 1\. Designed for Volatility, Not Stability

The liquidity structure is optimized for **fast, violent price action** in a narrow mcap band:

*   **Entire concentrated range:** $27K → $205K (7.5x price journey)
    
*   **Beyond $205K:** Near-zero liquidity, price can moon or crater on minimal volume
    
*   **All segments activate at once:** The "scheduled" hook is a binary gate (blocked → fully live), not gradual activation
    

> **Bottom line:** These tokens are engineered for micro-cap speculation, not gradual price discovery.

### 2\. No External Liquidity

The Doppler hook **blocks all third-party liquidity additions**. What you see at launch is what you get:

*   No retail LPs can add depth to stabilize price
    
*   No whale can come in and provide "support"
    
*   The curve structure is immutable, no adjustments possible
    

### 3\. Locked but Not Burned

Liquidity positions are locked in the `UniswapV4MulticurveInitializer`, not burned. This means:

*   Fees stream to beneficiaries forever.
    
*   Migration is effectively disabled (`NoOpMigrator` always reverts)
    
*   The initializer holds the liquidity position, but the fees are distributed to beneficiaries configured by the user, plus 5% for Doppler.
    

* * *

## The "Scheduled" Hook Explained (Feb 10)

> **Historical:** Bankr now uses `DecayMulticurveInitializerHook` instead. See [Current Setup](#current-setup-feb-13-decaymulticurveinitializer).

Despite the name, "Scheduled" doesn't mean gradual liquidity activation:

1.  At creation, a `startingTime` timestamp is set
    
2.  Before that time: all swaps revert with `CannotSwapBeforeStartingTime()`
    
3.  After that time: **all 21 segments are immediately tradeable**
    

There's no phased rollout, no time-based dampening. It's a binary switch from "no trading" to "full volatility."

* * *

## DERC20: The Token Standard

Doppler tokens are **DERC20**, an extended ERC20 with additional built-in functionality.

```solidity
contract DERC20 is ERC20, ERC20Votes, ERC20Permit, Ownable {
    uint256 public immutable vestingStart;
    uint256 public immutable vestingDuration;
    uint256 public immutable vestedTotalAmount;
    address public pool;
    bool public isPoolUnlocked;
    uint256 public yearlyMintRate; // Max 2%
    string public tokenURI;
}
```

**Built-in features:**

*   **Vesting:** Up to 80% of supply can be time-locked
    
*   **Governance:** ERC20Votes for DAO functionality (though irrelevant for Bankr)
    
*   **Inflation controls:** Max 2% yearly mint rate
    
*   **Permit2:** Gasless approvals.
    
*   **Pool locking:** Liquidity locked until conditions met (in our case, forever)
    

* * *

## Current Setup (Feb 13): DecayMulticurveInitializer

Bankr switched to a newer Doppler contract within three days of launch. The following reflects the **current active configuration**.

### Current Contracts

<table style="min-width: 50px;"><colgroup><col style="min-width: 25px;"><col style="min-width: 25px;"></colgroup><tbody><tr><th colspan="1" rowspan="1"><p>Contract</p></th><th colspan="1" rowspan="1"><p>Address</p></th></tr><tr><td colspan="1" rowspan="1"><p>DecayMulticurveInitializer</p></td><td colspan="1" rowspan="1"><p><code>0xd59ce43e53d69f190e15d9822fb4540dccc91178</code></p></td></tr><tr><td colspan="1" rowspan="1"><p>DecayMulticurveInitializerHook</p></td><td colspan="1" rowspan="1"><p><code>0xbB7784A4d481184283Ed89619A3e3ed143e1Adc0</code></p></td></tr></tbody></table>

**Source:** [DecayMulticurveInitializer.sol](https://github.com/whetstoneresearch/doppler/blob/46bad16d5524661fac04a0e3cd0ea81f7648ecc7/src/initializers/DecayMulticurveInitializer.sol#L36) / [DecayMulticurveInitializerHook.sol](https://github.com/whetstoneresearch/doppler/blob/46bad16d5524661fac04a0e3cd0ea81f7648ecc7/src/initializers/DecayMulticurveInitializerHook.sol)

### What Changed: Decaying Fee Instead of Start-Time Gate

The old "Scheduled" hook blocked all swaps until `startingTime`, then opened the floodgates. The new "Decay" hook takes a different approach: **swaps are always allowed**, but the fee starts extremely high and linearly decays to the terminal rate.

The hook struct (from source, single storage slot):

```solidity
struct FeeSchedule {
    uint32 startingTime;
    uint24 startFee;    // Fee at start
    uint24 endFee;      // Terminal fee
    uint24 lastFee;     // Last applied (monotonically decreasing)
    uint32 durationSeconds;
}
```

**Flow Caster deployment values (verified on-chain):**

<table style="min-width: 50px;"><colgroup><col style="min-width: 25px;"><col style="min-width: 25px;"></colgroup><tbody><tr><th colspan="1" rowspan="1"><p>Parameter</p></th><th colspan="1" rowspan="1"><p>Value</p></th></tr><tr><td colspan="1" rowspan="1"><p>startFee</p></td><td colspan="1" rowspan="1"><p>800,000 = <strong>80%</strong></p></td></tr><tr><td colspan="1" rowspan="1"><p>endFee</p></td><td colspan="1" rowspan="1"><p>12,000 = <strong>1.2%</strong></p></td></tr><tr><td colspan="1" rowspan="1"><p>durationSeconds</p></td><td colspan="1" rowspan="1"><p><strong>10 seconds</strong></p></td></tr></tbody></table>

The fee decays linearly: `currentFee = startFee - (startFee - endFee) * elapsed / durationSeconds`. At second 0 it's 80%, at second 5 it's ~41%, at second 10 it locks at 1.2%.

This is an anti-snipe mechanism. Bots that buy in the first seconds get taxed at up to 80%. Wait 10 seconds and you pay a normal 1.2%.

### Current Curve Structure

The Feb 10 setup used 4 overlapping curves with ~21 segments in a narrow $27K–$205K range. The current setup is much simpler:

<table style="min-width: 100px;"><colgroup><col style="min-width: 25px;"><col style="min-width: 25px;"><col style="min-width: 25px;"><col style="min-width: 25px;"></colgroup><tbody><tr><th colspan="1" rowspan="1"><p>Curve</p></th><th colspan="1" rowspan="1"><p>Tick Range</p></th><th colspan="1" rowspan="1"><p>Share</p></th><th colspan="1" rowspan="1"><p>Mcap Range</p></th></tr><tr><td colspan="1" rowspan="1"><p>0 (concentrated)</p></td><td colspan="1" rowspan="1"><p>[-230,000 → -120,000]</p></td><td colspan="1" rowspan="1"><p>99%</p></td><td colspan="1" rowspan="1"><p><strong>~$27.7K → ~$1.66B</strong></p></td></tr><tr><td colspan="1" rowspan="1"><p>1 (safety net)</p></td><td colspan="1" rowspan="1"><p>[-120,000 → +887,200]</p></td><td colspan="1" rowspan="1"><p>1%</p></td><td colspan="1" rowspan="1"><p><strong>~$1.66B → ∞</strong></p></td></tr></tbody></table>

The concentrated range now extends to **$1.66B**, roughly 60x wider than the previous $205K ceiling. No overlapping curves, no stacked "speed bump" zones. One large position holds 99% of supply.

### Revised Comparison

<table style="min-width: 75px;"><colgroup><col style="min-width: 25px;"><col style="min-width: 25px;"><col style="min-width: 25px;"></colgroup><tbody><tr><th colspan="1" rowspan="1"><p>Aspect</p></th><th colspan="1" rowspan="1"><p>Bankr in Clanker (V4, current)</p></th><th colspan="1" rowspan="1"><p>Bankr in Doppler (Decay, current)</p></th></tr><tr><td colspan="1" rowspan="1"><p><strong>DEX</strong></p></td><td colspan="1" rowspan="1"><p>Uniswap V4</p></td><td colspan="1" rowspan="1"><p>Uniswap V4</p></td></tr><tr><td colspan="1" rowspan="1"><p><strong>Tick Range</strong></p></td><td colspan="1" rowspan="1"><p>[-230,400 → -120,000]</p></td><td colspan="1" rowspan="1"><p>[-230,000 → -120,000]</p></td></tr><tr><td colspan="1" rowspan="1"><p><strong>Mcap Range</strong></p></td><td colspan="1" rowspan="1"><p>~$26.7K → ~$1.66B</p></td><td colspan="1" rowspan="1"><p>~$27.7K → ~$1.66B</p></td></tr><tr><td colspan="1" rowspan="1"><p><strong>Fee</strong></p></td><td colspan="1" rowspan="1"><p>1.2% (static, can add a volatility hook that rises it up to 5% depending on market conditions)</p></td><td colspan="1" rowspan="1"><p>80% → 1.2% (10s linear decay)</p></td></tr><tr><td colspan="1" rowspan="1"><p><strong>Anti-Snipe</strong></p></td><td colspan="1" rowspan="1"><p>Dedicated MEV module</p></td><td colspan="1" rowspan="1"><p>Fee decay (80% for first 10s)</p></td></tr><tr><td colspan="1" rowspan="1"><p><strong>Curves</strong></p></td><td colspan="1" rowspan="1"><p>1 (single concentrated range)</p></td><td colspan="1" rowspan="1"><p>2 (99%/1% split)</p></td></tr><tr><td colspan="1" rowspan="1"><p><strong>Tick Spacing</strong></p></td><td colspan="1" rowspan="1"><p>200</p></td><td colspan="1" rowspan="1"><p>200</p></td></tr><tr><td colspan="1" rowspan="1"><p><strong>External LPs</strong></p></td><td colspan="1" rowspan="1"><p>Allowed</p></td><td colspan="1" rowspan="1"><p>Blocked by hook</p></td></tr></tbody></table>

The tick ranges are nearly identical, both platforms now target the same ~$27K → ~$1.66B market cap corridor.

### Current Trading Implications

*   The "cliff edge at $205K" no longer applies to new Bankr deployments, the concentrated range now extends to ~$1.66B
    
*   Anti-snipe via fee decay is aggressive: buying in the first 10 seconds costs up to 80%
    
*   The safety-net tail (1% of supply beyond $1.66B) means there's *some* liquidity above the concentrated range. Clanker allows adding liquidity on arbitrary ranges after token deployment.
    

* * *

## Summary

Bankr's migration to Doppler represents a shift in infrastructure philosophy.

Both Clanker and Doppler are professional-grade systems, Clanker is backed by Farcaster/Neynar, has processed billions in volume, and its v4 now offers similar features including custom curves (up to 7 positions), dynamic fees, and MEV protection.

The key differences are economic: Clanker protocol fees are significantly higher than Doppler's. Doppler also offers richer token primitives (DERC20 with built-in governance, vesting, and inflation controls) and more granular curve design flexibility through its multicurve architecture.

The current setup concentrates 99% of liquidity in a ~$27K–$1.66B range with a 1% safety net above. Combined with aggressive anti-snipe fees (80% decaying to 1.2% over 10 seconds) and no external LP access, the design prioritizes fee capture from active trading while providing reasonable depth acraoss a wide mcap range.

Trade accordingly.

* * *

## References

*   Doppler App: [https://app.doppler.lol/](https://app.doppler.lol/)
    
*   Doppler Docs: [https://docs.doppler.lol/](https://docs.doppler.lol/)
    
*   Doppler GitHub: [https://github.com/whetstoneresearch/doppler](https://github.com/whetstoneresearch/doppler)
    
*   Bankr Announcement: [https://x.com/i/status/2021103152246775936](https://x.com/i/status/2021103152246775936)
