Expose fees for review + auto accept

This commit is contained in:
Daniel Granhão
2024-12-20 13:36:30 +00:00
parent 08f0fd26cc
commit 351473a41e
30 changed files with 1195 additions and 367 deletions

View File

@@ -3,6 +3,36 @@ import breez_sdk_liquid.*
import com.facebook.react.bridge.*
import java.util.*
fun asAcceptPaymentProposedFeesRequest(acceptPaymentProposedFeesRequest: ReadableMap): AcceptPaymentProposedFeesRequest? {
if (!validateMandatoryFields(
acceptPaymentProposedFeesRequest,
arrayOf(
"response",
),
)
) {
return null
}
val response = acceptPaymentProposedFeesRequest.getMap("response")?.let { asFetchPaymentProposedFeesResponse(it) }!!
return AcceptPaymentProposedFeesRequest(response)
}
fun readableMapOf(acceptPaymentProposedFeesRequest: AcceptPaymentProposedFeesRequest): ReadableMap =
readableMapOf(
"response" to readableMapOf(acceptPaymentProposedFeesRequest.response),
)
fun asAcceptPaymentProposedFeesRequestList(arr: ReadableArray): List<AcceptPaymentProposedFeesRequest> {
val list = ArrayList<AcceptPaymentProposedFeesRequest>()
for (value in arr.toList()) {
when (value) {
is ReadableMap -> list.add(asAcceptPaymentProposedFeesRequest(value)!!)
else -> throw SdkException.Generic(errUnexpectedType(value))
}
}
return list
}
fun asAesSuccessActionData(aesSuccessActionData: ReadableMap): AesSuccessActionData? {
if (!validateMandatoryFields(
aesSuccessActionData,
@@ -284,6 +314,16 @@ fun asConfig(config: ReadableMap): Config? {
} else {
null
}
val onchainFeeRateLeewaySatPerVbyte =
if (hasNonNullKey(
config,
"onchainFeeRateLeewaySatPerVbyte",
)
) {
config.getInt("onchainFeeRateLeewaySatPerVbyte").toUInt()
} else {
null
}
return Config(
liquidElectrumUrl,
bitcoinElectrumUrl,
@@ -298,6 +338,7 @@ fun asConfig(config: ReadableMap): Config? {
zeroConfMaxAmountSat,
useDefaultExternalInputParsers,
externalInputParsers,
onchainFeeRateLeewaySatPerVbyte,
)
}
@@ -316,6 +357,7 @@ fun readableMapOf(config: Config): ReadableMap =
"zeroConfMaxAmountSat" to config.zeroConfMaxAmountSat,
"useDefaultExternalInputParsers" to config.useDefaultExternalInputParsers,
"externalInputParsers" to config.externalInputParsers?.let { readableArrayOf(it) },
"onchainFeeRateLeewaySatPerVbyte" to config.onchainFeeRateLeewaySatPerVbyte,
)
fun asConfigList(arr: ReadableArray): List<Config> {
@@ -473,6 +515,72 @@ fun asExternalInputParserList(arr: ReadableArray): List<ExternalInputParser> {
return list
}
fun asFetchPaymentProposedFeesRequest(fetchPaymentProposedFeesRequest: ReadableMap): FetchPaymentProposedFeesRequest? {
if (!validateMandatoryFields(
fetchPaymentProposedFeesRequest,
arrayOf(
"swapId",
),
)
) {
return null
}
val swapId = fetchPaymentProposedFeesRequest.getString("swapId")!!
return FetchPaymentProposedFeesRequest(swapId)
}
fun readableMapOf(fetchPaymentProposedFeesRequest: FetchPaymentProposedFeesRequest): ReadableMap =
readableMapOf(
"swapId" to fetchPaymentProposedFeesRequest.swapId,
)
fun asFetchPaymentProposedFeesRequestList(arr: ReadableArray): List<FetchPaymentProposedFeesRequest> {
val list = ArrayList<FetchPaymentProposedFeesRequest>()
for (value in arr.toList()) {
when (value) {
is ReadableMap -> list.add(asFetchPaymentProposedFeesRequest(value)!!)
else -> throw SdkException.Generic(errUnexpectedType(value))
}
}
return list
}
fun asFetchPaymentProposedFeesResponse(fetchPaymentProposedFeesResponse: ReadableMap): FetchPaymentProposedFeesResponse? {
if (!validateMandatoryFields(
fetchPaymentProposedFeesResponse,
arrayOf(
"swapId",
"feesSat",
"payerAmountSat",
),
)
) {
return null
}
val swapId = fetchPaymentProposedFeesResponse.getString("swapId")!!
val feesSat = fetchPaymentProposedFeesResponse.getDouble("feesSat").toULong()
val payerAmountSat = fetchPaymentProposedFeesResponse.getDouble("payerAmountSat").toULong()
return FetchPaymentProposedFeesResponse(swapId, feesSat, payerAmountSat)
}
fun readableMapOf(fetchPaymentProposedFeesResponse: FetchPaymentProposedFeesResponse): ReadableMap =
readableMapOf(
"swapId" to fetchPaymentProposedFeesResponse.swapId,
"feesSat" to fetchPaymentProposedFeesResponse.feesSat,
"payerAmountSat" to fetchPaymentProposedFeesResponse.payerAmountSat,
)
fun asFetchPaymentProposedFeesResponseList(arr: ReadableArray): List<FetchPaymentProposedFeesResponse> {
val list = ArrayList<FetchPaymentProposedFeesResponse>()
for (value in arr.toList()) {
when (value) {
is ReadableMap -> list.add(asFetchPaymentProposedFeesResponse(value)!!)
else -> throw SdkException.Generic(errUnexpectedType(value))
}
}
return list
}
fun asFiatCurrency(fiatCurrency: ReadableMap): FiatCurrency? {
if (!validateMandatoryFields(
fiatCurrency,
@@ -3230,6 +3338,10 @@ fun asSdkEvent(sdkEvent: ReadableMap): SdkEvent? {
val details = sdkEvent.getMap("details")?.let { asPayment(it) }!!
return SdkEvent.PaymentWaitingConfirmation(details)
}
if (type == "paymentWaitingFeeAcceptance") {
val details = sdkEvent.getMap("details")?.let { asPayment(it) }!!
return SdkEvent.PaymentWaitingFeeAcceptance(details)
}
if (type == "synced") {
return SdkEvent.Synced
}
@@ -3263,6 +3375,10 @@ fun readableMapOf(sdkEvent: SdkEvent): ReadableMap? {
pushToMap(map, "type", "paymentWaitingConfirmation")
pushToMap(map, "details", readableMapOf(sdkEvent.details))
}
is SdkEvent.PaymentWaitingFeeAcceptance -> {
pushToMap(map, "type", "paymentWaitingFeeAcceptance")
pushToMap(map, "details", readableMapOf(sdkEvent.details))
}
is SdkEvent.Synced -> {
pushToMap(map, "type", "synced")
}

View File

@@ -420,6 +420,42 @@ class BreezSDKLiquidModule(
}
}
@ReactMethod
fun fetchPaymentProposedFees(
req: ReadableMap,
promise: Promise,
) {
executor.execute {
try {
val fetchPaymentProposedFeesRequest =
asFetchPaymentProposedFeesRequest(req)
?: run { throw SdkException.Generic(errMissingMandatoryField("req", "FetchPaymentProposedFeesRequest")) }
val res = getBindingLiquidSdk().fetchPaymentProposedFees(fetchPaymentProposedFeesRequest)
promise.resolve(readableMapOf(res))
} catch (e: Exception) {
promise.reject(e.javaClass.simpleName.replace("Exception", "Error"), e.message, e)
}
}
}
@ReactMethod
fun acceptPaymentProposedFees(
req: ReadableMap,
promise: Promise,
) {
executor.execute {
try {
val acceptPaymentProposedFeesRequest =
asAcceptPaymentProposedFeesRequest(req)
?: run { throw SdkException.Generic(errMissingMandatoryField("req", "AcceptPaymentProposedFeesRequest")) }
getBindingLiquidSdk().acceptPaymentProposedFees(acceptPaymentProposedFeesRequest)
promise.resolve(readableMapOf("status" to "ok"))
} catch (e: Exception) {
promise.reject(e.javaClass.simpleName.replace("Exception", "Error"), e.message, e)
}
}
}
@ReactMethod
fun listRefundables(promise: Promise) {
executor.execute {

View File

@@ -2,6 +2,38 @@ import BreezSDKLiquid
import Foundation
enum BreezSDKLiquidMapper {
static func asAcceptPaymentProposedFeesRequest(acceptPaymentProposedFeesRequest: [String: Any?]) throws -> AcceptPaymentProposedFeesRequest {
guard let responseTmp = acceptPaymentProposedFeesRequest["response"] as? [String: Any?] else {
throw SdkError.Generic(message: errMissingMandatoryField(fieldName: "response", typeName: "AcceptPaymentProposedFeesRequest"))
}
let response = try asFetchPaymentProposedFeesResponse(fetchPaymentProposedFeesResponse: responseTmp)
return AcceptPaymentProposedFeesRequest(response: response)
}
static func dictionaryOf(acceptPaymentProposedFeesRequest: AcceptPaymentProposedFeesRequest) -> [String: Any?] {
return [
"response": dictionaryOf(fetchPaymentProposedFeesResponse: acceptPaymentProposedFeesRequest.response),
]
}
static func asAcceptPaymentProposedFeesRequestList(arr: [Any]) throws -> [AcceptPaymentProposedFeesRequest] {
var list = [AcceptPaymentProposedFeesRequest]()
for value in arr {
if let val = value as? [String: Any?] {
var acceptPaymentProposedFeesRequest = try asAcceptPaymentProposedFeesRequest(acceptPaymentProposedFeesRequest: val)
list.append(acceptPaymentProposedFeesRequest)
} else {
throw SdkError.Generic(message: errUnexpectedType(typeName: "AcceptPaymentProposedFeesRequest"))
}
}
return list
}
static func arrayOf(acceptPaymentProposedFeesRequestList: [AcceptPaymentProposedFeesRequest]) -> [Any] {
return acceptPaymentProposedFeesRequestList.map { v -> [String: Any?] in return dictionaryOf(acceptPaymentProposedFeesRequest: v) }
}
static func asAesSuccessActionData(aesSuccessActionData: [String: Any?]) throws -> AesSuccessActionData {
guard let description = aesSuccessActionData["description"] as? String else {
throw SdkError.Generic(message: errMissingMandatoryField(fieldName: "description", typeName: "AesSuccessActionData"))
@@ -307,9 +339,6 @@ enum BreezSDKLiquidMapper {
guard let zeroConfMinFeeRateMsat = config["zeroConfMinFeeRateMsat"] as? UInt32 else {
throw SdkError.Generic(message: errMissingMandatoryField(fieldName: "zeroConfMinFeeRateMsat", typeName: "Config"))
}
guard let syncServiceUrl = config["syncServiceUrl"] as? String else {
throw SdkError.Generic(message: errMissingMandatoryField(fieldName: "syncServiceUrl", typeName: "Config"))
}
var breezApiKey: String?
if hasNonNilKey(data: config, key: "breezApiKey") {
guard let breezApiKeyTmp = config["breezApiKey"] as? String else {
@@ -339,7 +368,15 @@ enum BreezSDKLiquidMapper {
externalInputParsers = try asExternalInputParserList(arr: externalInputParsersTmp)
}
return Config(liquidElectrumUrl: liquidElectrumUrl, bitcoinElectrumUrl: bitcoinElectrumUrl, mempoolspaceUrl: mempoolspaceUrl, workingDir: workingDir, network: network, paymentTimeoutSec: paymentTimeoutSec, zeroConfMinFeeRateMsat: zeroConfMinFeeRateMsat, syncServiceUrl: syncServiceUrl, breezApiKey: breezApiKey, cacheDir: cacheDir, zeroConfMaxAmountSat: zeroConfMaxAmountSat, useDefaultExternalInputParsers: useDefaultExternalInputParsers, externalInputParsers: externalInputParsers)
var onchainFeeRateLeewaySatPerVbyte: UInt32?
if hasNonNilKey(data: config, key: "onchainFeeRateLeewaySatPerVbyte") {
guard let onchainFeeRateLeewaySatPerVbyteTmp = config["onchainFeeRateLeewaySatPerVbyte"] as? UInt32 else {
throw SdkError.Generic(message: errUnexpectedValue(fieldName: "onchainFeeRateLeewaySatPerVbyte"))
}
onchainFeeRateLeewaySatPerVbyte = onchainFeeRateLeewaySatPerVbyteTmp
}
return Config(liquidElectrumUrl: liquidElectrumUrl, bitcoinElectrumUrl: bitcoinElectrumUrl, mempoolspaceUrl: mempoolspaceUrl, workingDir: workingDir, network: network, paymentTimeoutSec: paymentTimeoutSec, zeroConfMinFeeRateMsat: zeroConfMinFeeRateMsat, breezApiKey: breezApiKey, cacheDir: cacheDir, zeroConfMaxAmountSat: zeroConfMaxAmountSat, useDefaultExternalInputParsers: useDefaultExternalInputParsers, externalInputParsers: externalInputParsers, onchainFeeRateLeewaySatPerVbyte: onchainFeeRateLeewaySatPerVbyte)
}
static func dictionaryOf(config: Config) -> [String: Any?] {
@@ -351,12 +388,12 @@ enum BreezSDKLiquidMapper {
"network": valueOf(liquidNetwork: config.network),
"paymentTimeoutSec": config.paymentTimeoutSec,
"zeroConfMinFeeRateMsat": config.zeroConfMinFeeRateMsat,
"syncServiceUrl": config.syncServiceUrl,
"breezApiKey": config.breezApiKey == nil ? nil : config.breezApiKey,
"cacheDir": config.cacheDir == nil ? nil : config.cacheDir,
"zeroConfMaxAmountSat": config.zeroConfMaxAmountSat == nil ? nil : config.zeroConfMaxAmountSat,
"useDefaultExternalInputParsers": config.useDefaultExternalInputParsers,
"externalInputParsers": config.externalInputParsers == nil ? nil : arrayOf(externalInputParserList: config.externalInputParsers!),
"onchainFeeRateLeewaySatPerVbyte": config.onchainFeeRateLeewaySatPerVbyte == nil ? nil : config.onchainFeeRateLeewaySatPerVbyte,
]
}
@@ -551,6 +588,76 @@ enum BreezSDKLiquidMapper {
return externalInputParserList.map { v -> [String: Any?] in return dictionaryOf(externalInputParser: v) }
}
static func asFetchPaymentProposedFeesRequest(fetchPaymentProposedFeesRequest: [String: Any?]) throws -> FetchPaymentProposedFeesRequest {
guard let swapId = fetchPaymentProposedFeesRequest["swapId"] as? String else {
throw SdkError.Generic(message: errMissingMandatoryField(fieldName: "swapId", typeName: "FetchPaymentProposedFeesRequest"))
}
return FetchPaymentProposedFeesRequest(swapId: swapId)
}
static func dictionaryOf(fetchPaymentProposedFeesRequest: FetchPaymentProposedFeesRequest) -> [String: Any?] {
return [
"swapId": fetchPaymentProposedFeesRequest.swapId,
]
}
static func asFetchPaymentProposedFeesRequestList(arr: [Any]) throws -> [FetchPaymentProposedFeesRequest] {
var list = [FetchPaymentProposedFeesRequest]()
for value in arr {
if let val = value as? [String: Any?] {
var fetchPaymentProposedFeesRequest = try asFetchPaymentProposedFeesRequest(fetchPaymentProposedFeesRequest: val)
list.append(fetchPaymentProposedFeesRequest)
} else {
throw SdkError.Generic(message: errUnexpectedType(typeName: "FetchPaymentProposedFeesRequest"))
}
}
return list
}
static func arrayOf(fetchPaymentProposedFeesRequestList: [FetchPaymentProposedFeesRequest]) -> [Any] {
return fetchPaymentProposedFeesRequestList.map { v -> [String: Any?] in return dictionaryOf(fetchPaymentProposedFeesRequest: v) }
}
static func asFetchPaymentProposedFeesResponse(fetchPaymentProposedFeesResponse: [String: Any?]) throws -> FetchPaymentProposedFeesResponse {
guard let swapId = fetchPaymentProposedFeesResponse["swapId"] as? String else {
throw SdkError.Generic(message: errMissingMandatoryField(fieldName: "swapId", typeName: "FetchPaymentProposedFeesResponse"))
}
guard let feesSat = fetchPaymentProposedFeesResponse["feesSat"] as? UInt64 else {
throw SdkError.Generic(message: errMissingMandatoryField(fieldName: "feesSat", typeName: "FetchPaymentProposedFeesResponse"))
}
guard let payerAmountSat = fetchPaymentProposedFeesResponse["payerAmountSat"] as? UInt64 else {
throw SdkError.Generic(message: errMissingMandatoryField(fieldName: "payerAmountSat", typeName: "FetchPaymentProposedFeesResponse"))
}
return FetchPaymentProposedFeesResponse(swapId: swapId, feesSat: feesSat, payerAmountSat: payerAmountSat)
}
static func dictionaryOf(fetchPaymentProposedFeesResponse: FetchPaymentProposedFeesResponse) -> [String: Any?] {
return [
"swapId": fetchPaymentProposedFeesResponse.swapId,
"feesSat": fetchPaymentProposedFeesResponse.feesSat,
"payerAmountSat": fetchPaymentProposedFeesResponse.payerAmountSat,
]
}
static func asFetchPaymentProposedFeesResponseList(arr: [Any]) throws -> [FetchPaymentProposedFeesResponse] {
var list = [FetchPaymentProposedFeesResponse]()
for value in arr {
if let val = value as? [String: Any?] {
var fetchPaymentProposedFeesResponse = try asFetchPaymentProposedFeesResponse(fetchPaymentProposedFeesResponse: val)
list.append(fetchPaymentProposedFeesResponse)
} else {
throw SdkError.Generic(message: errUnexpectedType(typeName: "FetchPaymentProposedFeesResponse"))
}
}
return list
}
static func arrayOf(fetchPaymentProposedFeesResponseList: [FetchPaymentProposedFeesResponse]) -> [Any] {
return fetchPaymentProposedFeesResponseList.map { v -> [String: Any?] in return dictionaryOf(fetchPaymentProposedFeesResponse: v) }
}
static func asFiatCurrency(fiatCurrency: [String: Any?]) throws -> FiatCurrency {
guard let id = fiatCurrency["id"] as? String else {
throw SdkError.Generic(message: errMissingMandatoryField(fieldName: "id", typeName: "FiatCurrency"))
@@ -956,11 +1063,6 @@ enum BreezSDKLiquidMapper {
filters = try asPaymentTypeList(arr: filtersTmp)
}
var states: [PaymentState]?
if let statesTmp = listPaymentsRequest["states"] as? [String] {
states = try asPaymentStateList(arr: statesTmp)
}
var fromTimestamp: Int64?
if hasNonNilKey(data: listPaymentsRequest, key: "fromTimestamp") {
guard let fromTimestampTmp = listPaymentsRequest["fromTimestamp"] as? Int64 else {
@@ -994,13 +1096,12 @@ enum BreezSDKLiquidMapper {
details = try asListPaymentDetails(listPaymentDetails: detailsTmp)
}
return ListPaymentsRequest(filters: filters, states: states, fromTimestamp: fromTimestamp, toTimestamp: toTimestamp, offset: offset, limit: limit, details: details)
return ListPaymentsRequest(filters: filters, fromTimestamp: fromTimestamp, toTimestamp: toTimestamp, offset: offset, limit: limit, details: details)
}
static func dictionaryOf(listPaymentsRequest: ListPaymentsRequest) -> [String: Any?] {
return [
"filters": listPaymentsRequest.filters == nil ? nil : arrayOf(paymentTypeList: listPaymentsRequest.filters!),
"states": listPaymentsRequest.states == nil ? nil : arrayOf(paymentStateList: listPaymentsRequest.states!),
"fromTimestamp": listPaymentsRequest.fromTimestamp == nil ? nil : listPaymentsRequest.fromTimestamp,
"toTimestamp": listPaymentsRequest.toTimestamp == nil ? nil : listPaymentsRequest.toTimestamp,
"offset": listPaymentsRequest.offset == nil ? nil : listPaymentsRequest.offset,
@@ -1135,85 +1236,6 @@ enum BreezSDKLiquidMapper {
return lnUrlErrorDataList.map { v -> [String: Any?] in return dictionaryOf(lnUrlErrorData: v) }
}
static func asLnUrlInfo(lnUrlInfo: [String: Any?]) throws -> LnUrlInfo {
var lnAddress: String?
if hasNonNilKey(data: lnUrlInfo, key: "lnAddress") {
guard let lnAddressTmp = lnUrlInfo["lnAddress"] as? String else {
throw SdkError.Generic(message: errUnexpectedValue(fieldName: "lnAddress"))
}
lnAddress = lnAddressTmp
}
var lnurlPayComment: String?
if hasNonNilKey(data: lnUrlInfo, key: "lnurlPayComment") {
guard let lnurlPayCommentTmp = lnUrlInfo["lnurlPayComment"] as? String else {
throw SdkError.Generic(message: errUnexpectedValue(fieldName: "lnurlPayComment"))
}
lnurlPayComment = lnurlPayCommentTmp
}
var lnurlPayDomain: String?
if hasNonNilKey(data: lnUrlInfo, key: "lnurlPayDomain") {
guard let lnurlPayDomainTmp = lnUrlInfo["lnurlPayDomain"] as? String else {
throw SdkError.Generic(message: errUnexpectedValue(fieldName: "lnurlPayDomain"))
}
lnurlPayDomain = lnurlPayDomainTmp
}
var lnurlPayMetadata: String?
if hasNonNilKey(data: lnUrlInfo, key: "lnurlPayMetadata") {
guard let lnurlPayMetadataTmp = lnUrlInfo["lnurlPayMetadata"] as? String else {
throw SdkError.Generic(message: errUnexpectedValue(fieldName: "lnurlPayMetadata"))
}
lnurlPayMetadata = lnurlPayMetadataTmp
}
var lnurlPaySuccessAction: SuccessActionProcessed?
if let lnurlPaySuccessActionTmp = lnUrlInfo["lnurlPaySuccessAction"] as? [String: Any?] {
lnurlPaySuccessAction = try asSuccessActionProcessed(successActionProcessed: lnurlPaySuccessActionTmp)
}
var lnurlPayUnprocessedSuccessAction: SuccessAction?
if let lnurlPayUnprocessedSuccessActionTmp = lnUrlInfo["lnurlPayUnprocessedSuccessAction"] as? [String: Any?] {
lnurlPayUnprocessedSuccessAction = try asSuccessAction(successAction: lnurlPayUnprocessedSuccessActionTmp)
}
var lnurlWithdrawEndpoint: String?
if hasNonNilKey(data: lnUrlInfo, key: "lnurlWithdrawEndpoint") {
guard let lnurlWithdrawEndpointTmp = lnUrlInfo["lnurlWithdrawEndpoint"] as? String else {
throw SdkError.Generic(message: errUnexpectedValue(fieldName: "lnurlWithdrawEndpoint"))
}
lnurlWithdrawEndpoint = lnurlWithdrawEndpointTmp
}
return LnUrlInfo(lnAddress: lnAddress, lnurlPayComment: lnurlPayComment, lnurlPayDomain: lnurlPayDomain, lnurlPayMetadata: lnurlPayMetadata, lnurlPaySuccessAction: lnurlPaySuccessAction, lnurlPayUnprocessedSuccessAction: lnurlPayUnprocessedSuccessAction, lnurlWithdrawEndpoint: lnurlWithdrawEndpoint)
}
static func dictionaryOf(lnUrlInfo: LnUrlInfo) -> [String: Any?] {
return [
"lnAddress": lnUrlInfo.lnAddress == nil ? nil : lnUrlInfo.lnAddress,
"lnurlPayComment": lnUrlInfo.lnurlPayComment == nil ? nil : lnUrlInfo.lnurlPayComment,
"lnurlPayDomain": lnUrlInfo.lnurlPayDomain == nil ? nil : lnUrlInfo.lnurlPayDomain,
"lnurlPayMetadata": lnUrlInfo.lnurlPayMetadata == nil ? nil : lnUrlInfo.lnurlPayMetadata,
"lnurlPaySuccessAction": lnUrlInfo.lnurlPaySuccessAction == nil ? nil : dictionaryOf(successActionProcessed: lnUrlInfo.lnurlPaySuccessAction!),
"lnurlPayUnprocessedSuccessAction": lnUrlInfo.lnurlPayUnprocessedSuccessAction == nil ? nil : dictionaryOf(successAction: lnUrlInfo.lnurlPayUnprocessedSuccessAction!),
"lnurlWithdrawEndpoint": lnUrlInfo.lnurlWithdrawEndpoint == nil ? nil : lnUrlInfo.lnurlWithdrawEndpoint,
]
}
static func asLnUrlInfoList(arr: [Any]) throws -> [LnUrlInfo] {
var list = [LnUrlInfo]()
for value in arr {
if let val = value as? [String: Any?] {
var lnUrlInfo = try asLnUrlInfo(lnUrlInfo: val)
list.append(lnUrlInfo)
} else {
throw SdkError.Generic(message: errUnexpectedType(typeName: "LnUrlInfo"))
}
}
return list
}
static func arrayOf(lnUrlInfoList: [LnUrlInfo]) -> [Any] {
return lnUrlInfoList.map { v -> [String: Any?] in return dictionaryOf(lnUrlInfo: v) }
}
static func asLnUrlPayErrorData(lnUrlPayErrorData: [String: Any?]) throws -> LnUrlPayErrorData {
guard let paymentHash = lnUrlPayErrorData["paymentHash"] as? String else {
throw SdkError.Generic(message: errMissingMandatoryField(fieldName: "paymentHash", typeName: "LnUrlPayErrorData"))
@@ -1962,32 +1984,18 @@ enum BreezSDKLiquidMapper {
guard let feesSat = prepareLnUrlPayResponse["feesSat"] as? UInt64 else {
throw SdkError.Generic(message: errMissingMandatoryField(fieldName: "feesSat", typeName: "PrepareLnUrlPayResponse"))
}
guard let dataTmp = prepareLnUrlPayResponse["data"] as? [String: Any?] else {
throw SdkError.Generic(message: errMissingMandatoryField(fieldName: "data", typeName: "PrepareLnUrlPayResponse"))
}
let data = try asLnUrlPayRequestData(lnUrlPayRequestData: dataTmp)
var comment: String?
if hasNonNilKey(data: prepareLnUrlPayResponse, key: "comment") {
guard let commentTmp = prepareLnUrlPayResponse["comment"] as? String else {
throw SdkError.Generic(message: errUnexpectedValue(fieldName: "comment"))
}
comment = commentTmp
}
var successAction: SuccessAction?
if let successActionTmp = prepareLnUrlPayResponse["successAction"] as? [String: Any?] {
successAction = try asSuccessAction(successAction: successActionTmp)
}
return PrepareLnUrlPayResponse(destination: destination, feesSat: feesSat, data: data, comment: comment, successAction: successAction)
return PrepareLnUrlPayResponse(destination: destination, feesSat: feesSat, successAction: successAction)
}
static func dictionaryOf(prepareLnUrlPayResponse: PrepareLnUrlPayResponse) -> [String: Any?] {
return [
"destination": dictionaryOf(sendDestination: prepareLnUrlPayResponse.destination),
"feesSat": prepareLnUrlPayResponse.feesSat,
"data": dictionaryOf(lnUrlPayRequestData: prepareLnUrlPayResponse.data),
"comment": prepareLnUrlPayResponse.comment == nil ? nil : prepareLnUrlPayResponse.comment,
"successAction": prepareLnUrlPayResponse.successAction == nil ? nil : dictionaryOf(successAction: prepareLnUrlPayResponse.successAction!),
]
}
@@ -3764,16 +3772,11 @@ enum BreezSDKLiquidMapper {
let _paymentHash = paymentDetails["paymentHash"] as? String
var _lnurlInfo: LnUrlInfo?
if let lnurlInfoTmp = paymentDetails["lnurlInfo"] as? [String: Any?] {
_lnurlInfo = try asLnUrlInfo(lnUrlInfo: lnurlInfoTmp)
}
let _refundTxId = paymentDetails["refundTxId"] as? String
let _refundTxAmountSat = paymentDetails["refundTxAmountSat"] as? UInt64
return PaymentDetails.lightning(swapId: _swapId, description: _description, preimage: _preimage, bolt11: _bolt11, bolt12Offer: _bolt12Offer, paymentHash: _paymentHash, lnurlInfo: _lnurlInfo, refundTxId: _refundTxId, refundTxAmountSat: _refundTxAmountSat)
return PaymentDetails.lightning(swapId: _swapId, description: _description, preimage: _preimage, bolt11: _bolt11, bolt12Offer: _bolt12Offer, paymentHash: _paymentHash, refundTxId: _refundTxId, refundTxAmountSat: _refundTxAmountSat)
}
if type == "liquid" {
guard let _destination = paymentDetails["destination"] as? String else {
@@ -3804,7 +3807,7 @@ enum BreezSDKLiquidMapper {
static func dictionaryOf(paymentDetails: PaymentDetails) -> [String: Any?] {
switch paymentDetails {
case let .lightning(
swapId, description, preimage, bolt11, bolt12Offer, paymentHash, lnurlInfo, refundTxId, refundTxAmountSat
swapId, description, preimage, bolt11, bolt12Offer, paymentHash, refundTxId, refundTxAmountSat
):
return [
"type": "lightning",
@@ -3814,7 +3817,6 @@ enum BreezSDKLiquidMapper {
"bolt11": bolt11 == nil ? nil : bolt11,
"bolt12Offer": bolt12Offer == nil ? nil : bolt12Offer,
"paymentHash": paymentHash == nil ? nil : paymentHash,
"lnurlInfo": lnurlInfo == nil ? nil : dictionaryOf(lnUrlInfo: lnurlInfo!),
"refundTxId": refundTxId == nil ? nil : refundTxId,
"refundTxAmountSat": refundTxAmountSat == nil ? nil : refundTxAmountSat,
]
@@ -3926,6 +3928,9 @@ enum BreezSDKLiquidMapper {
case "refundPending":
return PaymentState.refundPending
case "waitingFeeAcceptance":
return PaymentState.waitingFeeAcceptance
default: throw SdkError.Generic(message: "Invalid variant \(paymentState) for enum PaymentState")
}
}
@@ -3952,6 +3957,9 @@ enum BreezSDKLiquidMapper {
case .refundPending:
return "refundPending"
case .waitingFeeAcceptance:
return "waitingFeeAcceptance"
}
}
@@ -4061,6 +4069,14 @@ enum BreezSDKLiquidMapper {
return SdkEvent.paymentWaitingConfirmation(details: _details)
}
if type == "paymentWaitingFeeAcceptance" {
guard let detailsTmp = sdkEvent["details"] as? [String: Any?] else {
throw SdkError.Generic(message: errMissingMandatoryField(fieldName: "details", typeName: "SdkEvent"))
}
let _details = try asPayment(payment: detailsTmp)
return SdkEvent.paymentWaitingFeeAcceptance(details: _details)
}
if type == "synced" {
return SdkEvent.synced
}
@@ -4118,6 +4134,14 @@ enum BreezSDKLiquidMapper {
"details": dictionaryOf(payment: details),
]
case let .paymentWaitingFeeAcceptance(
details
):
return [
"type": "paymentWaitingFeeAcceptance",
"details": dictionaryOf(payment: details),
]
case .synced:
return [
"type": "synced",

View File

@@ -131,6 +131,18 @@ RCT_EXTERN_METHOD(
reject: (RCTPromiseRejectBlock)reject
)
RCT_EXTERN_METHOD(
fetchPaymentProposedFees: (NSDictionary*)req
resolve: (RCTPromiseResolveBlock)resolve
reject: (RCTPromiseRejectBlock)reject
)
RCT_EXTERN_METHOD(
acceptPaymentProposedFees: (NSDictionary*)req
resolve: (RCTPromiseResolveBlock)resolve
reject: (RCTPromiseRejectBlock)reject
)
RCT_EXTERN_METHOD(
listRefundables: (RCTPromiseResolveBlock)resolve
reject: (RCTPromiseRejectBlock)reject

View File

@@ -321,6 +321,28 @@ class RNBreezSDKLiquid: RCTEventEmitter {
}
}
@objc(fetchPaymentProposedFees:resolve:reject:)
func fetchPaymentProposedFees(_ req: [String: Any], resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
do {
let fetchPaymentProposedFeesRequest = try BreezSDKLiquidMapper.asFetchPaymentProposedFeesRequest(fetchPaymentProposedFeesRequest: req)
var res = try getBindingLiquidSdk().fetchPaymentProposedFees(req: fetchPaymentProposedFeesRequest)
resolve(BreezSDKLiquidMapper.dictionaryOf(fetchPaymentProposedFeesResponse: res))
} catch let err {
rejectErr(err: err, reject: reject)
}
}
@objc(acceptPaymentProposedFees:resolve:reject:)
func acceptPaymentProposedFees(_ req: [String: Any], resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
do {
let acceptPaymentProposedFeesRequest = try BreezSDKLiquidMapper.asAcceptPaymentProposedFeesRequest(acceptPaymentProposedFeesRequest: req)
try getBindingLiquidSdk().acceptPaymentProposedFees(req: acceptPaymentProposedFeesRequest)
resolve(["status": "ok"])
} catch let err {
rejectErr(err: err, reject: reject)
}
}
@objc(listRefundables:reject:)
func listRefundables(_ resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
do {

View File

@@ -19,6 +19,10 @@ const BreezSDKLiquid = NativeModules.RNBreezSDKLiquid
const BreezSDKLiquidEmitter = new NativeEventEmitter(BreezSDKLiquid)
export interface AcceptPaymentProposedFeesRequest {
response: FetchPaymentProposedFeesResponse
}
export interface AesSuccessActionData {
description: string
ciphertext: string
@@ -71,6 +75,7 @@ export interface Config {
zeroConfMaxAmountSat?: number
useDefaultExternalInputParsers: boolean
externalInputParsers?: ExternalInputParser[]
onchainFeeRateLeewaySatPerVbyte?: number
}
export interface ConnectRequest {
@@ -98,6 +103,16 @@ export interface ExternalInputParser {
parserUrl: string
}
export interface FetchPaymentProposedFeesRequest {
swapId: string
}
export interface FetchPaymentProposedFeesResponse {
swapId: string
feesSat: number
payerAmountSat: number
}
export interface FiatCurrency {
id: string
info: CurrencyInfo
@@ -648,7 +663,8 @@ export enum PaymentState {
FAILED = "failed",
TIMED_OUT = "timedOut",
REFUNDABLE = "refundable",
REFUND_PENDING = "refundPending"
REFUND_PENDING = "refundPending",
WAITING_FEE_ACCEPTANCE = "waitingFeeAcceptance"
}
export enum PaymentType {
@@ -663,6 +679,7 @@ export enum SdkEventVariant {
PAYMENT_REFUND_PENDING = "paymentRefundPending",
PAYMENT_SUCCEEDED = "paymentSucceeded",
PAYMENT_WAITING_CONFIRMATION = "paymentWaitingConfirmation",
PAYMENT_WAITING_FEE_ACCEPTANCE = "paymentWaitingFeeAcceptance",
SYNCED = "synced"
}
@@ -684,6 +701,9 @@ export type SdkEvent = {
} | {
type: SdkEventVariant.PAYMENT_WAITING_CONFIRMATION,
details: Payment
} | {
type: SdkEventVariant.PAYMENT_WAITING_FEE_ACCEPTANCE,
details: Payment
} | {
type: SdkEventVariant.SYNCED
}
@@ -861,6 +881,15 @@ export const getPayment = async (req: GetPaymentRequest): Promise<Payment | null
return response
}
export const fetchPaymentProposedFees = async (req: FetchPaymentProposedFeesRequest): Promise<FetchPaymentProposedFeesResponse> => {
const response = await BreezSDKLiquid.fetchPaymentProposedFees(req)
return response
}
export const acceptPaymentProposedFees = async (req: AcceptPaymentProposedFeesRequest): Promise<void> => {
await BreezSDKLiquid.acceptPaymentProposedFees(req)
}
export const listRefundables = async (): Promise<RefundableSwap[]> => {
const response = await BreezSDKLiquid.listRefundables()
return response