기술적 설계
소개
Saros DLMM은 Liquidity Book(LFJ 제공)을 기반으로 운영됩니다.
Liquidity Book 코어는 쌍을 이루는 자산 시장에서 독창적이고 동적인 유동성 구조를 만들 수 있게 해주며, 유동성이 고정 가격 빈(constant price bins) 에 풀링되어 이를 집계해 시장을 형성합니다.
이 메커니즘을 통해 누구나 Solana에서 빠르고 매끄럽게 직접 거래할 수 있으며, 중개인 없이 순수한 DeFi의 힘을 경험할 수 있습니다.
1. 집중 유동성(Concentrated Liquidity)
Uniswap v3는 집중 유동성 개념을 도입해, 유동성 공급자가 특정 가격 범위 내에서만 준비금을 배치할 수 있게 했으며, 이를 상수 함수(Constant Function) 공식을 통해 집계합니다.
Curve v1과 v2 역시 페그 가격을 중심으로 유동성을 집중시키며, v2는 내부 가격 오라클을 통해 동적 페그(Dynamic Peg) 를 적용합니다.
일반적으로 이러한 상수 함수 기반 모델은 맞춤형 마켓메이킹 전략을 제한하는 한계가 있습니다.
2. Liquidity Book
Liquidity Book(LB)는 자산 쌍의 유동성을 개별 가격 빈(discrete price bins) 으로 구성하며, 각 빈에 예치된 준비금은 해당 빈의 고정 환율(fixed exchange rate) 에 따라 거래됩니다. 시장은 이러한 모든 빈을 결합해 형성되며, 다양한 참여자의 유동성 기여로 완성됩니다.
설계를 조금 더 깊게 살펴보겠습니다.
Liquidity Book 설계
1. 준비금 가격 책정(Reserve Pricing)
AMM 관례에 따라 가격(P) 은 X 준비금의 변화에 따른 Y 준비금의 변화율로 정의됩니다. 가격은 기초 자산(X) 의 가치를 호가 자산(Y) 단위로 나타내는 값입니다.
2. 빈 유동성(Bin Liquidity)
유동성(L) 은 개별 빈(discrete bin) 에 예치된 준비금의 명목가치(quoted asset 기준)를 의미하며, 빈의 준비금 구성(reserve composition)이 변하더라도 보존됩니다.
다시 말해, 유동성(L)은 특정 빈에 예치된 자산의 명목가치를 호가 자산(quote asset) 단위로 표현한 값이며, 이는 해당 빈의 자산 구성이 변해도 유지됩니다. 이는 식 Eq 2.2 로 표현할 수 있으며, 빈에 포함된 모든 자산의 합산가치를 나타냅니다.
각 빈은 상수합(Constant Sum) 시장으로 작동하며, 고정 가격(static price)과 동적 유동성 준비금(dynamic liquidity reserves)을 갖춘 고유한 본딩 커브(bonding curve) 를 따릅니다. 아래 그림에서 y절편 은 총 유동성(L)을 나타내고, 기울기 는 빈의 가격에 의해 결정됩니다.
3. 빈 구성(Bin Composition)
유동성 빈의 준비금 구성은 가격과 유동성의 크기와는 독립적입니다. 구성 계수(composition factor, c) 는 해당 빈 유동성 중 Y 준비금이 차지하는 비율을 의미하며, 값의 범위는 0과 1 사이입니다.
각 유동성 빈의 자산 준비금은 빈 유동성(L) 과 구성 계수(c) 만으로 완전히 설명할 수 있습니다.
4.시장 집계(Market Aggregation)
자산 페어의 유동성 빈을 결합하면 시장이 형성됩니다. 시장 가격이 변동함에 따라, 각 빈의 준비금은 X 자산과 Y 자산 사이를 전환합니다. 시장 가격보다 낮은 가격에 있는 빈은 Y 자산만을 보유하고, 높은 가격에 있는 빈은 X 자산만을 보유합니다. 시장 가격은 X 자산 준비금을 보유한 가장 낮은 가격의 빈에 의해 결정됩니다.
5. 시장 조성자(Market Making)
이산적인 유동성 빈(Bins)을 통해 유동성 공급자는 자신의 목표, 예측, 그리고 위험 성향에 맞춰 유동성 구조를 설계할 수 있습니다. 공급자는 특정 가격 지점이나 스프레드에 유동성을 집중시킬 수 있으며, 다른 빈에 영향을 주지 않고 개별 빈만 조정할 수 있습니다.
유동성 북(Liquidity Book) 설계는 효과적인 시장 메이킹을 위해 정밀한 범위와 깊이 조정을 지원합니다.
제품 아키텍처(Product Architecture)
1. 시장 정의(Market Definition)
시장 가격 범위는 (2⁻¹²⁸, 2¹²⁸)로 제한되며, 빈 스텝(bin step, s)에 따라 유동성 빈(Bins)으로 구분됩니다.
빈 스텝이 작을수록 더 많은 빈이 생성됩니다. 시장은 (X, Y, s) 집합으로 정의됩니다. 전체 빈 개수는 2×Nb이며, Nb는 가격 패리티(parity)와 주어진 빈 스텝에 따른 최대 가격 사이의 최대 빈 수를 의미합니다.
빈의 최대 개수는 2²⁴ 미만으로 제한되며, 절반은 가격 패리티 이하, 나머지 절반은 패리티 이상에 배정됩니다. 최대 빈 수를 갖는 시장에서 패리티 빈의 식별자(identifier)는 2²³이며, 이를 상수 b로 표기합니다. 각 빈은 [b - Nb, b + Nb] 범위의 양의 정수 식별자(i)를 부여받습니다.
2.빈 가격(Bin Price)
각 유동성 빈(Bin)에 부여되는 가격은 해당 거래쌍의 Bin Step(s)과 Bin 식별자(i)에 의해 결정됩니다. Bin Step 파라미터는 각 빈이 이전 빈 대비 가격이 일정 비율로 증가하거나 감소하도록 설정합니다.
3. Liquidity Tracking (유동성 추적)
유동성 빈들은 세 개의 중첩된 256비트 배열을 사용하는 트리 구조에 인덱싱됩니다. 각 빈은 배열 내 위치 경로를 부여받으며, 유동성이 존재하는 빈은 0이 아닌 값으로 표시됩니다.
이 트리 구조는 스왑 시 유동성 상태를 효율적으로 탐색하고 외부 모니터링을 가능하게 합니다.
4. 거래 라우팅 (Trade Routing)
LB 라우터는 스왑 및 유동성 입출금 과정에서 보안성과 슬리피지 검증 기능을 제공합니다. 또한, 더 나은 가격이 발견될 경우 기존 AMM 페어를 통해 스왑을 라우팅합니다.
5. 유동성 토큰 (Liquidity Tokens)
LB 프로토콜은 다수의 유동성 빈(Bin)에 맞춰 설계된 새로운 유동성 토큰 표준인 LBToken을 도입합니다. LB 마켓에서의 유동성(L)은 각 빈의 상태와 관계없이 모두 Y 자산 기준으로 동일하게 평가되며, 이를 통해 빈 간의 유동성이 상호 조합(Composable) 가능합니다.
6. 마켓 파라미터 (Market Parameters)
각 마켓은 수수료율 파라미터를 가지며, 이는 선택된 Bin Step을 기준으로 초기 설정됩니다. 마켓은 팩토리에서 미리 정의된 수수료 파라미터와 연결된 Bin Step으로만 생성할 수 있습니다. 이러한 파라미터는 초기화 이후에도 조정이 가능합니다.
7. 오라클 (Oracles)
Saros DLMM 마켓에는 다음 정보를 기록하는 오라클이 탑재되어 있습니다.
timestamp
cumulativeID
cumulativeAccumulator
cumulativeBinCrossed
이 누적 값들은 시간 경과에 따른 변화를 추적하여 마켓 가격, 변동성 지표, 그리고 수수료 관련 메트릭을 제공하며, 이는 알고리즘 트레이딩 및 유동성 공급 전략 수립에 활용됩니다. 마켓 생성 시 설정되는 sampleLifetime은 샘플링 주기를 결정하며, 사용자는 필요에 따라 오라클 샘플 크기를 확장할 수 있습니다.
사용자 상호작용 (User Interactions)
1. 유동성 추가 / 제거 (Add / Remove Liquidity)
활성 빈(active bin)에 유동성을 추가하거나 제거하는 경우, 가격(P)과 구성(c)은 유지됩니다. 이때 필요한 준비금 X와 Y의 양은 유동성 조정에 따라 결정됩니다.
‘비활성(inactive)’ 상태의 유동성 빈에 대해서는, 구성 비율(composition bounds)에 따라 준비금 X 또는 준비금 Y만 단독으로 추가할 수 있습니다.
활성 빈에 유동성을 추가할 때, 해당 구성과 일치하지 않는 형태로 예치하면 자동으로 스왑이 이루어지며 이 과정에서 수수료가 발생합니다. 비활성 빈에 유동성을 추가하려 할 때, 해당 빈의 구성과 맞지 않으면 거래가 실패하게 됩니다.
2. 스왑 (Swaps)
유동성 빈(liquidity bin) 내에서 준비금(reserves)을 교환하는 경우, 유동성과 가격(P)은 그대로 유지되며 준비금 구성(composition)만 변경됩니다. 이때 구성 비율은 항상 [0,1] 범위 내에서 유지됩니다.
구성 한계(composition bounds)에 도달할 때까지 유동성 빈에서 사용 가능한 준비금은 다음과 같이 계산할 수 있습니다:
스왑 규모가 단일 빈의 유동성을 초과하면, 해당 빈의 유동성을 모두 소진한 뒤 인접한 다음 빈으로 이동하여 남아 있는 유동성을 순차적으로 소진합니다.
3. 스왑 수수료 (Swap Fees)
프로토콜은 거래 활동에 대해 유동성 공급자(LP)에게 보상을 지급하기 위해 수수료를 부과합니다.총 스왑 수수료(fs)는 기본 수수료(fb)와 가격 변동성에 기반한 가변 수수료(fv)로 구성됩니다.
수수료는 각 빈(bin)에서 스왑 금액에 적용되며, 프로토콜 몫을 제외한 나머지가 공급자에게 비례 배분됩니다.
수수료는 LP가 청구할 수 있도록 별도로 보관되며, n개의 빈에 걸친 스왑의 총 수수료는 다음과 같이 계산됩니다:
기본 수수료 (Base Fee)
기본 수수료는 모든 스왑에 적용되는 최소 요율을 의미합니다. 기본 수수료율(fb)은 빈 스텝(bin step, s) 의 함수이며, baseFactor(B) 값에 따라 스케일링됩니다.
가변 수수료 (Variable Fee)
가변 수수료(fv)는 순간 변동성(instantaneous volatility)에 대해 유동성 공급자(LP)에게 보상을 제공하고, 변동하는 가격 주변에서 유동성을 적극적으로 관리하도록 유도하기 위해 설계되었습니다. 가변 수수료는 빈(k)당 계산됩니다.
순간 변동성은 volatility accumulator 변수(va)로 추적됩니다. variableFeeControl 파라미터(A)는 예상되는 시장 동향에 따라 가변 수수료 구성 요소를 조정합니다.
변동성 누적기(Volatility Accumulator)
변동성은 시간에 따른 빈(Bin) 변경을 기반으로 하며, 각 변경은 빈 스텝(bin step)에 의해 설정된 고정 가격 움직임을 반영합니다.
변동성 누적기(va)는 거래 간 빈 교차(bin crossover)를 측정하며, 이를 위해 교차 횟수(k), 기준 빈 인덱스(ir), 시작 활성 빈(ik=0), 그리고 기준 변동성 값(vr)을 사용합니다.
기준 값은 각 거래 시작 시 계산되며, 마지막 거래 이후 경과 시간(t)에 따라 달라집니다.
변동성 누적기는 스왑이 발생한 빈과 기준 빈 간의 거리를 계산하고, 여기에 이전 거래에서 이월된 변동성(vr)을 더합니다. 만약 거래가 filterPeriod(tf)를 초과하는 시간 동안 발생하지 않으면, 기준 빈은 현재 빈으로 업데이트됩니다.
기준 변동성은 거래 빈도에 따라 업데이트되며, 경과 시간이 tf를 초과하면 reductionFactor(R)에 의해 감소하고, decayPeriod(td)를 초과하면 0으로 초기화됩니다. maxAccumulator(vmax) 파라미터는 누적기의 최대치를 제한하여 과도한 수수료 부과를 방지합니다.
4. 활성 빈 구성 수수료(Active Bin Composition Fee)
활성 빈에 유동성을 추가할 때, 해당 유동성의 구성(composition)이 해당 빈의 구성과 다르면 자동으로 준비금(reserves) 간 스왑이 이루어집니다. 스왑 금액은 이전 스왑에서의 자산 구성을 동일하게 맞추기 위해 계산되며, 이 과정에서 현재 시장 스왑 수수료와 유사한 수수료가 부과됩니다.
5. 프로토콜 수수료(Protocol Fee)
프로토콜은 protocolShare 매개변수로 설정된 비율에 따라 스왑 수수료의 일부(fp)를 보유합니다. 각 시장(Market)은 수수료 분배를 관리하기 위해 자체 protocolShare 값을 가집니다. 나머지 수수료는 유동성 공급자(LP)에게 분배됩니다.
개선 사항(Improvements)
1. 비영구적 손실(Impermanent Loss, IL)
가변 수수료(Variable Fees)는 가격 변동성으로 인한 변동 손실을 보상하기 위해 유동성 공급자(LP)에게 지급되며, 변동성 누적기(Volatility Accumulator)가 시장 상황에 맞춰 수수료를 조정합니다. 누적기의 시간 감쇠(Time Decay) 메커니즘 덕분에 공급자는 예상 수익을 초과하는 성과를 낼 수 있습니다. 아래 그림에서 그 예시를 확인할 수 있습니다. 그러나 변동성 누적기가 빈 스텝(Bin Step)에 의존하기 때문에, 명목 가격이 크게 변동하는 고변동성 이벤트 시에는 추적 오류(Tracking Error)가 발생할 수 있습니다.
2. 유동성 깊이(Liquidity Depth)
DEX의 자본 효율성(Capital Efficiency)을 향상시키면 동일한 자본량으로 더 깊은 시장 깊이(Market Depth)를 확보할 수 있습니다.자본 효율성이란 v1 AMM의 유동성과 동일한 가격 영향을 만들기 위해 필요한 자본의 감소량을 의미합니다.
Saros DLMM의 경우, 동등한 유동성은 v1 스왑의 가격 영향을 단일 빈 스텝(Bin Step)과 맞추는 방식으로 계산됩니다. 각 시장과 빈 스텝별로 자본 효율성의 최대 한계가 존재하며, 이에 대한 계산식이 제공됩니다.
위 그림에서 볼 수 있듯이, 자본 효율성은 Uniswap v3(v3)와 유사합니다. 균등하게 분산된 LB 포지션은 v3 포지션과 유사한 구조를 가집니다.
만약 유동성이 X 토큰 기준으로 빈에 균등하게 분배되었다면, LB와 v3 간의 스왑 가치 차이는 포지션의 가격 범위와 빈 스텝에 따라 계산 및 그래프화할 수 있습니다.
그림에 따르면, 포지션의 가격 범위는 빈 구조보다 시장 깊이에 더 큰 영향을 미칩니다.
최소 2개 이상의 빈을 포함하는 포지션의 경우, 빈 스텝 간 깊이 차이는 거의 없습니다. 특정 분배 구조에서는, 60% 이하의 가격 범위를 가지는 포지션에서 LB의 시장 깊이는 Uniswap v3 대비 1% 이내로 유지됩니다.
깊이 차이는 주로 v3의 기하급수적(Geometric) 분배 방식과 비교한 LB의 유연한 유동성 분배 차이에서 발생하며, 이는 넓은 범위 포지션에서만 의미 있게 나타납니다. 결론적으로, LB의 유연한 유동성 분배 구조는 넓은 가격 범위에서 특히 가치가 있습니다.
Last updated