AergoSpec.java

package hera.spec;

import hera.api.model.AccountAddress;
import hera.api.model.ContractDefinition;
import hera.api.model.ContractInvocation;
import java.math.BigDecimal;
import lombok.Getter;
import lombok.RequiredArgsConstructor;

public class AergoSpec {

  /* address, name, private key */

  public static final byte ADDRESS_PREFIX = 0x42;

  // [odd|even] of publickey.y + [optional 0x00] + publickey.x
  // which is equivalent with s compressed public key (see also X9.62 s 4.2.1)
  public static final int ADDRESS_BYTE_LENGTH = 33;

  public static final int NAME_LENGTH = 12;

  public static final byte ENCRYPTED_PRIVATE_KEY_PREFIX = (byte) 0xAA;


  /* amount unit */

  @RequiredArgsConstructor
  public enum Unit {
    AER("Aer", new BigDecimal("1"), new BigDecimal("1")),
    GAER("Gaer", new BigDecimal("1.E-9"), new BigDecimal("1.E9")),
    AERGO("Aergo", new BigDecimal("1.E-18"), new BigDecimal("1.E18"));

    @Getter
    protected final String name;

    @Getter
    protected final BigDecimal minimum;

    @Getter
    protected final BigDecimal ratio;
  }


  /* payload */

  public static final String PAYLOAD_VERSION = "v1";

  public enum PayloadType {
    ContractDefinition("", ContractDefinition.class),
    ContractInvocation("", ContractInvocation.class),
    Vote("", String.class, String[].class),
    Stake("stake"),
    Unstake("unstake"),
    CreateName("createName", String.class),
    UpdateName("updateName", String.class, AccountAddress.class);

    @Getter
    protected final String name;
    @Getter
    protected final Class<?>[] targets;

    private PayloadType(final String name, final Class<?>... targets) {
      this.name = name;
      this.targets = targets;
    }
  }

  public static final String BIGNUM_JSON_KEY = "_bignum";

  public static final byte CONTRACT_PAYLOAD_VERSION = (byte) 0xC0;


  /* signature */

  public static final int SIGN_HEADER_MAGIC = 0x30;

  public static final int SIGN_INT_MARKER = 0x02;

  // minimum length of a DER encoded signature which both R and S are 1 byte each.
  // <header-magic> + <1-byte> + <int-marker> + 0x01 + <r.byte> + <int-marker> + 0x01 + <s.byte>
  public static final int SIGN_MINIMUM_LENGTH = 8;

}