mirror of
https://github.com/Qortal/qortal.git
synced 2025-03-26 23:44:34 +00:00
Merge branch 'add-create-bytes-endpoint'
This commit is contained in:
commit
5983e6ccc9
102
src/main/java/org/qortal/api/model/AtCreationRequest.java
Normal file
102
src/main/java/org/qortal/api/model/AtCreationRequest.java
Normal file
@ -0,0 +1,102 @@
|
|||||||
|
package org.qortal.api.model;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
|
||||||
|
import javax.xml.bind.annotation.XmlAccessType;
|
||||||
|
import javax.xml.bind.annotation.XmlAccessorType;
|
||||||
|
import javax.xml.bind.annotation.XmlTransient;
|
||||||
|
|
||||||
|
import org.bouncycastle.util.encoders.Base64;
|
||||||
|
import org.bouncycastle.util.encoders.DecoderException;
|
||||||
|
|
||||||
|
@XmlAccessorType(XmlAccessType.FIELD)
|
||||||
|
public class AtCreationRequest {
|
||||||
|
|
||||||
|
@Schema(description = "CIYAM AT version", example = "2")
|
||||||
|
private short ciyamAtVersion;
|
||||||
|
|
||||||
|
@Schema(description = "base64-encoded code bytes", example = "")
|
||||||
|
private String codeBytesBase64;
|
||||||
|
|
||||||
|
@Schema(description = "base64-encoded data bytes", example = "")
|
||||||
|
private String dataBytesBase64;
|
||||||
|
|
||||||
|
private short numCallStackPages;
|
||||||
|
private short numUserStackPages;
|
||||||
|
private long minActivationAmount;
|
||||||
|
|
||||||
|
// Default constructor for JSON deserialization
|
||||||
|
public AtCreationRequest() {}
|
||||||
|
|
||||||
|
// Getters and setters
|
||||||
|
public short getCiyamAtVersion() {
|
||||||
|
return ciyamAtVersion;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCiyamAtVersion(short ciyamAtVersion) {
|
||||||
|
this.ciyamAtVersion = ciyamAtVersion;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public String getCodeBytesBase64() {
|
||||||
|
return this.codeBytesBase64;
|
||||||
|
}
|
||||||
|
|
||||||
|
@XmlTransient
|
||||||
|
@Schema(hidden = true)
|
||||||
|
public byte[] getCodeBytes() {
|
||||||
|
if (this.codeBytesBase64 != null) {
|
||||||
|
try {
|
||||||
|
return Base64.decode(this.codeBytesBase64);
|
||||||
|
}
|
||||||
|
catch (DecoderException e) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public String getDataBytesBase64() {
|
||||||
|
return this.dataBytesBase64;
|
||||||
|
}
|
||||||
|
|
||||||
|
@XmlTransient
|
||||||
|
@Schema(hidden = true)
|
||||||
|
public byte[] getDataBytes() {
|
||||||
|
if (this.dataBytesBase64 != null) {
|
||||||
|
try {
|
||||||
|
return Base64.decode(this.dataBytesBase64);
|
||||||
|
}
|
||||||
|
catch (DecoderException e) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public short getNumCallStackPages() {
|
||||||
|
return numCallStackPages;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setNumCallStackPages(short numCallStackPages) {
|
||||||
|
this.numCallStackPages = numCallStackPages;
|
||||||
|
}
|
||||||
|
|
||||||
|
public short getNumUserStackPages() {
|
||||||
|
return numUserStackPages;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setNumUserStackPages(short numUserStackPages) {
|
||||||
|
this.numUserStackPages = numUserStackPages;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getMinActivationAmount() {
|
||||||
|
return minActivationAmount;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMinActivationAmount(long minActivationAmount) {
|
||||||
|
this.minActivationAmount = minActivationAmount;
|
||||||
|
}
|
||||||
|
}
|
@ -27,6 +27,7 @@ import org.qortal.api.ApiException;
|
|||||||
import org.qortal.api.ApiExceptionFactory;
|
import org.qortal.api.ApiExceptionFactory;
|
||||||
import org.qortal.data.at.ATData;
|
import org.qortal.data.at.ATData;
|
||||||
import org.qortal.data.at.ATStateData;
|
import org.qortal.data.at.ATStateData;
|
||||||
|
import org.qortal.api.model.AtCreationRequest;
|
||||||
import org.qortal.data.transaction.DeployAtTransactionData;
|
import org.qortal.data.transaction.DeployAtTransactionData;
|
||||||
import org.qortal.repository.DataException;
|
import org.qortal.repository.DataException;
|
||||||
import org.qortal.repository.Repository;
|
import org.qortal.repository.Repository;
|
||||||
@ -38,9 +39,14 @@ import org.qortal.transform.TransformationException;
|
|||||||
import org.qortal.transform.transaction.DeployAtTransactionTransformer;
|
import org.qortal.transform.transaction.DeployAtTransactionTransformer;
|
||||||
import org.qortal.utils.Base58;
|
import org.qortal.utils.Base58;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
|
||||||
@Path("/at")
|
@Path("/at")
|
||||||
@Tag(name = "Automated Transactions")
|
@Tag(name = "Automated Transactions")
|
||||||
public class AtResource {
|
public class AtResource {
|
||||||
|
private static final Logger logger = LoggerFactory.getLogger(AtResource.class);
|
||||||
|
|
||||||
@Context
|
@Context
|
||||||
HttpServletRequest request;
|
HttpServletRequest request;
|
||||||
@ -156,6 +162,52 @@ public class AtResource {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@POST
|
||||||
|
@Path("/create")
|
||||||
|
@Operation(
|
||||||
|
summary = "Create base58-encoded AT creation bytes from the provided parameters",
|
||||||
|
requestBody = @RequestBody(
|
||||||
|
required = true,
|
||||||
|
content = @Content(
|
||||||
|
mediaType = MediaType.APPLICATION_JSON,
|
||||||
|
schema = @Schema(
|
||||||
|
implementation = AtCreationRequest.class
|
||||||
|
)
|
||||||
|
)
|
||||||
|
),
|
||||||
|
responses = {
|
||||||
|
@ApiResponse(
|
||||||
|
description = "AT creation bytes suitable for use in a DEPLOY_AT transaction",
|
||||||
|
content = @Content(
|
||||||
|
mediaType = MediaType.TEXT_PLAIN,
|
||||||
|
schema = @Schema(
|
||||||
|
type = "string"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
public String create(AtCreationRequest atCreationRequest) {
|
||||||
|
if (atCreationRequest.getCiyamAtVersion() < 2) {
|
||||||
|
throw ApiExceptionFactory.INSTANCE.createCustomException(request, ApiError.INVALID_CRITERIA, "ciyamAtVersion must be at least 2");
|
||||||
|
}
|
||||||
|
if (atCreationRequest.getCodeBytes() == null) {
|
||||||
|
throw ApiExceptionFactory.INSTANCE.createCustomException(request, ApiError.INVALID_CRITERIA, "Valid codeBytesBase64 must be supplied");
|
||||||
|
}
|
||||||
|
if (atCreationRequest.getDataBytes() == null) {
|
||||||
|
throw ApiExceptionFactory.INSTANCE.createCustomException(request, ApiError.INVALID_CRITERIA, "Valid dataBytesBase64 must be supplied");
|
||||||
|
}
|
||||||
|
|
||||||
|
byte[] creationBytes = MachineState.toCreationBytes(
|
||||||
|
atCreationRequest.getCiyamAtVersion(),
|
||||||
|
atCreationRequest.getCodeBytes(),
|
||||||
|
atCreationRequest.getDataBytes(),
|
||||||
|
atCreationRequest.getNumCallStackPages(),
|
||||||
|
atCreationRequest.getNumUserStackPages(),
|
||||||
|
atCreationRequest.getMinActivationAmount()
|
||||||
|
);
|
||||||
|
return Base58.encode(creationBytes);
|
||||||
|
}
|
||||||
@POST
|
@POST
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Build raw, unsigned, DEPLOY_AT transaction",
|
summary = "Build raw, unsigned, DEPLOY_AT transaction",
|
||||||
|
Loading…
x
Reference in New Issue
Block a user