Integrate sdk-common (#308)

* Rename Network to LiquidSdkNetwork to avoid naming conflicts with sdk-common

* Integrate sdk-common: re-use parse_invoice

* Fix UDL bindings tests

* Add input parser support

* CLI: Add input parser support

* Integrate lnurl-pay

* Cargo format, re-generate FRB and RN bindings

* Duplicate LnUrlPayError, update FRB/UniFFI bindings

* Move duplicate LnUrlPayError to FRB bindings.rs

* Add support for lnurl-withdraw

* Lnurl-withdraw: convert units, incorporate fees

* Bump sdk-common, rename InputType::LnUrlError

* Bump sdk-common, remove Wrapped prefix from LnUrlPaySuccessData, LnUrlPayResult

* LNURL-withdraw: add missing UDL mappings

* Add support for LNURL-auth

* Move LNURL structs into models.rs

* Rename LiquidSdkNetwork to LiquidNetwork

* Fix binding tests

* Fix tests

* Move FRB mirroring structs to bindings.rs

* Remove TODO

* Bump sdk-common, remove sdk-common dependency on rusqlite

* Propagate LiquidNetwork rename into flutter example app

* CI: install protobuf before running clippy

* CI: add rust cache, protobuf for remaining rust steps
This commit is contained in:
ok300
2024-06-20 16:18:50 +00:00
committed by GitHub
parent 5dca068619
commit bcb4743260
38 changed files with 13122 additions and 657 deletions

View File

@@ -3,6 +3,42 @@ import breez_liquid_sdk.*
import com.facebook.react.bridge.*
import java.util.*
fun asAesSuccessActionDataDecrypted(aesSuccessActionDataDecrypted: ReadableMap): AesSuccessActionDataDecrypted? {
if (!validateMandatoryFields(
aesSuccessActionDataDecrypted,
arrayOf(
"description",
"plaintext",
),
)
) {
return null
}
val description = aesSuccessActionDataDecrypted.getString("description")!!
val plaintext = aesSuccessActionDataDecrypted.getString("plaintext")!!
return AesSuccessActionDataDecrypted(
description,
plaintext,
)
}
fun readableMapOf(aesSuccessActionDataDecrypted: AesSuccessActionDataDecrypted): ReadableMap =
readableMapOf(
"description" to aesSuccessActionDataDecrypted.description,
"plaintext" to aesSuccessActionDataDecrypted.plaintext,
)
fun asAesSuccessActionDataDecryptedList(arr: ReadableArray): List<AesSuccessActionDataDecrypted> {
val list = ArrayList<AesSuccessActionDataDecrypted>()
for (value in arr.toArrayList()) {
when (value) {
is ReadableMap -> list.add(asAesSuccessActionDataDecrypted(value)!!)
else -> throw LiquidSdkException.Generic(errUnexpectedType("${value::class.java.name}"))
}
}
return list
}
fun asBackupRequest(backupRequest: ReadableMap): BackupRequest? {
if (!validateMandatoryFields(
backupRequest,
@@ -33,6 +69,51 @@ fun asBackupRequestList(arr: ReadableArray): List<BackupRequest> {
return list
}
fun asBitcoinAddressData(bitcoinAddressData: ReadableMap): BitcoinAddressData? {
if (!validateMandatoryFields(
bitcoinAddressData,
arrayOf(
"address",
"network",
),
)
) {
return null
}
val address = bitcoinAddressData.getString("address")!!
val network = bitcoinAddressData.getString("network")?.let { asNetwork(it) }!!
val amountSat = if (hasNonNullKey(bitcoinAddressData, "amountSat")) bitcoinAddressData.getDouble("amountSat").toULong() else null
val label = if (hasNonNullKey(bitcoinAddressData, "label")) bitcoinAddressData.getString("label") else null
val message = if (hasNonNullKey(bitcoinAddressData, "message")) bitcoinAddressData.getString("message") else null
return BitcoinAddressData(
address,
network,
amountSat,
label,
message,
)
}
fun readableMapOf(bitcoinAddressData: BitcoinAddressData): ReadableMap =
readableMapOf(
"address" to bitcoinAddressData.address,
"network" to bitcoinAddressData.network.name.lowercase(),
"amountSat" to bitcoinAddressData.amountSat,
"label" to bitcoinAddressData.label,
"message" to bitcoinAddressData.message,
)
fun asBitcoinAddressDataList(arr: ReadableArray): List<BitcoinAddressData> {
val list = ArrayList<BitcoinAddressData>()
for (value in arr.toArrayList()) {
when (value) {
is ReadableMap -> list.add(asBitcoinAddressData(value)!!)
else -> throw LiquidSdkException.Generic(errUnexpectedType("${value::class.java.name}"))
}
}
return list
}
fun asConfig(config: ReadableMap): Config? {
if (!validateMandatoryFields(
config,
@@ -53,7 +134,7 @@ fun asConfig(config: ReadableMap): Config? {
val liquidElectrumUrl = config.getString("liquidElectrumUrl")!!
val bitcoinElectrumUrl = config.getString("bitcoinElectrumUrl")!!
val workingDir = config.getString("workingDir")!!
val network = config.getString("network")?.let { asNetwork(it) }!!
val network = config.getString("network")?.let { asLiquidNetwork(it) }!!
val paymentTimeoutSec = config.getDouble("paymentTimeoutSec").toULong()
val zeroConfMinFeeRate = config.getDouble("zeroConfMinFeeRate")
val zeroConfMaxAmountSat =
@@ -254,6 +335,382 @@ fun asLnInvoiceList(arr: ReadableArray): List<LnInvoice> {
return list
}
fun asLnUrlAuthRequestData(lnUrlAuthRequestData: ReadableMap): LnUrlAuthRequestData? {
if (!validateMandatoryFields(
lnUrlAuthRequestData,
arrayOf(
"k1",
"domain",
"url",
),
)
) {
return null
}
val k1 = lnUrlAuthRequestData.getString("k1")!!
val domain = lnUrlAuthRequestData.getString("domain")!!
val url = lnUrlAuthRequestData.getString("url")!!
val action = if (hasNonNullKey(lnUrlAuthRequestData, "action")) lnUrlAuthRequestData.getString("action") else null
return LnUrlAuthRequestData(
k1,
domain,
url,
action,
)
}
fun readableMapOf(lnUrlAuthRequestData: LnUrlAuthRequestData): ReadableMap =
readableMapOf(
"k1" to lnUrlAuthRequestData.k1,
"domain" to lnUrlAuthRequestData.domain,
"url" to lnUrlAuthRequestData.url,
"action" to lnUrlAuthRequestData.action,
)
fun asLnUrlAuthRequestDataList(arr: ReadableArray): List<LnUrlAuthRequestData> {
val list = ArrayList<LnUrlAuthRequestData>()
for (value in arr.toArrayList()) {
when (value) {
is ReadableMap -> list.add(asLnUrlAuthRequestData(value)!!)
else -> throw LiquidSdkException.Generic(errUnexpectedType("${value::class.java.name}"))
}
}
return list
}
fun asLnUrlErrorData(lnUrlErrorData: ReadableMap): LnUrlErrorData? {
if (!validateMandatoryFields(
lnUrlErrorData,
arrayOf(
"reason",
),
)
) {
return null
}
val reason = lnUrlErrorData.getString("reason")!!
return LnUrlErrorData(
reason,
)
}
fun readableMapOf(lnUrlErrorData: LnUrlErrorData): ReadableMap =
readableMapOf(
"reason" to lnUrlErrorData.reason,
)
fun asLnUrlErrorDataList(arr: ReadableArray): List<LnUrlErrorData> {
val list = ArrayList<LnUrlErrorData>()
for (value in arr.toArrayList()) {
when (value) {
is ReadableMap -> list.add(asLnUrlErrorData(value)!!)
else -> throw LiquidSdkException.Generic(errUnexpectedType("${value::class.java.name}"))
}
}
return list
}
fun asLnUrlPayErrorData(lnUrlPayErrorData: ReadableMap): LnUrlPayErrorData? {
if (!validateMandatoryFields(
lnUrlPayErrorData,
arrayOf(
"paymentHash",
"reason",
),
)
) {
return null
}
val paymentHash = lnUrlPayErrorData.getString("paymentHash")!!
val reason = lnUrlPayErrorData.getString("reason")!!
return LnUrlPayErrorData(
paymentHash,
reason,
)
}
fun readableMapOf(lnUrlPayErrorData: LnUrlPayErrorData): ReadableMap =
readableMapOf(
"paymentHash" to lnUrlPayErrorData.paymentHash,
"reason" to lnUrlPayErrorData.reason,
)
fun asLnUrlPayErrorDataList(arr: ReadableArray): List<LnUrlPayErrorData> {
val list = ArrayList<LnUrlPayErrorData>()
for (value in arr.toArrayList()) {
when (value) {
is ReadableMap -> list.add(asLnUrlPayErrorData(value)!!)
else -> throw LiquidSdkException.Generic(errUnexpectedType("${value::class.java.name}"))
}
}
return list
}
fun asLnUrlPayRequest(lnUrlPayRequest: ReadableMap): LnUrlPayRequest? {
if (!validateMandatoryFields(
lnUrlPayRequest,
arrayOf(
"data",
"amountMsat",
),
)
) {
return null
}
val data = lnUrlPayRequest.getMap("data")?.let { asLnUrlPayRequestData(it) }!!
val amountMsat = lnUrlPayRequest.getDouble("amountMsat").toULong()
val comment = if (hasNonNullKey(lnUrlPayRequest, "comment")) lnUrlPayRequest.getString("comment") else null
val paymentLabel = if (hasNonNullKey(lnUrlPayRequest, "paymentLabel")) lnUrlPayRequest.getString("paymentLabel") else null
return LnUrlPayRequest(
data,
amountMsat,
comment,
paymentLabel,
)
}
fun readableMapOf(lnUrlPayRequest: LnUrlPayRequest): ReadableMap =
readableMapOf(
"data" to readableMapOf(lnUrlPayRequest.data),
"amountMsat" to lnUrlPayRequest.amountMsat,
"comment" to lnUrlPayRequest.comment,
"paymentLabel" to lnUrlPayRequest.paymentLabel,
)
fun asLnUrlPayRequestList(arr: ReadableArray): List<LnUrlPayRequest> {
val list = ArrayList<LnUrlPayRequest>()
for (value in arr.toArrayList()) {
when (value) {
is ReadableMap -> list.add(asLnUrlPayRequest(value)!!)
else -> throw LiquidSdkException.Generic(errUnexpectedType("${value::class.java.name}"))
}
}
return list
}
fun asLnUrlPayRequestData(lnUrlPayRequestData: ReadableMap): LnUrlPayRequestData? {
if (!validateMandatoryFields(
lnUrlPayRequestData,
arrayOf(
"callback",
"minSendable",
"maxSendable",
"metadataStr",
"commentAllowed",
"domain",
"allowsNostr",
),
)
) {
return null
}
val callback = lnUrlPayRequestData.getString("callback")!!
val minSendable = lnUrlPayRequestData.getDouble("minSendable").toULong()
val maxSendable = lnUrlPayRequestData.getDouble("maxSendable").toULong()
val metadataStr = lnUrlPayRequestData.getString("metadataStr")!!
val commentAllowed = lnUrlPayRequestData.getInt("commentAllowed").toUShort()
val domain = lnUrlPayRequestData.getString("domain")!!
val allowsNostr = lnUrlPayRequestData.getBoolean("allowsNostr")
val nostrPubkey = if (hasNonNullKey(lnUrlPayRequestData, "nostrPubkey")) lnUrlPayRequestData.getString("nostrPubkey") else null
val lnAddress = if (hasNonNullKey(lnUrlPayRequestData, "lnAddress")) lnUrlPayRequestData.getString("lnAddress") else null
return LnUrlPayRequestData(
callback,
minSendable,
maxSendable,
metadataStr,
commentAllowed,
domain,
allowsNostr,
nostrPubkey,
lnAddress,
)
}
fun readableMapOf(lnUrlPayRequestData: LnUrlPayRequestData): ReadableMap =
readableMapOf(
"callback" to lnUrlPayRequestData.callback,
"minSendable" to lnUrlPayRequestData.minSendable,
"maxSendable" to lnUrlPayRequestData.maxSendable,
"metadataStr" to lnUrlPayRequestData.metadataStr,
"commentAllowed" to lnUrlPayRequestData.commentAllowed,
"domain" to lnUrlPayRequestData.domain,
"allowsNostr" to lnUrlPayRequestData.allowsNostr,
"nostrPubkey" to lnUrlPayRequestData.nostrPubkey,
"lnAddress" to lnUrlPayRequestData.lnAddress,
)
fun asLnUrlPayRequestDataList(arr: ReadableArray): List<LnUrlPayRequestData> {
val list = ArrayList<LnUrlPayRequestData>()
for (value in arr.toArrayList()) {
when (value) {
is ReadableMap -> list.add(asLnUrlPayRequestData(value)!!)
else -> throw LiquidSdkException.Generic(errUnexpectedType("${value::class.java.name}"))
}
}
return list
}
fun asLnUrlPaySuccessData(lnUrlPaySuccessData: ReadableMap): LnUrlPaySuccessData? {
if (!validateMandatoryFields(
lnUrlPaySuccessData,
arrayOf(
"payment",
),
)
) {
return null
}
val successAction =
if (hasNonNullKey(lnUrlPaySuccessData, "successAction")) {
lnUrlPaySuccessData.getMap("successAction")?.let {
asSuccessActionProcessed(it)
}
} else {
null
}
val payment = lnUrlPaySuccessData.getMap("payment")?.let { asPayment(it) }!!
return LnUrlPaySuccessData(
successAction,
payment,
)
}
fun readableMapOf(lnUrlPaySuccessData: LnUrlPaySuccessData): ReadableMap =
readableMapOf(
"successAction" to lnUrlPaySuccessData.successAction?.let { readableMapOf(it) },
"payment" to readableMapOf(lnUrlPaySuccessData.payment),
)
fun asLnUrlPaySuccessDataList(arr: ReadableArray): List<LnUrlPaySuccessData> {
val list = ArrayList<LnUrlPaySuccessData>()
for (value in arr.toArrayList()) {
when (value) {
is ReadableMap -> list.add(asLnUrlPaySuccessData(value)!!)
else -> throw LiquidSdkException.Generic(errUnexpectedType("${value::class.java.name}"))
}
}
return list
}
fun asLnUrlWithdrawRequest(lnUrlWithdrawRequest: ReadableMap): LnUrlWithdrawRequest? {
if (!validateMandatoryFields(
lnUrlWithdrawRequest,
arrayOf(
"data",
"amountMsat",
),
)
) {
return null
}
val data = lnUrlWithdrawRequest.getMap("data")?.let { asLnUrlWithdrawRequestData(it) }!!
val amountMsat = lnUrlWithdrawRequest.getDouble("amountMsat").toULong()
val description = if (hasNonNullKey(lnUrlWithdrawRequest, "description")) lnUrlWithdrawRequest.getString("description") else null
return LnUrlWithdrawRequest(
data,
amountMsat,
description,
)
}
fun readableMapOf(lnUrlWithdrawRequest: LnUrlWithdrawRequest): ReadableMap =
readableMapOf(
"data" to readableMapOf(lnUrlWithdrawRequest.data),
"amountMsat" to lnUrlWithdrawRequest.amountMsat,
"description" to lnUrlWithdrawRequest.description,
)
fun asLnUrlWithdrawRequestList(arr: ReadableArray): List<LnUrlWithdrawRequest> {
val list = ArrayList<LnUrlWithdrawRequest>()
for (value in arr.toArrayList()) {
when (value) {
is ReadableMap -> list.add(asLnUrlWithdrawRequest(value)!!)
else -> throw LiquidSdkException.Generic(errUnexpectedType("${value::class.java.name}"))
}
}
return list
}
fun asLnUrlWithdrawRequestData(lnUrlWithdrawRequestData: ReadableMap): LnUrlWithdrawRequestData? {
if (!validateMandatoryFields(
lnUrlWithdrawRequestData,
arrayOf(
"callback",
"k1",
"defaultDescription",
"minWithdrawable",
"maxWithdrawable",
),
)
) {
return null
}
val callback = lnUrlWithdrawRequestData.getString("callback")!!
val k1 = lnUrlWithdrawRequestData.getString("k1")!!
val defaultDescription = lnUrlWithdrawRequestData.getString("defaultDescription")!!
val minWithdrawable = lnUrlWithdrawRequestData.getDouble("minWithdrawable").toULong()
val maxWithdrawable = lnUrlWithdrawRequestData.getDouble("maxWithdrawable").toULong()
return LnUrlWithdrawRequestData(
callback,
k1,
defaultDescription,
minWithdrawable,
maxWithdrawable,
)
}
fun readableMapOf(lnUrlWithdrawRequestData: LnUrlWithdrawRequestData): ReadableMap =
readableMapOf(
"callback" to lnUrlWithdrawRequestData.callback,
"k1" to lnUrlWithdrawRequestData.k1,
"defaultDescription" to lnUrlWithdrawRequestData.defaultDescription,
"minWithdrawable" to lnUrlWithdrawRequestData.minWithdrawable,
"maxWithdrawable" to lnUrlWithdrawRequestData.maxWithdrawable,
)
fun asLnUrlWithdrawRequestDataList(arr: ReadableArray): List<LnUrlWithdrawRequestData> {
val list = ArrayList<LnUrlWithdrawRequestData>()
for (value in arr.toArrayList()) {
when (value) {
is ReadableMap -> list.add(asLnUrlWithdrawRequestData(value)!!)
else -> throw LiquidSdkException.Generic(errUnexpectedType("${value::class.java.name}"))
}
}
return list
}
fun asLnUrlWithdrawSuccessData(lnUrlWithdrawSuccessData: ReadableMap): LnUrlWithdrawSuccessData? {
if (!validateMandatoryFields(
lnUrlWithdrawSuccessData,
arrayOf(
"invoice",
),
)
) {
return null
}
val invoice = lnUrlWithdrawSuccessData.getMap("invoice")?.let { asLnInvoice(it) }!!
return LnUrlWithdrawSuccessData(
invoice,
)
}
fun readableMapOf(lnUrlWithdrawSuccessData: LnUrlWithdrawSuccessData): ReadableMap =
readableMapOf(
"invoice" to readableMapOf(lnUrlWithdrawSuccessData.invoice),
)
fun asLnUrlWithdrawSuccessDataList(arr: ReadableArray): List<LnUrlWithdrawSuccessData> {
val list = ArrayList<LnUrlWithdrawSuccessData>()
for (value in arr.toArrayList()) {
when (value) {
is ReadableMap -> list.add(asLnUrlWithdrawSuccessData(value)!!)
else -> throw LiquidSdkException.Generic(errUnexpectedType("${value::class.java.name}"))
}
}
return list
}
fun asLogEntry(logEntry: ReadableMap): LogEntry? {
if (!validateMandatoryFields(
logEntry,
@@ -290,6 +747,38 @@ fun asLogEntryList(arr: ReadableArray): List<LogEntry> {
return list
}
fun asMessageSuccessActionData(messageSuccessActionData: ReadableMap): MessageSuccessActionData? {
if (!validateMandatoryFields(
messageSuccessActionData,
arrayOf(
"message",
),
)
) {
return null
}
val message = messageSuccessActionData.getString("message")!!
return MessageSuccessActionData(
message,
)
}
fun readableMapOf(messageSuccessActionData: MessageSuccessActionData): ReadableMap =
readableMapOf(
"message" to messageSuccessActionData.message,
)
fun asMessageSuccessActionDataList(arr: ReadableArray): List<MessageSuccessActionData> {
val list = ArrayList<MessageSuccessActionData>()
for (value in arr.toArrayList()) {
when (value) {
is ReadableMap -> list.add(asMessageSuccessActionData(value)!!)
else -> throw LiquidSdkException.Generic(errUnexpectedType("${value::class.java.name}"))
}
}
return list
}
fun asPayOnchainRequest(payOnchainRequest: ReadableMap): PayOnchainRequest? {
if (!validateMandatoryFields(
payOnchainRequest,
@@ -780,6 +1269,175 @@ fun asSendPaymentResponseList(arr: ReadableArray): List<SendPaymentResponse> {
return list
}
fun asUrlSuccessActionData(urlSuccessActionData: ReadableMap): UrlSuccessActionData? {
if (!validateMandatoryFields(
urlSuccessActionData,
arrayOf(
"description",
"url",
),
)
) {
return null
}
val description = urlSuccessActionData.getString("description")!!
val url = urlSuccessActionData.getString("url")!!
return UrlSuccessActionData(
description,
url,
)
}
fun readableMapOf(urlSuccessActionData: UrlSuccessActionData): ReadableMap =
readableMapOf(
"description" to urlSuccessActionData.description,
"url" to urlSuccessActionData.url,
)
fun asUrlSuccessActionDataList(arr: ReadableArray): List<UrlSuccessActionData> {
val list = ArrayList<UrlSuccessActionData>()
for (value in arr.toArrayList()) {
when (value) {
is ReadableMap -> list.add(asUrlSuccessActionData(value)!!)
else -> throw LiquidSdkException.Generic(errUnexpectedType("${value::class.java.name}"))
}
}
return list
}
fun asAesSuccessActionDataResult(aesSuccessActionDataResult: ReadableMap): AesSuccessActionDataResult? {
val type = aesSuccessActionDataResult.getString("type")
if (type == "decrypted") {
return AesSuccessActionDataResult.Decrypted(
aesSuccessActionDataResult.getMap("data")?.let { asAesSuccessActionDataDecrypted(it) }!!,
)
}
if (type == "errorStatus") {
return AesSuccessActionDataResult.ErrorStatus(aesSuccessActionDataResult.getString("reason")!!)
}
return null
}
fun readableMapOf(aesSuccessActionDataResult: AesSuccessActionDataResult): ReadableMap? {
val map = Arguments.createMap()
when (aesSuccessActionDataResult) {
is AesSuccessActionDataResult.Decrypted -> {
pushToMap(map, "type", "decrypted")
pushToMap(map, "data", readableMapOf(aesSuccessActionDataResult.data))
}
is AesSuccessActionDataResult.ErrorStatus -> {
pushToMap(map, "type", "errorStatus")
pushToMap(map, "reason", aesSuccessActionDataResult.reason)
}
}
return map
}
fun asAesSuccessActionDataResultList(arr: ReadableArray): List<AesSuccessActionDataResult> {
val list = ArrayList<AesSuccessActionDataResult>()
for (value in arr.toArrayList()) {
when (value) {
is ReadableMap -> list.add(asAesSuccessActionDataResult(value)!!)
else -> throw LiquidSdkException.Generic(errUnexpectedType("${value::class.java.name}"))
}
}
return list
}
fun asInputType(inputType: ReadableMap): InputType? {
val type = inputType.getString("type")
if (type == "bitcoinAddress") {
return InputType.BitcoinAddress(inputType.getMap("address")?.let { asBitcoinAddressData(it) }!!)
}
if (type == "bolt11") {
return InputType.Bolt11(inputType.getMap("invoice")?.let { asLnInvoice(it) }!!)
}
if (type == "nodeId") {
return InputType.NodeId(inputType.getString("nodeId")!!)
}
if (type == "url") {
return InputType.Url(inputType.getString("url")!!)
}
if (type == "lnUrlPay") {
return InputType.LnUrlPay(inputType.getMap("data")?.let { asLnUrlPayRequestData(it) }!!)
}
if (type == "lnUrlWithdraw") {
return InputType.LnUrlWithdraw(inputType.getMap("data")?.let { asLnUrlWithdrawRequestData(it) }!!)
}
if (type == "lnUrlAuth") {
return InputType.LnUrlAuth(inputType.getMap("data")?.let { asLnUrlAuthRequestData(it) }!!)
}
if (type == "lnUrlError") {
return InputType.LnUrlError(inputType.getMap("data")?.let { asLnUrlErrorData(it) }!!)
}
return null
}
fun readableMapOf(inputType: InputType): ReadableMap? {
val map = Arguments.createMap()
when (inputType) {
is InputType.BitcoinAddress -> {
pushToMap(map, "type", "bitcoinAddress")
pushToMap(map, "address", readableMapOf(inputType.address))
}
is InputType.Bolt11 -> {
pushToMap(map, "type", "bolt11")
pushToMap(map, "invoice", readableMapOf(inputType.invoice))
}
is InputType.NodeId -> {
pushToMap(map, "type", "nodeId")
pushToMap(map, "nodeId", inputType.nodeId)
}
is InputType.Url -> {
pushToMap(map, "type", "url")
pushToMap(map, "url", inputType.url)
}
is InputType.LnUrlPay -> {
pushToMap(map, "type", "lnUrlPay")
pushToMap(map, "data", readableMapOf(inputType.data))
}
is InputType.LnUrlWithdraw -> {
pushToMap(map, "type", "lnUrlWithdraw")
pushToMap(map, "data", readableMapOf(inputType.data))
}
is InputType.LnUrlAuth -> {
pushToMap(map, "type", "lnUrlAuth")
pushToMap(map, "data", readableMapOf(inputType.data))
}
is InputType.LnUrlError -> {
pushToMap(map, "type", "lnUrlError")
pushToMap(map, "data", readableMapOf(inputType.data))
}
}
return map
}
fun asInputTypeList(arr: ReadableArray): List<InputType> {
val list = ArrayList<InputType>()
for (value in arr.toArrayList()) {
when (value) {
is ReadableMap -> list.add(asInputType(value)!!)
else -> throw LiquidSdkException.Generic(errUnexpectedType("${value::class.java.name}"))
}
}
return list
}
fun asLiquidNetwork(type: String): LiquidNetwork = LiquidNetwork.valueOf(camelToUpperSnakeCase(type))
fun asLiquidNetworkList(arr: ReadableArray): List<LiquidNetwork> {
val list = ArrayList<LiquidNetwork>()
for (value in arr.toArrayList()) {
when (value) {
is String -> list.add(asLiquidNetwork(value)!!)
else -> throw LiquidSdkException.Generic(errUnexpectedType("${value::class.java.name}"))
}
}
return list
}
fun asLiquidSdkEvent(liquidSdkEvent: ReadableMap): LiquidSdkEvent? {
val type = liquidSdkEvent.getString("type")
@@ -852,6 +1510,126 @@ fun asLiquidSdkEventList(arr: ReadableArray): List<LiquidSdkEvent> {
return list
}
fun asLnUrlCallbackStatus(lnUrlCallbackStatus: ReadableMap): LnUrlCallbackStatus? {
val type = lnUrlCallbackStatus.getString("type")
if (type == "ok") {
return LnUrlCallbackStatus.Ok
}
if (type == "errorStatus") {
return LnUrlCallbackStatus.ErrorStatus(lnUrlCallbackStatus.getMap("data")?.let { asLnUrlErrorData(it) }!!)
}
return null
}
fun readableMapOf(lnUrlCallbackStatus: LnUrlCallbackStatus): ReadableMap? {
val map = Arguments.createMap()
when (lnUrlCallbackStatus) {
is LnUrlCallbackStatus.Ok -> {
pushToMap(map, "type", "ok")
}
is LnUrlCallbackStatus.ErrorStatus -> {
pushToMap(map, "type", "errorStatus")
pushToMap(map, "data", readableMapOf(lnUrlCallbackStatus.data))
}
}
return map
}
fun asLnUrlCallbackStatusList(arr: ReadableArray): List<LnUrlCallbackStatus> {
val list = ArrayList<LnUrlCallbackStatus>()
for (value in arr.toArrayList()) {
when (value) {
is ReadableMap -> list.add(asLnUrlCallbackStatus(value)!!)
else -> throw LiquidSdkException.Generic(errUnexpectedType("${value::class.java.name}"))
}
}
return list
}
fun asLnUrlPayResult(lnUrlPayResult: ReadableMap): LnUrlPayResult? {
val type = lnUrlPayResult.getString("type")
if (type == "endpointSuccess") {
return LnUrlPayResult.EndpointSuccess(lnUrlPayResult.getMap("data")?.let { asLnUrlPaySuccessData(it) }!!)
}
if (type == "endpointError") {
return LnUrlPayResult.EndpointError(lnUrlPayResult.getMap("data")?.let { asLnUrlErrorData(it) }!!)
}
if (type == "payError") {
return LnUrlPayResult.PayError(lnUrlPayResult.getMap("data")?.let { asLnUrlPayErrorData(it) }!!)
}
return null
}
fun readableMapOf(lnUrlPayResult: LnUrlPayResult): ReadableMap? {
val map = Arguments.createMap()
when (lnUrlPayResult) {
is LnUrlPayResult.EndpointSuccess -> {
pushToMap(map, "type", "endpointSuccess")
pushToMap(map, "data", readableMapOf(lnUrlPayResult.data))
}
is LnUrlPayResult.EndpointError -> {
pushToMap(map, "type", "endpointError")
pushToMap(map, "data", readableMapOf(lnUrlPayResult.data))
}
is LnUrlPayResult.PayError -> {
pushToMap(map, "type", "payError")
pushToMap(map, "data", readableMapOf(lnUrlPayResult.data))
}
}
return map
}
fun asLnUrlPayResultList(arr: ReadableArray): List<LnUrlPayResult> {
val list = ArrayList<LnUrlPayResult>()
for (value in arr.toArrayList()) {
when (value) {
is ReadableMap -> list.add(asLnUrlPayResult(value)!!)
else -> throw LiquidSdkException.Generic(errUnexpectedType("${value::class.java.name}"))
}
}
return list
}
fun asLnUrlWithdrawResult(lnUrlWithdrawResult: ReadableMap): LnUrlWithdrawResult? {
val type = lnUrlWithdrawResult.getString("type")
if (type == "ok") {
return LnUrlWithdrawResult.Ok(lnUrlWithdrawResult.getMap("data")?.let { asLnUrlWithdrawSuccessData(it) }!!)
}
if (type == "errorStatus") {
return LnUrlWithdrawResult.ErrorStatus(lnUrlWithdrawResult.getMap("data")?.let { asLnUrlErrorData(it) }!!)
}
return null
}
fun readableMapOf(lnUrlWithdrawResult: LnUrlWithdrawResult): ReadableMap? {
val map = Arguments.createMap()
when (lnUrlWithdrawResult) {
is LnUrlWithdrawResult.Ok -> {
pushToMap(map, "type", "ok")
pushToMap(map, "data", readableMapOf(lnUrlWithdrawResult.data))
}
is LnUrlWithdrawResult.ErrorStatus -> {
pushToMap(map, "type", "errorStatus")
pushToMap(map, "data", readableMapOf(lnUrlWithdrawResult.data))
}
}
return map
}
fun asLnUrlWithdrawResultList(arr: ReadableArray): List<LnUrlWithdrawResult> {
val list = ArrayList<LnUrlWithdrawResult>()
for (value in arr.toArrayList()) {
when (value) {
is ReadableMap -> list.add(asLnUrlWithdrawResult(value)!!)
else -> throw LiquidSdkException.Generic(errUnexpectedType("${value::class.java.name}"))
}
}
return list
}
fun asNetwork(type: String): Network = Network.valueOf(camelToUpperSnakeCase(type))
fun asNetworkList(arr: ReadableArray): List<Network> {
@@ -891,6 +1669,51 @@ fun asPaymentTypeList(arr: ReadableArray): List<PaymentType> {
return list
}
fun asSuccessActionProcessed(successActionProcessed: ReadableMap): SuccessActionProcessed? {
val type = successActionProcessed.getString("type")
if (type == "aes") {
return SuccessActionProcessed.Aes(successActionProcessed.getMap("result")?.let { asAesSuccessActionDataResult(it) }!!)
}
if (type == "message") {
return SuccessActionProcessed.Message(successActionProcessed.getMap("data")?.let { asMessageSuccessActionData(it) }!!)
}
if (type == "url") {
return SuccessActionProcessed.Url(successActionProcessed.getMap("data")?.let { asUrlSuccessActionData(it) }!!)
}
return null
}
fun readableMapOf(successActionProcessed: SuccessActionProcessed): ReadableMap? {
val map = Arguments.createMap()
when (successActionProcessed) {
is SuccessActionProcessed.Aes -> {
pushToMap(map, "type", "aes")
pushToMap(map, "result", readableMapOf(successActionProcessed.result))
}
is SuccessActionProcessed.Message -> {
pushToMap(map, "type", "message")
pushToMap(map, "data", readableMapOf(successActionProcessed.data))
}
is SuccessActionProcessed.Url -> {
pushToMap(map, "type", "url")
pushToMap(map, "data", readableMapOf(successActionProcessed.data))
}
}
return map
}
fun asSuccessActionProcessedList(arr: ReadableArray): List<SuccessActionProcessed> {
val list = ArrayList<SuccessActionProcessed>()
for (value in arr.toArrayList()) {
when (value) {
is ReadableMap -> list.add(asSuccessActionProcessed(value)!!)
else -> throw LiquidSdkException.Generic(errUnexpectedType("${value::class.java.name}"))
}
}
return list
}
fun readableMapOf(vararg values: Pair<String, *>): ReadableMap {
val map = Arguments.createMap()
for ((key, value) in values) {

View File

@@ -61,7 +61,7 @@ class BreezLiquidSDKModule(
) {
executor.execute {
try {
val networkTmp = asNetwork(network)
val networkTmp = asLiquidNetwork(network)
val res = defaultConfig(networkTmp)
val workingDir = File(reactApplicationContext.filesDir.toString() + "/breezLiquidSdk")
@@ -74,13 +74,28 @@ class BreezLiquidSDKModule(
}
@ReactMethod
fun parseInvoice(
invoice: String,
fun parse(
input: String,
promise: Promise,
) {
executor.execute {
try {
val res = parseInvoice(invoice)
val res = parse(input)
promise.resolve(readableMapOf(res))
} catch (e: Exception) {
promise.reject(e.javaClass.simpleName.replace("Exception", "Error"), e.message, e)
}
}
}
@ReactMethod
fun parseInvoice(
input: String,
promise: Promise,
) {
executor.execute {
try {
val res = parseInvoice(input)
promise.resolve(readableMapOf(res))
} catch (e: Exception) {
promise.reject(e.javaClass.simpleName.replace("Exception", "Error"), e.message, e)
@@ -349,4 +364,57 @@ class BreezLiquidSDKModule(
}
}
}
@ReactMethod
fun lnurlPay(
req: ReadableMap,
promise: Promise,
) {
executor.execute {
try {
val lnUrlPayRequest =
asLnUrlPayRequest(req) ?: run { throw LiquidSdkException.Generic(errMissingMandatoryField("req", "LnUrlPayRequest")) }
val res = getBindingLiquidSdk().lnurlPay(lnUrlPayRequest)
promise.resolve(readableMapOf(res))
} catch (e: Exception) {
promise.reject(e.javaClass.simpleName.replace("Exception", "Error"), e.message, e)
}
}
}
@ReactMethod
fun lnurlWithdraw(
req: ReadableMap,
promise: Promise,
) {
executor.execute {
try {
val lnUrlWithdrawRequest =
asLnUrlWithdrawRequest(req)
?: run { throw LiquidSdkException.Generic(errMissingMandatoryField("req", "LnUrlWithdrawRequest")) }
val res = getBindingLiquidSdk().lnurlWithdraw(lnUrlWithdrawRequest)
promise.resolve(readableMapOf(res))
} catch (e: Exception) {
promise.reject(e.javaClass.simpleName.replace("Exception", "Error"), e.message, e)
}
}
}
@ReactMethod
fun lnurlAuth(
reqData: ReadableMap,
promise: Promise,
) {
executor.execute {
try {
val lnUrlAuthRequestData =
asLnUrlAuthRequestData(reqData)
?: run { throw LiquidSdkException.Generic(errMissingMandatoryField("reqData", "LnUrlAuthRequestData")) }
val res = getBindingLiquidSdk().lnurlAuth(lnUrlAuthRequestData)
promise.resolve(readableMapOf(res))
} catch (e: Exception) {
promise.reject(e.javaClass.simpleName.replace("Exception", "Error"), e.message, e)
}
}
}
}