Skip to content

Commit

Permalink
Fixed an issue with emission balancer and updated the README
Browse files Browse the repository at this point in the history
  • Loading branch information
kpachhai committed Oct 1, 2024
1 parent 474b47a commit dbda2df
Show file tree
Hide file tree
Showing 14 changed files with 387 additions and 702 deletions.
17 changes: 13 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,15 +28,22 @@ audited.
### Actions

- ☑ Transfer both the native asset `NAI` and any other token created by users
- ☑ Create a token
- ☑ Mint a token
- ☑ Burn a token
- ☑ Create a token(fungible, non-fungible, dataset)
- ☑ Mint a token(fungible, non-fungible)
- ☑ Burn a token(fungible, non-fungible)
- ☑ Register validator for staking
-Unregister validator from staking
-Withdraw validator from staking
- ☑ Delegate NAI to any currently staked validator
- ☑ Undelegate NAI from a staked validator
- ☑ Claim Validator staking rewards
- ☑ Claim User delegation rewards
- ☑ Create dataset
- ☑ Create dataset using an existing token of type dataset
- ☑ Initiate contribution to the dataset
- ☑ Complete contribution to the dataset
- ☑ Publish the dataset to Nuklai marketplace
- ☑ Subscribe to the dataset in the Nuklai marketplace
- ☑ Claim accumulated subscription payment from the Nuklai marketplace

### Emission Balancer

Expand Down Expand Up @@ -405,6 +412,8 @@ height:3003 txs:1 root:uNXBoJRGNo8JCJ8XDEioqVnJjwrVSSKBMgbaTd9AWFiUke2vE size:0.
]
```
## Demos
### Emission Balancer Demo
Refer to [Emission Balancer Demo](./docs/demos/emission_balancer.md) to learn how to retrieve info such as totalsupply, rewardsperblock, staking info, etc from Emission Balancer.
Expand Down
4 changes: 2 additions & 2 deletions actions/claim_delegation_stake_rewards.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ type ClaimDelegationStakeRewards struct {
}

func (*ClaimDelegationStakeRewards) GetTypeID() uint8 {
return nconsts.ClaimDelegationStakeRewards
return nconsts.ClaimDelegationStakeRewardsID
}

func (c *ClaimDelegationStakeRewards) StateKeys(actor codec.Address, _ ids.ID) state.Keys {
Expand Down Expand Up @@ -140,7 +140,7 @@ type ClaimDelegationStakeRewardsResult struct {
}

func (*ClaimDelegationStakeRewardsResult) GetTypeID() uint8 {
return nconsts.ClaimDelegationStakeRewards
return nconsts.ClaimDelegationStakeRewardsID
}

func (*ClaimDelegationStakeRewardsResult) Size() int {
Expand Down
44 changes: 20 additions & 24 deletions actions/claim_validator_stake_rewards.go
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ func (c *ClaimValidatorStakeRewards) Execute(
_ ids.ID,
) (codec.Typed, error) {
// Check whether a validator is trying to claim its reward
exists, stakeStartBlock, stakeEndBlock, stakeAmount, delegationFeeRate, rewardAddress, ownerAddress, _ := storage.GetRegisterValidatorStake(ctx, mu, c.NodeID)
exists, stakeStartBlock, stakeEndBlock, stakeAmount, delegationFeeRate, rewardAddress, _, _ := storage.GetRegisterValidatorStake(ctx, mu, c.NodeID)
if !exists {
return nil, ErrStakeMissing
}
Expand Down Expand Up @@ -80,14 +80,13 @@ func (c *ClaimValidatorStakeRewards) Execute(
}

return &ClaimValidatorStakeRewardsResult{
StakeStartBlock: stakeStartBlock,
StakeEndBlock: stakeEndBlock,
StakedAmount: stakeAmount,
DelegationFeeRate: delegationFeeRate,
BalanceBeforeUnstake: balance - rewardAmount,
BalanceAfterUnstake: balance,
DistributedTo: rewardAddress,
ValidatorOwner: ownerAddress,
StakeStartBlock: stakeStartBlock,
StakeEndBlock: stakeEndBlock,
StakedAmount: stakeAmount,
DelegationFeeRate: delegationFeeRate,
BalanceBeforeClaim: balance - rewardAmount,
BalanceAfterClaim: balance,
DistributedTo: rewardAddress,
}, nil
}

Expand Down Expand Up @@ -128,33 +127,31 @@ var (
)

type ClaimValidatorStakeRewardsResult struct {
StakeStartBlock uint64 `serialize:"true" json:"stake_start_block"`
StakeEndBlock uint64 `serialize:"true" json:"stake_end_block"`
StakedAmount uint64 `serialize:"true" json:"staked_amount"`
DelegationFeeRate uint64 `serialize:"true" json:"delegation_fee_rate"`
BalanceBeforeUnstake uint64 `serialize:"true" json:"balance_before_unstake"`
BalanceAfterUnstake uint64 `serialize:"true" json:"balance_after_unstake"`
DistributedTo codec.Address `serialize:"true" json:"distributed_to"`
ValidatorOwner codec.Address `serialize:"true" json:"validator_owner"`
StakeStartBlock uint64 `serialize:"true" json:"stake_start_block"`
StakeEndBlock uint64 `serialize:"true" json:"stake_end_block"`
StakedAmount uint64 `serialize:"true" json:"staked_amount"`
DelegationFeeRate uint64 `serialize:"true" json:"delegation_fee_rate"`
BalanceBeforeClaim uint64 `serialize:"true" json:"balance_before_claim"`
BalanceAfterClaim uint64 `serialize:"true" json:"balance_after_claim"`
DistributedTo codec.Address `serialize:"true" json:"distributed_to"`
}

func (*ClaimValidatorStakeRewardsResult) GetTypeID() uint8 {
return nconsts.ClaimValidatorStakeRewardsID
}

func (*ClaimValidatorStakeRewardsResult) Size() int {
return 6*consts.Uint64Len + 2*codec.AddressLen
return 6*consts.Uint64Len + codec.AddressLen
}

func (r *ClaimValidatorStakeRewardsResult) Marshal(p *codec.Packer) {
p.PackUint64(r.StakeStartBlock)
p.PackUint64(r.StakeEndBlock)
p.PackUint64(r.StakedAmount)
p.PackUint64(r.DelegationFeeRate)
p.PackUint64(r.BalanceBeforeUnstake)
p.PackUint64(r.BalanceAfterUnstake)
p.PackUint64(r.BalanceBeforeClaim)
p.PackUint64(r.BalanceAfterClaim)
p.PackAddress(r.DistributedTo)
p.PackAddress(r.ValidatorOwner)
}

func UnmarshalClaimValidatorStakeRewardsResult(p *codec.Packer) (codec.Typed, error) {
Expand All @@ -163,9 +160,8 @@ func UnmarshalClaimValidatorStakeRewardsResult(p *codec.Packer) (codec.Typed, er
result.StakeEndBlock = p.UnpackUint64(true)
result.StakedAmount = p.UnpackUint64(true)
result.DelegationFeeRate = p.UnpackUint64(true)
result.BalanceBeforeUnstake = p.UnpackUint64(false)
result.BalanceAfterUnstake = p.UnpackUint64(true)
result.BalanceBeforeClaim = p.UnpackUint64(false)
result.BalanceAfterClaim = p.UnpackUint64(true)
p.UnpackAddress(&result.DistributedTo)
p.UnpackAddress(&result.ValidatorOwner)
return &result, p.Err()
}
2 changes: 1 addition & 1 deletion actions/complete_contribute_dataset.go
Original file line number Diff line number Diff line change
Expand Up @@ -226,7 +226,7 @@ func (r *CompleteContributeDatasetResult) Marshal(p *codec.Packer) {

func UnmarshalCompleteContributeDatasetResult(p *codec.Packer) (codec.Typed, error) {
var result CompleteContributeDatasetResult
p.UnpackID(true, &result.CollateralAssetID)
p.UnpackID(false, &result.CollateralAssetID)
result.CollateralAmountRefunded = p.UnpackUint64(true)
p.UnpackID(true, &result.DatasetID)
p.UnpackID(true, &result.DatasetChildNftID)
Expand Down
2 changes: 1 addition & 1 deletion actions/subscribe_dataset_marketplace.go
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ func (d *SubscribeDatasetMarketplace) StateKeys(actor codec.Address, _ ids.ID) s
return state.Keys{
string(storage.DatasetKey(d.DatasetID)): state.Read,
string(storage.AssetKey(d.MarketplaceAssetID)): state.Read | state.Write,
string(storage.AssetNFTKey(nftID)): state.Allocate | state.Write,
string(storage.AssetNFTKey(nftID)): state.All,
string(storage.BalanceKey(actor, d.AssetForPayment)): state.Read | state.Write,
string(storage.BalanceKey(actor, d.MarketplaceAssetID)): state.Allocate | state.Write,
string(storage.BalanceKey(actor, nftID)): state.Allocate | state.Write,
Expand Down
54 changes: 37 additions & 17 deletions actions/undelegate_user_stake.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import (

"github.com/ava-labs/hypersdk/chain"
"github.com/ava-labs/hypersdk/codec"
"github.com/ava-labs/hypersdk/consts"
"github.com/ava-labs/hypersdk/state"

nconsts "github.com/nuklai/nuklaivm/consts"
Expand Down Expand Up @@ -75,23 +76,22 @@ func (u *UndelegateUserStake) Execute(
if err != nil {
return nil, err
}
if err := storage.DeleteDelegateUserStake(ctx, mu, ownerAddress, u.NodeID); err != nil {
if err := storage.DeleteDelegateUserStake(ctx, mu, actor, u.NodeID); err != nil {
return nil, err
}
balance, err := storage.AddBalance(ctx, mu, ownerAddress, ids.Empty, rewardAmount+stakedAmount, true)
balance, err := storage.AddBalance(ctx, mu, actor, ids.Empty, rewardAmount+stakedAmount, true)
if err != nil {
return nil, err
}

return &UndelegateUserStakeResult{
UnstakeResult: &UnstakeResult{
StakeStartBlock: stakeStartBlock,
StakeEndBlock: stakeEndBlock,
UnstakedAmount: stakedAmount,
RewardAmount: rewardAmount,
BalanceBeforeUnstake: balance - rewardAmount - stakedAmount,
BalanceAfterUnstake: balance,
},
return &WithdrawValidatorStakeResult{
StakeStartBlock: stakeStartBlock,
StakeEndBlock: stakeEndBlock,
UnstakedAmount: stakedAmount,
RewardAmount: rewardAmount,
BalanceBeforeUnstake: balance - rewardAmount - stakedAmount,
BalanceAfterUnstake: balance,
DistributedTo: actor,
}, nil
}

Expand All @@ -104,7 +104,7 @@ func (*UndelegateUserStake) ValidRange(chain.Rules) (int64, int64) {
return -1, -1
}

var _ chain.Marshaler = (*DelegateUserStake)(nil)
var _ chain.Marshaler = (*UndelegateUserStake)(nil)

func (*UndelegateUserStake) Size() int {
return ids.NodeIDLen
Expand Down Expand Up @@ -132,21 +132,41 @@ var (
)

type UndelegateUserStakeResult struct {
*UnstakeResult
StakeStartBlock uint64 `serialize:"true" json:"stake_start_block"`
StakeEndBlock uint64 `serialize:"true" json:"stake_end_block"`
UnstakedAmount uint64 `serialize:"true" json:"unstaked_amount"`
RewardAmount uint64 `serialize:"true" json:"reward_amount"`
BalanceBeforeUnstake uint64 `serialize:"true" json:"balance_before_unstake"`
BalanceAfterUnstake uint64 `serialize:"true" json:"balance_after_unstake"`
DistributedTo codec.Address `serialize:"true" json:"distributed_to"`
}

func (*UndelegateUserStakeResult) GetTypeID() uint8 {
return nconsts.UndelegateUserStakeID
}

func (r *UndelegateUserStakeResult) Size() int {
return r.UnstakeResult.Size()
func (*UndelegateUserStakeResult) Size() int {
return 6*consts.Uint64Len + codec.AddressLen
}

func (r *UndelegateUserStakeResult) Marshal(p *codec.Packer) {
r.UnstakeResult.Marshal(p)
p.PackUint64(r.StakeStartBlock)
p.PackUint64(r.StakeEndBlock)
p.PackUint64(r.UnstakedAmount)
p.PackUint64(r.RewardAmount)
p.PackUint64(r.BalanceBeforeUnstake)
p.PackUint64(r.BalanceAfterUnstake)
p.PackAddress(r.DistributedTo)
}

func UnmarshalUndelegateUserStakeResult(p *codec.Packer) (codec.Typed, error) {
return UnmarshalWithdrawValidatorStakeResult(p)
var result UndelegateUserStakeResult
result.StakeStartBlock = p.UnpackUint64(true)
result.StakeEndBlock = p.UnpackUint64(true)
result.UnstakedAmount = p.UnpackUint64(false)
result.RewardAmount = p.UnpackUint64(false)
result.BalanceBeforeUnstake = p.UnpackUint64(false)
result.BalanceAfterUnstake = p.UnpackUint64(true)
p.UnpackAddress(&result.DistributedTo)
return &result, p.Err()
}
33 changes: 21 additions & 12 deletions actions/withdraw_validator_stake.go
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ func (u *WithdrawValidatorStake) Execute(
_ ids.ID,
) (codec.Typed, error) {
// Check if the validator was already registered
exists, _, stakeEndBlock, stakedAmount, _, _, ownerAddress, _ := storage.GetRegisterValidatorStake(ctx, mu, u.NodeID)
exists, stakeStartBlock, stakeEndBlock, stakedAmount, delegationFeeRate, _, ownerAddress, _ := storage.GetRegisterValidatorStake(ctx, mu, u.NodeID)
if !exists {
return nil, ErrNotValidator
}
Expand Down Expand Up @@ -91,9 +91,15 @@ func (u *WithdrawValidatorStake) Execute(
return nil, err
}

return &UnstakeResult{
UnstakedAmount: stakedAmount,
RewardAmount: rewardAmount,
return &WithdrawValidatorStakeResult{
StakeStartBlock: stakeStartBlock,
StakeEndBlock: stakeEndBlock,
UnstakedAmount: stakedAmount,
DelegationFeeRate: delegationFeeRate,
RewardAmount: rewardAmount,
BalanceBeforeUnstake: stakedAmount - rewardAmount - stakedAmount,
BalanceAfterUnstake: stakedAmount,
DistributedTo: actor,
}, nil
}

Expand Down Expand Up @@ -129,43 +135,46 @@ func UnmarshalWithdrawValidatorStake(p *codec.Packer) (chain.Action, error) {
}

var (
_ codec.Typed = (*UnstakeResult)(nil)
_ chain.Marshaler = (*UnstakeResult)(nil)
_ codec.Typed = (*WithdrawValidatorStakeResult)(nil)
_ chain.Marshaler = (*WithdrawValidatorStakeResult)(nil)
)

type UnstakeResult struct {
type WithdrawValidatorStakeResult struct {
StakeStartBlock uint64 `serialize:"true" json:"stake_start_block"`
StakeEndBlock uint64 `serialize:"true" json:"stake_end_block"`
UnstakedAmount uint64 `serialize:"true" json:"unstaked_amount"`
DelegationFeeRate uint64 `serialize:"true" json:"delegation_fee_rate"`
RewardAmount uint64 `serialize:"true" json:"reward_amount"`
BalanceBeforeUnstake uint64 `serialize:"true" json:"balance_before_unstake"`
BalanceAfterUnstake uint64 `serialize:"true" json:"balance_after_unstake"`
DistributedTo codec.Address `serialize:"true" json:"distributed_to"`
}

func (*UnstakeResult) GetTypeID() uint8 {
func (*WithdrawValidatorStakeResult) GetTypeID() uint8 {
return nconsts.WithdrawValidatorStakeID
}

func (*UnstakeResult) Size() int {
return 6*consts.Uint64Len + codec.AddressLen
func (*WithdrawValidatorStakeResult) Size() int {
return 7*consts.Uint64Len + codec.AddressLen
}

func (r *UnstakeResult) Marshal(p *codec.Packer) {
func (r *WithdrawValidatorStakeResult) Marshal(p *codec.Packer) {
p.PackUint64(r.StakeStartBlock)
p.PackUint64(r.StakeEndBlock)
p.PackUint64(r.UnstakedAmount)
p.PackUint64(r.DelegationFeeRate)
p.PackUint64(r.RewardAmount)
p.PackUint64(r.BalanceBeforeUnstake)
p.PackUint64(r.BalanceAfterUnstake)
p.PackAddress(r.DistributedTo)
}

func UnmarshalWithdrawValidatorStakeResult(p *codec.Packer) (codec.Typed, error) {
var result UnstakeResult
var result WithdrawValidatorStakeResult
result.StakeStartBlock = p.UnpackUint64(true)
result.StakeEndBlock = p.UnpackUint64(true)
result.UnstakedAmount = p.UnpackUint64(false)
result.DelegationFeeRate = p.UnpackUint64(false)
result.RewardAmount = p.UnpackUint64(false)
result.BalanceBeforeUnstake = p.UnpackUint64(false)
result.BalanceAfterUnstake = p.UnpackUint64(true)
Expand Down
2 changes: 1 addition & 1 deletion cmd/nuklai-cli/cmd/action.go
Original file line number Diff line number Diff line change
Expand Up @@ -379,7 +379,7 @@ var registerValidatorStakeCmd = &cobra.Command{
}

stakeStartBlock := currentBlockHeight + 15 // roughly 30 seconds from now
stakeEndBlock := stakeStartBlock + 30*5 // roughly 5 minutes from now
stakeEndBlock := stakeStartBlock + 30*10 // roughly 5 minutes from now
delegationFeeRate := 50
rewardAddress := priv.Address

Expand Down
2 changes: 1 addition & 1 deletion consts/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ const (
ClaimValidatorStakeRewardsID uint8 = 12
DelegateUserStakeID uint8 = 13
UndelegateUserStakeID uint8 = 14
ClaimDelegationStakeRewards uint8 = 15
ClaimDelegationStakeRewardsID uint8 = 15
CreateDatasetID uint8 = 16
UpdateDatasetID uint8 = 17
InitiateContributeDatasetID uint8 = 18
Expand Down
Loading

0 comments on commit dbda2df

Please sign in to comment.