ContractDefinition.java

  1. /*
  2.  * @copyright defined in LICENSE.txt
  3.  */

  4. package hera.api.model;

  5. import static hera.util.ValidationUtils.assertNotNull;
  6. import static java.util.Arrays.asList;
  7. import static java.util.Collections.emptyList;
  8. import static java.util.Collections.unmodifiableList;

  9. import hera.annotation.ApiAudience;
  10. import hera.annotation.ApiStability;
  11. import hera.spec.resolver.ContractDefinitionSpec;
  12. import hera.util.BytesValueUtils;
  13. import hera.util.EncodingUtils;
  14. import java.util.List;
  15. import lombok.NonNull;
  16. import lombok.Value;

  17. @ApiAudience.Public
  18. @ApiStability.Unstable
  19. @Value
  20. public class ContractDefinition {

  21.   @ApiAudience.Public
  22.   public static ContractDefinitionWithNothing newBuilder() {
  23.     return new ContractDefinition.Builder();
  24.   }

  25.   @NonNull
  26.   BytesValue decodedContract;

  27.   @NonNull
  28.   String encodedContract;

  29.   @NonNull
  30.   List<Object> constructorArgs;

  31.   @NonNull
  32.   Aer amount;

  33.   ContractDefinition(final String encodedContract, final List<Object> args,
  34.       final Aer amount) {
  35.     assertNotNull(encodedContract, "Encoded contract must not null");
  36.     assertNotNull(args, "Args must not null");
  37.     assertNotNull(amount, "Amount must not null");
  38.     final BytesValue decodedContract = EncodingUtils.decodeBase58WithCheck(encodedContract);
  39.     BytesValueUtils.validatePrefix(decodedContract, ContractDefinitionSpec.PAYLOAD_VERSION);

  40.     this.decodedContract = decodedContract;
  41.     this.encodedContract = encodedContract;
  42.     this.constructorArgs = unmodifiableList(args);
  43.     this.amount = amount;
  44.   }

  45.   public interface ContractDefinitionWithNothing {
  46.     ContractDefinitionWithPayloadReady encodedContract(String encodedContract);
  47.   }

  48.   public interface ContractDefinitionWithPayloadReady
  49.       extends hera.util.Builder<ContractDefinition> {
  50.     ContractDefinitionWithPayloadReady constructorArgs(Object... args);

  51.     ContractDefinitionWithPayloadReady amount(Aer amount);
  52.   }

  53.   protected static class Builder
  54.       implements ContractDefinitionWithNothing, ContractDefinitionWithPayloadReady {

  55.     protected String encodedContract;

  56.     protected List<Object> constructorArgs = emptyList();

  57.     protected Aer amount = Aer.EMPTY;

  58.     @Override
  59.     public ContractDefinitionWithPayloadReady encodedContract(final String encodedContract) {
  60.       this.encodedContract = encodedContract;
  61.       return this;
  62.     }

  63.     @Override
  64.     public ContractDefinitionWithPayloadReady amount(final Aer amount) {
  65.       this.amount = amount;
  66.       return this;
  67.     }

  68.     @Override
  69.     public ContractDefinitionWithPayloadReady constructorArgs(final Object... args) {
  70.       this.constructorArgs = asList(args);
  71.       return this;
  72.     }

  73.     @Override
  74.     public ContractDefinition build() {
  75.       return new ContractDefinition(encodedContract, constructorArgs, amount);
  76.     }

  77.   }

  78. }