# Validator Management Contract

## endrmng.sat

### Actions

* Add evm proxy account
* Delete evm proxy account
* Add whitelist (`proxyreg` or `evmcaller`)
* Delete whitelist (`proxyreg` or `evmcaller`)
* Staking, unstaking, changing staking, and claiming rewards on native chains and EVM
* Validator claiming rewards
* Batch allocation of validator rewards from rwddist.xsat

### Quickstart

```bash
# setdonateacc @endrmng.xsat
$ cleos push action endrmng.xsat setdonateacc '{"donation_account": "alice", "min_donate_rate": 2000}' -p endrmng.xsat

# setdonate @validator
$ cleos push action endrmng.xsat setdonate '{"validator": "alice", "donate_rate": 100}' -p alice

# addevmproxy @endrmng.xsat
$ cleos push action endrmng.xsat addevmproxy '{"caller": "caller1", "proxy": "e4d68a77714d9d388d8233bee18d578559950cf5"}' -p endrmng.xsat

# delevmproxy @endrmng.xsat
$ cleos push action endrmng.xsat delevmproxy '{"caller": "caller1", "proxy": "e4d68a77714d9d388d8233bee18d578559950cf5"}' -p endrmng.xsat

# addcrdtproxy @endrmng.xsat
$ cleos push action endrmng.xsat addcrdtproxy '{"proxy": "e4d68a77714d9d388d8233bee18d578559950cf5"}' -p endrmng.xsat

# delcrdtproxy @endrmng.xsat
$ cleos push action endrmng.xsat delcrdtproxy '{"proxy": "e4d68a77714d9d388d8233bee18d578559950cf5"}' -p endrmng.xsat

# addwhitelist @endrmng.xsat type = ["proxyreg", "evmcaller"]
$ cleos push action endrmng.xsat addwhitelist '{"type": "proxyreg", "account": "alice"}' -p endrmng.xsat

# delwhitelist @endrmng.xsat type = ["proxyreg", "evmcaller"]
$ cleos push action endrmng.xsat delwhitelist '{"type": "proxyreg", "account": "alice"}' -p endrmng.xsat

# setstatus @endrmng.xsat
$ cleos push action endrmng.xsat setstatus '{"validator": "alice", "disabled_staking": true}' -p endrmng.xsat

# regvalidator @validator
$ cleos push action endrmng.xsat regvalidator '{"validator": "alice", "financial_account": "alice"}' -p alice

# proxyreg @proxy
$ cleos push action endrmng.xsat proxyreg '{"proxy": "alice", "validator": "alice", "financial_account": "alice"}' -p alice

# config @validator decimal = 10000
$ cleos push action endrmng.xsat config '{"validator": "alice", "commission_rate": 2000, "financial_account": "alice"}' -p alice

# stake @staking.xsat
$ cleos push action endrmng.xsat stake '{"staker": "alice", "validator": "alice", "quantity": "0.00000020 BTC"}' -p staking.xsat

# unstake @staking.xsat
$ cleos push action endrmng.xsat unstake '{"staker": "alice", "validator": "alice", "quantity": "0.00000020 BTC"}' -p staking.xsat

# newstake @staker
$ cleos push action endrmng.xsat newstake '{"staker": "alice", "old_validator": "alice", "new_validator": "bob", "quantity": "0.00000020 BTC"}' -p alice

# claim @staker
$ cleos push action endrmng.xsat claim '{"staker": "alice", "validator": "alice"}' -p alice

# evmstake @auth scope is `evmcaller` evmproxies account
$ cleos push action endrmng.xsat evmstake '{"caller": "evmutil.xsat", "proxy": "e4d68a77714d9d388d8233bee18d578559950cf5", "staker": "bbbbbbbbbbbbbbbbbbbbbbbb5530ea015b900000",  "validator": "alice", "quantity": "0.00000020 BTC"}' -p alice

# evmunstake @auth scope is `evmcaller` evmproxies account
$ cleos push action endrmng.xsat evmunstake '{"caller": "evmutil.xsat", "proxy": "e4d68a77714d9d388d8233bee18d578559950cf5", "staker": "bbbbbbbbbbbbbbbbbbbbbbbb5530ea015b900000",  "validator": "alice", "quantity": "0.00000020 BTC"}' -p evmutil.xsat 

# evmnewstake @auth scope is `evmcaller` evmproxies account
$ cleos push action endrmng.xsat evmnewstake '{"caller": "evmutil.xsat", "proxy": "e4d68a77714d9d388d8233bee18d578559950cf5", "staker": "bbbbbbbbbbbbbbbbbbbbbbbb5530ea015b900000",  "old_validator": "alice", "new_validator": "bob", "quantity": "0.00000020 BTC"}' -p evmutil.xsat

# evmclaim @caller whitelist["evmcaller"] 
$ cleos push action endrmng.xsat evmclaim '{"caller": "evmutil.xsat", "proxy": "e4d68a77714d9d388d8233bee18d578559950cf5", "staker": "bbbbbbbbbbbbbbbbbbbbbbbb5530ea015b900000",  "validator": "alice"}' -p evmutil.xsat

# evmclaim2 @caller whitelist["evmcaller"] 
$ cleos push action endrmng.xsat evmclaim2 '{"caller": "evmutil.xsat", "proxy": "e4d68a77714d9d388d8233bee18d578559950cf5", "staker": "bbbbbbbbbbbbbbbbbbbbbbbb5530ea015b900000",  "validator": "alice", "donate_rate": 100}' -p evmutil.xsat

# vdrclaim @validator
$ cleos push action endrmng.xsat vdrclaim '{"validator": "alice"}' -p alice 

# distribute @rwddist.xsat
$ cleos push action endrmng.xsat distribute '{"height": 840000, [{"validator": "alice", "staking_rewards": "0.00000020 XSAT", "consensus_rewards": "0.00000020 XSAT"}]}' -p rwddist.xsat

# stakexsat
$ cleos push action endrmng.xsat stakexsat '{"staker": "alice", "validator": "alice", "quantity": "0.00000020 XSAT"}' -p xsatstk.xsat

# unstakexsat 
$ cleos push action endrmng.xsat unstakexsat '{"staker": "alice", "validator": "alice", "quantity": "0.00000020 XSAT"}' -p xsatstk.xsat

# restakexsat 
$ cleos push action endrmng.xsat restakexsat '{"staker": "alice", "old_validator": "alice", "new_validator": "bob", "quantity": "0.00000020 XSAT"}' -p alice

# evmstakexsat @auth scope is `evmcaller` evmproxies account
$ cleos push action endrmng.xsat evmstakexsat '{"caller": "evmutil.xsat", "proxy": "e4d68a77714d9d388d8233bee18d578559950cf5", "staker": "bbbbbbbbbbbbbbbbbbbbbbbb5530ea015b900000",  "validator": "alice", "quantity": "0.00000020 XSAT"}' -p evmutil.xsat

# evmunstkxsat @auth scope is `evmcaller` evmproxies account
$ cleos push action endrmng.xsat evmunstkxsat '{"caller": "evmutil.xsat", "proxy": "e4d68a77714d9d388d8233bee18d578559950cf5", "staker": "bbbbbbbbbbbbbbbbbbbbbbbb5530ea015b900000",  "validator": "alice", "quantity": "0.00000020 XSAT"}' -p evmutil.xsat 

# evmrestkxsat @auth scope is `evmcaller` evmproxies account
$ cleos push action endrmng.xsat evmrestkxsat '{"caller": "evmutil.xsat", "proxy": "e4d68a77714d9d388d8233bee18d578559950cf5", "staker": "bbbbbbbbbbbbbbbbbbbbbbbb5530ea015b900000",  "old_validator": "alice", "new_validator": "bob", "quantity": "0.00000020 XSAT"}' -p evmutil.xsat

# creditstake @auth custody.xsat 
$ cleos push action endrmng.xsat creditstake '{"proxy": "e4d68a77714d9d388d8233bee18d578559950cf5", "staker": "bbbbbbbbbbbbbbbbbbbbbbbb5530ea015b900000",  "validator": "alice", "quantity": "0.00000020 XSAT"}' -p custody.xsat

# newregvalidator @auth validator
$ cleos push action endrmng.xsat newregvldtor '{"validator": "alice", "role": 0, "stake_addr": "e4d68a77714d9d388d8233bee18d578559950cf5", "reward_addr": "e4d68a77714d9d388d8233bee18d578559950cf5", "commission_rate": 2000}' -p alice

# evmconfigvald @auth validator
$ cleos push action endrmng.xsat evmconfigvald '{"validator": "alice", "commission_rate": 2000, "donate_rate": 100}' -p alice

# evmsetstaker @auth validator
$ cleos push action endrmng.xsat evmsetstaker '{"validator": "alice", "stake_addr": "e4d68a77714d9d388d8233bee18d578559950cf5"}' -p alice

# setrwdaddr @auth validator
$ cleos push action endrmng.xsat setrwdaddr '{"validator": "alice", "reward_addr": "e4d68a77714d9d388d8233bee18d578559950cf5"}' -p alice

# setstakebase @auth get_self()
$ cleos push action endrmng.xsat setstakebase '{"xsat_base_stake": "2100 XSAT", "btc_base_stake": "100 BTC"}' -p endrmng.xsat

# updcreditstk @auth get_self()
$ cleos push action endrmng.xsat updcreditstk '{"is_close": true}' -p endrmng.xsat

# endorse @auth BLOCK_ENDORSE_CONTRACT
$ cleos push action endrmng.xsat endorse '{"validator": "alice", "height": 840000}' -p block_endorse.xsat
```

### Table Information

```bash
$ cleos get table endrmng.xsat endrmng.xsat config
$ cleos get table endrmng.xsat evmcaller whitelist 
$ cleos get table endrmng.xsat proxyreg whitelist 
$ cleos get table endrmng.xsat <evmcaller> evmproxies
$ cleos get table endrmng.xsat endrmng.xsat creditproxy 
$ cleos get table endrmng.xsat endrmng.xsat evmstakers 
$ cleos get table endrmng.xsat endrmng.xsat stakers 
$ cleos get table endrmng.xsat endrmng.xsat validators 
$ cleos get table endrmng.xsat endrmng.xsat stat
```

### TABLE `globalid`

#### scope&#x20;

endrmng.sat

#### params

* `{uint64_t} staking_id` - the latest staking id

#### example

```json
{
  "staking_id": 1
}
```

### TABLE `config`

#### scope&#x20;

endrmng.sat

#### params

* `{string} donation_account` - the account designated for receiving donations
* `{binary_extension<uint16_t>} min_donate_rate` - minimum donation rate

#### example

```json
{
  "donation_account": "donate.xsat",
  "min_donate_rate": 2000
}
```

### TABLE `whitelist`

#### scope `proxyreg` or `evmcaller`

#### params

* `{name} account` - whitelist account

#### example

```json
{
  "account": "alice"
}
```

### TABLE `evmproxies`

#### scope&#x20;

whitelist of type evmcaller

#### params

* `{uint64_t} id` - evm proxy id
* `{checksum160} proxy` - evm proxy account

#### example

```json
{
  "id": 1,
  "proxy": "bb776ae86d5996908af46482f24be8ccde2d4c41"
}
```

### TABLE `creditproxy`

#### scope&#x20;

the account whose scope is evmcaller in the `whitelist` table

#### params

* `{uint64_t} id` - evm proxy id
* `{checksum160} proxy` - evm proxy account

#### example

```json
{
  "id": 1,
  "proxy": "bb776ae86d5996908af46482f24be8ccde2d4c41"
}
```

### TABLE `evmstakers`

#### scope

endrmng.sat

#### params

* `{uint64_t} id` - evm staker id
* `{checksum160} proxy` - proxy account
* `{checksum160} staker` - staker account
* `{name} validator` - validator account
* `{asset} quantity` - total number of staking
* `{asset} xsat_quantity` - the amount of XSAT tokens staked
* `{asset} total_donated` - the total amount of XSAT that has been donated
* `{uint64_t} stake_debt` - amount of requested stake debt
* `{asset} staking_reward_unclaimed` - amount of stake unclaimed rewards
* `{asset} staking_reward_claimed` - amount of stake claimed rewards
* `{uint64_t} consensus_debt` - amount of requested consensus debt
* `{asset} consensus_reward_unclaimed` - amount of consensus unclaimed rewards
* `{asset} consensus_reward_claimed` - amount of consensus claimed rewards

#### example

```json
{
  "id": 4,
  "proxy": "bb776ae86d5996908af46482f24be8ccde2d4c41",
  "staker": "e4d68a77714d9d388d8233bee18d578559950cf5",
  "validator": "alice",
  "quantity": "0.10000000 BTC",
  "xsat_quantity": "0.10000000 XSAT",
  "total_donated": "1.00000000 XSAT",
  "stake_debt": 1385452,
  "staking_reward_unclaimed": "0.00000000 XSAT",
  "staking_reward_claimed": "0.00000000 XSAT",
  "consensus_debt": 173181,
  "consensus_reward_unclaimed": "0.00000000 XSAT",
  "consensus_reward_claimed": "0.00000000 XSAT"
}
```

### TABLE `stakers`

#### scope

endrmng.sat

#### params

* `{uint64_t} id` - staker id
* `{name} staker` - staker account
* `{name} validator` - validator account
* `{asset} quantity` - total number of staking
* `{asset} xsat_quantity` - the amount of XSAT tokens staked
* `{asset} total_donated` - the total amount of XSAT that has been donated
* `{uint64_t} stake_debt` - amount of requested stake debt
* `{asset} staking_reward_unclaimed` - amount of stake unclaimed rewards
* `{asset} staking_reward_claimed` - amount of stake claimed rewards
* `{uint64_t} consensus_debt` - amount of requested consensus debt
* `{asset} consensus_reward_unclaimed` - amount of consensus unclaimed rewards
* `{asset} consensus_reward_claimed` - amount of consensus claimed rewards

#### example

```json
{
  "id": 2,
  "staker": "alice",
  "validator": "alice",
  "quantity": "0.10000000 BTC",
  "xsat_quantity": "0.10000000 XSAT",
  "total_donated": "1.00000000 XSAT",
  "stake_debt": 1385452,
  "staking_reward_unclaimed": "0.00000000 XSAT",
  "staking_reward_claimed": "0.00000000 XSAT",
  "consensus_debt": 173181,
  "consensus_reward_unclaimed": "0.00000000 XSAT",
  "consensus_reward_claimed": "0.00000000 XSAT"
}
```

### TABLE `validators`

#### scope&#x20;

endrmng.sat

#### params

* `{name} owner` - staker id
* `{name} reward_recipient` - receiving account for receiving rewards
* `{string} memo` - memo when receiving reward transfer
* `{uint16_t} commission_rate` - commission ratio, decimal is 10^4
* `{asset} quantity` - the amount of BTC staked by the validator
* `{asset} qualification` - the qualification of the validator
* `{asset} xsat_quantity` - the amount of XSAT tokens staked by the validator
* `{uint16_t} donate_rate` - the donation rate, represented as a percentage, ex: 500 means 5.00%
* `{asset} total_donated` - the total amount of XSAT that has been donated
* `{uint128_t} stake_acc_per_share` - staking rewards earnings per share
* `{uint128_t} consensus_acc_per_share` - consensus reward earnings per share
* `{asset} staking_reward_unclaimed` - unclaimed staking rewards
* `{asset} staking_reward_claimed` - amount of stake claimed rewards
* `{asset} consensus_reward_unclaimed` - amount of consensus unclaimed rewards
* `{asset} consensus_reward_claimed` - amount of consensus claimed rewards
* `{asset} total_consensus_reward` - total consensus rewards
* `{asset} consensus_reward_balance` - consensus reward balance
* `{asset} total_staking_reward` - total staking rewards
* `{asset} staking_reward_balance` - staking reward balance
* `{time_point_sec} latest_staking_time` - latest staking or unstaking time
* `{uint64_t} latest_reward_block` - latest reward block
* `{time_point_sec} latest_reward_time` - latest reward time
* `{bool} disabled_staking` - whether to disable staking
* `{checksum160} stake_address` - stake address
* `{checksum160} reward_address` - reward address
* `{uint64_t} consecutive_vote_count` - consecutive vote count
* `{uint64_t} latest_consensus_block` - latest consensus block
* `{uint8_t} active_flag` - active flag
* `{uint8_t} role` - role

#### example

```json
{
  "owner": "alice",
  "reward_recipient": "erc2o.xsat",
  "memo": "0x5EB954fB68159e0b7950936C6e1947615b75C895",
  "commission_rate": 0,
  "quantity": "102.10000000 BTC",
  "qualification": "102.10000000 BTC",
  "xsat_quantity": "1000.10000000 XSAT",
  "donate_rate": 100,
  "total_donated": "100.00000000 XSAT",
  "stake_acc_per_share": "39564978",
  "consensus_acc_per_share": "4945621",
  "staking_reward_unclaimed": "0.00000000 XSAT",
  "staking_reward_claimed": "0.00000000 XSAT",
  "consensus_reward_unclaimed": "0.00000000 XSAT",
  "consensus_reward_claimed": "0.00000000 XSAT",
  "total_consensus_reward": "5.04700642 XSAT",
  "consensus_reward_balance": "5.04700642 XSAT",
  "total_staking_reward": "40.37605144 XSAT",
  "staking_reward_balance": "40.37605144 XSAT",
  "latest_staking_time": "2024-07-13T09:16:26",
  "latest_reward_block": 840001,
  "latest_reward_time": "2024-07-13T14:29:32",
  "disabled_staking": 0,
  "stake_address": "e4d68a77714d9d388d8233bee18d578559950cf5",
  "reward_address": "e4d68a77714d9d388d8233bee18d578559950cf5",
  "consecutive_vote_count": 1,
  "latest_consensus_block": 840000,
  "active_flag": 1,
  "role": 0
 }
```

### TABLE `stat`

#### scope&#x20;

endrmng.sat

#### params

* `{asset} total_staking` - btc total staking amount
* `{asset} xsat_total_staking` - the total amount of XSAT staked
* `{asset} xsat_total_donated` - the cumulative amount of XSAT donated

#### example

```json
{
  "total_staking": "100.40000000 BTC",
  "xsat_total_staking": "100.40000000 XSAT",
  "xsat_total_donated": "100.40000000 XSAT"
}
```

### ACTION `setdonateacc`

* **authority**: endrmng.sat

> Update donation account.

#### params

* `{string} donation_account` - account to receive donations
* `{uint16_t} min_donate_rate` - minimum donation rate

#### example

```bash
$ cleos push action endrmng.xsat setdonateacc '["alice", 2000]' -p endrmng.xsat
```

### ACTION `addwhitelist`

* **authority**: endrmng.sat

> Add whitelist account

#### params

* `{name} type` - whitelist type @see `WHITELIST_TYPES`
* `{name} account` - whitelist account

#### example

```bash
$ cleos push action endrmng.xsat addwhitelist '["proxyreg", "alice"]' -p endrmng.xsat
```

### ACTION `delwhitelist`

* **authority**: endrmng.sat

> Delete whitelist account

#### params

* `{name} type` - whitelist type @see `WHITELIST_TYPES`
* `{name} account` - whitelist account

#### example

```bash
$ cleos push action endrmng.xsat addwhitelist '["proxyreg", "alice"]' -p endrmng.xsat
```

### ACTION `addevmproxy`

* **authority**: endrmng.sat

> Add evm proxy account

#### params

* `{name} caller` - caller account
* `{checksum160} proxy` - proxy account

#### example

```bash
$ cleos push action endrmng.xsat addevmproxy '["evmcaller", "bb776ae86d5996908af46482f24be8ccde2d4c41"]' -p endrmng.xsat
```

### ACTION `delevmproxy`

* **authority**: endrmng.sat

> Delete evm proxy account

#### params

* `{name} caller` - caller account
* `{checksum160} proxy` - proxy account

#### example

```bash
$ cleos push action endrmng.xsat delevmproxy '["evmcaller", "bb776ae86d5996908af46482f24be8ccde2d4c41"]' -p endrmng.xsat
```

### ACTION `addcrdtproxy`

* **authority**: endrmng.sat

> Add credit proxy account

#### params

* `{checksum160} proxy` - proxy account

#### example

```bash
$ cleos push action endrmng.xsat addcrdtproxy '["bb776ae86d5996908af46482f24be8ccde2d4c41"]' -p endrmng.xsat
```

### ACTION `delcrdtproxy`

* **authority**: endrmng.sat

> Delete credit proxy account

#### params

* `{checksum160} proxy` - proxy account

#### example

```bash
$ cleos push action endrmng.xsat delcrdtproxy '["bb776ae86d5996908af46482f24be8ccde2d4c41"]' -p endrmng.xsat
```

### ACTION `setstatus`

* **authority**: endrmng.sat

> Set validator staking status

#### params

* `{name} validator` - validator account
* `{bool} disabled_staking` - whether to disable staking

#### example

```bash
$ cleos push action endrmng.xsat setstatus '["alice",  true]' -p alice
```

### ACTION `regvalidator`

* **authority**: `validator`

> Registering a validator

#### params

* `{name} validator` - validator account
* `{name} financial_account` - financial accounts
* `{uint16_t} commission_rate` - commission ratio, decimal is 10^4

#### example

```bash
$ cleos push action endrmng.xsat regvalidator '["alice", "alice", 1000]' -p alice
```

### ACTION `proxyreg`

* **authority**: `proxy`

> Proxy account registration validator

#### params

* `{name} proxy` - proxy account
* `{name} validator` - validator account
* `{string} financial_account` - financial accounts
* `{uint16_t} commission_rate` - commission ratio, decimal is 10^4

#### example

```bash
$ cleos push action endrmng.xsat proxyreg '["test.xsat", "alice", "alice",  1000]' -p test.xsat
```

### ACTION `config`

* **authority**: `validator`

> Validator sets commission ratio and financial account

#### params

* `{name} validator` - validator account
* `{optional<uint16_t>} commission_rate` - commission ratio, decimal is 10^4
* `{optional<string>} financial_account` - financial accounts

#### example

```bash
$ cleos push action endrmng.xsat config '["alice",  1000, "alice"]' -p alice
```

### ACTION `setdonate`

* **authority**: `validator`

> Configure donate rate.

#### params

* `{name} validator` - synchronizer account
* `{uint16_t} donate_rate` - the donation rate, represented as a percentage, ex: 500 means 5.00%

#### example

```bash
$ cleos push action endrmng.xsat setdonate '["alice", 100]' -p alice
```

### ACTION `stake`

* **authority**: `staking.xsat`

> Staking BTC to validator

#### params

* `{name} staker` - staker account
* `{name} validator` - validator account
* `{asset} quantity` - staking amount

#### example

```bash
$ cleos push action endrmng.xsat stake '["alice",  "alice", "1.00000000 BTC"]' -p staking.xsat
```

### ACTION `unstake`

* **authority**: `staking.xsat`

> Unstaking BTC from a validator

#### params

* `{name} staker` - staker account
* `{name} validator` - validator account
* `{asset} quantity` - cancel staking amount

#### example

```bash
$ cleos push action endrmng.xsat unstake '["alice",  "alice", "1.00000000 BTC"]' -p staking.xsat
```

### ACTION `newstake`

* **authority**: `staker`

> Staking BTC to a new validator

#### params

* `{name} staker` - staker account
* `{name} old_validator` - old validator account
* `{name} new_validator` - new validator account
* `{asset} quantity` - the amount of stake transferred to the new validator

#### example

```bash
$ cleos push action endrmng.xsat newstake '["alice",  "alice", "bob", "1.00000000 BTC"]' -p alice
```

### ACTION `claim`

* **authority**: `staker`

> Claim staking rewards

#### params

* `{name} staker` - staker account
* `{name} validator` - validator account

#### example

```bash
$ cleos push action endrmng.xsat claim '["alice",  "bob"]' -p alice
```

### ACTION `evmstake`

* **authority**: `caller`

> Staking BTC to validator via evm

#### params

* `{name} caller` - caller account
* `{checksum160} proxy` - evm proxy account
* `{checksum160} staker` - evm staker account
* `{name} validator` - validator account
* `{asset} quantity` - staking amount

#### example

```bash
$ cleos push action endrmng.xsat evmstake '["evmutil.xsat", "bb776ae86d5996908af46482f24be8ccde2d4c41", "e4d68a77714d9d388d8233bee18d578559950cf5",  "alice", "1.00000000 BTC"]' -p evmutil.xsat
```

### ACTION `evmunstake`

* **authority**: `caller`

> Unstake BTC from validator via evm

#### params

* `{name} caller` - caller account
* `{checksum160} proxy` - evm proxy account
* `{checksum160} staker` - evm staker account
* `{name} validator` - validator account
* `{asset} quantity` - staking amount

#### example

```bash
$ cleos push action endrmng.xsat evmunstake '["evmutil.xsat", "bb776ae86d5996908af46482f24be8ccde2d4c41", "e4d68a77714d9d388d8233bee18d578559950cf5",  "alice", "1.00000000 BTC"]' -p evmutil.xsat
```

### ACTION `evmnewstake`

* **authority**: `caller`

> Staking BTC to a new validator via evm

#### params

* `{name} caller` - caller account
* `{checksum160} proxy` - evm proxy account
* `{checksum160} staker` - evm staker account
* `{name} old_validator` - old validator account
* `{name} new_validator` - new validator account
* `{asset} quantity` - staking amount

#### example

```bash
$ cleos push action endrmng.xsat evmnewstake '["evmutil.xsat", "bb776ae86d5996908af46482f24be8ccde2d4c41", "e4d68a77714d9d388d8233bee18d578559950cf5",  "alice", "bob", "1.00000000 BTC"]' -p evmutil.xsat
```

### ACTION `evmclaim`

* **authority**: `caller`

> Claim staking rewards through evm

#### params

* `{name} caller` - caller account
* `{checksum160} proxy` - evm proxy account
* `{checksum160} staker` - evm staker account
* `{name} validator` - validator account

#### example

```bash
$ cleos push action endrmng.xsat evmclaim '["evmutil.xsat", "bb776ae86d5996908af46482f24be8ccde2d4c41", "e4d68a77714d9d388d8233bee18d578559950cf5",  "alice"]' -p evmutil.xsat
```

### ACTION `evmclaim2`

* **authority**: `caller`

> Claim staking rewards through evm

#### params

* `{name} caller` - caller account
* `{checksum160} proxy` - evm proxy account
* `{checksum160} staker` - evm staker account
* `{name} validator` - validator account
* `{uint16_t} donate_rate` - the donation rate, represented as a percentage, ex: 500 means 5.00%

#### example

```bash
$ cleos push action endrmng.xsat evmclaim2 '["evmutil.xsat", "bb776ae86d5996908af46482f24be8ccde2d4c41", "e4d68a77714d9d388d8233bee18d578559950cf5",  "alice", 100]' -p evmutil.xsat
```

### ACTION `vdrclaim`

* **authority**: `validator->reward_recipient` or `evmutil.xsat`

> Validator Receive Rewards

#### params

* `{name} validator` - validator account

#### example

```bash
$ cleos push action endrmng.xsat vdrclaim '["alice"]' -p alice
```

### STRUCT `reward_details_row`

#### params

* `{name} validator` - validator account
* `{asset} staking_rewards` - staking rewards
* `{asset} consensus_rewards` - consensus rewards

#### example

```json
{
  "validator": "alice",
  "staking_rewards": "0.00000010 XSAT",
  "consensus_rewards": "0.00000020 XSAT"
}
```

### ACTION `distribute`

* **authority**: `rwddist.xsat`

> Distributing validator rewards

#### params

* `{uint64_t} height` - validator account
* `{vector<reward_details_row>} rewards` - validator account

#### example

```bash
$ cleos push action endrmng.xsat distribute '[840000, [{"validator": "alice", "staking_rewards": "0.00000020 XSAT", "consensus_rewards": "0.00000020 XSAT"}]]' -p rwddist.xsat
```

### ACTION `stakexsat`

* **authority**: `xsatstk.xsat`

> Staking XSAT to validator

#### params

* `{name} staker` - staker account
* `{name} validator` - validator account
* `{asset} quantity` - staking amount

#### example

```bash
$ cleos push action endrmng.xsat stakexsat '["alice",  "alice", "1.00000000 XSAT"]' -p xsatstk.xsat
```

### ACTION `unstakexsat`

* **authority**: `xsatstk.xsat`

> Unstaking XSAT from a validator

#### params

* `{name} staker` - staker account
* `{name} validator` - validator account
* `{asset} quantity` - cancel staking amount

#### example

```bash
$ cleos push action endrmng.xsat unstakexsat '["alice",  "alice", "1.00000000 XSAT"]' -p xsatstk.xsat
```

### ACTION `restakexsat`

* **authority**: `staker`

> Staking XSAT to a new validator

#### params

* `{name} staker` - staker account
* `{name} old_validator` - old validator account
* `{name} new_validator` - new validator account
* `{asset} quantity` - the amount of stake transferred to the new validator

#### example

```bash
$ cleos push action endrmng.xsat restakexsat '["alice",  "alice", "bob", "1.00000000 XSAT"]' -p alice
```

### ACTION `evmstakexsat`

* **authority**: `caller`

> Staking XSAT to validator via evm

#### params

* `{name} caller` - caller account
* `{checksum160} proxy` - evm proxy account
* `{checksum160} staker` - evm staker account
* `{name} validator` - validator account
* `{asset} quantity` - staking amount

#### example

```bash
$ cleos push action endrmng.xsat evmstakexsat '["evmutil.xsat", "bb776ae86d5996908af46482f24be8ccde2d4c41", "e4d68a77714d9d388d8233bee18d578559950cf5",  "alice", "1.00000000 XSAT"]' -p evmutil.xsat
```

### ACTION `evmunstkxsat`

* **authority**: `caller`

> Unstake XSAT from validator via evm

#### params

* `{name} caller` - caller account
* `{checksum160} proxy` - evm proxy account
* `{checksum160} staker` - evm staker account
* `{name} validator` - validator account
* `{asset} quantity` - staking amount

#### example

```bash
$ cleos push action endrmng.xsat evmunstkxsat '["evmutil.xsat", "bb776ae86d5996908af46482f24be8ccde2d4c41", "e4d68a77714d9d388d8233bee18d578559950cf5",  "alice", "1.00000000 XSAT"]' -p evmutil.xsat
```

### ACTION `evmrestkxsat`

* **authority**: `caller`

> Staking XSAT to a new validator via evm

#### params

* `{name} caller` - caller account
* `{checksum160} proxy` - evm proxy account
* `{checksum160} staker` - evm staker account
* `{name} old_validator` - old validator account
* `{name} new_validator` - new validator account
* `{asset} quantity` - staking amount

#### example

```bash
$ cleos push action endrmng.xsat evmrestkxsat '["evmutil.xsat", "bb776ae86d5996908af46482f24be8ccde2d4c41", "e4d68a77714d9d388d8233bee18d578559950cf5",  "alice", "bob", "1.00000000 XSAT"]' -p evmutil.xsat
```

### ACTION `creditstake`

* **authority**: `custody.xsat`

> Unstake BTC from validator via credit

#### params

* `{checksum160} proxy` - evm proxy account
* `{checksum160} staker` - evm staker account
* `{name} validator` - validator account
* `{asset} quantity` - staking amount
* `{checksum160} stake_address` - stake address
* `{checksum160} reward_address` - reward address
* `{uint64_t} consecutive_vote_count` - consecutive vote count
* `{uint64_t} latest_consensus_block` - latest consensus block
* `{uint8_t} active_flag` - active flag (0: inactive, 1: active, 2: credit staking validator)
* `{uint32_t} role` - role (0: BTC, 1: XSAT)

#### example

```bash
$ cleos push action endrmng.xsat creditstake '["bb776ae86d5996908af46482f24be8ccde2d4c41", "e4d68a77714d9d388d8233bee18d578559950cf5",  "alice", "1.00000000 BTC"]' -p custody.xsat 
```

### ACTION `newregvldtor`

* **authority**: `validator`

> Register a new validator with additional parameters

#### params

* `{name} validator` - validator account
* `{uint32_t} role` - role (0: BTC, 1: XSAT)
* `{checksum160} stake_addr` - stake address
* `{optional<checksum160>} reward_addr` - reward address
* `{optional<uint16_t>} commission_rate` - commission ratio, decimal is 10^4

#### example

```bash
$ cleos push action endrmng.xsat newregvldtor '["alice", 0, "e4d68a77714d9d388d8233bee18d578559950cf5", "e4d68a77714d9d388d8233bee18d578559950cf5", 2000]' -p alice
```

### ACTION `evmconfigvald`

* **authority**: `validator`

> Configure validator commission and donate rates

#### params

* `{name} validator` - validator account
* `{optional<uint16_t>} commission_rate` - commission ratio, decimal is 10^4
* `{optional<uint16_t>} donate_rate` - the donation rate, represented as a percentage

#### example

```bash
$ cleos push action endrmng.xsat evmconfigvald '["alice", 2000, 100]' -p alice
```

### ACTION `evmsetstaker`

* **authority**: `validator`

> Set validator stake address

#### params

* `{name} validator` - validator account
* `{checksum160} stake_addr` - stake address

#### example

```bash
$ cleos push action endrmng.xsat evmsetstaker '["alice", "e4d68a77714d9d388d8233bee18d578559950cf5"]' -p alice
```

### ACTION `setrwdaddr`

* **authority**: `validator`

> Set validator reward address

#### params

* `{name} validator` - validator account
* `{checksum160} reward_addr` - reward address

#### example

```bash
$ cleos push action endrmng.xsat setrwdaddr '["alice", "e4d68a77714d9d388d8233bee18d578559950cf5"]' -p alice
```

### ACTION `setstakebase`

* **authority**: endrmng.sat

> Set base stake amounts for validators

#### params

* `{asset} xsat_base_stake` - XSAT base stake amount
* `{asset} btc_base_stake` - BTC base stake amount

#### example

```bash
$ cleos push action endrmng.xsat setstakebase '["2100 XSAT", "100 BTC"]' -p endrmng.xsat
```

### ACTION `updcreditstk`

* **authority**: endrmng.sat

> Update credit staking settings

#### params

* `{bool} is_close` - whether to close credit staking

#### example

```bash
$ cleos push action endrmng.xsat updcreditstk '[true]' -p endrmng.xsat
```

### ACTION `endorse`

* **authority**: `BLOCK_ENDORSE_CONTRACT`

> Endorse a validator for a specific block height

#### params

* `{name} validator` - validator account
* `{uint64_t} height` - block height

#### example

```bash
$ cleos push action endrmng.xsat endorse '["alice", 840000]' -p block_endorse.xsat
```

### ACTION `setdepproxy`

* **authority**: endrmng.sat

> Set deposit proxy accounts

#### params

* `{checksum160} btc_deposit_proxy` - BTC deposit proxy
* `{checksum160} xsat_deposit_proxy` - XSAT deposit proxy

#### example

```bash
$ cleos push action endrmng.xsat setdepproxy '["bb776ae86d5996908af46482f24be8ccde2d4c41", "e4d68a77714d9d388d8233bee18d578559950cf5"]' -p endrmng.xsat
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.exsat.network/developer-guides/native-layer-developer-guides/exsat-consensus-contracts/validator-management-contract.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
