<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Sui on Jeongseup Blog</title><link>https://jeongseup.github.io/tags/sui/</link><description>Recent content in Sui 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/sui/index.xml" rel="self" type="application/rss+xml"/><item><title>DefiDash</title><link>https://jeongseup.github.io/project/defidash/</link><pubDate>Thu, 22 Jan 2026 00:00:00 +0000</pubDate><guid>https://jeongseup.github.io/project/defidash/</guid><description>&lt;img src="https://jeongseup.github.io/img/thumbs/project_defidash.jpeg" alt="Featured image of post DefiDash" /&gt;&lt;h2 id="role"&gt;Role
&lt;/h2&gt;&lt;p&gt;Owner &amp;amp; Team Lead (curg-13)&lt;/p&gt;
&lt;h2 id="description"&gt;Description
&lt;/h2&gt;&lt;p&gt;DefiDash is a DeFi leverage lending aggregator built on the Sui ecosystem. It aggregates multiple lending protocols on Sui to provide optimized leverage strategies for consumer users. The project consists of three repositories: a TypeScript SDK for protocol integration, a frontend DApp, and a marketing website.&lt;/p&gt;
&lt;h2 id="tech-stack"&gt;Tech Stack
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;TypeScript&lt;/li&gt;
&lt;li&gt;Sui Move&lt;/li&gt;
&lt;li&gt;React / Next.js&lt;/li&gt;
&lt;/ul&gt;</description></item><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><item><title>Seal Protocol: Sui 위의 탈중앙화 비밀 관리(DSM) 프로토콜 분석</title><link>https://jeongseup.github.io/p/seal-protocol-study/</link><pubDate>Fri, 27 Feb 2026 00:00:00 +0000</pubDate><guid>https://jeongseup.github.io/p/seal-protocol-study/</guid><description>&lt;blockquote&gt;
&lt;p&gt;Seal은 Sui 블록체인의 접근 제어(Access Control) 기능을 활용하여 데이터를 안전하게 암호화·복호화하는 &lt;strong&gt;탈중앙화 키 관리 프로토콜&lt;/strong&gt;이다. Walrus와 같은 분산 스토리지나 온체인/오프체인 스토리지에 저장된 민감한 데이터를 보호하기 위해 설계되었으며, 중앙화된 키 저장소 없이 **수학적 파생(Derivation)**과 &lt;strong&gt;Threshold Cryptography&lt;/strong&gt;로 보안을 유지한다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="1-핵심-아키텍처"&gt;1. 핵심 아키텍처
&lt;/h2&gt;&lt;p&gt;Seal은 데이터를 지키는 것이 아니라, 데이터를 잠근 **열쇠(AES Key)**를 지키는 역할을 수행한다.&lt;/p&gt;
&lt;h3 id="하이브리드-암호화-모델-envelope-encryption"&gt;하이브리드 암호화 모델 (Envelope Encryption)
&lt;/h3&gt;&lt;p&gt;Seal은 대용량 데이터 처리를 위해 &lt;strong&gt;봉투 암호화(Envelope Encryption)&lt;/strong&gt; 방식을 채택했다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;데이터 암호화&lt;/strong&gt;: 빠르고 강력한 &lt;strong&gt;AES-256(대칭키)&lt;/strong&gt; 알고리즘으로 실제 데이터를 암호화한다. 키는 매번 랜덤 생성된다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;키 암호화&lt;/strong&gt;: 생성된 AES Key를 Seal 프로토콜(IBE)을 통해 암호화하여 데이터 옆에 붙여둔다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;비유하자면, Seal은 금고(데이터)를 직접 지키는 게 아니라 &lt;strong&gt;금고 열쇠(AES Key)를 지키는 경비원&lt;/strong&gt;이다.&lt;/p&gt;
&lt;h3 id="stateless-key-server"&gt;Stateless Key Server
&lt;/h3&gt;&lt;p&gt;Seal의 Key Server는 AWS KMS와 달리 사용자 키를 DB에 저장하지 않는다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Master Key Only&lt;/strong&gt;: 서버는 오직 자신의 &lt;strong&gt;Master Key Pair&lt;/strong&gt; 하나만 관리한다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Key Derivation&lt;/strong&gt;: 복호화 요청이 오면 &lt;code&gt;Master Key + User ID&lt;/code&gt;를 결합하여 사용자용 키를 **즉석에서 계산(Derive)**한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;유저가 수백만 명으로 늘어나도 서버의 DB 용량은 증가하지 않으며, 해킹을 당해도 특정 유저의 키가 저장되어 있지 않아 상대적으로 안전하다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="2-기술적-배경"&gt;2. 기술적 배경
&lt;/h2&gt;&lt;h3 id="ibe-identity-based-encryption"&gt;IBE (Identity-Based Encryption)
&lt;/h3&gt;&lt;p&gt;기존 PKI(인증서 방식)와 달리, &lt;strong&gt;사용자의 신원(ID String, 이메일 등)&lt;/strong&gt; 그 자체를 &lt;strong&gt;Public Key&lt;/strong&gt;로 사용하는 암호화 방식이다. 복잡한 인증서 발급·관리 절차가 필요 없으며, ID만 알면 누구나 데이터를 암호화해서 보낼 수 있다.&lt;/p&gt;
&lt;h3 id="threshold-cryptography"&gt;Threshold Cryptography
&lt;/h3&gt;&lt;p&gt;단일 서버 실패(SPOF)를 방지하기 위해 비밀을 $n$개의 조각(Share)으로 나눈다. $n$개의 서버 중 &lt;strong&gt;$t$개 이상&lt;/strong&gt;이 살아있고 승인해야만 원본 키를 복구할 수 있다. 예를 들어, 3개 서버 중 2개 승인 시 복호화가 가능하다. 이를 통해 고가용성(Liveness)과 보안성(Privacy)을 동시에 보장한다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="3-작동-플로우"&gt;3. 작동 플로우
&lt;/h2&gt;&lt;p&gt;모든 암호화 및 복호화 연산은 **Client-Side(사용자 환경)**에서 이루어진다.&lt;/p&gt;
&lt;h3 id="1단계-수집-collection"&gt;1단계: 수집 (Collection)
&lt;/h3&gt;&lt;p&gt;사용자는 복호화를 위해 분산된 Key Server들에게 접근 권한을 증명한다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Client → Server A: &amp;ldquo;나 권한 있어(Proof)&amp;rdquo; → &lt;strong&gt;키 조각 A&lt;/strong&gt; 획득&lt;/li&gt;
&lt;li&gt;Client → Server B: &amp;ldquo;나 권한 있어(Proof)&amp;rdquo; → &lt;strong&gt;키 조각 B&lt;/strong&gt; 획득&lt;/li&gt;
&lt;li&gt;Server C가 응답하지 않아도 Threshold가 충족되면 진행 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="2단계-재조립-reconstruction"&gt;2단계: 재조립 (Reconstruction)
&lt;/h3&gt;&lt;p&gt;클라이언트는 로컬 메모리 상에서 수집한 조각들을 합친다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;라그랑주 보간법(Lagrange Interpolation)&lt;/strong&gt; 등 수학 공식을 통해 &lt;code&gt;[조각 A + 조각 B]&lt;/code&gt;를 결합하고, 그 결과로 데이터를 잠갔던 **원본 대칭키(AES Key)**가 복구된다.&lt;/p&gt;
&lt;h3 id="3단계-해제-decryption"&gt;3단계: 해제 (Decryption)
&lt;/h3&gt;&lt;p&gt;복구된 AES Key를 사용하여 암호화된 객체(Encrypted Object)를 풀고, 최종적으로 원본 데이터(Plaintext)를 획득한다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="4-aws-kms-vs-seal-비교"&gt;4. AWS KMS vs Seal 비교
&lt;/h2&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;특징&lt;/th&gt;
&lt;th&gt;AWS KMS (저장소 모델)&lt;/th&gt;
&lt;th&gt;Seal (파생 모델)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;키 관리 방식&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Stateful — 키를 DB/HSM에 영구 저장&lt;/td&gt;
&lt;td&gt;Stateless — 유저 키를 저장하지 않음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;스토리지 부담&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;유저/앱이 늘어날수록 관리할 키 데이터 증가&lt;/td&gt;
&lt;td&gt;유저가 늘어나도 &lt;strong&gt;Master Key 1개&lt;/strong&gt;만 관리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;보안 리스크&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;저장소가 털리면 저장된 모든 키 유출 위험&lt;/td&gt;
&lt;td&gt;저장소를 털어도 유저 키 데이터가 없음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;백업/복구&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;모든 개별 키(CMK, DEK)를 백업해야 함&lt;/td&gt;
&lt;td&gt;Master Key 하나만 백업하면 모든 유저 키 복구 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;작동 원리&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Key Lookup (DB 조회)&lt;/td&gt;
&lt;td&gt;Key Derivation (수학적 계산)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="5-seal-내부-구조-두-가지-핵심-컴포넌트"&gt;5. Seal 내부 구조: 두 가지 핵심 컴포넌트
&lt;/h2&gt;&lt;p&gt;Seal은 크게 두 가지 컴포넌트로 구성된다.&lt;/p&gt;
&lt;h3 id="access-policies-on-chain-sui"&gt;Access Policies (On-chain, Sui)
&lt;/h3&gt;&lt;p&gt;Move 패키지(&lt;code&gt;PkgId&lt;/code&gt;)가 IBE identity의 subdomain &lt;code&gt;[PkgId]*&lt;/code&gt;를 제어한다. 패키지가 Move 코드를 통해 누가 해당 identity subdomain의 키에 접근할 수 있는지를 정의한다.&lt;/p&gt;
&lt;h3 id="off-chain-key-servers"&gt;Off-chain Key Servers
&lt;/h3&gt;&lt;p&gt;각 Key Server는 단일 IBE Master Secret Key를 보유한다. 사용자가 특정 identity에 대한 파생 키를 요청하면, 온체인 접근 정책이 승인한 경우에만 파생 키를 반환한다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="6-코드-레벨-분석"&gt;6. 코드 레벨 분석
&lt;/h2&gt;&lt;h3 id="encryption-과정"&gt;Encryption 과정
&lt;/h3&gt;&lt;p&gt;사용자 측에서 Seal Client SDK를 통해 데이터를 암호화하는 과정이다.&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;mysecret&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;mysupersecret&amp;#34;&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;encoder&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;TextEncoder&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;mysecretBz&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;encoder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;mysecret&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="kr"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;encryptedObject&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt; &lt;span class="p"&gt;}&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;sealClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;encrypt&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;threshold&lt;/span&gt;: &lt;span class="kt"&gt;1&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;packageId&lt;/span&gt;: &lt;span class="kt"&gt;PACKAGE_ID&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;id&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;0000&amp;#34;&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;data&lt;/span&gt;: &lt;span class="kt"&gt;mysecretBz&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;h3 id="encrypt-내부-로직"&gt;encrypt 내부 로직
&lt;/h3&gt;&lt;p&gt;SDK 내부에서는 다음 과정을 거친다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;랜덤 Base Key 생성&lt;/strong&gt;: &lt;code&gt;encryptionInput.generateKey()&lt;/code&gt;로 AES-256 키를 랜덤 생성&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;키 분할&lt;/strong&gt;: &lt;code&gt;split(baseKey, threshold, keyServers.length)&lt;/code&gt;로 Shamir Secret Sharing 수행&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Share 암호화&lt;/strong&gt;: 각 Key Server의 Public Key로 개별 Share를 IBE 암호화&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DEM Key 파생&lt;/strong&gt;: Base Key + 암호화된 Share 정보로 실제 데이터 암호화용 키를 파생&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;데이터 암호화&lt;/strong&gt;: 파생된 DEM Key로 원본 데이터를 AES-GCM 암호화&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;직렬화&lt;/strong&gt;: 모든 메타데이터와 ciphertext를 BCS 포맷으로 직렬화하여 반환&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-typescript" data-lang="typescript"&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="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;baseKey&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;encryptionInput&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;generateKey&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;shares&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;baseKey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;threshold&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;keyServers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&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;encryptedShares&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;encryptBatched&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;keyServers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;kemType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;fullId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;shares&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;baseKey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;threshold&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;demKey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;deriveKey&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;KeyPurpose&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;DEM&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;baseKey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;encryptedShares&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;threshold&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;serverIds&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;ciphertext&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;encryptionInput&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;encrypt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;demKey&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;hr&gt;
&lt;h2 id="7-limitations"&gt;7. Limitations
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;seal_approve*&lt;/code&gt; 함수는 풀 노드에서 &lt;code&gt;dry_run_transaction_block&lt;/code&gt; RPC 호출을 통해 평가된다. 풀 노드는 비동기적으로 동작하기 때문에 다음 사항에 유의해야 한다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;온체인 상태 변경이 전파되는 데 시간이 걸릴 수 있어, 풀 노드가 항상 최신 상태를 반영하지는 않는다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;seal_approve*&lt;/code&gt; 함수는 모든 Key Server에 걸쳐 원자적으로 평가되지 않는다. 자주 변경되는 상태에 의존하여 접근 권한을 결정하면 안 된다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;seal_approve*&lt;/code&gt; 함수는 side-effect가 없어야 하며, 온체인 상태를 수정할 수 없다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Random&lt;/code&gt; 모듈은 사용 가능하지만, 풀 노드 간에 결정적이지 않으므로 &lt;code&gt;seal_approve*&lt;/code&gt; 함수 내에서 사용하면 안 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="8-결론"&gt;8. 결론
&lt;/h2&gt;&lt;p&gt;Seal은 메시지를 encrypt &amp;amp; decrypt 해주는 프로토콜이다. IBE(Identity-Based Encryption)에 기초해서 동작하며, 이 모델이 서비스되기 위해 필요한 핵심 컴포넌트는 Key Server다.&lt;/p&gt;
&lt;p&gt;Key Server들은 Master Key를 보유하고, 클라이언트의 ID를 바탕으로 파생 키를 만든다(이 형태가 IBE). 다만 Seal에서는 실제 고용량 데이터를 직접 IBE로 암호화하지 않고, 매번 랜덤하게 새로운 AES Key를 생성한 뒤 이 키를 각 Key Server들이 나눠 갖는 형태(Envelope Encryption + Secret Sharing)로 운영된다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Sui 블록체인&lt;/strong&gt;을 접근 제어 레이어로, &lt;strong&gt;IBE&lt;/strong&gt;와 &lt;strong&gt;Threshold Cryptography&lt;/strong&gt;를 키 관리 레이어로 사용하는 Stateless 아키텍처를 통해 보안성과 확장성을 동시에 달성한 프로토콜이다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="references"&gt;References
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://seal.mystenlabs.com/" target="_blank" rel="noopener"
&gt;Seal Official&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://seal-docs.wal.app/" target="_blank" rel="noopener"
&gt;Seal Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://only-fins.wal.app/" target="_blank" rel="noopener"
&gt;Only Fins (Demo App)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://en.wikipedia.org/wiki/Identity-based_encryption" target="_blank" rel="noopener"
&gt;Identity-Based Encryption — Wikipedia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/MystenLabs/ts-sdks/tree/main/packages/seal" target="_blank" rel="noopener"
&gt;MystenLabs/ts-sdks — Seal Package&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>DefiDash 시작 계기: Defi Saver for Sui</title><link>https://jeongseup.github.io/project/defidash/defidash-journal-origin/</link><pubDate>Thu, 11 Dec 2025 00:00:00 +0000</pubDate><guid>https://jeongseup.github.io/project/defidash/defidash-journal-origin/</guid><description>&lt;blockquote&gt;
&lt;p&gt;CURG 13기 활동 중 DefiDash 프로젝트가 시작된 배경과, 레퍼런스인 Defi Saver를 분석한 기록.&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="1-프로젝트-히스토리"&gt;1. 프로젝트 히스토리
&lt;/h2&gt;&lt;p&gt;이 프로젝트는 &lt;a class="link" href="https://www.curg.co/" target="_blank" rel="noopener"
&gt;CURG(Crypto United Research Group)&lt;/a&gt;라는 한국 블록체인 스터디에서 출발했다. 퇴사 후 13기로 합류했고, 이번 기수의 활동기간은 2025.10.11부터 2026.3.28이었다. DefiDash는 2025.12부터 본격적으로 개발을 시작한 프로젝트다.&lt;/p&gt;
&lt;h3 id="초기-방향-탐색"&gt;초기 방향 탐색
&lt;/h3&gt;&lt;p&gt;처음에는 Sui Stack(Walrus, Seal, Nautilus, DeepBook 등)을 활용해서 재미있는 것들을 만들어보려 했다. 하지만 팀원들과 나 모두 Sui Stack 자체에 크게 흥미를 잃었다.&lt;/p&gt;
&lt;p&gt;간단히 써본 결과, 해당 스택은 커머셜한 Web2 비즈니스를 Web3화하는 방향에 초점이 맞춰진다고 느꼈기 때문이다.&lt;/p&gt;
&lt;p&gt;EVM 생태계에서는 필요한 인프라를 유저(커뮤니티)가 직접 개발하고 비즈니스화하면서 상호작용하는 반면, Sui에서는 필요한 인프라를 재단 레벨에서 미리 구상하고 생태계 툴로 자리잡아둔 구조다. 블록체인을 구축하고 개발자를 유치하는 전략적 차이라고 생각한다.&lt;/p&gt;
&lt;h3 id="방향성-좁히기"&gt;방향성 좁히기
&lt;/h3&gt;&lt;p&gt;이후 팀원들과의 회의를 통해 초기 방향을 아래 3가지로 좁혔다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Pendle to Sui + Lucky Gaming&lt;/strong&gt; — 기존에 Walrus Haultout 해커톤에서 Sui random module을 활용해 나간 경험을 확장&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Defi Saver to Sui&lt;/strong&gt; — Sui에 렌딩 프로토콜이 여럿 있으니 이를 aggregation 하는 것으로 출발&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Academic Research in Sui&lt;/strong&gt; — 오픈소스 Move DeFi 컨트랙트를 분석하면서 EVM과 MoveVM 차이를 비교&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;약 2주간의 논의를 거쳐, 2025.12.11 시점에 &lt;strong&gt;Defi Saver for Sui&lt;/strong&gt;로 방향을 결정지었다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="2-defi-saver-분석"&gt;2. Defi Saver 분석
&lt;/h2&gt;&lt;h3 id="defi-saver란"&gt;Defi Saver란?
&lt;/h3&gt;&lt;p&gt;&lt;a class="link" href="https://defisaver.com/" target="_blank" rel="noopener"
&gt;Defi Saver&lt;/a&gt;를 간단히 말하면, &lt;strong&gt;crypto portfolio dashboard + leverage yield farming(looping)&lt;/strong&gt; 플랫폼이다. 추후 포지션 규모가 크면 자동으로 포지션을 조절해주는 기능도 제공한다.&lt;/p&gt;
&lt;p&gt;가령 담보로 맡긴 BTC가 급락하는 경우, liquidation을 방지하기 위해 leverage multiplier를 자동으로 줄여준다는 뜻이다.&lt;/p&gt;
&lt;p&gt;Defi Saver 말고도 비슷한 crypto asset dashboard 서비스는 다양하다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://help.defisaver.com/general/what-is-defi-saver" target="_blank" rel="noopener"
&gt;Defi Saver 공식 소개&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://defillama.com/protocol/defi-saver" target="_blank" rel="noopener"
&gt;DefiLlama - Defi Saver&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.alchemy.com/dapps/best/crypto-portfolio-dashboards" target="_blank" rel="noopener"
&gt;Alchemy - Best Crypto Portfolio Dashboards&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="특장점"&gt;특장점
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Safe(Gnosis) Smart Wallet 사용&lt;/strong&gt;: 처음 접속 시 유저에게 Smart Wallet을 생성하도록 한다.
&lt;ul&gt;
&lt;li&gt;Automation 기능 지원을 위해서이며, &lt;code&gt;execTransaction&lt;/code&gt; 같은 여러 트랜잭션을 하나로 묶어서 실행하기 위함이다.&lt;/li&gt;
&lt;li&gt;이걸 보고 &lt;strong&gt;Sui에서는 PTB가 네이티브하게 지원되니까 오히려 만들기 편하겠다&lt;/strong&gt;는 생각을 했다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Looping 레버리지&lt;/strong&gt;: 유저가 BTC를 맡기면 LTV에 따라 최대 레버리지까지 USDC를 빌려서 → 그 금액으로 BTC를 다시 사서 → 재예치하는 looping 방식을 지원한다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;직관적인 UX&lt;/strong&gt;: Liquidation price, 여러 리스크 팩터 등이 한눈에 보인다. 처음에는 별것 아닌 것 같았지만, 막상 만들어보니 이런 디테일한 정보를 잘 관리하고 UX로 풀어내는 게 쉽지 않다는 걸 뒤늦게 알게 되었다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="defi-saver-직접-사용해보기"&gt;Defi Saver 직접 사용해보기
&lt;/h3&gt;&lt;p&gt;아래는 직접 써본 예시다.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jeongseup.github.io/img/defidash/defisaver-leverage-example.png"
loading="lazy"
alt="Defi Saver leverage 포지션 오픈 화면"
&gt;&lt;/p&gt;
&lt;p&gt;가격이 변동함에 따라, 담보 자산(여기선 cbBTC) 상승 시 레버리지 효과를 가질 수 있게 된다.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jeongseup.github.io/img/defidash/defisaver-leverage-result.png"
loading="lazy"
alt="가격 변동에 따른 레버리지 효과"
&gt;&lt;/p&gt;
&lt;p&gt;기본적으로 내 EOA(MetaMask 지갑 주소)에서 호출한 컨트랙트 메소드는 다음과 같다. 해당 rollup tx 안에는 여러 로직이 포함되어 있는 구조다.&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;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-solidity" data-lang="solidity"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Function&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;execTransaction&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="kt"&gt;address&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;uint256&lt;/span&gt; &lt;span class="nb"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;bytes&lt;/span&gt; &lt;span class="nb"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;uint8&lt;/span&gt; &lt;span class="n"&gt;operation&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="kt"&gt;uint256&lt;/span&gt; &lt;span class="n"&gt;safeTxGas&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;uint256&lt;/span&gt; &lt;span class="n"&gt;baseGas&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;uint256&lt;/span&gt; &lt;span class="n"&gt;gasPrice&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="kt"&gt;address&lt;/span&gt; &lt;span class="n"&gt;gasToken&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;address&lt;/span&gt; &lt;span class="n"&gt;refundReceiver&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;bytes&lt;/span&gt; &lt;span class="n"&gt;signatures&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;Net Transfer로 보면 로직이 보다 명확해진다.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jeongseup.github.io/img/defidash/defisaver-net-transfer.png"
loading="lazy"
alt="Net Transfer 상세"
&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;실제 트랜잭션: &lt;a class="link" href="https://basescan.org/tx/0x0869a6913cda22441ec9ed568f72336602969d214db690dac6e22e23102073ef" target="_blank" rel="noopener"
&gt;basescan.org/tx/0x0869a6&amp;hellip;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;참고로 Defi Saver에서는 Flash Loan으로 빌린 금액의 &lt;strong&gt;0.25%를 서비스 수수료&lt;/strong&gt;로 받는 비즈니스 모델을 가진다.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jeongseup.github.io/img/defidash/defisaver-service-fee.png"
loading="lazy"
alt="서비스 수수료 구조"
&gt;&lt;/p&gt;
&lt;p&gt;포지션을 다음과 같이 preview 형태로도 제공해준다.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jeongseup.github.io/img/defidash/defisaver-position-preview.png"
loading="lazy"
alt="포지션 프리뷰"
&gt;&lt;/p&gt;
&lt;p&gt;포지션을 종료하면 기존 로직을 역행하는 과정을 거친다. 기본적으로 looping 과정에서 Morpho Flash Loan을 사용한다.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jeongseup.github.io/img/defidash/defisaver-close-position.png"
loading="lazy"
alt="포지션 종료(close position)"
&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Close position tx: &lt;a class="link" href="https://basescan.org/tx/0xe04ccbbd780f79de493dca0a000a0bfcf63c26bedbb1f078abb4d12413e09e5d" target="_blank" rel="noopener"
&gt;basescan.org/tx/0xe04ccb&amp;hellip;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="3-구조-분석"&gt;3. 구조 분석
&lt;/h2&gt;&lt;h3 id="leverage-max-multiplier"&gt;Leverage Max Multiplier
&lt;/h3&gt;&lt;p&gt;최대 레버리지 배수는 다음과 같이 결정된다.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jeongseup.github.io/img/defidash/defisaver-max-multiplier.png"
loading="lazy"
alt="Max multiplier 산출 공식"
&gt;&lt;/p&gt;
$$\text{Max Multiplier} = \frac{1}{1 - \text{LTV}}$$&lt;h3 id="leverage-내부-트랜잭션-구조"&gt;Leverage 내부 트랜잭션 구조
&lt;/h3&gt;&lt;p&gt;롤업된 트랜잭션을 의미별로 구조화하면 3가지 컴포넌트로 나뉜다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Flash Loan&lt;/strong&gt; — 레버리지에 필요한 초기 자금 확보&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Swap&lt;/strong&gt; — 빌린 스테이블코인을 담보 자산으로 교환&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Deposit &amp;amp; Lending&lt;/strong&gt; — 렌딩 프로토콜에 담보 예치 및 대출&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="4-defidash-프로젝트-구상"&gt;4. DefiDash 프로젝트 구상
&lt;/h2&gt;&lt;p&gt;위 분석을 바탕으로, 이번 13기 과정에서는 &lt;strong&gt;leverage, deleverage(포지션 on/off) 정도만 지원하는 MVP&lt;/strong&gt;를 만들기로 했다.&lt;/p&gt;
&lt;p&gt;각 컴포넌트별로 Sui 생태계에서 사용할 프로토콜을 매핑하면 다음과 같다.&lt;/p&gt;
&lt;h3 id="flash-loan"&gt;Flash Loan
&lt;/h3&gt;&lt;p&gt;레버리지 루핑에 필요한 스테이블코인을 어디서 빌려올 것인가?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Scallop&lt;/li&gt;
&lt;li&gt;NAVI&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="swap-aggregator--dex"&gt;Swap (Aggregator / DEX)
&lt;/h3&gt;&lt;p&gt;Flash Loan으로 빌려온 스테이블코인을 최적 비율로 담보 자산으로 교환할 곳은?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Aftermath&lt;/li&gt;
&lt;li&gt;Cetus&lt;/li&gt;
&lt;li&gt;7k Protocol&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="deposit--lending"&gt;Deposit &amp;amp; Lending
&lt;/h3&gt;&lt;p&gt;레버리지 포지션의 유지 비용(Supply APR - Borrow APR)이 가장 저렴한 곳은?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Suilend&lt;/li&gt;
&lt;li&gt;NAVI&lt;/li&gt;
&lt;li&gt;Scallop&lt;/li&gt;
&lt;li&gt;Bluefin&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Flash Loan 출처가 Scallop이라고 해서 렌딩 프로토콜도 반드시 Scallop일 필요는 없다. 각 컴포넌트는 독립적으로 최적의 조합을 선택할 수 있다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="5-프로젝트-목표-정의"&gt;5. 프로젝트 목표 정의
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;목표:&lt;/strong&gt; 3개 렌딩 프로토콜(Suilend, NAVI, Scallop)을 통합하는 leverage lending protocol aggregator 만들기.&lt;/p&gt;
&lt;h3 id="최종-워크플로우"&gt;최종 워크플로우
&lt;/h3&gt;&lt;p&gt;PTB 하나에 다음 5단계를 원자적으로 실행한다.&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;/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. Flash Loan ← Scallop
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2. Swap ← 7k Aggregator
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;3. Deposit ← Lending Protocol (Suilend / NAVI / Scallop)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;4. Borrow ← 같은 Lending Protocol
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;5. Repay ← Scallop (Flash Loan 상환)
&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;각 컴포넌트를 TypeScript SDK 레벨로 먼저 만들어보고, 필요하다면 컨트랙트도 파헤쳐보는 것으로 방향을 잡았다.&lt;/p&gt;
&lt;p&gt;프로젝트 완성 후에는 실제 레버리지 포지션을 통해 서비스 이용의 수익성을 검증할 계획이다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="next"&gt;Next
&lt;/h2&gt;&lt;p&gt;다음 글에서는 실제 SDK 개발에 착수한다. Sui 렌딩 프로토콜의 온체인 데이터 구조를 분석하고, Protocol Adapter 패턴을 설계한 과정을 다룬다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://jeongseup.github.io/p/defidash-technical-journal-day1/" &gt;DefiDash Journal Day 1: 프로젝트 킥오프와 Sui 렌딩 생태계 분석&lt;/a&gt;&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>