# Creating a Market on LlamaLend

By [Curve Finance Unofficial](https://paragraph.com/@curvefi) · 2025-05-06

---

In this guide we will walk step‑by‑step through launching a market on Curve LlamaLend: choosing a pool, configuring a price oracle, selecting lending parameters, and attaching a gauge so liquidity providers can earn CRV rewards. The material complements the [previous guide on parameter selection](https://paragraph.com/@curvefi/llamma-simulator) and will allow you to integrate any token into the Curve ecosystem on your own.

* * *

* * *

### Table of Contents

1.  **Preparation and Requirements** — let’s go over what you need in order to spin up a new market.
    
2.  **Creating a Curve Pool**
    
3.  **Deploying a Market via OneWay Lending Factory**
    
    *   Choosing the method:
        
        *   `create_from_pool` — for a market whose pool is paired with crvUSD
            
        *   `create` — for a market whose pool has _no_ crvUSD pair
            
    *   Deploying the oracle contract
        
    *   Choosing price oracles for Curve Lending
        
        *   Main oracle types for lending markets
            
        *   Oracles for special‑case tokens
            
        *   How to pick the right oracle
            
        *   Important nuances
            
4.  **Creating Gauges for CRV Rewards**
    
    *   Flow for markets on **Ethereum Mainnet**
        
    *   Flow for markets on **side‑chains (L2 / alt‑L1)**
        
        1.  Deploying the **Child Gauge** on the side‑chain
            
        2.  Deploying the **Root Gauge** on Ethereum Mainnet
            
        
        *   Generating the `salt` value
            
        *   The `_manager` parameter
            
        *   Extra capabilities
            
5.  **Conclusion**
    

* * *

* * *

1.  Preparation and Requirements
--------------------------------

In the earlier article [“Choosing Optimal Parameters for LlamaLend Markets”](https://teletype.in/@curvefi/llamalend_market_deploy), we explained in detail how to run back‑tests on historical data. Using parameters that fit your asset’s behaviour is critical; otherwise sharp price moves inside the soft‑liquidation band can trigger mass liquidations.

### Let’s walk through the requirements for launching a new market

1.  **A Curve pool for your asset** — ideally paired with **crvUSD**; if no crvUSD pair exists you will have to deploy a dedicated oracle contract.
    
2.  **Deep on‑chain / off‑chain liquidity** that is sufficient for orderly liquidation and de‑liquidation of all loans.
    
3.  **Fast arbitrage routes**: if not all liquidity sits in the Curve pool you connect to the market, you must ensure — and continue to monitor — that rapid arbitrage is possible between your Curve pool and other trading venues.
    

> Meeting these three prerequisites greatly reduces the risk of unwanted liquidations and keeps the lending market healthy over its lifetime.

* * *

* * *

2 . Creating a Curve Pool
-------------------------

To launch a LlamaLend market you need a price oracle that is both fair and resistant to manipulation.  The ideal solution is a Curve pool that already contains your token.

### Suitable pool types

*   **Cryptoswap Two‑Asset NG Pool** — for two volatile assets (e.g., `crvUSD/your_token`).
    
*   **Cryptoswap Three‑Asset NG Pool** — for three assets (e.g., `crvUSD/WETH/your_token`).
    
*   **Stableswap NG Pool** — for stable‑asset pairs (e.g., `crvUSD/your_stablecoin`).
    

> The “**NG**” suffix (_Next Generation_) means the pool exposes a built‑in EMA oracle that LlamaLend can read directly.

If the required pool does **not** exist, create it via the official Curve interface or follow the _Creating Pools_ guide in the documentation.

**Important:** If your asset is **not** traded directly against `crvUSD`, you will have to deploy a custom oracle (see the oracle‑creation section below).

* * *

* * *

3.  Deploying a Market via OneWay Lending Factory
-------------------------------------------------

OneWay Lending Factory deploys every contract a market needs in **one** transaction using either `create_from_pool` or `create`. After the transaction confirms, the new market appears automatically in the Curve LlamaLend UI.

### Factory addresses

**Ethereum:** [0xeA6876DDE9e3467564acBeE1Ed5bac88783205E0](https://etherscan.io/address/0xeA6876DDE9e3467564acBeE1Ed5bac88783205E0#writeContract)  
**Arbitrum:** [0xcaEC110C784c9DF37240a8Ce096D352A75922DeA](https://arbiscan.io/address/0xcaEC110C784c9DF37240a8Ce096D352A75922DeA#writeContract)  
**Fraxtal:** [0xf3c9bdab17b7016fbe3b77d17b1602a7db93ac66](https://fraxscan.com/address/0xf3c9bdab17b7016fbe3b77d17b1602a7db93ac66#writeContract)  
**Optimism:** [0x5ea8f3d674c70b020586933a0a5b250734798bef](https://fraxscan.com/address/0xf3c9bdab17b7016fbe3b77d17b1602a7db93ac66#writeContract)  
**Sonic:** [0x30d1859dad5a52ae03b6e259d1b48c4b12933993](https://sonicscan.org/address/0x30d1859dad5a52ae03b6e259d1b48c4b12933993#writeContract)

![](https://storage.googleapis.com/papyrus_images/2473bda70d2ef7b93507de5a07c3989f.png)

### **Choosing the deployment method**

*   Use `create_from_pool` if you already have a Curve pool that includes both the collateral token and `crvUSD`; the factory will automatically use the pool’s EMA oracle, so you do **not** need to supply a separate `price_oracle` parameter.
    
*   Use `create` if your pool has **no direct** `crvUSD` **pair**; in that case you must pass the address of a **custom price oracle** in the `price_oracle` field. Guidance on building or selecting the right oracle is provided in Curve’s _Lending Oracles_ overview.  
    ([resources.curve.fi](https://resources.curve.fi/lending/create-lending-market/), [docs.curve.fi](https://docs.curve.fi/lending/contracts/oracle-overview/))
    

Both methods come in several “light” and “full” variants. The lighter variants omit some optional parameters and fall back to DAO‑defined defaults; the full variants let you specify every parameter explicitly. Choose according to how much control you need over fees, borrow‑rate bands, and risk settings.

* * *

### Method create\_from\_pool — for a market whose pool is paired with **crvUSD**

Use this variant when you have a Curve pool such as `crvUSD / your token` built with **stableswap‑ng**, **twocrypto‑ng**, or **tricrypto‑ng**. The pool’s built‑in EMA oracle is automatically recognised, so you do **not** need to supply a separate `price_oracle` address.

![](https://storage.googleapis.com/papyrus_images/9b4af0bc410385f06d871f643ba5ed3b.png)

* * *

#### Full parameter list (explained one‑by‑one)

*   `borrowed_token` – address of the asset users will borrow (normally **crvUSD**).
    
*   `collateral_token` – address of the asset that backs the loan.
    
*   `A` – amplification coefficient, i.e. the width of the soft‑liquidation band. Typical values range from 10 to 30; choose a _lower_ number for more‑volatile tokens.
    
*   `fee` – AMM swap fee expressed with 18 decimals (0.06 % = `6000000000000000`).
    
*   `loan_discount` – discount factor used when calculating the _maximum_ loan‑to‑value (e.g. 11 % = `110000000000000000`).
    
*   `liquidation_discount` – discount applied to the price during liquidations (e.g. 8 % = `80000000000000000`).
    
*   `pool` – address of the Curve pool that acts as the oracle; it **must** contain both the collateral and the borrowed token.
    
*   `name` – a descriptive market name, written as a string.
    
*   `min_borrow_rate` – minimum borrow rate per‑second; 1 % APR corresponds to roughly `317097919` (wei‑per‑second).
    
*   `max_borrow_rate` – maximum borrow rate per‑second; 80 % APR is about `25367833587`.
    

![](https://paragraph.com/editor/callout/information-icon.png)

Except for `A`, every numeric value is supplied in 18‑decimal _wei_ units.

* * *

#### How to pick sensible numbers

_Calibrate_ `A`_,_ `fee`_,_ `loan_discount`_, and_ `liquidation_discount` _with historical simulations_ to be sure the market stays solvent even during extreme price swings; Curve’s own guide [“Choosing Optimal Parameters for LlamaLend Markets”](https://teletype.in/@curvefi/llamma-simulator) walks through that process step by step.

For the borrow‑rate band you set `min_borrow_rate` and `max_borrow_rate` according to expected utilisation:

    effective_rate(utilisation) =
          (max_rate / min_rate) ^ utilisation  ×  min_rate

_Example with 1 % → 100 %:_

*   at 60 % utilisation the borrower pays ~15.85 % APR,
    
*   at 70 % utilisation the rate rises to ~25.12 %,
    
*   at 80 % utilisation it reaches ~39.81 %.
    

Choose _lower_ bands for highly liquid, stable assets and _higher_ bands for volatile or thinly traded assets.

If you leave either rate field blank (enter `0`, or use a lighter factory method) the factory falls back to the Curve DAO’s current defaults.

* * *

#### Launching the vault

1.  Open the **OneWay Lending Factory** contract for your network (for example, Ethereum Mainnet – `0xeA6876DDE9e3467564acBeE1Ed5bac88783205E0`).
    
2.  Fill in the parameters listed above.
    
3.  Click **“Write”** and sign the transaction.
    
    ![](https://storage.googleapis.com/papyrus_images/f8affa525046ebba746af1122052c8a3.png)
    

  
  

That single transaction deploys the LLAMMA, the Controller, the Vault, and registers the new market in the Curve LlamaLend UI.

* * *

#### After deployment

Keep an eye on utilisation, borrow rates, and liquidity depth to ensure the market behaves as expected. Market admins (or a DAO vote) can later adjust fees or the borrow‑rate band if conditions change.

* * *

* * *

Deploying a Custom Price‑Oracle Contract
----------------------------------------

_(applies only when you launch a market with the_ `create` _method)_

![](https://paragraph.com/editor/callout/information-icon.png)

Launching a LlamaLend market whose collateral token **is not** traded in a Curve NG pool against `crvUSD` means you must aggregate price data from several pools (or other feeds) and deploy a standalone oracle contract. Because this is more involved than the default `create_from_pool` flow, Curve recommends discussing your design with the core team before going live.

At present there is **no factory** that can deploy these multi‑pool oracles automatically; you have to deploy the contract yourself. The most convenient way is to use the browser‑based **Remix IDE**.

* * *

### 1  Open Remix and load the oracle source

1.  Go to [**https://remix.ethereum.org**](https://remix.ethereum.org) and open a new workspace.
    
    ![](https://storage.googleapis.com/papyrus_images/ec1f7bf0276c3f4ea8bf4795562be6ac.png)
    
2.  Click the _Import from URL_ icon, then paste the GitHub link of the oracle you need.
    
    ![](https://storage.googleapis.com/papyrus_images/fbc3b1a82873f738da25ddbfd13dce56.png)
    
    *   Curve’s official L1 oracles live under: [https://github.com/curvefi/curve-stablecoin/tree/master/contracts/price\_oracles](https://github.com/curvefi/curve-stablecoin/tree/master/contracts/price_oracles)
        
    *   L2‑specific oracles are in: [https://github.com/curvefi/curve-stablecoin/tree/master/contracts/price\_oracles/L2](https://github.com/curvefi/curve-stablecoin/tree/master/contracts/price_oracles/L2)
        
    *   If your token and the reference token use **different decimals**, the community contract `CryptoFromPoolsWAgg.vy` by **martinkrung** is a good choice (it handles, for example, 18‑decimals EYWA and 6‑decimals USDT): [https://github.com/martinkrung/ape-oracle-deploy/blob/main/contracts/L2/CryptoFromPoolsWAgg.vy](https://github.com/martinkrung/ape-oracle-deploy/blob/main/contracts/L2/CryptoFromPoolsWAgg.vy)
        

![](https://storage.googleapis.com/papyrus_images/320c2f771d62685c284f40cbdd572050.png)

* * *

### 2  Compile the contract

• Select the file in the Remix _File Explorer_ and press **Compile**. The green check‑mark confirms success.

![](https://storage.googleapis.com/papyrus_images/7617c69dba9a18d7b665b75a153c89a4.png)

* * *

### 3  Switch Remix to WalletConnect

1.  Open the **Deploy & Run Transactions** tab.
    

![](https://storage.googleapis.com/papyrus_images/df8b2a8e8362191b8bba79f998ff5832.png)

1.  In the _Environment_ dropdown choose **WalletConnect** and link your wallet; set the network you want to use (in the screenshot example, Arbitrum with chain‑ID 42161).
    
    ![](https://storage.googleapis.com/papyrus_images/9e90ee089d9119a1e94bce81dc962aef.png)
    

* * *

### 4  Enter constructor parameters

![](https://storage.googleapis.com/papyrus_images/aea3c81a245980b0736244fa8f573ffb.png)

Expand **Deploy** and paste the four arguments expected by `CryptoFromPoolsWAgg.vy`:

![](https://storage.googleapis.com/papyrus_images/57bb82e6633a7434809864e622312604.png)

*   `pools` – a JSON‑style list of pool addresses, e.g.  
    `["0x6579758e9e85434450d638cfbea0f2fe79856dda","0x73af1150f265419ef8a5db41908b700c32d49135"]`. The first is the EYWA/USDT pool; the second is the crvUSD/USDT pool on Arbitrum.
    
*   `borrowed_ixs` – the coin index for `crvUSD` inside each pool, written as `[0,0]` (both pools list the borrowed asset at index 0). You can verify the mapping with the pool’s `coins` method on Arbiscan.
    
*   `collateral_ixs` – the coin index for the collateral token (`EYWA`) in each pool, here `[1,1]`. Again, confirm with `coins` on the pool contract page.
    
*   `agg` – address of the on‑chain aggregator contract that returns the combined price, for example  
    `0x44a4FdFb626Ce98e36396d491833606309520330`.
    

> **Tip:** Pool coin indices start at 0. Call `coins(0)` or `coins(1)` in the _Read Contract_ tab on Arbiscan until the expected token address appears.

* * *

How to find the coin indices in each pool
-----------------------------------------

1.  Open the pool’s contract page on a block‑explorer (Arbiscan for Arbitrum).
    
2.  In the **Read Contract** section call `coins(uint256)` with index `0`, then with `1`, until you see which token address is returned. Indices start from 0.
    

*   For the **EYWA/USDT** pool (`0x6579…6dda`) the call shows that index 0 is **USDT** and index 1 is **EYWA**.
    
*   For the **crvUSD/USDT** pool (`0x73af…9135`) the call shows that index 0 is **crvUSD** and index 1 is **USDT**.
    

Example: building an oracle that prices EYWA in crvUSD via USDT
---------------------------------------------------------------

Because EYWA and crvUSD do not share a direct NG pool, we aggregate their prices through USDT with the community contract `CryptoFromPoolsWAgg.vy` (supports differing decimals).

### Constructor arguments you will paste into Remix

*   **pools**
    
        ["0x6579758e9e85434450d638cfbea0f2fe79856dda", "0x73af1150f265419ef8a5db41908b700c32d49135"]
        
    
    The first address is the EYWA/USDT pool, the second the crvUSD/USDT pool. [Arbitrum L2 Explorer](https://www.arbiscan.io/address/0x6579758e9e85434450d638cfbea0f2fe79856dda?utm_source=chatgpt.com)[Arbitrum L2 Explorer](https://arbiscan.io/token/0x73af1150f265419ef8a5db41908b700c32d49135?a=0x50371d6ecfd666da59af1fd3901ecdf09854bc26&utm_source=chatgpt.com)
    
*   **borrowed\_ixs** – `[0,0]` because `crvUSD` sits at index 0 in both pools.
    
    ![](https://storage.googleapis.com/papyrus_images/9ffa35ff9e83cc3c41a931464a8c43da.png)
    
    [https://arbiscan.io/address/0x6579758e9e85434450d638cfbea0f2fe79856dda#readContract](https://arbiscan.io/address/0x6579758e9e85434450d638cfbea0f2fe79856dda#readContract)
    

coin index 0 - USDT  
coin index 1 - EYWA

*   **collateral\_ixs** – `[1,1]` because `EYWA` (or the collateral token) sits at index 1 in both pools.
    

![](https://storage.googleapis.com/papyrus_images/b8248225cba41115cb74432c508e1ed9.png)

[https://arbiscan.io/address/0x73af1150f265419ef8a5db41908b700c32d49135#readContract](https://arbiscan.io/address/0x73af1150f265419ef8a5db41908b700c32d49135#readContract)

coin index 0 - crvUSD  
coin index 1 - USDT

*   **agg** – `"0x44a4FdFb626Ce98e36396d491833606309520330"` (the official crvUSD price‑aggregator on Arbitrum). [docs.curve.fi](http://docs.curve.fi)
    

**We get the following values:**

    pools: ["0x6579758e9e85434450d638cfbea0f2fe79856dda","0x73af1150f265419ef8a5db41908b700c32d49135"]
    borrowed_ixs: [0,0]
    collateral_ixs: [1,1]
    agg: "0x44a4FdFb626Ce98e36396d491833606309520330"

![](https://storage.googleapis.com/papyrus_images/1528e07dc313ea3d08b80c45fb465938.png)

Click **Transact** in Remix and sign the transaction. You’ll see the transaction hash in the console.

![](https://paragraph.com/editor/callout/tip-icon.png)

Congratulations—your custom oracle is now deployed and verified!

1.  Find your new oracle contract address in that transaction’s logs. On Etherscan/Arbiscan, open the oracle’s **Contract → Read Contract** page and call `price()`.
    

![](https://storage.googleapis.com/papyrus_images/665964f5c50a195b4d8dc928e96270e9.png)

Click the returned value to view it in standard decimal format and confirm the price is correct.

![](https://storage.googleapis.com/papyrus_images/7472bfcbb9f73775ec29745e6e03b18c.png)

* * *

* * *

Думал на протяжении пары секунд

Choosing Price Oracles for Curve Lending Markets
------------------------------------------------

_(only for markets deployed via the_ `create` _method)_

Curve’s GitHub hosts many oracle contracts, each tuned for specific lending scenarios. Below is an English-language guide to the main oracle types, their use cases, selection principles, and key features.

**Key resources**

*   Multi-decimals aggregator (L2 example):  
    [https://github.com/martinkrung/ape-oracle-deploy/blob/main/contracts/L2/CryptoFromPoolsWAgg.vy](https://github.com/martinkrung/ape-oracle-deploy/blob/main/contracts/L2/CryptoFromPoolsWAgg.vy)
    
*   Official Curve price-oracle contracts:  
    [https://github.com/curvefi/curve-stablecoin/tree/master/contracts/price\_oracles](https://github.com/curvefi/curve-stablecoin/tree/master/contracts/price_oracles)
    

* * *

Main Oracle Types for Lending Markets
-------------------------------------

1.  **Oracles based on Curve pools**
    
    *   **CryptoFromPool.vy** — the basic oracle that reads price directly from a Curve pool. Use when you have a native pool of your token against crvUSD.
        
    *   **CryptoFromPoolWAgg.vy** — extends the basic oracle by routing price through a USD aggregator, rather than directly via crvUSD. Ideal when you need a USD-denominated reference.
        
2.  **Combined (multi-pool) oracles**
    
    *   **CryptoFromPoolsRate.vy** and **CryptoFromPoolsRateWAgg.vy** — aggregate prices across several pools in sequence. Perfect for tokens lacking a direct crvUSD pair.
        
3.  **L2-specialized oracles**
    
    *   Contracts in the **L2/** folder (e.g., `CryptoFromPoolsRateArbitrumWAgg.vy`) include logic for sequencer checks and other Layer 2 nuances on Arbitrum, Optimism, etc.
        

* * *

Oracles for Special-Case Tokens
-------------------------------

1.  **Yield-bearing tokens**
    
    *   **CryptoWithStablePriceWstethN.vy** — optimized for tokens like wstETH, which accrue yield internally.
        
2.  **Single-asset optimizations**
    
    *   **CryptoWithStablePriceWBTC.vy** — for WBTC
        
    *   **CryptoWithStablePriceTBTC.vy** — for tBTC
        
    *   **CryptoWithStablePriceETH.vy** — for ETH
        
3.  **External-feed integrations**
    
    *   **ChainlinkWrapper.vy** — wraps a Chainlink oracle for a single price feed.
        
    *   **CryptoWithStablePriceAndChainlink.vy** — hybrid that merges Curve TWAP with Chainlink rate limits.
        
    *   **UniOracle.vy** — uses Uniswap TWAP as its price source.
        

* * *

Principles for Oracle Selection
-------------------------------

*   **Standard crvUSD pair**: if you have a native `crvUSD/your_token` pool, use **CryptoFromPool.vy** (no manual deployment needed; supported by the factory).
    
*   **No direct pool**: use **CryptoFromPoolsRateWAgg.vy** to build a multi-hop price path through intermediate pools.
    
*   **Layer 2 markets**: pick the corresponding L2 oracle from the **L2/** directory, such as `CryptoFromPoolsRateArbitrumWAgg.vy`.
    
*   **Yield-bearing tokens**: choose a stored-rate oracle (e.g., CryptoWithStablePriceWstethN.vy) that accounts for token accrual.
    
*   **Maximum safety**: consider a hybrid TWAP+Chainlink solution (e.g., CryptoWithStablePriceAndChainlink.vy) to cap oracle deviations.
    

* * *

Important Features to Consider
------------------------------

*   **EMA smoothing**: all Curve oracles use an Exponential Moving Average to dampen price swings and resist manipulation.
    
*   **Flash-loan protection**: built-in defences guard against rapid, one-block price attacks.
    
*   **Decimal compatibility**: for tokens with non-standard decimals (e.g. USDT’s 6 dp), use variants **without** stored-rate assumptions.
    

When selecting your oracle, also assess the liquidity depth of each underlying pool and its resilience to manipulation. For the latest best practices and assistance, reach out to the Curve development team.

* * *

* * *

4  Creating Gauges for CRV Rewards
----------------------------------

Once your LlamaLend market is deployed you can attach a liquidity‑gauge so LP tokens earn CRV (and, optionally, extra incentives). The deployment flow depends on the network where the market lives.

### Markets on Ethereum Mainnet

The main‑net flow is a single call:

1.  Open the [**Liquidity Gauge Factory**](https://etherscan.io/address/0xabC000d88f23Bb45525E447528DBF656A9D55bf5#writeContract) contract on Ethereum.
    
2.  Call `deploy_gauge`, passing the address of the market’s LP‑token (that is, the LlamaLend market contract itself).
    

After the transaction confirms, the gauge immediately begins streaming CRV according to global inflation weights.

### Markets on Side‑chains (L2 & alt‑L1)

For Arbitrum, Optimism, Fraxtal and other non‑main‑net chains you need a two‑step “child + root” deployment.

* * *

#### 1  Deploy the **Child Gauge** on the side‑chain

1.  Locate the network’s `ChildLiquidityGaugeFactory` address.  
    _Open the factory’s contract page and read_ `gauge_factory` _if you are unsure (Factory addresses are above in the text)_ _._
    
    ![](https://storage.googleapis.com/papyrus_images/25608f43ece160e9228ad1d897731836.png)
    
2.  In the factory UI choose `deploy_child_gauge` — use variant #3 for a simple gauge or variant #4 if you want manager rights.
    

Parameters for both variants

*   `_chain_id` — numeric chain‑ID (e.g. 42161 for Arbitrum).
    
*   `_lp_token` — address of the LlamaLend market.
    
*   `_salt` — any 32‑byte value; **save it for step 2**.
    

Additional field in variant #4

*   `_manager` — your own address; gives you on‑chain permission to add or deposit extra rewards without a DAO vote.
    

![](https://storage.googleapis.com/papyrus_images/474c6892122e3f68d5f778166e7dbcbf.png)

* * *

#### 2  Deploy the **Root Gauge** on Ethereum

1.  Go to **RootLiquidityGaugeFactory** at `0xabC000d88f23Bb45525E447528DBF656A9D55bf5`.
    
2.  Call `deploy_gauge` (function #2).
    
    *   `payableAmount` → `0` (no ETH required).
        
    *   `_chain_id` → same ID you used above.
        
    *   `_salt` → **exactly** the same 32‑byte value you passed to the child gauge.
        
    
    ![](https://storage.googleapis.com/papyrus_images/069d4c486e4ab72be1250fe8c5fcef00.png)
    

> **Important:** use the **same wallet address** and the **same** `_salt` for both calls; that ensures the child and root gauges share an identical address on their respective chains and link correctly.

* * *

### Generating the `_salt`

Any 32‑byte hex string works, for example:

Store it securely—you will need it if you ever redeploy.

### The `_manager` address

Setting `_manager` to your wallet lets you:

*   call `add_reward` to whitelist new reward tokens,
    
*   use `deposit_reward_token` to fund those tokens,
    
*   change other gauge parameters without a full Curve DAO vote. )
    

Choosing variant #4 with your own manager address is therefore recommended for markets that may later distribute extra incentives besides CRV.

* * *

### Extra Capabilities

After deployment the manager can at any time:

*   add third‑party reward tokens (`add_reward`),
    
*   deposit those tokens (`deposit_reward_token`).
    

When both gauges are active, submit a DAO proposal to list the gauge in the **Gauge Controller** so that veCRV voters can assign inflation weight. See Curve’s governance portal for recent examples of such proposals.

* * *

* * *

Conclusion
----------

Creating your own market on Curve LlamaLend requires thoughtful planning and technical know‑how, yet it unlocks powerful opportunities for projects and their users. We have seen that the full workflow breaks down into several critical steps:

*   **Preparation & parameter tuning** – this is the foundation of a safe market; always run historical simulations to set values such as `A`, `fee`, `loan_discount`, and `liquidation_discount`.
    
*   **Building or selecting a Curve pool** – serves as the backbone of a reliable price oracle.
    
*   **Deploying a custom oracle when no direct crvUSD pool exists** – lets you integrate practically any asset by chaining pools together.
    
*   **Spinning up the market via OneWay Lending Factory** – a single transaction creates all contracts needed for lending and liquidations.
    
*   **Adding gauges** – an optional, but highly effective, step that streams CRV rewards to liquidity providers.
    

A market’s safety and efficiency depend directly on the chosen parameters. Values like `A`, `fee`, `loan_discount`, and `liquidation_discount` determine liquidation behaviour, while the borrow‑rate band (`min_borrow_rate` and `max_borrow_rate`) shapes the market’s economic incentives.

Although some phases are technically involved, Curve’s permissionless model and open‑source tooling make custom lending markets accessible to a broad range of teams. [resources.curve.fi](http://resources.curve.fi) Once your market is live, continuous monitoring is essential: utilisation, liquidity depth, and oracle health all need periodic checks to keep the market resilient throughout its life‑cycle.

By following these guidelines, projects can safely integrate their token into one of DeFi’s most battle‑tested ecosystems and offer users sustainable, CRV‑boosted yields.

---

*Originally published on [Curve Finance Unofficial](https://paragraph.com/@curvefi/llamalend_market_deploy)*
