> ## Documentation Index
> Fetch the complete documentation index at: https://docs.aultblockchain.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Precompile: Staking

## Address

`0x0000000000000000000000000000000000000800`

## Supported Methods

### Transactions

| Signature                                                   |
| ----------------------------------------------------------- |
| `delegate(address,string,uint256)`                          |
| `cancelUnbondingDelegation(address,string,uint256,uint256)` |
| `redelegate(address,string,string,uint256)`                 |
| `undelegate(address,string,uint256)`                        |

### Queries

| Signature                                    |
| -------------------------------------------- |
| `delegation(address,string)`                 |
| `redelegation(address,string,string)`        |
| `redelegations(address,string,string,tuple)` |
| `unbondingDelegation(address,string)`        |
| `validator(address)`                         |
| `validators(string,tuple)`                   |

## Query Examples

Set the current testnet EVM JSON-RPC endpoint and precompile address:

```bash theme={null}
export RPC_URL="https://test-json-rpc.cloud.aultblockchain.xyz"
export STAKING_PRECOMPILE="0x0000000000000000000000000000000000000800"
```

### Direct call

```bash theme={null}
cast call "$STAKING_PRECOMPILE" \
  "validators(string,(bytes,uint64,uint64,bool,bool))((string,string,bool,uint8,uint256,uint256,(string,string,string,string,string),int64,int64,uint256,uint256)[],(bytes,uint64))" \
  "" \
  "(0x,0,20,false,false)" \
  --rpc-url "$RPC_URL"
```

### Call from contract

```solidity theme={null}
address constant STAKING = 0x0000000000000000000000000000000000000800;

struct PageRequest {
    bytes key;
    uint64 offset;
    uint64 limit;
    bool countTotal;
    bool reverse;
}

function queryStakingValidators() external view returns (bytes memory) {
    PageRequest memory page = PageRequest("", 0, 20, false, false);
    (bool ok, bytes memory out) = STAKING.staticcall(
        abi.encodeWithSignature(
            "validators(string,(bytes,uint64,uint64,bool,bool))",
            "",
            page
        )
    );
    require(ok, "precompile call failed");
    return out;
}
```

## Transaction Examples

### Environment Variables

```bash theme={null}
cast wallet import ault-ops --interactive

export CAST_ACCOUNT="ault-ops"
export FROM="$(cast wallet address --account "$CAST_ACCOUNT")"
export VALOPER="<aultvaloper...>"
export AMOUNT="<amount_uint256>"
```

### Direct call

```bash theme={null}
cast send "$STAKING_PRECOMPILE" \
  "delegate(address,string,uint256)" \
  "$FROM" \
  "$VALOPER" \
  "$AMOUNT" \
  --rpc-url "$RPC_URL" \
  --account "$CAST_ACCOUNT"
```

### Call from contract

```solidity theme={null}
address constant STAKING = 0x0000000000000000000000000000000000000800;

function txStakingDelegate(
    string calldata validator,
    uint256 amount
) external returns (bool) {
    (bool ok, bytes memory out) = STAKING.call(
        abi.encodeWithSignature(
            "delegate(address,string,uint256)",
            msg.sender,
            validator,
            amount
        )
    );
    require(ok, "precompile call failed");
    return abi.decode(out, (bool));
}
```

## Notes

* Validator arguments use the Cosmos validator operator address format (`aultvaloper...`).
* Amounts are specified in base units (`aault`).

## ABI

<a href="/assets/abi/staking_precompile_abi.json" download>
  Download Staking ABI JSON
</a>
