This is an implementation of a vesting smart contract for Casperlabs including a vesting smart contract separated into the smart contract and logic layers.
You can follow the above link to open this project in an online IDE, to build/test the contract.
- Deploy
- Pause
- Unpause
- Admin Release
- Withdraw
After deployment, an additional smart contract is saved under the vesting_proxy
key. Pause, Unpause, Admin Release and Withdraw methods have to call this contract and specify the vesting contract hash as a first argument.
When deploying, the following parameters have to be specified in the given order.
Name | Type | Description |
---|---|---|
method | string | Has to be deploy . |
contract_name | string | Name of the key the contract is save under. |
admin | bytes | Account base16 address, that will act as an administrator. Admin can pause, unpause the contract and release remaining amount when conditions are met. |
recipient | bytes | Account base16 address, that is eligible to withdraw the funds from the contract when conditions are met. |
cliff_timestamp | U512 | At this time, recipient is eligible to withdraw the cliff_amount from the contract. |
cliff_amount | U512 | The amount the recipient can withdraw after at cliff_timestamp time. |
drip_duration | U512 | After the cliff_timestamp is reached, evertime this period of time elapses, recipient is eligible to withdraw addtional drip_amount from the contract. |
drip_amount | U512 | The additiona amount the recipient can withdraw after every drip_duration period. |
total_amount | U512 | Total amount of CLX tokens locked in the smart contract at the deploy. |
admin_release_duration | U512 | The time on pause, that has to elapse for the Admin to be able to withdraw all of the remainig balance from the contract. |
Pausing stops the internal contract's clock. Only the Admin can pause the contract.
Name | Type | Description |
---|---|---|
vesting_contract_address | bytes | Address of the vesting contract. |
method | string | Has to be 'pause'. |
Unpausing resumes the internal contract's clock. Only the Admin can unpause the contract.
Name | Type | Description |
---|---|---|
vesting_contract_address | bytes | Address of the vesting contract. |
method | string | Has to be 'unpause'. |
If the contract was paused without unpausing an admin_release_duration
ago, then the Admin can call this method to withdraw all CLX tokens from the account to the Admin's main purse.
Name | Type | Description |
---|---|---|
vesting_contract_address | bytes | Address of the vesting contract. |
method | string | Has to be 'admin_release_proxy'. |
The Recipient account can withdraw the available CLX amount from the smart contract. This is transferred to the main purse of the recipient.
Name | Type | Description |
---|---|---|
vesting_contract_address | bytes | Address of the vesting contract. |
method | string | Has to be 'withdraw_release'. |
amount | U512 | The amount to withdraw from the contract. |
Code | Message |
---|---|
65537 | UnknownApiCommand |
65538 | UnknownDeployCommand |
65539 | UnknownProxyCommand |
65540 | UnknownConstructorCommand |
65541 | UnknownVestingCallCommand |
65542 | AlreadyPaused |
65543 | AlreadyUnpaused |
65544 | NotTheAdminAccount |
65545 | NotTheRecipientAccount |
65546 | UnexpectedVestingError |
65547 | NotEnoughBalance |
65548 | PurseTransferError |
65549 | PurseBalanceCheckError |
65550 | NotPaused |
65551 | NothingToWithdraw |
65552 | NotEnoughTimeElapsed |
65553 | LocalPurseKeyMissing |
65554 | UnexpectedType |
65555 | MissingKey |
65556 | MissingArgument0 |
65557 | MissingArgument1 |
65558 | MissingArgument2 |
65559 | MissingArgument3 |
65560 | MissingArgument4 |
65561 | MissingArgument5 |
65562 | MissingArgument6 |
65563 | MissingArgument7 |
65564 | MissingArgument8 |
65565 | MissingArgument9 |
65566 | InvalidArgument0 |
65567 | InvalidArgument1 |
65568 | InvalidArgument2 |
65569 | InvalidArgument3 |
65570 | InvalidArgument4 |
65571 | InvalidArgument5 |
65572 | InvalidArgument6 |
65573 | InvalidArgument7 |
65574 | InvalidArgument8 |
65575 | InvalidArgument9 |
65576 | UnsupportedNumberOfArguments |
CLIFF_TIMESTAMP=1583024523 # 2020/03/01 @ 1:02am (UTC)
CLIFF_AMOUNT=100
DRIP_DURATION=86400 # 1 day
DRIP_AMOUNT=20
TOTAL_AMOUNT=500
ADMIN_RELEASE_DURATION=432000 # 5 days
ARGS='[
{"name": "method", "value": {"string_value": "deploy"}},
{"name": "contract_name", "value": {"string_value": "vault_01"}},
{"name": "admin", "value": {"bytes_value": "'$ADMIN_PUB'"}},
{"name": "recipient", "value": {"bytes_value": "'$RECIPIENT_PUB'"}},
{"name": "cliff_timestamp", "value": {"big_int": {"value": "'$CLIFF_TIMESTAMP'", "bit_width": 512}}},
{"name": "cliff_amount", "value": {"big_int": {"value": "'$CLIFF_AMOUNT'", "bit_width": 512}}},
{"name": "drip_timestamp", "value": {"big_int": {"value": "'$DRIP_DURATION'", "bit_width": 512}}},
{"name": "drip_duration", "value": {"big_int": {"value": "'$DRIP_AMOUNT'", "bit_width": 512}}},
{"name": "total_amount", "value": {"big_int": {"value": "'$TOTAL_AMOUNT'", "bit_width": 512}}},
{"name": "admin_relase_duration", "value": {"big_int": {"value": "'$ADMIN_RELEASE_DURATION'", "bit_width": 512}}}
]'
casperlabs_client --host deploy.casperlabs.io deploy \
--private-key $SENDER_PRIVATE_KEY \
--payment-amount 10000000 \
--session $VESTING_WASM \
--session-args "$ARGS"
You can follow the above link to open this project in an online IDE, to build/test the contract.