<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Aggregator on Jeongseup Blog</title><link>https://jeongseup.github.io/tags/aggregator/</link><description>Recent content in Aggregator on Jeongseup Blog</description><generator>Hugo -- gohugo.io</generator><language>en</language><lastBuildDate>Fri, 27 Feb 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://jeongseup.github.io/tags/aggregator/index.xml" rel="self" type="application/rss+xml"/><item><title>Building a Leverage Position Preview for DeFi on Sui</title><link>https://jeongseup.github.io/project/defidash/defidash-preview-leverage/</link><pubDate>Fri, 27 Feb 2026 00:00:00 +0000</pubDate><guid>https://jeongseup.github.io/project/defidash/defidash-preview-leverage/</guid><description>&lt;img src="https://jeongseup.github.io/defidash-logo.jpeg" alt="Featured image of post Building a Leverage Position Preview for DeFi on Sui" /&gt;&lt;blockquote&gt;
&lt;p&gt;How I built &lt;code&gt;previewLeverage&lt;/code&gt; — a read-only preview engine that calculates leveraged lending position metrics across Suilend, Navi, and Scallop, without executing any on-chain transaction.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Team:&lt;/strong&gt; &lt;a class="link" href="https://github.com/curg-13" target="_blank" rel="noopener"
&gt;curg-13&lt;/a&gt; | &lt;strong&gt;SDK:&lt;/strong&gt; &lt;a class="link" href="https://github.com/curg-13/defidash-sdk" target="_blank" rel="noopener"
&gt;defidash-sdk&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="why-preview-before-leverage"&gt;Why Preview Before Leverage?
&lt;/h2&gt;&lt;p&gt;In DeFi lending, &lt;strong&gt;leverage&lt;/strong&gt; means borrowing against your collateral to amplify your position. A 2x leverage on $100 of SUI gives you $200 total exposure — potentially doubling your returns, but also your risk.&lt;/p&gt;
&lt;p&gt;Before users click &amp;ldquo;Confirm&amp;rdquo;, they need to know:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;How much will be borrowed via flash loan?&lt;/li&gt;
&lt;li&gt;What&amp;rsquo;s the liquidation price?&lt;/li&gt;
&lt;li&gt;What&amp;rsquo;s the expected annual return (Net APY)?&lt;/li&gt;
&lt;li&gt;How far can the price drop before liquidation?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That&amp;rsquo;s what &lt;code&gt;previewLeverage&lt;/code&gt; computes — entirely off-chain, using real-time protocol data.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;preview&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;sdk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;previewLeverage&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;protocol&lt;/span&gt;: &lt;span class="kt"&gt;LendingProtocol.Suilend&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;depositAsset&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;SUI&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;depositValueUsd&lt;/span&gt;: &lt;span class="kt"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;multiplier&lt;/span&gt;: &lt;span class="kt"&gt;2.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// preview.netApy → 2.33%
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// preview.liquidationPrice → $0.63
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// preview.priceDropBuffer → 33%
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="glossary-lending-protocol-concepts"&gt;Glossary: Lending Protocol Concepts
&lt;/h2&gt;&lt;p&gt;If you&amp;rsquo;re a developer without DeFi background, here&amp;rsquo;s what you need to know. I&amp;rsquo;m also studying these concepts in depth — check the &lt;strong&gt;Lending Protocol Study&lt;/strong&gt; series for worked examples:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://jeongseup.github.io/p/lending-protocol-study-day1/" &gt;Day 1: DeFi 렌딩의 핵심 개념과 아키텍처&lt;/a&gt; — Pool-based 중개, Share-Based Accounting, Scaled Balance 패턴&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://jeongseup.github.io/p/lending-protocol-study-day2/" &gt;Day 2: Compound V2 Deep Dive와 Aave V3 아키텍처&lt;/a&gt; — Fresh 패턴, Mantissa 연산, 비트맵 스토리지 최적화&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="ltv-loan-to-value"&gt;LTV (Loan-to-Value)
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;LTV&lt;/strong&gt; is the maximum percentage of your collateral&amp;rsquo;s value that you can borrow.&lt;/p&gt;
$$\text{LTV} = \frac{\text{Borrowed Value}}{\text{Collateral Value}}$$&lt;p&gt;If SUI has a 70% LTV on Suilend, depositing $100 of SUI lets you borrow up to $70 of USDC. Each protocol sets different LTV ratios per asset — riskier assets get lower LTV.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Protocol&lt;/th&gt;
&lt;th&gt;SUI LTV&lt;/th&gt;
&lt;th&gt;XBTC LTV&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Suilend&lt;/td&gt;
&lt;td&gt;70%&lt;/td&gt;
&lt;td&gt;60%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Navi&lt;/td&gt;
&lt;td&gt;75%&lt;/td&gt;
&lt;td&gt;67%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scallop&lt;/td&gt;
&lt;td&gt;85%&lt;/td&gt;
&lt;td&gt;75%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;For more details on how Health Factor works with LTV, see &lt;a class="link" href="https://jeongseup.github.io/p/lending-protocol-study-day1/" &gt;Lending Protocol Study Day 1&lt;/a&gt; — the &amp;ldquo;Share-Based Accounting&amp;rdquo; section explains why each protocol tracks collateral differently.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="liquidation-threshold-lt"&gt;Liquidation Threshold (LT)
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Liquidation Threshold&lt;/strong&gt; is the LTV level at which your position gets liquidated. It&amp;rsquo;s always higher than the borrow LTV, creating a safety buffer.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Borrow LTV: 70% → You can borrow up to 70%
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Liq. Threshold: 75% → Liquidation triggers at 75%
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Safety buffer: 5%
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;When the market price drops and your position&amp;rsquo;s actual LTV exceeds the liquidation threshold, a liquidator can repay part of your debt and claim your collateral at a discount.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Liquidation mechanics are a deep topic — the &lt;a class="link" href="https://jeongseup.github.io/p/lending-protocol-study-day2/" &gt;Lending Protocol Study&lt;/a&gt; series covers Compound V2&amp;rsquo;s &lt;code&gt;liquidateBorrowFresh()&lt;/code&gt; and Aave V3&amp;rsquo;s architecture in detail.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="max-multiplier"&gt;Max Multiplier
&lt;/h3&gt;&lt;p&gt;Derived directly from LTV:&lt;/p&gt;
$$\text{Max Multiplier} = \frac{1}{1 - \text{LTV}}$$&lt;p&gt;With 70% LTV → max 3.33x leverage. With 85% LTV → max 6.67x. This is a hard protocol limit — you physically cannot borrow more than what the collateral factor allows.&lt;/p&gt;
&lt;h3 id="flash-loan"&gt;Flash Loan
&lt;/h3&gt;&lt;p&gt;A flash loan is an &lt;strong&gt;uncollateralized loan that must be borrowed and repaid within a single atomic transaction&lt;/strong&gt;. If you don&amp;rsquo;t repay, the entire transaction reverts as if it never happened.&lt;/p&gt;
&lt;p&gt;In our leverage strategy, the flow is:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Flash loan USDC from Scallop&lt;/li&gt;
&lt;li&gt;Swap USDC → deposit asset (e.g., SUI)&lt;/li&gt;
&lt;li&gt;Deposit all collateral to lending protocol&lt;/li&gt;
&lt;li&gt;Borrow USDC from protocol (using deposited collateral)&lt;/li&gt;
&lt;li&gt;Repay flash loan&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;All 5 steps happen in one Sui &lt;a class="link" href="https://docs.sui.io/concepts/transactions/prog-txn-blocks" target="_blank" rel="noopener"
&gt;Programmable Transaction Block (PTB)&lt;/a&gt;. If step 5 fails, everything reverts.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;For more on why Sui&amp;rsquo;s PTB model is ideal for this — see &lt;a class="link" href="https://jeongseup.github.io/p/defidash-technical-journal-day1/" &gt;DefiDash Journal Day 1&lt;/a&gt; where we compare PTB-based atomic leverage vs EVM Flash Loan patterns.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="supply-apy--borrow-apy"&gt;Supply APY &amp;amp; Borrow APY
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Supply APY&lt;/strong&gt;: What you earn by depositing assets. Composed of base interest + reward tokens (e.g., sSUI, DEEP).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Borrow APY&lt;/strong&gt;: What you pay for borrowing. Some protocols give borrowing incentives (rebates).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Net APY&lt;/strong&gt;: The leveraged return on your equity.&lt;/li&gt;
&lt;/ul&gt;
$$\text{Net APY} = \frac{\text{Total Position} \times \text{Supply APY} - \text{Debt} \times \text{Borrow APY}}{\text{Initial Equity}}$$&lt;p&gt;With 2x leverage: if supply APY &amp;gt; borrow APY, your returns are amplified. If not, you&amp;rsquo;re paying more than you earn (negative Net APY).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The interest rate models behind these APYs (JumpRateModel, utilization curves) are covered in &lt;a class="link" href="https://jeongseup.github.io/p/lending-protocol-study-day1/" &gt;Lending Protocol Study Day 1&lt;/a&gt; and &lt;a class="link" href="https://jeongseup.github.io/p/lending-protocol-study-day2/" &gt;Day 2&lt;/a&gt;. Especially the Mantissa-based fixed-point arithmetic in Day 2 is directly relevant to how we parse on-chain rate data.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="liquidation-price"&gt;Liquidation Price
&lt;/h3&gt;&lt;p&gt;The asset price at which your position hits the liquidation threshold:&lt;/p&gt;
$$\text{Liquidation Price} = \frac{\text{Total Debt}}{\text{Total Collateral Amount} \times \text{Liquidation Threshold}}$$&lt;p&gt;For a $100 SUI position at 2x leverage on Suilend (LT = 75%):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Debt = $100, Total collateral = ~52.6 SUI (at $3.80)&lt;/li&gt;
&lt;li&gt;Liquidation Price = $100 / (52.6 × 0.75) ≈ $2.53&lt;/li&gt;
&lt;li&gt;That&amp;rsquo;s a ~33% price drop buffer from current price&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="how-its-built"&gt;How It&amp;rsquo;s Built
&lt;/h2&gt;&lt;h3 id="architecture"&gt;Architecture
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;previewLeverage(params)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├─ 1. Resolve coin type (&amp;#39;SUI&amp;#39; → &amp;#39;0x2::sui::SUI&amp;#39;)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├─ 2. Fetch risk params from protocol adapter
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ └─ getAssetRiskParams(coinType) → { ltv, liquidationThreshold, maxMultiplier }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├─ 3. Validate multiplier ≤ maxMultiplier
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├─ 4. Fetch current price from 7k Protocol aggregator
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├─ 5. Position calculation
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ ├─ flashLoanUsdc = equity × (multiplier − 1) × 1.02 buffer
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ ├─ totalPositionUsd = equity × multiplier
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ └─ ltvPercent = debt / totalPosition × 100
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├─ 6. Liquidation calculation
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ ├─ liquidationPrice = debt / (collateralAmount × LT)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ └─ priceDropBuffer = (1 − liqPrice / currentPrice) × 100
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├─ 7. APY calculation
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ ├─ Supply APY: base + reward (per protocol adapter)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ ├─ Borrow APY: gross − rebate (per protocol adapter)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ └─ Net APY = (position × supplyAPY − debt × borrowAPY) / equity
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └─ 8. Swap slippage estimation via 7k DEX aggregator quote
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="multi-protocol-adapter-pattern"&gt;Multi-Protocol Adapter Pattern
&lt;/h3&gt;&lt;p&gt;Each lending protocol (Suilend, Navi, Scallop) implements the &lt;code&gt;ILendingProtocol&lt;/code&gt; interface, and the preview engine queries them through a unified API:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;ILendingProtocol&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;getAssetRiskParams&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;coinType&lt;/span&gt;: &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;ltv&lt;/span&gt;: &lt;span class="kt"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;liquidationThreshold&lt;/span&gt;: &lt;span class="kt"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;maxMultiplier&lt;/span&gt;: &lt;span class="kt"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;getAssetApy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;coinType&lt;/span&gt;: &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;supplyApy&lt;/span&gt;: &lt;span class="kt"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;rewardApy&lt;/span&gt;: &lt;span class="kt"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;borrowApy&lt;/span&gt;: &lt;span class="kt"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// ... deposit, borrow, withdraw, etc.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The same &lt;code&gt;previewLeverage&lt;/code&gt; call works across all three protocols — just change the &lt;code&gt;protocol&lt;/code&gt; parameter:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// Compare leverage across protocols
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;protocol&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;suilend&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;navi&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;scallop&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;preview&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;sdk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;previewLeverage&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;protocol&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;depositAsset&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;SUI&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;depositValueUsd&lt;/span&gt;: &lt;span class="kt"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;multiplier&lt;/span&gt;: &lt;span class="kt"&gt;2.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;protocol&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sb"&gt;: Net APY &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;preview&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;netApy&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;toFixed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sb"&gt;%`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;This adapter pattern follows the same principle as Aave V3&amp;rsquo;s modular architecture — separation of concerns with a thin routing layer. The &lt;a class="link" href="https://jeongseup.github.io/p/lending-protocol-study-day2/" &gt;Day 2 study&lt;/a&gt; covers how Aave V3 uses &lt;code&gt;delegatecall + Library pattern&lt;/code&gt; to achieve a similar pluggable design.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="data-sources"&gt;Data Sources
&lt;/h3&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Data&lt;/th&gt;
&lt;th&gt;Source&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Asset price&lt;/td&gt;
&lt;td&gt;7k Protocol &lt;code&gt;getTokenPrice&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Real-time DEX aggregated price&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LTV / LT&lt;/td&gt;
&lt;td&gt;Protocol on-chain state&lt;/td&gt;
&lt;td&gt;Suilend &lt;code&gt;RateLimiterConfig&lt;/code&gt;, Navi &lt;code&gt;ReserveData&lt;/code&gt;, Scallop &lt;code&gt;risk_models&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Supply/Borrow APY&lt;/td&gt;
&lt;td&gt;Protocol SDK + on-chain query&lt;/td&gt;
&lt;td&gt;Includes reward token APY&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flash loan fee&lt;/td&gt;
&lt;td&gt;Scallop &lt;code&gt;FLASHLOAN_FEES_TABLE&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Currently 0% for USDC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Swap slippage&lt;/td&gt;
&lt;td&gt;7k Protocol &lt;code&gt;quote()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Real-time DEX routing&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="challenges--bugs-fixed"&gt;Challenges &amp;amp; Bugs Fixed
&lt;/h2&gt;&lt;h3 id="reward-apy-showing-3700-instead-of-146"&gt;Reward APY showing 3700% instead of 1.46%
&lt;/h3&gt;&lt;p&gt;Suilend stores reward coin types without the &lt;code&gt;0x&lt;/code&gt; prefix internally (e.g., &lt;code&gt;deeb7a4...::deep::DEEP&lt;/code&gt;). When we passed this to the 7k price API, it returned 0. The fallback code then used the deposit asset&amp;rsquo;s price ($67,987 for LBTC) as a proxy for the reward token (DEEP at $0.027), inflating the reward APY to 3700%.&lt;/p&gt;
&lt;p&gt;Fix: normalize the coin type with &lt;code&gt;0x&lt;/code&gt; prefix before price lookup, and skip the reward if price is still unavailable.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// Before (broken)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;&lt;/span&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;rewardPrice&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;getTokenPrice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;rewardCoinType&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// returns 0
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// Fallback: uses LBTC price → 3700% APY
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// After (fixed)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;&lt;/span&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;normalizedReward&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;normalizeCoinType&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;rewardCoinType&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fetchedPrice&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;getTokenPrice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;normalizedReward&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fetchedPrice&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;continue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// skip this reward
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="scallop-risk-params-not-accessible-via-sdk"&gt;Scallop risk params not accessible via SDK
&lt;/h3&gt;&lt;p&gt;Scallop&amp;rsquo;s TypeScript SDK doesn&amp;rsquo;t expose &lt;code&gt;risk_models&lt;/code&gt; data. We had to query the on-chain &lt;code&gt;risk_models&lt;/code&gt; dynamic fields directly using &lt;code&gt;suiClient.getDynamicFieldObject()&lt;/code&gt; to extract LTV and liquidation threshold values.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="verified-results-2026-02-26-mainnet"&gt;Verified Results (2026-02-26, Mainnet)
&lt;/h2&gt;&lt;h3 id="sui-2x-leverage"&gt;SUI 2x Leverage
&lt;/h3&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Suilend&lt;/th&gt;
&lt;th&gt;Navi&lt;/th&gt;
&lt;th&gt;Scallop&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Asset LTV&lt;/td&gt;
&lt;td&gt;70%&lt;/td&gt;
&lt;td&gt;75%&lt;/td&gt;
&lt;td&gt;85%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Liq. Threshold&lt;/td&gt;
&lt;td&gt;75%&lt;/td&gt;
&lt;td&gt;70%&lt;/td&gt;
&lt;td&gt;90%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Max Multiplier&lt;/td&gt;
&lt;td&gt;3.33x&lt;/td&gt;
&lt;td&gt;4.00x&lt;/td&gt;
&lt;td&gt;6.67x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Liq. Price&lt;/td&gt;
&lt;td&gt;$0.63&lt;/td&gt;
&lt;td&gt;$0.68&lt;/td&gt;
&lt;td&gt;$0.53&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Price Drop Buffer&lt;/td&gt;
&lt;td&gt;33%&lt;/td&gt;
&lt;td&gt;29%&lt;/td&gt;
&lt;td&gt;44%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Supply APY&lt;/td&gt;
&lt;td&gt;2.89%&lt;/td&gt;
&lt;td&gt;2.97%&lt;/td&gt;
&lt;td&gt;2.98%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Borrow Net APY&lt;/td&gt;
&lt;td&gt;3.45%&lt;/td&gt;
&lt;td&gt;4.57%&lt;/td&gt;
&lt;td&gt;5.80%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Net APY&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;2.33%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1.37%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.15%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="xbtc-2x-leverage"&gt;XBTC 2x Leverage
&lt;/h3&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Suilend&lt;/th&gt;
&lt;th&gt;Navi&lt;/th&gt;
&lt;th&gt;Scallop&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Asset LTV&lt;/td&gt;
&lt;td&gt;60%&lt;/td&gt;
&lt;td&gt;67%&lt;/td&gt;
&lt;td&gt;75%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Supply APY&lt;/td&gt;
&lt;td&gt;3.78%&lt;/td&gt;
&lt;td&gt;6.73%&lt;/td&gt;
&lt;td&gt;0.00%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Net APY&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;4.10%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;8.88%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;-5.80%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The negative Net APY on Scallop XBTC means borrowing costs exceed supply earnings — leverage actually loses money in that case.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="whats-next"&gt;What&amp;rsquo;s Next
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;leverage()&lt;/code&gt; — Actually execute the leveraged position on-chain&lt;/li&gt;
&lt;li&gt;&lt;code&gt;deleverage()&lt;/code&gt; — Close/reduce a leveraged position (flash loan → repay debt → withdraw → swap → repay)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;previewDeleverage()&lt;/code&gt; — Preview the unwinding process&lt;/li&gt;
&lt;li&gt;Cross-protocol position comparison dashboard&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="links"&gt;Links
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/curg-13/defidash-sdk" target="_blank" rel="noopener"
&gt;DefiDash SDK Repository&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://jeongseup.github.io/p/lending-protocol-study-day1/" &gt;Lending Protocol Study Day 1&lt;/a&gt; — Core lending concepts (LTV, Health Factor, Share-Based Accounting)&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://jeongseup.github.io/p/lending-protocol-study-day2/" &gt;Lending Protocol Study Day 2&lt;/a&gt; — Compound V2 internals, Aave V3 architecture&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.sui.io/concepts/transactions/prog-txn-blocks" target="_blank" rel="noopener"
&gt;Sui PTB Documentation&lt;/a&gt; — Programmable Transaction Blocks&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://suilend.fi" target="_blank" rel="noopener"
&gt;Suilend&lt;/a&gt; | &lt;a class="link" href="https://naviprotocol.io" target="_blank" rel="noopener"
&gt;Navi Protocol&lt;/a&gt; | &lt;a class="link" href="https://scallop.io" target="_blank" rel="noopener"
&gt;Scallop&lt;/a&gt; — The three protocols supported&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;DefiDash의 전체 코드는 &lt;a class="link" href="https://github.com/curg-13" target="_blank" rel="noopener"
&gt;curg-13&lt;/a&gt; 조직에서 확인할 수 있다.&lt;/em&gt;&lt;/p&gt;</description></item><item><title>DefiDash Technical Journal Day 1: 프로젝트 킥오프와 Sui 렌딩 생태계 분석</title><link>https://jeongseup.github.io/project/defidash/defidash-technical-journal-day1/</link><pubDate>Fri, 27 Feb 2026 00:00:00 +0000</pubDate><guid>https://jeongseup.github.io/project/defidash/defidash-technical-journal-day1/</guid><description>&lt;blockquote&gt;
&lt;p&gt;DefiDash 개발 과정을 기록하는 테크니컬 저널 시리즈. Day 1에서는 프로젝트의 동기와 목표, Sui 생태계의 렌딩 프로토콜 현황, 그리고 레버리지 렌딩 어그리게이터의 아키텍처 설계를 다룬다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Team:&lt;/strong&gt; &lt;a class="link" href="https://github.com/curg-13" target="_blank" rel="noopener"
&gt;curg-13&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="왜-defidash인가"&gt;왜 DefiDash인가
&lt;/h2&gt;&lt;p&gt;DeFi 렌딩 시장은 이미 성숙해있다. Ethereum에는 Aave, Compound, MakerDAO가 있고, 다른 체인에도 포크된 프로토콜들이 넘쳐난다. 그런데 &lt;strong&gt;Sui 생태계&lt;/strong&gt;는 다르다.&lt;/p&gt;
&lt;p&gt;Sui는 Move 기반의 Object-centric 모델을 사용한다. EVM의 Account-based 모델과 근본적으로 다른 패러다임이다. 이 차이는 DeFi 프로토콜 설계에도 영향을 미친다:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Object Ownership&lt;/strong&gt;: 자산이 계정이 아닌 오브젝트로 관리된다&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Parallel Execution&lt;/strong&gt;: 독립적인 오브젝트 간 트랜잭션은 병렬 실행 가능&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PTB (Programmable Transaction Blocks)&lt;/strong&gt;: 하나의 트랜잭션에서 여러 DeFi 연산을 원자적으로 실행&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;특히 PTB는 레버리지 렌딩에 결정적이다. EVM에서는 Flash Loan으로 여러 트랜잭션을 하나로 묶지만, Sui에서는 PTB로 &lt;strong&gt;네이티브하게&lt;/strong&gt; 복합 연산이 가능하다.&lt;/p&gt;
&lt;p&gt;문제는 Sui의 렌딩 프로토콜들이 아직 파편화되어 있다는 것이다. 각 프로토콜마다 다른 인터페이스, 다른 이자율 모델, 다른 담보 비율. 일반 사용자가 최적의 레버리지 전략을 찾는 것은 사실상 불가능하다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DefiDash는 이 문제를 해결한다.&lt;/strong&gt; Sui 생태계의 렌딩 프로토콜들을 하나의 인터페이스로 어그리게이트하여, 사용자에게 최적의 레버리지 전략을 제공한다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="프로젝트-구조"&gt;프로젝트 구조
&lt;/h2&gt;&lt;p&gt;curg-13 팀으로 3개의 레포지토리를 구성했다.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curg-13/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── defidash-sdk # 핵심 SDK - 프로토콜 통합 레이어
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── defidash-frontend # 사용자 facing DApp
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└── defidash-website # 랜딩 페이지 &amp;amp; 문서
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="defidash-sdk"&gt;defidash-sdk
&lt;/h3&gt;&lt;p&gt;프로토콜 어그리게이션의 핵심이다. 각 렌딩 프로토콜의 인터페이스를 추상화하고, 통합된 API를 제공한다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;주요 책임:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;각 프로토콜의 온체인 데이터 조회 (이자율, 담보 비율, 유동성)&lt;/li&gt;
&lt;li&gt;레버리지 포지션 시뮬레이션&lt;/li&gt;
&lt;li&gt;PTB 구성 및 트랜잭션 빌딩&lt;/li&gt;
&lt;li&gt;최적 경로 계산 (어떤 프로토콜 조합이 가장 유리한지)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="defidash-frontend"&gt;defidash-frontend
&lt;/h3&gt;&lt;p&gt;일반 사용자를 위한 DApp이다. 복잡한 레버리지 전략을 직관적인 UI로 제공한다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;핵심 UX 목표:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;원클릭 레버리지 포지션 오픈/클로즈&lt;/li&gt;
&lt;li&gt;실시간 Health Factor 모니터링&lt;/li&gt;
&lt;li&gt;프로토콜 간 이자율 비교 대시보드&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="defidash-website"&gt;defidash-website
&lt;/h3&gt;&lt;p&gt;프로젝트 소개와 문서를 담는 마케팅 사이트다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="sui-렌딩-생태계-현황"&gt;Sui 렌딩 생태계 현황
&lt;/h2&gt;&lt;p&gt;현재 Sui에서 활동 중인 주요 렌딩 프로토콜들을 정리했다.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Protocol&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Key Feature&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Scallop&lt;/td&gt;
&lt;td&gt;Pool-based&lt;/td&gt;
&lt;td&gt;Sui 최초의 렌딩 프로토콜, sCoin 모델&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NAVI Protocol&lt;/td&gt;
&lt;td&gt;Pool-based&lt;/td&gt;
&lt;td&gt;Dynamic interest rate, Flash Loan 지원&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Suilend&lt;/td&gt;
&lt;td&gt;Pool-based&lt;/td&gt;
&lt;td&gt;Solend 팀의 Sui 버전, Obligation 기반&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bucket Protocol&lt;/td&gt;
&lt;td&gt;CDP-based&lt;/td&gt;
&lt;td&gt;BUCK 스테이블코인 발행&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;EVM 생태계와 비교하면 아직 초기 단계지만, 각 프로토콜이 Sui의 특성을 살린 독자적인 설계를 가지고 있다. 이 차이점이 곧 어그리게이션의 가치다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="아키텍처-설계-어그리게이션-레이어"&gt;아키텍처 설계: 어그리게이션 레이어
&lt;/h2&gt;&lt;p&gt;레버리지 렌딩 어그리게이터의 핵심은 &lt;strong&gt;Protocol Adapter Pattern&lt;/strong&gt;이다.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;사용자 → DefiDash Frontend
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; DefiDash SDK
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ┌─────────┼─────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓ ↓ ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Scallop NAVI Suilend ← Protocol Adapters
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Adapter Adapter Adapter
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓ ↓ ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └─────────┼─────────┘
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Sui Network
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;각 프로토콜 Adapter는 동일한 인터페이스를 구현한다:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;LendingProtocolAdapter&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// 프로토콜 상태 조회
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;&lt;/span&gt; &lt;span class="nx"&gt;getMarkets&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;Market&lt;/span&gt;&lt;span class="err"&gt;[]&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;getInterestRates&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;market&lt;/span&gt;: &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;InterestRate&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;getUserPosition&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;address&lt;/span&gt;: &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;Position&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// 트랜잭션 빌딩
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;&lt;/span&gt; &lt;span class="nx"&gt;buildSupplyTx&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt;: &lt;span class="kt"&gt;SupplyParams&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;TransactionBlock&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;buildBorrowTx&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt;: &lt;span class="kt"&gt;BorrowParams&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;TransactionBlock&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;buildLeverageTx&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt;: &lt;span class="kt"&gt;LeverageParams&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;TransactionBlock&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;이 패턴의 장점은 새로운 프로토콜 추가가 Adapter 하나만 구현하면 된다는 것이다. SDK의 코어 로직이나 프론트엔드를 수정할 필요 없다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="레버리지-렌딩의-원리"&gt;레버리지 렌딩의 원리
&lt;/h2&gt;&lt;p&gt;일반 사용자를 위해 레버리지 렌딩이 어떻게 작동하는지 정리한다.&lt;/p&gt;
&lt;h3 id="기본-개념"&gt;기본 개념
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;담보 예치&lt;/strong&gt;: 1,000 USDC를 렌딩 프로토콜에 담보로 예치&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;대출&lt;/strong&gt;: 담보 대비 700 SUI를 대출 (LTV 70%)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;재예치&lt;/strong&gt;: 대출받은 SUI를 다시 담보로 예치&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;반복&lt;/strong&gt;: 이 과정을 반복하면 실효 레버리지가 증가&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;초기 자본: 1,000 USDC
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1차 대출: 700 SUI → 재예치
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2차 대출: 490 SUI → 재예치
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;3차 대출: 343 SUI → 재예치
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;실효 노출: ~3,333 USDC 상당 (약 3.3x 레버리지)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="sui-ptb의-이점"&gt;Sui PTB의 이점
&lt;/h3&gt;&lt;p&gt;EVM에서는 이 과정을 Flash Loan + 여러 컨트랙트 호출로 구현해야 한다. 가스비도 높고 실패 리스크도 있다.&lt;/p&gt;
&lt;p&gt;Sui의 PTB에서는 &lt;strong&gt;하나의 트랜잭션 블록 안에서&lt;/strong&gt; 모든 단계를 원자적으로 실행할 수 있다:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;txb&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;TransactionBlock&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 1. 담보 예치
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;&lt;/span&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;receipt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;txb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;moveCall&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;PROTOCOL&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sb"&gt;::deposit`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;arguments&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[...]&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 2. 대출
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;&lt;/span&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;borrowed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;txb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;moveCall&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;PROTOCOL&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sb"&gt;::borrow`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;arguments&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[...]&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 3. 재예치 (대출 결과를 바로 사용)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;&lt;/span&gt;&lt;span class="nx"&gt;txb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;moveCall&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;PROTOCOL&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sb"&gt;::deposit`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;arguments&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;borrowed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...]&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 하나의 트랜잭션으로 실행
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;signAndExecuteTransactionBlock&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;transactionBlock&lt;/span&gt;: &lt;span class="kt"&gt;txb&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Flash Loan 없이도 원자적 레버리지가 가능하다. 이것이 Sui에서 렌딩 어그리게이터를 만드는 핵심 이유다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="day-1-정리"&gt;Day 1 정리
&lt;/h2&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;결정 사항&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;프로젝트명&lt;/td&gt;
&lt;td&gt;DefiDash&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;팀&lt;/td&gt;
&lt;td&gt;curg-13&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;타겟 체인&lt;/td&gt;
&lt;td&gt;Sui&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;핵심 기술&lt;/td&gt;
&lt;td&gt;PTB 기반 레버리지 렌딩 어그리게이션&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SDK 언어&lt;/td&gt;
&lt;td&gt;TypeScript&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;아키텍처&lt;/td&gt;
&lt;td&gt;Protocol Adapter Pattern&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;첫 통합 대상&lt;/td&gt;
&lt;td&gt;Scallop, NAVI, Suilend&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="next-day-2"&gt;Next: Day 2
&lt;/h2&gt;&lt;p&gt;다음 저널에서는 실제 SDK 개발을 시작한다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Sui 렌딩 프로토콜 온체인 데이터 구조 분석&lt;/li&gt;
&lt;li&gt;Protocol Adapter 구현 (Scallop부터)&lt;/li&gt;
&lt;li&gt;PTB 기반 레버리지 트랜잭션 빌딩&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;DefiDash의 전체 코드는 &lt;a class="link" href="https://github.com/curg-13" target="_blank" rel="noopener"
&gt;curg-13&lt;/a&gt; 조직에서 확인할 수 있다.&lt;/em&gt;&lt;/p&gt;</description></item></channel></rss>