-
Notifications
You must be signed in to change notification settings - Fork 9
/
AccessImpl.kt
129 lines (112 loc) · 4.6 KB
/
AccessImpl.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
package com.example.umlandowallet.data.remote
import com.example.umlandowallet.ChannelManagerEventHandler
import com.example.umlandowallet.Global
import com.example.umlandowallet.data.*
import com.example.umlandowallet.toByteArray
import com.example.umlandowallet.toHex
import org.bitcoindevkit.Blockchain
import org.ldk.structs.ChainMonitor
import org.ldk.structs.ChannelManager
import org.ldk.structs.TwoTuple_usizeTransactionZ
class AccessImpl(
) : Access {
override suspend fun sync() {
this.syncWallet(OnchainWallet)
val relevantTxIdsFromChannelManager: Array<ByteArray> =
Global.channelManager!!.as_Confirm()._relevant_txids
val relevantTxIdsFromChainMonitor: Array<ByteArray> =
Global.chainMonitor!!.as_Confirm()._relevant_txids
val relevantTxIds: Array<ByteArray> =
relevantTxIdsFromChannelManager + relevantTxIdsFromChainMonitor
this.syncTransactionConfirmed(relevantTxIds, Global.channelManager!!, Global.chainMonitor!!)
this.syncTransactionsUnconfirmed(
relevantTxIds,
Global.channelManager!!,
Global.chainMonitor!!
)
this.syncBestBlockConnected(Global.channelManager!!, Global.chainMonitor!!)
Global.channelManagerConstructor!!.chain_sync_completed(
ChannelManagerEventHandler, Global.scorer!!
)
}
override suspend fun syncWallet(onchainWallet: OnchainWallet) {
onchainWallet.sync()
}
override suspend fun syncBestBlockConnected(
channelManager: ChannelManager,
chainMonitor: ChainMonitor
) {
val service = Service.create()
val height = service.getLatestBlockHeight()
val hash = service.getLatestBlockHash()
val header = service.getHeader(hash)
channelManager.as_Confirm().best_block_updated(header.toByteArray(), height)
chainMonitor.as_Confirm().best_block_updated(header.toByteArray(), height)
}
override suspend fun syncTransactionConfirmed(
relevantTxIds: Array<ByteArray>,
channelManager: ChannelManager,
chainMonitor: ChainMonitor
) {
val service = Service.create()
val confirmedTxs = mutableListOf<ConfirmedTx>()
for (txid in relevantTxIds) {
val txId = txid.reversedArray().toHex()
val txStatus: TxStatus = service.getTxStatus(txId)
if (txStatus.confirmed) {
val txHex = service.getTxHex(txId)
val tx = service.getTx(txId)
val blockHeader = service.getHeader(tx.status.block_hash)
val merkleProof = service.getMerkleProof(txId)
if (tx.status.block_height == merkleProof.block_height) {
confirmedTxs.add(
ConfirmedTx(
tx = txHex.toByteArray(),
block_height = tx.status.block_height,
block_header = blockHeader,
merkle_proof_pos = merkleProof.pos
)
)
}
}
}
confirmedTxs.sortWith(compareBy<ConfirmedTx> { it.block_height }.thenBy { it.merkle_proof_pos })
for (cTx in confirmedTxs) {
channelManager.as_Confirm().transactions_confirmed(
cTx.block_header.toByteArray(),
arrayOf<TwoTuple_usizeTransactionZ>(
TwoTuple_usizeTransactionZ.of(
cTx.block_height.toLong(),
cTx.tx
)
),
cTx.block_height
)
chainMonitor.as_Confirm().transactions_confirmed(
cTx.block_header.toByteArray(),
arrayOf<TwoTuple_usizeTransactionZ>(
TwoTuple_usizeTransactionZ.of(
cTx.block_height.toLong(),
cTx.tx
)
),
cTx.block_height
)
}
}
override suspend fun syncTransactionsUnconfirmed(
relevantTxIds: Array<ByteArray>,
channelManager: ChannelManager,
chainMonitor: ChainMonitor
) {
val service = Service.create()
for (txid in relevantTxIds) {
val txId = txid.reversedArray().toHex()
val txStatus: TxStatus = service.getTxStatus(txId)
if (!txStatus.confirmed) {
channelManager.as_Confirm().transaction_unconfirmed(txId.toByteArray())
chainMonitor.as_Confirm().transaction_unconfirmed(txId.toByteArray())
}
}
}
}