forked from Qortal/qortal
Enabled fee updates for foreign coin trade transactions.
This commit is contained in:
parent
867fe764ca
commit
21c45535be
@ -8,6 +8,7 @@ import io.swagger.v3.oas.annotations.parameters.RequestBody;
|
|||||||
import io.swagger.v3.oas.annotations.responses.ApiResponse;
|
import io.swagger.v3.oas.annotations.responses.ApiResponse;
|
||||||
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
|
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
|
||||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||||
|
import org.bitcoinj.core.Coin;
|
||||||
import org.bitcoinj.core.Transaction;
|
import org.bitcoinj.core.Transaction;
|
||||||
import org.qortal.api.ApiError;
|
import org.qortal.api.ApiError;
|
||||||
import org.qortal.api.ApiErrors;
|
import org.qortal.api.ApiErrors;
|
||||||
@ -265,4 +266,117 @@ public class CrossChainBitcoinResource {
|
|||||||
|
|
||||||
return CrossChainUtils.buildServerConfigurationInfo(Bitcoin.getInstance());
|
return CrossChainUtils.buildServerConfigurationInfo(Bitcoin.getInstance());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@GET
|
||||||
|
@Path("/feekb")
|
||||||
|
@Operation(
|
||||||
|
summary = "Returns Bitcoin fee per Kb.",
|
||||||
|
description = "Returns Bitcoin fee per Kb.",
|
||||||
|
responses = {
|
||||||
|
@ApiResponse(
|
||||||
|
content = @Content(
|
||||||
|
schema = @Schema(
|
||||||
|
type = "number"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
public String getBitcoinFeePerKb() {
|
||||||
|
Bitcoin bitcoin = Bitcoin.getInstance();
|
||||||
|
|
||||||
|
return String.valueOf(bitcoin.getFeePerKb().value);
|
||||||
|
}
|
||||||
|
|
||||||
|
@POST
|
||||||
|
@Path("/updatefeekb")
|
||||||
|
@Operation(
|
||||||
|
summary = "Sets Bitcoin fee per Kb.",
|
||||||
|
description = "Sets Bitcoin fee per Kb.",
|
||||||
|
requestBody = @RequestBody(
|
||||||
|
required = true,
|
||||||
|
content = @Content(
|
||||||
|
mediaType = MediaType.TEXT_PLAIN,
|
||||||
|
schema = @Schema(
|
||||||
|
type = "number",
|
||||||
|
description = "the fee per Kb",
|
||||||
|
example = "100"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
),
|
||||||
|
responses = {
|
||||||
|
@ApiResponse(
|
||||||
|
content = @Content(mediaType = MediaType.TEXT_PLAIN, schema = @Schema(type = "number", description = "fee"))
|
||||||
|
)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
@ApiErrors({ApiError.INVALID_PRIVATE_KEY, ApiError.INVALID_CRITERIA})
|
||||||
|
public String setBitcoinFeePerKb(@HeaderParam(Security.API_KEY_HEADER) String apiKey, String fee) {
|
||||||
|
Security.checkApiCallAllowed(request);
|
||||||
|
|
||||||
|
Bitcoin bitcoin = Bitcoin.getInstance();
|
||||||
|
|
||||||
|
try {
|
||||||
|
return CrossChainUtils.setFeePerKb(bitcoin, fee);
|
||||||
|
} catch (IllegalArgumentException e) {
|
||||||
|
throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.INVALID_CRITERIA);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@GET
|
||||||
|
@Path("/feeceiling")
|
||||||
|
@Operation(
|
||||||
|
summary = "Returns Bitcoin fee per Kb.",
|
||||||
|
description = "Returns Bitcoin fee per Kb.",
|
||||||
|
responses = {
|
||||||
|
@ApiResponse(
|
||||||
|
content = @Content(
|
||||||
|
schema = @Schema(
|
||||||
|
type = "number"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
public String getBitcoinFeeCeiling() {
|
||||||
|
Bitcoin bitcoin = Bitcoin.getInstance();
|
||||||
|
|
||||||
|
return String.valueOf(bitcoin.getFeeCeiling());
|
||||||
|
}
|
||||||
|
|
||||||
|
@POST
|
||||||
|
@Path("/updatefeeceiling")
|
||||||
|
@Operation(
|
||||||
|
summary = "Sets Bitcoin fee ceiling.",
|
||||||
|
description = "Sets Bitcoin fee ceiling.",
|
||||||
|
requestBody = @RequestBody(
|
||||||
|
required = true,
|
||||||
|
content = @Content(
|
||||||
|
mediaType = MediaType.TEXT_PLAIN,
|
||||||
|
schema = @Schema(
|
||||||
|
type = "number",
|
||||||
|
description = "the fee",
|
||||||
|
example = "100"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
),
|
||||||
|
responses = {
|
||||||
|
@ApiResponse(
|
||||||
|
content = @Content(mediaType = MediaType.TEXT_PLAIN, schema = @Schema(type = "number", description = "fee"))
|
||||||
|
)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
@ApiErrors({ApiError.INVALID_PRIVATE_KEY, ApiError.INVALID_CRITERIA})
|
||||||
|
public String setBitcoinFeeCeiling(@HeaderParam(Security.API_KEY_HEADER) String apiKey, String fee) {
|
||||||
|
Security.checkApiCallAllowed(request);
|
||||||
|
|
||||||
|
Bitcoin bitcoin = Bitcoin.getInstance();
|
||||||
|
|
||||||
|
try {
|
||||||
|
return CrossChainUtils.setFeeCeiling(bitcoin, fee);
|
||||||
|
}
|
||||||
|
catch (IllegalArgumentException e) {
|
||||||
|
throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.INVALID_CRITERIA);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -265,4 +265,117 @@ public class CrossChainDigibyteResource {
|
|||||||
|
|
||||||
return CrossChainUtils.buildServerConfigurationInfo(Digibyte.getInstance());
|
return CrossChainUtils.buildServerConfigurationInfo(Digibyte.getInstance());
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
@GET
|
||||||
|
@Path("/feekb")
|
||||||
|
@Operation(
|
||||||
|
summary = "Returns Digibyte fee per Kb.",
|
||||||
|
description = "Returns Digibyte fee per Kb.",
|
||||||
|
responses = {
|
||||||
|
@ApiResponse(
|
||||||
|
content = @Content(
|
||||||
|
schema = @Schema(
|
||||||
|
type = "number"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
public String getDigibyteFeePerKb() {
|
||||||
|
Digibyte digibyte = Digibyte.getInstance();
|
||||||
|
|
||||||
|
return String.valueOf(digibyte.getFeePerKb().value);
|
||||||
|
}
|
||||||
|
|
||||||
|
@POST
|
||||||
|
@Path("/updatefeekb")
|
||||||
|
@Operation(
|
||||||
|
summary = "Sets Digibyte fee per Kb.",
|
||||||
|
description = "Sets Digibyte fee per Kb.",
|
||||||
|
requestBody = @RequestBody(
|
||||||
|
required = true,
|
||||||
|
content = @Content(
|
||||||
|
mediaType = MediaType.TEXT_PLAIN,
|
||||||
|
schema = @Schema(
|
||||||
|
type = "number",
|
||||||
|
description = "the fee per Kb",
|
||||||
|
example = "100"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
),
|
||||||
|
responses = {
|
||||||
|
@ApiResponse(
|
||||||
|
content = @Content(mediaType = MediaType.TEXT_PLAIN, schema = @Schema(type = "number", description = "fee"))
|
||||||
|
)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
@ApiErrors({ApiError.INVALID_PRIVATE_KEY, ApiError.INVALID_CRITERIA})
|
||||||
|
public String setDigibyteFeePerKb(@HeaderParam(Security.API_KEY_HEADER) String apiKey, String fee) {
|
||||||
|
Security.checkApiCallAllowed(request);
|
||||||
|
|
||||||
|
Digibyte digibyte = Digibyte.getInstance();
|
||||||
|
|
||||||
|
try {
|
||||||
|
return CrossChainUtils.setFeePerKb(digibyte, fee);
|
||||||
|
} catch (IllegalArgumentException e) {
|
||||||
|
throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.INVALID_CRITERIA);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@GET
|
||||||
|
@Path("/feeceiling")
|
||||||
|
@Operation(
|
||||||
|
summary = "Returns Digibyte fee per Kb.",
|
||||||
|
description = "Returns Digibyte fee per Kb.",
|
||||||
|
responses = {
|
||||||
|
@ApiResponse(
|
||||||
|
content = @Content(
|
||||||
|
schema = @Schema(
|
||||||
|
type = "number"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
public String getDigibyteFeeCeiling() {
|
||||||
|
Digibyte digibyte = Digibyte.getInstance();
|
||||||
|
|
||||||
|
return String.valueOf(digibyte.getFeeCeiling());
|
||||||
|
}
|
||||||
|
|
||||||
|
@POST
|
||||||
|
@Path("/updatefeeceiling")
|
||||||
|
@Operation(
|
||||||
|
summary = "Sets Digibyte fee ceiling.",
|
||||||
|
description = "Sets Digibyte fee ceiling.",
|
||||||
|
requestBody = @RequestBody(
|
||||||
|
required = true,
|
||||||
|
content = @Content(
|
||||||
|
mediaType = MediaType.TEXT_PLAIN,
|
||||||
|
schema = @Schema(
|
||||||
|
type = "number",
|
||||||
|
description = "the fee",
|
||||||
|
example = "100"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
),
|
||||||
|
responses = {
|
||||||
|
@ApiResponse(
|
||||||
|
content = @Content(mediaType = MediaType.TEXT_PLAIN, schema = @Schema(type = "number", description = "fee"))
|
||||||
|
)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
@ApiErrors({ApiError.INVALID_PRIVATE_KEY, ApiError.INVALID_CRITERIA})
|
||||||
|
public String setDigibyteFeeCeiling(@HeaderParam(Security.API_KEY_HEADER) String apiKey, String fee) {
|
||||||
|
Security.checkApiCallAllowed(request);
|
||||||
|
|
||||||
|
Digibyte digibyte = Digibyte.getInstance();
|
||||||
|
|
||||||
|
try {
|
||||||
|
return CrossChainUtils.setFeeCeiling(digibyte, fee);
|
||||||
|
}
|
||||||
|
catch (IllegalArgumentException e) {
|
||||||
|
throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.INVALID_CRITERIA);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -265,4 +265,117 @@ public class CrossChainDogecoinResource {
|
|||||||
|
|
||||||
return CrossChainUtils.buildServerConfigurationInfo(Dogecoin.getInstance());
|
return CrossChainUtils.buildServerConfigurationInfo(Dogecoin.getInstance());
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
@GET
|
||||||
|
@Path("/feekb")
|
||||||
|
@Operation(
|
||||||
|
summary = "Returns Dogecoin fee per Kb.",
|
||||||
|
description = "Returns Dogecoin fee per Kb.",
|
||||||
|
responses = {
|
||||||
|
@ApiResponse(
|
||||||
|
content = @Content(
|
||||||
|
schema = @Schema(
|
||||||
|
type = "number"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
public String getDogecoinFeePerKb() {
|
||||||
|
Dogecoin dogecoin = Dogecoin.getInstance();
|
||||||
|
|
||||||
|
return String.valueOf(dogecoin.getFeePerKb().value);
|
||||||
|
}
|
||||||
|
|
||||||
|
@POST
|
||||||
|
@Path("/updatefeekb")
|
||||||
|
@Operation(
|
||||||
|
summary = "Sets Dogecoin fee per Kb.",
|
||||||
|
description = "Sets Dogecoin fee per Kb.",
|
||||||
|
requestBody = @RequestBody(
|
||||||
|
required = true,
|
||||||
|
content = @Content(
|
||||||
|
mediaType = MediaType.TEXT_PLAIN,
|
||||||
|
schema = @Schema(
|
||||||
|
type = "number",
|
||||||
|
description = "the fee per Kb",
|
||||||
|
example = "100"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
),
|
||||||
|
responses = {
|
||||||
|
@ApiResponse(
|
||||||
|
content = @Content(mediaType = MediaType.TEXT_PLAIN, schema = @Schema(type = "number", description = "fee"))
|
||||||
|
)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
@ApiErrors({ApiError.INVALID_PRIVATE_KEY, ApiError.INVALID_CRITERIA})
|
||||||
|
public String setDogecoinFeePerKb(@HeaderParam(Security.API_KEY_HEADER) String apiKey, String fee) {
|
||||||
|
Security.checkApiCallAllowed(request);
|
||||||
|
|
||||||
|
Dogecoin dogecoin = Dogecoin.getInstance();
|
||||||
|
|
||||||
|
try {
|
||||||
|
return CrossChainUtils.setFeePerKb(dogecoin, fee);
|
||||||
|
} catch (IllegalArgumentException e) {
|
||||||
|
throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.INVALID_CRITERIA);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@GET
|
||||||
|
@Path("/feeceiling")
|
||||||
|
@Operation(
|
||||||
|
summary = "Returns Dogecoin fee per Kb.",
|
||||||
|
description = "Returns Dogecoin fee per Kb.",
|
||||||
|
responses = {
|
||||||
|
@ApiResponse(
|
||||||
|
content = @Content(
|
||||||
|
schema = @Schema(
|
||||||
|
type = "number"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
public String getDogecoinFeeCeiling() {
|
||||||
|
Dogecoin dogecoin = Dogecoin.getInstance();
|
||||||
|
|
||||||
|
return String.valueOf(dogecoin.getFeeCeiling());
|
||||||
|
}
|
||||||
|
|
||||||
|
@POST
|
||||||
|
@Path("/updatefeeceiling")
|
||||||
|
@Operation(
|
||||||
|
summary = "Sets Dogecoin fee ceiling.",
|
||||||
|
description = "Sets Dogecoin fee ceiling.",
|
||||||
|
requestBody = @RequestBody(
|
||||||
|
required = true,
|
||||||
|
content = @Content(
|
||||||
|
mediaType = MediaType.TEXT_PLAIN,
|
||||||
|
schema = @Schema(
|
||||||
|
type = "number",
|
||||||
|
description = "the fee",
|
||||||
|
example = "100"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
),
|
||||||
|
responses = {
|
||||||
|
@ApiResponse(
|
||||||
|
content = @Content(mediaType = MediaType.TEXT_PLAIN, schema = @Schema(type = "number", description = "fee"))
|
||||||
|
)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
@ApiErrors({ApiError.INVALID_PRIVATE_KEY, ApiError.INVALID_CRITERIA})
|
||||||
|
public String setDogecoinFeeCeiling(@HeaderParam(Security.API_KEY_HEADER) String apiKey, String fee) {
|
||||||
|
Security.checkApiCallAllowed(request);
|
||||||
|
|
||||||
|
Dogecoin dogecoin = Dogecoin.getInstance();
|
||||||
|
|
||||||
|
try {
|
||||||
|
return CrossChainUtils.setFeeCeiling(dogecoin, fee);
|
||||||
|
}
|
||||||
|
catch (IllegalArgumentException e) {
|
||||||
|
throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.INVALID_CRITERIA);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -304,4 +304,117 @@ public class CrossChainLitecoinResource {
|
|||||||
throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.FOREIGN_BLOCKCHAIN_NETWORK_ISSUE);
|
throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.FOREIGN_BLOCKCHAIN_NETWORK_ISSUE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@GET
|
||||||
|
@Path("/feekb")
|
||||||
|
@Operation(
|
||||||
|
summary = "Returns Litecoin fee per Kb.",
|
||||||
|
description = "Returns Litecoin fee per Kb.",
|
||||||
|
responses = {
|
||||||
|
@ApiResponse(
|
||||||
|
content = @Content(
|
||||||
|
schema = @Schema(
|
||||||
|
type = "number"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
public String getLitecoinFeePerKb() {
|
||||||
|
Litecoin litecoin = Litecoin.getInstance();
|
||||||
|
|
||||||
|
return String.valueOf(litecoin.getFeePerKb().value);
|
||||||
|
}
|
||||||
|
|
||||||
|
@POST
|
||||||
|
@Path("/updatefeekb")
|
||||||
|
@Operation(
|
||||||
|
summary = "Sets Litecoin fee per Kb.",
|
||||||
|
description = "Sets Litecoin fee per Kb.",
|
||||||
|
requestBody = @RequestBody(
|
||||||
|
required = true,
|
||||||
|
content = @Content(
|
||||||
|
mediaType = MediaType.TEXT_PLAIN,
|
||||||
|
schema = @Schema(
|
||||||
|
type = "number",
|
||||||
|
description = "the fee per Kb",
|
||||||
|
example = "100"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
),
|
||||||
|
responses = {
|
||||||
|
@ApiResponse(
|
||||||
|
content = @Content(mediaType = MediaType.TEXT_PLAIN, schema = @Schema(type = "number", description = "fee"))
|
||||||
|
)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
@ApiErrors({ApiError.INVALID_PRIVATE_KEY, ApiError.INVALID_CRITERIA})
|
||||||
|
public String setLitecoinFeePerKb(@HeaderParam(Security.API_KEY_HEADER) String apiKey, String fee) {
|
||||||
|
Security.checkApiCallAllowed(request);
|
||||||
|
|
||||||
|
Litecoin litecoin = Litecoin.getInstance();
|
||||||
|
|
||||||
|
try {
|
||||||
|
return CrossChainUtils.setFeePerKb(litecoin, fee);
|
||||||
|
} catch (IllegalArgumentException e) {
|
||||||
|
throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.INVALID_CRITERIA);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@GET
|
||||||
|
@Path("/feeceiling")
|
||||||
|
@Operation(
|
||||||
|
summary = "Returns Litecoin fee per Kb.",
|
||||||
|
description = "Returns Litecoin fee per Kb.",
|
||||||
|
responses = {
|
||||||
|
@ApiResponse(
|
||||||
|
content = @Content(
|
||||||
|
schema = @Schema(
|
||||||
|
type = "number"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
public String getLitecoinFeeCeiling() {
|
||||||
|
Litecoin litecoin = Litecoin.getInstance();
|
||||||
|
|
||||||
|
return String.valueOf(litecoin.getFeeCeiling());
|
||||||
|
}
|
||||||
|
|
||||||
|
@POST
|
||||||
|
@Path("/updatefeeceiling")
|
||||||
|
@Operation(
|
||||||
|
summary = "Sets Litecoin fee ceiling.",
|
||||||
|
description = "Sets Litecoin fee ceiling.",
|
||||||
|
requestBody = @RequestBody(
|
||||||
|
required = true,
|
||||||
|
content = @Content(
|
||||||
|
mediaType = MediaType.TEXT_PLAIN,
|
||||||
|
schema = @Schema(
|
||||||
|
type = "number",
|
||||||
|
description = "the fee",
|
||||||
|
example = "100"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
),
|
||||||
|
responses = {
|
||||||
|
@ApiResponse(
|
||||||
|
content = @Content(mediaType = MediaType.TEXT_PLAIN, schema = @Schema(type = "number", description = "fee"))
|
||||||
|
)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
@ApiErrors({ApiError.INVALID_PRIVATE_KEY, ApiError.INVALID_CRITERIA})
|
||||||
|
public String setLitecoinFeeCeiling(@HeaderParam(Security.API_KEY_HEADER) String apiKey, String fee) {
|
||||||
|
Security.checkApiCallAllowed(request);
|
||||||
|
|
||||||
|
Litecoin litecoin = Litecoin.getInstance();
|
||||||
|
|
||||||
|
try {
|
||||||
|
return CrossChainUtils.setFeeCeiling(litecoin, fee);
|
||||||
|
}
|
||||||
|
catch (IllegalArgumentException e) {
|
||||||
|
throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.INVALID_CRITERIA);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
@ -351,4 +351,117 @@ public class CrossChainPirateChainResource {
|
|||||||
|
|
||||||
return CrossChainUtils.buildServerConfigurationInfo(PirateChain.getInstance());
|
return CrossChainUtils.buildServerConfigurationInfo(PirateChain.getInstance());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@GET
|
||||||
|
@Path("/feekb")
|
||||||
|
@Operation(
|
||||||
|
summary = "Returns PirateChain fee per Kb.",
|
||||||
|
description = "Returns PirateChain fee per Kb.",
|
||||||
|
responses = {
|
||||||
|
@ApiResponse(
|
||||||
|
content = @Content(
|
||||||
|
schema = @Schema(
|
||||||
|
type = "number"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
public String getPirateChainFeePerKb() {
|
||||||
|
PirateChain pirateChain = PirateChain.getInstance();
|
||||||
|
|
||||||
|
return String.valueOf(pirateChain.getFeePerKb().value);
|
||||||
|
}
|
||||||
|
|
||||||
|
@POST
|
||||||
|
@Path("/updatefeekb")
|
||||||
|
@Operation(
|
||||||
|
summary = "Sets PirateChain fee per Kb.",
|
||||||
|
description = "Sets PirateChain fee per Kb.",
|
||||||
|
requestBody = @RequestBody(
|
||||||
|
required = true,
|
||||||
|
content = @Content(
|
||||||
|
mediaType = MediaType.TEXT_PLAIN,
|
||||||
|
schema = @Schema(
|
||||||
|
type = "number",
|
||||||
|
description = "the fee per Kb",
|
||||||
|
example = "100"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
),
|
||||||
|
responses = {
|
||||||
|
@ApiResponse(
|
||||||
|
content = @Content(mediaType = MediaType.TEXT_PLAIN, schema = @Schema(type = "number", description = "fee"))
|
||||||
|
)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
@ApiErrors({ApiError.INVALID_PRIVATE_KEY, ApiError.INVALID_CRITERIA})
|
||||||
|
public String setPirateChainFeePerKb(@HeaderParam(Security.API_KEY_HEADER) String apiKey, String fee) {
|
||||||
|
Security.checkApiCallAllowed(request);
|
||||||
|
|
||||||
|
PirateChain pirateChain = PirateChain.getInstance();
|
||||||
|
|
||||||
|
try {
|
||||||
|
return CrossChainUtils.setFeePerKb(pirateChain, fee);
|
||||||
|
} catch (IllegalArgumentException e) {
|
||||||
|
throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.INVALID_CRITERIA);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@GET
|
||||||
|
@Path("/feeceiling")
|
||||||
|
@Operation(
|
||||||
|
summary = "Returns PirateChain fee per Kb.",
|
||||||
|
description = "Returns PirateChain fee per Kb.",
|
||||||
|
responses = {
|
||||||
|
@ApiResponse(
|
||||||
|
content = @Content(
|
||||||
|
schema = @Schema(
|
||||||
|
type = "number"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
public String getPirateChainFeeCeiling() {
|
||||||
|
PirateChain pirateChain = PirateChain.getInstance();
|
||||||
|
|
||||||
|
return String.valueOf(pirateChain.getFeeCeiling());
|
||||||
|
}
|
||||||
|
|
||||||
|
@POST
|
||||||
|
@Path("/updatefeeceiling")
|
||||||
|
@Operation(
|
||||||
|
summary = "Sets PirateChain fee ceiling.",
|
||||||
|
description = "Sets PirateChain fee ceiling.",
|
||||||
|
requestBody = @RequestBody(
|
||||||
|
required = true,
|
||||||
|
content = @Content(
|
||||||
|
mediaType = MediaType.TEXT_PLAIN,
|
||||||
|
schema = @Schema(
|
||||||
|
type = "number",
|
||||||
|
description = "the fee",
|
||||||
|
example = "100"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
),
|
||||||
|
responses = {
|
||||||
|
@ApiResponse(
|
||||||
|
content = @Content(mediaType = MediaType.TEXT_PLAIN, schema = @Schema(type = "number", description = "fee"))
|
||||||
|
)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
@ApiErrors({ApiError.INVALID_PRIVATE_KEY, ApiError.INVALID_CRITERIA})
|
||||||
|
public String setPirateChainFeeCeiling(@HeaderParam(Security.API_KEY_HEADER) String apiKey, String fee) {
|
||||||
|
Security.checkApiCallAllowed(request);
|
||||||
|
|
||||||
|
PirateChain pirateChain = PirateChain.getInstance();
|
||||||
|
|
||||||
|
try {
|
||||||
|
return CrossChainUtils.setFeeCeiling(pirateChain, fee);
|
||||||
|
}
|
||||||
|
catch (IllegalArgumentException e) {
|
||||||
|
throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.INVALID_CRITERIA);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -265,4 +265,117 @@ public class CrossChainRavencoinResource {
|
|||||||
|
|
||||||
return CrossChainUtils.buildServerConfigurationInfo(Ravencoin.getInstance());
|
return CrossChainUtils.buildServerConfigurationInfo(Ravencoin.getInstance());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@GET
|
||||||
|
@Path("/feekb")
|
||||||
|
@Operation(
|
||||||
|
summary = "Returns Ravencoin fee per Kb.",
|
||||||
|
description = "Returns Ravencoin fee per Kb.",
|
||||||
|
responses = {
|
||||||
|
@ApiResponse(
|
||||||
|
content = @Content(
|
||||||
|
schema = @Schema(
|
||||||
|
type = "number"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
public String getRavencoinFeePerKb() {
|
||||||
|
Ravencoin ravencoin = Ravencoin.getInstance();
|
||||||
|
|
||||||
|
return String.valueOf(ravencoin.getFeePerKb().value);
|
||||||
|
}
|
||||||
|
|
||||||
|
@POST
|
||||||
|
@Path("/updatefeekb")
|
||||||
|
@Operation(
|
||||||
|
summary = "Sets Ravencoin fee per Kb.",
|
||||||
|
description = "Sets Ravencoin fee per Kb.",
|
||||||
|
requestBody = @RequestBody(
|
||||||
|
required = true,
|
||||||
|
content = @Content(
|
||||||
|
mediaType = MediaType.TEXT_PLAIN,
|
||||||
|
schema = @Schema(
|
||||||
|
type = "number",
|
||||||
|
description = "the fee per Kb",
|
||||||
|
example = "100"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
),
|
||||||
|
responses = {
|
||||||
|
@ApiResponse(
|
||||||
|
content = @Content(mediaType = MediaType.TEXT_PLAIN, schema = @Schema(type = "number", description = "fee"))
|
||||||
|
)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
@ApiErrors({ApiError.INVALID_PRIVATE_KEY, ApiError.INVALID_CRITERIA})
|
||||||
|
public String setRavencoinFeePerKb(@HeaderParam(Security.API_KEY_HEADER) String apiKey, String fee) {
|
||||||
|
Security.checkApiCallAllowed(request);
|
||||||
|
|
||||||
|
Ravencoin ravencoin = Ravencoin.getInstance();
|
||||||
|
|
||||||
|
try {
|
||||||
|
return CrossChainUtils.setFeePerKb(ravencoin, fee);
|
||||||
|
} catch (IllegalArgumentException e) {
|
||||||
|
throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.INVALID_CRITERIA);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@GET
|
||||||
|
@Path("/feeceiling")
|
||||||
|
@Operation(
|
||||||
|
summary = "Returns Ravencoin fee per Kb.",
|
||||||
|
description = "Returns Ravencoin fee per Kb.",
|
||||||
|
responses = {
|
||||||
|
@ApiResponse(
|
||||||
|
content = @Content(
|
||||||
|
schema = @Schema(
|
||||||
|
type = "number"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
public String getRavencoinFeeCeiling() {
|
||||||
|
Ravencoin ravencoin = Ravencoin.getInstance();
|
||||||
|
|
||||||
|
return String.valueOf(ravencoin.getFeeCeiling());
|
||||||
|
}
|
||||||
|
|
||||||
|
@POST
|
||||||
|
@Path("/updatefeeceiling")
|
||||||
|
@Operation(
|
||||||
|
summary = "Sets Ravencoin fee ceiling.",
|
||||||
|
description = "Sets Ravencoin fee ceiling.",
|
||||||
|
requestBody = @RequestBody(
|
||||||
|
required = true,
|
||||||
|
content = @Content(
|
||||||
|
mediaType = MediaType.TEXT_PLAIN,
|
||||||
|
schema = @Schema(
|
||||||
|
type = "number",
|
||||||
|
description = "the fee",
|
||||||
|
example = "100"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
),
|
||||||
|
responses = {
|
||||||
|
@ApiResponse(
|
||||||
|
content = @Content(mediaType = MediaType.TEXT_PLAIN, schema = @Schema(type = "number", description = "fee"))
|
||||||
|
)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
@ApiErrors({ApiError.INVALID_PRIVATE_KEY, ApiError.INVALID_CRITERIA})
|
||||||
|
public String setRavencoinFeeCeiling(@HeaderParam(Security.API_KEY_HEADER) String apiKey, String fee) {
|
||||||
|
Security.checkApiCallAllowed(request);
|
||||||
|
|
||||||
|
Ravencoin ravencoin = Ravencoin.getInstance();
|
||||||
|
|
||||||
|
try {
|
||||||
|
return CrossChainUtils.setFeeCeiling(ravencoin, fee);
|
||||||
|
}
|
||||||
|
catch (IllegalArgumentException e) {
|
||||||
|
throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.INVALID_CRITERIA);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -2,6 +2,7 @@ package org.qortal.api.resource;
|
|||||||
|
|
||||||
import org.apache.logging.log4j.LogManager;
|
import org.apache.logging.log4j.LogManager;
|
||||||
import org.apache.logging.log4j.Logger;
|
import org.apache.logging.log4j.Logger;
|
||||||
|
import org.bitcoinj.core.Coin;
|
||||||
import org.qortal.crosschain.*;
|
import org.qortal.crosschain.*;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@ -44,4 +45,44 @@ public class CrossChainUtils {
|
|||||||
|
|
||||||
return infos;
|
return infos;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
/**
|
||||||
|
* Set Fee Per Kb
|
||||||
|
*
|
||||||
|
* @param bitcoiny the blockchain support
|
||||||
|
* @param fee the fee in satoshis
|
||||||
|
*
|
||||||
|
* @return the fee if valid
|
||||||
|
*
|
||||||
|
* @throws IllegalArgumentException if invalid
|
||||||
|
*/
|
||||||
|
public static String setFeePerKb(Bitcoiny bitcoiny, String fee) throws IllegalArgumentException {
|
||||||
|
|
||||||
|
long satoshis = Long.parseLong(fee);
|
||||||
|
if( satoshis < 0 ) throw new IllegalArgumentException("can't set fee to negative number");
|
||||||
|
|
||||||
|
bitcoiny.setFeePerKb(Coin.valueOf(satoshis) );
|
||||||
|
|
||||||
|
return String.valueOf(bitcoiny.getFeePerKb().value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Fee Ceiling
|
||||||
|
*
|
||||||
|
* @param bitcoiny the blockchain support
|
||||||
|
* @param fee the fee in satoshis
|
||||||
|
*
|
||||||
|
* @return the fee if valid
|
||||||
|
*
|
||||||
|
* @throws IllegalArgumentException if invalid
|
||||||
|
*/
|
||||||
|
public static String setFeeCeiling(Bitcoiny bitcoiny, String fee) throws IllegalArgumentException{
|
||||||
|
|
||||||
|
long satoshis = Long.parseLong(fee);
|
||||||
|
if( satoshis < 0 ) throw new IllegalArgumentException("can't set fee to negative number");
|
||||||
|
|
||||||
|
bitcoiny.setFeeCeiling( Long.parseLong(fee));
|
||||||
|
|
||||||
|
return String.valueOf(bitcoiny.getFeeCeiling());
|
||||||
|
}
|
||||||
|
}
|
@ -22,8 +22,6 @@ public class Bitcoin extends Bitcoiny {
|
|||||||
private static final long MINIMUM_ORDER_AMOUNT = 100000; // 0.001 BTC minimum order, due to high fees
|
private static final long MINIMUM_ORDER_AMOUNT = 100000; // 0.001 BTC minimum order, due to high fees
|
||||||
|
|
||||||
// Temporary values until a dynamic fee system is written.
|
// Temporary values until a dynamic fee system is written.
|
||||||
private static final long OLD_FEE_AMOUNT = 4_000L; // Not 5000 so that existing P2SH-B can output 1000, avoiding dust issue, leaving 4000 for fees.
|
|
||||||
private static final long NEW_FEE_TIMESTAMP = 1598280000000L; // milliseconds since epoch
|
|
||||||
private static final long NEW_FEE_AMOUNT = 6_000L;
|
private static final long NEW_FEE_AMOUNT = 6_000L;
|
||||||
|
|
||||||
private static final long NON_MAINNET_FEE = 1000L; // enough for TESTNET3 and should be OK for REGTEST
|
private static final long NON_MAINNET_FEE = 1000L; // enough for TESTNET3 and should be OK for REGTEST
|
||||||
@ -125,11 +123,7 @@ public class Bitcoin extends Bitcoiny {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public long getP2shFee(Long timestamp) {
|
public long getP2shFee(Long timestamp) {
|
||||||
// TODO: This will need to be replaced with something better in the near future!
|
return this.getFeeCeiling();
|
||||||
if (timestamp != null && timestamp < NEW_FEE_TIMESTAMP)
|
|
||||||
return OLD_FEE_AMOUNT;
|
|
||||||
|
|
||||||
return NEW_FEE_AMOUNT;
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
TEST3 {
|
TEST3 {
|
||||||
@ -186,6 +180,16 @@ public class Bitcoin extends Bitcoiny {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
private long feeCeiling = NEW_FEE_AMOUNT;
|
||||||
|
|
||||||
|
public long getFeeCeiling() {
|
||||||
|
return feeCeiling;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFeeCeiling(long feeCeiling) {
|
||||||
|
this.feeCeiling = feeCeiling;
|
||||||
|
}
|
||||||
|
|
||||||
public abstract NetworkParameters getParams();
|
public abstract NetworkParameters getParams();
|
||||||
public abstract Collection<ElectrumX.Server> getServers();
|
public abstract Collection<ElectrumX.Server> getServers();
|
||||||
public abstract String getGenesisHash();
|
public abstract String getGenesisHash();
|
||||||
@ -199,7 +203,7 @@ public class Bitcoin extends Bitcoiny {
|
|||||||
// Constructors and instance
|
// Constructors and instance
|
||||||
|
|
||||||
private Bitcoin(BitcoinNet bitcoinNet, BitcoinyBlockchainProvider blockchain, Context bitcoinjContext, String currencyCode) {
|
private Bitcoin(BitcoinNet bitcoinNet, BitcoinyBlockchainProvider blockchain, Context bitcoinjContext, String currencyCode) {
|
||||||
super(blockchain, bitcoinjContext, currencyCode);
|
super(blockchain, bitcoinjContext, currencyCode, bitcoinjContext.getFeePerKb());
|
||||||
this.bitcoinNet = bitcoinNet;
|
this.bitcoinNet = bitcoinNet;
|
||||||
|
|
||||||
LOGGER.info(() -> String.format("Starting Bitcoin support using %s", this.bitcoinNet.name()));
|
LOGGER.info(() -> String.format("Starting Bitcoin support using %s", this.bitcoinNet.name()));
|
||||||
@ -244,6 +248,16 @@ public class Bitcoin extends Bitcoiny {
|
|||||||
return this.bitcoinNet.getP2shFee(timestamp);
|
return this.bitcoinNet.getP2shFee(timestamp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long getFeeCeiling() {
|
||||||
|
return this.bitcoinNet.getFeeCeiling();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setFeeCeiling(long fee) {
|
||||||
|
|
||||||
|
this.bitcoinNet.setFeeCeiling( fee );
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* Returns bitcoinj transaction sending <tt>amount</tt> to <tt>recipient</tt> using 20 sat/byte fee.
|
* Returns bitcoinj transaction sending <tt>amount</tt> to <tt>recipient</tt> using 20 sat/byte fee.
|
||||||
*
|
*
|
||||||
|
@ -53,12 +53,15 @@ public abstract class Bitcoiny implements ForeignBlockchain {
|
|||||||
/** Byte offset into raw block headers to block timestamp. */
|
/** Byte offset into raw block headers to block timestamp. */
|
||||||
private static final int TIMESTAMP_OFFSET = 4 + 32 + 32;
|
private static final int TIMESTAMP_OFFSET = 4 + 32 + 32;
|
||||||
|
|
||||||
|
protected Coin feePerKb;
|
||||||
|
|
||||||
// Constructors and instance
|
// Constructors and instance
|
||||||
|
|
||||||
protected Bitcoiny(BitcoinyBlockchainProvider blockchainProvider, Context bitcoinjContext, String currencyCode) {
|
protected Bitcoiny(BitcoinyBlockchainProvider blockchainProvider, Context bitcoinjContext, String currencyCode, Coin feePerKb) {
|
||||||
this.blockchainProvider = blockchainProvider;
|
this.blockchainProvider = blockchainProvider;
|
||||||
this.bitcoinjContext = bitcoinjContext;
|
this.bitcoinjContext = bitcoinjContext;
|
||||||
this.currencyCode = currencyCode;
|
this.currencyCode = currencyCode;
|
||||||
|
this.feePerKb = feePerKb;
|
||||||
|
|
||||||
this.params = this.bitcoinjContext.getParams();
|
this.params = this.bitcoinjContext.getParams();
|
||||||
}
|
}
|
||||||
@ -167,7 +170,11 @@ public abstract class Bitcoiny implements ForeignBlockchain {
|
|||||||
|
|
||||||
/** Returns fee per transaction KB. To be overridden for testnet/regtest. */
|
/** Returns fee per transaction KB. To be overridden for testnet/regtest. */
|
||||||
public Coin getFeePerKb() {
|
public Coin getFeePerKb() {
|
||||||
return this.bitcoinjContext.getFeePerKb();
|
return this.feePerKb;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFeePerKb(Coin feePerKb) {
|
||||||
|
this.feePerKb = feePerKb;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Returns minimum order size in sats. To be overridden for coins that need to restrict order size. */
|
/** Returns minimum order size in sats. To be overridden for coins that need to restrict order size. */
|
||||||
@ -757,6 +764,10 @@ public abstract class Bitcoiny implements ForeignBlockchain {
|
|||||||
} while (true);
|
} while (true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public abstract long getFeeCeiling();
|
||||||
|
|
||||||
|
public abstract void setFeeCeiling(long fee);
|
||||||
|
|
||||||
// UTXOProvider support
|
// UTXOProvider support
|
||||||
|
|
||||||
static class WalletAwareUTXOProvider implements UTXOProvider {
|
static class WalletAwareUTXOProvider implements UTXOProvider {
|
||||||
|
@ -63,8 +63,7 @@ public class Digibyte extends Bitcoiny {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public long getP2shFee(Long timestamp) {
|
public long getP2shFee(Long timestamp) {
|
||||||
// TODO: This will need to be replaced with something better in the near future!
|
return this.getFeeCeiling();
|
||||||
return MAINNET_FEE;
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
TEST3 {
|
TEST3 {
|
||||||
@ -114,6 +113,16 @@ public class Digibyte extends Bitcoiny {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
private long feeCeiling = MAINNET_FEE;
|
||||||
|
|
||||||
|
public long getFeeCeiling() {
|
||||||
|
return feeCeiling;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFeeCeiling(long feeCeiling) {
|
||||||
|
this.feeCeiling = feeCeiling;
|
||||||
|
}
|
||||||
|
|
||||||
public abstract NetworkParameters getParams();
|
public abstract NetworkParameters getParams();
|
||||||
public abstract Collection<Server> getServers();
|
public abstract Collection<Server> getServers();
|
||||||
public abstract String getGenesisHash();
|
public abstract String getGenesisHash();
|
||||||
@ -127,7 +136,7 @@ public class Digibyte extends Bitcoiny {
|
|||||||
// Constructors and instance
|
// Constructors and instance
|
||||||
|
|
||||||
private Digibyte(DigibyteNet digibyteNet, BitcoinyBlockchainProvider blockchain, Context bitcoinjContext, String currencyCode) {
|
private Digibyte(DigibyteNet digibyteNet, BitcoinyBlockchainProvider blockchain, Context bitcoinjContext, String currencyCode) {
|
||||||
super(blockchain, bitcoinjContext, currencyCode);
|
super(blockchain, bitcoinjContext, currencyCode, DEFAULT_FEE_PER_KB);
|
||||||
this.digibyteNet = digibyteNet;
|
this.digibyteNet = digibyteNet;
|
||||||
|
|
||||||
LOGGER.info(() -> String.format("Starting Digibyte support using %s", this.digibyteNet.name()));
|
LOGGER.info(() -> String.format("Starting Digibyte support using %s", this.digibyteNet.name()));
|
||||||
@ -156,11 +165,6 @@ public class Digibyte extends Bitcoiny {
|
|||||||
|
|
||||||
// Actual useful methods for use by other classes
|
// Actual useful methods for use by other classes
|
||||||
|
|
||||||
@Override
|
|
||||||
public Coin getFeePerKb() {
|
|
||||||
return DEFAULT_FEE_PER_KB;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public long getMinimumOrderAmount() {
|
public long getMinimumOrderAmount() {
|
||||||
return MINIMUM_ORDER_AMOUNT;
|
return MINIMUM_ORDER_AMOUNT;
|
||||||
@ -177,4 +181,14 @@ public class Digibyte extends Bitcoiny {
|
|||||||
return this.digibyteNet.getP2shFee(timestamp);
|
return this.digibyteNet.getP2shFee(timestamp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long getFeeCeiling() {
|
||||||
|
return this.digibyteNet.getFeeCeiling();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setFeeCeiling(long fee) {
|
||||||
|
|
||||||
|
this.digibyteNet.setFeeCeiling( fee );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -63,8 +63,7 @@ public class Dogecoin extends Bitcoiny {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public long getP2shFee(Long timestamp) {
|
public long getP2shFee(Long timestamp) {
|
||||||
// TODO: This will need to be replaced with something better in the near future!
|
return this.getFeeCeiling();
|
||||||
return MAINNET_FEE;
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
TEST3 {
|
TEST3 {
|
||||||
@ -114,6 +113,16 @@ public class Dogecoin extends Bitcoiny {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
private long feeCeiling = MAINNET_FEE;
|
||||||
|
|
||||||
|
public long getFeeCeiling() {
|
||||||
|
return feeCeiling;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFeeCeiling(long feeCeiling) {
|
||||||
|
this.feeCeiling = feeCeiling;
|
||||||
|
}
|
||||||
|
|
||||||
public abstract NetworkParameters getParams();
|
public abstract NetworkParameters getParams();
|
||||||
public abstract Collection<Server> getServers();
|
public abstract Collection<Server> getServers();
|
||||||
public abstract String getGenesisHash();
|
public abstract String getGenesisHash();
|
||||||
@ -127,7 +136,7 @@ public class Dogecoin extends Bitcoiny {
|
|||||||
// Constructors and instance
|
// Constructors and instance
|
||||||
|
|
||||||
private Dogecoin(DogecoinNet dogecoinNet, BitcoinyBlockchainProvider blockchain, Context bitcoinjContext, String currencyCode) {
|
private Dogecoin(DogecoinNet dogecoinNet, BitcoinyBlockchainProvider blockchain, Context bitcoinjContext, String currencyCode) {
|
||||||
super(blockchain, bitcoinjContext, currencyCode);
|
super(blockchain, bitcoinjContext, currencyCode, DEFAULT_FEE_PER_KB);
|
||||||
this.dogecoinNet = dogecoinNet;
|
this.dogecoinNet = dogecoinNet;
|
||||||
|
|
||||||
LOGGER.info(() -> String.format("Starting Dogecoin support using %s", this.dogecoinNet.name()));
|
LOGGER.info(() -> String.format("Starting Dogecoin support using %s", this.dogecoinNet.name()));
|
||||||
@ -156,11 +165,6 @@ public class Dogecoin extends Bitcoiny {
|
|||||||
|
|
||||||
// Actual useful methods for use by other classes
|
// Actual useful methods for use by other classes
|
||||||
|
|
||||||
@Override
|
|
||||||
public Coin getFeePerKb() {
|
|
||||||
return DEFAULT_FEE_PER_KB;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public long getMinimumOrderAmount() {
|
public long getMinimumOrderAmount() {
|
||||||
return MINIMUM_ORDER_AMOUNT;
|
return MINIMUM_ORDER_AMOUNT;
|
||||||
@ -177,4 +181,14 @@ public class Dogecoin extends Bitcoiny {
|
|||||||
return this.dogecoinNet.getP2shFee(timestamp);
|
return this.dogecoinNet.getP2shFee(timestamp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long getFeeCeiling() {
|
||||||
|
return this.dogecoinNet.getFeeCeiling();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setFeeCeiling(long fee) {
|
||||||
|
|
||||||
|
this.dogecoinNet.setFeeCeiling( fee );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -67,8 +67,7 @@ public class Litecoin extends Bitcoiny {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public long getP2shFee(Long timestamp) {
|
public long getP2shFee(Long timestamp) {
|
||||||
// TODO: This will need to be replaced with something better in the near future!
|
return this.getFeeCeiling();
|
||||||
return MAINNET_FEE;
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
TEST3 {
|
TEST3 {
|
||||||
@ -123,6 +122,16 @@ public class Litecoin extends Bitcoiny {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
private long feeCeiling = MAINNET_FEE;
|
||||||
|
|
||||||
|
public long getFeeCeiling() {
|
||||||
|
return feeCeiling;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFeeCeiling(long feeCeiling) {
|
||||||
|
this.feeCeiling = feeCeiling;
|
||||||
|
}
|
||||||
|
|
||||||
public abstract NetworkParameters getParams();
|
public abstract NetworkParameters getParams();
|
||||||
public abstract Collection<ElectrumX.Server> getServers();
|
public abstract Collection<ElectrumX.Server> getServers();
|
||||||
public abstract String getGenesisHash();
|
public abstract String getGenesisHash();
|
||||||
@ -136,7 +145,7 @@ public class Litecoin extends Bitcoiny {
|
|||||||
// Constructors and instance
|
// Constructors and instance
|
||||||
|
|
||||||
private Litecoin(LitecoinNet litecoinNet, BitcoinyBlockchainProvider blockchain, Context bitcoinjContext, String currencyCode) {
|
private Litecoin(LitecoinNet litecoinNet, BitcoinyBlockchainProvider blockchain, Context bitcoinjContext, String currencyCode) {
|
||||||
super(blockchain, bitcoinjContext, currencyCode);
|
super(blockchain, bitcoinjContext, currencyCode, DEFAULT_FEE_PER_KB);
|
||||||
this.litecoinNet = litecoinNet;
|
this.litecoinNet = litecoinNet;
|
||||||
|
|
||||||
LOGGER.info(() -> String.format("Starting Litecoin support using %s", this.litecoinNet.name()));
|
LOGGER.info(() -> String.format("Starting Litecoin support using %s", this.litecoinNet.name()));
|
||||||
@ -165,12 +174,6 @@ public class Litecoin extends Bitcoiny {
|
|||||||
|
|
||||||
// Actual useful methods for use by other classes
|
// Actual useful methods for use by other classes
|
||||||
|
|
||||||
/** Default Litecoin fee is lower than Bitcoin: only 10sats/byte. */
|
|
||||||
@Override
|
|
||||||
public Coin getFeePerKb() {
|
|
||||||
return DEFAULT_FEE_PER_KB;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public long getMinimumOrderAmount() {
|
public long getMinimumOrderAmount() {
|
||||||
return MINIMUM_ORDER_AMOUNT;
|
return MINIMUM_ORDER_AMOUNT;
|
||||||
@ -187,4 +190,14 @@ public class Litecoin extends Bitcoiny {
|
|||||||
return this.litecoinNet.getP2shFee(timestamp);
|
return this.litecoinNet.getP2shFee(timestamp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long getFeeCeiling() {
|
||||||
|
return this.litecoinNet.getFeeCeiling();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setFeeCeiling(long fee) {
|
||||||
|
|
||||||
|
this.litecoinNet.setFeeCeiling( fee );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -67,8 +67,7 @@ public class PirateChain extends Bitcoiny {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public long getP2shFee(Long timestamp) {
|
public long getP2shFee(Long timestamp) {
|
||||||
// TODO: This will need to be replaced with something better in the near future!
|
return this.getFeeCeiling();
|
||||||
return MAINNET_FEE;
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
TEST3 {
|
TEST3 {
|
||||||
@ -118,6 +117,16 @@ public class PirateChain extends Bitcoiny {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
private long feeCeiling = MAINNET_FEE;
|
||||||
|
|
||||||
|
public long getFeeCeiling() {
|
||||||
|
return feeCeiling;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFeeCeiling(long feeCeiling) {
|
||||||
|
this.feeCeiling = feeCeiling;
|
||||||
|
}
|
||||||
|
|
||||||
public abstract NetworkParameters getParams();
|
public abstract NetworkParameters getParams();
|
||||||
public abstract Collection<Server> getServers();
|
public abstract Collection<Server> getServers();
|
||||||
public abstract String getGenesisHash();
|
public abstract String getGenesisHash();
|
||||||
@ -131,7 +140,7 @@ public class PirateChain extends Bitcoiny {
|
|||||||
// Constructors and instance
|
// Constructors and instance
|
||||||
|
|
||||||
private PirateChain(PirateChainNet pirateChainNet, BitcoinyBlockchainProvider blockchain, Context bitcoinjContext, String currencyCode) {
|
private PirateChain(PirateChainNet pirateChainNet, BitcoinyBlockchainProvider blockchain, Context bitcoinjContext, String currencyCode) {
|
||||||
super(blockchain, bitcoinjContext, currencyCode);
|
super(blockchain, bitcoinjContext, currencyCode, DEFAULT_FEE_PER_KB);
|
||||||
this.pirateChainNet = pirateChainNet;
|
this.pirateChainNet = pirateChainNet;
|
||||||
|
|
||||||
LOGGER.info(() -> String.format("Starting Pirate Chain support using %s", this.pirateChainNet.name()));
|
LOGGER.info(() -> String.format("Starting Pirate Chain support using %s", this.pirateChainNet.name()));
|
||||||
@ -160,12 +169,6 @@ public class PirateChain extends Bitcoiny {
|
|||||||
|
|
||||||
// Actual useful methods for use by other classes
|
// Actual useful methods for use by other classes
|
||||||
|
|
||||||
/** Default Litecoin fee is lower than Bitcoin: only 10sats/byte. */
|
|
||||||
@Override
|
|
||||||
public Coin getFeePerKb() {
|
|
||||||
return DEFAULT_FEE_PER_KB;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public long getMinimumOrderAmount() {
|
public long getMinimumOrderAmount() {
|
||||||
return MINIMUM_ORDER_AMOUNT;
|
return MINIMUM_ORDER_AMOUNT;
|
||||||
@ -182,6 +185,16 @@ public class PirateChain extends Bitcoiny {
|
|||||||
return this.pirateChainNet.getP2shFee(timestamp);
|
return this.pirateChainNet.getP2shFee(timestamp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long getFeeCeiling() {
|
||||||
|
return this.pirateChainNet.getFeeCeiling();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setFeeCeiling(long fee) {
|
||||||
|
|
||||||
|
this.pirateChainNet.setFeeCeiling( fee );
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* Returns confirmed balance, based on passed payment script.
|
* Returns confirmed balance, based on passed payment script.
|
||||||
* <p>
|
* <p>
|
||||||
|
@ -65,8 +65,7 @@ public class Ravencoin extends Bitcoiny {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public long getP2shFee(Long timestamp) {
|
public long getP2shFee(Long timestamp) {
|
||||||
// TODO: This will need to be replaced with something better in the near future!
|
return this.getFeeCeiling();
|
||||||
return MAINNET_FEE;
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
TEST3 {
|
TEST3 {
|
||||||
@ -116,6 +115,16 @@ public class Ravencoin extends Bitcoiny {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
private long feeCeiling = MAINNET_FEE;
|
||||||
|
|
||||||
|
public long getFeeCeiling() {
|
||||||
|
return feeCeiling;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFeeCeiling(long feeCeiling) {
|
||||||
|
this.feeCeiling = feeCeiling;
|
||||||
|
}
|
||||||
|
|
||||||
public abstract NetworkParameters getParams();
|
public abstract NetworkParameters getParams();
|
||||||
public abstract Collection<Server> getServers();
|
public abstract Collection<Server> getServers();
|
||||||
public abstract String getGenesisHash();
|
public abstract String getGenesisHash();
|
||||||
@ -129,7 +138,7 @@ public class Ravencoin extends Bitcoiny {
|
|||||||
// Constructors and instance
|
// Constructors and instance
|
||||||
|
|
||||||
private Ravencoin(RavencoinNet ravencoinNet, BitcoinyBlockchainProvider blockchain, Context bitcoinjContext, String currencyCode) {
|
private Ravencoin(RavencoinNet ravencoinNet, BitcoinyBlockchainProvider blockchain, Context bitcoinjContext, String currencyCode) {
|
||||||
super(blockchain, bitcoinjContext, currencyCode);
|
super(blockchain, bitcoinjContext, currencyCode, DEFAULT_FEE_PER_KB);
|
||||||
this.ravencoinNet = ravencoinNet;
|
this.ravencoinNet = ravencoinNet;
|
||||||
|
|
||||||
LOGGER.info(() -> String.format("Starting Ravencoin support using %s", this.ravencoinNet.name()));
|
LOGGER.info(() -> String.format("Starting Ravencoin support using %s", this.ravencoinNet.name()));
|
||||||
@ -158,11 +167,6 @@ public class Ravencoin extends Bitcoiny {
|
|||||||
|
|
||||||
// Actual useful methods for use by other classes
|
// Actual useful methods for use by other classes
|
||||||
|
|
||||||
@Override
|
|
||||||
public Coin getFeePerKb() {
|
|
||||||
return DEFAULT_FEE_PER_KB;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public long getMinimumOrderAmount() {
|
public long getMinimumOrderAmount() {
|
||||||
return MINIMUM_ORDER_AMOUNT;
|
return MINIMUM_ORDER_AMOUNT;
|
||||||
@ -179,4 +183,14 @@ public class Ravencoin extends Bitcoiny {
|
|||||||
return this.ravencoinNet.getP2shFee(timestamp);
|
return this.ravencoinNet.getP2shFee(timestamp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long getFeeCeiling() {
|
||||||
|
return this.ravencoinNet.getFeeCeiling();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setFeeCeiling(long fee) {
|
||||||
|
|
||||||
|
this.ravencoinNet.setFeeCeiling( fee );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user