Skip to content

SC Plan

HYXO edited this page Feb 13, 2023 · 3 revisions

[ERC 1400]

공식적인 ERC1400은 아니지만 현재 우리 팀에서 구현할 수 있는 기능 범위 내에서 ERC1400의 기능을 일부 추가한 ERC20 토큰이다. 아래 링크에서 구현되어 있는 ERC1400의 코드를 리뷰한 후 이번 프로젝트에 사용 가능한 기능을 사용하기로 하였다. [UniversalToken/ERC1400.sol at master · ConsenSys/UniversalToken]

_authorizedOperator[지갑주소], _controller

  • 운영자와 컨트롤러를 가리키는 변수으로 기존에는 토큰의 제 3자 규제 기관의 이더리움 지갑 주소로 투자자나 기업이 불법적인 일을 하고 있거나 계약에 반하는 행위를 발견할 경우 토큰을 강제로 이전하거나 거래를 제한하는 권한을 갖는다.

  • 우리 프로젝트에서는 사실상 operator와 controller는 같으며 모두 거래소로 지정하였다.

authorizeOperator / revokeOperator

  • 특정 지갑 주소를 특정 토큰의 운영자로 권한을 부여 / 박탈하는 함수이다. 우리 프로젝트에서는 거래소만 모든 토큰의 운영자로 제한한다.

restrictToken / allowToken

  • 특정 토큰의 변동성이 너무 극단적이거나 기업 또는 투자자의 불법적인 행위(실제 발생하진 않겠지만)가 적발되면 operator(controller)에 의해 해당 토큰을 1분간 거래제한시켜 토큰 거래가 발생하지 못하게 만들며, 이로 인해 가격도 1분 동안 변동 없이 거래제한 전 최신 값으로 유지되도록 하는 기능이다.

  • 1분이 지나면 자동으로 거래 제한이 해제되며 거래가 가능해짐과 동시에 가격변동이 다시 발생한다.

isRestricted

  • 해당 컨트랙트의 토큰이 거래제한된 상태인지 그 여부를 확인하는 함수이다.

_tokenHolderList[ ]

  • 해당 컨트랙트의 토큰을 보유한 적이 있는 지갑 주소들의 배열이다. 토큰을 transfer할 경우 그 수신자의 주소를 이 배열에 저장하기 때문에, 토큰을 전송 받은 적이 있다면 현재 0개를 보유중이어도 이 배열에 포함되어 있다.

  • 다만 이 배열을 사용할 때, 해당 토큰이 0개인지 확인하여 0개인 지갑 주소에게는 배당금이 부여되지 않는다.

isTokenHolder / showAllTokenHolders

  • 특정 지갑 주소가 토큰 보유자인지 확인하는 함수와 모든 토큰 거래자를 보여주는 배열을 출력하는 함수이다. 이 함수는 배당금 지급을 위해 토큰 보유자를 확인하기 위해 사용된다

dividendPayment( uint256 totalDividend )

  • 배당금을 토큰으로 지급하는 함수이다. 총 배당금으로 설정된 토큰 양을 입력하면 해당 토큰의 _totalSupply에 대한 토큰 보유자의 _balances의 지분을 확인하고 그 지분만큼 총 배당금의 비율로 토큰을 해당 지갑에 전송한다.

  • 총 배당금은 배당금을 지불할때 사용되는 가스 총량을 감안하여 설정될 것이다.

  • 다만, 이번 프로젝트에서는 이 기능을 구현하되 사용하지는 않았다. 추후에 기능을 사용할 예정이었지만 최종적으로 완료된 상태는 이더로 배당금을 지불하는 것이므로 컨트랙트가 아니라 서버에서 이더로 배당금을 지급하는 것으로 구현하였다. 기회가 된다면 토큰으로도 배당금을 지불할 수 있도록 해보려고 한다.

createStake( uint256 _stake )

  • 스테이킹 함수이다. 자신이 보유하고 있는 토큰 중 일부를 스테이킹 함으로써, 토큰 가격 변동에 안정성을 부여하는 대가로 보상을 받게 된다.

  • 스테이킹을 할 경우 정해진 기간동안은 해당 토큰을 매매할 수 없으며, 정해진 기간이 지나면 원금과 보상금을 인출할 수 있다.

withdrawReward( )

  • 일정 기간이 지나고 나서 자신이 스테이킹 한 원금과 그 보상금을 모두 인출하는 함수이다.

  • 기간이 만료되지 않았을 경우 인출 할 수 없다.

showFinishAt( address _stakeholder )

  • 특정 지갑 주소에 따른 스테이킹 만료일을 확인하는 함수이다.

rewardOf( address _stakeholder )

  • 특정 지갑 주소에 따른 예상 보상금을 확인하는 함수이다.

isStakeholder( address _stakeholder )

  • 특정 지갑 주소가 스테이킹을 한 상태인지 여부를 확인하는 함수이다.

[토큰 이코노미]

토큰의 종류

  • 기본 토큰 분배

    • 거래소는 최초에 1억 ETH를 보유한다.
    • 컨트랙트 배포를 통해 토큰 생성시 1억개의 토큰을 거래소가 보유한다.
    • 투자자가 지갑 등록시 거래소 주소로 투자자에게 50ETH를 지급한다.
  • 토큰 거래

    • 투자자가 토큰을 구매할 경우 1초마다 변동하는 가격(토큰 1개 기준)을 기반으로 구매 당시의 가격으로 계산하여 투자자는 계산된 가격에 수수료(0.0004)를 가산하여 거래소에게 전송한다. 거래소는 구매 요청한 토큰 개수만큼 투자자에게 transfer한다.
    • 투자자가 토큰을 판매할 경우 판매 당시의 가격으로 계산하여 거래소는 계산된 가격에 수수료를 제하고 투자자에게 이더를 전송한다. 투자자는 판매 요청한 토큰의 개수만큼 거래소에 tranfer한다.
  • 배당금 지급

    • 배당금 투표를 진행한 후 5분마다 토큰 지분에 따른 배당금을 지급한다.
    • _balances / totalSupply 를 통해 토큰에 대한 지분을 계산하고 결정된 총 배당금에서 해당 지분의 비율만큼 배당금을 지급한다. 이때 총 배당금은 토근 보유자들 모두에게 배당금을 전송할때 필요한 가스비를 감안하여 설정한다.
  • 스테이킹

    • 투자자가 자신이 보유하고 있는 토큰의 일부를 스테이킹하여 토큰 가격 변동에 안정성을 부여하는 데 이바지 하는 대가로 보상을 지급받는 기능이다.
    • 투자자가 스테이킹을 하게 되면 30분간 해당 토큰을 매매가 불가능하며, 30분이 지나 만료시간이 되면 스테이킹을 한 원금과 그에 대한 보상인 원금의 1%를 모두 인출할 수 있게 된다.
    • 상대적으로 큰 이율로 보상을 받을 수 있다는 장점이 있지만, 해당 기간 동안 매매를 할 수 없기 때문에 토큰 가격 변동에 따른 매매 차익으로 수익을 얻을 수 없다는 단점이 있는 기능이다.