Live on Robinhood Chain · ID 4663

Swirl

The first memecoin whose homepage is an actual fluid dynamics solver. Every pixel is computed in real time. None of it is a video.

Take the controls See what is running
0x0000000000000000000000000000000000000000
Stir it
Frame rate
Sim grid
Dye grid
Jacobi iters
Impulses
Solver
What is running

These two lines are the entire background.

Incompressible Navier–Stokes, solved on the GPU every frame. Below is the equation, which term maps to which shader pass, and the actual source of two of those passes — copied out of this page, not re-typed for the marketing.

u/∂t = −(u·∇)u − ∇p + ν∇²u + f
∇·u = 0 Velocity field u · pressure p · viscosity ν · force f
(u·∇)u
AdvectionThe fluid carries itself. Solved by tracing each pixel backwards along the velocity field and sampling where it came from — ADVECT, semi-Lagrangian, bilinear fetch.
∇p
Pressure gradientSubtracted from velocity so the flow stops compressing. Pressure itself comes from a Jacobi relaxation, 20 passes per frame — PRESSURE then GRADIENT.
∇·u = 0
IncompressibilityThe constraint that makes it look like a real fluid instead of smoke. Divergence is measured first, then cancelled — DIVERGENCE.
ν∇²u
ViscosityHandled as per-frame dissipation rather than a full diffusion solve. Cheaper, and at this grid size visually identical.
f
External forceThat is your cursor. Every movement injects momentum and dye into the grid — SPLAT, gaussian falloff.
Fragment shader · vorticity confinement
// curl of the velocity field, per texel
void main () {
  float L = texture(uVelocity, vL).y;
  float R = texture(uVelocity, vR).y;
  float T = texture(uVelocity, vT).x;
  float B = texture(uVelocity, vB).x;
  float vorticity = R - L - T + B;
  fragColor = vec4(0.5 * vorticity, 0.0, 0.0, 1.0);
}

// push velocity back along the vorticity gradient,
// which is what keeps the small curls alive
void main () {
  float L = texture(uCurl, vL).x;
  float R = texture(uCurl, vR).x;
  float T = texture(uCurl, vT).x;
  float B = texture(uCurl, vB).x;
  float C = texture(uCurl, vUv).x;

  vec2 force = 0.5 * vec2(abs(T) - abs(B),
                          abs(R) - abs(L));
  force /= length(force) + 0.0001;
  force *= curl * C;
  force.y *= -1.0;

  vec2 velocity = texture(uVelocity, vUv).xy;
  velocity += force * dt;
  velocity = min(max(velocity, -1000.0), 1000.0);
  fragColor = vec4(velocity, 0.0, 1.0);
}
curl vorticity divergence pressure ×20 gradient subtract advect velocity advect dye display
Take the controls

Operate it yourself.

These sliders are wired straight into the solver running behind this page. Drag anywhere to inject force. Nothing here is a preview — you are editing the simulation.

Solver parameters
30
1.0
6000
20
0.20

Raise vorticity past 40 and the field stops settling. Drop pressure iterations below 8 and you can watch incompressibility fail — the dye starts to bunch up instead of flowing.

Token & network

The whole token, on one screen.

Name / symbol
Swirl / SWIRL
Standard
ERC-20 · 18 decimals · no mint, no blacklist, no transfer hook
Total supply
1,000,000,000 fixed
Buy / sell tax
0 / 0
Distribution
90% liquidity (LP burned) · 5% community · 5% treasury (12-month linear vest)
Contract
0x0000000000000000000000000000000000000000
Network
Robinhood Chain · Ethereum L2 on Arbitrum
Chain ID
4663 (0x1237)
Gas token
ETH
RPC
https://rpc.mainnet.chain.robinhood.com
Explorer
https://robinhoodchain.blockscout.com

Read this row by row before you buy anything. Every value above should match what the explorer tells you independently. If a number here disagrees with the chain, trust the chain and assume this page is wrong or hostile.

  1. Get on the networkRobinhood Chain, chain ID 4663, gas paid in ETH. Robinhood Wallet supports it natively; other wallets take the RPC endpoint listed above.
  2. Bridge ETHCanonical Arbitrum bridge or any supported route. Leave headroom for gas.
  3. Verify the addressCompare the contract row above against Blockscout. Twice. Fake tokens cost nothing to deploy.
  4. Swap, then come backUniswap on Robinhood Chain. Then return to the controls above, which is the only thing this token actually does.
Changelog

No roadmap. Just what has actually shipped.

Nothing below is a promise. When something changes, it gets a line here with a date on it.

VortMascot added. He is a squid, because a squid injects ink into moving water, which is exactly what splat() does. He is not an image file — he is roughly 200 dye impulses drawn into the velocity grid, so he dissolves within about two seconds of existing. Press “Summon Vort” in the controls to bring him back.
Solver exposed as a public instrumentParameters moved out of the source and onto the page. Live telemetry added. The marketing sections that described the solver were deleted in favour of the solver.
Site v1Hero shipped with the full-resolution Navier–Stokes background: 128² velocity grid, 1024² dye grid, 20-iteration pressure solve.
Liquidity seeded, LP burnedPaired against ETH on Uniswap. tx 0x… pending — replace with the real hash before launch.
Contract deployed and verifiedSource published on Blockscout. Mint function removed before deploy, not renounced after.