💻
Alpaca Finance와의 통합

Alpaca Finance와의 통합

Alpaca Finance는 DeFi 어플리케이션과 코어 프로토콜을 통합 가능합니다. 예를 들어, 개발자는 Alpaca Finance의 예치 볼트에 자금을 넣을 수 있는 자동 복리 프로토콜을 개발할 수 있고 가스 효율성과 편의성을 높히기 위해 볼트에서 나온 일드를 복리 할 수 있습니다. 본 문서의 목적은 개발자들이 우리의 프로토콜과 통합을 가능케 함이며 생태계 전체의 안정성을 높히기 위함입니다.
알파카 API와 통합을 진행하기 위해서는 다음과 같은 이메일 주소로 연락 주시기 바랍니다. [email protected]

스마트컨트렉 통합

본문은 스마트컨트렉트와 Alpaca Finance를 어떻게 통합하는지에 대해서 하기와 같이 기술 합니다.

랜딩

Alpaca Finance는 유저들이 자신들의 암호화폐를 당사의 디포짓 볼트에 예치하여 이자 수익을 창출 할 수 있도록 합니다. 유저들이 예치한 자산들은 레버리지 일드 파밍을 하는 일드 파머들에게 대출 됩니다. 바이낸스 및 EVM에 호환 가능한 모든 스마트컨트렉트는 Alpaca Finance의 랜딩 프로토콜과 통합 가능합니다.
토큰 자산을 Alpaca Finance 볼트에 예치하기 위해서는 지원 가능한 토큰 자산과 볼트의 리스트들을 우선 확인해야 합니다.
  • 모든 볼트의 컨트렉트 주소를 확인하시려면 다음 링크를 참조하시기 바랍니다. here
예치자금이 볼트에 예치되기 전에, 스마트 컨트렉트는 예치자의 예치될 자산을 이용 할 수 있는 허용 범위에 대해 승인을 우선적으로 받아야 합니다. 승인을 받게 되면, Alpaca의 스마트 컨트렉트가 송금자가 보낸 토큰을 수령 할 수 있게 됩니다.
1
// JavaScriptimport { ERC20 } from '../typechain/ERC20'import { MaxUint256 } from '@ethersproject/constants'​...​const yourSmartContractAddress = 'xxx'tokenERC20.approve(yourSmartContractAddress, MaxUint256);
Copied!
상기에 표기된 JavaScript 코드는 이용할 수 있는 토큰 자산의 최대 금액을 승인 하는 절차이며 절차를 단순화 시켜줍니다. MaxUint256 은 보안 리스크를 야기 시킬 수 있으니 유저가 예치한 토큰 금액을 정확하게 사용 할 수 있도록 유의 하시기 바랍니다.
예치를 실행하려면 deposit 을 사용해야 하고 디포짓 금액을 상세화 하려면 amountToken 지표를 이용 해야 합니다. amountToken 데이터 유형은 is uint256 이며, 이 지표는 예치하는 토큰의 소숫점 자리를 설정해야 합니다. (예를 들어, BNB 는 18 소수점 자리를 사용합니다, 1 BNB = 10000000000000000000 또는 1 * 1e18). 예치하는 자산이 BNB일 경우 볼트는 BNB를 wBNB로 렙핑 해야하며, 트렌젝션은 충분한 BNB를 포함해야 합니다.
1
// Solidityaddress vaultContractAddress = '0xd7D069493685A581d27824Fc46EdA46B7EfC0063'; // BNB Vaultif (msg.value == 0) { // if no native token is sent, then it is a ERC20/BEP20 token deposit IERC20(tokenAddess).safeTransferFrom(address(msg.sender), address(this), amountToken);}// Allow transfer to vaultSafeToken.safeApprove(tokenAddess, vaultContractAddress, amountToken);// Deposit to vaultIVault(vaultContractAddress).deposit(amountToken);
Copied!
예치가 성공하게 되면, 볼트는 ibTokens을 민팅하여 요청자에게 민팅된 토큰을 제공하게 됩니다. 숙지 하셔할 사항은 요청자에게 제공되는 토큰은 예치한 토큰의 금액과 동일하지 않습니다. 이것은 이자 발생 (이자부) 토큰의 설계 구조 때문입니다. deposit 요청자는 예치된 볼트의 지분을 올바르게 트렉킹해야 합니다. 자세한 사항은 다음 링크를 확인하시기 바랍니다. Interest Bearing Token Calculation
랜딩 이자는 ibTokens에 복리됩니다 랜딩으로 부터 나온 수익을 실현 시키려면 ib토큰은 인출되어야 하며, 초기에 예치한 토큰 자산과 복리된 이자를 돌려 받게 됩니다. ib토큰은 복리된 이자로 인해 인출 시점에 더 높습니다. 그래서, 인출 시에 당신은 더 많은 토큰을 수취하게 됩니다.
볼트로 부터 예치한 토큰을 돌려 받기 위해서는 인출된 ib토큰의 금액이 Vault 컨트렉트에 있는 withdraw 에 입력되어야 합니다.
1
// Solidityaddress vaultContractAddress = '0xd7D069493685A581d27824Fc46EdA46B7EfC0063'; // BNB VaultIVault(vaultContractAddress).withdraw(ibTokenAmount);
Copied!
예치된 토큰은 요청자에게 다시 제공됩니다. 돌려 주는 토큰이 BNB일 경우, 볼트 컨트렉트는 wBNB에서 언 랩해야 합니다.

이자부 토큰 계산법

이자부 토큰 (ibToken) 은 예치자들의 볼트 지분을 나타냅니다. ibToken은 시간이 지남에 따라 이자를 복리하여 가치를 높입니다. Alpaca Finance의 볼트를 사용 희망하는 모든 DeFi 프로토콜들은 ib토큰 계산법을 정확히 숙지하고 실제 예치자의 볼트 지분을 반영 할 수 있도록 해야 합니다.
따라서, 볼트가 처음 열리게 되면 ibToken 과 실제 토큰의 비율은 1:1이고, ib토큰의 가치가 시간에 따라 복리하여 올라갑니다. (실제 토큰 대비 ib토큰의 가치는 우상향 합니다). 예를 들어, 가격이 1 ibBNB = 1.0292 BNB 이면 예치자는 1.0292 BNB 를 예치하여 1 ibBNB 를 수령하게 됩니다. 반면에, 1 ibBNB 는 1.0292 BNB 로 돌려 받게 됩니다. 증가된 BNB는 ibBNB에 이자가 복리로 증가하게 된 것입니다.
ib토큰들의 가치를 이해하는 것은 Alpaca Finance 프로토콜과 DeFi 프로토콜이 통합되어 예치자들의 볼트 내의 지분을 정확히 산정하기 위해서 필 수적인 요소입니다. 이것을 잘못 사용하게 되면 보안 위험에 노출되고 금전적 손실이 일어 날 수 있습니다. ib토큰을 1:1 비율로 적용하여 실패 사례가 bEarn.fiValueDeFi 입니다. (자세히 분석한 내용은 다음 링크를 참조하시기 바랍니다.(bEarn.fiValueDefi).
추가적으로, Alpaca Finance는 플레쉬 론에 작동하지 않지만, 알파카 볼트가 아닌 곳에서 ib토큰의 가격이 플레쉬 론 같은 공격으로 조작되어 가격이 급변할 수 있습니다. 이러한 사유로, 스마트 컨트렉트 계산기에 ib토큰이 의존하는 것만으로는 부족합니다. 우리는 프로젝트들이 플레쉬론 같은 공격을 막기 위해서 토큰과 ib토큰의 현재 비율을 표기하는 것을 추천합니다.
그래서, 우리는 가장 안전하고 정확한 방법으로 ib토큰을 계산할 수 있습니다.

스마트컨트렉트를 통한 직접 계산법

스마트컨트렉으로 부터의 ibToken 토큰 가격 산정은 가장 단순하지만, 견고함 측면에서는 스마트 컨트렉트에만 의존하는 것은 안됩니다.
1
// Solidityaddress vaultContractAddress = '0xd7D069493685A581d27824Fc46EdA46B7EfC0063'; // BNB VaultIVault vault = IVault(vaultContractAddress);uint256 ibTokenAmount = ...;uint256 ibTokenPrice = vault.totalToken()).div(vault.totalSupply();uint256 underlyingTokenAmount = ibTokenAmount.mul(ibTokenPrice);
Copied!
상기에 표기한 코드는 totalTokentotalSupply 로 볼트에 적용되는 ib토큰의 가치를 산정합니다.

Alpaca API에서 ib토큰의 가격을 참조하는 방법

Alpaca Finance는 ib토큰 가격을 GET REST 명령으로 Alpaca API를 통해 참조를 제공합니다. /ibTokens 는 어떠한 ibToken 가격을 참조합니다. Alpaca API와의 통합은 당사의 허가가 필요하며, 서비스에 사용하시기 위해서는 당사에 연락을 주시기 바랍니다.
API 로 부터 제공받는 샘플 결과는 다음과 같습니다:
1
{ "status": { "code": 1000, "messages": [ "OK" ] }, "data": [ { "symbol": "ibALPACA", "baseTokenPerShare": "1.051108636596531492", "lendingApr": "0.0003638488758058", "stakingApr": "0.0" }, { "symbol": "ibBNB", "baseTokenPerShare": "1.025808940627339553", "lendingApr": "9.7785294844178225", "stakingApr": "316693.265280905443641" }, { "symbol": "ibBUSD", "baseTokenPerShare": "0.972337256352625836", "lendingApr": "0.368330890561667", "stakingApr": "2269.786601379154162" }, { "symbol": "ibUSDT", "baseTokenPerShare": "0.913094694500682622", "lendingApr": "0.0012775198722327", "stakingApr": "0.0" }, { "symbol": "ibBTCB", "baseTokenPerShare": "1.000006160536069502", "lendingApr": "6.5534019786376696", "stakingApr": "0.0" }, { "symbol": "ibETH", "baseTokenPerShare": "0.999463386510494271", "lendingApr": "0.0000004209960912", "stakingApr": "0.0" } ]}
Copied!
ALPACA API로 부터 참조 받는 가격 정보는 프라이스 오라클을 이용하는 스마트컨트렉트에 제공되어야 합니다. input 명령을 통해 가격 정보를 제공하 것은 인젝션 공격 등으로 부터 취약점이 발생 될 수 있습니다. 우리는 이 방법을 지양하합니다. 단순한 가격 오라클 예제는 다음 링크에서 확인 할 수 있습니다. 검증된 가격 오라클을 이용함으로써 ib토큰의 가격 데이터에 대한 신뢰성을 높힐 수 있습니다.
정리하자면, 가장 안전하게 ib토큰 가격을 계산하는 법은 다음과 같습니다:
  1. 1.
    당신 소유의 컨트렉트에서 ib토큰 가격을 계산
  2. 2.
    ib토큰 가격에 대해서는 오프체인 오라클을 사용하거나 Alpaca의 API에서 가격을 참조해서 사용해
  3. 3.
    1과 2를 비교하여 n%이상 차이가 발생하면 거래를 롤백
알파카파이낸스의 API 는 화이트리스트 절차를 수행 할 수 있는 기관 또는 프로토콜을 대상으로 제공되고 있습니다. API에 대한 접근 요청하시려면 다음과 같은 이메일로 연락주시기 바랍니다. 이메일 주소: [email protected]

스테이킹

Alpaca Finance 는 스테이킹 기회를 유저들에게 제공합니다. 이자부 토큰과 검증된 LP토큰들은 스테이킹 풀안에서 스테이킹 할 수 있으며 ALPACA 토큰 형태의 추가적인 일드를 제공 받을 수 있습니다. 만약 당신이 투자 자금과 ib토큰들이 있다면, 유동성 풀에 유동성을 제공하여 리워드를 최대로 제공 받으시는 것을 추천드립니다.
Alpaca Finance 스테이킹 풀에서 토큰을 스테이크 하기 위해서는 유동성 풀과 그에 맞는 스테이킹 토큰의 리스트를 우선 인지해야 합니다. 모든 유동성 풀에 대한 컨트렉트 주소는 다음과 같습니다.here 유동성 풀의 컨트렉트는 일반적으로 우리의 코드 베이스에서는 Fairlaunch 라 표기합니.
스테이킹은 deposit 기능을 요청하여 실행 시킬 수 있습니다. 지표는 다음과 같습니다 :
  • _for 는 예치자의 주소
  • _pid 스테이킹 풀의 ID
  • _amountuint256 에 예치 된 금액이며 소수점을 필수로 표기 (예를 들어, ibBNB uses 18 decimals, 1 ibBNB = 10000000000000000000 or 1 * 1e18)
1
// Solidityaddress fairlaunchContractAddress = '0xA625AB01B08ce023B2a342Dbb12a16f2C8489A8F'; // ibBNB poolIFairLaunch fairlaunch = IFairLaunch(fairlaunchContractAddress);fairlaunch.deposit(msg.sender, poolId, amount);
Copied!
스테이킹 지분에 대한 정보는 스마트 컨트렉 상태에 저장됩니다. 스테이킹으로 부터 발행된 토큰은 없습니다. 유저의 지분은 userInfo method 를 통해 Fairlaunch 컨트렉트로 부터 참조 할 수 있습니다.
스테이킹으로 부터 제공받은 리워드는 자동으로 크레딧 되는 것이 아니라 수동으로 수확 할 수 있게 해야 합니다. 하지만, 팬딩 된 리워드는 자동으로 스테이크 풀에서 예치 또는 인출되어야 합니다. 스테이킹 풀에서 리워드를 수확하기 위해서는 요청자는 Fairlaunch 컨트렉트로 부터 harvest 를 명령하여 요청자 id에 공급해야 합니.
1
// Solidityaddress fairlaunchContractAddress = '0xA625AB01B08ce023B2a342Dbb12a16f2C8489A8F'; // ibBNB poolIFairLaunch fairlaunch = IFairLaunch(fairlaunchContractAddress);fairlaunch.harvest(poolId);
Copied!
스테이킹 토큰을 인출하기 위해서는 유저의 지분 금액을 Fairlaunch 컨트렉트안에서 withdraw 명령을 입력해야 합니다.
1
// Solidityaddress fairlaunchContractAddress = '0xA625AB01B08ce023B2a342Dbb12a16f2C8489A8F'; // ibBNB poolIFairLaunch fairlaunch = IFairLaunch(fairlaunchContractAddress);fairlaunch.withdraw(msg.sender, poolId, amount);
Copied!
스테이킹 토큰은 요창자에게 다시 지급되며 팬딩 리워드는 자동으로 수확하게 됩니다.

테스트넷 환경

메인넷에서 상품 출시와 적용 전, 알파카파이낸스 컨트렉트는 바이낸스 스마트 체인 테스트넷에 우선 배포됩니다. 테스트넷 컨트렉트는 알파카 파이낸스 기능 개발에 대한 내부 테스트를 위해 설계되었습니다. 하지만, 우리의 컨트렉트와 결합하기 위해 제3자가 테스트 하는 것은 허용하고 잇습니다. 테스트넷에서 사용되는 토큰은 내부적으로 민팅되어 테스트로만 사용됩니다. 테스트넷 접속 관련 문의는 다음 이메일 주시기 바랍니다. [email protected]. 테스트넷의 주소 목록은 다음을 참고하시기 바랍니다. 바로가기.