How to actually use KulaSwap — bridge in, swap, provide liquidity, borrowWritten for someone who has never used a DEX. If you already have, skip to the contract table at the bottom and go.
Every address below is verified deployed on PRANA mainnet. Check any of them yourself with
eth_getCode before you send anything anywhere.
Step 1 — get on the chainAdd PRANA to MetaMask or any EVM wallet. Settings → Networks → Add network manually:
Your existing
0x... address works here. You do not create a new one.
Step 2 — get some PRANAThere is no sale, and PRANA's genesis allocation is empty — the state root is the empty trie,
0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421, which is what a chain's account database hashes to when it holds zero accounts and zero balances. Any node recomputes it in one query. So you mine PRANA, or someone sends you some.
KULA is a different token and it does not have that property. Read this before you go further.KULA's cap is 11,000,000. At block 2,618 a single mint of
100,000 KULA went to one address, before any of it was mined.
That is a pre-mine, and calling it anything else would be dishonest. It is
0.91% of the maximum supply, and it exists for one reason:
liquidity, to open the trading pairs. An AMM cannot quote a price against an empty pool — somebody has to put the first side in, and on a chain with no sale and no investors that somebody is us. It is what makes the pairs in Step 4 quotable at all.
Later emission mints went to the same address, which holds
107,295.43 KULA today —
0.98% of the maximum supply.
And every KULA that exists right now is ours. 148,401.83 have been minted. Ten addresses hold them, and all ten are our wallets or our own contracts — the LP pair, the gauge, the lock, the lottery, the vault.
There is no outside holder yet. The public float is zero. You would be early, and early here means the distribution has not happened, not that you are ahead of a crowd.
Check it rather than take my word for it:
KULA token 0x32255D0138f5D645894FA89b5D5B5a68cF9Aa631
holder 0x026d69cb54b82a805b6aae60718c4877124d8d11
eth_getLogs Transfer topic, from = 0x0, on the token address
-> the mint at block 2618 is the first entry
An earlier version of this post said "there was no premine and every coin was mined." That was false about KULA, and it is corrected here rather than in a reply. The genesis clause was true and was doing the work of carrying a claim that was not. Concentration falls as emission continues, because the cap is fixed and the mint rate is not discretionary. Size any position knowing where the supply is today rather than finding out afterwards.
PRANA is
Etchash (ECIP-1099, active from block 40,000), the same algorithm as Ethereum Classic, so any ETC-capable miner works with a config change and a 2 GB card is enough.
lolMiner --algo ETCHASH --pool pool.soapbox.community:3333 --user 0xYourAddress
ETCHASH, not ETHASH. An ethash miner builds a DAG of the wrong size and earns nothing while appearing to work. Full mining and node guide in the PRANA thread:
https://bitcointalk.org/index.php?topic=5592761.0 — read the supply section there before you commit hardware.
Step 3 — wrap itAn AMM cannot trade the chain's native coin directly, so you wrap it.
WPRANA is PRANA in ERC-20 clothing, one-to-one, and you unwrap whenever you like. kula.money does this for you when you swap from PRANA; the wrap is a deposit into the WPRANA contract and it is reversible.
Step 4 — swapGo to
kula.money, connect the wallet, pick the pair.
Three things worth understanding before your first trade, because they are where people lose money:
Import tokens by ADDRESS, never by ticker. Anyone can deploy a token called anything. On every chain, the address is the identity. The canonical addresses are at the bottom of this post.
Check the pool depth before you size a trade. On a UniV2 AMM the price moves against you as your trade grows relative to the pool. These pools are young and thin — that effect is large right now. Read the reserves yourself:
curl -s -X POST https://rpc.prana.melek.salon -H 'content-type: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"eth_call","params":[{"to":"0x3fC307dEa06667f5a7a640Ec0aBb950EacC4B8C2","data":"0x0902f1ac"},"latest"]}'
That is
getReserves() on the KULA/WPRANA pair. Two 32-byte numbers: the two reserves. If your trade is a large fraction of the smaller one, you will move the price a lot. Do this before every meaningful trade, not once.
Slippage tolerance is a floor, not a fee. It is the worst price you will accept. Set it too tight and the trade reverts; too loose and you accept a bad fill. Start at 0.5% and raise it only if the swap keeps failing.
Step 5 — provide liquidity, if you want the feesDepositing both sides of a pair mints you LP tokens, and you earn a cut of every swap through that pool.
Understand impermanent loss first. If the two assets diverge in price, you end up with more of the one that fell and less of the one that rose, and you can finish behind simply holding both. It is not a bug, it is how an AMM rebalances. Fees are the compensation; whether they cover it depends on volume and volatility. On a new pool with little volume, assume they will not.
Step 6 — veKULA, gauges and stakingLock KULA and you get
veKULA — vote-escrowed KULA. Longer lock, more voting weight. That weight directs emissions between pools through the
GaugeController, so liquidity providers who also lock get to point rewards at the pool they are in. Two dividend distributors pay out separately, one to stakers and one to miners.
Status, plainly: these contracts are deployed and the KULA/WPRANA gauge is
funded and paying — emissions have been minted and a reward period opened. Do not take that from this post, because a reward period has an end and this text does not expire. Read the gauge directly:
curl -s -X POST https://rpc.prana.melek.salon -H 'content-type: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"eth_call","params":[{"to":"0x46d92Ae6F5D55Eb5f12F222e44F0CDAC74E38e45","data":"0x7b0a47ee"},"latest"]}'
That is
rewardRate() — KULA per second, as a wei value. Non-zero means the gauge is streaming rewards to whoever has LP staked in it. Zero means the current period has ended and nothing is accruing until it is funded again, whatever any interface tells you.
periodFinish() (
0xebe2b12b) gives the unix time the current period runs out.
Emissions come from an
EmissionScheduler on a fixed per-epoch schedule against KULA's 11,000,000 hard cap, and they are directed to pools through the
GaugeController by veKULA vote weight. So locking KULA does two things at once: it boosts your own farm yield and it steers where the emissions go.
The model is Curve's: it rewards people who commit for a period over people who arrive for a day.
Step 7 — borrowingThe CDP vault lets you deposit KULA as collateral and borrow against it, up to
50% LTV. Borrow less than the maximum. If collateral value falls and your position crosses the threshold, it is liquidated, and the gap between 50% and where you actually sit is your margin for a bad day. On a thin market, price moves fast — treat the maximum as theoretical.
Contracts — verify these, do not trust the listCore AMM| KULA | 0x32255D0138f5D645894FA89b5D5B5a68cF9Aa631 |
| Router | 0x24e53792B7f6609c85Bd3a3179A90638c9Dbc8B5 |
| Factory | 0xFb5B83ed7F54e5fa45ED528dbe2167bB0b93b1E6 |
| WPRANA | 0xCAbCaAeBBF7a7312b91A92Faa635d7a32Af42a34 |
| KULA/WPRANA pair | 0x3fC307dEa06667f5a7a640Ec0aBb950EacC4B8C2 |
| KULA/wMELEK pair | 0xa88cb17efeeeaf68b2eb970dcabd26a60b3feb3b |
| KULA/wVKBT pair | 0xe3e01d327bc2bee7a5754c1e7ff23158e017688e |
| KULA/wCURE pair | 0x521786d5ede921c7e8f248796aca10e5370149a3 |
Check the Router points at that Factory, in one call — if it does not, you are looking at the wrong Router:
curl -s -X POST https://rpc.prana.melek.salon -H 'content-type: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"eth_call","params":[{"to":"0x24e53792B7f6609c85Bd3a3179A90638c9Dbc8B5","data":"0xc45a0155"},"latest"]}'
Governance and rewards| veKULA | 0x2a9da080BB38C9cfc4B9c8D7cFd4699fF57a5438 |
| GaugeController | 0x3858Bcd8CEE92FBDB0ECBC3946C67C112416A63C |
| Gauge KULA/WPRANA | 0x46d92Ae6F5D55Eb5f12F222e44F0CDAC74E38e45 |
| Dividends — stakers | 0xd9B52f758Aaab68BdEde7F84bE9bF6b2353E479A |
| Dividends — miners | 0x52a32920d4635AE0ab7F77b54679e9359D6Fa778 |
| Timelock | 0x574DeEaa82BcA4ACF6C5669D8dbe084C28EE0da4 |
Borrowing| CDPVault | 0x9cdAe72dE19F93947cE3B4d5329FA81A5ef53ba2 |
| MelekBorrowNote | 0x8c4B882D7379D35413E2a9202f63B53f893D1A9D |
| PriceOracle | 0x905B3505037E49771B35F9f3944D8EC2B9eF3AFD |
Bridge — MELEK / Hive-Engine to PRANA| GrapheneDepositBridge | 0xf8245a4c9A8af47760C45D8393A74Ea8EEF1E505 |
| ValidatorSet | 0x7FE3897dFF8e28C8fa45DCe52DBfedF10368809E |
| WrappedTokenFactory | 0x88DaBEB713E18974A7A4524f4b7b5c96D6AAaF93 |
| wMELEK | 0xf6d9BE2859191b45820Df3A3B3b321b1b2589AB9 |
| wVKBT | 0xD915E757662c4234137aff167Bf93d588145f75e (8 dec) |
| wCURE | 0x03d613BDaAd82ecd6cf36B0fEf88Fb6AF9d977Ff (8 dec) |
How the bridge works, plainly: you send the asset to a custody account on the origin chain with your
0x address in the memo. Independent attesters watch that account, and when enough of them agree a deposit happened, the wrapped token mints to your address. A quorum of attesting keys must agree — no single operator can mint. Burning the wrapped token releases the original. A MELEK deposit has been taken through this end to end and minted wMELEK on PRANA.
What this isA UniV2 AMM, vote-escrow and gauges so liquidity providers direct emissions, dividend distributors for stakers and miners, a CDP vault to borrow against KULA, and a bridge to a Graphene social chain — on a proof-of-work EVM chain you can mine on a card you already own, whose genesis allocation is empty and provably so. KULA's own distribution is in Step 2 above, stated in full.
It is early and it is thin, and this post tells you which parts are switched on and which are not so you can check rather than discover. Ask in the thread. The answer will be a command you can run yourself.
Links