The following is an explanation of the motivations behind the various design elements of openLend, starting from a toy lending primitive and expanding into the actual openLend structure.
Imagine a lending protocol where a borrower requests a loan by specifying an interest rate, loan amount, and term. They also specify collateral token, borrow token, and collateral amount. The request is live after they deposit their collateral into the smart contract.Any lender can accept this request, sending loan amount of borrow token to the borrower. If the borrower doesn’t pay back the loan plus interest by the end of the term, they forfeit the entire collateral amount to the lender.Without a way to liquidate an underwater loan, the borrower has an option just before the term ends. If the collateral is worth more than the loan plus interest, they pay back the debt and receive their collateral. If the collateral is worth less, they don’t pay back the debt, and the lender receives less value than they were owed.In principle, this design can work, so long as the loan starts with enough buffer between the collateral and loan amounts over the given term, because it is unlikely the collateral value falls enough that the borrower exercises their option. On the other hand, the design struggles with capital efficiency and cost: borrowers lock up excess collateral and lenders demand higher interest rates to compensate for tail risk.
If the lender is able to claim the borrower’s collateral when the loan is underwater, tail risk drops. Borrowers are able to get loans using less collateral than before, and lenders don’t demand exorbitant rates.Typically, the loan’s underwater status includes a haircut, often called a liquidation threshold. For example, if only 85% of the collateral is counted against debt, the lender has an equity buffer of ~15% when they are first able to claim collateral.
Deciding when the loan is underwater requires a price oracle. Many are familiar with popular solutions: Chainlink, Pyth, and AMM-derived (e.g. Uniswap v3 TWAP) to name a few.Using one of these price oracles can be simple: when the price oracle says the loan is underwater, the lender can claim the collateral.Popular solutions have their limitations, however. Chainlink-style price oracles trust a whitelisted and KYC’d committee of reporters.While AMM-derived price oracles have fewer trusted third parties, they still struggle with multi-block MEV and security scaling. You can think of security scaling as a question: to what extent is liquidity in the price oracle a stable function of liquidity in the downstream dependent position? For example, AMM liquidity can either vanish or be too small to secure very large positions.In openLend, we use openOracle as our price oracle, which is a permissionless, time-locked limit order escalation game. A price report is capital posted to trade both ways at a quoted price, and to take one of the orders (dispute) you have to replace both, larger, at a new price of your choosing. When the most recent orders survive for long enough, the price is considered valid.In openLend, the borrower can decide exactly how much liquidity their oracle game starts with, so they can scale security to the size of their collateral. Also, where a single bad trade can poison an AMM oracle’s observation history, a dispute in openOracle fully replaces the price state, so a false report only survives if every valid dispute is censored across the entire settlement window. Lenders underwrite the oracle terms and incorporate the implications of the game into their minimum interest rate.Now we update the toy lending design: once the lender thinks the collateral is underwater, they create an oracle game with the initial report attesting to that underlying price, adhering to the borrower’s size requirement. If the game ends implying the loan is underwater, the lender can claim the collateral. If not, the loan continues unabated.
Without a way to repay debt or top up collateral before the term ends, the borrower is in a dangerous position. If their collateral value falls far enough, they lose the equity buffer above the liquidation threshold. The borrower is back to needing excessive collateral for safety.Allowing the borrower to repay debt or top up collateral before the term reduces the capital requirement.
In isolation the oracle game is costly. Starting a game implies locking two limit orders for the oracle’s settlement time, typically 30 minutes or more. If the market price of those two assets moves enough, your stale price is traded against.If the borrower can cure their position after the liquidation report is on-chain, the lender can be griefed, since they can lose money in the oracle game with no real chance of earning the collateral’s equity buffer.Accordingly, we freeze the borrower’s position until the oracle game completes, meaning they cannot repay debt or top up collateral until then.
Freezing the borrower’s position during liquidation introduces a denial-of-service vector. Each new oracle report in a given liquidation game refreshes the freeze timer.DoS is primarily mitigated by three factors: oracle game fees, escalation, and a liquidator stake.An oracle game timer refresh implies one of the previous orders was traded against, on which we can levy oracle game fees. We can then split the accrued fees between lender and borrower.Escalation enables geometric growth in oracle game fees, since each new oracle round’s posted sizes must be larger than the last, e.g. 1.4x each round.The first round of the oracle game is not a swap: the lender simply posts the orders, so there is no fee to levy. Instead, we will use a liquidator stake. Any time a loan is liquidated, the lender must wager some percentage of the borrower’s collateral that the liquidation will resolve successfully. If the borrower’s position is not liquidated after the oracle game completes, the lender forfeits the stake into the borrower’s collateral.The combination of these three factors can make spurious denial-of-service a net benefit to the borrower.DoS at the end of a term (prevent repayment until the term expires so the lender claims all collateral) is mitigated with a grace period: if a liquidation oracle game finishes close to (or past) the term’s end, the borrower is granted a grace period to cure their loan.A borrower may want to think twice about using this feature to extend their own term, since the geometrically growing oracle game fees are split with the lender.
In our current toy model, the borrower specifies an interest rate, but since they can repay debt at any point, this introduces an option problem: if the market interest rate drops, the borrower can repay debt fully, then initiate a new borrow at the now-lower market rate. If the market rate rises, they do nothing, benefiting from the lower-than-market rate on their loan. The lender must incorporate this option value into their minimum interest rate, increasing costs for borrowers who don’t intend to be active.If we require that the borrower pay full-term interest no matter when they repay, the option value goes away, but this decreases the borrower’s flexibility by adding a guaranteed prepayment penalty.Instead of picking a side, we allow the borrower to choose what fraction of the full-term interest they commit to paying. If the borrower wants more flexibility, they pay for it in higher rates. Committed interest is factored into total debt for the purpose of liquidation immediately upon loan origination to remove a second borrower option: escaping committed interest in tail price scenarios.The toy model’s interest rate architecture still has a problem. How can the borrower know the fair market rate for their bespoke loan configuration? If set too low, no one will lend. If set too high, they get a bad deal. The borrower is filled on average at worse-than-market rates.To solve this, we use a Dutch auction: the borrower’s interest rate starts low and increases over time on a curve, up to a max rate. The first lender to originate the loan locks in the rate at that time. This way the lending market reveals the true market-clearing rate at its lowest possible level.
The toy lending protocol has matured, but there are still some ergonomic issues. Currently a borrower must fully repay debt and request a new deal to extend their loan, borrow more, or withdraw excess collateral. This has unnecessary capital requirements and friction.Here we introduce refinancing: a borrower can request a refinance during the loan’s term. A lender accepting the request pays out the previous lender fully and a new loan starts. The borrower can choose to borrow more or withdraw excess collateral as well as change other loan terms.The payout to the previous lender includes committed interest, so refinancing does not allow a borrower to dodge the floor interest mechanic. Refinancing after the prepayment penalty window seamlessly rolls debt with no penalty.
Thus far, the lender is fully responsible for initiating liquidations. If instead the lender would prefer to outsource this function, they can. Upon accepting a request, they specify a fraction of the equity buffer awarded to any third-party liquidator.The third-party liquidator must front the liquidator stake and oracle initial report liquidity but shares in the upside. They are also granted a share of geometric oracle game fees, along with lender and borrower.If the lender would like to handle liquidations themselves, they can set the third-party share to 0.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"openOracle","colors":{"primary":"#00CF9C","light":"#00CF9C","dark":"#0a0a0a"},"logo":{"light":"https://mintcdn.com/openoracle/U4lTbao-51w4qpSW/logo-light.svg?fit=max\u0026auto=format\u0026n=U4lTbao-51w4qpSW\u0026q=85\u0026s=7cab4632108a10d7783fa0566fef0f8b","dark":"https://mintcdn.com/openoracle/U4lTbao-51w4qpSW/logo-dark.svg?fit=max\u0026auto=format\u0026n=U4lTbao-51w4qpSW\u0026q=85\u0026s=f76e5ef59387ce6616220541932ed8b0"},"favicon":"https://mintcdn.com/openoracle/TDFh-vE_gIrVCTZK/favicon-docs.svg?fit=max\u0026auto=format\u0026n=TDFh-vE_gIrVCTZK\u0026q=85\u0026s=fb54dc620a157a63cd933254487b4c59","seo":{"metatags":{"og:image":"https://docs.openoracle.org/og-docs.png","og:image:width":"1200","og:image:height":"630","og:image:type":"image/png","twitter:image":"https://docs.openoracle.org/og-docs.png","twitter:image:width":"1200","twitter:image:height":"630"}},"fonts":{"heading":{"family":"Berkeley Mono","weight":700,"source":"public/fonts/Berkeley Mono Variable.woff2","format":"woff2"}},"styling":{"latex":true},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"openoracle","hasAudioNarration":false,"actualSubdomain":"openoracle","customDomains":["docs.openoracle.org"],"gitSource":{"type":"github","owner":"openoracleproject","repo":"openoracle-monorepo","deployBranch":"main","contentDirectory":"documentation","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6ae20246f9cefd8f8d7a4970","collectionId":"d21dfaaa-7bf0-411b-aee7-12c64fc49891","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ae20246f9cefd8f8d7a4970"},"entitlements":{},"buildId":"6ae20246f9cefd8f8d7a4970","clientVersion":"0.0.4021","searchFilterCounts":[{"language":"default","tag":"openPunt","count":19},{"language":"default","tag":"openLend","count":16},{"language":"default","tag":"openOracle","count":15},{"language":"default","tag":"Resources","count":9},{"language":"default","tag":"Contract Reference","count":8},{"language":"default","tag":"openSwap","count":8},{"language":"default","tag":"Introduction","count":6},{"language":"default","tag":"Documentation","count":6},{"language":"default","tag":"Technical Details","count":6},{"language":"default","tag":"Unique mechanics","count":6}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"per-site-search-delta","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-private-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[{"filePath":"custom.css","href":"/_mintlify/custom/openoracle/fb0f5ea2f4587486/custom.css"}],"page":{"pagePath":"openlend/motivations","slug":"/openlend/motivations","pageMetadata":{"title":"Motivations","description":null,"href":"/openlend/motivations"},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,p:`p`,..._provideComponents(),...props.components},{Heading}=_components;if(!Heading)_missingMdxReference(`Heading`,true);return _jsxs(_Fragment,{children:[_jsx(_components.p,{children:`The following is an explanation of the motivations behind the various design elements of openLend, starting from a toy lending primitive and expanding into the actual openLend structure.`}),`\n`,_jsx(Heading,{level:`2`,id:`simple-lending-protocol`,children:`Simple lending protocol`}),`\n`,_jsx(_components.p,{children:`Imagine a lending protocol where a borrower requests a loan by specifying an interest rate, loan amount, and term. They also specify collateral token, borrow token, and collateral amount. The request is live after they deposit their collateral into the smart contract.`}),`\n`,_jsx(_components.p,{children:`Any lender can accept this request, sending loan amount of borrow token to the borrower. If the borrower doesn’t pay back the loan plus interest by the end of the term, they forfeit the entire collateral amount to the lender.`}),`\n`,_jsx(_components.p,{children:`Without a way to liquidate an underwater loan, the borrower has an option just before the term ends. If the collateral is worth more than the loan plus interest, they pay back the debt and receive their collateral. If the collateral is worth less, they don’t pay back the debt, and the lender receives less value than they were owed.`}),`\n`,_jsx(_components.p,{children:`In principle, this design can work, so long as the loan starts with enough buffer between the collateral and loan amounts over the given term, because it is unlikely the collateral value falls enough that the borrower exercises their option. On the other hand, the design struggles with capital efficiency and cost: borrowers lock up excess collateral and lenders demand higher interest rates to compensate for tail risk.`}),`\n`,_jsx(Heading,{level:`2`,id:`liquidations`,children:`Liquidations`}),`\n`,_jsx(_components.p,{children:`If the lender is able to claim the borrower’s collateral when the loan is underwater, tail risk drops. Borrowers are able to get loans using less collateral than before, and lenders don’t demand exorbitant rates.`}),`\n`,_jsx(_components.p,{children:`Typically, the loan’s underwater status includes a haircut, often called a liquidation threshold. For example, if only 85% of the collateral is counted against debt, the lender has an equity buffer of ~15% when they are first able to claim collateral.`}),`\n`,_jsx(Heading,{level:`2`,id:`price-oracle`,children:`Price oracle`}),`\n`,_jsx(_components.p,{children:`Deciding when the loan is underwater requires a price oracle. Many are familiar with popular solutions: Chainlink, Pyth, and AMM-derived (e.g. Uniswap v3 TWAP) to name a few.`}),`\n`,_jsx(_components.p,{children:`Using one of these price oracles can be simple: when the price oracle says the loan is underwater, the lender can claim the collateral.`}),`\n`,_jsx(_components.p,{children:`Popular solutions have their limitations, however. Chainlink-style price oracles trust a whitelisted and KYC’d committee of reporters.`}),`\n`,_jsxs(_components.p,{children:[`While AMM-derived price oracles have fewer trusted third parties, they still struggle with `,_jsx(_components.a,{href:`https://eprint.iacr.org/2022/445.pdf`,children:`multi-block MEV`}),` and security scaling. You can think of security scaling as a question: to what extent is liquidity in the price oracle a stable function of liquidity in the downstream dependent position? For example, AMM liquidity can either vanish or be too small to secure very large positions.`]}),`\n`,_jsxs(_components.p,{children:[`In openLend, we use `,_jsx(_components.a,{href:`/openoracle/introduction`,children:`openOracle`}),` as our price oracle, which is a permissionless, time-locked limit order escalation game. A price report is capital posted to trade both ways at a quoted price, and to take one of the orders (dispute) you have to replace both, larger, at a new price of your choosing. When the most recent orders survive for long enough, the price is considered valid.`]}),`\n`,_jsx(_components.p,{children:`In openLend, the borrower can decide exactly how much liquidity their oracle game starts with, so they can scale security to the size of their collateral. Also, where a single bad trade can poison an AMM oracle’s observation history, a dispute in openOracle fully replaces the price state, so a false report only survives if every valid dispute is censored across the entire settlement window. Lenders underwrite the oracle terms and incorporate the implications of the game into their minimum interest rate.`}),`\n`,_jsx(_components.p,{children:`Now we update the toy lending design: once the lender thinks the collateral is underwater, they create an oracle game with the initial report attesting to that underlying price, adhering to the borrower’s size requirement. If the game ends implying the loan is underwater, the lender can claim the collateral. If not, the loan continues unabated.`}),`\n`,_jsx(Heading,{level:`2`,id:`repaying-debt-and-topping-up-collateral`,children:`Repaying debt and topping up collateral`}),`\n`,_jsx(_components.p,{children:`Without a way to repay debt or top up collateral before the term ends, the borrower is in a dangerous position. If their collateral value falls far enough, they lose the equity buffer above the liquidation threshold. The borrower is back to needing excessive collateral for safety.`}),`\n`,_jsx(_components.p,{children:`Allowing the borrower to repay debt or top up collateral before the term reduces the capital requirement.`}),`\n`,_jsx(Heading,{level:`2`,id:`freezing-the-loan-during-liquidation`,children:`Freezing the loan during liquidation`}),`\n`,_jsx(_components.p,{children:`In isolation the oracle game is costly. Starting a game implies locking two limit orders for the oracle’s settlement time, typically 30 minutes or more. If the market price of those two assets moves enough, your stale price is traded against.`}),`\n`,_jsx(_components.p,{children:`If the borrower can cure their position after the liquidation report is on-chain, the lender can be griefed, since they can lose money in the oracle game with no real chance of earning the collateral’s equity buffer.`}),`\n`,_jsx(_components.p,{children:`Accordingly, we freeze the borrower’s position until the oracle game completes, meaning they cannot repay debt or top up collateral until then.`}),`\n`,_jsx(Heading,{level:`2`,id:`denial-of-service-and-delay`,children:`Denial-of-service and delay`}),`\n`,_jsx(_components.p,{children:`Freezing the borrower’s position during liquidation introduces a denial-of-service vector. Each new oracle report in a given liquidation game refreshes the freeze timer.`}),`\n`,_jsx(_components.p,{children:`DoS is primarily mitigated by three factors: oracle game fees, escalation, and a liquidator stake.`}),`\n`,_jsx(_components.p,{children:`An oracle game timer refresh implies one of the previous orders was traded against, on which we can levy oracle game fees. We can then split the accrued fees between lender and borrower.`}),`\n`,_jsx(_components.p,{children:`Escalation enables geometric growth in oracle game fees, since each new oracle round’s posted sizes must be larger than the last, e.g. 1.4x each round.`}),`\n`,_jsx(_components.p,{children:`The first round of the oracle game is not a swap: the lender simply posts the orders, so there is no fee to levy. Instead, we will use a liquidator stake. Any time a loan is liquidated, the lender must wager some percentage of the borrower’s collateral that the liquidation will resolve successfully. If the borrower’s position is not liquidated after the oracle game completes, the lender forfeits the stake into the borrower’s collateral.`}),`\n`,_jsx(_components.p,{children:`The combination of these three factors can make spurious denial-of-service a net benefit to the borrower.`}),`\n`,_jsx(_components.p,{children:`DoS at the end of a term (prevent repayment until the term expires so the lender claims all collateral) is mitigated with a grace period: if a liquidation oracle game finishes close to (or past) the term’s end, the borrower is granted a grace period to cure their loan.`}),`\n`,_jsx(_components.p,{children:`A borrower may want to think twice about using this feature to extend their own term, since the geometrically growing oracle game fees are split with the lender.`}),`\n`,_jsx(Heading,{level:`2`,id:`interest-rate`,children:`Interest rate`}),`\n`,_jsx(_components.p,{children:`In our current toy model, the borrower specifies an interest rate, but since they can repay debt at any point, this introduces an option problem: if the market interest rate drops, the borrower can repay debt fully, then initiate a new borrow at the now-lower market rate. If the market rate rises, they do nothing, benefiting from the lower-than-market rate on their loan. The lender must incorporate this option value into their minimum interest rate, increasing costs for borrowers who don’t intend to be active.`}),`\n`,_jsx(_components.p,{children:`If we require that the borrower pay full-term interest no matter when they repay, the option value goes away, but this decreases the borrower’s flexibility by adding a guaranteed prepayment penalty.`}),`\n`,_jsx(_components.p,{children:`Instead of picking a side, we allow the borrower to choose what fraction of the full-term interest they commit to paying. If the borrower wants more flexibility, they pay for it in higher rates. Committed interest is factored into total debt for the purpose of liquidation immediately upon loan origination to remove a second borrower option: escaping committed interest in tail price scenarios.`}),`\n`,_jsx(_components.p,{children:`The toy model’s interest rate architecture still has a problem. How can the borrower know the fair market rate for their bespoke loan configuration? If set too low, no one will lend. If set too high, they get a bad deal. The borrower is filled on average at worse-than-market rates.`}),`\n`,_jsx(_components.p,{children:`To solve this, we use a Dutch auction: the borrower’s interest rate starts low and increases over time on a curve, up to a max rate. The first lender to originate the loan locks in the rate at that time. This way the lending market reveals the true market-clearing rate at its lowest possible level.`}),`\n`,_jsx(Heading,{level:`2`,id:`refinancing`,children:`Refinancing`}),`\n`,_jsx(_components.p,{children:`The toy lending protocol has matured, but there are still some ergonomic issues. Currently a borrower must fully repay debt and request a new deal to extend their loan, borrow more, or withdraw excess collateral. This has unnecessary capital requirements and friction.`}),`\n`,_jsx(_components.p,{children:`Here we introduce refinancing: a borrower can request a refinance during the loan’s term. A lender accepting the request pays out the previous lender fully and a new loan starts. The borrower can choose to borrow more or withdraw excess collateral as well as change other loan terms.`}),`\n`,_jsx(_components.p,{children:`The payout to the previous lender includes committed interest, so refinancing does not allow a borrower to dodge the floor interest mechanic. Refinancing after the prepayment penalty window seamlessly rolls debt with no penalty.`}),`\n`,_jsx(Heading,{level:`2`,id:`outsourcing-liquidations`,children:`Outsourcing liquidations`}),`\n`,_jsx(_components.p,{children:`Thus far, the lender is fully responsible for initiating liquidations. If instead the lender would prefer to outsource this function, they can. Upon accepting a request, they specify a fraction of the equity buffer awarded to any third-party liquidator.`}),`\n`,_jsx(_components.p,{children:`The third-party liquidator must front the liquidator stake and oracle initial report liquidity but shares in the upside. They are also granted a share of geometric oracle game fees, along with lender and borrower.`}),`\n`,_jsx(_components.p,{children:`If the lender would like to handle liquidations themselves, they can set the third-party share to 0.`})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Motivations","description":null,"href":"/openlend/motivations"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Simple lending protocol","slug":"simple-lending-protocol","depth":2,"children":[]},{"title":"Liquidations","slug":"liquidations","depth":2,"children":[]},{"title":"Price oracle","slug":"price-oracle","depth":2,"children":[]},{"title":"Repaying debt and topping up collateral","slug":"repaying-debt-and-topping-up-collateral","depth":2,"children":[]},{"title":"Freezing the loan during liquidation","slug":"freezing-the-loan-during-liquidation","depth":2,"children":[]},{"title":"Denial-of-service and delay","slug":"denial-of-service-and-delay","depth":2,"children":[]},{"title":"Interest rate","slug":"interest-rate","depth":2,"children":[]},{"title":"Refinancing","slug":"refinancing","depth":2,"children":[]},{"title":"Outsourcing liquidations","slug":"outsourcing-liquidations","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":["/_mintlify/custom/openoracle/8d396e0d9fab644d/grain.js"],"subdomain":"openoracle","siteName":"openOracle","title":"Motivations - openOracle","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-17T08:13:22.365Z","originalFileLocation":"openlend/motivations.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"application-name\" content=\"openOracle\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/openoracle/4U7-r7MOZWBqUEI3/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/openoracle/4U7-r7MOZWBqUEI3/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/openoracle/4U7-r7MOZWBqUEI3/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/openoracle/4U7-r7MOZWBqUEI3/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/openoracle/4U7-r7MOZWBqUEI3/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/openoracle/4U7-r7MOZWBqUEI3/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/openoracle/4U7-r7MOZWBqUEI3/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/openoracle/4U7-r7MOZWBqUEI3/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/openoracle/4U7-r7MOZWBqUEI3/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Motivations - openOracle\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"openOracle\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.openoracle.org/openlend/motivations\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://docs.openoracle.org/og-docs.png\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Motivations - openOracle\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://docs.openoracle.org/og-docs.png\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/openoracle/4U7-r7MOZWBqUEI3/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"openOracle\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#00CF9C\">\u003cmeta data-mint-head name=\"og:image:type\" content=\"image/png\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.openoracle.org/openlend/motivations\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/openlend/motivations.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.openoracle.org/#organization\",\"name\":\"openOracle\",\"url\":\"https://docs.openoracle.org\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/openoracle/U4lTbao-51w4qpSW/logo-light.svg?fit=max\u0026auto=format\u0026n=U4lTbao-51w4qpSW\u0026q=85\u0026s=7cab4632108a10d7783fa0566fef0f8b\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.openoracle.org#website\",\"name\":\"openOracle\",\"url\":\"https://docs.openoracle.org\",\"publisher\":{\"@id\":\"https://docs.openoracle.org/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.openoracle.org/openlend/motivations#webpage\",\"url\":\"https://docs.openoracle.org/openlend/motivations\",\"name\":\"Motivations\",\"dateModified\":\"2026-10-17T08:13:22.365Z\",\"isPartOf\":{\"@id\":\"https://docs.openoracle.org#website\"},\"breadcrumb\":{\"@id\":\"https://docs.openoracle.org/openlend/motivations#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.openoracle.org/openlend/motivations#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Introduction\",\"item\":\"https://docs.openoracle.org/openlend/introduction\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Motivations\",\"item\":\"https://docs.openoracle.org/openlend/motivations\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.openoracle.org/openlend/motivations#article\",\"headline\":\"Motivations\",\"name\":\"Motivations\",\"url\":\"https://docs.openoracle.org/openlend/motivations\",\"mainEntityOfPage\":{\"@id\":\"https://docs.openoracle.org/openlend/motivations#webpage\"},\"image\":\"https://docs.openoracle.org/og-docs.png\",\"dateModified\":\"2026-10-17T08:13:22.365Z\",\"publisher\":{\"@id\":\"https://docs.openoracle.org/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.openoracle.org#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"openOracle\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"openOracle","nav":{"global":null,"tabs":[{"tab":"openOracle","pages":[{"title":"openOracle","href":""}]},{"tab":"openSwap","pages":[{"title":"openSwap","href":"/openswap-v2/introduction"}]},{"tab":"openLend","groups":[{"group":"Introduction","pages":[{"title":"openLend","description":null,"href":"/openlend/introduction"},{"title":"Motivations","href":"/openlend/motivations"},{"title":"Oracle game example","description":null,"href":"/openlend/oracle-game-example"}]},{"group":"Borrowing","pages":[{"title":"Overview","href":"/openlend/borrowing-overview"}]},{"group":"Lending","pages":[{"title":"Overview","href":"/openlend/lending-overview"}]},{"group":"Contract Reference","pages":[{"title":"Borrow","href":"/openlend/borrow"},{"title":"Lend","href":"/openlend/lend"},{"title":"Liquidate","href":"/openlend/liquidate"},{"title":"Price oracle","href":"/openlend/price-oracle"},{"title":"Fee receiver","href":"/openlend/fee-receiver"},{"title":"Data provider","href":"/openlend/data-provider"},{"title":"Supported tokens","href":"/openlend/supported-tokens"}]},{"group":"Resources","pages":[{"title":"Contract addresses","href":"/openlend/contracts"},{"title":"GitHub","href":"/openlend/github"},{"title":"Socials","href":"/openlend/socials"}]},{"group":"Legal","pages":[{"title":"ToS \u0026 Disclaimer","href":"/openlend/tos-disclaimer"}]}]},{"tab":"openPunt","pages":[{"title":"openPunt","href":"/punt/introduction"}]}]},"title":"Motivations - openOracle","buildId":"dpl_EnxDqhjaNc9a8MVa833TGULPd9uJ","deploymentId":"dpl_EnxDqhjaNc9a8MVa833TGULPd9uJ","dynamics":[],"chunks":[]}