Skip to main content

Post-Creation Checklist

After creating your market, complete these steps before it’s production-ready:
1

Add Reserves

Add token reserves so the market can accept deposits and loans. See Reserve Management.
2

Configure Oracle Feeds

Each reserve requires an oracle price feed. Use get-oracle-mappings to find the correct Scope, Pyth, or Switchboard oracle IDs for each token.
3

Transfer Ownership to Multisig

Transfer market ownership to a Squads multisig before the market goes live. This is required for all production markets.

Adding Reserves

Add token reserves to enable lending and borrowing for specific assets.

Reserve Configuration

Create a reserve configuration JSON file defining the reserve parameters.
{
  "status": 0,
  "loanToValuePct": 65,
  "liquidationThresholdPct": 75,
  "minLiquidationBonusBps": 500,
  "protocolLiquidationFeePct": 0,
  "protocolOrderExecutionFeePct": 0,
  "protocolTakeRatePct": 0,
  "assetTier": 0,
  "multiplierSideBoost": [1, 1],
  "maxLiquidationBonusBps": 1000,
  "badDebtLiquidationBonusBps": 99,
  "fees": {
    "borrowFee": "0",
    "flashLoanFee": "0",
    "padding": [0, 0, 0, 0, 0, 0, 0, 0]
  },
  "depositLimit": "6000000000000000",
  "borrowLimit": "5400000000000000",
  "tokenInfo": {
    "name": "SOL",
    "heuristic": {
      "exp": "0",
      "lower": "0",
      "upper": "0"
    },
    "maxTwapDivergenceBps": "4050",
    "maxAgePriceSeconds": "120",
    "maxAgeTwapSeconds": "240",
    "scopeConfiguration": {
      "priceFeed": "3NJYftD5sjVfxSnUdZ1wVML8f3aC6mp1CXCL6L7TnU8C",
      "priceChain": [0, 65535, 65535, 65535],
      "twapChain": [52, 65535, 65535, 65535]
    },
    "switchboardConfiguration": {
      "priceAggregator": "11111111111111111111111111111111",
      "twapAggregator": "11111111111111111111111111111111"
    },
    "pythConfiguration": {
      "price": "11111111111111111111111111111111"
    },
    "blockPriceUsage": 0
  },
  "borrowRateCurve": {
    "points": [
      { "utilizationRateBps": 0, "borrowRateBps": 1 },
      { "utilizationRateBps": 7000, "borrowRateBps": 400 },
      { "utilizationRateBps": 9100, "borrowRateBps": 600 },
      { "utilizationRateBps": 9300, "borrowRateBps": 1000 },
      { "utilizationRateBps": 9500, "borrowRateBps": 2000 },
      { "utilizationRateBps": 9700, "borrowRateBps": 4000 },
      { "utilizationRateBps": 10000, "borrowRateBps": 8000 },
      { "utilizationRateBps": 10000, "borrowRateBps": 8000 },
      { "utilizationRateBps": 10000, "borrowRateBps": 8000 },
      { "utilizationRateBps": 10000, "borrowRateBps": 8000 },
      { "utilizationRateBps": 10000, "borrowRateBps": 8000 }
    ]
  },
  "depositWithdrawalCap": {
    "configCapacity": "400000000000000",
    "currentTotal": "0",
    "lastIntervalStartTimestamp": "0",
    "configIntervalLengthSeconds": "86400"
  },
  "debtWithdrawalCap": {
    "configCapacity": "400000000000000",
    "currentTotal": "0",
    "lastIntervalStartTimestamp": "0",
    "configIntervalLengthSeconds": "86400"
  },
  "deleveragingMarginCallPeriodSecs": "604800",
  "borrowFactorPct": "125",
  "elevationGroups": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
  "autodeleverageEnabled": 1,
  "deleveragingBonusIncreaseBpsPerDay": 100,
  "deleveragingThresholdDecreaseBpsPerDay": "24",
  "multiplierTagBoost": [1, 1, 1, 1, 1, 1, 1, 1],
  "disableUsageAsCollOutsideEmode": 0,
  "utilizationLimitBlockBorrowingAbovePct": 80,
  "hostFixedInterestRateBps": 0,
  "borrowLimitOutsideElevationGroup": "18446744073709551615",
  "borrowLimitAgainstThisCollateralInElevationGroup": [
    "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0",
    "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"
  ],
  "reserved1": [0, 0]
}
View Reserve Config Example

Get Oracle Mappings

Before configuring a reserve’s tokenInfo, retrieve the correct oracle IDs for each token.
yarn kamino-manager get-oracle-mappings
This returns Scope, Pyth, and Switchboard oracle addresses. Use the appropriate IDs in the reserve config’s tokenInfo.scopePriceChain, tokenInfo.pythPrice, or tokenInfo.switchboardPriceAggregator fields.

Add Reserve to Market

1

Add Asset

yarn kamino-manager add-asset-to-market \
  --market <MARKET_ADDRESS> \
  --mint <TOKEN_MINT> \
  --mint-program-id TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA \
  --reserve-config ./configs/my_reserve_config.json \
  --mode execute
The mint-program-id shown is the standard SPL Token program ID. Use this for most tokens unless working with Token-2022 extensions.
2

Verify Reserve

Check the Solana Explorer to verify the reserve was created successfully. The transaction signature is in the command output.
Repeat for each reserve you want to add. See Reserve Management for updating reserve configs after creation.

Transferring Market Ownership

Transfer market ownership from an admin wallet to a multisig account for enhanced security.
All production markets must be owned by a multisig once they are publicly used and maintained. While preparing configurations and adding reserves is faster with a hot wallet, production markets must be transferred to multisig ownership.
The transfer uses a two-step process:
1

Set New Owner

Update the lending_market_owner_cached field in the market config to the new admin address (typically a Squads multisig), then apply it:
yarn kamino-manager update-market-config \
  --market <MARKET_ADDRESS> \
  --market-config ./configs/market_with_new_owner.json \
  --mode execute
2

Finalize Transfer

Complete the ownership transfer by promoting the cached address to the active owner:
yarn kamino-manager update-lending-market-owner \
  --lending-market <MARKET_ADDRESS> \
  --mode execute
This command can only be executed by the current lending_market_owner_cached and sets lending_market_owner to that cached address.
Ensure the new owner address is correct before transferring. Loss of market ownership cannot be easily reversed.

Post-Transfer: Multisig Mode

Once ownership is transferred, use --mode multisig for all subsequent operations:
yarn kamino-manager update-reserve-config \
  --market <MARKET_ADDRESS> \
  --reserve <RESERVE_ADDRESS> \
  --reserve-config ./configs/config.json \
  --mode multisig
We recommend using Squads with a hardware wallet for multisig management.

Learn More

For the complete CLI reference, see Market Operations — CLI and CLI Installation & Setup.