|
|
|
|
@ -62,17 +62,17 @@ class MyPersister: Persist {
|
|
|
|
|
let idBytes: [UInt8] = id.to_channel_id()
|
|
|
|
|
let monitorBytes: [UInt8] = data.write()
|
|
|
|
|
sendEvent(eventName: MARKER_PERSIST, eventBody: ["id": bytesToHex(bytes: idBytes), "data": bytesToHex(bytes: monitorBytes)])
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// simplified result instantiation calls coming shortly!
|
|
|
|
|
return Result_NoneChannelMonitorUpdateErrZ.ok()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
override func update_persisted_channel(id: OutPoint, update: ChannelMonitorUpdate, data: ChannelMonitor) -> Result_NoneChannelMonitorUpdateErrZ {
|
|
|
|
|
print("ReactNativeLDK: update_persisted_channel")
|
|
|
|
|
let idBytes: [UInt8] = id.to_channel_id()
|
|
|
|
|
let monitorBytes: [UInt8] = data.write()
|
|
|
|
|
sendEvent(eventName: MARKER_PERSIST, eventBody: ["id": bytesToHex(bytes: idBytes), "data": bytesToHex(bytes: monitorBytes)])
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// simplified result instantiation calls coming shortly!
|
|
|
|
|
return Result_NoneChannelMonitorUpdateErrZ.ok()
|
|
|
|
|
}
|
|
|
|
|
@ -82,7 +82,7 @@ class MyChannelManagerPersister : ChannelManagerPersister, ExtendedChannelManage
|
|
|
|
|
func handle_event(event: Event) {
|
|
|
|
|
handleEvent(event: event)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
override func persist_manager(channel_manager: ChannelManager) -> Result_NoneErrorZ {
|
|
|
|
|
let channel_manager_bytes = channel_manager.write()
|
|
|
|
|
sendEvent(eventName: "persist_manager", eventBody: ["channel_manager_bytes": bytesToHex(bytes: channel_manager_bytes)])
|
|
|
|
|
@ -95,20 +95,20 @@ class MyFilter: Filter {
|
|
|
|
|
print("ReactNativeLDK: register_tx")
|
|
|
|
|
sendEvent(eventName: MARKER_REGISTER_TX, eventBody: ["txid": bytesToHex(bytes: txid ?? []), "script_pubkey": bytesToHex(bytes: script_pubkey)])
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
override func register_output(output: WatchedOutput) -> Option_C2Tuple_usizeTransactionZZ {
|
|
|
|
|
print("ReactNativeLDK: register_output")
|
|
|
|
|
let scriptPubkeyBytes = output.get_script_pubkey()
|
|
|
|
|
let outpoint = output.get_outpoint()!
|
|
|
|
|
let outputIndex = outpoint.get_index()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// watch for any transactions that spend this output on-chain
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let blockHashBytes = output.get_block_hash()
|
|
|
|
|
// if block hash bytes are not null, return any transaction spending the output that is found in the corresponding block along with its index
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
sendEvent(eventName: MARKER_REGISTER_OUTPUT, eventBody: ["block_hash": bytesToHex(bytes: blockHashBytes), "index": String(outputIndex), "script_pubkey": bytesToHex(bytes: scriptPubkeyBytes)])
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return Option_C2Tuple_usizeTransactionZZ.none()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
@ -124,16 +124,16 @@ let channel_manager_persister = MyChannelManagerPersister()
|
|
|
|
|
|
|
|
|
|
@objc(RnLdk)
|
|
|
|
|
class RnLdk: NSObject {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@objc static func requiresMainQueueSetup() -> Bool {
|
|
|
|
|
return false
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@objc
|
|
|
|
|
func start(_ entropyHex: String, blockchainTipHeight: NSNumber, blockchainTipHashHex: String, serializedChannelManagerHex: String, monitorHexes: String, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Bindings.setLogThreshold(severity: .DEBUG)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
chain_monitor = ChainMonitor.init(chain_source: Option_FilterZ(value: filter), broadcaster: broadcaster, logger: logger, feeest: feeEstimator, persister: persister)
|
|
|
|
|
guard let chainMonitor = chain_monitor else {
|
|
|
|
|
let error = NSError(domain: "start chainMonitor failed", code: 1, userInfo: nil)
|
|
|
|
|
@ -150,16 +150,16 @@ class RnLdk: NSObject {
|
|
|
|
|
_ = keysInterface.get_node_secret()
|
|
|
|
|
_ = keysInterface.get_secure_random_bytes()
|
|
|
|
|
let userConfig = UserConfig.init()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (!serializedChannelManagerHex.isEmpty) {
|
|
|
|
|
var serializedChannelMonitors: [[UInt8]] = []
|
|
|
|
|
let hexesArr = monitorHexes.split(separator: ",")
|
|
|
|
|
for hex in hexesArr {
|
|
|
|
|
serializedChannelMonitors.append(hexStringToByteArray(String(hex)))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let serialized_channel_manager: [UInt8] = hexStringToByteArray(serializedChannelManagerHex)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
do {
|
|
|
|
|
channel_manager_constructor = try ChannelManagerConstructor(channel_manager_serialized: serialized_channel_manager, channel_monitors_serialized: serializedChannelMonitors, keys_interface: keysInterface, fee_estimator: feeEstimator, chain_monitor: chainMonitor, filter: filter, router: nil, tx_broadcaster: broadcaster, logger: logger)
|
|
|
|
|
} catch {
|
|
|
|
|
@ -169,7 +169,7 @@ class RnLdk: NSObject {
|
|
|
|
|
} else {
|
|
|
|
|
channel_manager_constructor = ChannelManagerConstructor(network: LDKNetwork_Bitcoin, config: userConfig, current_blockchain_tip_hash: hexStringToByteArray(blockchainTipHashHex), current_blockchain_tip_height: UInt32(truncating: blockchainTipHeight), keys_interface: keysInterface, fee_estimator: feeEstimator, chain_monitor: chainMonitor, router: nil, tx_broadcaster: broadcaster, logger: logger)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
guard let channel_manager_constructor = channel_manager_constructor else {
|
|
|
|
|
let error = NSError(domain: "start channel_manager_constructor failed", code: 1, userInfo: nil)
|
|
|
|
|
reject("start", "channel_manager_constructor failed", error)
|
|
|
|
|
@ -178,37 +178,37 @@ class RnLdk: NSObject {
|
|
|
|
|
channel_manager = channel_manager_constructor.channelManager
|
|
|
|
|
channel_manager_constructor.chain_sync_completed(persister: channel_manager_persister)
|
|
|
|
|
peer_manager = channel_manager_constructor.peerManager
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// let ignorer = IgnoringMessageHandler()
|
|
|
|
|
// let messageHandler = MessageHandler(chan_handler_arg: channel_manager!.as_ChannelMessageHandler(), route_handler_arg: ignorer.as_RoutingMessageHandler())
|
|
|
|
|
// peer_manager = PeerManager(message_handler: messageHandler, our_node_secret: nodeSecret, ephemeral_random_data: secureRandomBytes, logger: logger)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
guard let peerManager = peer_manager else {
|
|
|
|
|
let error = NSError(domain: "peerManager failed", code: 1, userInfo: nil)
|
|
|
|
|
return reject("start", "peerManager failed", error)
|
|
|
|
|
}
|
|
|
|
|
peer_handler = TCPPeerHandler(peerManager: peerManager)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
resolve("hello ldk")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@objc
|
|
|
|
|
func getVersion(_ resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
|
|
|
|
|
resolve("\(Bindings.swift_ldk_c_bindings_get_compiled_version()), \(Bindings.swift_ldk_get_compiled_version())")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func getName() -> String {
|
|
|
|
|
return "RnLdk"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@objc
|
|
|
|
|
func getRelevantTxids(_ resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
|
|
|
|
|
guard let channel_manager = channel_manager, let chain_monitor = chain_monitor else {
|
|
|
|
|
let error = NSError(domain: "Channel manager", code: 1, userInfo: nil)
|
|
|
|
|
return reject("Channel manager", "getRelevantTxids: Not Initialized", error)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var first = true
|
|
|
|
|
var json: String = "["
|
|
|
|
|
for it in channel_manager.as_Confirm().get_relevant_txids() {
|
|
|
|
|
@ -216,7 +216,7 @@ class RnLdk: NSObject {
|
|
|
|
|
first = false
|
|
|
|
|
json += "\"" + bytesToHex32Reversed(bytes: it.data) + "\"" // reversed
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for it in chain_monitor.as_Confirm().get_relevant_txids() {
|
|
|
|
|
if (!first) { json += "," }
|
|
|
|
|
first = false
|
|
|
|
|
@ -225,7 +225,7 @@ class RnLdk: NSObject {
|
|
|
|
|
json += "]"
|
|
|
|
|
resolve(json)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@objc
|
|
|
|
|
func transactionUnconfirmed(_ txidHex: String, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
|
|
|
|
|
guard let channel_manager = channel_manager, let chain_monitor = chain_monitor else {
|
|
|
|
|
@ -236,36 +236,36 @@ class RnLdk: NSObject {
|
|
|
|
|
chain_monitor.as_Confirm().transaction_unconfirmed(txid: hexStringToByteArray(txidHex))
|
|
|
|
|
resolve(true)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@objc
|
|
|
|
|
func transactionConfirmed(_ headerHex: String, height: NSNumber, txPos: NSNumber, transactionHex: String, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
|
|
|
|
|
guard let channel_manager = channel_manager, let chain_monitor = chain_monitor else {
|
|
|
|
|
let error = NSError(domain: "Channel manager", code: 1, userInfo: nil)
|
|
|
|
|
return reject("Channel manager", "transactionConfirmed: Not Initialized", error)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let txData = C2Tuple_usizeTransactionZ.new(a: UInt(truncating: txPos), b: hexStringToByteArray(transactionHex))
|
|
|
|
|
let txarray = [txData]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
channel_manager.as_Confirm().transactions_confirmed(header: hexStringToByteArray(headerHex), txdata: txarray, height: UInt32(truncating: height))
|
|
|
|
|
chain_monitor.as_Confirm().transactions_confirmed(header: hexStringToByteArray(headerHex), txdata: txarray, height: UInt32(truncating: height))
|
|
|
|
|
resolve(true)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@objc
|
|
|
|
|
func updateBestBlock(_ headerHex: String, height: NSNumber, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
|
|
|
|
|
guard let channelManager = channel_manager else {
|
|
|
|
|
let error = NSError(domain: "Channel manager", code: 1, userInfo: nil)
|
|
|
|
|
return reject("updateBestBlock", "updateBestBlock: channelManager guard failed", error)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if headerHex.count == 0 {
|
|
|
|
|
let error = NSError(domain: "Channel manager", code: 1, userInfo: nil)
|
|
|
|
|
return reject("updateBestBlock", "updateBestBlock: headerHex is empty", error)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
channelManager.as_Confirm().best_block_updated(header: hexStringToByteArray(headerHex), height: UInt32(truncating: height))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
guard let chainMonitor = chain_monitor else {
|
|
|
|
|
let error = NSError(domain: "updateBestBlock", code: 1, userInfo: nil)
|
|
|
|
|
return reject("updateBestBlock", "updateBestBlock: chainMonitor guard failed", error)
|
|
|
|
|
@ -273,7 +273,7 @@ class RnLdk: NSObject {
|
|
|
|
|
chainMonitor.as_Confirm().best_block_updated(header: hexStringToByteArray(headerHex), height: UInt32(truncating: height))
|
|
|
|
|
resolve(true)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@objc
|
|
|
|
|
func connectPeer(_ pubkeyHex: String, hostname: String, port: NSNumber, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
|
|
|
|
|
print("ReactNativeLDK: connecting to peer " + pubkeyHex)
|
|
|
|
|
@ -287,8 +287,8 @@ class RnLdk: NSObject {
|
|
|
|
|
}
|
|
|
|
|
resolve(true)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@objc
|
|
|
|
|
func disconnectByNodeId(_ pubkeyHex: String, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
|
|
|
|
|
print("ReactNativeLDK: connecting to peer " + pubkeyHex)
|
|
|
|
|
@ -299,7 +299,7 @@ class RnLdk: NSObject {
|
|
|
|
|
peerManager.disconnect_by_node_id(node_id: hexStringToByteArray(pubkeyHex), no_connection_possible: false)
|
|
|
|
|
resolve(true)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@objc
|
|
|
|
|
func sendPayment(_ destPubkeyHex: String, paymentHashHex: String, paymentSecretHex: String, shortChannelId: String, paymentValueMsat: NSNumber, finalCltvValue: NSNumber, LdkRoutesJsonArrayString: String, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
|
|
|
|
|
print("ReactNativeLDK: destPubkeyHex " + destPubkeyHex)
|
|
|
|
|
@ -308,7 +308,7 @@ class RnLdk: NSObject {
|
|
|
|
|
print("ReactNativeLDK: shortChannelId " + shortChannelId)
|
|
|
|
|
print("ReactNativeLDK: paymentValueMsat " + paymentValueMsat.stringValue)
|
|
|
|
|
print("ReactNativeLDK: finalCltvValue " + finalCltvValue.stringValue)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
guard let short_channel_id_arg = UInt64(shortChannelId), let channel_manager = channel_manager else {
|
|
|
|
|
let error = NSError(domain: "sendPayment", code: 1, userInfo: nil)
|
|
|
|
|
return reject("sendPayment", "cOpaqueStruct failed", error)
|
|
|
|
|
@ -328,17 +328,17 @@ class RnLdk: NSObject {
|
|
|
|
|
if (!LdkRoutesJsonArrayString.isEmpty) {
|
|
|
|
|
// full route was provided
|
|
|
|
|
path.removeAll()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
do {
|
|
|
|
|
let data = Data(LdkRoutesJsonArrayString.utf8)
|
|
|
|
|
// make sure this JSON is in the format we expect
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if let json = try JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions()) as? [AnyObject] {
|
|
|
|
|
// try to read out an array
|
|
|
|
|
for hopJson in json {
|
|
|
|
|
print("hop:::: ")
|
|
|
|
|
// print(hopJson)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
print(hopJson["pubkey"] as? String ?? "No pubkey")
|
|
|
|
|
print(hopJson["short_channel_id"] as? String ?? "No short_channel_id")
|
|
|
|
|
print(hopJson["fee_msat"] as? NSNumber ?? "No fee_msat")
|
|
|
|
|
@ -346,28 +346,28 @@ class RnLdk: NSObject {
|
|
|
|
|
//
|
|
|
|
|
if let pubkey = hopJson["pubkey"] as? String, let short_channel_id_arg = hopJson["short_channel_id"] as? String, let shortChannelIdUInt64 = UInt64(short_channel_id_arg), let fee_msat_arg = hopJson["fee_msat"] as? NSNumber, let cltv_expiry_delta_arg = hopJson["cltv_expiry_delta"] as? NSNumber {
|
|
|
|
|
let routeHop = RouteHop(pubkey_arg: hexStringToByteArray(pubkey),
|
|
|
|
|
node_features_arg: NodeFeatures(),
|
|
|
|
|
short_channel_id_arg: shortChannelIdUInt64,
|
|
|
|
|
channel_features_arg: ChannelFeatures(),
|
|
|
|
|
fee_msat_arg: UInt64(truncating: fee_msat_arg),
|
|
|
|
|
cltv_expiry_delta_arg: UInt32(truncating: cltv_expiry_delta_arg)
|
|
|
|
|
node_features_arg: NodeFeatures(),
|
|
|
|
|
short_channel_id_arg: shortChannelIdUInt64,
|
|
|
|
|
channel_features_arg: ChannelFeatures(),
|
|
|
|
|
fee_msat_arg: UInt64(truncating: fee_msat_arg),
|
|
|
|
|
cltv_expiry_delta_arg: UInt32(truncating: cltv_expiry_delta_arg)
|
|
|
|
|
)
|
|
|
|
|
path.append(routeHop)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} catch let error as NSError {
|
|
|
|
|
reject("sendPayment", "Failed to load", error)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let route = Route(
|
|
|
|
|
paths_arg: [
|
|
|
|
|
path
|
|
|
|
|
]
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let payment_hash = hexStringToByteArray(paymentHashHex)
|
|
|
|
|
let payment_secret = hexStringToByteArray(paymentSecretHex)
|
|
|
|
|
let payment_res = channel_manager.send_payment(route: route, payment_hash: payment_hash, payment_secret: payment_secret)
|
|
|
|
|
@ -378,7 +378,7 @@ class RnLdk: NSObject {
|
|
|
|
|
reject("sendPayment", "Failed", error)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@objc
|
|
|
|
|
func addInvoice(_ amtMsat: NSNumber, description: String, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
|
|
|
|
|
guard let channel_manager = channel_manager, let keys_manager = keys_manager else {
|
|
|
|
|
@ -386,7 +386,7 @@ class RnLdk: NSObject {
|
|
|
|
|
return reject("addInvoice", "No channel_manager initialized", error)
|
|
|
|
|
}
|
|
|
|
|
let invoiceResult = Bindings.createInvoiceFromChannelManager(channelManager: channel_manager, keysManager: keys_manager.as_KeysInterface(), network: LDKCurrency_Bitcoin, amountMsat: UInt64(truncating: amtMsat), description: description)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if let invoice = invoiceResult.getValue() {
|
|
|
|
|
resolve(invoice.to_str())
|
|
|
|
|
} else {
|
|
|
|
|
@ -394,17 +394,17 @@ class RnLdk: NSObject {
|
|
|
|
|
reject("addInvoice", "Failed", error)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@objc
|
|
|
|
|
func listPeers(_ resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
|
|
|
|
|
guard let peer_manager = peer_manager else {
|
|
|
|
|
let error = NSError(domain: "listPeers", code: 1, userInfo: nil)
|
|
|
|
|
return reject("lostPeers", "No peer manager initialized", error)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let peer_node_ids = peer_manager.get_peer_node_ids()
|
|
|
|
|
print(peer_node_ids)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var json = "["
|
|
|
|
|
var first = true
|
|
|
|
|
for it in peer_node_ids {
|
|
|
|
|
@ -415,9 +415,9 @@ class RnLdk: NSObject {
|
|
|
|
|
json += "]"
|
|
|
|
|
resolve(json)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@objc
|
|
|
|
|
func getNodeId(_ resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
|
|
|
|
|
if let nodeId = channel_manager?.get_our_node_id() {
|
|
|
|
|
@ -427,7 +427,7 @@ class RnLdk: NSObject {
|
|
|
|
|
reject("getNodeId", "Exception", error)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@objc
|
|
|
|
|
func closeChannelCooperatively(_ channelIdHex: String, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
|
|
|
|
|
guard let close_result = channel_manager?.close_channel(channel_id: hexStringToByteArray(channelIdHex)), close_result.isOk() else {
|
|
|
|
|
@ -436,7 +436,7 @@ class RnLdk: NSObject {
|
|
|
|
|
}
|
|
|
|
|
resolve(true)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@objc
|
|
|
|
|
func closeChannelForce(_ channelIdHex: String, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
|
|
|
|
|
guard let close_result = channel_manager?.force_close_channel(channel_id: hexStringToByteArray(channelIdHex)) else {
|
|
|
|
|
@ -450,7 +450,7 @@ class RnLdk: NSObject {
|
|
|
|
|
reject("closeChannelForce", "Failed", error)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@objc
|
|
|
|
|
func openChannelStep1(_ pubkey: String, channelValue: NSNumber, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
|
|
|
|
|
temporary_channel_id = nil
|
|
|
|
|
@ -478,14 +478,14 @@ class RnLdk: NSObject {
|
|
|
|
|
reject("openChannelStep1", "Failed", error)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@objc
|
|
|
|
|
func openChannelStep2(_ txhex: String, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
|
|
|
|
|
guard let temporary_channel_id = temporary_channel_id else {
|
|
|
|
|
let error = NSError(domain: "openChannelStep2", code: 1, userInfo: nil)
|
|
|
|
|
return reject("openChannelStep2", "Not initialized", error)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
guard let funding_res = channel_manager?.funding_transaction_generated(temporary_channel_id: temporary_channel_id, funding_transaction: hexStringToByteArray(txhex)) else {
|
|
|
|
|
print("ReactNativeLDK: funding_res = false")
|
|
|
|
|
let error = NSError(domain: "openChannelStep2", code: 1, userInfo: nil)
|
|
|
|
|
@ -501,66 +501,66 @@ class RnLdk: NSObject {
|
|
|
|
|
reject("openChannelStep2", "Failed", error)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// At this point LDK will exchange the remaining channel open messages with
|
|
|
|
|
// the counterparty and, when appropriate, broadcast the funding transaction
|
|
|
|
|
// provided.
|
|
|
|
|
// Once it confirms, the channel will be open and available for use (indicated
|
|
|
|
|
// by its presence in `channel_manager.list_usable_channels()`).
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
resolve(true)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@objc
|
|
|
|
|
func listUsableChannels(_ resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
|
|
|
|
|
guard let channel_manager = channel_manager else {
|
|
|
|
|
let error = NSError(domain: "listUsableChannels", code: 1, userInfo: nil)
|
|
|
|
|
return reject("listUsableChannels", "Channel manager not initialized", error)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let channels = channel_manager.list_usable_channels().isEmpty ? [] : channel_manager.list_usable_channels()
|
|
|
|
|
var jsonArray = "["
|
|
|
|
|
var first = true
|
|
|
|
|
channels.map { (it: ChannelDetails) in
|
|
|
|
|
let channelObject = self.channel2ChannelObject(it: it)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (!first) { jsonArray += "," }
|
|
|
|
|
jsonArray += channelObject
|
|
|
|
|
first = false
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
jsonArray += "]"
|
|
|
|
|
resolve(jsonArray)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@objc
|
|
|
|
|
func listChannels(_ resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
|
|
|
|
|
guard let channel_manager = channel_manager else {
|
|
|
|
|
let error = NSError(domain: "listChannels", code: 1, userInfo: nil)
|
|
|
|
|
return reject("listChannels", "Channel Manager not initialized", error)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let channels = channel_manager.list_channels().isEmpty ? [] : channel_manager.list_channels()
|
|
|
|
|
var jsonArray = "["
|
|
|
|
|
var first = true
|
|
|
|
|
channels.map { (it: ChannelDetails) in
|
|
|
|
|
let channelObject = self.channel2ChannelObject(it: it)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (!first) { jsonArray += "," }
|
|
|
|
|
jsonArray += channelObject
|
|
|
|
|
first = false
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
jsonArray += "]"
|
|
|
|
|
resolve(jsonArray)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func channel2ChannelObject(it: ChannelDetails) -> String {
|
|
|
|
|
let short_channel_id = it.get_short_channel_id().getValue() ?? 0
|
|
|
|
|
let confirmations_required = it.get_confirmations_required().getValue() ?? 0;
|
|
|
|
|
let force_close_spend_delay = it.get_force_close_spend_delay().getValue() ?? 0;
|
|
|
|
|
let unspendable_punishment_reserve = it.get_unspendable_punishment_reserve().getValue() ?? 0;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var channelObject = "{"
|
|
|
|
|
channelObject += "\"channel_id\":" + "\"" + bytesToHex(bytes: it.get_channel_id()) + "\","
|
|
|
|
|
channelObject += "\"channel_value_satoshis\":" + String(it.get_channel_value_satoshis()) + ","
|
|
|
|
|
@ -572,7 +572,7 @@ class RnLdk: NSObject {
|
|
|
|
|
channelObject += "\"is_outbound\":" + (it.get_is_outbound() ? "true" : "false") + ","
|
|
|
|
|
channelObject += "\"is_public\":" + (it.get_is_public() ? "true" : "false") + ","
|
|
|
|
|
channelObject += "\"remote_node_id\":" + "\"" + bytesToHex(bytes: it.get_counterparty().get_node_id()) + "\"," // @deprecated fixme
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// fixme:
|
|
|
|
|
if let funding_txo = it.get_funding_txo() {
|
|
|
|
|
channelObject += "\"funding_txo_txid\":" + "\"" + bytesToHex(bytes: funding_txo.get_txid()) + "\","
|
|
|
|
|
@ -581,7 +581,7 @@ class RnLdk: NSObject {
|
|
|
|
|
channelObject += "\"funding_txo_txid\": null,"
|
|
|
|
|
channelObject += "\"funding_txo_index\": null,"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
channelObject += "\"counterparty_unspendable_punishment_reserve\":" + String(it.get_counterparty().get_unspendable_punishment_reserve()) + ","
|
|
|
|
|
channelObject += "\"counterparty_node_id\":" + "\"" + bytesToHex(bytes: it.get_counterparty().get_node_id()) + "\","
|
|
|
|
|
channelObject += "\"unspendable_punishment_reserve\":" + String(unspendable_punishment_reserve) + ","
|
|
|
|
|
@ -589,16 +589,16 @@ class RnLdk: NSObject {
|
|
|
|
|
channelObject += "\"force_close_spend_delay\":" + String(force_close_spend_delay) + ","
|
|
|
|
|
channelObject += "\"user_id\":" + String(it.get_user_channel_id())
|
|
|
|
|
channelObject += "}"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return channelObject
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@objc
|
|
|
|
|
func setRefundAddressScript(_ refundAddressScriptHex: String, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
|
|
|
|
|
refund_address_script = refundAddressScriptHex
|
|
|
|
|
resolve(true)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@objc
|
|
|
|
|
func setFeerate(_ newFeerateFast: NSNumber, newFeerateMedium: NSNumber, newFeerateSlow: NSNumber, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
|
|
|
|
|
if (Int(truncating: newFeerateFast) < 300) {
|
|
|
|
|
@ -618,18 +618,18 @@ class RnLdk: NSObject {
|
|
|
|
|
feerate_slow = Int(truncating: newFeerateSlow)
|
|
|
|
|
resolve(true)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@objc
|
|
|
|
|
func fireAnEvent(_ resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
|
|
|
|
|
sendEvent(eventName: MARKER_LOG, eventBody: ["line": "test"])
|
|
|
|
|
resolve(true)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@objc
|
|
|
|
|
func stop(_ resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
|
|
|
|
|
channel_manager_constructor?.interrupt(tcpPeerHandler: peer_handler)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
channel_manager = nil
|
|
|
|
|
peer_manager = nil
|
|
|
|
|
keys_manager = nil
|
|
|
|
|
@ -637,42 +637,82 @@ class RnLdk: NSObject {
|
|
|
|
|
peer_handler = nil
|
|
|
|
|
chain_monitor = nil
|
|
|
|
|
channel_manager_constructor = nil
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
resolve(true)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@objc
|
|
|
|
|
func getMaturingHeight(_ resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
|
|
|
|
|
guard let channel_manager = channel_manager, let chain_monitor = chain_monitor else {
|
|
|
|
|
let error = NSError(domain: "getMaturingHeight", code: 1, userInfo: nil)
|
|
|
|
|
return reject("channel_manager", "Guard failed", error)
|
|
|
|
|
}
|
|
|
|
|
var maxHeight: UInt32 = 0
|
|
|
|
|
let balances = chain_monitor.get_claimable_balances(ignored_channels:channel_manager.list_channels())
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for balance in balances {
|
|
|
|
|
if let claimableAwaitingConfirmations = balance.getValueAsClaimableAwaitingConfirmations() {
|
|
|
|
|
print("ReactNativeLDK: ClaimableAwaitingConfirmations = \(claimableAwaitingConfirmations.getClaimable_amount_satoshis()) \(claimableAwaitingConfirmations.getConfirmation_height())")
|
|
|
|
|
if claimableAwaitingConfirmations.getConfirmation_height() > maxHeight {
|
|
|
|
|
maxHeight = claimableAwaitingConfirmations.getConfirmation_height()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if let claimableOnChannelClose = balance.getValueAsClaimableOnChannelClose() {
|
|
|
|
|
print("ReactNativeLDK: ClaimableOnChannelClose = \(claimableOnChannelClose.getClaimable_amount_satoshis())");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if let contentiousClaimable = balance.getValueAsContentiousClaimable() {
|
|
|
|
|
print("ReactNativeLDK: ContentiousClaimable = \(contentiousClaimable.getClaimable_amount_satoshis()) \(contentiousClaimable.getTimeout_height())");
|
|
|
|
|
if contentiousClaimable.getTimeout_height() > maxHeight {
|
|
|
|
|
maxHeight = contentiousClaimable.getTimeout_height()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if let maybeClaimableHTLCAwaitingTimeout = balance.getValueAsMaybeClaimableHTLCAwaitingTimeout() {
|
|
|
|
|
print("ReactNativeLDK: MaybeClaimableHTLCAwaitingTimeout = \(maybeClaimableHTLCAwaitingTimeout.getClaimable_amount_satoshis()) \(maybeClaimableHTLCAwaitingTimeout.getClaimable_height())")
|
|
|
|
|
if maybeClaimableHTLCAwaitingTimeout.getClaimable_height() > maxHeight {
|
|
|
|
|
maxHeight = maybeClaimableHTLCAwaitingTimeout.getClaimable_height()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
resolve(maxHeight);
|
|
|
|
|
}}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@objc
|
|
|
|
|
func getMaturingBalance(_ resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
|
|
|
|
|
guard let chain_monitor = chain_monitor, let channel_manager = channel_manager else {
|
|
|
|
|
let error = NSError(domain: "getMaturingBalance", code: 1, userInfo: nil)
|
|
|
|
|
return reject("getMaturingBalance", "No chain monitor/channel manager found", error)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var totalSat: Int = 0
|
|
|
|
|
let balances = chain_monitor.get_claimable_balances(ignored_channels: channel_manager.list_channels())
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for balance in balances {
|
|
|
|
|
if let awaitingConfirmations = balance.getValueAsClaimableAwaitingConfirmations() {
|
|
|
|
|
print("ReactNativeLDK: ClaimableAwaitingConfirmations = \(awaitingConfirmations.getClaimable_amount_satoshis())")
|
|
|
|
|
totalSat = totalSat + NSNumber(value:awaitingConfirmations.getClaimable_amount_satoshis()).intValue
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if let onChannelClose = balance.getValueAsClaimableOnChannelClose() {
|
|
|
|
|
print("ReactNativeLDK: ClaimableOnChannelClose = \(onChannelClose.getClaimable_amount_satoshis())")
|
|
|
|
|
totalSat = totalSat + NSNumber(value:onChannelClose.getClaimable_amount_satoshis()).intValue
|
|
|
|
|
print("ReactNativeLDK: ClaimableOnChannelClose = \(onChannelClose.getClaimable_amount_satoshis())")
|
|
|
|
|
totalSat = totalSat + NSNumber(value:onChannelClose.getClaimable_amount_satoshis()).intValue
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if let contentiousClaimable = balance.getValueAsContentiousClaimable() {
|
|
|
|
|
print("ReactNativeLDK: ContentiousClaimable = \(contentiousClaimable.getClaimable_amount_satoshis())")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if let maybeClaimableHTLCAwaitingTimeout = balance.getValueAsMaybeClaimableHTLCAwaitingTimeout() {
|
|
|
|
|
print("ReactNativeLDK: MaybeClaimableHTLCAwaitingTimeout = \(maybeClaimableHTLCAwaitingTimeout.getClaimable_amount_satoshis())")
|
|
|
|
|
print("ReactNativeLDK: MaybeClaimableHTLCAwaitingTimeout = \(maybeClaimableHTLCAwaitingTimeout.getClaimable_amount_satoshis())")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
resolve(totalSat)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
@ -685,43 +725,43 @@ func handleEvent(event: Event) {
|
|
|
|
|
guard let result = keys_manager?.spend_spendable_outputs(descriptors: outputs, outputs: [], change_destination_script: destinationScript, feerate_sat_per_1000_weight: UInt32(feerate_fast)) else {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if let transaction = result.getValue() {
|
|
|
|
|
sendEvent(eventName: MARKER_BROADCAST, eventBody: ["txhex": bytesToHex(bytes: transaction)])
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if let paymentSentEvent = event.getValueAsPaymentSent() {
|
|
|
|
|
print("ReactNativeLDK: payment sent")
|
|
|
|
|
sendEvent(eventName: MARKER_PAYMENT_SENT, eventBody: ["payment_preimage": bytesToHex(bytes: paymentSentEvent.getPayment_preimage())])
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if let paymentFailedEvent = event.getValueAsPaymentPathFailed() {
|
|
|
|
|
print("ReactNativeLDK: payment path failed")
|
|
|
|
|
sendEvent(eventName: MARKER_PAYMENT_FAILED, eventBody: ["payment_hash": bytesToHex(bytes: paymentFailedEvent.getPayment_hash()), "rejected_by_dest": paymentFailedEvent.getRejected_by_dest() ? "true" : "false"])
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if let _ = event.getValueAsPendingHTLCsForwardable() {
|
|
|
|
|
print("ReactNativeLDK: forward HTLC")
|
|
|
|
|
channel_manager?.process_pending_htlc_forwards()
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if let paymentReceivedEvent = event.getValueAsPaymentReceived() {
|
|
|
|
|
print("ReactNativeLDK: payment received")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if paymentReceivedEvent.getPurpose().getValueType()! == .InvoicePayment {
|
|
|
|
|
let paymentPreimage = paymentReceivedEvent.getPurpose().getValueAsInvoicePayment()?.getPayment_preimage()
|
|
|
|
|
let paymentSecret = paymentReceivedEvent.getPurpose().getValueAsInvoicePayment()?.getPayment_secret()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (paymentPreimage == nil) { return }
|
|
|
|
|
if (paymentSecret == nil) { return }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let _ = channel_manager?.claim_funds(payment_preimage: paymentPreimage!)
|
|
|
|
|
sendEvent(eventName: MARKER_PAYMENT_RECEIVED, eventBody: [
|
|
|
|
|
"payment_hash": bytesToHex(bytes: paymentReceivedEvent.getPayment_hash()),
|
|
|
|
|
@ -731,12 +771,12 @@ func handleEvent(event: Event) {
|
|
|
|
|
])
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if paymentReceivedEvent.getPurpose().getValueType()! == .SpontaneousPayment {
|
|
|
|
|
let paymentPreimage = paymentReceivedEvent.getPurpose().getValueAsSpontaneousPayment()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (paymentPreimage == nil) { return }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let _ = channel_manager?.claim_funds(payment_preimage: paymentPreimage!)
|
|
|
|
|
sendEvent(eventName: MARKER_PAYMENT_RECEIVED, eventBody: [
|
|
|
|
|
"payment_hash": bytesToHex(bytes: paymentReceivedEvent.getPayment_hash()),
|
|
|
|
|
@ -746,9 +786,9 @@ func handleEvent(event: Event) {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if let fundingGenerationReadyEvent = event.getValueAsFundingGenerationReady() {
|
|
|
|
|
print("ReactNativeLDK: funding generation ready")
|
|
|
|
|
let funding_spk = fundingGenerationReadyEvent.getOutput_script()
|
|
|
|
|
@ -765,11 +805,11 @@ func handleEvent(event: Event) {
|
|
|
|
|
}
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if event.getValueAsPaymentForwarded() != nil {
|
|
|
|
|
// todo. one day, when ldk is a full routing node...
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if let channelClosed = event.getValueAsChannelClosed() {
|
|
|
|
|
print("ReactNativeLDK ChannelClosed")
|
|
|
|
|
let reason = channelClosed.getReason()
|
|
|
|
|
@ -779,33 +819,33 @@ func handleEvent(event: Event) {
|
|
|
|
|
if reason == ClosureReason.commitment_tx_confirmed() {
|
|
|
|
|
params["reason"] = "CommitmentTxConfirmed"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if reason == ClosureReason.cooperative_closure() {
|
|
|
|
|
params["reason"] = "CooperativeClosure"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if let getValueAsCounterpartyForceClosed = reason.getValueAsCounterpartyForceClosed() {
|
|
|
|
|
params["reason"] = "CounterpartyForceClosed"
|
|
|
|
|
params["text"] = getValueAsCounterpartyForceClosed.getPeer_msg()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if reason == ClosureReason.disconnected_peer() {
|
|
|
|
|
params["reason"] = "DisconnectedPeer"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if reason == ClosureReason.holder_force_closed() {
|
|
|
|
|
params["reason"] = "HolderForceClosed"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if reason == ClosureReason.outdated_channel_manager() {
|
|
|
|
|
params["reason"] = "OutdatedChannelManager"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if let getValueAsProcessingError = reason.getValueAsProcessingError() {
|
|
|
|
|
params["reason"] = "ProcessingError"
|
|
|
|
|
params["text"] = getValueAsProcessingError.getErr()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
sendEvent(eventName: MARKER_CHANNEL_CLOSED, eventBody: params)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
@ -888,6 +928,6 @@ func bytesToHex32Reversed(bytes: (UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt
|
|
|
|
|
bytesArray.append(bytes.29)
|
|
|
|
|
bytesArray.append(bytes.30)
|
|
|
|
|
bytesArray.append(bytes.31)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return bytesToHex(bytes: bytesArray.reversed())
|
|
|
|
|
}
|
|
|
|
|
|