디헷지 봇 SDK(dHEDGE Bot SDK)

최석원
dHEDGE_ORG
Published in
8 min readNov 3, 2020
원문 : https://medium.com/dhedge-org/dhedge-bot-sdk-e825e6f469c8

디헷지(dHEDGE)는 탈중앙 자산 관리 프로토콜로, 포트폴리오 매니저들이 투자자들의 자산을 비수탁형식으로 거래할 수 있도록 만들어줍니다. 이러한 포트폴리오 매니저들은 사람들 일수도 혹은 봇일 수도 있습니다. 심지어 그 둘의 조합일 수도 있죠. 디헷지는 모든 것들에 동등하게 적용되기 위해 설계됐습니다.

이번 튜토리얼에서는, 여러분들에게 봇에 의해 자동적으로 실행되는 자신만의 전략을 배치하는 방법에 대해서 보여드릴 예정입니다. 간단하게 설명드리기 위해서, 리밸런싱 전략을 시연할 예정입니다. 해당 리밸런싱은 자신의 풀이 50%의 ETH, 50%의 USD라는 비율을 유지하고, 해당 비율 차이가 5% 이상 날 때만 풀을 재조정하게 될 것입니다.

디헷지의 블록체인 히어로 Vidor씨가 여러분들의 간편한 탐험을 위해 npm 패키지로 Node.js SDK를 구축하고 배치시켜 놨습니다. 그러니 바로 임포트 해보도록 하죠:

“dependencies”: { “dhedge-sdk” : “0.0.1” }

시작하기 전에, 아래의 레포지토리를 복사해봅시다:

https://github.com/dhedge/dhedge-sdk-examples

시드 문구와 함께 계정을 만듭니다 (MyCrypto app을 통해 바로 만드실 수 있습니다). 그 후, .env.example 을 .env에 복사하고, 아래의 사항들을 기재합니다:

MNEMONIC=”magna volatile mice juggle ubiquitous nudist …”ACCOUNT_ID=”0"PROVIDER=”https://ropsten.infura.io/v3/your-code-here"FACTORY_ADDRESS=”0xdd1Ee9e21bbd0012d1C710Ed94057A3CBE3E02D7"

위의 FACTORY_ADDRESS는 롭스텐 테스트넷을 위한 주소입니다. 메인넷 상의 팩토리 주소는 “0x03d20ef9bdc19736f5e8baf92d02c8661a5941f7” 입니다.

다음의 포셋에서 테스트넷 이더를 수취할 수 있습니다:

자 이제 테스트넷 ETH를 얻게 되신다면, 롭스텐 네트워크 상의 신세틱스 데포를 통해 sUSD를 얻어봅시다. 다음의 링크로 이동해주세요:

https://ropsten.etherscan.io/address/0x6E6624355D4c1DE475EB48677fce6025d69aAf22#writeContract. 여러분의 지갑을 연결하고, 얻게된 exchangeEtherForSynths 기능을 통해 sUSD를 구매해봅시다.

이제 여러분들은 봇을 테스트해볼 준비가 완료됐습니다. 자 이제 rebalance.js에서 예제 코드를 살펴보도록 합시다. 아래는 Import statement 입니다.

const { Factory } = require(‘dhedge-sdk’)

여러분들은 SDK를 통해 풀을 생성하시거나, UI를 통해 직접 풀을 생성하실 수 있습니다.

pool = await factory.createPool(false, ‘Manager Name’, ‘Pool Name’, [‘sETH’])

매니저 및 풀의 이름과 더불어 초기에 해당 풀에서 지원되는 자산 목록들을 변경해주세요. 만약 변경하지 않으신다면, 저희들이 이 튜토리얼에 기재한 기본 이름을 사용하게 될 것입니다. 만약 프라이빗한 풀을 만들고 싶으시다면, true 로 파라미터를 변경해주시기 바랍니다.

만약 여러분들이 예제 코드 내에서 풀을 만들고 싶으시다면, 아래의 항목을 true로 남겨주시기 바랍니다.

const CREATE_POOL = true

이제 봇을 다음과 같이 입력하여 구동시켜봅니다:

npm inode rebalance.js

봇은 풀을 만들고, 풀에 대한 요약을 다음과 같이 표기할 것입니다.

UI에 등록된 풀을 찾아보실 수 있으실 것이고, 클릭하여 해당 풀의 주소를 살펴보실 수 있습니다.

이제 풀을 만들었으니, 한번 다음과 같이 업데이트를 해봅시다:

const CREATE_POOL = falseconst POOL_ADDRESS = ‘0x77b75f942fee478f58c67b94483b5a8a66c166bf’

Factory method를 호출할 때, 이 풀 인스턴스가 로드될 것입니다.

pool = await factory.loadPool(POOL_ADDRESS)

봇을 처음 가동시켜보면, 다음과 같은 내역을 보실 수 있습니다.

다음의 예제 코드는 해당 풀에 승인 및 100 sUSD를 예치하는 코드입니다:

let sUSD = await pool.getAsset(‘sUSD’)await sUSD.approve(pool.getAddress(), ‘100000000000000000000’)await pool.deposit(‘100000000000000000000’)

이후, 현재 USD 값으로 표기된 풀의 자산 구성을 확인합니다.

let composition = await pool.getComposition()let sUsdEffectiveValue = composition[‘sUSD’].balancelet sEthEffectiveValue = await exchangeRates.getEffectiveValue(
‘sETH’, composition[‘sETH’].balance.toString(),‘sUSD’)

sETH와 sUSD 간의 자산 가치의 차이가 5% 이상 난다면, 리밸런싱으로 판단한다는 코드 예제입니다.

let totalValue = await pool.getPoolValue()let balanceThreshold = totalValue 
.mul(BigNumber.from(5)).div(BigNumber.from(100)) // 5%
if (sUsdEffectiveValue.sub(sEthEffectiveValue).
abs().gte(balanceThreshold))
{
console.log(‘Rebalance needed’)

}

이후 sUSD의 절반을 sETH로 교환하는 코드 예제입니다:

let target = sUsdEffectiveValue.sub(sEthEffectiveValue).abs().div(2)

await pool.exchange(‘sUSD’, target, ‘sETH’)

추가적으로 100sUSD가 예치 됐을 때 다시 한번 봇을 실행한다면 다음과 같이 리밸런싱 됩니다.

UI에서 위의 두 리밸런싱 내역을 살펴보실 수 있습니다.

자 이제 디포짓 라인에 코멘트 아웃을 해봅시다.

// await sUSD.approve(pool.getAddress(), ‘100000000000000000000’)
// await pool.deposit(‘100000000000000000000’)

이번에는 리밸런싱 스크립트를 다시 구동했을 때, 해당 풀은 예상대로 리밸런싱 되지 않을 것입니다.

이제 남은 것은 봇을 일정 간격 마다 구동될 수 있도록 스케줄을 짜는 것이며, 이후 해당 풀이 리밸런싱이 필요하다면 자동적으로 리밸런싱을 진행할 것입니다.

이 튜토리얼이 여러분들이 디헷지에서 사용할 새로운 트레이딩 봇을 작성하거나 기존의 트레이딩 봇들을 업데이트 하는 데 잘 사용됐으면 좋겠군요.

이번 봇 SDK는 최초의 버전인 부분이 있어서, 여러분들이 혹시나 피드백이 있으시다면 저희들의 디스코드에서 언제나 편하게 말씀해주시기 바랍니다.

--

--