베스팅 계약
이 계약을 통해 지정된 시간 동안 일정량의 톤코인을 잠그고 점진적으로 잠금을 해제할 수 있습니다.
베스팅 매개변수
베스팅 매개변수는 변경되지 않으며 배포 중에 설정됩니다.
'투자_총액' - 나노톤 단위로 잠긴 톤코인의 총액입니다.
'투자 시작 시간' - 베스팅 기간의 시작 시점인 유닉스 시간으로, 이 순간까지 '투자 총액'이 잠기고 그 이후에는 다른 매개변수에 따라 잠금이 해제되기 시작합니다.
'베스팅총기간' - 총 베스팅 기간(초 단위)(예: 1년의 경우 31104000
).
'unlock_period- 잠금 해제 기간(초 단위)(예: 한 달에 한 번은
2592000`).
절벽_기간- 절벽 시작 기간(초)(예: 2개월의 경우
5184000`).
'투자발신자주소' - 언제든지 톤코인을 반환할 수 있는 주소(잠겨 있더라도), 이 주소는 화이트리스트에 추가할 수도 있습니다.
'소유자_주소' - 베스팅이 발급된 사람으로, 이 주소에서 베스팅 계약에서 톤코인 전송을 시작할 수 있습니다.
이 매개변수는 get_vesting_data()
get-method로 가져올 수 있습니다.
매개변수는 다음 조건을 충족해야 합니다:
vesting_total_duration > 0
vesting_total_duration <= 135 years (2^32 seconds)
unlock_period > 0
unlock_period <= vesting_total_duration
cliff_duration >= 0
cliff_duration < vesting_total_duration
vesting_total_duration mod unlock_period == 0
cliff_duration mod unlock_period == 0
스마트 컨트랙트가 이러한 조건의 준수 여부를 확인하지는 않지만, 컨트랙트가 배포된 후 톤코인을 전송하기 전에 사용자는 get-method를 통해 모든 매개변수가 정상인지 확인할 수 있습니다.
잠금
'투자 시작 시간' 이전에는 모든 '투자 총액'이 잠깁니다.
'투자 시작 시간'부터 금액이 비례적으로 잠금 해제되기 시작합니다.
예를 들어 '투자 총 기간'이 10개월, '잠금 해제 기간'이 1개월, '투자 총 금액'이 500톤이라면 매달 500*(10/100)=50톤이 잠금 해제되고, 10개월 후에는 500톤이 모두 잠금 해제됩니다.
절벽 기간이 있는 경우 절벽 기간 동안에는 아무것도 잠금 해제되지 않으며, 절벽 기간이 지나면 위의 공식에 따라 금액이 잠금 해제됩니다.
예를 들어 'cliff_period'가 3개월이고 다른 매개변수가 이전 예시와 동일하다면 처음 3개월은 아무것도 잠금 해제되지 않고 3개월이 지나면 150톤이 한 번에 잠금 해제됩니다(이후 매달 50톤씩 잠금 해제).
Get-method get_locked_amount(int at_time)
를 사용하면 특정 시점에 얼마나 잠길지 계산할 수 있습니다.
잠긴 톤코인은 화이트리스트 주소 또는 '투자하는발신자주소'로만 보낼 수 있습니다.
잠금 해제된 톤코인은 언제 어디서든 전송할 수 있습니다.
화이트리스트
화이트리스트는 코인이 아직 잠겨 있더라도 톤코인을 보낼 수 있는 주소 목록입니다.
Get-method get_whitelist()
는 모든 화이트리스트 주소를 (wc, hash_part) 튜플 목록으로 반환합니다.
Get-method is_whitelisted(슬라이스 주소)
는 이 주소가 화이트리스트에 있는지 확인합니다.
투자발신자주소는 언제든지
op::add_whitelist` 메시지로 새 주소를 화이트리스트에 추가할 수 있습니다.
화이트리스트에서 주소를 제거할 수 없습니다.
또한 잠긴 코인은 언제든지 '투자하는발신자주소'로 보낼 수 있습니다(화이트리스트에 별도로 추가할 필요 없음).
충전
모든 주소에서 톤코인을 베스팅 계약으로 보낼 수 있습니다.
월렛 스마트 컨트랙트
이 컨트랙트는 표준 지갑 V3 스마트 컨트랙트와 유사하게 설계되었습니다.
그의 데이터에는 seqno
, subwallet_id
, public_key
를 보관하고 동일한 형식의 외부 메시지를 수락합니다.
Get 메서드 seqno()
, get_subwallet_id()
및 get_public_key()
를 사용할 수 있습니다.
일반 지갑과 달리 베스팅 컨트랙트를 사용하면 한 번에 하나의 메시지만 보낼 수 있습니다.
보내기
공개 키의 소유자는 일반 지갑에서와 마찬가지로 외부 메시지를 통해 베스팅 계약에서 톤코인 전송을 시작할 수 있습니다.
톤코인 전송은 '소유자 주소'에서 보낸 op::send
내부 메시지로 시작할 수도 있습니다.
실제로는 공개 키와 '소유자 주소'는 모두 동일한 사용자가 소유합니다.
화이트리스트 제한
투자하는발신자주소`로 보낼 수 있는 메시지에는 다음과 같은 제한 사항이 있습니다:
- send_mode == 3`만 허용됩니다;
대부분의 경우, 주소가 화이트리스트에 추가되어 사용자가 잠긴 코인을 사용하여 검증하거나 잠긴 코인을 풀에 스테이킹할 수 있도록 허용합니다.
톤코인 도용을 방지하기 위해 화이트리스트로 보낼 수 있는 메시지에는 다음과 같은 제한이 있습니다:
send_mode == 3`만 허용됩니다;
반송 가능한 메시지만 허용됩니다;
상태 초기화` 첨부 파일이 허용되지 않습니다;
대상지가 시스템 선거인 주소인 경우:
- op::elector_new_stake
,
op::elector_recover_stake,
op::vote_for_complaint,
op::vote_for_proposal` 작업만 허용됩니다;
대상이 시스템 구성 주소인 경우:
- op::vote_for_proposal` 작업만 허용됩니다;
다른 목적지의 경우:
- 빈 메시지와 빈 문자 메시지를 허용합니다;
- 허용되는 문자 메시지는 "d", "w", "D", "W"로만 시작됩니다;
- 허용된
op::단일_지명자_풀_철회
,op::단일_지명자_풀_변경_검증자
,op::톤_스테이커_예치
,op::제튼_번
,op::톤_스테이커_투표
,op::투표_포_제안
,op::투표_포_불만
연산;
화이트리스트에 포함되지 않은 주소에는 제한이 없습니다.
잠금 해제된 톤코인을 보낼 때 화이트리스트 또는 '투자하는발신자주소'로 보내도 제한이 적용되지 않습니다.
프로젝트 구조
- '계약' - 프로젝트의 모든 스마트 컨트랙트의 소스 코드와 종속성입니다.
- 래퍼
- 모든 [탈]직렬화 프리미티브와 컴파일 함수를 포함한 컨트랙트에 대한 래퍼 클래스(톤코어의
Contract` 구현)입니다. - '테스트' - 계약에 대한 테스트입니다.
- '스크립트' - 프로젝트에서 사용하는 스크립트, 주로 배포 스크립트입니다.
사용 방법
빌드
'npx 블루프린트 빌드' 또는 '얀 블루프린트 빌드'
테스트
npx 블루프린트 테스트또는
원사 블루프린트 테스트`
다른 스크립트 배포 또는 실행
npx 블루프린트 실행
또는 원사 블루프린트 실행
새 계약 추가
npx 블루프린트 생성 계약 이름
또는 yarn 블루프린트 생성 계약 이름
참고 항목
- [단일 지명자](/참여/네트워크-유지보수/단일 지명자)
- 베스팅-계약