# Table of Contents - [Backstop AMM - Kuru](#backstop-amm-kuru) - [Why Build on Monad? - Kuru](#why-build-on-monad-kuru) - [WTF is a CLOB? - Kuru](#wtf-is-a-clob-kuru) - [Liquidity on Kuru - Kuru](#liquidity-on-kuru-kuru) - [Flip Orders - Kuru](#flip-orders-kuru) - [Trading View on Kuru - Kuru](#trading-view-on-kuru-kuru) - [The Trading Hub for Monad - Kuru](#the-trading-hub-for-monad-kuru) - [Calculate Best Path Quote - Kuru](#calculate-best-path-quote-kuru) - [Generate JWT Token - Kuru](#generate-jwt-token-kuru) - [Audit Reports - Kuru](#audit-reports-kuru) - [Architecture Overview - Kuru](#architecture-overview-kuru) - [Tracking Markets & Trades on Kuru DEX - Kuru](#tracking-markets-trades-on-kuru-dex-kuru) - [Contract Addresses - Kuru](#contract-addresses-kuru) - [Discover - Kuru](#discover-kuru) - [Portfolio - Kuru](#portfolio-kuru) - [Overview - Kuru](#overview-kuru) - [Trade - Kuru](#trade-kuru) - [Referrals - Kuru](#referrals-kuru) - [Vaults - Kuru](#vaults-kuru) - [Kuru Flow - Kuru](#kuru-flow-kuru) - [OrderBook Contract - Kuru](#orderbook-contract-kuru) - [MarginAccount Contract - Kuru](#marginaccount-contract-kuru) - [Router Contract Documentation - Kuru](#router-contract-documentation-kuru) - [Launch - Kuru](#launch-kuru) - [Kuru Wallet - Kuru](#kuru-wallet-kuru) - [TypeScript SDK - Kuru](#typescript-sdk-kuru) - [KuruAMMVault - Kuru](#kuruammvault-kuru) - [Liquidity - Kuru](#liquidity-kuru) - [Swap - Kuru](#swap-kuru) - [Quick Start - Kuru](#quick-start-kuru) - [Deploy a market - Kuru](#deploy-a-market-kuru) - [Order Book SDK - Kuru](#order-book-sdk-kuru) - [Page Not Found](#page-not-found) - [Page Not Found](#page-not-found) - [Page Not Found](#page-not-found) - [Page Not Found](#page-not-found) - [Page Not Found](#page-not-found) - [Page Not Found](#page-not-found) - [Page Not Found](#page-not-found) - [Page Not Found](#page-not-found) --- # Backstop AMM - Kuru [Skip to main content](https://docs.kuru.io/concepts/backstop-amm#content-area) [Kuru home page![light logo](https://mintcdn.com/kuru/NV1IYuc7r8ueRMIx/logo/Kuru_Dark_Full.svg?fit=max&auto=format&n=NV1IYuc7r8ueRMIx&q=85&s=fd5b01d4e7bf016b95925e83ee0ef3ea)![dark logo](https://mintcdn.com/kuru/UXaoR-O-t9Kvyjzw/logo/Kuru_Light_Full.svg?fit=max&auto=format&n=UXaoR-O-t9Kvyjzw&q=85&s=e2c30f09efd357f187425fcaefd60ca6)](https://docs.kuru.io/) Search... ⌘KAsk AI Search... Navigation Concepts Backstop AMM [Product](https://docs.kuru.io/) [Concepts](https://docs.kuru.io/concepts/why-monad) [For Developers](https://docs.kuru.io/sdk/quickstart-sdk) [Legal](https://docs.kuru.io/legal/tradingview) ![Vaultsonkuru Web](https://mintcdn.com/kuru/-IgaUSNoOEP1v72W/images/vaultsonkuru.webp?w=2500&fit=max&auto=format&n=-IgaUSNoOEP1v72W&q=85&s=d4f8b2cf33174b508fa7a32cc6461715 "Vaultsonkuru Web") Orderbooks need liquidity to function, but new tokens often struggle to attract market makers. These professional traders usually only support popular tokens with high volume. For new projects, hiring a market maker is expensive and often not an option. Kuru’s Backstop AMM solve this by combining the flexibility of AMMs with the structure of an order book. It spreads liquidity across many small orders using an AMM-style curve. Anyone can deposit into the AMM and instantly become a liquidity provider, earning fees just like with AMMs. Every Kuru market includes the Backstop AMM by default. That means you can launch a token and have instant liquidity—no market maker needed. The order book stays open for all, allowing traders and professionals to participate as your market grows. [Flip Orders](https://docs.kuru.io/concepts/flip-orders) ⌘I --- # Why Build on Monad? - Kuru [Skip to main content](https://docs.kuru.io/concepts/why-monad#content-area) [Kuru home page![light logo](https://mintcdn.com/kuru/NV1IYuc7r8ueRMIx/logo/Kuru_Dark_Full.svg?fit=max&auto=format&n=NV1IYuc7r8ueRMIx&q=85&s=fd5b01d4e7bf016b95925e83ee0ef3ea)![dark logo](https://mintcdn.com/kuru/UXaoR-O-t9Kvyjzw/logo/Kuru_Light_Full.svg?fit=max&auto=format&n=UXaoR-O-t9Kvyjzw&q=85&s=e2c30f09efd357f187425fcaefd60ca6)](https://docs.kuru.io/) Search... ⌘KAsk AI Search... Navigation Concepts Why Build on Monad? [Product](https://docs.kuru.io/) [Concepts](https://docs.kuru.io/concepts/why-monad) [For Developers](https://docs.kuru.io/sdk/quickstart-sdk) [Legal](https://docs.kuru.io/legal/tradingview) ![Kuruxmonad Pn](https://mintcdn.com/kuru/-IgaUSNoOEP1v72W/images/kuruxmonad.png?w=2500&fit=max&auto=format&n=-IgaUSNoOEP1v72W&q=85&s=4a30ca93e0a670af99f57033dea5e09e "Photo Credit: @0x_Wolfer") Kuru’s contracts have been optimized for the EVM and designed for market makers, allowing them to place/cancel limit orders at a low, constant gas cost. This provides tighter spreads and more liquidity on our books. For an orderbook to function effectively, the underlying blockchain must offer quick block times and affordable gas fees. Today’s EVM chains are generally either too slow, too expensive, or both. _**Enter Monad**_ Monad plans to have 10,000 TPS throughput and 1 second block finality. This will result in significantly lower transaction costs and faster block times compared to the current landscape of EVM chains. For the first time, this makes a fully functional CLOB on the EVM L1 feasible, allowing market makers to frequently update their quotes without having to worry about transaction costs (gas fees) and slow block times. [WTF is a CLOB?](https://docs.kuru.io/concepts/wtfisaclob) ⌘I --- # WTF is a CLOB? - Kuru [Skip to main content](https://docs.kuru.io/concepts/wtfisaclob#content-area) [Kuru home page![light logo](https://mintcdn.com/kuru/NV1IYuc7r8ueRMIx/logo/Kuru_Dark_Full.svg?fit=max&auto=format&n=NV1IYuc7r8ueRMIx&q=85&s=fd5b01d4e7bf016b95925e83ee0ef3ea)![dark logo](https://mintcdn.com/kuru/UXaoR-O-t9Kvyjzw/logo/Kuru_Light_Full.svg?fit=max&auto=format&n=UXaoR-O-t9Kvyjzw&q=85&s=e2c30f09efd357f187425fcaefd60ca6)](https://docs.kuru.io/) Search... ⌘KAsk AI Search... Navigation Concepts WTF is a CLOB? [Product](https://docs.kuru.io/) [Concepts](https://docs.kuru.io/concepts/why-monad) [For Developers](https://docs.kuru.io/sdk/quickstart-sdk) [Legal](https://docs.kuru.io/legal/tradingview) A **Central Limit Order Book (CLOB)** is the mechanism that matches buyers and sellers in a market. Instead of negotiating directly, traders place limit orders into the book: instructions to buy or sell a specific quantity of an asset at a given price. The order book keeps these orders organized using **price-time priority**: the best prices are shown first, and when multiple orders exist at the same price, the earliest order takes precedence. In practice, this creates two sides of the market: **bids** (buy orders) and **asks** (sell orders). The highest bid is called the _best bid_, and the lowest ask is the _best ask_. When these overlap, trades are executed automatically, ensuring fair and efficient price discovery. Market orders, which are trades without a specified price like a limit order, are filled against the best available orders on the book. On Kuru, this entire process happens **fully on-chain**. That means all orders, updates, and trades are transparent, verifiable, and permissionless—anyone can participate, and the market cannot be altered or manipulated off-chain. Unlike AMMs, which pool liquidity and use formulas to set prices, a CLOB reflects the live intent of market participants, creating a trading experience closer to traditional exchanges but with the guarantees of blockchain. For a beginner-friendly walkthrough with an apples and markets analogy, see our [WTF is a CLOB](https://blog.kuru.io/p/wtf-is-a-clob) blog. [Why Build on Monad?](https://docs.kuru.io/concepts/why-monad) [Liquidity on Kuru](https://docs.kuru.io/concepts/liquidity) ⌘I --- # Liquidity on Kuru - Kuru [Skip to main content](https://docs.kuru.io/concepts/liquidity#content-area) [Kuru home page![light logo](https://mintcdn.com/kuru/NV1IYuc7r8ueRMIx/logo/Kuru_Dark_Full.svg?fit=max&auto=format&n=NV1IYuc7r8ueRMIx&q=85&s=fd5b01d4e7bf016b95925e83ee0ef3ea)![dark logo](https://mintcdn.com/kuru/UXaoR-O-t9Kvyjzw/logo/Kuru_Light_Full.svg?fit=max&auto=format&n=UXaoR-O-t9Kvyjzw&q=85&s=e2c30f09efd357f187425fcaefd60ca6)](https://docs.kuru.io/) Search... ⌘KAsk AI Search... Navigation Concepts Liquidity on Kuru [Product](https://docs.kuru.io/) [Concepts](https://docs.kuru.io/concepts/why-monad) [For Developers](https://docs.kuru.io/sdk/quickstart-sdk) [Legal](https://docs.kuru.io/legal/tradingview) Kuru’s markets are designed to keep liquidity deep, efficient, and transparent. Liquidity on Kuru comes from multiple ways that work together in a single unified market. A Kuru market now has four types of liquidity: * [Vaults](https://docs.kuru.io/product/vaults) * Concentrated Liquidity (with [Flip orders](https://docs.kuru.io/concepts/flip-orders) ) * [Backstop AMM](https://docs.kuru.io/concepts/backstop-amm) (traditional v2 style) * External market makers quoting on the CLOB Together, these components form one of the most complete liquidity stacks ever deployed on a DEX. Each layer feeds into the same order book, giving traders the best available prices through one venue. [WTF is a CLOB?](https://docs.kuru.io/concepts/wtfisaclob) [Flip Orders](https://docs.kuru.io/concepts/flip-orders) ⌘I --- # Flip Orders - Kuru [Skip to main content](https://docs.kuru.io/concepts/flip-orders#content-area) [Kuru home page![light logo](https://mintcdn.com/kuru/NV1IYuc7r8ueRMIx/logo/Kuru_Dark_Full.svg?fit=max&auto=format&n=NV1IYuc7r8ueRMIx&q=85&s=fd5b01d4e7bf016b95925e83ee0ef3ea)![dark logo](https://mintcdn.com/kuru/UXaoR-O-t9Kvyjzw/logo/Kuru_Light_Full.svg?fit=max&auto=format&n=UXaoR-O-t9Kvyjzw&q=85&s=e2c30f09efd357f187425fcaefd60ca6)](https://docs.kuru.io/) Search... ⌘KAsk AI Search... Navigation Concepts Flip Orders [Product](https://docs.kuru.io/) [Concepts](https://docs.kuru.io/concepts/why-monad) [For Developers](https://docs.kuru.io/sdk/quickstart-sdk) [Legal](https://docs.kuru.io/legal/tradingview) On this page * [How Flip Orders Work](https://docs.kuru.io/concepts/flip-orders#how-flip-orders-work) * [Why Flip Orders?](https://docs.kuru.io/concepts/flip-orders#why-flip-orders) * [Of Note:](https://docs.kuru.io/concepts/flip-orders#of-note%3A) ![Fliporders Jpe](https://mintcdn.com/kuru/-IgaUSNoOEP1v72W/images/fliporders.jpeg?w=2500&fit=max&auto=format&n=-IgaUSNoOEP1v72W&q=85&s=b32d9c1be30254cf70435b9aebd192cc "Fliporders Jpe") Flip orders are a new type of limit order that automatically ‘flips’ liquidity on the opposite side of the book after each fill. Think of it like setting a post-fill action for your order. ### [​](https://docs.kuru.io/concepts/flip-orders#how-flip-orders-work) **How Flip Orders Work** Let’s say you place a bid at $99 and set a flip price at $101. * When your $99 bid fills, instead of giving you the asset, we instantly place a sell order at $101. * When the $101 ask fills, we flip it back into the $99 bid. * This cycle continues every time the order fills, hence the name: flip orders. We simulate the concept of concentrated liquidity without requiring frequent cancelling and posting of orders on the book. Each fill is treated independently and flipped as soon as it is matched. Orders stay passive and follow price-time priority like any other limit order. This provides fine-grained control like CLMMs (ex: Uniswap v3) directly on the order book. ### [​](https://docs.kuru.io/concepts/flip-orders#why-flip-orders) **Why Flip Orders?** Flip orders make LPing on the order book accessible to everyone without the need for custom infrastructure or active management. They work especially well for pairs like LST/native or stable/stable, where tight price ranges reduce the need for professional market makers. Orders stay live on the book with no need for constant updates— just set your range and let it earn. Liquidity remains on the book with no fragmentation. Read here to learn [how to add liquidity](https://docs.kuru.io/concepts/liquidity) to a market on Kuru #### [​](https://docs.kuru.io/concepts/flip-orders#of-note:) **Of Note:** * Flip orders are limit orders and maintain _price time priority_. Due to this behaviour, just-in-time liquidity cannot frontrun flip order positions * Since they are orders, large price ranges will mean placing multiple orders and paying gas for every order, making it difficult to place liquidity across large ranges. [Liquidity on Kuru](https://docs.kuru.io/concepts/liquidity) [Backstop AMM](https://docs.kuru.io/concepts/backstop-amm) ⌘I --- # Trading View on Kuru - Kuru [Skip to main content](https://docs.kuru.io/legal/tradingview#content-area) [Kuru home page![light logo](https://mintcdn.com/kuru/NV1IYuc7r8ueRMIx/logo/Kuru_Dark_Full.svg?fit=max&auto=format&n=NV1IYuc7r8ueRMIx&q=85&s=fd5b01d4e7bf016b95925e83ee0ef3ea)![dark logo](https://mintcdn.com/kuru/UXaoR-O-t9Kvyjzw/logo/Kuru_Light_Full.svg?fit=max&auto=format&n=UXaoR-O-t9Kvyjzw&q=85&s=e2c30f09efd357f187425fcaefd60ca6)](https://docs.kuru.io/) Search... ⌘KAsk AI Search... Navigation Legal Trading View on Kuru [Product](https://docs.kuru.io/) [Concepts](https://docs.kuru.io/concepts/why-monad) [For Developers](https://docs.kuru.io/sdk/quickstart-sdk) [Legal](https://docs.kuru.io/legal/tradingview) Kuru is proud to integrate with TradingView. TradingView is an innovative and easy-to-use financial visualization service and charting platform for a global community of traders and investors. Supported by robust technologies across browser, desktop and mobile apps, the platform provides unparalleled access to live data, e.g. the [BTC USD chart](https://www.tradingview.com/symbols/BTCUSD/) , breaking news, financial reports, [stock screener](https://www.tradingview.com/screener/) , and [economic calendar](https://www.tradingview.com/economic-calendar/) . On Kuru, you will experience seamless TradingView charting, tailored to show you the most accurate and real-time prices for all the markets available on our platform. With TradingView’s cutting-edge charts on Kuru, users can apply numerous analysis tools and customize their charts, save their layouts, and much more. Whether you’re a novice trader just starting your journey or an experienced professional, TradingView’s feature-rich, interactive charts can help you analyze the markets and make well-informed trading decisions. Visit the [TradingView website](https://www.tradingview.com/) to learn more about its capabilities and how it is transforming financial charting and market analysis. ⌘I --- # The Trading Hub for Monad - Kuru [Skip to main content](https://docs.kuru.io/#content-area) [Kuru home page![light logo](https://mintcdn.com/kuru/NV1IYuc7r8ueRMIx/logo/Kuru_Dark_Full.svg?fit=max&auto=format&n=NV1IYuc7r8ueRMIx&q=85&s=fd5b01d4e7bf016b95925e83ee0ef3ea)![dark logo](https://mintcdn.com/kuru/UXaoR-O-t9Kvyjzw/logo/Kuru_Light_Full.svg?fit=max&auto=format&n=UXaoR-O-t9Kvyjzw&q=85&s=e2c30f09efd357f187425fcaefd60ca6)](https://docs.kuru.io/) Search... ⌘KAsk AI Search... Navigation Overview The Trading Hub for Monad [Product](https://docs.kuru.io/) [Concepts](https://docs.kuru.io/concepts/why-monad) [For Developers](https://docs.kuru.io/sdk/quickstart-sdk) [Legal](https://docs.kuru.io/legal/tradingview) On this page * [Overview](https://docs.kuru.io/#overview) * [Products](https://docs.kuru.io/#products) * [Concepts](https://docs.kuru.io/#concepts) * [Developers](https://docs.kuru.io/#developers) ![Headerdesign Pn](https://mintcdn.com/kuru/-IgaUSNoOEP1v72W/images/Headerdesign.png?w=2500&fit=max&auto=format&n=-IgaUSNoOEP1v72W&q=85&s=34528a054a30e0067a1898ef2c967a03) [​](https://docs.kuru.io/#overview) Overview =============================================== [**Kuru**](https://kuru.io/) is a fully onchain order book decentralized exchange (DEX) and smart aggregator built on Monad. Kuru is dedicated to building **the trading hub for Monad**, allowing users to access all of Monad’s liquidity with our smart aggregator, **Kuru Flow**, and bringing a performant central-limit orderbook to the EVM for the first time along with integrated discovery features, a trading terminal, user liquidity provision, and token launchpad. Powered by Monad’s globally decentralized network, Kuru unifies liquidity across the ecosystem with our hybrid integrated CLOB-AMM model that preserves composability and democratizes access to liquidity provisioning. We are closing the gap between decentralized and centralized exchanges by providing **low slippage**, **self-custody**, and **composability**, all-in-one. Kuru’s contracts have been optimized for the EVM and designed for market makers allowing them to place/cancel limit orders at a low, constant gas cost. This leads to **tighter spreads** and **more liquidity** on the order books for users. The team raised [$11.6 million led by Paradigm](https://blog.kuru.io/p/kuru-labs-raises-116m-led-by-paradigm?utm_campaign=post&utm_medium=web) , with participation from Electric Capital. [​](https://docs.kuru.io/#products) Products =============================================== [Swap\ ----\ \ Easily swap between tokens on Monad. Powered by Kuru Flow](https://www.kuru.io/swap) [Trade\ -----\ \ Find and trade any coin on Monad, view charts and trade with a single click.](https://www.kuru.io/discover) [​](https://docs.kuru.io/#concepts) Concepts =============================================== [What is a CLOB?\ ---------------\ \ A beginner’s guide to central limit order books.](https://docs.kuru.io/wtfisaclob) [Liquidity on Kuru\ -----------------\ \ Four types of liquidity seamlessly working on every Kuru market.](https://docs.kuru.io/concepts/liquidity) [​](https://docs.kuru.io/#developers) Developers =================================================== [Kuru Flow API\ -------------\ \ Easily integrate the Kuru Flow smart aggregator.](https://docs.kuru.io/kuru-flow/flow-overview) [SDK\ ---\ \ Access various functionalities for interfacing with Kuru smart contracts.](https://docs.kuru.io/SDK-landing) [Kuru Wallet](https://docs.kuru.io/product/wallet) ⌘I --- # Calculate Best Path Quote - Kuru [Skip to main content](https://docs.kuru.io/api-reference/calculate-best-path-quote#content-area) [Kuru home page![light logo](https://mintcdn.com/kuru/NV1IYuc7r8ueRMIx/logo/Kuru_Dark_Full.svg?fit=max&auto=format&n=NV1IYuc7r8ueRMIx&q=85&s=fd5b01d4e7bf016b95925e83ee0ef3ea)![dark logo](https://mintcdn.com/kuru/UXaoR-O-t9Kvyjzw/logo/Kuru_Light_Full.svg?fit=max&auto=format&n=UXaoR-O-t9Kvyjzw&q=85&s=e2c30f09efd357f187425fcaefd60ca6)](https://docs.kuru.io/) Search... ⌘KAsk AI Search... Navigation API Reference Calculate Best Path Quote [Product](https://docs.kuru.io/) [Concepts](https://docs.kuru.io/concepts/why-monad) [For Developers](https://docs.kuru.io/sdk/quickstart-sdk) [Legal](https://docs.kuru.io/legal/tradingview) Calculate Best Path Quote cURL Copy Ask AI curl --request POST \ --url https://ws.kuru.io/api/quote \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/json' \ --data ' { "userAddress": "0x1234567890abcdef1234567890abcdef12345678", "tokenIn": "0x0000000000000000000000000000000000000000", "tokenOut": "0x754704bc059f8c67012fed69bc8a327a5aafb603", "amount": "1000000000000000000", "slippageTolerance": 50, "autoSlippage": true, "referrerAddress": "0x5678567856785678567856785678567856785678", "referrerFeeBps": 25 } ' 200 Example Copy Ask AI { "type": "swap_calculation", "status": "success", "output": "950000000000000000", "path": {}, "buildResponse": {}, "gasPrices": {}} POST / api / quote Try it Calculate Best Path Quote cURL Copy Ask AI curl --request POST \ --url https://ws.kuru.io/api/quote \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/json' \ --data ' { "userAddress": "0x1234567890abcdef1234567890abcdef12345678", "tokenIn": "0x0000000000000000000000000000000000000000", "tokenOut": "0x754704bc059f8c67012fed69bc8a327a5aafb603", "amount": "1000000000000000000", "slippageTolerance": 50, "autoSlippage": true, "referrerAddress": "0x5678567856785678567856785678567856785678", "referrerFeeBps": 25 } ' 200 Example Copy Ask AI { "type": "swap_calculation", "status": "success", "output": "950000000000000000", "path": {}, "buildResponse": {}, "gasPrices": {}} #### Authorizations BearerAuthApiKeyAuth [​](https://docs.kuru.io/api-reference/calculate-best-path-quote#authorization-authorization) Authorization string header required JWT token obtained from /api/generate-token endpoint #### Body application/json * Option 1 * Option 2 [​](https://docs.kuru.io/api-reference/calculate-best-path-quote#body-one-of-0-auto-slippage) autoSlippage enum required Whether to use automatic slippage calculation Available options: `true`, `false` Example: `true` [​](https://docs.kuru.io/api-reference/calculate-best-path-quote#body-one-of-0-user-address) userAddress string required Ethereum address of the user Example: `"0x1234567890abcdef1234567890abcdef12345678"` [​](https://docs.kuru.io/api-reference/calculate-best-path-quote#body-one-of-0-token-in) tokenIn string required Address of the input token Example: `"0xA0b86a33E6441051686442d3a1BA4Fab4F85d2b2"` [​](https://docs.kuru.io/api-reference/calculate-best-path-quote#body-one-of-0-token-out) tokenOut string required Address of the output token Example: `"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2"` [​](https://docs.kuru.io/api-reference/calculate-best-path-quote#body-one-of-0-amount) amount string required Amount to swap (in wei for tokens with 18 decimals) Example: `"1000000000000000000"` [​](https://docs.kuru.io/api-reference/calculate-best-path-quote#body-one-of-0-slippage-tolerance) slippageTolerance integer Slippage tolerance in basis points (e.g., 50 = 0.5%) Required range: `1 <= x <= 10000` Example: `50` [​](https://docs.kuru.io/api-reference/calculate-best-path-quote#body-one-of-0-referrer-address) referrerAddress string Optional referrer address for fee sharing Example: `"0x5678567856785678567856785678567856785678"` [​](https://docs.kuru.io/api-reference/calculate-best-path-quote#body-one-of-0-referrer-fee-bps) referrerFeeBps integer Optional referrer fee in basis points Required range: `0 <= x <= 10000` Example: `25` #### Response 200 application/json Successfully calculated best path [​](https://docs.kuru.io/api-reference/calculate-best-path-quote#response-type) type string Response type identifier Example: `"swap_calculation"` [​](https://docs.kuru.io/api-reference/calculate-best-path-quote#response-status) status enum Status of the calculation Available options: `success`, `error` Example: `"success"` [​](https://docs.kuru.io/api-reference/calculate-best-path-quote#response-output) output string Expected output amount Example: `"950000000000000000"` [​](https://docs.kuru.io/api-reference/calculate-best-path-quote#response-message) message string Status or error message [​](https://docs.kuru.io/api-reference/calculate-best-path-quote#response-path) path object Swap route information (tx\_builder.SwapRoute) [​](https://docs.kuru.io/api-reference/calculate-best-path-quote#response-build-response) buildResponse object Transaction build response (tx\_builder.BuildResponse) [​](https://docs.kuru.io/api-reference/calculate-best-path-quote#response-gas-prices) gasPrices object Gas price information (swapcalc.GasPriceInfo) [Generate JWT Token](https://docs.kuru.io/api-reference/generate-jwt-token) [Architecture Overview](https://docs.kuru.io/contracts/Architecture-overview) ⌘I --- # Generate JWT Token - Kuru [Skip to main content](https://docs.kuru.io/api-reference/generate-jwt-token#content-area) [Kuru home page![light logo](https://mintcdn.com/kuru/NV1IYuc7r8ueRMIx/logo/Kuru_Dark_Full.svg?fit=max&auto=format&n=NV1IYuc7r8ueRMIx&q=85&s=fd5b01d4e7bf016b95925e83ee0ef3ea)![dark logo](https://mintcdn.com/kuru/UXaoR-O-t9Kvyjzw/logo/Kuru_Light_Full.svg?fit=max&auto=format&n=UXaoR-O-t9Kvyjzw&q=85&s=e2c30f09efd357f187425fcaefd60ca6)](https://docs.kuru.io/) Search... ⌘KAsk AI Search... Navigation API Reference Generate JWT Token [Product](https://docs.kuru.io/) [Concepts](https://docs.kuru.io/concepts/why-monad) [For Developers](https://docs.kuru.io/sdk/quickstart-sdk) [Legal](https://docs.kuru.io/legal/tradingview) Generate JWT Token cURL Copy Ask AI curl --request POST \ --url https://ws.kuru.io/api/generate-token \ --header 'Content-Type: application/json' \ --data ' { "user_address": "0x1234567890abcdef1234567890abcdef12345678" } ' 200 Example Copy Ask AI { "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...", "expires_at": 1700000000, "rate_limit": { "rps": 1, "burst": 1 }} POST / api / generate-token Try it Generate JWT Token cURL Copy Ask AI curl --request POST \ --url https://ws.kuru.io/api/generate-token \ --header 'Content-Type: application/json' \ --data ' { "user_address": "0x1234567890abcdef1234567890abcdef12345678" } ' 200 Example Copy Ask AI { "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...", "expires_at": 1700000000, "rate_limit": { "rps": 1, "burst": 1 }} #### Body application/json [​](https://docs.kuru.io/api-reference/generate-jwt-token#body-user-address) user\_address string required Ethereum address of the user Example: `"0x1234567890abcdef1234567890abcdef12345678"` #### Response 200 application/json Successfully generated JWT token [​](https://docs.kuru.io/api-reference/generate-jwt-token#response-token) token string JWT token string Example: `"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."` [​](https://docs.kuru.io/api-reference/generate-jwt-token#response-expires-at) expires\_at integer Token expiration timestamp (Unix timestamp) Example: `1700000000` [​](https://docs.kuru.io/api-reference/generate-jwt-token#response-rate-limit) rate\_limit object Show child attributes [Overview](https://docs.kuru.io/kuru-flow/flow-overview) [Calculate Best Path Quote](https://docs.kuru.io/api-reference/calculate-best-path-quote) ⌘I --- # Audit Reports - Kuru [Skip to main content](https://docs.kuru.io/contracts/Audits#content-area) [Kuru home page![light logo](https://mintcdn.com/kuru/NV1IYuc7r8ueRMIx/logo/Kuru_Dark_Full.svg?fit=max&auto=format&n=NV1IYuc7r8ueRMIx&q=85&s=fd5b01d4e7bf016b95925e83ee0ef3ea)![dark logo](https://mintcdn.com/kuru/UXaoR-O-t9Kvyjzw/logo/Kuru_Light_Full.svg?fit=max&auto=format&n=UXaoR-O-t9Kvyjzw&q=85&s=e2c30f09efd357f187425fcaefd60ca6)](https://docs.kuru.io/) Search... ⌘KAsk AI Search... Navigation Smart Contracts Audit Reports [Product](https://docs.kuru.io/) [Concepts](https://docs.kuru.io/concepts/why-monad) [For Developers](https://docs.kuru.io/sdk/quickstart-sdk) [Legal](https://docs.kuru.io/legal/tradingview) **All core Kuru contracts are fully audited.** **Below are our completed audits and post-fix reviews.** [**Spearbit**](https://drive.google.com/file/d/1EK8IILnrXOSSKHHp0KcDBNQ2wDcbWp2I/view) [**Spearbit-fix**](https://drive.google.com/file/d/17GSLB-SbYV9mzCgRrrPGp-MsBDkYyNaL/view) [**Cantina**](https://drive.google.com/file/d/14d_plGmdyRAWZDZjpv5Yvr6ofyjAQIxZ/view) [**Cantina-fix**](https://drive.google.com/file/d/1ldynKBsQiQDvPn484t40vJ7JfMgBW7Yr/view) [**Kuru-Flow**](https://drive.google.com/file/d/1V8FdjJJ1qH4fTANrodJZ_iE4rgOqGZkf/view) [Contract Addresses](https://docs.kuru.io/contracts/Contract-addresses) [Tracking Markets & Trades on Kuru DEX](https://docs.kuru.io/contracts/Integration) ⌘I --- # Architecture Overview - Kuru [Skip to main content](https://docs.kuru.io/contracts/Architecture-overview#content-area) [Kuru home page![light logo](https://mintcdn.com/kuru/NV1IYuc7r8ueRMIx/logo/Kuru_Dark_Full.svg?fit=max&auto=format&n=NV1IYuc7r8ueRMIx&q=85&s=fd5b01d4e7bf016b95925e83ee0ef3ea)![dark logo](https://mintcdn.com/kuru/UXaoR-O-t9Kvyjzw/logo/Kuru_Light_Full.svg?fit=max&auto=format&n=UXaoR-O-t9Kvyjzw&q=85&s=e2c30f09efd357f187425fcaefd60ca6)](https://docs.kuru.io/) Search... ⌘KAsk AI Search... Navigation Smart Contracts Architecture Overview [Product](https://docs.kuru.io/) [Concepts](https://docs.kuru.io/concepts/why-monad) [For Developers](https://docs.kuru.io/sdk/quickstart-sdk) [Legal](https://docs.kuru.io/legal/tradingview) The Kuru Router Contract governs all the markets- it is the default owner of all markets and can be used to upgrade markets to a new implementation. The Router is also used to deploy all markets. It stores market params for every market and hence can be easily used to route through markets. The Kuru Margin Account takes care of all accounting related to limit orders and backstop liquidity AMMs. Each market on Kuru comprises of an OrderBook and discretised AMM liquidity. Simply said, you can discretise a CPAMM and transform it into an OrderBook if you calculate the amount of tokens which have to flow in or out between two price points. The OrderBook contract treats the AMM liquidity as a first-class citizen, so it can aggregate between limit orders on the book and the AMM liquidity while maintaining price priority. Markets on Kuru need to be initialised with a given set of parameters which suit the base/quote pair. You will find recommendations on how to set these in the same repo. If you are going YOLO, please note that a low `sizePrecision` will wreck the backstop liquidity and wrong `pricePrecision` might make it impossible to place limit orders on certain pairs. Since matching is done fully onchain, taker orders essentially ‘crank’ maker orders and credit the outputs to the makers. Hence, to avoid potential DOS, we use the margin account for all debits and credits related to limit orders. However, taker orders can choose which path they want to take. **The complete ABI for all Kuru smart contracts is available in the** [Kuru-SDK](https://github.com/Kuru-Labs/kuru-sdk/tree/main/abi) . [Calculate Best Path Quote](https://docs.kuru.io/api-reference/calculate-best-path-quote) [Router Contract Documentation](https://docs.kuru.io/contracts/Router) ⌘I --- # Tracking Markets & Trades on Kuru DEX - Kuru [Skip to main content](https://docs.kuru.io/contracts/Integration#content-area) [Kuru home page![light logo](https://mintcdn.com/kuru/NV1IYuc7r8ueRMIx/logo/Kuru_Dark_Full.svg?fit=max&auto=format&n=NV1IYuc7r8ueRMIx&q=85&s=fd5b01d4e7bf016b95925e83ee0ef3ea)![dark logo](https://mintcdn.com/kuru/UXaoR-O-t9Kvyjzw/logo/Kuru_Light_Full.svg?fit=max&auto=format&n=UXaoR-O-t9Kvyjzw&q=85&s=e2c30f09efd357f187425fcaefd60ca6)](https://docs.kuru.io/) Search... ⌘KAsk AI Search... Navigation Smart Contracts Tracking Markets & Trades on Kuru DEX [Product](https://docs.kuru.io/) [Concepts](https://docs.kuru.io/concepts/why-monad) [For Developers](https://docs.kuru.io/sdk/quickstart-sdk) [Legal](https://docs.kuru.io/legal/tradingview) On this page * [1\. Markets — MarketRegistered (Router)](https://docs.kuru.io/contracts/Integration#1-markets-%E2%80%94-marketregistered-router) * [2\. Trades — Trade (OrderBook)](https://docs.kuru.io/contracts/Integration#2-trades-%E2%80%94-trade-orderbook) * [Summary](https://docs.kuru.io/contracts/Integration#summary) ### [​](https://docs.kuru.io/contracts/Integration#1-markets-%E2%80%94-marketregistered-router) 1\. Markets — `MarketRegistered` (Router) Source: [https://docs.kuru.io/contracts/Router#marketregistered](https://docs.kuru.io/contracts/Router#marketregistered) ### [​](https://docs.kuru.io/contracts/Integration#2-trades-%E2%80%94-trade-orderbook) 2\. Trades — `Trade` (OrderBook) Source: [https://docs.kuru.io/contracts/OrderBook#trade\\\\\\\\](https://docs.kuru.io/contracts/OrderBook#trade%5C%5C%5C%5C) For each `marketAddress` discovered above, subscribe to its `Trade` event. ### [​](https://docs.kuru.io/contracts/Integration#summary) Summary 1. Listen to **Router → MarketRegistered** to discover all markets. 2. For each market, listen to **OrderBook → Trade** to track all trades. [Audit Reports](https://docs.kuru.io/contracts/Audits) ⌘I --- # Contract Addresses - Kuru [Skip to main content](https://docs.kuru.io/contracts/Contract-addresses#content-area) [Kuru home page![light logo](https://mintcdn.com/kuru/NV1IYuc7r8ueRMIx/logo/Kuru_Dark_Full.svg?fit=max&auto=format&n=NV1IYuc7r8ueRMIx&q=85&s=fd5b01d4e7bf016b95925e83ee0ef3ea)![dark logo](https://mintcdn.com/kuru/UXaoR-O-t9Kvyjzw/logo/Kuru_Light_Full.svg?fit=max&auto=format&n=UXaoR-O-t9Kvyjzw&q=85&s=e2c30f09efd357f187425fcaefd60ca6)](https://docs.kuru.io/) Search... ⌘KAsk AI Search... Navigation Smart Contracts Contract Addresses [Product](https://docs.kuru.io/) [Concepts](https://docs.kuru.io/concepts/why-monad) [For Developers](https://docs.kuru.io/sdk/quickstart-sdk) [Legal](https://docs.kuru.io/legal/tradingview) On this page * [Mainnet Addresses](https://docs.kuru.io/contracts/Contract-addresses#mainnet-addresses) * [Official tokens](https://docs.kuru.io/contracts/Contract-addresses#official-tokens) * [Official Markets](https://docs.kuru.io/contracts/Contract-addresses#official-markets) * [Testnet Addresses](https://docs.kuru.io/contracts/Contract-addresses#testnet-addresses) * [Kuru Contracts](https://docs.kuru.io/contracts/Contract-addresses#kuru-contracts) * [Official tokens](https://docs.kuru.io/contracts/Contract-addresses#official-tokens-2) [​](https://docs.kuru.io/contracts/Contract-addresses#mainnet-addresses) Mainnet Addresses ============================================================================================= | **Contract** | **Address** | | --- | --- | | KuruFlowEntrypoint (Aggregator) | 0xb3e6778480b2E488385E8205eA05E20060B813cb | | KuruFlowRouter | 0x0d3a1BE29E9dEd63c7a5678b31e847D68F71FFa2 | | KuruForwarder | 0x974E61BBa9C4704E8Bcc1923fdC3527B41323FAA | | MarginAccount | 0x2A68ba1833cDf93fa9Da1EEbd7F46242aD8E90c5 | | MonadDeployer | 0xe29309e308af3EE3B1a414E97c37A58509f27D1E | | Router (market factory) | 0xd651346d7c789536ebf06dc72aE3C8502cd695CC | [​](https://docs.kuru.io/contracts/Contract-addresses#official-tokens) **Official tokens** --------------------------------------------------------------------------------------------- | Token | Address | | --- | --- | | WMON | `0x3bd359C1119dA7Da1D913D1C4D2B7c461115433A` | | AUSD | `0x00000000eFE302BEAA2b3e6e1b18d08D69a9012a` | | USDC | `0x754704Bc059F8C67012fEd69BC8A327a5aafb603` | [​](https://docs.kuru.io/contracts/Contract-addresses#official-markets) **Official Markets** ----------------------------------------------------------------------------------------------- | Market | Address | | --- | --- | | MON-AUSD | 0x131a2e70a5b31a517a74b8c567149bc294470da9 | | MON-USDC | 0x065C9d28E428A0db40191a54d33d5b7c71a9C394 | * * * [​](https://docs.kuru.io/contracts/Contract-addresses#testnet-addresses) Testnet Addresses ============================================================================================= [​](https://docs.kuru.io/contracts/Contract-addresses#kuru-contracts) **Kuru Contracts** ------------------------------------------------------------------------------------------- | Contract | Address | | --- | --- | | Router | `0x1f5A250c4A506DA4cE584173c6ed1890B1bf7187` | | Margin Account | `0xdDDaBd30785bA8b45e434a1f134BDf304d6125d9` | | Kuru Forwarder | `0xa21ca7b4e308e9E2dC4C60620572792634EA21a0` | | Kuru Deployer | `0x1D90616Ad479c3D814021b1f4C43b1a2fFf87626` | | Kuru Utils | `0xDdAEdbc015fEe6BE50c69Fbf5d771A4563C996B3` | [​](https://docs.kuru.io/contracts/Contract-addresses#official-tokens-2) **Official tokens** ----------------------------------------------------------------------------------------------- | Token | Address | | --- | --- | | USDC | `0xf817257fed379853cDe0fa4F97AB987181B1E5Ea` | | kUSDC | `0xf817257fed379853cDe0fa4F97AB987181B1E5Ea` | | USDT | `0x88b8E2161DEDC77EF4ab7585569D2415a1C1055D` | | DAK | `0x0F0BDEbF0F83cD1EE3974779Bcb7315f9808c714` | | CHOG | `0xE0590015A873bF326bd645c3E1266d4db41C4E6B` | | YAKI | `0xfe140e1dCe99Be9F4F15d657CD9b7BF622270C50` | [KuruAMMVault](https://docs.kuru.io/contracts/KuruAMMVault) [Audit Reports](https://docs.kuru.io/contracts/Audits) ⌘I --- # Discover - Kuru [Skip to main content](https://docs.kuru.io/product/discover#content-area) [Kuru home page![light logo](https://mintcdn.com/kuru/NV1IYuc7r8ueRMIx/logo/Kuru_Dark_Full.svg?fit=max&auto=format&n=NV1IYuc7r8ueRMIx&q=85&s=fd5b01d4e7bf016b95925e83ee0ef3ea)![dark logo](https://mintcdn.com/kuru/UXaoR-O-t9Kvyjzw/logo/Kuru_Light_Full.svg?fit=max&auto=format&n=UXaoR-O-t9Kvyjzw&q=85&s=e2c30f09efd357f187425fcaefd60ca6)](https://docs.kuru.io/) Search... ⌘KAsk AI Search... Navigation Product Discover [Product](https://docs.kuru.io/) [Concepts](https://docs.kuru.io/concepts/why-monad) [For Developers](https://docs.kuru.io/sdk/quickstart-sdk) [Legal](https://docs.kuru.io/legal/tradingview) On this page * [Trending](https://docs.kuru.io/product/discover#trending) * [New Pairs](https://docs.kuru.io/product/discover#new-pairs) * [Quick Buy](https://docs.kuru.io/product/discover#quick-buy) Use **Ctrl/CMD + K** to access the search bar from anywhere within Kuru Pro. ![Discover Pn](https://mintcdn.com/kuru/hMrnuPzfof7F_E4f/images/product/discover.png?w=2500&fit=max&auto=format&n=hMrnuPzfof7F_E4f&q=85&s=9b003ef861c86251dedf900800d9874c) ### [​](https://docs.kuru.io/product/discover#trending) **Trending** The page shows the top 100 trending coins for a given time frame. ### [​](https://docs.kuru.io/product/discover#new-pairs) **New Pairs** Browse newly launched coins on Monad in real time. ### [​](https://docs.kuru.io/product/discover#quick-buy) **Quick Buy** Users can toggle quick buy and buy coins instantly with a pre-set amount of MON. Quick buy is powered by [Kuru Flow](https://docs.kuru.io/product/flow) , ensuring users are getting the best price possible. [Swap](https://docs.kuru.io/product/swap) [Trade](https://docs.kuru.io/product/trade) ⌘I --- # Portfolio - Kuru [Skip to main content](https://docs.kuru.io/product/portfolio#content-area) [Kuru home page![light logo](https://mintcdn.com/kuru/NV1IYuc7r8ueRMIx/logo/Kuru_Dark_Full.svg?fit=max&auto=format&n=NV1IYuc7r8ueRMIx&q=85&s=fd5b01d4e7bf016b95925e83ee0ef3ea)![dark logo](https://mintcdn.com/kuru/UXaoR-O-t9Kvyjzw/logo/Kuru_Light_Full.svg?fit=max&auto=format&n=UXaoR-O-t9Kvyjzw&q=85&s=e2c30f09efd357f187425fcaefd60ca6)](https://docs.kuru.io/) Search... ⌘KAsk AI Search... Navigation Product Portfolio [Product](https://docs.kuru.io/) [Concepts](https://docs.kuru.io/concepts/why-monad) [For Developers](https://docs.kuru.io/sdk/quickstart-sdk) [Legal](https://docs.kuru.io/legal/tradingview) Users can view their detailed holdings on the portfolio page. The holdings are broken down into: 1. Tokens 2. Liquidity positions 3. Vault liquidity 4. Open orders 5. Unclaimed assets (from cancelled/filled limit orders) ![Portfolio Pn](https://mintcdn.com/kuru/OsNOwWsTcHTE5QoK/images/product/portfolio.png?w=2500&fit=max&auto=format&n=OsNOwWsTcHTE5QoK&q=85&s=8d7e07ce6d1f57837113340eefb075f1) [Vaults](https://docs.kuru.io/product/vaults) [Launch](https://docs.kuru.io/product/launch) ⌘I --- # Overview - Kuru [Skip to main content](https://docs.kuru.io/kuru-flow/flow-overview#content-area) [Kuru home page![light logo](https://mintcdn.com/kuru/NV1IYuc7r8ueRMIx/logo/Kuru_Dark_Full.svg?fit=max&auto=format&n=NV1IYuc7r8ueRMIx&q=85&s=fd5b01d4e7bf016b95925e83ee0ef3ea)![dark logo](https://mintcdn.com/kuru/UXaoR-O-t9Kvyjzw/logo/Kuru_Light_Full.svg?fit=max&auto=format&n=UXaoR-O-t9Kvyjzw&q=85&s=e2c30f09efd357f187425fcaefd60ca6)](https://docs.kuru.io/) Search... ⌘KAsk AI Search... Navigation Kuru Flow API Overview [Product](https://docs.kuru.io/) [Concepts](https://docs.kuru.io/concepts/why-monad) [For Developers](https://docs.kuru.io/sdk/quickstart-sdk) [Legal](https://docs.kuru.io/legal/tradingview) The **Kuru Flow API** allows you to access Kuru’s routing engine, which aggregates liquidity across all available markets on Monad. It lets you swap seamlessly from any token to any token through a single interface. Integrators can also add their own fees on top, making it easy to build swap functionality into wallets, dApps, and aggregators.[Get started with Kuru Flow\ --------------------------\ \ Quickly enable swaps on your app with our aggregator. Allow users to trade any token within the Monad ecosystem.\ \ Get Started](https://docs.kuru.io/api-reference/generate-jwt-token) [Deploy a market](https://docs.kuru.io/sdk/deploy-market) [Generate JWT Token](https://docs.kuru.io/api-reference/generate-jwt-token) ⌘I --- # Trade - Kuru [Skip to main content](https://docs.kuru.io/product/trade#content-area) [Kuru home page![light logo](https://mintcdn.com/kuru/NV1IYuc7r8ueRMIx/logo/Kuru_Dark_Full.svg?fit=max&auto=format&n=NV1IYuc7r8ueRMIx&q=85&s=fd5b01d4e7bf016b95925e83ee0ef3ea)![dark logo](https://mintcdn.com/kuru/UXaoR-O-t9Kvyjzw/logo/Kuru_Light_Full.svg?fit=max&auto=format&n=UXaoR-O-t9Kvyjzw&q=85&s=e2c30f09efd357f187425fcaefd60ca6)](https://docs.kuru.io/) Search... ⌘KAsk AI Search... Navigation Product Trade [Product](https://docs.kuru.io/) [Concepts](https://docs.kuru.io/concepts/why-monad) [For Developers](https://docs.kuru.io/sdk/quickstart-sdk) [Legal](https://docs.kuru.io/legal/tradingview) On this page * [Token Details](https://docs.kuru.io/product/trade#token-details) * [Other Details](https://docs.kuru.io/product/trade#other-details) * [Swap](https://docs.kuru.io/product/trade#swap) * [Limit orders](https://docs.kuru.io/product/trade#limit-orders) * [Order book](https://docs.kuru.io/product/trade#order-book) A single page displaying token insights, analytics, and real-time metrics for seamless trading. #### [​](https://docs.kuru.io/product/trade#token-details) Token Details * **Market Price**: Last traded price * **Market Cap**: Market Price x Total circulating supply (if available) * **FDV**: Market Price x Total Token Supply * **Liquidity**: The liquidity in the pool in terms of the quote asset (MON). How much of that liquidity has been locked, by burning the LP tokens * **Total Supply**: The total supply of the coin * **Circ. Supply**: The total supply of the coin - burned tokens Metrics such as price change, volume, net volume, number of traders, and net buyers/sellers are available at 5-minute, 1-hour, 6-hour, and 24-hour intervals. #### [​](https://docs.kuru.io/product/trade#other-details) Other Details * **Trades**: Real time view of trades for that token. Can be filtered by trader address * **Holders**: See the top holders of the token. * **Your Tokens**: All your current positions held by you, with their corresponding PnL * **Open Orders**: List of all your open orders across different markets * **Unclaimed Assets**: Funds from filled or cancelled limit orders can be claimed here [​](https://docs.kuru.io/product/trade#swap) Swap ---------------------------------------------------- The token can be bought from any asset or sold into any asset. Swaps are powered by [Kuru Flow](https://docs.kuru.io/product/flow) , to give users the best possible price onchain. [​](https://docs.kuru.io/product/trade#limit-orders) Limit orders -------------------------------------------------------------------- An order to buy or sell at a specific price. The order fills only if the market reaches your target. The price is always in terms of the quote asset. Limit orders are only available for tokens that have a Kuru Market. Prices will be in quote asset. Supported quote assets are MON and USDC. #### [​](https://docs.kuru.io/product/trade#order-book) Order book Users can toggle between quote and base asset for size at each price and cumulative size at each price level. Click on a price level to set the price when placing limit orders. [Discover](https://docs.kuru.io/product/discover) [Liquidity](https://docs.kuru.io/product/liquidity) ⌘I --- # Referrals - Kuru [Skip to main content](https://docs.kuru.io/product/referrals#content-area) [Kuru home page![light logo](https://mintcdn.com/kuru/NV1IYuc7r8ueRMIx/logo/Kuru_Dark_Full.svg?fit=max&auto=format&n=NV1IYuc7r8ueRMIx&q=85&s=fd5b01d4e7bf016b95925e83ee0ef3ea)![dark logo](https://mintcdn.com/kuru/UXaoR-O-t9Kvyjzw/logo/Kuru_Light_Full.svg?fit=max&auto=format&n=UXaoR-O-t9Kvyjzw&q=85&s=e2c30f09efd357f187425fcaefd60ca6)](https://docs.kuru.io/) Search... ⌘KAsk AI Search... Navigation Product Referrals [Product](https://docs.kuru.io/) [Concepts](https://docs.kuru.io/concepts/why-monad) [For Developers](https://docs.kuru.io/sdk/quickstart-sdk) [Legal](https://docs.kuru.io/legal/tradingview) On this page * [How do I refer someone to Kuru?](https://docs.kuru.io/product/referrals#how-do-i-refer-someone-to-kuru) * [How do I use a referral link?](https://docs.kuru.io/product/referrals#how-do-i-use-a-referral-link) ### [​](https://docs.kuru.io/product/referrals#how-do-i-refer-someone-to-kuru) How do I refer someone to Kuru? Users can create a referral code on [kuru.io/profile](https://www.kuru.io/profile) after you’ve done $5,000 in volume. User will receive 25% of referred users’ fees, less any fee rebate they receive. The referred user receives a 10% trading fee rebate. Share your referral code with other traders using a unique link: kuru.io/join/YOURCODE. Referral rewards accrue only for fees paid in MON and update weekly on Wednesdays. ### [​](https://docs.kuru.io/product/referrals#how-do-i-use-a-referral-link) **How do I use a referral link?** Use a friend’s referral link to open Kuru. Creating a Kuru account with a referral link will give you a 10% fee rebate. Referral rebates and rewards are only applicable for users who create a Kuru account. Referral rewards and rebates are limited to users with a Kuru account only. Users trading through an external wallet are not eligible for these benefits. [Launch](https://docs.kuru.io/product/launch) ⌘I --- # Vaults - Kuru [Skip to main content](https://docs.kuru.io/product/vaults#content-area) [Kuru home page![light logo](https://mintcdn.com/kuru/NV1IYuc7r8ueRMIx/logo/Kuru_Dark_Full.svg?fit=max&auto=format&n=NV1IYuc7r8ueRMIx&q=85&s=fd5b01d4e7bf016b95925e83ee0ef3ea)![dark logo](https://mintcdn.com/kuru/UXaoR-O-t9Kvyjzw/logo/Kuru_Light_Full.svg?fit=max&auto=format&n=UXaoR-O-t9Kvyjzw&q=85&s=e2c30f09efd357f187425fcaefd60ca6)](https://docs.kuru.io/) Search... ⌘KAsk AI Search... Navigation Product Vaults [Product](https://docs.kuru.io/) [Concepts](https://docs.kuru.io/concepts/why-monad) [For Developers](https://docs.kuru.io/sdk/quickstart-sdk) [Legal](https://docs.kuru.io/legal/tradingview) Kuru vaults are protocol owned vaults that Market Make on specific pairs on Kuru. Users can provide liquidity to these vaults and share its pnl. The deposit lock-up period is 4 days. This means you can withdraw 4 day after your most recent deposit. E.g., if you deposited on Nov 24 at 08:00, you would be able to withdraw on Nov 28 at 08:00. While these strategies can generate fees, adverse market conditions may reduce returns or cause losses. Please consider your risk tolerance before depositing. [Liquidity](https://docs.kuru.io/product/liquidity) [Portfolio](https://docs.kuru.io/product/portfolio) ⌘I --- # Kuru Flow - Kuru [Skip to main content](https://docs.kuru.io/product/flow#content-area) [Kuru home page![light logo](https://mintcdn.com/kuru/NV1IYuc7r8ueRMIx/logo/Kuru_Dark_Full.svg?fit=max&auto=format&n=NV1IYuc7r8ueRMIx&q=85&s=fd5b01d4e7bf016b95925e83ee0ef3ea)![dark logo](https://mintcdn.com/kuru/UXaoR-O-t9Kvyjzw/logo/Kuru_Light_Full.svg?fit=max&auto=format&n=UXaoR-O-t9Kvyjzw&q=85&s=e2c30f09efd357f187425fcaefd60ca6)](https://docs.kuru.io/) Search... ⌘KAsk AI Search... Navigation Product Kuru Flow [Product](https://docs.kuru.io/) [Concepts](https://docs.kuru.io/concepts/why-monad) [For Developers](https://docs.kuru.io/sdk/quickstart-sdk) [Legal](https://docs.kuru.io/legal/tradingview) Kuru Flow, our native aggregator, indexes every liquidity source on Monad in real time to provide users with the best route for pricing and slippage for every asset live onchain. Always working off the latest state, Kuru Flow reduces toxic flow and improves execution quality for users, consistently offering better fills with lower slippage. Beyond execution, Kuru Flow also makes Monad’s liquidity more stable by significantly reducing the need for atomic arbitrage. Access the API for Kuru Flow [here](https://docs.kuru.io/product/kuru-flow/flow-overview.mdx) . ![Kuru Flow Pn](https://mintcdn.com/kuru/hMrnuPzfof7F_E4f/images/product/kuru_flow.png?w=2500&fit=max&auto=format&n=hMrnuPzfof7F_E4f&q=85&s=b68d216ba3cf82db6040ff1adc491ac0) [Kuru Wallet](https://docs.kuru.io/product/wallet) [Swap](https://docs.kuru.io/product/swap) ⌘I --- # OrderBook Contract - Kuru [Skip to main content](https://docs.kuru.io/contracts/OrderBook#content-area) [Kuru home page![light logo](https://mintcdn.com/kuru/NV1IYuc7r8ueRMIx/logo/Kuru_Dark_Full.svg?fit=max&auto=format&n=NV1IYuc7r8ueRMIx&q=85&s=fd5b01d4e7bf016b95925e83ee0ef3ea)![dark logo](https://mintcdn.com/kuru/UXaoR-O-t9Kvyjzw/logo/Kuru_Light_Full.svg?fit=max&auto=format&n=UXaoR-O-t9Kvyjzw&q=85&s=e2c30f09efd357f187425fcaefd60ca6)](https://docs.kuru.io/) Search... ⌘KAsk AI Search... Navigation Smart Contracts OrderBook Contract [Product](https://docs.kuru.io/) [Concepts](https://docs.kuru.io/concepts/why-monad) [For Developers](https://docs.kuru.io/sdk/quickstart-sdk) [Legal](https://docs.kuru.io/legal/tradingview) On this page * [Data Structures](https://docs.kuru.io/contracts/OrderBook#data-structures) * [Core Functions](https://docs.kuru.io/contracts/OrderBook#core-functions) * [Order Placement](https://docs.kuru.io/contracts/OrderBook#order-placement) * [Flip Orders](https://docs.kuru.io/contracts/OrderBook#flip-orders) * [Market Orders](https://docs.kuru.io/contracts/OrderBook#market-orders) * [Cancellation](https://docs.kuru.io/contracts/OrderBook#cancellation) * [Liquidity Provision](https://docs.kuru.io/contracts/OrderBook#liquidity-provision) * [View Functions](https://docs.kuru.io/contracts/OrderBook#view-functions) * [Market States](https://docs.kuru.io/contracts/OrderBook#market-states) * [Order Types](https://docs.kuru.io/contracts/OrderBook#order-types) * [Events](https://docs.kuru.io/contracts/OrderBook#events) * [OrderCreated](https://docs.kuru.io/contracts/OrderBook#ordercreated) * [FlipOrderCreated](https://docs.kuru.io/contracts/OrderBook#flipordercreated) * [Trade](https://docs.kuru.io/contracts/OrderBook#trade) * [OrderCanceled](https://docs.kuru.io/contracts/OrderBook#ordercanceled) * [MarketStateUpdated](https://docs.kuru.io/contracts/OrderBook#marketstateupdated) [​](https://docs.kuru.io/contracts/OrderBook#data-structures) Data Structures -------------------------------------------------------------------------------- * **Order** — `{ address owner, uint96 size, uint40 prev, uint40 next, uint40 flippedId, uint32 price, uint32 flippedPrice, bool isBuy }` * **PricePoint** — `{ uint40 head, uint40 tail }` * **TreeUint24** — Tree structure for active price points [​](https://docs.kuru.io/contracts/OrderBook#core-functions) Core Functions ------------------------------------------------------------------------------ ### [​](https://docs.kuru.io/contracts/OrderBook#order-placement) Order Placement Copy Ask AI function addBuyOrder(uint32 _price, uint96 _size, bool _postOnly) external function addSellOrder(uint32 _price, uint96 _size, bool _postOnly) external Places limit buy/sell orders. Matches against resting orders first. If `_postOnly` is true, reverts if any portion matches immediately. ### [​](https://docs.kuru.io/contracts/OrderBook#flip-orders) Flip Orders Copy Ask AI function addFlipBuyOrder(uint32 _price, uint32 _flippedPrice, uint96 _size, bool _provisionOrRevert) external function addFlipSellOrder(uint32 _price, uint32 _flippedPrice, uint96 _size, bool _provisionOrRevert) external Places flip orders that create opposite-side orders on fill. `_flippedPrice` must be better than `_price`. If `_provisionOrRevert` is false, reverts if best price equals current book best. ### [​](https://docs.kuru.io/contracts/OrderBook#market-orders) Market Orders Copy Ask AI function placeAndExecuteMarketBuy(uint96 _quoteSize, uint96 _minOut, bool _isMargin, bool _isFOK) external payable function placeAndExecuteMarketSell(uint96 _size, uint96 _minOut, bool _isMargin, bool _isFOK) external payable Executes market orders against resting liquidity. Supports ERC20–ERC20, NATIVE–ERC20, and ERC20–NATIVE pairs. `_isFOK` enforces fill-or-kill behavior. ### [​](https://docs.kuru.io/contracts/OrderBook#cancellation) Cancellation Copy Ask AI function batchCancelOrders(uint40[] calldata _orderIds) external function batchCancelFlipOrders(uint40[] calldata _orderIds) external Batch cancels regular or flip orders. Idempotent—safe to call multiple times. ### [​](https://docs.kuru.io/contracts/OrderBook#liquidity-provision) Liquidity Provision Copy Ask AI function addPairedLiquidity(uint32 _bidPrice, uint32 _askPrice, uint96 _bidSize, uint96 _askSize) external function batchProvisionLiquidity(uint32[] calldata _prices, uint96[] calldata _sizes, bool[] calldata _isBid) external Adds liquidity to the AMM vault. `addPairedLiquidity` sets bid/ask prices and sizes. Batch function allows provisioning multiple price points at once. ### [​](https://docs.kuru.io/contracts/OrderBook#view-functions) View Functions Copy Ask AI function bestBidAsk() external view returns (uint32, uint32) function getL2Book() external view returns (bytes) function getL2Book(uint32 _bidPricePoints, uint32 _askPricePoints) external view returns (bytes) function getMarketParams() external view returns (MarketParams memory) Returns best bid/ask prices, L2 order book depth, and market configuration parameters. [​](https://docs.kuru.io/contracts/OrderBook#market-states) Market States ---------------------------------------------------------------------------- * `ACTIVE` — Full operations enabled * `SOFT_PAUSED` — Only cancels, deposits, withdrawals allowed * `HARD_PAUSED` — All operations halted [​](https://docs.kuru.io/contracts/OrderBook#order-types) Order Types ------------------------------------------------------------------------ | Type | Description | prev | next | | --- | --- | --- | --- | | A | Single order | NULL | NULL | | B | Head with next | NULL | NON-NULL | | C | Middle order | NON-NULL | NON-NULL | | D | Tail order | NON-NULL | NULL | [​](https://docs.kuru.io/contracts/OrderBook#events) Events -------------------------------------------------------------- ### [​](https://docs.kuru.io/contracts/OrderBook#ordercreated) OrderCreated Copy Ask AI event OrderCreated( uint40 indexed orderId, address indexed owner, uint96 size, uint32 price, bool isBuy ); Emitted when a new limit order is placed on the order book. ### [​](https://docs.kuru.io/contracts/OrderBook#flipordercreated) FlipOrderCreated Copy Ask AI event FlipOrderCreated( uint40 indexed orderId, uint40 indexed flippedId, address indexed owner, uint96 size, uint32 price, uint32 flippedPrice, bool isBuy ); Emitted when a flip order is created. `flippedId` is the order ID that will be created on the opposite side when this order fills. ### [​](https://docs.kuru.io/contracts/OrderBook#trade) Trade Copy Ask AI event Trade( uint40 orderId, address indexed maker, bool isBuy, uint32 price, uint96 updatedSize, address indexed taker, address indexed origin, uint96 filledSize ); Emitted for each order fill. `updatedSize` is the remaining size after fill. `origin` is the original transaction sender (supports meta-transactions). ### [​](https://docs.kuru.io/contracts/OrderBook#ordercanceled) OrderCanceled Copy Ask AI event OrderCanceled( uint40 indexed orderId, address indexed owner, uint96 size, uint32 price, bool isBuy ); Emitted when an order is successfully canceled. Returns the full order size before cancellation. ### [​](https://docs.kuru.io/contracts/OrderBook#marketstateupdated) MarketStateUpdated Copy Ask AI event MarketStateUpdated( MarketState prevState, MarketState newState ); Emitted when market state changes (ACTIVE, SOFT\_PAUSED, or HARD\_PAUSED). [Router Contract Documentation](https://docs.kuru.io/contracts/Router) [MarginAccount Contract](https://docs.kuru.io/contracts/MarginAccount) ⌘I --- # MarginAccount Contract - Kuru [Skip to main content](https://docs.kuru.io/contracts/MarginAccount#content-area) [Kuru home page![light logo](https://mintcdn.com/kuru/NV1IYuc7r8ueRMIx/logo/Kuru_Dark_Full.svg?fit=max&auto=format&n=NV1IYuc7r8ueRMIx&q=85&s=fd5b01d4e7bf016b95925e83ee0ef3ea)![dark logo](https://mintcdn.com/kuru/UXaoR-O-t9Kvyjzw/logo/Kuru_Light_Full.svg?fit=max&auto=format&n=UXaoR-O-t9Kvyjzw&q=85&s=e2c30f09efd357f187425fcaefd60ca6)](https://docs.kuru.io/) Search... ⌘KAsk AI Search... Navigation Smart Contracts MarginAccount Contract [Product](https://docs.kuru.io/) [Concepts](https://docs.kuru.io/concepts/why-monad) [For Developers](https://docs.kuru.io/sdk/quickstart-sdk) [Legal](https://docs.kuru.io/legal/tradingview) On this page * [State Variables](https://docs.kuru.io/contracts/MarginAccount#state-variables) * [Core Functions](https://docs.kuru.io/contracts/MarginAccount#core-functions) * [initialize](https://docs.kuru.io/contracts/MarginAccount#initialize) * [User Operations](https://docs.kuru.io/contracts/MarginAccount#user-operations) * [deposit](https://docs.kuru.io/contracts/MarginAccount#deposit) * [withdraw](https://docs.kuru.io/contracts/MarginAccount#withdraw) * [batchWithdrawMaxTokens](https://docs.kuru.io/contracts/MarginAccount#batchwithdrawmaxtokens) * [getBalance](https://docs.kuru.io/contracts/MarginAccount#getbalance) * [Market Operations](https://docs.kuru.io/contracts/MarginAccount#market-operations) * [debitUser](https://docs.kuru.io/contracts/MarginAccount#debituser) * [creditUser](https://docs.kuru.io/contracts/MarginAccount#credituser) * [creditUsersEncoded](https://docs.kuru.io/contracts/MarginAccount#creditusersencoded) * [creditFee](https://docs.kuru.io/contracts/MarginAccount#creditfee) * [Router Operations](https://docs.kuru.io/contracts/MarginAccount#router-operations) * [updateMarkets](https://docs.kuru.io/contracts/MarginAccount#updatemarkets) * [Administrative Functions](https://docs.kuru.io/contracts/MarginAccount#administrative-functions) * [toggleProtocolState](https://docs.kuru.io/contracts/MarginAccount#toggleprotocolstate) * [setFeeCollector](https://docs.kuru.io/contracts/MarginAccount#setfeecollector) * [Events](https://docs.kuru.io/contracts/MarginAccount#events) * [Deposit](https://docs.kuru.io/contracts/MarginAccount#deposit-2) * [Withdrawal](https://docs.kuru.io/contracts/MarginAccount#withdrawal) * [ProtocolStateUpdated](https://docs.kuru.io/contracts/MarginAccount#protocolstateupdated) * [FeeCollectorUpdated](https://docs.kuru.io/contracts/MarginAccount#feecollectorupdated) [​](https://docs.kuru.io/contracts/MarginAccount#state-variables) State Variables ------------------------------------------------------------------------------------ Copy Ask AI mapping(bytes32 => uint256) public balances; mapping(address => bool) public verifiedMarket; * `balances` - User token balances keyed by hash of (user, token) * `verifiedMarket` - Markets authorized to debit/credit user accounts [​](https://docs.kuru.io/contracts/MarginAccount#core-functions) Core Functions ---------------------------------------------------------------------------------- ### [​](https://docs.kuru.io/contracts/MarginAccount#initialize) initialize One-time initialization of the MarginAccount contract. Copy Ask AI function initialize( address _owner, address _router, address _feeCollector, address _trustedForwarder ) public initializer Sets contract owner, router, fee collector, and trusted forwarder addresses. Can only be called once. ### [​](https://docs.kuru.io/contracts/MarginAccount#user-operations) User Operations #### [​](https://docs.kuru.io/contracts/MarginAccount#deposit) deposit Deposit tokens into margin account. Copy Ask AI function deposit(address _user, address _token, uint256 _amount) external payable Deposits tokens for a specified user. If `_token` is native (address(0)), requires `msg.value`. For ERC20 tokens, transfers from caller to contract. #### [​](https://docs.kuru.io/contracts/MarginAccount#withdraw) withdraw Withdraw tokens from margin account. Copy Ask AI function withdraw(uint256 _amount, address _token) external Withdraws tokens from sender’s balance. Supports both ERC20 and native transfers. #### [​](https://docs.kuru.io/contracts/MarginAccount#batchwithdrawmaxtokens) batchWithdrawMaxTokens Withdraw all balances for multiple tokens. Copy Ask AI function batchWithdrawMaxTokens(address[] calldata _tokens) external Convenience function to withdraw entire balances for multiple tokens in one transaction. #### [​](https://docs.kuru.io/contracts/MarginAccount#getbalance) getBalance Query user balance for a token. Copy Ask AI function getBalance(address _user, address _token) external view returns (uint256) Returns the current balance for a user’s token account. ### [​](https://docs.kuru.io/contracts/MarginAccount#market-operations) Market Operations #### [​](https://docs.kuru.io/contracts/MarginAccount#debituser) debitUser Debit user balance for trades. Copy Ask AI function debitUser(address _user, address _token, uint256 _amount) external Called by verified markets to consume user balances. Reverts if insufficient balance. #### [​](https://docs.kuru.io/contracts/MarginAccount#credituser) creditUser Credit user balance for trades. Copy Ask AI function creditUser(address _user, address _token, uint256 _amount, bool _useMargin) external Called by verified markets to credit user balances. If `_useMargin` is false, transfers tokens directly to user. If true, updates balance mapping. #### [​](https://docs.kuru.io/contracts/MarginAccount#creditusersencoded) creditUsersEncoded Batch credit multiple users. Copy Ask AI function creditUsersEncoded(bytes calldata _encodedData) external Batch version of `creditUser` for gas efficiency. Encoded data contains array of (user, token, amount, useMargin) tuples. #### [​](https://docs.kuru.io/contracts/MarginAccount#creditfee) creditFee Credit protocol fees to fee collector. Copy Ask AI function creditFee(address _assetA, uint256 _feeA, address _assetB, uint256 _feeB) external Called by verified markets to credit collected fees. Updates fee collector’s balances for both assets. ### [​](https://docs.kuru.io/contracts/MarginAccount#router-operations) Router Operations #### [​](https://docs.kuru.io/contracts/MarginAccount#updatemarkets) updateMarkets Register a verified market. Copy Ask AI function updateMarkets(address _marketAddress) external Called by router to authorize a new market to debit/credit user accounts. ### [​](https://docs.kuru.io/contracts/MarginAccount#administrative-functions) Administrative Functions #### [​](https://docs.kuru.io/contracts/MarginAccount#toggleprotocolstate) toggleProtocolState Pause or resume protocol operations. Copy Ask AI function toggleProtocolState(bool _state) external onlyOwner Sets global pause state. When paused, all user and market operations are disabled except withdrawals. #### [​](https://docs.kuru.io/contracts/MarginAccount#setfeecollector) setFeeCollector Update fee collector address. Copy Ask AI function setFeeCollector(address _feeCollector) external onlyOwner Changes where protocol fees are credited. [​](https://docs.kuru.io/contracts/MarginAccount#events) Events ------------------------------------------------------------------ ### [​](https://docs.kuru.io/contracts/MarginAccount#deposit-2) Deposit Copy Ask AI event Deposit( address owner, address token, uint256 amount ); Emitted when tokens are deposited into the margin account. ### [​](https://docs.kuru.io/contracts/MarginAccount#withdrawal) Withdrawal Copy Ask AI event Withdrawal( address owner, address token, uint256 amount ); Emitted when tokens are withdrawn from the margin account. Emitted both for single and batch withdrawals. ### [​](https://docs.kuru.io/contracts/MarginAccount#protocolstateupdated) ProtocolStateUpdated Copy Ask AI event ProtocolStateUpdated( bool newState ); Emitted when protocol pause state changes. ### [​](https://docs.kuru.io/contracts/MarginAccount#feecollectorupdated) FeeCollectorUpdated Copy Ask AI event FeeCollectorUpdated( address newFeeCollector ); Emitted when fee collector address is updated. [OrderBook Contract](https://docs.kuru.io/contracts/OrderBook) [KuruAMMVault](https://docs.kuru.io/contracts/KuruAMMVault) ⌘I --- # Router Contract Documentation - Kuru [Skip to main content](https://docs.kuru.io/contracts/Router#content-area) [Kuru home page![light logo](https://mintcdn.com/kuru/NV1IYuc7r8ueRMIx/logo/Kuru_Dark_Full.svg?fit=max&auto=format&n=NV1IYuc7r8ueRMIx&q=85&s=fd5b01d4e7bf016b95925e83ee0ef3ea)![dark logo](https://mintcdn.com/kuru/UXaoR-O-t9Kvyjzw/logo/Kuru_Light_Full.svg?fit=max&auto=format&n=UXaoR-O-t9Kvyjzw&q=85&s=e2c30f09efd357f187425fcaefd60ca6)](https://docs.kuru.io/) Search... ⌘KAsk AI Search... Navigation Smart Contracts Router Contract Documentation [Product](https://docs.kuru.io/) [Concepts](https://docs.kuru.io/concepts/why-monad) [For Developers](https://docs.kuru.io/sdk/quickstart-sdk) [Legal](https://docs.kuru.io/legal/tradingview) On this page * [State Variables](https://docs.kuru.io/contracts/Router#state-variables) * [Public Variables](https://docs.kuru.io/contracts/Router#public-variables) * [Mappings](https://docs.kuru.io/contracts/Router#mappings) * [Core Functions](https://docs.kuru.io/contracts/Router#core-functions) * [initialize](https://docs.kuru.io/contracts/Router#initialize) * [deployProxy](https://docs.kuru.io/contracts/Router#deployproxy) * [computeAddress](https://docs.kuru.io/contracts/Router#computeaddress) * [computeVaultAddress](https://docs.kuru.io/contracts/Router#computevaultaddress) * [anyToAnySwap](https://docs.kuru.io/contracts/Router#anytoanyswap) * [Events](https://docs.kuru.io/contracts/Router#events) * [MarketRegistered](https://docs.kuru.io/contracts/Router#marketregistered) * [OBImplementationUpdated](https://docs.kuru.io/contracts/Router#obimplementationupdated) * [VaultImplementationUpdated](https://docs.kuru.io/contracts/Router#vaultimplementationupdated) * [KuruRouterSwap](https://docs.kuru.io/contracts/Router#kururouterswap) [​](https://docs.kuru.io/contracts/Router#state-variables) State Variables ----------------------------------------------------------------------------- ### [​](https://docs.kuru.io/contracts/Router#public-variables) Public Variables | Variable | Type | Description | | --- | --- | --- | | `orderBookImplementation` | address | Current OrderBook implementation address | | `kuruAmmVaultImplementation` | address | Current KuruAMMVault implementation address | | `marginAccountAddress` | address | MarginAccount contract address | | `TRUSTED_FORWARDER` | address | Address for meta-transaction forwarding | ### [​](https://docs.kuru.io/contracts/Router#mappings) Mappings Copy Ask AI mapping(address => MarketParams) public verifiedMarket; Stores market parameters for each deployed OrderBook. Used to validate markets during swaps. [​](https://docs.kuru.io/contracts/Router#core-functions) Core Functions --------------------------------------------------------------------------- ### [​](https://docs.kuru.io/contracts/Router#initialize) initialize One-time initialization of the Router contract. Copy Ask AI function initialize( address _owner, address _marginAccount, address _orderbookImplementation, address _kuruAmmVaultImplementation, address _trustedForwarder ) public initializer Sets the contract owner and core component addresses. Can only be called once. Required before deploying any markets. ### [​](https://docs.kuru.io/contracts/Router#deployproxy) deployProxy Deploys a new OrderBook market with an associated KuruAMMVault. Copy Ask AI function deployProxy( IOrderBook.OrderBookType _type, address _baseAssetAddress, address _quoteAssetAddress, uint96 _sizePrecision, uint32 _pricePrecision, uint32 _tickSize, uint96 _minSize, uint96 _maxSize, uint256 _takerFeeBps, uint256 _makerFeeBps, uint96 _kuruAmmSpread ) public returns (address proxy) **Market Types:** * `NO_NATIVE` - Both base and quote are ERC20 tokens * `NATIVE_IN_BASE` - Native token (Monad) as base asset * `NATIVE_IN_QUOTE` - Native token (Monad) as quote asset Deploys both OrderBook and KuruAMMVault using Create2 for deterministic addresses. Registers the market in `verifiedMarket` mapping. Returns the deployed OrderBook proxy address. ### [​](https://docs.kuru.io/contracts/Router#computeaddress) computeAddress Computes the deterministic address for an OrderBook proxy. Copy Ask AI function computeAddress( address _baseAssetAddress, address _quoteAssetAddress, uint96 _sizePrecision, uint32 _pricePrecision, uint32 _tickSize, uint96 _minSize, uint96 _maxSize, uint256 _takerFeeBps, uint256 _makerFeeBps, uint96 _kuruAmmSpread, address oldImplementation, bool old ) public view returns (address proxy) Pre-computes the deployment address before actual deployment. Supports implementation upgrades while preserving addresses. ### [​](https://docs.kuru.io/contracts/Router#computevaultaddress) computeVaultAddress Computes the deterministic address for a KuruAMMVault. Copy Ask AI function computeVaultAddress( address _marketAddress, address oldImplementation, bool old ) public view returns (address) Pre-computes the vault address for a given market address. Used for planning and verification. ### [​](https://docs.kuru.io/contracts/Router#anytoanyswap) anyToAnySwap Enables multi-hop swaps across different markets. Copy Ask AI function anyToAnySwap( address[] calldata _marketAddresses, bool[] calldata _isBuy, bool[] calldata _nativeSend, address _debitToken, address _creditToken, uint256 _amount, uint256 _minAmountOut ) external payable returns (uint256 _amountOut) Routes swaps through multiple markets. Validates each market via `verifiedMarket` mapping and enforces slippage protection via `_minAmountOut`. Supports native token transfers when `_nativeSend` is true. **Example:** Swap TOKEN\_A → Native → TOKEN\_B Copy Ask AI const markets = [tokenAMarket, nativeMarket]; const isBuy = [false, false]; // Sell TOKEN_A, sell Native const nativeSend = [false, true]; await router.anyToAnySwap( markets, isBuy, nativeSend, tokenA, tokenB, amount, minAmountOut, { value: nativeAmount } ); * * * [​](https://docs.kuru.io/contracts/Router#events) Events ----------------------------------------------------------- ### [​](https://docs.kuru.io/contracts/Router#marketregistered) MarketRegistered Copy Ask AI event MarketRegistered( address baseAsset, address quoteAsset, address market, address vaultAddress, uint32 pricePrecision, uint96 sizePrecision, uint32 tickSize, uint96 minSize, uint96 maxSize, uint256 takerFeeBps, uint256 makerFeeBps, uint96 kuruAmmSpread ); Emitted when a new market is successfully deployed via `deployProxy`. Contains all market parameters and addresses for the OrderBook and KuruAMMVault. ### [​](https://docs.kuru.io/contracts/Router#obimplementationupdated) OBImplementationUpdated Copy Ask AI event OBImplementationUpdated( address previousImplementation, address newImplementation ); Emitted when the OrderBook implementation address is updated. Future market deployments will use the new implementation. ### [​](https://docs.kuru.io/contracts/Router#vaultimplementationupdated) VaultImplementationUpdated Copy Ask AI event VaultImplementationUpdated( address previousImplementation, address newImplementation ); Emitted when the KuruAMMVault implementation address is updated. Future vault deployments will use the new implementation. ### [​](https://docs.kuru.io/contracts/Router#kururouterswap) KuruRouterSwap Copy Ask AI event KuruRouterSwap( address msgSender, address debitToken, address creditToken, uint256 amountIn, uint256 amountOut ); Emitted after a successful multi-hop swap via `anyToAnySwap`. Tracks the swap input/output for the entire routing path. [Architecture Overview](https://docs.kuru.io/contracts/Architecture-overview) [OrderBook Contract](https://docs.kuru.io/contracts/OrderBook) ⌘I --- # Launch - Kuru [Skip to main content](https://docs.kuru.io/product/launch#content-area) [Kuru home page![light logo](https://mintcdn.com/kuru/NV1IYuc7r8ueRMIx/logo/Kuru_Dark_Full.svg?fit=max&auto=format&n=NV1IYuc7r8ueRMIx&q=85&s=fd5b01d4e7bf016b95925e83ee0ef3ea)![dark logo](https://mintcdn.com/kuru/UXaoR-O-t9Kvyjzw/logo/Kuru_Light_Full.svg?fit=max&auto=format&n=UXaoR-O-t9Kvyjzw&q=85&s=e2c30f09efd357f187425fcaefd60ca6)](https://docs.kuru.io/) Search... ⌘KAsk AI Search... Navigation Product Launch [Product](https://docs.kuru.io/) [Concepts](https://docs.kuru.io/concepts/why-monad) [For Developers](https://docs.kuru.io/sdk/quickstart-sdk) [Legal](https://docs.kuru.io/legal/tradingview) On this page * [How It Works](https://docs.kuru.io/product/launch#how-it-works) ![Launch Pn](https://mintcdn.com/kuru/-IgaUSNoOEP1v72W/images/launch.png?w=2500&fit=max&auto=format&n=-IgaUSNoOEP1v72W&q=85&s=8135ff6a8f0b682c8ba5d645ec4e9b44 "Launch Pn") ### [​](https://docs.kuru.io/product/launch#how-it-works) How It Works 1. Enter the name (eg. Bitcoin) 2. Enter the ticker/symbol for the coin (eg. BTC) 3. Upload a picture 4. Enter how much MON worth of the token you’d like to buy. This prevents snipers from taking a huge part of your supply for low prices. If you want to launch a token with different parameters, you can still use the [Kuru SDK](https://www.npmjs.com/package/@kuru-labs/kuru-sdk) to launch. Feel free to look at an example [for meme tokens](https://github.com/Kuru-Labs/kuru-sdk/blob/main/examples/v2/memeDeployer.ts) and an example for a more [finely configured market](https://github.com/Kuru-Labs/kuru-sdk/blob/main/examples/v2/createMarket.ts) . [Portfolio](https://docs.kuru.io/product/portfolio) [Referrals](https://docs.kuru.io/product/referrals) ⌘I --- # Kuru Wallet - Kuru [Skip to main content](https://docs.kuru.io/product/wallet#content-area) [Kuru home page![light logo](https://mintcdn.com/kuru/NV1IYuc7r8ueRMIx/logo/Kuru_Dark_Full.svg?fit=max&auto=format&n=NV1IYuc7r8ueRMIx&q=85&s=fd5b01d4e7bf016b95925e83ee0ef3ea)![dark logo](https://mintcdn.com/kuru/UXaoR-O-t9Kvyjzw/logo/Kuru_Light_Full.svg?fit=max&auto=format&n=UXaoR-O-t9Kvyjzw&q=85&s=e2c30f09efd357f187425fcaefd60ca6)](https://docs.kuru.io/) Search... ⌘KAsk AI Search... Navigation Product Kuru Wallet [Product](https://docs.kuru.io/) [Concepts](https://docs.kuru.io/concepts/why-monad) [For Developers](https://docs.kuru.io/sdk/quickstart-sdk) [Legal](https://docs.kuru.io/legal/tradingview) On this page * [Login](https://docs.kuru.io/product/wallet#login) * [Add funds](https://docs.kuru.io/product/wallet#add-funds) * [Withdraw](https://docs.kuru.io/product/wallet#withdraw) Kuru’s embedded wallet is a secure, non-custodial way to store your funds, powered by [Privy](https://www.privy.io/) . The wallet allows users to execute trades instantly without managing multiple pop-ups or signing numerous transactions. [​](https://docs.kuru.io/product/wallet#login) Login ------------------------------------------------------- Users can login to Kuru with existing accounts like Google, X, Discord, Email and more. When users login to Kuru for the first time a new Kuru wallet is created. This is a **brand new wallet** and has to be funded with MON. Users can always use the same account to login to Kuru and access funds. Click on your wallet address on the top right corner, and hover on the address to see your login method. [​](https://docs.kuru.io/product/wallet#add-funds) Add funds --------------------------------------------------------------- Users need to transfer MON to their Kuru wallet to begin trading. Scan the QR code or copy the wallet address to transfer MON. Users can also bridge funds from other chains. ![Wallet Add Pn](https://mintcdn.com/kuru/GU1vAowEnZd1ya81/images/product/wallet_add.png?w=2500&fit=max&auto=format&n=GU1vAowEnZd1ya81&q=85&s=33ce57b2dae18562e317fb3964fb5533 "Wallet Add Pn") [​](https://docs.kuru.io/product/wallet#withdraw) Withdraw ------------------------------------------------------------- Users can withdraw MON or other asssets to any wallet of their choice on the Monad blockchain. It is recommended to leave some MON in the wallet to pay for gas fees on Monad. ![Wallet Withdraw Pn](https://mintcdn.com/kuru/GU1vAowEnZd1ya81/images/product/wallet_withdraw.png?w=2500&fit=max&auto=format&n=GU1vAowEnZd1ya81&q=85&s=0ca9f3f2ec888d2d2e776b59ce4d3504 "Wallet Withdraw Pn") [Overview](https://docs.kuru.io/) [Kuru Flow (Aggregator)](https://docs.kuru.io/product/flow) ⌘I --- # TypeScript SDK - Kuru [Skip to main content](https://docs.kuru.io/sdk/SDK-landing#content-area) [Kuru home page![light logo](https://mintcdn.com/kuru/NV1IYuc7r8ueRMIx/logo/Kuru_Dark_Full.svg?fit=max&auto=format&n=NV1IYuc7r8ueRMIx&q=85&s=fd5b01d4e7bf016b95925e83ee0ef3ea)![dark logo](https://mintcdn.com/kuru/UXaoR-O-t9Kvyjzw/logo/Kuru_Light_Full.svg?fit=max&auto=format&n=UXaoR-O-t9Kvyjzw&q=85&s=e2c30f09efd357f187425fcaefd60ca6)](https://docs.kuru.io/) Search... ⌘KAsk AI Search... Navigation SDK TypeScript SDK [Product](https://docs.kuru.io/) [Concepts](https://docs.kuru.io/concepts/why-monad) [For Developers](https://docs.kuru.io/sdk/quickstart-sdk) [Legal](https://docs.kuru.io/legal/tradingview) The `@kuru-labs/kuru-sdk` provides various functionalities for interacting with the Kuru protocol. * [Quick start](https://docs.kuru.io/sdk/quickstart-sdk) * [Order book](https://docs.kuru.io/sdk/orderbook-sdk) * [Deploy market](https://docs.kuru.io/sdk/deploy-market) [Quick Start](https://docs.kuru.io/sdk/quickstart-sdk) [Order Book SDK](https://docs.kuru.io/sdk/orderbook-sdk) ⌘I --- # KuruAMMVault - Kuru [Skip to main content](https://docs.kuru.io/contracts/KuruAMMVault#content-area) [Kuru home page![light logo](https://mintcdn.com/kuru/NV1IYuc7r8ueRMIx/logo/Kuru_Dark_Full.svg?fit=max&auto=format&n=NV1IYuc7r8ueRMIx&q=85&s=fd5b01d4e7bf016b95925e83ee0ef3ea)![dark logo](https://mintcdn.com/kuru/UXaoR-O-t9Kvyjzw/logo/Kuru_Light_Full.svg?fit=max&auto=format&n=UXaoR-O-t9Kvyjzw&q=85&s=e2c30f09efd357f187425fcaefd60ca6)](https://docs.kuru.io/) Search... ⌘KAsk AI Search... Navigation [Product](https://docs.kuru.io/) [Concepts](https://docs.kuru.io/concepts/why-monad) [For Developers](https://docs.kuru.io/sdk/quickstart-sdk) [Legal](https://docs.kuru.io/legal/tradingview) On this page * [KuruAMMVault Contract](https://docs.kuru.io/contracts/KuruAMMVault#kuruammvault-contract) * [State Variables](https://docs.kuru.io/contracts/KuruAMMVault#state-variables) * [Core Functions](https://docs.kuru.io/contracts/KuruAMMVault#core-functions) * [initialize](https://docs.kuru.io/contracts/KuruAMMVault#initialize) * [setMarketParams](https://docs.kuru.io/contracts/KuruAMMVault#setmarketparams) * [Liquidity Operations](https://docs.kuru.io/contracts/KuruAMMVault#liquidity-operations) * [deposit](https://docs.kuru.io/contracts/KuruAMMVault#deposit) * [mint](https://docs.kuru.io/contracts/KuruAMMVault#mint) * [withdraw](https://docs.kuru.io/contracts/KuruAMMVault#withdraw) * [Preview Functions](https://docs.kuru.io/contracts/KuruAMMVault#preview-functions) * [previewDeposit](https://docs.kuru.io/contracts/KuruAMMVault#previewdeposit) * [previewMint](https://docs.kuru.io/contracts/KuruAMMVault#previewmint) * [previewWithdraw](https://docs.kuru.io/contracts/KuruAMMVault#previewwithdraw) * [totalAssets](https://docs.kuru.io/contracts/KuruAMMVault#totalassets) * [Ownership Functions](https://docs.kuru.io/contracts/KuruAMMVault#ownership-functions) * [transferOwnership](https://docs.kuru.io/contracts/KuruAMMVault#transferownership) * [Events](https://docs.kuru.io/contracts/KuruAMMVault#events) * [KuruVaultDeposit](https://docs.kuru.io/contracts/KuruAMMVault#kuruvaultdeposit) * [KuruVaultWithdraw](https://docs.kuru.io/contracts/KuruAMMVault#kuruvaultwithdraw) * [Key Mechanics](https://docs.kuru.io/contracts/KuruAMMVault#key-mechanics) * [Virtual Rebalancing](https://docs.kuru.io/contracts/KuruAMMVault#virtual-rebalancing) * [Share Calculation](https://docs.kuru.io/contracts/KuruAMMVault#share-calculation) * [Vault Rebalancing](https://docs.kuru.io/contracts/KuruAMMVault#vault-rebalancing) * [Price Updates](https://docs.kuru.io/contracts/KuruAMMVault#price-updates) * [Partial Fills](https://docs.kuru.io/contracts/KuruAMMVault#partial-fills) [​](https://docs.kuru.io/contracts/KuruAMMVault#kuruammvault-contract) KuruAMMVault Contract =============================================================================================== ERC20 vault for AMM liquidity provision. Users deposit tokens to receive LP shares and earn trading fees. Copy Ask AI contract KuruAMMVault is IKuruAMMVault, ERC20, Initializable, UUPSUpgradeable, ReentrancyGuardTransient [​](https://docs.kuru.io/contracts/KuruAMMVault#state-variables) State Variables ----------------------------------------------------------------------------------- Copy Ask AI address public token1; address public token2; IMarginAccount public marginAccount; IOrderBook public market; MarketParams public marketParams; uint96 public SPREAD_CONSTANT; * `token1` & `token2` - The two tokens in the liquidity pair (one may be native) * `market` - Associated OrderBook that uses this vault for AMM liquidity * `SPREAD_CONSTANT` - Spread between bid/ask prices (e.g., 100 = 1% spread) [​](https://docs.kuru.io/contracts/KuruAMMVault#core-functions) Core Functions --------------------------------------------------------------------------------- ### [​](https://docs.kuru.io/contracts/KuruAMMVault#initialize) initialize One-time initialization of the KuruAMMVault contract. Copy Ask AI function initialize( address _owner, address token1_, address token2_, address _marginAccount, address _market, uint96 _spreadConstant ) public initializer Sets up the vault with token pair, market reference, and spread constant. Approves margin account for unlimited transfers. Can only be called once. ### [​](https://docs.kuru.io/contracts/KuruAMMVault#setmarketparams) setMarketParams Fetch and cache market parameters from OrderBook. Copy Ask AI function setMarketParams() public Updates internal `marketParams` struct with current market configuration from the associated OrderBook. ### [​](https://docs.kuru.io/contracts/KuruAMMVault#liquidity-operations) Liquidity Operations #### [​](https://docs.kuru.io/contracts/KuruAMMVault#deposit) deposit Deposit tokens and receive LP shares. Copy Ask AI function deposit( uint256 baseDeposit, uint256 quoteDeposit, uint256 minQuoteConsumed, address receiver ) external payable returns (uint256) Deposits base and quote assets. Mints LP shares based on current reserves and price. For first deposit, mints minimum liquidity (10^3 shares) to margin account. Returns shares minted. Updates vault order sizes in the OrderBook. #### [​](https://docs.kuru.io/contracts/KuruAMMVault#mint) mint Mint specific amount of LP shares. Copy Ask AI function mint(uint256 shares, address receiver) external payable returns (uint256, uint256) Calculates required base/quote deposits via `previewMint`, then calls `deposit`. #### [​](https://docs.kuru.io/contracts/KuruAMMVault#withdraw) withdraw Burn LP shares to withdraw tokens. Copy Ask AI function withdraw( uint256 _shares, address _receiver, address _owner ) public returns (uint256, uint256) Burns shares and returns proportional base and quote tokens. Supports approval-based withdrawals. Updates vault order sizes in the OrderBook. ### [​](https://docs.kuru.io/contracts/KuruAMMVault#preview-functions) Preview Functions #### [​](https://docs.kuru.io/contracts/KuruAMMVault#previewdeposit) previewDeposit Calculate shares for a given deposit. Copy Ask AI function previewDeposit(uint256 asset1, uint256 asset2) public view returns (uint256) Returns how many LP shares would be minted for the deposit amounts. #### [​](https://docs.kuru.io/contracts/KuruAMMVault#previewmint) previewMint Calculate required deposits to mint shares. Copy Ask AI function previewMint(uint256 shares) public view returns (uint256, uint256) Returns required base and quote amounts to mint the specified shares. #### [​](https://docs.kuru.io/contracts/KuruAMMVault#previewwithdraw) previewWithdraw Calculate token amounts from burning shares. Copy Ask AI function previewWithdraw(uint256 shares) public view returns (uint256, uint256) Returns base and quote amounts that would be received for the shares. #### [​](https://docs.kuru.io/contracts/KuruAMMVault#totalassets) totalAssets Get vault’s total token balances. Copy Ask AI function totalAssets() public view returns (uint256, uint256) Returns vault’s current balance of token1 and token2 from margin account. ### [​](https://docs.kuru.io/contracts/KuruAMMVault#ownership-functions) Ownership Functions #### [​](https://docs.kuru.io/contracts/KuruAMMVault#transferownership) transferOwnership Transfer vault ownership. Copy Ask AI function transferOwnership(address _newOwner) external Changes the owner address. Owner can authorize contract upgrades. [​](https://docs.kuru.io/contracts/KuruAMMVault#events) Events ----------------------------------------------------------------- ### [​](https://docs.kuru.io/contracts/KuruAMMVault#kuruvaultdeposit) KuruVaultDeposit Copy Ask AI event KuruVaultDeposit( uint256 amount1, uint256 amount2, uint256 shares, address userAddress ); Emitted when liquidity is deposited. `amount1` and `amount2` are the deposited tokens, `shares` is the LP tokens minted. ### [​](https://docs.kuru.io/contracts/KuruAMMVault#kuruvaultwithdraw) KuruVaultWithdraw Copy Ask AI event KuruVaultWithdraw( uint256 amount1, uint256 amount2, uint256 shares, address userAddress ); Emitted when liquidity is withdrawn. `amount1` and `amount2` are the withdrawn tokens, `shares` is the LP tokens burned. [​](https://docs.kuru.io/contracts/KuruAMMVault#key-mechanics) Key Mechanics ------------------------------------------------------------------------------- ### [​](https://docs.kuru.io/contracts/KuruAMMVault#virtual-rebalancing) Virtual Rebalancing Unlike traditional AMMs that rebalance continuously, the Kuru vault accrues profits in base and quote tokens without rebalancing on-chain. This creates reserve skew where actual reserves may differ from the curve’s implied reserves. **Problem:** Standard Uniswap V2 share calculation would penalize depositors when reserves are skewed: Copy Ask AI shares = min(amount0 * totalSupply / reserve0, amount1 * totalSupply / reserve1) **Solution:** Virtual rebalancing assumes vault ask price is the fair price and calculates shares as if reserves were rebalanced at that price. Given: * Actual reserves: `x' = x + profitInBase`, `y' = y + profitInQuote` * Current vault price: `p` * Total value: `value = x'*p + y'` Virtually rebalanced reserves: * `x_rebalanced = (x'*p + y') / 2p` * `y_rebalanced = (x'*p + y') / 2` Shares are calculated using these virtual reserves, preventing depositor disadvantage while maintaining fairness. **Note:** Withdrawal ratios may differ from deposit ratios due to skew. This creates arbitrage opportunities that help reduce skew over time. ### [​](https://docs.kuru.io/contracts/KuruAMMVault#share-calculation) Share Calculation * First deposit: Shares = `sqrt(baseDeposit * quoteDeposit) - MIN_LIQUIDITY` * Subsequent deposits: Proportional to virtually rebalanced reserves * Uses fixed-point math to handle decimal precision ### [​](https://docs.kuru.io/contracts/KuruAMMVault#vault-rebalancing) Vault Rebalancing Vault maintains bid/ask spread around current price: * Ask size: `(SPREAD_CONSTANT * baseAmount) / (20000 + SPREAD_CONSTANT)` * Bid size: `(SPREAD_CONSTANT * baseAmount) / 20000` ### [​](https://docs.kuru.io/contracts/KuruAMMVault#price-updates) Price Updates * On deposit: Recalculates ask price and updates OrderBook * On withdraw: Updates sizes only (prices set on first deposit) * Vault prices: `vaultBestAsk` and `vaultBestBid` stored in OrderBook ### [​](https://docs.kuru.io/contracts/KuruAMMVault#partial-fills) Partial Fills When withdrawing with pending partial fills: * Adjusts owed amounts based on vault’s profit/loss from fills * Returns `_nullifyPartialFills` flag to clear OrderBook state [MarginAccount Contract](https://docs.kuru.io/contracts/MarginAccount) [Contract Addresses](https://docs.kuru.io/contracts/Contract-addresses) ⌘I --- # Liquidity - Kuru [Skip to main content](https://docs.kuru.io/product/liquidity#content-area) [Kuru home page![light logo](https://mintcdn.com/kuru/NV1IYuc7r8ueRMIx/logo/Kuru_Dark_Full.svg?fit=max&auto=format&n=NV1IYuc7r8ueRMIx&q=85&s=fd5b01d4e7bf016b95925e83ee0ef3ea)![dark logo](https://mintcdn.com/kuru/UXaoR-O-t9Kvyjzw/logo/Kuru_Light_Full.svg?fit=max&auto=format&n=UXaoR-O-t9Kvyjzw&q=85&s=e2c30f09efd357f187425fcaefd60ca6)](https://docs.kuru.io/) Search... ⌘KAsk AI Search... Navigation Product Liquidity [Product](https://docs.kuru.io/) [Concepts](https://docs.kuru.io/concepts/why-monad) [For Developers](https://docs.kuru.io/sdk/quickstart-sdk) [Legal](https://docs.kuru.io/legal/tradingview) On this page * [How to deposit liquidity](https://docs.kuru.io/product/liquidity#how-to-deposit-liquidity) Deposit liquidity to any market, powered by [vaults](https://docs.kuru.io/product/what-is-a-vault) and [flip orders](https://docs.kuru.io/product/flip-orders) . [​](https://docs.kuru.io/product/liquidity#how-to-deposit-liquidity) **How to deposit liquidity** ---------------------------------------------------------------------------------------------------- 1. Go to [kuru.io/liquidity](https://www.kuru.io/liquidity) to access the list of markets. Users can also access the page from a market page by clicking on ‘Liquidity.’ 2. Select the market you want to deposit liquidity to. 3. Choose a strategy. ![Vault Strategy Gi](https://mintcdn.com/kuru/-IgaUSNoOEP1v72W/images/vault_strategy.gif?s=c51e596dd93c5803c9abde3f93222ae6 "Vault Strategy Gi") 4. Pick a fee tier. ![Vault Fee Pn](https://mintcdn.com/kuru/-IgaUSNoOEP1v72W/images/vault_fee.png?w=2500&fit=max&auto=format&n=-IgaUSNoOEP1v72W&q=85&s=8d434955fbca95c2c3dfeafb47006792 "Vault Fee Pn") 5. Choose the amount of liquidity you want to deposit. ![Vault Amount Pn](https://mintcdn.com/kuru/-IgaUSNoOEP1v72W/images/vault_amount.png?w=2500&fit=max&auto=format&n=-IgaUSNoOEP1v72W&q=85&s=9e4de99f3e556c5b4d6f4e324770b6d9 "Vault Amount Pn") 6. Select price range on the chart ![Vault Chart Gi](https://mintcdn.com/kuru/-IgaUSNoOEP1v72W/images/vault_chart.gif?s=ade2a129da14adb480260d92b281ba35 "Vault Chart Gi") Users can access their liquidity positions from the specific market page or from their Portfolio under the liquidity section. [Trade](https://docs.kuru.io/product/trade) [Vaults](https://docs.kuru.io/product/vaults) ⌘I --- # Swap - Kuru [Skip to main content](https://docs.kuru.io/product/swap#content-area) [Kuru home page![light logo](https://mintcdn.com/kuru/NV1IYuc7r8ueRMIx/logo/Kuru_Dark_Full.svg?fit=max&auto=format&n=NV1IYuc7r8ueRMIx&q=85&s=fd5b01d4e7bf016b95925e83ee0ef3ea)![dark logo](https://mintcdn.com/kuru/UXaoR-O-t9Kvyjzw/logo/Kuru_Light_Full.svg?fit=max&auto=format&n=UXaoR-O-t9Kvyjzw&q=85&s=e2c30f09efd357f187425fcaefd60ca6)](https://docs.kuru.io/) Search... ⌘KAsk AI Search... Navigation Product Swap [Product](https://docs.kuru.io/) [Concepts](https://docs.kuru.io/concepts/why-monad) [For Developers](https://docs.kuru.io/sdk/quickstart-sdk) [Legal](https://docs.kuru.io/legal/tradingview) On this page * [What is Slippage?](https://docs.kuru.io/product/swap#what-is-slippage) * [What is a Priority Fee?](https://docs.kuru.io/product/swap#what-is-a-priority-fee) This is a simple swap interface, that allows users to easily swap tokens on Monad. [Kuru Flow](https://docs.kuru.io/product/kuru-flow) , our native aggregator, indexes every liquidity source on Monad in real time to provide users with the best route for pricing and slippage for every asset live on Monad. ![Swap Full Pn](https://mintcdn.com/kuru/GU1vAowEnZd1ya81/images/product/swap_full.png?w=2500&fit=max&auto=format&n=GU1vAowEnZd1ya81&q=85&s=31edaf9840d437dfa5b0a71fff246fca) [​](https://docs.kuru.io/product/swap#what-is-slippage) What is Slippage? ---------------------------------------------------------------------------- Slippage refers to the difference between the expected price of a trade and the actual price at which it executes, often due to market volatility. It happens because prices can change from other transactions while the user transaction is being processed. High slippage can lead to receiving fewer tokens than anticipated. ![Swap Settings Pn](https://mintcdn.com/kuru/GU1vAowEnZd1ya81/images/product/swap_settings.png?w=2500&fit=max&auto=format&n=GU1vAowEnZd1ya81&q=85&s=c2909053133e5b2eba6ba87434ee00d1 "Swap Settings Pn") [​](https://docs.kuru.io/product/swap#what-is-a-priority-fee) What is a Priority Fee? ---------------------------------------------------------------------------------------- The priority fee lets speeds up trade execution by adding a small extra fee. This extra fee incentivizes validators to process an order faster, so it can get ahead in the queue and reduce wait time. [Kuru Flow (Aggregator)](https://docs.kuru.io/product/flow) [Discover](https://docs.kuru.io/product/discover) ⌘I --- # Quick Start - Kuru [Skip to main content](https://docs.kuru.io/sdk/quickstart-sdk#content-area) [Kuru home page![light logo](https://mintcdn.com/kuru/NV1IYuc7r8ueRMIx/logo/Kuru_Dark_Full.svg?fit=max&auto=format&n=NV1IYuc7r8ueRMIx&q=85&s=fd5b01d4e7bf016b95925e83ee0ef3ea)![dark logo](https://mintcdn.com/kuru/UXaoR-O-t9Kvyjzw/logo/Kuru_Light_Full.svg?fit=max&auto=format&n=UXaoR-O-t9Kvyjzw&q=85&s=e2c30f09efd357f187425fcaefd60ca6)](https://docs.kuru.io/) Search... ⌘KAsk AI Search... Navigation SDK Quick Start [Product](https://docs.kuru.io/) [Concepts](https://docs.kuru.io/concepts/why-monad) [For Developers](https://docs.kuru.io/sdk/quickstart-sdk) [Legal](https://docs.kuru.io/legal/tradingview) On this page * [Installation](https://docs.kuru.io/sdk/quickstart-sdk#installation) * [Configure environment](https://docs.kuru.io/sdk/quickstart-sdk#configure-environment) * [Update config.json](https://docs.kuru.io/sdk/quickstart-sdk#update-config-json) * [Deposit into margin account](https://docs.kuru.io/sdk/quickstart-sdk#deposit-into-margin-account) * [Place a limit buy](https://docs.kuru.io/sdk/quickstart-sdk#place-a-limit-buy) * [Next steps](https://docs.kuru.io/sdk/quickstart-sdk#next-steps) [​](https://docs.kuru.io/sdk/quickstart-sdk#installation) Installation ------------------------------------------------------------------------- First, we install `kuru-sdk` Copy Ask AI npm i @kuru-labs/kuru-sdk ### [​](https://docs.kuru.io/sdk/quickstart-sdk#configure-environment) **Configure environment** Export your `PRIVATE_KEY` to use the examples Copy Ask AI export PRIVATE_KEY= **Never expose your private keys** in your code, especially if the code is stored in version control systems accessible by others or if it’s deployed to shared or public servers. ### [​](https://docs.kuru.io/sdk/quickstart-sdk#update-config-json) Update `config.json` config.json Copy Ask AI { "rpcUrl": "monad_rpc_url", "marginAccountAddress": "0xdDDaBd30785bA8b45e434a1f134BDf304d6125d9", // testnet "routerAddress": "0x1f5A250c4A506DA4cE584173c6ed1890B1bf7187", // testnet } ### [​](https://docs.kuru.io/sdk/quickstart-sdk#deposit-into-margin-account) **Deposit into margin account** Copy Ask AI // Example: deposit tokens into a margin account via Kuru SDK // Fill placeholders (rpcUrl, marginAccountAddress, tokenAddress, amount, decimals) // and export PRIVATE_KEY before running. import { ethers } from "ethers"; import * as KuruSdk from "@kuru-labs/kuru-sdk"; import * as KuruConfig from "../config.json"; const {rpcUrl, marginAccountAddress} = KuruConfig; const tokenAddress = ""; // TODO: ERC-20 token to deposit (use 0x000...000 for native if supported) const amount = ""; // TODO: human amount as string (e.g., "1000") const decimals = 18; // TODO: token decimals (e.g., 18 for ABC, 6 for USDC) async function main() { const provider = new ethers.providers.JsonRpcProvider(rpcUrl); const privateKey = process.env.PRIVATE_KEY; // must be set in env if (!privateKey) throw new Error("PRIVATE_KEY environment variable not set"); const signer = new ethers.Wallet(privateKey, provider); try { // Deposits on behalf of the signer address. Set a different receiver if desired const receipt = await KuruSdk.MarginDeposit.deposit( signer, marginAccountAddress, await signer.getAddress(), tokenAddress, amount, decimals, true // set to true to auto-approve ERC-20 if not already approved ); console.log("Transaction hash:", receipt.transactionHash); } catch (error) { console.error("Error depositing:", error); } } main() .then(() => process.exit(0)) .catch((error) => { console.error(error); process.exit(1); }); ### [​](https://docs.kuru.io/sdk/quickstart-sdk#place-a-limit-buy) **Place a limit buy** Placing a limit order. This consumes funds in your margin account. import parseEvents for tracking orders created. parseEvents Copy Ask AI import { ethers, BigNumber } from 'ethers'; interface TradeInfo { orderId: BigNumber; filledSize: BigNumber; price: BigNumber; isBuy: boolean; } export async function parseEvents(receipt: ethers.ContractReceipt): Promise<{ newOrderIds: BigNumber[]; trades: TradeInfo[]; }> { const newOrderIds: BigNumber[] = []; const trades: TradeInfo[] = []; receipt.logs.forEach((log) => { if (log.topics[0] === ethers.utils.id("OrderCreated(uint40,address,uint96,uint32,bool)")) { try { const decodedLog = ethers.utils.defaultAbiCoder.decode( ['uint40', 'address', 'uint96', 'uint32', 'bool'], log.data ); const orderId = BigNumber.from(decodedLog[0]); newOrderIds.push(orderId); } catch (error) { console.error("Error decoding OrderCreated event:", error); } } else if (log.topics[0] === ethers.utils.id("Trade(uint40,address,bool,uint256,uint96,address,address,uint96)")) { try { const decodedLog = ethers.utils.defaultAbiCoder.decode( ['uint40', 'address', 'bool', 'uint256', 'uint96', 'address', 'address', 'uint96'], log.data ); trades.push({ orderId: BigNumber.from(decodedLog[0]), price: BigNumber.from(decodedLog[3]), filledSize: BigNumber.from(decodedLog[7]), isBuy: decodedLog[2] }); } catch (error) { console.error("Error decoding trade event:", error); } } }); return { newOrderIds, trades }; } Copy Ask AI // Example: place a limit buy order using the Kuru SDK // Fill the placeholders (rpcUrl, marketAddress) and export PRIVATE_KEY before running. import { ethers } from "ethers"; import * as KuruSdk from "@kuru-labs/kuru-sdk"; import { parseEvents } from "./"; import * as KuruConfig from "../config.json"; const {rpcUrl, marginAccountAddress} = KuruConfig; // Order parameters (strings OK; SDK handles parsing/decimals): // price → quoted in quote per base (e.g., USDC per ABC); must respect tick size // size → amount of base to buy; must be ≥ min size const price = ""; // TODO: e.g., "5" for 5 USDC per ABC const size = ""; // TODO: e.g., "10" for 10 ABC async function main() { const provider = new ethers.providers.JsonRpcProvider(rpcUrl); // PRIVATE_KEY should be exported in your shell before running const privateKey = process.env.PRIVATE_KEY; // must be set in env if (!privateKey) throw new Error("PRIVATE_KEY environment variable not set"); const signer = new ethers.Wallet(privateKey, provider); // Fetch market parameters (precisions, tick size, fees) const marketParams = await KuruSdk.ParamFetcher.getMarketParams( provider, marketAddress ); try { // Place a Good-Till-Cancel limit buy const receipt = await KuruSdk.GTC.placeLimit( signer, marketAddress, marketParams, { price, size, isBuy: true, postOnly: true } ); console.log("Transaction hash:", receipt.transactionHash); // Extract created order ids from events const { newOrderIds } = await parseEvents(receipt) console.log("OrderIds:", newOrderIds) } catch (error) { console.error("Error placing limit buy order:", error); } } main() .then(() => process.exit(0)) .catch((error) => { console.error(error); process.exit(1); }); ### [​](https://docs.kuru.io/sdk/quickstart-sdk#next-steps) **Next steps** Now that you have a basic set up in place, read all the functionality of the SDK: [Order book](https://docs.kuru.io/sdk/orderbook-sdk) [Router](https://docs.kuru.io/sdk/router) [TypeScript SDK](https://docs.kuru.io/sdk/SDK-landing) ⌘I --- # Deploy a market - Kuru [Skip to main content](https://docs.kuru.io/sdk/deploy-market#content-area) [Kuru home page![light logo](https://mintcdn.com/kuru/NV1IYuc7r8ueRMIx/logo/Kuru_Dark_Full.svg?fit=max&auto=format&n=NV1IYuc7r8ueRMIx&q=85&s=fd5b01d4e7bf016b95925e83ee0ef3ea)![dark logo](https://mintcdn.com/kuru/UXaoR-O-t9Kvyjzw/logo/Kuru_Light_Full.svg?fit=max&auto=format&n=UXaoR-O-t9Kvyjzw&q=85&s=e2c30f09efd357f187425fcaefd60ca6)](https://docs.kuru.io/) Search... ⌘KAsk AI Search... Navigation SDK Deploy a market [Product](https://docs.kuru.io/) [Concepts](https://docs.kuru.io/concepts/why-monad) [For Developers](https://docs.kuru.io/sdk/quickstart-sdk) [Legal](https://docs.kuru.io/legal/tradingview) On this page * [Deploy a market with the Kuru Deployer](https://docs.kuru.io/sdk/deploy-market#deploy-a-market-with-the-kuru-deployer) * [Deploy a market with the Kuru Router](https://docs.kuru.io/sdk/deploy-market#deploy-a-market-with-the-kuru-router) * [Double-check the output from Calculate Precision before you deploy](https://docs.kuru.io/sdk/deploy-market#double-check-the-output-from-calculate-precision-before-you-deploy) * [Bootstrapping with liquidity after deploying using Kuru-Router](https://docs.kuru.io/sdk/deploy-market#bootstrapping-with-liquidity-after-deploying-using-kuru-router) * [Adding Liquidity to Existing Vaults](https://docs.kuru.io/sdk/deploy-market#adding-liquidity-to-existing-vaults) You can use the Kuru SDK to deploy a market. We have two methods of doing this: 1. Use the Kuru Deployer to deploy a new token alongwith a market for it in one transaction. 2. Use the Kuru Router directly to deploy a market with your chosen parameters for an existing token. [​](https://docs.kuru.io/sdk/deploy-market#deploy-a-market-with-the-kuru-deployer) **Deploy a market with the Kuru Deployer** -------------------------------------------------------------------------------------------------------------------------------- We have deployed a deployer contract which launches a token for you, creates a market for it and bootstraps the market with liquidity. All markets made through the deployer are paired with MON. You can use the `KuruSDK.MonadDeployer` class to deploy a market with the Kuru Deployer. You can find the Kuru Deployer address [here](https://docs.kuru.io/developers/contracts) Here’s how you can do it: deployMarket.ts Copy Ask AI import { ethers } from "ethers"; import { MonadDeployer } from "@kuru-labs/kuru-sdk"; //The deployer doesn’t derive the initial price; it only seeds the vault with the amounts you supply. //If you want the pool to open around 5 quote per base, choose _supplyToVault (the base tokens sent to the vault) and nativeTokenAmount so that _supplyToVault ÷ nativeTokenAmount ≈ 5, after accounting for token decimals. // Example script to deploy a token and its market using MonadDeployer // Docs template: fill placeholders before running. const IMAGE_URL = ""; // e.g., https://your-cdn/path/logo.svg const rpcUrl = ""; // e.g., http://localhost:8545 const monadDeployerAddress = ""; // e.g., 0x6A803B8F038554AF34AC73F1C099bd340dcC7026 async function main() { const provider = new ethers.providers.JsonRpcProvider(rpcUrl); // set in config.json const privateKey = process.env.PRIVATE_KEY; // export PRIVATE_KEY in your environment if (!privateKey) throw new Error("PRIVATE_KEY environment variable not set"); const signer = new ethers.Wallet(privateKey, provider); const monadDeployer = new MonadDeployer(); // Token configuration (docs placeholders) const tokenParams = { name: "", // token name (e.g., "Clobby Token") symbol: "", // token symbol (e.g., "CLOB") tokenURI: IMAGE_URL, // token metadata/logo URL initialSupply: ethers.utils.parseUnits("", 18), // total supply (string), 18 decimals (e.g., "1000000") dev: await signer.getAddress(), // developer/owner address supplyToDev: ethers.BigNumber.from(""), // bps to dev (0-10000), e.g., "1000" for 10% }; // Market configuration (docs placeholders) const marketParams = { nativeTokenAmount: ethers.utils.parseEther(""), // initial native liquidity (e.g., "10") sizePrecision: ethers.BigNumber.from(""), // e.g., "10000000000" (1e10) pricePrecision: ethers.BigNumber.from(""), // e.g., "1000000000" (1e9) tickSize: ethers.BigNumber.from(""), // min price tick (in pricePrecision units), e.g., "100" minSize: ethers.BigNumber.from(""), // e.g., "100000000" (0.01 * 1e10) maxSize: ethers.BigNumber.from(""), // e.g., "10000000000000000" (1e6 * 1e10) takerFeeBps: 0, // taker fee in bps (e.g., 30) makerFeeBps: 0, // maker fee in bps (e.g., 10) }; try { const result = await monadDeployer.deployTokenAndMarket( signer, monadDeployerAddress, tokenParams, marketParams ); console.log("Deployment successful!"); console.log("Token deployed at:", result.tokenAddress); console.log("Market deployed at:", result.marketAddress); } catch (error) { console.error("Error deploying token and market:", error); } } main() .then(() => process.exit(0)) .catch((error) => { console.error(error); process.exit(1); }); We recommend using the `calculatePrecisions` function to get the suggested parameters for the market. Using inappropriate parameters for the market can lead to users not being able to place limit orders. [​](https://docs.kuru.io/sdk/deploy-market#deploy-a-market-with-the-kuru-router) **Deploy a market with the Kuru Router** ---------------------------------------------------------------------------------------------------------------------------- You can use the `KuruSDK.ParamCreator` class to calculate suggested parameters for a market and for deploying a market with the Kuru Router. Use the `calculatePrecisions` function to get suggested parameters for a market. ### [​](https://docs.kuru.io/sdk/deploy-market#double-check-the-output-from-calculate-precision-before-you-deploy) **Double-check the output from Calculate Precision before you deploy** calculatePrecisions.ts Copy Ask AI import {ParamCreator} from "@kuru-labs/kuru-sdk"; // Example: 1 ABC = 10 USDC (make math simple) // Implied price = QUOTE_TOKENS / BASE_TOKENS = 10 const QUOTE_TOKENS = 10; // USDC amount const BASE_TOKENS = 1; // ABC amount const MAX_PRICE = 10000; // Max price which should be supported by the market (avoid too high prices) const MIN_SIZE = 1; //Min size of a limit order, in terms of base asset const TICK_IN_BPS = 100; //Min price difference between ticks in BPS (async() => { const paramCreator = new ParamCreator(); const params = await paramCreator.calculatePrecisions(QUOTE_TOKENS,BASE_TOKENS,MAX_PRICE,MIN_SIZE,TICK_IN_BPS); console.log(params.pricePrecision.toString()); console.log(params.sizePrecision.toString()); console.log(params.tickSize.toString()); console.log(params.minSize.toString()); console.log(params.maxSize.toString()); })(); See all 17 lines Here, `TICK_IN_BPS` is the tick size in basis points. We recommend a bigger tick for memecoins and a smaller tick for tokens which are more likely to move in a short range. Use the `deployMarket` function to deploy a market with the Kuru Router. deployMarket.ts Copy Ask AI // This example shows how to deploy a new market using the Kuru SDK ParamCreator. // Fill in the placeholders (rpcUrl, routerAddress, baseAssetAddress, quoteAssetAddress) // and export PRIVATE_KEY in your environment before running. import { ethers } from 'ethers'; import {ParamCreator} from "@kuru-labs/kuru-sdk"; async function main() { // JSON-RPC endpoint of the chain where you want to deploy the market const rpcUrl = ""; // e.g., "http://localhost:8545" // Kuru Router contract address const routerAddress = ""; // e.g., 0x... // Base (ABC) ERC-20 token address const baseAssetAddress = ""; // e.g., 0x... // Quote (USDC) ERC-20 token address const quoteAssetAddress = ""; // e.g., 0x... // Market type (OrderBookType): // 0 = NO_NATIVE → Neither token is the chain native asset // 1 = NATIVE_IN_BASE → Base token is the native asset (e.g., MON) // 2 = NATIVE_IN_QUOTE → Quote token is the native asset (e.g., MON) const type = 0 // Calculate precisions for target price. Example: 1 ABC = 10 USDC // currentQuote/currentBase = implied price in quote per base const currentQuote = 10; // quote amount (USDC) const currentBase = 1; // base amount (ABC) const maxPrice = 20; // Maximum expected price const minSize = 0.01; // Minimum order size // Build market parameters from the target price / constraints const paramCreator = new ParamCreator(); const precisions = paramCreator.calculatePrecisions(currentQuote, currentBase, maxPrice, minSize, 10); console.log('Price precision', precisions.pricePrecision.toString()); console.log('Size precision', precisions.sizePrecision.toString()); console.log('Tick size', precisions.tickSize.toString()); console.log('Min size', precisions.minSize.toString()); console.log('Max size', precisions.maxSize.toString()); const takerFeeBps = 30; // 0.3% const makerFeeBps = 10; // -0.1% (rebate) const kuruAmmSpread = ethers.BigNumber.from(100); // 1% Kuru AMM spread // Create signer from env key and connect to the network const provider = new ethers.providers.JsonRpcProvider(rpcUrl); const privateKey = process.env.PRIVATE_KEY; // must be set in environment if (!privateKey) throw new Error('PRIVATE_KEY not set'); const signer = new ethers.Wallet(privateKey as string, provider); try { // Deploy the market via the router const marketAddress = await paramCreator.deployMarket( signer, routerAddress, type, baseAssetAddress, quoteAssetAddress, precisions.sizePrecision, precisions.pricePrecision, precisions.tickSize, precisions.minSize, precisions.maxSize, takerFeeBps, makerFeeBps, kuruAmmSpread, ); console.log('Market deployed at:', marketAddress); } catch (error) { console.error('Error deploying market:', error); } } main() .then(() => process.exit(0)) .catch((error) => { console.error(error); process.exit(1); }); Here, `TYPE` is an integer from 0-2 according to the type of market you want to deploy: | Type | Description | | --- | --- | | 0 | Market with two ERC20 tokens | | 1 | Market with the base token as MON (ex. MON-USDC) | | 2 | Market with the quote token as MON (ex. USDC-MON) | `KURU_AMM_SPREAD` is the spread for the Kuru AMM. We recommend a large spread of 100 for volatile markets and 30 for more stable markets. The minimum spread is 10 BPS and the max is 500 BPS. The spread must be a multiple of 10. [​](https://docs.kuru.io/sdk/deploy-market#bootstrapping-with-liquidity-after-deploying-using-kuru-router) **Bootstrapping with liquidity after deploying using Kuru-Router** -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- After the router deploys your market, seed its vault with the initial base/quote inventory so liquidity is available from block one. The script below walks through a first-time deposit that respects a target price, checks allowances, and shows how to broadcast the transaction. FirstVaultDeposit.ts Copy Ask AI import { ethers } from "ethers"; import * as KuruSdk from "@kuru-labs/kuru-sdk"; import erc20Abi from "@kuru-labs/kuru-sdk/abi/IERC20.json"; // Example: first-time vault deposit with a target price (e.g., 1 ABC = 5 USDC) // Fill placeholders and export PRIVATE_KEY before running. const rpcUrl = ""; // RPC endpoint const vaultAddress = ""; // Vault contract address const marketAddress = ""; // Orderbook/market address const baseTokenAddress = ""; // Base token (0x00..00 for native) const quoteTokenAddress = ""; // Quote token const marginAccountAddress = ""; // Margin account used by vault const quoteAmount = ""; // Quote liquidity to deposit (string) const targetPrice = ""; // Quote per base (string) const approveTokens = false; // Set true to auto-approve ERC-20s async function main() { const provider = new ethers.providers.JsonRpcProvider(rpcUrl); const privateKey = process.env.PRIVATE_KEY; // must be set in env if (!privateKey) throw new Error("PRIVATE_KEY environment variable not set"); const signer = new ethers.Wallet(privateKey, provider); const signerAddress = await signer.getAddress(); console.log("Fetching market parameters..."); const marketParams = await KuruSdk.ParamFetcher.getMarketParams(provider, marketAddress); const quoteDecimals = marketParams.quoteAssetDecimals; const baseDecimals = marketParams.baseAssetDecimals; console.log("Market parameters:", { quoteDecimals, baseDecimals }); const quoteAmountWei = ethers.utils.parseUnits(quoteAmount, quoteDecimals); const priceWei = ethers.utils.parseUnits(targetPrice, 18); // price scaled to 1e18 (quote per base) if (priceWei.isZero()) throw new Error("targetPrice must be greater than zero"); // amount1 = (amount2 * 10^baseDecimals * 1e18) / (price * 10^quoteDecimals) const baseAmountWei = quoteAmountWei .mul(ethers.utils.parseUnits("1", baseDecimals)) .mul(ethers.utils.parseUnits("1", 18)) .div(priceWei) .div(ethers.utils.parseUnits("1", quoteDecimals)); console.log("Planned deposit ratio:", { quoteAmount: quoteAmountWei.toString(), baseAmount: baseAmountWei.toString(), targetPrice, }); console.log("Fetching existing vault liquidity (optional sanity check)..."); const { token1, token2 } = await KuruSdk.Vault.getVaultLiquidity( vaultAddress, baseTokenAddress, quoteTokenAddress, marginAccountAddress, provider ); console.log("Vault token balances:", { token1: token1.balance.toString(), token2: token2.balance.toString(), }); console.log("Checking wallet balances..."); // Show balances to confirm you have enough base/quote before depositing. const token1Balance = baseTokenAddress === ethers.constants.AddressZero as string ? await signer.getBalance() : await new ethers.Contract(baseTokenAddress, erc20Abi.abi, provider).balanceOf(signerAddress); const token2Balance = quoteTokenAddress === ethers.constants.AddressZero as string ? await signer.getBalance() : await new ethers.Contract(quoteTokenAddress, erc20Abi.abi, provider).balanceOf(signerAddress); console.log("Wallet balances:", { token1: token1Balance.toString(), token2: token2Balance.toString(), }); console.log("Sending first vault deposit transaction..."); const receipt = await KuruSdk.Vault.depositWithAmounts( baseAmountWei, quoteAmountWei, baseTokenAddress, quoteTokenAddress, vaultAddress, signer, approveTokens, ); console.log("First deposit confirmed. Transaction hash:", receipt.transactionHash); } main() .then(() => process.exit(0)) .catch((error) => { console.error("First vault deposit failed:", error); process.exit(1); }); [​](https://docs.kuru.io/sdk/deploy-market#adding-liquidity-to-existing-vaults) **Adding Liquidity to Existing Vaults** -------------------------------------------------------------------------------------------------------------------------- Whenever you need to deepen an established pool, add base/quote liquidity in the same proportion the vault already holds. This helper script pulls the live vault balances, computes the matching base amount from your quote input, takes care of ERC-20 approvals, and submits the proportional top-up. VaultDeposit.ts Copy Ask AI import { ethers } from "ethers"; import * as KuruSdk from "@kuru-labs/kuru-sdk"; import erc20Abi from "@kuru-labs/kuru-sdk/abi/IERC20.json"; // Example: top up an existing Kuru AMM vault without changing price. // Fill every placeholder (RPC, addresses, amounts) before running. const RPC_URL = ""; // e.g., "https://rpc.fullnode.kuru.io" const VAULT_ADDRESS = ""; // Vault contract address const MARKET_ADDRESS = ""; // Orderbook / market address const BASE_TOKEN_ADDRESS = ""; // Base token (0x00..00 if native) const QUOTE_TOKEN_ADDRESS = ""; // Quote token (0x00..00 if native) const MARGIN_ACCOUNT_ADDRESS = ""; // Margin account that holds vault balances const QUOTE_AMOUNT = ""; // Human quote amount, e.g., "500" async function main() { if (!RPC_URL || !VAULT_ADDRESS || !MARKET_ADDRESS || !BASE_TOKEN_ADDRESS || !QUOTE_TOKEN_ADDRESS || !MARGIN_ACCOUNT_ADDRESS) { throw new Error("Fill in all placeholders (RPC_URL, VAULT_ADDRESS, MARKET_ADDRESS, token addresses, MARGIN_ACCOUNT_ADDRESS)"); } const privateKey = process.env.PRIVATE_KEY; if (!privateKey) { throw new Error("Set PRIVATE_KEY in your environment before running the script"); } const provider = new ethers.providers.JsonRpcProvider(RPC_URL); const signer = new ethers.Wallet(privateKey, provider); const signerAddress = await signer.getAddress(); console.log("Fetching current vault liquidity..."); const { token1, token2 } = await KuruSdk.Vault.getVaultLiquidity( VAULT_ADDRESS, BASE_TOKEN_ADDRESS, QUOTE_TOKEN_ADDRESS, MARGIN_ACCOUNT_ADDRESS, provider ); console.log("Vault balances:", { token1: token1.balance.toString(), token2: token2.balance.toString(), }); console.log("Fetching market params..."); const marketParams = await KuruSdk.ParamFetcher.getMarketParams(provider, MARKET_ADDRESS); const quoteAmountStr = QUOTE_AMOUNT || "0"; const quoteAmountWei = ethers.utils.parseUnits(quoteAmountStr, marketParams.quoteAssetDecimals); const baseAmountWei = await KuruSdk.Vault.calculateAmount1ForAmount2( quoteAmountWei, MARKET_ADDRESS, marketParams, provider ); console.log("Calculated base amount needed:", baseAmountWei.toString()); const token1Balance = token1.address === ethers.constants.AddressZero ? await signer.getBalance() : await new ethers.Contract(token1.address, erc20Abi.abi, provider).balanceOf(signerAddress); const token2Balance = token2.address === ethers.constants.AddressZero ? await signer.getBalance() : await new ethers.Contract(token2.address, erc20Abi.abi, provider).balanceOf(signerAddress); console.log("User balances before deposit:", { token1: token1Balance.toString(), token2: token2Balance.toString(), }); if (BASE_TOKEN_ADDRESS !== ethers.constants.AddressZero) { const baseToken = new ethers.Contract(BASE_TOKEN_ADDRESS, erc20Abi.abi, signer); const baseAllowance = await baseToken.allowance(signerAddress, VAULT_ADDRESS); if (baseAllowance.lt(baseAmountWei)) { console.log("Approving base token allowance", { required: baseAmountWei.toString(), current: baseAllowance.toString(), }); const approveBaseTx = await baseToken.approve(VAULT_ADDRESS, baseAmountWei); await approveBaseTx.wait(); console.log("Base token approved"); } } if (QUOTE_TOKEN_ADDRESS !== ethers.constants.AddressZero) { const quoteToken = new ethers.Contract(QUOTE_TOKEN_ADDRESS, erc20Abi.abi, signer); const quoteAllowance = await quoteToken.allowance(signerAddress, VAULT_ADDRESS); if (quoteAllowance.lt(quoteAmountWei)) { console.log("Approving quote token allowance", { required: quoteAmountWei.toString(), current: quoteAllowance.toString(), }); const approveQuoteTx = await quoteToken.approve(VAULT_ADDRESS, quoteAmountWei); await approveQuoteTx.wait(); console.log("Quote token approved"); } } console.log("Constructing deposit transaction..."); console.log("Base amount wei:", baseAmountWei.toString()); console.log("Quote amount wei:", quoteAmountWei.toString()); const depositTx = await KuruSdk.Vault.constructDepositTransaction( baseAmountWei, quoteAmountWei, BASE_TOKEN_ADDRESS, QUOTE_TOKEN_ADDRESS, VAULT_ADDRESS, signer ); console.log("Sending deposit transaction..."); const sentTx = await signer.sendTransaction(depositTx); console.log("Deposit submitted. Hash:", sentTx.hash); const receipt = await sentTx.wait(); console.log("Deposit confirmed in block:", receipt.blockNumber); } main() .then(() => process.exit(0)) .catch((error) => { console.error("Vault deposit failed:", error); process.exit(1); }); [Order Book SDK](https://docs.kuru.io/sdk/orderbook-sdk) [Overview](https://docs.kuru.io/kuru-flow/flow-overview) ⌘I --- # Order Book SDK - Kuru [Skip to main content](https://docs.kuru.io/sdk/orderbook-sdk#content-area) [Kuru home page![light logo](https://mintcdn.com/kuru/NV1IYuc7r8ueRMIx/logo/Kuru_Dark_Full.svg?fit=max&auto=format&n=NV1IYuc7r8ueRMIx&q=85&s=fd5b01d4e7bf016b95925e83ee0ef3ea)![dark logo](https://mintcdn.com/kuru/UXaoR-O-t9Kvyjzw/logo/Kuru_Light_Full.svg?fit=max&auto=format&n=UXaoR-O-t9Kvyjzw&q=85&s=e2c30f09efd357f187425fcaefd60ca6)](https://docs.kuru.io/) Search... ⌘KAsk AI Search... Navigation SDK Order Book SDK [Product](https://docs.kuru.io/) [Concepts](https://docs.kuru.io/concepts/why-monad) [For Developers](https://docs.kuru.io/sdk/quickstart-sdk) [Legal](https://docs.kuru.io/legal/tradingview) On this page * [Market buy order](https://docs.kuru.io/sdk/orderbook-sdk#market-buy-order) * [Estimate buy](https://docs.kuru.io/sdk/orderbook-sdk#estimate-buy) * [Estimate base for sell](https://docs.kuru.io/sdk/orderbook-sdk#estimate-base-for-sell) * [Deposit into margin account](https://docs.kuru.io/sdk/orderbook-sdk#deposit-into-margin-account) * [Place limit buy](https://docs.kuru.io/sdk/orderbook-sdk#place-limit-buy) * [Cancel order](https://docs.kuru.io/sdk/orderbook-sdk#cancel-order) * [FlipOrders( Liquidity )](https://docs.kuru.io/sdk/orderbook-sdk#fliporders-liquidity) * [Spot](https://docs.kuru.io/sdk/orderbook-sdk#spot) * [Bid-Ask](https://docs.kuru.io/sdk/orderbook-sdk#bid-ask) * [Curve](https://docs.kuru.io/sdk/orderbook-sdk#curve) [​](https://docs.kuru.io/sdk/orderbook-sdk#market-buy-order) Market buy order -------------------------------------------------------------------------------- To perform a market buy. We use `KuruSdk.IOC.placeMarket()` Set isBuy to false to place a Market sell order. marketBuy Copy Ask AI // Example: place a market buy (IOC) using the Kuru SDK // Fill placeholders (rpcUrl, marketAddress, size) and export PRIVATE_KEY before running. import { ethers } from "ethers"; import * as KuruSdk from "@kuru-labs/kuru-sdk"; // Network RPC endpoint const rpcUrl = ""; // TODO: e.g., http://localhost:8545 // Address of the market you want to trade on const marketAddress = ""; // TODO: e.g., 0x... // Order params (strings OK; SDK handles parsing): // size → amount in quote asset (e.g., USDC) to spend const size = ""; // TODO: e.g., "5.5" (USDC) // Slippage tolerance expressed in basis points (100 = 1%). This is only used to // derive the on-chain minAmountOut threshold; the contract enforces minAmountOut, // not the slippage percentage itself. const slippageToleranceBps = 100; async function main() { const provider = new ethers.providers.JsonRpcProvider(rpcUrl); const privateKey = process.env.PRIVATE_KEY; // must be set in env if (!privateKey) throw new Error("PRIVATE_KEY environment variable not set"); const signer = new ethers.Wallet(privateKey, provider); try { // Pull market parameters (precisions, fees, etc.) const marketParams = await KuruSdk.ParamFetcher.getMarketParams(provider, marketAddress); const quoteSize = parseFloat(size); if (Number.isNaN(quoteSize)) { throw new Error("size must be a numeric string (e.g., \"5.5\")"); } // Estimate base asset output and gas using CostEstimator const { output: estimatedBaseOut, estimatedGas } = await KuruSdk.CostEstimator.estimateMarketBuy( provider, marketAddress, marketParams, quoteSize ); console.log("Estimated gas:", estimatedGas.toString()); console.log("Estimated base out:", estimatedBaseOut); const baseDecimals = marketParams.baseAssetDecimals.toNumber(); const slippageMultiplier = (10000 - slippageToleranceBps) / 10000; const minAmountOut = (estimatedBaseOut * slippageMultiplier).toFixed(baseDecimals); console.log("Min amount out (post slippage):", minAmountOut); // Immediate-Or-Cancel market buy const receipt = await KuruSdk.IOC.placeMarket(signer, marketAddress, marketParams, { approveTokens: true, size, isBuy: true, minAmountOut, isMargin: false, fillOrKill: true, }); console.log("Transaction hash:", receipt.transactionHash); } catch (error) { console.error("Error placing market buy order:", error); } } main() .then(() => process.exit(0)) .catch((error) => { console.error(error); process.exit(1); }); [​](https://docs.kuru.io/sdk/orderbook-sdk#estimate-buy) Estimate buy ------------------------------------------------------------------------ To estimate the `baseAsset` received for a buy order with X amount of `quoteAsset`. We use `KuruSdk.CostEstimator.estimateMarketBuy()` EstimateBuy Copy Ask AI import { ethers } from "ethers"; import * as KuruSdk from "@kuru-labs/kuru-sdk"; // Example: estimate how much base you receive for a market buy (no tx sent) // Fill placeholders (rpcUrl, marketAddress, amount) before running. const rpcUrl = ""; // TODO: RPC endpoint (e.g., http://localhost:8545) const marketAddress = ""; // TODO: Market address (e.g., 0x...) const amount = ""; // TODO: Quote amount to spend (e.g., "100" USDC) async function main() { const provider = new ethers.providers.JsonRpcProvider(rpcUrl); // Fetch market params (precisions, fees, etc.) required for estimation const marketParams = await KuruSdk.ParamFetcher.getMarketParams(provider, marketAddress); try { // Validate and convert input amount (quote asset) to number const amountNum = Number(amount); if (Number.isNaN(amountNum)) { throw new Error("Provide a numeric 'amount' (quote asset), e.g., \"100\""); } const estimate = await KuruSdk.CostEstimator.estimateMarketBuy( provider, marketAddress, marketParams, amountNum ); console.log(estimate); } catch (error) { console.error("Error estimating market buy:", error); } } main() .then(() => process.exit(0)) .catch((error) => { console.error(error); process.exit(1); }); [​](https://docs.kuru.io/sdk/orderbook-sdk#estimate-base-for-sell) Estimate base for sell -------------------------------------------------------------------------------------------- To estimate the required `baseAsset` for a sell order to get X amount of `quoteAsset`. We use `KuruSdk.CostEstimator.estimateRequiredBaseForSell()` EstimateSell Copy Ask AI import { ethers } from "ethers"; import * as KuruSdk from "@kuru-labs/kuru-sdk"; import orderbookAbi from "@kuru-labs/kuru-sdk/abi/OrderBook.json"; // Example: estimate required BASE to sell a given QUOTE amount (no tx sent) // Fill placeholders (rpcUrl, marketAddress, amount) before running. const rpcUrl = ""; // TODO: RPC endpoint (e.g., http://localhost:8545) const marketAddress = ""; // TODO: Market address (e.g., 0x...) const amount = ""; // TODO: desired quote amount to receive (e.g., "100" USDC) (async () => { const provider = new ethers.providers.JsonRpcProvider(rpcUrl); // Pull market params (precisions, fees, etc.) const marketParams = await KuruSdk.ParamFetcher.getMarketParams(provider, marketAddress); // Read orderbook state used by estimator const orderbook = new ethers.Contract(marketAddress, orderbookAbi.abi, provider); const l2Book = await orderbook.getL2Book(); const vaultParams = await orderbook.getVaultParams(); try { // Validate numeric amount (quote) const amountNum = Number(amount); if (Number.isNaN(amountNum)) throw new Error("Provide numeric 'amount' (quote asset)"); const estimate = await KuruSdk.CostEstimator.estimateRequiredBaseForSell( provider, marketAddress, marketParams, amountNum, l2Book, vaultParams ); console.log(estimate); } catch (error) { console.error("Error estimating required base for sell:", error); } })(); **Before placing any limit orders, deposit the required tokens into your margin account and ensure sufficient allowance; otherwise orders will revert due to insufficient balance**. ### [​](https://docs.kuru.io/sdk/orderbook-sdk#deposit-into-margin-account) **Deposit into margin account** MarginDeposit Copy Ask AI // Example: deposit tokens into a margin account via Kuru SDK // Fill placeholders (rpcUrl, marginAccountAddress, tokenAddress, amount, decimals) // and export PRIVATE_KEY before running. import { ethers } from "ethers"; import * as KuruSdk from "@kuru-labs/kuru-sdk"; import * as KuruConfig from "../config.json"; const {rpcUrl, marginAccountAddress} = KuruConfig; const tokenAddress = ""; // TODO: ERC-20 token to deposit (use 0x000...000 for native if supported) const amount = ""; // TODO: human amount as string (e.g., "1000") const decimals = 18; // TODO: token decimals (e.g., 18 for ABC, 6 for USDC) async function main() { const provider = new ethers.providers.JsonRpcProvider(rpcUrl); const privateKey = process.env.PRIVATE_KEY; // must be set in env if (!privateKey) throw new Error("PRIVATE_KEY environment variable not set"); const signer = new ethers.Wallet(privateKey, provider); try { // Deposits on behalf of the signer address. Set a different receiver if desired const receipt = await KuruSdk.MarginDeposit.deposit( signer, marginAccountAddress, await signer.getAddress(), tokenAddress, amount, decimals, true // set to true to auto-approve ERC-20 if not already approved ); console.log("Transaction hash:", receipt.transactionHash); } catch (error) { console.error("Error depositing:", error); } } main() .then(() => process.exit(0)) .catch((error) => { console.error(error); process.exit(1); }); [​](https://docs.kuru.io/sdk/orderbook-sdk#place-limit-buy) Place limit buy ------------------------------------------------------------------------------ To place a limit buy order. We use `KuruSdk.GTC.placeLimit()` After sending, call parseEvents(receipt) to confirm the order was created and to read new order IDs. Set isBuy to false to place a limit sell order. parseEvents.ts Copy Ask AI import { ethers, BigNumber } from 'ethers'; interface TradeInfo { orderId: BigNumber; filledSize: BigNumber; price: BigNumber; isBuy: boolean; } export async function parseEvents(receipt: ethers.ContractReceipt): Promise<{ newOrderIds: BigNumber[]; trades: TradeInfo[]; }> { const newOrderIds: BigNumber[] = []; const trades: TradeInfo[] = []; receipt.logs.forEach((log) => { if (log.topics[0] === ethers.utils.id("OrderCreated(uint40,address,uint96,uint32,bool)")) { try { const decodedLog = ethers.utils.defaultAbiCoder.decode( ['uint40', 'address', 'uint96', 'uint32', 'bool'], log.data ); const orderId = BigNumber.from(decodedLog[0]); newOrderIds.push(orderId); } catch (error) { console.error("Error decoding OrderCreated event:", error); } } else if (log.topics[0] === ethers.utils.id("Trade(uint40,address,bool,uint256,uint96,address,address,uint96)")) { try { const decodedLog = ethers.utils.defaultAbiCoder.decode( ['uint40', 'address', 'bool', 'uint256', 'uint96', 'address', 'address', 'uint96'], log.data ); trades.push({ orderId: BigNumber.from(decodedLog[0]), price: BigNumber.from(decodedLog[3]), filledSize: BigNumber.from(decodedLog[7]), isBuy: decodedLog[2] }); } catch (error) { console.error("Error decoding trade event:", error); } } }); return { newOrderIds, trades }; } placeLimitBuy.ts Copy Ask AI // Example: place a limit buy order using the Kuru SDK // Fill the placeholders (rpcUrl, marketAddress) and export PRIVATE_KEY before running. import { ethers } from "ethers"; import * as KuruSdk from "@kuru-labs/kuru-sdk"; import { parseEvents } from "./ParseEvents"; // Address of the orderbook/market you want to trade on const marketAddress = ""; // TODO: market address (e.g., 0x...) // Network RPC endpoint to connect the signer/provider const rpcUrl = ""; // TODO: RPC endpoint (e.g., http://localhost:8545) // Order parameters (strings OK; SDK handles parsing/decimals): // price → quoted in quote per base (e.g., USDC per ABC); must respect tick size // size → amount of base to buy; must be ≥ min size const price = ""; // TODO: e.g., "5" for 5 USDC per ABC const size = ""; // TODO: e.g., "10" for 10 ABC async function main() { const provider = new ethers.providers.JsonRpcProvider(rpcUrl); // PRIVATE_KEY should be exported in your shell before running const privateKey = process.env.PRIVATE_KEY; // must be set in env if (!privateKey) throw new Error("PRIVATE_KEY environment variable not set"); const signer = new ethers.Wallet(privateKey, provider); // Fetch market parameters (precisions, tick size, fees) const marketParams = await KuruSdk.ParamFetcher.getMarketParams( provider, marketAddress ); const order = { price, size, isBuy: true, postOnly: true, }; try { const gasEstimate = await KuruSdk.GTC.estimateGas( signer, marketAddress, marketParams, order ); const bufferedGasLimit = gasEstimate.mul(120).div(100); console.log("Estimated gas:", gasEstimate.toString()); console.log("Buffered gas limit (120%):", bufferedGasLimit.toString()); // Place a Good-Till-Cancel limit buy with buffered gas limit const receipt = await KuruSdk.GTC.placeLimit( signer, marketAddress, marketParams, { ...order, txOptions: { gasLimit: bufferedGasLimit, }, } ); console.log("Transaction hash:", receipt.transactionHash); // Extract created order ids from events const { newOrderIds } = await parseEvents(receipt); console.log("OrderIds:", newOrderIds); } catch (error) { console.error("Error placing limit buy order:", error); } } main() .then(() => process.exit(0)) .catch((error) => { console.error(error); process.exit(1); }); [​](https://docs.kuru.io/sdk/orderbook-sdk#cancel-order) Cancel order ------------------------------------------------------------------------ To cancel orders using the Kuru SDK. We use `KuruSdk.OrderCanceler.cancelOrders()` cancelOrder Copy Ask AI // Example: cancel one or more orders on an orderbook // Fill placeholders (rpcUrl, marketAddress, orderIds) and export PRIVATE_KEY before running. import { ethers, BigNumber } from "ethers"; import * as KuruSdk from "@kuru-labs/kuru-sdk"; // Network RPC endpoint const rpcUrl = ""; // TODO: e.g., http://localhost:8545 // Address of the market where the orders exist const marketAddress = ""; // TODO: market address (e.g., 0x...) // Order IDs to cancel (as strings). These will be converted to BigNumber. const orderIds = [""]; // TODO: e.g., ["123", "124"] async function main() { const provider = new ethers.providers.JsonRpcProvider(rpcUrl); const privateKey = process.env.PRIVATE_KEY; // must be set in env if (!privateKey) throw new Error("PRIVATE_KEY environment variable not set"); const signer = new ethers.Wallet(privateKey, provider); const ids = orderIds.map((orderId) => BigNumber.from(orderId)); try { const gasEstimate = await KuruSdk.OrderCanceler.estimateGas( signer, marketAddress, ids ); const bufferedGasLimit = gasEstimate.mul(120).div(100); console.log("Estimated gas:", gasEstimate.toString()); console.log("Buffered gas limit (120%):", bufferedGasLimit.toString()); // Convert string IDs to BigNumber and send cancel transaction const txReceipt = await KuruSdk.OrderCanceler.cancelOrders( signer, marketAddress, ids, { gasLimit: bufferedGasLimit } ); console.log("Transaction hash:", txReceipt.transactionHash); } catch (err: any) { console.error("Error:", err); } } main() .then(() => process.exit(0)) .catch((error) => { console.error(error); process.exit(1); }); [​](https://docs.kuru.io/sdk/orderbook-sdk#fliporders-liquidity) FlipOrders( Liquidity ) ------------------------------------------------------------------------------------------- Flip orders place an order that, when filled, automatically creates an opposite-side order at a specified “flipped” price. They let you enter as a maker and immediately re-quote on the other side to maintain liquidity across both sides of the book. Using FlipOrders we could provide Liquidity in following ways. ### [​](https://docs.kuru.io/sdk/orderbook-sdk#spot) Spot Even spread across a price band around best ask. placeSpotConcentratedLiquidity Copy Ask AI import { ethers } from "ethers"; import * as KuruSdk from "@kuru-labs/kuru-sdk"; // Docs Template: Place concentrated liquidity around the current best ask // 1) Fill all placeholders below // 2) export PRIVATE_KEY= // 3) Run with: npx ts-node scripts/docs_scripts/placeConcentratedLiquidity.ts const RPC_URL = ""; // TODO: RPC endpoint (e.g., https://rpc.your-node) const MARKET_ADDRESS = ""; // TODO: Orderbook/market address const MIN_FEES_BPS = 30n; // Minimum fees in bps (e.g., 30 for 0.3%) const RANGE_PCT = 1n; // +/- range in percent around best ask (e.g., 1) const TOTAL_QUOTE = ""; // TODO: Total quote liquidity to allocate (human string, e.g., "1000") async function main() { // Require configuration and PRIVATE_KEY in env if (!RPC_URL || !MARKET_ADDRESS || !TOTAL_QUOTE) { throw new Error("Fill RPC_URL, MARKET_ADDRESS, TOTAL_QUOTE before running"); } const privateKey = process.env.PRIVATE_KEY; if (!privateKey) throw new Error("Set PRIVATE_KEY in your environment before running"); // Provider/signer setup const provider = new ethers.providers.JsonRpcProvider(RPC_URL); const signer = new ethers.Wallet(privateKey, provider); // Fetch market params and current orderbook const marketParams = await KuruSdk.ParamFetcher.getMarketParams(provider, MARKET_ADDRESS); const orderbook = await KuruSdk.OrderBook.getL2OrderBook(provider, MARKET_ADDRESS, marketParams); if (!orderbook.asks || orderbook.asks.length === 0) { throw new Error("No asks available to anchor price range"); } // Derive best ask price in precision units (BigInt) const pricePrecisionPow = BigInt(10) ** BigInt(KuruSdk.log10BigNumber(marketParams.pricePrecision)); const bestAskFloat = orderbook.asks[0][0]; // number const bestAskPrice = BigInt(Math.floor(bestAskFloat * Number(pricePrecisionPow))); // Compute start/end bounds around best ask by +/- RANGE_PCT const startPrice = bestAskPrice - (bestAskPrice * RANGE_PCT) / 100n; const endPrice = bestAskPrice + (bestAskPrice * RANGE_PCT) / 100n; // Convert total quote to raw units using quote decimals const quoteDecimals = Number(marketParams.quoteAssetDecimals.toString()); const totalQuoteWei = ethers.utils.parseUnits(TOTAL_QUOTE, quoteDecimals); // Build batch LP details using PositionViewer (quote-liquidity driven) const batchLPDetails = await KuruSdk.PositionViewer.getSpotBatchLPDetails( MIN_FEES_BPS, startPrice, endPrice, bestAskPrice, BigInt(marketParams.pricePrecision.toString()), BigInt(marketParams.sizePrecision.toString()), BigInt(marketParams.quoteAssetDecimals.toString()), BigInt(marketParams.baseAssetDecimals.toString()), BigInt(marketParams.tickSize.toString()), BigInt(marketParams.minSize.toString()), BigInt(totalQuoteWei.toString()), // provide total quote liquidity undefined // or provide base liquidity instead ); console.log("Placing concentrated liquidity:", { bids: batchLPDetails.bids.length, asks: batchLPDetails.asks.length, }); // Submit the provision transaction (calls batchProvisionLiquidity) const receipt = await KuruSdk.PositionProvider.provisionLiquidity( signer, MARKET_ADDRESS, batchLPDetails ); console.log("Concentrated liquidity provisioned. Tx:", receipt.transactionHash); } main() .then(() => process.exit(0)) .catch((err) => { console.error("Error placing concentrated liquidity:", err); process.exit(1); }); ### [​](https://docs.kuru.io/sdk/orderbook-sdk#bid-ask) Bid-Ask asymmetric distribution (separate shaping on bids vs asks) placeBidAskConcentratedLiquidity Copy Ask AI import { ethers } from "ethers"; import * as KuruSdk from "@kuru-labs/kuru-sdk"; // Docs Template: Place bid-ask distributed concentrated liquidity // 1) Fill placeholders below // 2) export PRIVATE_KEY= // 3) Run: npx ts-node scripts/docs_scripts/placeBidAskConcentratedLiquidity.ts const RPC_URL = ""; // TODO: RPC endpoint const MARKET_ADDRESS = ""; // TODO: Orderbook/market address const MIN_FEES_BPS = 30n; // e.g., 30 for 0.3% const RANGE_PCT = 1n; // +/- percent around best ask const TOTAL_QUOTE = ""; // TODO: human string (e.g., "1000") async function main() { if (!RPC_URL || !MARKET_ADDRESS || !TOTAL_QUOTE) throw new Error("Fill RPC_URL, MARKET_ADDRESS, TOTAL_QUOTE"); const privateKey = process.env.PRIVATE_KEY; if (!privateKey) throw new Error("Set PRIVATE_KEY in env"); const provider = new ethers.providers.JsonRpcProvider(RPC_URL); const signer = new ethers.Wallet(privateKey, provider); const marketParams = await KuruSdk.ParamFetcher.getMarketParams(provider, MARKET_ADDRESS); const orderbook = await KuruSdk.OrderBook.getL2OrderBook(provider, MARKET_ADDRESS, marketParams); if (!orderbook.asks?.length) throw new Error("No asks available to anchor price range"); const pricePow = BigInt(10) ** BigInt(KuruSdk.log10BigNumber(marketParams.pricePrecision)); const bestAskFloat = orderbook.asks[0][0]; const bestAskPrice = BigInt(Math.floor(bestAskFloat * Number(pricePow))); const startPrice = bestAskPrice - (bestAskPrice * RANGE_PCT) / 100n; const endPrice = bestAskPrice + (bestAskPrice * RANGE_PCT) / 100n; const totalQuoteWei = ethers.utils.parseUnits(TOTAL_QUOTE, Number(marketParams.quoteAssetDecimals)); const batch = await KuruSdk.PositionViewer.getBidAskBatchLPDetails( MIN_FEES_BPS, startPrice, endPrice, bestAskPrice, BigInt(marketParams.pricePrecision.toString()), BigInt(marketParams.sizePrecision.toString()), BigInt(marketParams.quoteAssetDecimals.toString()), BigInt(marketParams.baseAssetDecimals.toString()), BigInt(marketParams.tickSize.toString()), BigInt(marketParams.minSize.toString()), BigInt(totalQuoteWei.toString()), ); console.log("Provisioning bid-ask concentrated liquidity:", { bids: batch.bids.length, asks: batch.asks.length }); const receipt = await KuruSdk.PositionProvider.provisionLiquidity(signer, MARKET_ADDRESS, batch); console.log("Tx:", receipt.transactionHash); } main().catch((e) => { console.error("Error:", e); process.exit(1); }); ### [​](https://docs.kuru.io/sdk/orderbook-sdk#curve) Curve curved distribution (e.g., more weight near best price, tapering out). placeCurveConcentratedLiquidity Copy Ask AI import { ethers } from "ethers"; import * as KuruSdk from "@kuru-labs/kuru-sdk"; // Docs Template: Place curve-distributed concentrated liquidity // 1) Fill placeholders below // 2) export PRIVATE_KEY= // 3) Run: npx ts-node scripts/docs_scripts/placeCurveConcentratedLiquidity.ts const RPC_URL = ""; // TODO: RPC endpoint const MARKET_ADDRESS = ""; // TODO: Orderbook/market address const MIN_FEES_BPS = 30n; // e.g., 30 for 0.3% const RANGE_PCT = 1n; // +/- percent around best ask const TOTAL_QUOTE = ""; // TODO: human string (e.g., "1000") async function main() { if (!RPC_URL || !MARKET_ADDRESS || !TOTAL_QUOTE) throw new Error("Fill RPC_URL, MARKET_ADDRESS, TOTAL_QUOTE"); const privateKey = process.env.PRIVATE_KEY; if (!privateKey) throw new Error("Set PRIVATE_KEY in env"); const provider = new ethers.providers.JsonRpcProvider(RPC_URL); const signer = new ethers.Wallet(privateKey, provider); const marketParams = await KuruSdk.ParamFetcher.getMarketParams(provider, MARKET_ADDRESS); const orderbook = await KuruSdk.OrderBook.getL2OrderBook(provider, MARKET_ADDRESS, marketParams); if (!orderbook.asks?.length) throw new Error("No asks available to anchor price range"); const pricePow = BigInt(10) ** BigInt(KuruSdk.log10BigNumber(marketParams.pricePrecision)); const bestAskFloat = orderbook.asks[0][0]; const bestAskPrice = BigInt(Math.floor(bestAskFloat * Number(pricePow))); const startPrice = bestAskPrice - (bestAskPrice * RANGE_PCT) / 100n; const endPrice = bestAskPrice + (bestAskPrice * RANGE_PCT) / 100n; const totalQuoteWei = ethers.utils.parseUnits(TOTAL_QUOTE, Number(marketParams.quoteAssetDecimals)); const batch = await KuruSdk.PositionViewer.getCurveBatchLPDetails( MIN_FEES_BPS, startPrice, endPrice, bestAskPrice, BigInt(marketParams.pricePrecision.toString()), BigInt(marketParams.sizePrecision.toString()), BigInt(marketParams.quoteAssetDecimals.toString()), BigInt(marketParams.baseAssetDecimals.toString()), BigInt(marketParams.tickSize.toString()), BigInt(marketParams.minSize.toString()), BigInt(totalQuoteWei.toString()), ); console.log("Provisioning curve concentrated liquidity:", { bids: batch.bids.length, asks: batch.asks.length }); const receipt = await KuruSdk.PositionProvider.provisionLiquidity(signer, MARKET_ADDRESS, batch); console.log("Tx:", receipt.transactionHash); } main().catch((e) => { console.error("Error:", e); process.exit(1); }); [TypeScript SDK](https://docs.kuru.io/sdk/SDK-landing) [Deploy a market](https://docs.kuru.io/sdk/deploy-market) ⌘I --- # Page Not Found [Skip to main content](https://docs.kuru.io/wtfisaclob#content-area) [Kuru home page![light logo](https://mintcdn.com/kuru/NV1IYuc7r8ueRMIx/logo/Kuru_Dark_Full.svg?fit=max&auto=format&n=NV1IYuc7r8ueRMIx&q=85&s=fd5b01d4e7bf016b95925e83ee0ef3ea)![dark logo](https://mintcdn.com/kuru/UXaoR-O-t9Kvyjzw/logo/Kuru_Light_Full.svg?fit=max&auto=format&n=UXaoR-O-t9Kvyjzw&q=85&s=e2c30f09efd357f187425fcaefd60ca6)](https://docs.kuru.io/) Search... ⌘KAsk AI Search... Navigation Page Not Found [Product](https://docs.kuru.io/) [Concepts](https://docs.kuru.io/concepts/why-monad) [For Developers](https://docs.kuru.io/sdk/quickstart-sdk) [Legal](https://docs.kuru.io/legal/tradingview) 404 Page Not Found ============== We couldn't find the page. Maybe you were looking for one of these pages below? [WTF is a CLOB?](https://docs.kuru.io/concepts/wtfisaclob#) [The Trading Hub for Monad](https://docs.kuru.io/index#concepts) [Why Build on Monad?](https://docs.kuru.io/concepts/why-monad#) ⌘I --- # Page Not Found [Skip to main content](https://docs.kuru.io/SDK-landing#content-area) [Kuru home page![light logo](https://mintcdn.com/kuru/NV1IYuc7r8ueRMIx/logo/Kuru_Dark_Full.svg?fit=max&auto=format&n=NV1IYuc7r8ueRMIx&q=85&s=fd5b01d4e7bf016b95925e83ee0ef3ea)![dark logo](https://mintcdn.com/kuru/UXaoR-O-t9Kvyjzw/logo/Kuru_Light_Full.svg?fit=max&auto=format&n=UXaoR-O-t9Kvyjzw&q=85&s=e2c30f09efd357f187425fcaefd60ca6)](https://docs.kuru.io/) Search... ⌘KAsk AI Search... Navigation Page Not Found [Product](https://docs.kuru.io/) [Concepts](https://docs.kuru.io/concepts/why-monad) [For Developers](https://docs.kuru.io/sdk/quickstart-sdk) [Legal](https://docs.kuru.io/legal/tradingview) 404 Page Not Found ============== We couldn't find the page. Maybe you were looking for one of these pages below? [TypeScript SDK](https://docs.kuru.io/sdk/SDK-landing#) [Order Book SDK](https://docs.kuru.io/sdk/orderbook-sdk#) [Quick Start](https://docs.kuru.io/sdk/quickstart-sdk#) ⌘I --- # Page Not Found [Skip to main content](https://docs.kuru.io/product/what-is-a-vault#content-area) [Kuru home page![light logo](https://mintcdn.com/kuru/NV1IYuc7r8ueRMIx/logo/Kuru_Dark_Full.svg?fit=max&auto=format&n=NV1IYuc7r8ueRMIx&q=85&s=fd5b01d4e7bf016b95925e83ee0ef3ea)![dark logo](https://mintcdn.com/kuru/UXaoR-O-t9Kvyjzw/logo/Kuru_Light_Full.svg?fit=max&auto=format&n=UXaoR-O-t9Kvyjzw&q=85&s=e2c30f09efd357f187425fcaefd60ca6)](https://docs.kuru.io/) Search... ⌘KAsk AI Search... Navigation Page Not Found [Product](https://docs.kuru.io/) [Concepts](https://docs.kuru.io/concepts/why-monad) [For Developers](https://docs.kuru.io/sdk/quickstart-sdk) [Legal](https://docs.kuru.io/legal/tradingview) 404 Page Not Found ============== We couldn't find the page. Maybe you were looking for one of these pages below? [Vaults](https://docs.kuru.io/product/vaults#) [Router Contract Documentation](https://docs.kuru.io/contracts/Router#vaultimplementationupdated) [Deploy a market](https://docs.kuru.io/sdk/deploy-market#adding-liquidity-to-existing-vaults) ⌘I --- # Page Not Found [Skip to main content](https://docs.kuru.io/sdk/router#content-area) [Kuru home page![light logo](https://mintcdn.com/kuru/NV1IYuc7r8ueRMIx/logo/Kuru_Dark_Full.svg?fit=max&auto=format&n=NV1IYuc7r8ueRMIx&q=85&s=fd5b01d4e7bf016b95925e83ee0ef3ea)![dark logo](https://mintcdn.com/kuru/UXaoR-O-t9Kvyjzw/logo/Kuru_Light_Full.svg?fit=max&auto=format&n=UXaoR-O-t9Kvyjzw&q=85&s=e2c30f09efd357f187425fcaefd60ca6)](https://docs.kuru.io/) Search... ⌘KAsk AI Search... Navigation Page Not Found [Product](https://docs.kuru.io/) [Concepts](https://docs.kuru.io/concepts/why-monad) [For Developers](https://docs.kuru.io/sdk/quickstart-sdk) [Legal](https://docs.kuru.io/legal/tradingview) 404 Page Not Found ============== We couldn't find the page. Maybe you were looking for one of these pages below? [TypeScript SDK](https://docs.kuru.io/sdk/SDK-landing#) [Router Contract Documentation](https://docs.kuru.io/contracts/Router#) [Order Book SDK](https://docs.kuru.io/sdk/orderbook-sdk#) ⌘I --- # Page Not Found [Skip to main content](https://docs.kuru.io/product/kuru-flow#content-area) [Kuru home page![light logo](https://mintcdn.com/kuru/NV1IYuc7r8ueRMIx/logo/Kuru_Dark_Full.svg?fit=max&auto=format&n=NV1IYuc7r8ueRMIx&q=85&s=fd5b01d4e7bf016b95925e83ee0ef3ea)![dark logo](https://mintcdn.com/kuru/UXaoR-O-t9Kvyjzw/logo/Kuru_Light_Full.svg?fit=max&auto=format&n=UXaoR-O-t9Kvyjzw&q=85&s=e2c30f09efd357f187425fcaefd60ca6)](https://docs.kuru.io/) Search... ⌘KAsk AI Search... Navigation Page Not Found [Product](https://docs.kuru.io/) [Concepts](https://docs.kuru.io/concepts/why-monad) [For Developers](https://docs.kuru.io/sdk/quickstart-sdk) [Legal](https://docs.kuru.io/legal/tradingview) 404 Page Not Found ============== We couldn't find the page. Maybe you were looking for one of these pages below? [Kuru Flow](https://docs.kuru.io/product/flow#) [Liquidity on Kuru](https://docs.kuru.io/concepts/liquidity#) [Trading View on Kuru](https://docs.kuru.io/legal/tradingview#) ⌘I --- # Page Not Found [Skip to main content](https://docs.kuru.io/developers/contracts#content-area) [Kuru home page![light logo](https://mintcdn.com/kuru/NV1IYuc7r8ueRMIx/logo/Kuru_Dark_Full.svg?fit=max&auto=format&n=NV1IYuc7r8ueRMIx&q=85&s=fd5b01d4e7bf016b95925e83ee0ef3ea)![dark logo](https://mintcdn.com/kuru/UXaoR-O-t9Kvyjzw/logo/Kuru_Light_Full.svg?fit=max&auto=format&n=UXaoR-O-t9Kvyjzw&q=85&s=e2c30f09efd357f187425fcaefd60ca6)](https://docs.kuru.io/) Search... ⌘KAsk AI Search... Navigation Page Not Found [Product](https://docs.kuru.io/) [Concepts](https://docs.kuru.io/concepts/why-monad) [For Developers](https://docs.kuru.io/sdk/quickstart-sdk) [Legal](https://docs.kuru.io/legal/tradingview) 404 Page Not Found ============== We couldn't find the page. Maybe you were looking for one of these pages below? [Router Contract Documentation](https://docs.kuru.io/contracts/Router#) [MarginAccount Contract](https://docs.kuru.io/contracts/MarginAccount#) [Contract Addresses](https://docs.kuru.io/contracts/Contract-addresses#) ⌘I --- # Page Not Found [Skip to main content](https://docs.kuru.io/product/kuru-flow/flow-overview.mdx#content-area) [Kuru home page![light logo](https://mintcdn.com/kuru/NV1IYuc7r8ueRMIx/logo/Kuru_Dark_Full.svg?fit=max&auto=format&n=NV1IYuc7r8ueRMIx&q=85&s=fd5b01d4e7bf016b95925e83ee0ef3ea)![dark logo](https://mintcdn.com/kuru/UXaoR-O-t9Kvyjzw/logo/Kuru_Light_Full.svg?fit=max&auto=format&n=UXaoR-O-t9Kvyjzw&q=85&s=e2c30f09efd357f187425fcaefd60ca6)](https://docs.kuru.io/) Search... ⌘KAsk AI Search... Navigation Page Not Found [Product](https://docs.kuru.io/) [Concepts](https://docs.kuru.io/concepts/why-monad) [For Developers](https://docs.kuru.io/sdk/quickstart-sdk) [Legal](https://docs.kuru.io/legal/tradingview) 404 Page Not Found ============== We couldn't find the page. Maybe you were looking for one of these pages below? [Kuru Flow](https://docs.kuru.io/product/flow#) [Overview](https://docs.kuru.io/kuru-flow/flow-overview#) [The Trading Hub for Monad](https://docs.kuru.io/index#overview) ⌘I --- # Page Not Found [Skip to main content](https://docs.kuru.io/product/flip-orders#content-area) [Kuru home page![light logo](https://mintcdn.com/kuru/NV1IYuc7r8ueRMIx/logo/Kuru_Dark_Full.svg?fit=max&auto=format&n=NV1IYuc7r8ueRMIx&q=85&s=fd5b01d4e7bf016b95925e83ee0ef3ea)![dark logo](https://mintcdn.com/kuru/UXaoR-O-t9Kvyjzw/logo/Kuru_Light_Full.svg?fit=max&auto=format&n=UXaoR-O-t9Kvyjzw&q=85&s=e2c30f09efd357f187425fcaefd60ca6)](https://docs.kuru.io/) Search... ⌘KAsk AI Search... Navigation Page Not Found [Product](https://docs.kuru.io/) [Concepts](https://docs.kuru.io/concepts/why-monad) [For Developers](https://docs.kuru.io/sdk/quickstart-sdk) [Legal](https://docs.kuru.io/legal/tradingview) 404 Page Not Found ============== We couldn't find the page. Maybe you were looking for one of these pages below? [Flip Orders](https://docs.kuru.io/concepts/flip-orders#flip-orders) [OrderBook Contract](https://docs.kuru.io/contracts/OrderBook#flip-orders) [Order Book SDK](https://docs.kuru.io/sdk/orderbook-sdk#fliporders-liquidity) ⌘I ---