react-native-zcash 0.9.9 → 0.9.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -0
- package/android/src/main/assets/co.electriccoin.zcash/checkpoint/mainnet/3020000.json +8 -0
- package/android/src/main/java/app/edge/rnzcash/RNZcashModule.kt +130 -126
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/3020000.json +8 -0
- package/ios/libzcashlc.xcframework/Info.plist +5 -5
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
{
|
|
2
|
+
"network": "main",
|
|
3
|
+
"height": "3020000",
|
|
4
|
+
"hash": "000000000037c640e2f5b446baea21d482741d8188c485be4de4b172f3cb77c1",
|
|
5
|
+
"time": 1754490535,
|
|
6
|
+
"saplingTree": "01cbd7cbe98c0e563421e96128f691cb4d6880fe06520afcdaf543fe04d83ea233015ac0609529bd81bab7273dbf2554b7a263dc39a5f8e482bfdb48ff72ad474c1d1f000184e8f5016442ebd92a619aaafb61531b4eaae8ac43fac2a3d6fc8d32ea684e20000001fd2f218bac5268e20b12e317676bea951d98c1c617ffb2fcff5d25b374b4a7540169eeef5960d7caf9428223c31e868e1a3987b4dbf39a018fd070851f38e47c6a0000012dffe7e51571d1b384afb3bbcb032259b323e0e84250c4fd25e0146692e46f6600011be7ad49955589016a54e73247f31222010b0bb411c96c5e76d31ce092957d2a0001bbc535c7b4ed77ea8e03b934e58822617cfc2513d04625646f1a1eb0f3c0aa2801dfe644736b1489455cf10c8f7915c9fc9aca07091239d50571ff21c6b907986b01060af6a6c1415a6eaf780073ffa3d0ab35af7bb391bccc4e6ea65a1230dad83001ab58f1ebb2860e257c50350a3e1b54778b7729bdd11eacaa9213c4b5f4dbb44c00017d1ce2f0839bdbf1bad7ae37f845e7fe2116e0c1197536bfbad549f3876c3c590000013e2598f743726006b8de42476ed56a55a75629a7b82e430c4e7c101a69e9b02a011619f99023a69bb647eab2d2aa1a73c3673c74bb033c3c4930eacda19e6fd93b0000000160272b134ca494b602137d89e528c751c06d3ef4a87a45f33af343c15060cc1e0000000000",
|
|
7
|
+
"orchardTree": "016977c99948d91a13c7c94d3a9e91666295f1d9ae35e858e23048cb6f01590c2a012c426e689984059d9528c9d2db9b015c904d8221adfc5417ce2b9022c8ea15051f01ad93f51f05e75ab786825638b4763d797d74b60c440d98285099142a733d392401562fe3b688cc0160a80c1227080b22d8713ad1f79c5d6eeb0b0731e77c1dca120001ba474db97689fbd81edf3081b36cc4d0f06e49e248f766a8a675e5ca82bd893a016276f00b93030a12bd87d0a0e137334e1458ef02004c7b232eae5c046b6b1d3e01a1f3574445e06c528d3f893301c093b0f58e735b041e595f08938342751e150101dbb01b83be7808423222c9f0a1fdf7212ab21ee700e02d77337c36653180510d000115aa047a01e96d303bef41901a62932451dd250beeb8f777632f1e17b1caac1700013f1050c048a796abfd1ed6def0a481d5274a30b8bf491ab9c668d7e82d70671b00000000000152dad142de8d870d83b688618b7660e049741aa143a78440c722296a17ca550a012d113bc8f6a4f41b3963cfa0717176c2d31ce7bfae4d250a1fff5e061dd9d3250160040850b766b126a2b4843fcdfdffa5d5cab3f53bc860a3bef68958b5f066170001cc2dcaa338b312112db04b435a706d63244dd435238f0aa1e9e1598d35470810012dcc4273c8a0ed2337ecf7879380a07e7d427c7f9d82e538002bd1442978402c01daf63debf5b40df902dae98dadc029f281474d190cddecef1b10653248a234150001e2bca6a8d987d668defba89dc082196a922634ed88e065c669e526bb8815ee1b000000000000"
|
|
8
|
+
}
|
|
@@ -22,8 +22,9 @@ import kotlinx.coroutines.flow.*
|
|
|
22
22
|
import kotlinx.coroutines.launch
|
|
23
23
|
import java.util.Base64
|
|
24
24
|
|
|
25
|
-
class RNZcashModule(
|
|
26
|
-
|
|
25
|
+
class RNZcashModule(
|
|
26
|
+
private val reactContext: ReactApplicationContext,
|
|
27
|
+
) : ReactContextBaseJavaModule(reactContext) {
|
|
27
28
|
/**
|
|
28
29
|
* Scope for anything that out-lives the synchronizer, meaning anything that can be used before
|
|
29
30
|
* the synchronizer starts or after it stops. Everything else falls within the scope of the
|
|
@@ -46,135 +47,139 @@ class RNZcashModule(private val reactContext: ReactApplicationContext) :
|
|
|
46
47
|
defaultPort: Int = 9067,
|
|
47
48
|
newWallet: Boolean,
|
|
48
49
|
promise: Promise,
|
|
49
|
-
)
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
synchronizerMap
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
val wallet = getWallet(alias)
|
|
68
|
-
val scope = wallet.coroutineScope
|
|
69
|
-
combine(wallet.progress, wallet.networkHeight) { progress, networkHeight ->
|
|
70
|
-
return@combine mapOf("progress" to progress, "networkHeight" to networkHeight)
|
|
71
|
-
}.collectWith(scope) { map ->
|
|
72
|
-
val progress = map["progress"] as PercentDecimal
|
|
73
|
-
var networkBlockHeight = map["networkHeight"] as BlockHeight?
|
|
74
|
-
if (networkBlockHeight == null) networkBlockHeight = BlockHeight.new(birthdayHeight.toLong())
|
|
75
|
-
|
|
76
|
-
sendEvent("UpdateEvent") { args ->
|
|
77
|
-
args.putString("alias", alias)
|
|
78
|
-
args.putInt(
|
|
79
|
-
"scanProgress",
|
|
80
|
-
progress.toPercentage(),
|
|
81
|
-
)
|
|
82
|
-
args.putInt("networkBlockHeight", networkBlockHeight.value.toInt())
|
|
50
|
+
) {
|
|
51
|
+
moduleScope.launch {
|
|
52
|
+
promise.wrap {
|
|
53
|
+
val network = networks.getOrDefault(networkName, ZcashNetwork.Mainnet)
|
|
54
|
+
val endpoint = LightWalletEndpoint(defaultHost, defaultPort, true)
|
|
55
|
+
val seedPhrase = SeedPhrase.new(seed)
|
|
56
|
+
val initMode = if (newWallet) WalletInitMode.NewWallet else WalletInitMode.ExistingWallet
|
|
57
|
+
if (!synchronizerMap.containsKey(alias)) {
|
|
58
|
+
synchronizerMap[alias] =
|
|
59
|
+
Synchronizer.new(
|
|
60
|
+
reactApplicationContext,
|
|
61
|
+
network,
|
|
62
|
+
alias,
|
|
63
|
+
endpoint,
|
|
64
|
+
seedPhrase.toByteArray(),
|
|
65
|
+
BlockHeight.new(birthdayHeight.toLong()),
|
|
66
|
+
initMode,
|
|
67
|
+
) as SdkSynchronizer
|
|
83
68
|
}
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
69
|
+
val wallet = getWallet(alias)
|
|
70
|
+
val scope = wallet.coroutineScope
|
|
71
|
+
combine(wallet.progress, wallet.networkHeight) { progress, networkHeight ->
|
|
72
|
+
return@combine mapOf("progress" to progress, "networkHeight" to networkHeight)
|
|
73
|
+
}.collectWith(scope) { map ->
|
|
74
|
+
val progress = map["progress"] as PercentDecimal
|
|
75
|
+
var networkBlockHeight = map["networkHeight"] as BlockHeight?
|
|
76
|
+
if (networkBlockHeight == null) networkBlockHeight = BlockHeight.new(birthdayHeight.toLong())
|
|
77
|
+
|
|
78
|
+
sendEvent("UpdateEvent") { args ->
|
|
79
|
+
args.putString("alias", alias)
|
|
80
|
+
args.putInt(
|
|
81
|
+
"scanProgress",
|
|
82
|
+
progress.toPercentage(),
|
|
83
|
+
)
|
|
84
|
+
args.putInt("networkBlockHeight", networkBlockHeight.value.toInt())
|
|
85
|
+
}
|
|
89
86
|
}
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
87
|
+
wallet.status.collectWith(scope) { status ->
|
|
88
|
+
sendEvent("StatusEvent") { args ->
|
|
89
|
+
args.putString("alias", alias)
|
|
90
|
+
args.putString("name", status.toString())
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
wallet.transactions.collectWith(scope) { txList ->
|
|
94
|
+
scope.launch {
|
|
95
|
+
val nativeArray = Arguments.createArray()
|
|
96
|
+
txList
|
|
97
|
+
.filter { tx -> tx.transactionState != TransactionState.Expired }
|
|
98
|
+
.map { tx ->
|
|
99
|
+
launch {
|
|
100
|
+
val parsedTx = parseTx(wallet, tx)
|
|
101
|
+
nativeArray.pushMap(parsedTx)
|
|
102
|
+
}
|
|
103
|
+
}.forEach { it.join() }
|
|
104
|
+
|
|
105
|
+
sendEvent("TransactionEvent") { args ->
|
|
106
|
+
args.putString("alias", alias)
|
|
107
|
+
args.putArray(
|
|
108
|
+
"transactions",
|
|
109
|
+
nativeArray,
|
|
110
|
+
)
|
|
98
111
|
}
|
|
99
|
-
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
combine(
|
|
115
|
+
wallet.transparentBalance,
|
|
116
|
+
wallet.saplingBalances,
|
|
117
|
+
wallet.orchardBalances,
|
|
118
|
+
) { transparentBalance: Zatoshi?, saplingBalances: WalletBalance?, orchardBalances: WalletBalance? ->
|
|
119
|
+
return@combine Balances(
|
|
120
|
+
transparentBalance = transparentBalance,
|
|
121
|
+
saplingBalances = saplingBalances,
|
|
122
|
+
orchardBalances = orchardBalances,
|
|
123
|
+
)
|
|
124
|
+
}.collectWith(scope) { map ->
|
|
125
|
+
val transparentBalance = map.transparentBalance
|
|
126
|
+
val saplingBalances = map.saplingBalances
|
|
127
|
+
val orchardBalances = map.orchardBalances
|
|
128
|
+
|
|
129
|
+
val transparentAvailableZatoshi = transparentBalance ?: Zatoshi(0L)
|
|
130
|
+
val transparentTotalZatoshi = transparentBalance ?: Zatoshi(0L)
|
|
100
131
|
|
|
101
|
-
|
|
132
|
+
val saplingAvailableZatoshi = saplingBalances?.available ?: Zatoshi(0L)
|
|
133
|
+
val saplingTotalZatoshi = saplingBalances?.total ?: Zatoshi(0L)
|
|
134
|
+
|
|
135
|
+
val orchardAvailableZatoshi = orchardBalances?.available ?: Zatoshi(0L)
|
|
136
|
+
val orchardTotalZatoshi = orchardBalances?.total ?: Zatoshi(0L)
|
|
137
|
+
|
|
138
|
+
sendEvent("BalanceEvent") { args ->
|
|
102
139
|
args.putString("alias", alias)
|
|
103
|
-
args.
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
)
|
|
140
|
+
args.putString("transparentAvailableZatoshi", transparentAvailableZatoshi.value.toString())
|
|
141
|
+
args.putString("transparentTotalZatoshi", transparentTotalZatoshi.value.toString())
|
|
142
|
+
args.putString("saplingAvailableZatoshi", saplingAvailableZatoshi.value.toString())
|
|
143
|
+
args.putString("saplingTotalZatoshi", saplingTotalZatoshi.value.toString())
|
|
144
|
+
args.putString("orchardAvailableZatoshi", orchardAvailableZatoshi.value.toString())
|
|
145
|
+
args.putString("orchardTotalZatoshi", orchardTotalZatoshi.value.toString())
|
|
107
146
|
}
|
|
108
147
|
}
|
|
109
|
-
}
|
|
110
|
-
combine(
|
|
111
|
-
wallet.transparentBalance,
|
|
112
|
-
wallet.saplingBalances,
|
|
113
|
-
wallet.orchardBalances,
|
|
114
|
-
) { transparentBalance: Zatoshi?, saplingBalances: WalletBalance?, orchardBalances: WalletBalance? ->
|
|
115
|
-
return@combine Balances(
|
|
116
|
-
transparentBalance = transparentBalance,
|
|
117
|
-
saplingBalances = saplingBalances,
|
|
118
|
-
orchardBalances = orchardBalances,
|
|
119
|
-
)
|
|
120
|
-
}.collectWith(scope) { map ->
|
|
121
|
-
val transparentBalance = map.transparentBalance
|
|
122
|
-
val saplingBalances = map.saplingBalances
|
|
123
|
-
val orchardBalances = map.orchardBalances
|
|
124
|
-
|
|
125
|
-
val transparentAvailableZatoshi = transparentBalance ?: Zatoshi(0L)
|
|
126
|
-
val transparentTotalZatoshi = transparentBalance ?: Zatoshi(0L)
|
|
127
|
-
|
|
128
|
-
val saplingAvailableZatoshi = saplingBalances?.available ?: Zatoshi(0L)
|
|
129
|
-
val saplingTotalZatoshi = saplingBalances?.total ?: Zatoshi(0L)
|
|
130
|
-
|
|
131
|
-
val orchardAvailableZatoshi = orchardBalances?.available ?: Zatoshi(0L)
|
|
132
|
-
val orchardTotalZatoshi = orchardBalances?.total ?: Zatoshi(0L)
|
|
133
|
-
|
|
134
|
-
sendEvent("BalanceEvent") { args ->
|
|
135
|
-
args.putString("alias", alias)
|
|
136
|
-
args.putString("transparentAvailableZatoshi", transparentAvailableZatoshi.value.toString())
|
|
137
|
-
args.putString("transparentTotalZatoshi", transparentTotalZatoshi.value.toString())
|
|
138
|
-
args.putString("saplingAvailableZatoshi", saplingAvailableZatoshi.value.toString())
|
|
139
|
-
args.putString("saplingTotalZatoshi", saplingTotalZatoshi.value.toString())
|
|
140
|
-
args.putString("orchardAvailableZatoshi", orchardAvailableZatoshi.value.toString())
|
|
141
|
-
args.putString("orchardTotalZatoshi", orchardTotalZatoshi.value.toString())
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
148
|
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
149
|
+
fun handleError(
|
|
150
|
+
level: String,
|
|
151
|
+
error: Throwable?,
|
|
152
|
+
) {
|
|
153
|
+
sendEvent("ErrorEvent") { args ->
|
|
154
|
+
args.putString("alias", alias)
|
|
155
|
+
args.putString("level", level)
|
|
156
|
+
args.putString("message", error?.message ?: "Unknown error")
|
|
157
|
+
}
|
|
153
158
|
}
|
|
154
|
-
}
|
|
155
159
|
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
160
|
+
// Error listeners
|
|
161
|
+
wallet.onCriticalErrorHandler = { error ->
|
|
162
|
+
handleError("critical", error)
|
|
163
|
+
false
|
|
164
|
+
}
|
|
165
|
+
wallet.onProcessorErrorHandler = { error ->
|
|
166
|
+
handleError("error", error)
|
|
167
|
+
true
|
|
168
|
+
}
|
|
169
|
+
wallet.onSetupErrorHandler = { error ->
|
|
170
|
+
handleError("error", error)
|
|
171
|
+
false
|
|
172
|
+
}
|
|
173
|
+
wallet.onSubmissionErrorHandler = { error ->
|
|
174
|
+
handleError("error", error)
|
|
175
|
+
false
|
|
176
|
+
}
|
|
177
|
+
wallet.onChainErrorHandler = { errorHeight, rewindHeight ->
|
|
178
|
+
val message = "Chain error detected at height: $errorHeight. Rewinding to: $rewindHeight"
|
|
179
|
+
handleError("error", Throwable(message))
|
|
180
|
+
}
|
|
181
|
+
return@wrap null
|
|
176
182
|
}
|
|
177
|
-
return@wrap null
|
|
178
183
|
}
|
|
179
184
|
}
|
|
180
185
|
|
|
@@ -349,9 +354,10 @@ class RNZcashModule(private val reactContext: ReactApplicationContext) :
|
|
|
349
354
|
val proposal = Proposal.fromByteArray(proposalByteArray)
|
|
350
355
|
|
|
351
356
|
val txs =
|
|
352
|
-
wallet.coroutineScope
|
|
353
|
-
|
|
354
|
-
|
|
357
|
+
wallet.coroutineScope
|
|
358
|
+
.async {
|
|
359
|
+
wallet.createProposedTransactions(proposal, usk).take(proposal.transactionCount()).toList()
|
|
360
|
+
}.await()
|
|
355
361
|
val txid = txs[txs.lastIndex].txIdString() // The last transfer is the most relevant to the user
|
|
356
362
|
promise.resolve(txid)
|
|
357
363
|
} catch (t: Throwable) {
|
|
@@ -445,9 +451,7 @@ class RNZcashModule(private val reactContext: ReactApplicationContext) :
|
|
|
445
451
|
/**
|
|
446
452
|
* Retrieve wallet object from synchronizer map
|
|
447
453
|
*/
|
|
448
|
-
private fun getWallet(alias: String): SdkSynchronizer
|
|
449
|
-
return synchronizerMap[alias] ?: throw Exception("Wallet not found")
|
|
450
|
-
}
|
|
454
|
+
private fun getWallet(alias: String): SdkSynchronizer = synchronizerMap[alias] ?: throw Exception("Wallet not found")
|
|
451
455
|
|
|
452
456
|
/**
|
|
453
457
|
* Wrap the given block of logic in a promise, rejecting for any error.
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
{
|
|
2
|
+
"network": "main",
|
|
3
|
+
"height": "3020000",
|
|
4
|
+
"hash": "000000000037c640e2f5b446baea21d482741d8188c485be4de4b172f3cb77c1",
|
|
5
|
+
"time": 1754490535,
|
|
6
|
+
"saplingTree": "01cbd7cbe98c0e563421e96128f691cb4d6880fe06520afcdaf543fe04d83ea233015ac0609529bd81bab7273dbf2554b7a263dc39a5f8e482bfdb48ff72ad474c1d1f000184e8f5016442ebd92a619aaafb61531b4eaae8ac43fac2a3d6fc8d32ea684e20000001fd2f218bac5268e20b12e317676bea951d98c1c617ffb2fcff5d25b374b4a7540169eeef5960d7caf9428223c31e868e1a3987b4dbf39a018fd070851f38e47c6a0000012dffe7e51571d1b384afb3bbcb032259b323e0e84250c4fd25e0146692e46f6600011be7ad49955589016a54e73247f31222010b0bb411c96c5e76d31ce092957d2a0001bbc535c7b4ed77ea8e03b934e58822617cfc2513d04625646f1a1eb0f3c0aa2801dfe644736b1489455cf10c8f7915c9fc9aca07091239d50571ff21c6b907986b01060af6a6c1415a6eaf780073ffa3d0ab35af7bb391bccc4e6ea65a1230dad83001ab58f1ebb2860e257c50350a3e1b54778b7729bdd11eacaa9213c4b5f4dbb44c00017d1ce2f0839bdbf1bad7ae37f845e7fe2116e0c1197536bfbad549f3876c3c590000013e2598f743726006b8de42476ed56a55a75629a7b82e430c4e7c101a69e9b02a011619f99023a69bb647eab2d2aa1a73c3673c74bb033c3c4930eacda19e6fd93b0000000160272b134ca494b602137d89e528c751c06d3ef4a87a45f33af343c15060cc1e0000000000",
|
|
7
|
+
"orchardTree": "016977c99948d91a13c7c94d3a9e91666295f1d9ae35e858e23048cb6f01590c2a012c426e689984059d9528c9d2db9b015c904d8221adfc5417ce2b9022c8ea15051f01ad93f51f05e75ab786825638b4763d797d74b60c440d98285099142a733d392401562fe3b688cc0160a80c1227080b22d8713ad1f79c5d6eeb0b0731e77c1dca120001ba474db97689fbd81edf3081b36cc4d0f06e49e248f766a8a675e5ca82bd893a016276f00b93030a12bd87d0a0e137334e1458ef02004c7b232eae5c046b6b1d3e01a1f3574445e06c528d3f893301c093b0f58e735b041e595f08938342751e150101dbb01b83be7808423222c9f0a1fdf7212ab21ee700e02d77337c36653180510d000115aa047a01e96d303bef41901a62932451dd250beeb8f777632f1e17b1caac1700013f1050c048a796abfd1ed6def0a481d5274a30b8bf491ab9c668d7e82d70671b00000000000152dad142de8d870d83b688618b7660e049741aa143a78440c722296a17ca550a012d113bc8f6a4f41b3963cfa0717176c2d31ce7bfae4d250a1fff5e061dd9d3250160040850b766b126a2b4843fcdfdffa5d5cab3f53bc860a3bef68958b5f066170001cc2dcaa338b312112db04b435a706d63244dd435238f0aa1e9e1598d35470810012dcc4273c8a0ed2337ecf7879380a07e7d427c7f9d82e538002bd1442978402c01daf63debf5b40df902dae98dadc029f281474d190cddecef1b10653248a234150001e2bca6a8d987d668defba89dc082196a922634ed88e065c669e526bb8815ee1b000000000000"
|
|
8
|
+
}
|
|
@@ -8,32 +8,32 @@
|
|
|
8
8
|
<key>BinaryPath</key>
|
|
9
9
|
<string>libzcashlc.a</string>
|
|
10
10
|
<key>LibraryIdentifier</key>
|
|
11
|
-
<string>ios-
|
|
11
|
+
<string>ios-arm64_x86_64-simulator</string>
|
|
12
12
|
<key>LibraryPath</key>
|
|
13
13
|
<string>libzcashlc.a</string>
|
|
14
14
|
<key>SupportedArchitectures</key>
|
|
15
15
|
<array>
|
|
16
16
|
<string>arm64</string>
|
|
17
|
+
<string>x86_64</string>
|
|
17
18
|
</array>
|
|
18
19
|
<key>SupportedPlatform</key>
|
|
19
20
|
<string>ios</string>
|
|
21
|
+
<key>SupportedPlatformVariant</key>
|
|
22
|
+
<string>simulator</string>
|
|
20
23
|
</dict>
|
|
21
24
|
<dict>
|
|
22
25
|
<key>BinaryPath</key>
|
|
23
26
|
<string>libzcashlc.a</string>
|
|
24
27
|
<key>LibraryIdentifier</key>
|
|
25
|
-
<string>ios-
|
|
28
|
+
<string>ios-arm64</string>
|
|
26
29
|
<key>LibraryPath</key>
|
|
27
30
|
<string>libzcashlc.a</string>
|
|
28
31
|
<key>SupportedArchitectures</key>
|
|
29
32
|
<array>
|
|
30
33
|
<string>arm64</string>
|
|
31
|
-
<string>x86_64</string>
|
|
32
34
|
</array>
|
|
33
35
|
<key>SupportedPlatform</key>
|
|
34
36
|
<string>ios</string>
|
|
35
|
-
<key>SupportedPlatformVariant</key>
|
|
36
|
-
<string>simulator</string>
|
|
37
37
|
</dict>
|
|
38
38
|
</array>
|
|
39
39
|
<key>CFBundlePackageType</key>
|