Open the counterBuy $MONTE
Docs · Monte

Pawn your bags. Nothing gets sold.

Monte lends USDC against memes, Solana majors and tokenised stocks. Every loan is a ticket with one price to redeem and one date. Nothing reads the market until that date, so nothing can sell the bag before it.

Introduction

A pawnshop never cared what your watch was worth on Tuesday. It wrote a number and a date on a ticket, and the watch sat behind the counter until you came back or didn’t. Monte is that counter for a wallet.

You pledge a bag. The House lends you a share of its value in USDC, less a 1% fee. The ticket says what it costs to redeem and by when. Between those two moments there is no oracle, no health factor and no keeper waiting for a wick. On the date you either redeem and take the bag home, or keep the USDC and walk out.

Quick start

  1. Open the counter and pick a bag. Memes lend up to 50% of value, Solana majors up to 65%, tokenised stocks up to 80%.
  2. Enter an amount and a term: 7 or 21 days.
  3. Drag how much to take. The ticket shows what you receive, what redeems it and the fall at which walking away pays better.
  4. Write the ticket. One transaction moves the bag into escrow and the USDC into your wallet.

Or quote it from code:

import { quote } from "https://montepawn.vercel.app/lib/monte.js";

const t = quote({ value: 1000, tier: "meme", days: 7, ratio: 0.5, vol: 0.05 });
console.log(t.get, t.redeem, t.due);   // 495 506.61 "2026-11-11T…"
# the module is a plain file, read it before you import it
curl -s https://montepawn.vercel.app/lib/monte.js | head -40

# the book of collateral the site reads (21 days of 4-hour closes)
curl -s https://montepawn.vercel.app/assets/book.json | head -c 400
<script type="module">
  import { quote } from "https://montepawn.vercel.app/lib/monte.js";
  const t = quote({ value: 1000, tier: "stock", days: 21, ratio: 0.8, vol: 0.02 });
  document.body.append("Redeem for " + t.redeem + " USDC by " + t.due);
</script>

How a ticket works

A ticket is written once, when the House funds it. After that nothing on it changes.

FieldSet byChanges after funding
Pledgedyounever
Lentyou, up to the tier’s share of valuenever
You receivelent minus the 1% fee (0.5% for holders)never
Redeem forlent × (1 + cost)never
Byfunding time + 7 or 21 days, to the secondnever
Price read until then—never read

Life of a ticket

StateWhat happens
listedYou sign the ticket. The bag waits in escrow for the House to fund it.
fundedThe House pays you in the same instruction. The fee is split, the buyback runs. The date starts counting.
redeemedYou paid the redeem price before the date. The bag goes home.
walkedThe date passed unpaid. The pledge moves to the House and the shares that funded it.
NOTEYou can redeem any time before the date, not only on it. The price is the same on day one and on the last second.

Pricing

The cost of a ticket comes from the bag’s own swings. A calm stock costs little, a meme that moves 6% a day costs more. The House never lends below its floor of 10% a year.

termVol = dailyVol × √days cost = max( 0.10 × days / 365 , 0.4 × termVol × ratio² ) lent = value × ratio get = lent − lent × fee fee = 1% (0.5% for holders) redeem = lent × (1 + cost) walk = 1 − redeem / value the fall at which walking out pays better

dailyVol is the standard deviation of 4-hour log returns over the last 21 days, scaled to a day. Taking a smaller share of the value makes the ticket much cheaper, because cost grows with the square of the ratio.

Example

$1,000 of BONK, 50%, 7 days, daily volatility 5.2%: term volatility is 13.8%, cost is 1.37%, you receive 495.00 USDC and redeem for 506.88. Walking away pays better only if BONK falls more than 49.3% by the date.

The two doors

On the date the ticket offers exactly two outcomes. Both are the deal working.

If, on the dateYou doYou end with
the bag is worth more than the redeem pricepay the redeem pricethe bag, every bit of its upside
the bag is worth less than the redeem pricenothingthe USDC you took. The House keeps the pledge.

Walking out is not a default. There is no debt left, no penalty and no mark on the wallet. It is the other door.

No liquidation

A lender that reads a price opens a loan at some share of the bag’s value and sells the bag when the debt passes a line. At 55% with a 65% line, a 15.4% fall is enough. It sells at the bottom of whatever candle crossed the line, and the borrower never gets the bag back, even if the price is home an hour later.

sold when 1 − price / openPrice ≥ 1 − ltv / line 1 − 0.55 / 0.65 = 15.4%

A Monte ticket has no line. The only clock is the date. This week shows, for every bag Monte takes, whether a price-reading loan would have been sold in the last seven days.

The House

The House is a USDC vault. It funds tickets whole and only by its own rules. Every ticket’s fixed cost reaches the shares over its term. When a borrower walks out, the pledge stays in the House and the shares that funded that ticket claim it in kind.

RuleValue
Fixed cost floor10% a year
Most per ticket5,000 USDC
Most against one token25% of the House
Kept as cash10%
Longest term21 days
House fee10% of returns
Loosening a rulewaits 3 hours in public
Tightening a ruleapplies at once
WARNINGMemes can go to zero. When a borrower walks out of a ticket on a bag that fell 90%, the House is paid in that bag.

Collateral

TierUp toBags
Memes50%WIF, BONK, FARTCOIN, POPCAT, PENGU, USELESS, SPX, GIGA, MEW, CHILLGUY, PNUT, MOODENG
Solana65%SOL, JUP, PYTH, RAY
Stocks80%NVDAx, TSLAx, SPYx, AAPLx, GOOGLx, METAx, AMZNx, MSTRx, COINx, QQQx, HOODx

Every bag is read by its mint and its deepest pool. Mints and pools sit in book.json.

Ledger and the week

The ledger on the home page shows the House’s USDC, tickets written and $MONTE melted, then the last entries. Until the first ticket is listed it shows the book it reads: how many bags, when their candles were read, and how many a price-reading lender would have sold this week.

/week reads the last 21 days of 4-hour closes for every bag from GeckoTerminal when you open it, takes the last seven days and finds the worst fall from a close to any later close. If the live read fails, it uses the saved book and says so.

The module

monte.js is the whole rule in one small file with no dependencies. The site imports it, and so can you or an agent: from this address in a browser, or saved as monte.mjs in Node 19+.

import { quote, settle, lenderSells, week, dailyVol,
         fetchPrices, fetchCandles, loadBook, freshBook, RULE, TIERS }
  from "https://montepawn.vercel.app/lib/monte.js";
<script type="module" src="https://montepawn.vercel.app/lib/monte.js"></script>
ExportDoes
quote(t)writes a ticket: lent, fee, get, redeem, cost, due, walkAwayUnder
settle(ticket, valueThen)picks the door on the date
dueDate(days, from)funding time plus the term
dailyVol(closes)daily volatility from 4-hour closes
worstFall(closes)worst fall from a close to a later close
lenderSells(closes, ltv, line, start)when a price-reading loan would have sold the bag
week(closes, ltv, line)the last seven days, opened at the high
fetchPrices(mints)live USD prices from DexScreener
fetchCandles(pool, limit)4-hour candles from GeckoTerminal
loadBook(url) · freshBook(book)the saved book, and the same book with fresh candles

quote and settle

JS
const ticket = quote({
  value: 1000,      // USD value of the bag now
  tier: "meme",     // "meme" | "sol" | "stock"
  days: 21,         // 7 | 21
  ratio: 0.5,       // share of value to lend, capped by the tier
  vol: 0.053,       // daily volatility
  holder: false     // true if the wallet holds 1,000,000 $MONTE
});
// { lent: 500, fee: 5, get: 495, redeem: 512.14, cost: 0.0243,
//   days: 21, ratio: 0.5, due: "2026-11-25T…", walkAwayUnder: 0.4878 }

settle(ticket, 720);   // { door: "redeem", pay: 512.14, keep: "the bag", net: 207.86 }
settle(ticket, 380);   // { door: "walk", pay: 0, keep: 495, net: 115 }

net on the redeem door is what the bag is worth above the price you pay. On the walk door it is what you kept above what the bag is worth then.

lenderSells and week

JS
const book = await loadBook("https://montepawn.vercel.app/assets/book.json");
const fart = book.tokens.find((t) => t.sym === "FARTCOIN");
const closes = fart.c.map((x) => x[1]);

lenderSells(closes, 0.55, 0.65, 0);   // { sold: true, at: 59, fall: 0.2204, trigger: 0.1538 }
week(closes);                          // { fall: 0.1462, from: 0, to: 33, sold: false, trigger: 0.1538 }

lenderSells opens a loan at the close start and walks forward. week takes the last 42 closes (seven days of 4-hour candles) and asks the harder question: what if the loan had been opened at the week’s high.

Market data

Two public sources, no key. Both answer browsers directly.

FunctionSourceNotes
fetchPricesDexScreener /tokens/v1/solana/30 mints per call, the deepest pair wins
fetchCandlesGeckoTerminal /pools/…/ohlcv/hour?aggregate=4about 30 calls a minute per visitor
freshBookGeckoTerminal, all pools in parallelkept 10 minutes in sessionStorage
const prices = await fetchPrices(["DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263"]);
const candles = await fetchCandles("5zpyutJu9ee6jFymDGoK7F6S5Kczqtc9FomP3ueKuyA9");
// candles: [[time, close, high, low], …] oldest first
curl -s "https://api.dexscreener.com/tokens/v1/solana/DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263"
curl -s "https://api.geckoterminal.com/api/v2/networks/solana/pools//ohlcv/hour?aggregate=4&limit=126"

Constants

RULEValueMeaning
terms[7, 21]days
fee0.01once, at funding
holderFee0.005with 1,000,000 $MONTE
floorApr0.10the cheapest the House lends
volWeight0.4share of term volatility charged
minTicket · maxTicket10 · 5,000USDC
maxPerToken0.25share of the House against one token
cash0.10kept unlent
loosenDelay10,800seconds a loosened rule waits
burnShare0.5share of every fee that buys and melts $MONTE
houseFee0.10of the House’s returns

TIERS: meme 0.50 · sol 0.65 · stock 0.80.

Errors

Every error is a MonteError with a code.

CodeWhen
E_TIERtier is not meme, sol or stock
E_TERMterm is not 7 or 21 days
E_VALUEthe bag is worth nothing
E_RATIOratio is zero or below
E_SMALLlent under 10 USDC
E_LARGElent over 5,000 USDC
E_FETCHa data source did not answer

Try it

Live prices and fresh candles, through the same module the counter uses. Pick a price for the date to see which door opens.

// press Quote

Risks and limits

  • The House carries the fall. A ticket that walks out on a bag that fell hard pays the House in that bag. Lenders choose this; the tiers and the per-token cap limit it.
  • You carry the date. If you forget the date, the ticket walks out for you, even if the bag is worth twice the redeem price.
  • Prices at writing. The value used to quote comes from the market when the ticket is written. A thin pool can be moved for a moment; the per-ticket cap keeps that small.
  • Tokenised stocks follow their own market hours and issuer rules. The ticket ignores both until the date.
  • Public data. DexScreener and GeckoTerminal can be slow or down. The site falls back to the saved book and says so.
WARNINGNothing here reads a price before the date. That protects the bag from a wick. It does not protect anyone from a bag that never comes back.

$MONTE

The 1% fee is paid in the same instruction that funds a ticket, and split on chain. Half of it only ever buys $MONTE on the market and melts it. Holders of 1,000,000 $MONTE open tickets at 0.5%.

ticket ──1%──▶ fee ──▶ buyback ──▶ $MONTE ──▶ melt ✶

Contract: soon

FAQ

What if the bag doubles?

Redeem it. The price on the ticket did not move, so the whole rise is yours.

What if it goes to zero?

Keep the USDC. You owe nothing, and the House keeps a bag worth nothing. That is the price the House charges for.

Can I redeem early?

Yes, any time before the date, at the same price.

Can I extend a ticket?

Redeem it and write a new one. A new ticket is priced from the bag’s swings on that day.

Why is my meme more expensive than a stock?

Cost follows the bag’s own daily swings. Memes swing more, so the House charges more for promising not to look.