ContractDefinition.java
/*
* @copyright defined in LICENSE.txt
*/
package hera.api.model;
import static hera.util.ValidationUtils.assertNotNull;
import static java.util.Arrays.asList;
import static java.util.Collections.emptyList;
import static java.util.Collections.unmodifiableList;
import hera.annotation.ApiAudience;
import hera.annotation.ApiStability;
import hera.spec.resolver.ContractDefinitionSpec;
import hera.util.BytesValueUtils;
import hera.util.EncodingUtils;
import java.util.List;
import lombok.NonNull;
import lombok.Value;
@ApiAudience.Public
@ApiStability.Unstable
@Value
public class ContractDefinition {
@ApiAudience.Public
public static ContractDefinitionWithNothing newBuilder() {
return new ContractDefinition.Builder();
}
@NonNull
BytesValue decodedContract;
@NonNull
String encodedContract;
@NonNull
List<Object> constructorArgs;
@NonNull
Aer amount;
ContractDefinition(final String encodedContract, final List<Object> args,
final Aer amount) {
assertNotNull(encodedContract, "Encoded contract must not null");
assertNotNull(args, "Args must not null");
assertNotNull(amount, "Amount must not null");
final BytesValue decodedContract = EncodingUtils.decodeBase58WithCheck(encodedContract);
BytesValueUtils.validatePrefix(decodedContract, ContractDefinitionSpec.PAYLOAD_VERSION);
this.decodedContract = decodedContract;
this.encodedContract = encodedContract;
this.constructorArgs = unmodifiableList(args);
this.amount = amount;
}
public interface ContractDefinitionWithNothing {
ContractDefinitionWithPayloadReady encodedContract(String encodedContract);
}
public interface ContractDefinitionWithPayloadReady
extends hera.util.Builder<ContractDefinition> {
ContractDefinitionWithPayloadReady constructorArgs(Object... args);
ContractDefinitionWithPayloadReady amount(Aer amount);
}
protected static class Builder
implements ContractDefinitionWithNothing, ContractDefinitionWithPayloadReady {
protected String encodedContract;
protected List<Object> constructorArgs = emptyList();
protected Aer amount = Aer.EMPTY;
@Override
public ContractDefinitionWithPayloadReady encodedContract(final String encodedContract) {
this.encodedContract = encodedContract;
return this;
}
@Override
public ContractDefinitionWithPayloadReady amount(final Aer amount) {
this.amount = amount;
return this;
}
@Override
public ContractDefinitionWithPayloadReady constructorArgs(final Object... args) {
this.constructorArgs = asList(args);
return this;
}
@Override
public ContractDefinition build() {
return new ContractDefinition(encodedContract, constructorArgs, amount);
}
}
}