Undelegate Claim Descriptions

Each undelegate claim contains a UndelegateClaimBody and a zk-SNARK undelegate claim proof.


The body of a UndelegateClaim has four parts:

  1. The validator IdentityKey being undelegated from;
  2. The penalty to apply to the undelegation;
  3. The balance contribution which commits to the value balance of the action;
  4. The height at which unbonding started.


Local Invariants

  1. You cannot claim undelegations that have not finishing unbonding.

  2. Slashing penalties must be applied when unbonding.

  3. The UndelegateClaim reveals the validator identity, but not the unbonding amount.

  4. The balance contribution of the value of the undelegation is private.

Local Justification

  1. In the ActionHandler we check that the undelegations have finished unbonding.

  2. The ConvertCircuit verifies that the conversion from the unbonding token to the staking token was done using the correct conversion rate calculated from the penalty. We check in the ActionHandler that the correct penalty rate was used.

  3. The UndelegateClaim performs the above conversion check in 2 in zero-knowledge using the private unbonding amount.

  4. The balance contribution of the value of the undelegation is hidden via the hiding property of the balance commitment scheme. Knowledge of the opening of the balance commitment is done in zero-knowledge.

Global Justification

1.1. This action consumes the amount of the unbonding tokens and contributes the unbonded amount of the staking tokens to the transaction’s value balance. Value is not created due to system level invariant 1, which ensures that transactions contribute a 0 value balance.

zk-SNARK Statements

The undelegate claim proof is implemented as an instance of a generic convert circuit which converts a private amount of one input asset into a target asset, given a public conversion rate.

First we describe the convert circuit, and then the undelegate claim proof.

Convert zk-SNARK Statements

The convert circuit demonstrates the properties enumerated below for the private witnesses known by the prover:

  • Input amount interpreted as an and constrained to fit in 128 bits
  • Balance blinding factor used to blind the balance commitment

And the corresponding public inputs:

  • Balance commitment to the value balance
  • Rate , a 128-bit fixed point value, represented in circuit as four 64-bit (Boolean constraint) limbs
  • Asset ID of the input (source) amount
  • Asset ID of the target amount

Balance Commitment Integrity

The zk-SNARK certifies that the public input balance commitment was derived from the witnessed values as:


  • is a constant generator
  • is the expected balance computed from the public conversion rate and the input amount , i.e.
  • is the asset-specific generator corresponding to the input token with asset ID
  • is the asset-specific generator corresponding to the target token with asset ID .

Both these asset-specific bases and are derived in-circuit as described in Assets and Values.

Undelegate Claim

The undelegate claim proof uses the convert circuit statements above where:

  • The input amount is set to the unbonding amount
  • The rate is set to the Penalty
  • Asset ID is the unbonding token asset ID
  • Asset ID is the staking token asset ID