Kai Protocol의 차별점과 핵심 Contract 소개
안녕하세요. Kai Protocol 입니다.
기존 알고리즘 스테이블코인 프로젝트들과 Kai Protocol의 차이점과 그동안 공식 커뮤니티에서 많은 문의가 있었던 Kai Protocol의 핵심 Contract 에 대해 알아보겠습니다.
기존 알고리즘 스테이블코인 프로젝트에 대해
Kai Protocol 프로젝트는 Basis 알고리즘 스테이블코인 프로젝트를 기반으로 구성되어 있습니다.
알고리즘 스테이블코인은 이더리움을 담보로 발행되는 다이(DAI)나 법정화폐를 담보로 발행되는 테더(USDT), USD 코인(USDC) 등에 비해 담보할 기초 자산이 없기 때문에 $1 가치의 안정성이 떨어지지만 블록체인 커뮤니티에서 지속적으로 논의되며 발전해오고 있습니다.
Basis 프로젝트는 다음과 같은 다중 토큰 프로토콜을 통해 스테이블코인의 안정성을 제시했습니다.
- Stable Coin
- Stable Coin의 유통량을 보상 받을 수 있는 Share Token
- Stable Coin의 $1 미만 가격 회복의 매개를 추구하는 Bonds Token
이를 기반으로 이더리움의 Basis cash, 바이낸스 스마트체인의 bDollar, MidasDollar, Mythrill이 등장했으며 해당 프로젝트들의 흥망성쇠 공통점은 동일합니다.
초반 많은 양의 Stable Coin을 발행해서 높은 APY로 Share Token의 가격을 유도했으나 결국 APY 하락으로 Share Token의 가격이 급격하게 떨어지면서 Stable Coin의 $1 안정성 역시 무너지는 결과를 보여줬습니다.
처음 $1 안정성이 무너진 이후 Buyback Fund 같은 DAO Fund나 기타 수단들을 마련했으나 $1 미만에서 적극적으로 동작하지 않았고 Smart Contract로 제어하지 않아서 투명성 문제가 제기 되기도 했습니다.
Kai Protocol의 차별점
1.Stable Coin(KAI) 발행량의 제한
Kai Protocol의 Stable Coin의 추가 발행을 결정하는 라운드(또는 Epoch) 주기는 8시간으로 하루 3번 진행됩니다. (bDollar의 경우 6시간으로 하루 4번 진행됩니다.)
또한 추가 발행량 역시 4~5%로 시작하는 기존 프로젝트들에 비해 Stable Coin(KAI) 발행량을 유통량에 따라 최대 3%로 시작해서 0.1%까지 제한하고 있습니다.
Stabel Coin(KAI)의 유통량 증가에 따라 Share Token(sKAI)의 가격이 시장 경제에 따라 등락하면서 안정적인 변동성을 보여주고 있습니다.
2.Buyback Fund Smart Contract 제어
Kai Protocol의 Buyback Fund에 대한 소개 및 차이점은 이전 게시물을 확인하시면 됩니다.
기존 스테이블코인 프로젝트에서는 Buyback Fund를 적극적으로 작동시키지 않았고 Smart Contract로 개발하지 않아서 투명성 문제가 항상 제기 되었습니다.
Kai Protocol의 Buyback Fund는 Smart Contract로 개발되어 Transfer function을 제거하고 KAI <>kUSDT 교환 및 KAI 소각만 가능하도록 구성되어 있습니다. Buyback Fund Contract에 대해서는 아래에서 자세히 다루도록 하겠습니다.
Kai Protocol의 핵심 Contract /Code소개
Kai Protocol을 이루는 핵심 Contract는 Treasury, Boardroom, BuyBackFund 세 가지 입니다. 이번 내용에서 공식 커뮤니티에서 많은 문의가 있었던 Address에 대한 궁금증도 해소하실 수 있기를 바랍니다.
Kai Protocol의 모든 알고리즘은 Smart Contract로 구성되어 있으며 기존 프로젝트의 알고리즘 대비 혁신적으로 업그레이드된 버전 입니다.
보다 자세한 Code는 Kai Protocol GitHub에서 확인하실 수 있으며 Sooho를 통해 Audit이 완료되었습니다.
각 Contract별로 Address 및 Code 와 함께 알아보겠습니다.
Treasury Contract
Address: 0x1Ee7E501039E0bd75475DD9da69EE744951CaB8B
Treasury Contract는 라운드의 확장 및 축소 상태를 결정하고 KAI의 신규 발행, bKAI 상환 등 중앙은행과 같은 중심적인 역할을 합니다.
[주요 역할]
- PriceOracle에서 제공되는 KAI의 가격에 따른 확장/축소 상태 결정
- 확장 상태에서 KAI 신규 발행 및 분배
- bKAI 상환을 위한 KAI 보유 및 지급
아래는 확장 상태에서 KAI 추가 발행을 위해 Mint 하는 Code 입니다.
function allocateSeigniorage() external onlyOneBlock checkCondition checkEpoch checkOperator {_updateKAIPrice();previousRoundKAIPrice = getKAIPrice(); // KAI 가격을 얻어옴uint256 kaiSupply = IERC20(kai).totalSupply().sub(seigniorageSaved);if (round < bootstrapRounds) { // 초기 21라운드는 3% 고정_sendToBoardRoom(kaiSupply.mul(bootstrapSupplyExpansionPercent).div(10000));} else {if (previousRoundKAIPrice > kaiPriceOne) { // KAI 가격이 $1 초과하면 확장uint256 bkaiSupply = IERC20(bkai).totalSupply();uint256 _percentage = previousRoundKAIPrice.sub(kaiPriceOne).mul(seigniorageExpansionRate).div(10000);uint256 _savedForBKAI;uint256 _savedForBoardRoom;// bKAI 의 발행량 이상으로 Treasury 가 KAI 를 보유한 경우 일반적인 확장 진행if (seigniorageSaved >= bkaiSupply.mul(bkaiDepletionFloorPercent).div(10000))uint256 _mse = maxSupplyExpansionPercent.mul(1e14);if (_percentage > _mse) {_percentage = _mse;}_savedForBoardRoom = kaiSupply.mul(_percentage).div(1e18);} else {// bKAI 의 발행량 만큼 Treasury 가 보유하고 있지 않다면, 이는 Debt Phase 로 전환되어 더 많은 KAI 가 Treasury 에 적립됨uint256 _mse = maxSupplyExpansionPercentInDebtPhase.mul(1e14);if (_percentage > _mse) {_percentage = _mse;}uint256 _seigniorage = kaiSupply.mul(_percentage).div(1e18);_savedForBoardRoom = _seigniorage.mul(seigniorageExpansionFloorPercent).div(10000);_savedForBKAI = _seigniorage.sub(_savedForBoardRoom);if (mintingFactorForPayingDebt > 0) {_savedForBKAI = _savedForBKAI.mul(mintingFactorForPayingDebt).div(10000);}}if (_savedForBoardRoom > 0) {// 보드룸으로 KAI 생성 요청_sendToBoardRoom(_savedForBoardRoom);}if (_savedForBKAI > 0) {seigniorageSaved = seigniorageSaved.add(_savedForBKAI);IKAIAsset(kai).mint(address(this), _savedForBKAI);emit TreasuryFunded(now, _savedForBKAI);}}}// 바이백 펀드 KAI 생성if (previousRoundKAIPrice > kaiPriceOne) {uint256 _buyBackRate = previousRoundKAIPrice.sub(kaiPriceOne).mul(buyBackFundExpansionRate).div(10000);uint256 _maxBuyBackRate = maxBuyBackFundExpansion.mul(1e14);if (_buyBackRate > _maxBuyBackRate) {_buyBackRate = _maxBuyBackRate;}uint256 _savedForBuyBackFund = kaiSupply.mul(_buyBackRate).div(1e18);if (_savedForBuyBackFund > 0) {IKAIAsset(kai).mint(address(buyBackFund), _savedForBuyBackFund);emit BuyBackFunded(now, _savedForBuyBackFund);}}if (allocateSeigniorageSalary > 0) {IKAIAsset(kai).mint(address(admin), allocateSeigniorageSalary);}}
Mint된 후 _sendToBoardRoom function 을 통해 Boardroom Contract 및 Team Fund에게 KAI가 분배됩니다.
function _sendToBoardRoom(uint256 _amount) internal {IKAIAsset(kai).mint(address(this), _amount);// 10%의 물량은 팀 펀드로 적립되며, 해당 물량은 마케팅 및 운영비로 사용됨if (teamFundSharedPercent > 0) {uint256 _teamFundSharedAmount = _amount.mul(teamFundSharedPercent).div(10000);IERC20(kai).transfer(teamFund, _teamFundSharedAmount);emit TeamFundFunded(now, _teamFundSharedAmount);_amount = _amount.sub(_teamFundSharedAmount);}IERC20(kai).safeApprove(boardroom, 0);IERC20(kai).safeApprove(boardroom, _amount);// 보드룸에 나머지 물량을 보내서 단일예치자들에게 배분IBoardroom(boardroom).allocateSeigniorage(_amount);emit BoardroomFunded(now, _amount);
Treasury에서 Boardroom Contract, Team Fund로 전송되는 내역은 Klayscope에서 확인하실 수 있습니다.
첨부 이미지처럼 38,839 KAI가 Mint되고 Boardroom Contract, Team Fund로 전송된 내역을 확인하실 수 있습니다.
Boardroom Contract
Address: 0x7B566d57Ad1908405bD844E47d87063650845D3b
Boardroom Contract는 sKAI 단일 예치를 관리하고 확장 상태에서 Treasury Contract로 부터 받은 KAI를 sKAI 단일 예치 사용자에게 분배하는 일반 은행과 같은 역할을 합니다.
[주요 역할]
- sKAI 단일 예치
- 추가 발행된 KAI 분배
Klayscope의 sKAI Holder Tab에서 확인되는 Boardroom Contract Address의 Amount를 참고하시면 단일 예치되어 있는 sKAI 수량을 확인하실 수 있습니다.(0xf81d1383e6d9877c9c0a768af7bb9d861c692899는 Airdrop Contract Address 입니다.)
Team Fund
Address: 0xe3b68dca64782c8130a13c6d5b8efb0a1332159a
확장 상태에서 KAI 추가 발행량의 10%가 Team Fund Address로 전송되어 운영 및 마케팅에 사용됩니다.
적립 및 사용 내역은 Klayscope를 통해 확인하실 수 있습니다.
BBFund Contract — Buyback Fund
Address: 0x451033434Fb739a538DA0a77d3DcA23Bf0801255
다음 라운드 예상 Price(TWAP)이 $ 0.99 미만인 경우 KAI를 매수해서 KAI 가격을 $1에 유지시키기 위한 안전장치 입니다. 효율적인 바이백을 위해 바이백 펀드 동작 시점에 대해서는 별도로 안내드리지 않으며 이때 바이백된 KAI는 소각할 수 있습니다.
[주요 기능]
- KAI 가격이 $ 1 초과일때 KAI -> USDT 교환
- KAI 가격이 $ 1 미만일때 USDT -> KAI 교환
- Buyback된 KAI의 소각
Buyback Fund Contract는 Transfer function이 불가능하며 오직 KAI 가격 유지를 위한 Sell, Buy, Burn function으로만 구성되어 있습니다.
function setKAIPriceToSell(uint256 _priceToSell) external onlyStrategist {require(_priceToSell > 1.0 ether, "out of range"); // 1불을 초과해야 매도 가능kaiPriceToSell = _priceToSell;}function setKAIPriceToBuy(uint256 _priceToBuy) external onlyStrategist {require(_priceToBuy < 1.0 ether, "out of range"); // 1 불 미만일 때 매수 가능kaiPriceToBuy = _priceToBuy;}function forceSell(address _buyingToken, uint256 _amount) external onlyStrategist {require(getKAIUpdatedPrice() >= kaiPriceToSell, "price is too low to sell");_swapToken(kai, _buyingToken, _amount);}function forceBuy(address _sellingToken, uint256 _amount) external onlyStrategist {require(getKAIUpdatedPrice() <= kaiPriceToBuy, "price is too high to buy");_swapToken(_sellingToken, kai, _amount);}function _swapToken(address _inputToken, address _outputToken, uint256 _amount) internal {if (_amount == 0) return;uint256 _maxAmount = maxAmountToTrade[_inputToken];if (_maxAmount > 0 && _maxAmount < _amount) {_amount = _maxAmount;}address[] memory _path;IERC20(_inputToken).safeIncreaseAllowance(address(klayswapFactory), _amount);IKlayswapFactory(klayswapFactory).exchangeKctPos(_inputToken, _amount, _outputToken, 1, _path);
Treasury Contract에서 Buyback Fund로 전송되는 KAI 내역과 Buyback Fund Contract에서 교환 및 소각되는 내역은 Klayscope에서 확인하실 수 있습니다.
마치며..
Kai Protocol과 기존 알고리즘 스테이블코인 프로젝트들의 차이점 및 KAI Protocol의 핵심 Contract 에 대한 소개는 여기서 마치겠습니다.
Kai Protocol의 알고리즘이 많은 부분 업그레이드 되었다고 하지만 시장 상황과 유동성/변동성에 따라 언제나 개선 및 보완이 필요하다고 생각됩니다.
지속적인 모니터링으로 KAI의 가격 안정성을 유지하면서 Kai Protocol 생태계가 계속 확장될 수 있도록 항상 노력하겠습니다.
고맙습니다.