> For the complete documentation index, see [llms.txt](https://vinu.gitbook.io/vinuchain/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://vinu.gitbook.io/vinuchain/technical-docs/nodes-and-validators/validator-calls.md).

# Validator Calls

### Create validator

Create a new validator

Current minimum stake is `sfcc.minSelfStake()`

`pubkey` is a public key used to authenticate future validator's consensus messages. `pubkey` cannot be changed after the call.

#### Pubkey format

`pubkey` MUST be the canonical lachesis-base wire format: 66 bytes, beginning with the `0xc0` Secp256k1 type-byte followed by a 65-byte uncompressed secp256k1 public key (`0x04` marker + 32-byte X coordinate + 32-byte Y coordinate). As a hex string with the `0x` prefix that is 134 characters total: `0xc004` + 128 hex characters.

The canonical way to obtain a correctly-shaped pubkey is to run `./opera validator new` (see [Become a validator](/vinuchain/technical-docs/nodes-and-validators/become-a-validator.md#create-the-validator-wallet)). Copy the value labeled `Public key:` byte-for-byte — opera always emits the canonical format.

**Do not** construct the pubkey by other means. Submitting a 65-byte payload that begins with `0x04` (the bare uncompressed key without the `0xc0` type-byte) is the most common failure mode — it superficially looks like an ECDSA pubkey but is not the format lachesis-base verifies signatures against. A validator admitted with that shape produces no verifiable consensus events, earns zero uptime, and any stake delegated to it earns zero rewards.

`createValidator` rejects `pubkey.length != 66` with `"invalid pubkey length"` and `pubkey[0] != 0xc0` with `"invalid pubkey type"`.

The call creates a self-delegation with the specified amount. Validator uses the same calls as other delegators. Visit [delegation calls](/vinuchain/technical-docs/nodes-and-validators/delegation-calls.md), [reward calls](/vinuchain/technical-docs/nodes-and-validators/reward-calls.md), [stake lockup calls](/vinuchain/technical-docs/nodes-and-validators/lockup-calls.md) for additional details.

```
sfcc.createValidator("0xc004...", {from:"0xAddress", value: web3.toWei("amount", "vc")})
```

#### **Checks**

* Self-stake amount is greater or equal to `sfcc.minSelfStake()`
* This address wasn't used for other validator
* `pubkey.length == 66` (rejects payloads of any other length)
* `pubkey[0] == 0xc0` (rejects payloads with any other type-byte, including the 65-byte `0x04`-prefixed bare uncompressed-secp256k1 shape)

### Reactivate validator (testnet owner-only)

`reactivateValidator(uint256)` exists on the current testnet SFC deployment only. It is an SFC owner/admin operation, not a validator self-service call.

```
sfcc.reactivateValidator(<VID>, { from: sfcc.owner() })
```

#### **Checks**

* Testnet only; mainnet does not expose this recovery path.
* The transaction sender must be `sfcc.owner()`.
* The validator must already exist and be deactivated.
* The validator must not be slashed / double-sign marked.
* Self-stake must still be greater than or equal to `sfcc.minSelfStake()`.

If an external validator operator needs reactivation, they should first bring the node back online in synced validator mode, then request owner/admin reactivation through official VinuChain channels. See [Troubleshooting -> Reviving a dead or long-offline validator](https://vinu.gitbook.io/vinuchain/technical-docs/nodes-and-validators/pages/r3BpXDCiVnod3kcGTlZa#id-8.-reviving-a-dead-or-long-offline-validator-testnet).
