# Doppler404

### About

Doppler404 enables token creators to issue assets with unified liquid markets by bridging the gap between non-fungible tokens (ERC-721) and fungible tokens (ERC-20). This provides automated price discovery, sniping mitigation, a unified liquid market, and an improved trading UX over traditional NFTs - in addition to expanding the utility of fungible tokens for a variety of key use cases.

**How it works**

Creators and users can define a custom quantity of fungible tokens that result in NFT ownership as inputs into the Doppler protocol contracts. For example, holding 100 of a specific fungible token, eg. $ABC, can result in holding 1 NFT from an art collection called ABCart. These assets can be auctioned using either Doppler's static or dynamic auctions, and migrate the liquidity generated to any of the supported AMMs, with or without onchain governance, just like other Doppler token configurations.

#### DN404 & ERC-7631 modifications

Doppler404 builds on top of the foundation of “DN404”, aka [ERC-7631 for “Dual Nature Token Pairs"](https://ethereum-magicians.org/t/erc-7631-dual-nature-token-pair/18796). With a few modifications, Doppler extends the [DN404](https://github.com/Vectorized/dn404) token standard allowing users to freeze their token balances, ensuring users don't accidentally trade away NFTs that they wish to hold.

### Example usage

```typescript
const dynamicBuilder = new DynamicAuctionBuilder()
  .tokenConfig({
    type: 'doppler404' as const,
    name: data.tokenName,
    symbol: data.tokenSymbol,
    baseURI: data.baseURI || `https://metadata.example.com/${data.symbol}/`,
  })
  .saleConfig({ initialSupply, numTokensToSell })
  .poolConfig({ fee: 3000, tickSpacing: 8 })
  .auctionByTicks({
    startTick, endTick,
    minProceeds: parseEther("100"),
    maxProceeds: parseEther("600"),
    duration: 7 * 24 * 60 * 60,  // 7 days in seconds
    epochLength: 43200,  // 12 hours (default)
  })
  .withMigration({
    type: 'uniswapV4', fee: 3000, tickSpacing: 60,
    streamableFees: {
      lockDuration: 60 * 60 * 24 * 30,
      beneficiaries: []
    }
  })
  .withGovernance({ type: 'noOp' })
  .withUserAddress(account.address)
  .withIntegrator()
  .withTime({ blockTimestamp: Number(adjustedTimestamp) })
  .build();
```

### Demo application

The Doppler Demo App supports Doppler404 and is the easiest way to get started.

<figure><img src="/files/fT9kKAHjO3JmBXs4Oyu2" alt=""><figcaption></figcaption></figure>

View it on GitHub: <https://github.com/whetstoneresearch/doppler-demo-app>


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.doppler.lol/advanced-features/doppler404.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
