Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
0b1e1bb
fix: retry broadcaster transactions with submit plans
czarcas7ic May 12, 2026
a73ceab
Cover raw submit plan endpoint registration
czarcas7ic May 12, 2026
ca6d5d2
Prune raw submit plan lookup entries
czarcas7ic May 12, 2026
4b3a786
Cover raw submit lookup path
czarcas7ic May 13, 2026
c35d091
Validate pending submit plan version
czarcas7ic May 13, 2026
7ec4edb
fix: serialize broadcaster submit plan registration
czarcas7ic May 13, 2026
bd3a313
fix: avoid submit plan overwrite after load failure
czarcas7ic May 20, 2026
e749fec
fix: log submit plan endpoint failures
czarcas7ic May 20, 2026
e236ddf
Remove pending submit plan async lock
czarcas7ic May 20, 2026
fbd26ae
Document pending submit plan store
czarcas7ic May 20, 2026
02ff1de
Preserve raw submit endpoints during creation
czarcas7ic May 20, 2026
1c39fd1
Merge upstream main into broadcaster submit plan
czarcas7ic May 20, 2026
6cd9ae2
fix: propagate raw transaction lookup errors
czarcas7ic May 25, 2026
b9ba0c1
fix: persist submit plans after load recovery
czarcas7ic May 25, 2026
0c26ade
[#1744] Leave zcash_voting version locked by Cargo.lock
p0mvn May 26, 2026
600b38f
Merge pull request #1744 from zcash/roman/pin-zcash-voting-pr57
nullcopy May 26, 2026
47120cd
Checkpoints updated
LukasKorba May 27, 2026
c0b1aae
Merge pull request #1747 from zcash/checkpoints-update-2026-05
LukasKorba May 27, 2026
b2fbf55
Release zcash-swift-wallet-sdk version 2.6.0-alpha.3
nuttycom May 27, 2026
5bb5e88
Merge remote-tracking branch 'origin/main' into adam/broadcaster-subm…
octoclawd May 30, 2026
e032ae8
Merge tag '2.6.0-alpha.3' into adam/broadcaster-submit-plan
octoclawd May 30, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,27 @@ and this library adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

# Unreleased

## Changed
- `Broadcaster` transactions now remain eligible for SDK automatic retry after submission. The SDK records the submitted endpoints privately and retries with those endpoints instead of the synchronizer's default endpoint.

## Checkpoints

Mainnet

````
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/3340000.json
...
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/3355000.json
````

Testnet

````
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/4010000.json
...
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/4030000.json
````

# 2.6.0-alpha.3 - 2026-05-26

## Changed
Expand Down
2 changes: 1 addition & 1 deletion Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "libzcashlc"
version = "2.5.1"
version = "2.6.0-alpha.3"
authors = [
"Jack Grigg <thestr4d@gmail.com>",
"Lukas Korba <lukas@tangiblecodes.com>",
Expand Down Expand Up @@ -84,7 +84,7 @@ rust_decimal = { version = "1", default-features = false, features = ["c-repr"]
xz2 = { version = "0.1", features = ["static"] }

# Voting
zcash_voting = { version = "=0.10.1", default-features = false, features = [
zcash_voting = { version = "0.10.1", default-features = false, features = [
"client-pir",
"client-tree-sync",
] }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,15 @@ final class TxResubmissionAction {
var latestResolvedTime: TimeInterval = 0
let transactionRepository: TransactionRepository
var transactionEncoder: TransactionEncoder
let pendingSubmitPlanStore: PendingSubmitPlanStore
let submitPlanExecutor: SubmitPlanExecutor
let logger: Logger

init(container: DIContainer) {
transactionRepository = container.resolve(TransactionRepository.self)
transactionEncoder = container.resolve(TransactionEncoder.self)
pendingSubmitPlanStore = container.resolve(PendingSubmitPlanStore.self)
submitPlanExecutor = container.resolve(SubmitPlanExecutor.self)
logger = container.resolve(Logger.self)
}
}
Expand All @@ -33,7 +37,12 @@ extension TxResubmissionAction: Action {
// find all candidates for the resubmission
do {
logger.info("TxResubmissionAction check started at \(latestBlockHeight) height.")
let transactions = try await transactionRepository.findForResubmission(upTo: latestBlockHeight)
let transactions = try await pendingSubmitPlanStore.loadTransactionsAndRetainSubmitPlans(
loadTransactions: {
try await transactionRepository.findForResubmission(upTo: latestBlockHeight)
},
transactionId: { $0.rawID }
)

// no candidates, update the time and continue with the next action
if transactions.isEmpty {
Expand All @@ -47,10 +56,29 @@ extension TxResubmissionAction: Action {
// resubmission
do {
for transaction in transactions {
let submitPlan = await pendingSubmitPlanStore.getSubmitPlan(for: transaction.rawID)
if case .awaitingPlan = submitPlan {
logger.info(
"TxResubmissionAction skipping transaction \(transaction.rawID.toHexStringTxId()) " +
"until a submit plan is registered."
)
continue
}

logger.info("TxResubmissionAction trying to resubmit transaction \(transaction.rawID.toHexStringTxId()).")
let encodedTransaction = try transaction.encodedTransaction()

try await transactionEncoder.submit(transaction: encodedTransaction)
switch submitPlan {
case .none:
try await transactionEncoder.submit(transaction: encodedTransaction)
case .ready(let plan):
try await submitPlanExecutor.submit(
transaction: encodedTransaction,
submitPlan: plan
)
case .awaitingPlan:
break
}
}
} catch {
logger.error("TxResubmissionAction failed to resubmit candidates.")
Expand Down
8 changes: 8 additions & 0 deletions Sources/ZcashLightClientKit/Broadcaster.swift
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,11 @@ import Foundation
/// strategies such as submitting to multiple lightwalletd servers
/// in parallel.
///
/// Transactions created through this API wait for the caller to submit them.
/// Once submitted, automatic retry uses the submitted endpoints instead of the
/// synchronizer's default endpoint. Retry tries the recorded endpoints in order
/// until one submit succeeds.
///
/// Typical usage:
/// ```swift
/// // 1. Create the transaction(s)
Expand Down Expand Up @@ -69,6 +74,9 @@ public protocol Broadcaster: AnyObject {
/// transaction, and tears down the connection. Respects the current
/// Tor configuration.
///
/// If the transaction was created through this `Broadcaster`, the endpoint
/// is remembered for automatic retry.
///
/// - Parameter rawTransaction: the raw serialized transaction bytes.
/// - Parameter endpoint: the `LightWalletEndpoint` to submit to.
func submit(
Expand Down
10 changes: 9 additions & 1 deletion Sources/ZcashLightClientKit/DAO/TransactionDao.swift
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ extension Connection {
}
}

class TransactionSQLDAO: TransactionRepository {
class TransactionSQLDAO: TransactionRepository, RawTransactionLookup {
enum NotesTableStructure {
static let transactionID = SQLite.Expression<Int>("tx")
static let memo = SQLite.Expression<Blob>("memo")
Expand Down Expand Up @@ -146,6 +146,14 @@ class TransactionSQLDAO: TransactionRepository {
return try await execute(query) { try ZcashTransaction.Overview(row: $0) }
}

func find(rawTransaction: Data) async throws -> ZcashTransaction.Overview {
let query = transactionsView
.filter(ZcashTransaction.Overview.Column.raw == Blob(bytes: rawTransaction.bytes))
.limit(1)

return try await execute(query) { try ZcashTransaction.Overview(row: $0) }
}

func find(offset: Int, limit: Int, kind: TransactionKind) async throws -> [ZcashTransaction.Overview] {
let query = transactionsView
.order((ZcashTransaction.Overview.Column.minedHeight ?? BlockHeight.max).desc)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,3 +29,7 @@ protocol TransactionRepository {
func getTransactionOutputs(for rawID: Data) async throws -> [ZcashTransaction.Output]
func debugDatabase(sql: String) -> String
}

protocol RawTransactionLookup {
func find(rawTransaction: Data) async throws -> ZcashTransaction.Overview
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"network": "main",
"height": "3340000",
"hash": "0000000000176c646f484fd89f0849d5d12b2e72fc3b6bb19f28513c131542aa",
"time": 1778604451,
"saplingTree": "017d5d63df6a14192d72dc5e6e2a6a71fe973ca6fcf9a5857593a3fea29f7b9b24001f000001ea8124cfa09f07e8fb7fc4cb0a3b057b4b4632d76e5b5a2d6a036019f290fa5701f9c1a177d696088c1398689bc6f444d8613325e0118158c83c71ac3e1832376101381defcce60fe6d2eda20d3de8c1ccf5b3e1ae4dab9c0a6782faa15fc056960c0164a0c7286c5a9196246d0a0db160c876377cea24154133bcda23acc06ca1fa32015ed6a4099c41ded03f5dbec882a691849d4b62e0c2dff282c7a0250cefbb024c01319578858ea9e3381642e979dd307c59c2aa360392ec75e5a88c23143457f76c01b6dd3f9fe1163acb4750b9dedde2b9be4741b1ebe94cc3a676dac57ec230e461000120cc0c0ff8e16bd54c723a4340007c266b33f0a99ef18aa0a4a2cf3889f0375b01b79e8339dd14c75d334b7d22837c83b54af56dc8ffc00c1d9e000d73218c1f4501e1ed2cd5a21ca655ae19e2f2c367d0039f37ee35ba856791768e01e8b5012d5b00011d85b015e936981d3a869c16ed2e03aeeb2444206933acc3f7b384aeb963256601929f0d44045c58428bd8daca3e2c9ca5a0361b5573a4158251dbe9f63a84e94901931c48ea50688eae5e54c24d0df7a6b00ce498f92eb5e1cfd6a2d87d8ebd5364017d1ce2f0839bdbf1bad7ae37f845e7fe2116e0c1197536bfbad549f3876c3c590000013e2598f743726006b8de42476ed56a55a75629a7b82e430c4e7c101a69e9b02a011619f99023a69bb647eab2d2aa1a73c3673c74bb033c3c4930eacda19e6fd93b0000000160272b134ca494b602137d89e528c751c06d3ef4a87a45f33af343c15060cc1e0000000000",
"orchardTree": "012ff8ec2da5684e75195ca3be148c2d1fdab647848993c57a0094ae56b3f8aa1a001f00016be1e58474aa3149c3134be705a323141bba08d15fda001449ee24d1473e55380175414578d3f0c6104759ba284786e7f647214afeced76161f22dca0fb0671908015bc02f397a949f4195c09d547f22b1c5243d43cd6d7187f959f1aee7ff69de0c0197ef4dc418b370caff537b1557da0a466ff9440c0109f1f248f56cbec7c78b16010eb8701f4fb780766f8dc8050fc47a1529ec1f6ea4ac2fe4191fdac7ff91041c00013a71bdcbf164f8fa61cf6a3a057167fb91fcc9296df6222d5d010c248dc7f13501bc080d714f1761a7526c31badf0a5cc7d9b192f7f9380196fcc3ce2146f71b13000188c7f21ce6fbdc7d161545b0050aa75aeeb0884849326b33180ca0365cb6210b00000140234bc97e83a54c01338f668afbf26a7e88d945d266bf2374ed25b051e8e92e01d2cadcf4fa18a265421bb67f40cdf518a208d55ea1cbaf7bdaaa12df99860d000001e4bb5b2b7df9f4c3f508da258d91255399df66e84af8795377b7696bb87df42300012829e8aacdf1501baaeb5cb6e189d4e7182228e3d4b9acf54713595241e97f21017c8ece2b2ab2355d809b58809b21c7a5e95cfc693cd689387f7533ec8749261e01cc2dcaa338b312112db04b435a706d63244dd435238f0aa1e9e1598d35470810012dcc4273c8a0ed2337ecf7879380a07e7d427c7f9d82e538002bd1442978402c01daf63debf5b40df902dae98dadc029f281474d190cddecef1b10653248a234150001e2bca6a8d987d668defba89dc082196a922634ed88e065c669e526bb8815ee1b000000000000"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"network": "main",
"height": "3342500",
"hash": "0000000000eb9738c9af194d316f17ab50281aa89e5afcdb40f226a507a0d04f",
"time": 1778792821,
"saplingTree": "01e76a2bf8512779f9cf1885eec1fa2b7cb7f34ae687dd2a73013e0334f2aed15e011dcd24172dc97f8dadc0923c4c839a863a94e46f3815ae3694fd727c851c8f5c1f000001ee90f27235279cc5ca519aca4a7f78c43de15561c769714773b0b5aee455534e0001f17d34eaf3ca8b583b8bbc946c85cc8af0a5b6175197bbdb986cc001cc606220011e4d0591346a7b100a283de68a5e0525f05c4aa931829a7e02192ed4d5cf2925017e5b5e5d645d836e58bce4247e154448c1a0b78bbf732cb6c3943cd7221bfe59016ef74376850fcc46d8892d318c61840ef4c58e84d1b86b3ee3188d23507f555c011709749511f2953f4593c45ef9cd3b291cf32a59b5c288e8618048b84d7fc157013f3c85d10f47339825160e6ff786ca15c7fd0c59b7882262f44a57c266b618140120cc0c0ff8e16bd54c723a4340007c266b33f0a99ef18aa0a4a2cf3889f0375b01b79e8339dd14c75d334b7d22837c83b54af56dc8ffc00c1d9e000d73218c1f4501e1ed2cd5a21ca655ae19e2f2c367d0039f37ee35ba856791768e01e8b5012d5b00011d85b015e936981d3a869c16ed2e03aeeb2444206933acc3f7b384aeb963256601929f0d44045c58428bd8daca3e2c9ca5a0361b5573a4158251dbe9f63a84e94901931c48ea50688eae5e54c24d0df7a6b00ce498f92eb5e1cfd6a2d87d8ebd5364017d1ce2f0839bdbf1bad7ae37f845e7fe2116e0c1197536bfbad549f3876c3c590000013e2598f743726006b8de42476ed56a55a75629a7b82e430c4e7c101a69e9b02a011619f99023a69bb647eab2d2aa1a73c3673c74bb033c3c4930eacda19e6fd93b0000000160272b134ca494b602137d89e528c751c06d3ef4a87a45f33af343c15060cc1e0000000000",
"orchardTree": "017f31b6a61fda71f16acf5e166943a521cbf315d43da5968fb6bb43ab22b84610001f014979e7186e69dbe9245f3b7f9b78bae4c1fe415ac00f878521ac8368a0b1042801e377f0b90d2a206e50cffe05c013a5c5e9c3aed8ce814c6c91f9d45535f7311c018d3742b81f24cc442ceab99559f8d2b5763cab43855edec409c248eae5c3b831000191aa3773139ffeac41c047e95d62d0d82a59c958856c2b0435de03630e0d6730000000019d691d2298d03f64d50066b2d3ab467c68b0d5a0cad13800023c68e003f34b2d01457e5c3b9a7aadbeb5e588d7293e3e975f2e7618a06af0071ea93847a4aa0806000001e7618eaf8e4ff94a93e524fa891e5b9b89cb782beb1de3c85a0bfe6277ae561b0140234bc97e83a54c01338f668afbf26a7e88d945d266bf2374ed25b051e8e92e01d2cadcf4fa18a265421bb67f40cdf518a208d55ea1cbaf7bdaaa12df99860d000001e4bb5b2b7df9f4c3f508da258d91255399df66e84af8795377b7696bb87df42300012829e8aacdf1501baaeb5cb6e189d4e7182228e3d4b9acf54713595241e97f21017c8ece2b2ab2355d809b58809b21c7a5e95cfc693cd689387f7533ec8749261e01cc2dcaa338b312112db04b435a706d63244dd435238f0aa1e9e1598d35470810012dcc4273c8a0ed2337ecf7879380a07e7d427c7f9d82e538002bd1442978402c01daf63debf5b40df902dae98dadc029f281474d190cddecef1b10653248a234150001e2bca6a8d987d668defba89dc082196a922634ed88e065c669e526bb8815ee1b000000000000"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"network": "main",
"height": "3345000",
"hash": "0000000000b7b5080387458121c500fc8acdf206d0593dd4b1edf521360e129d",
"time": 1778981173,
"saplingTree": "0135066bb27d3fca80a062fc5a93f16190d685a73df86906bb631ab648d5bb7c64001f00010095e8adc3562c9253e0a5de1078d0e77cbf73a53e5a532da1eb3dd0c4cd6e0c0001e738edf6ee6b5962d36fbfaca849f45c04a11505b7ad8bf4319b0d9e99f8f757015a6cdac798990a9ea89d75339d4b2680ed6b9451b522be32751e896c29a58835000001b6d99a6c10600e476369a4fcccb49ceb006d0793729f2e873afffaf4fe483b4a012583d2be1bbf223256da79ed6d8236a09f98be2f00510ffd0f0642396a5dbd56000000000190e323f6e45d107d4c5cbe2c4cb4c18a466d71c43fb4b4613d3617ed45d8f456011d85b015e936981d3a869c16ed2e03aeeb2444206933acc3f7b384aeb963256601929f0d44045c58428bd8daca3e2c9ca5a0361b5573a4158251dbe9f63a84e94901931c48ea50688eae5e54c24d0df7a6b00ce498f92eb5e1cfd6a2d87d8ebd5364017d1ce2f0839bdbf1bad7ae37f845e7fe2116e0c1197536bfbad549f3876c3c590000013e2598f743726006b8de42476ed56a55a75629a7b82e430c4e7c101a69e9b02a011619f99023a69bb647eab2d2aa1a73c3673c74bb033c3c4930eacda19e6fd93b0000000160272b134ca494b602137d89e528c751c06d3ef4a87a45f33af343c15060cc1e0000000000",
"orchardTree": "018467f8278e5c71b0208ec78180ce2219b38752ecc78bd1d66a88b1a30dda2f3b001f0000014273294140237ee74298e3021c9cdeaa01711b55d7b37062cf7171845d26a503000001307dd02629646d1cc16e4924b7012c493274829aac3fa7e62dff9cf832a6653a0134097cbe1facd71344ab30e47d546a60313a24c670df5897b3971ac82656271901533027309e1db0ed54f26beed346d574806e6abb0d73422fdbeb87137401011f0001fa34935d099df0fc5f49105505f1b5667a5c4216cb2c13de0f96165955827a0a01df40423ed5c4216a0a75cb87d4d48c0e2e39363cfa225ea0c0c433697b520b05018b51e53f3e69044df9343e294a8b70c16a16ffbd3c5529e55d12e6ef5f2dff0401e7618eaf8e4ff94a93e524fa891e5b9b89cb782beb1de3c85a0bfe6277ae561b0140234bc97e83a54c01338f668afbf26a7e88d945d266bf2374ed25b051e8e92e01d2cadcf4fa18a265421bb67f40cdf518a208d55ea1cbaf7bdaaa12df99860d000001e4bb5b2b7df9f4c3f508da258d91255399df66e84af8795377b7696bb87df42300012829e8aacdf1501baaeb5cb6e189d4e7182228e3d4b9acf54713595241e97f21017c8ece2b2ab2355d809b58809b21c7a5e95cfc693cd689387f7533ec8749261e01cc2dcaa338b312112db04b435a706d63244dd435238f0aa1e9e1598d35470810012dcc4273c8a0ed2337ecf7879380a07e7d427c7f9d82e538002bd1442978402c01daf63debf5b40df902dae98dadc029f281474d190cddecef1b10653248a234150001e2bca6a8d987d668defba89dc082196a922634ed88e065c669e526bb8815ee1b000000000000"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"network": "main",
"height": "3347500",
"hash": "0000000000879a8d5268093eab17f8008ffd0fe9fb59087275109cd46e8011aa",
"time": 1779169130,
"saplingTree": "016f071150972d222609f043559ad9ac8521e1a1ff9d1adcc7dc3fad70cc11950d001f01f22527c3e131804418d15c9f9048de2fd57da368ff4976b3855c5eca0e96701000000001d713d6c4f874f0c383f0b1ad62b701e42273dba52c4d1c6792b66a7de4d2d13200011962e10bbb9dcee3ab1220162ba1a4375c05f2958694c586ea32a45e0c391b2d013e1a2e624b23293be89330a79b619eaaa6b77be3f8a0c421e8993b41bcde0f1601c1aa51d39b9b9abc5c2c748569b2c26a13e8f7c3dc0469402a857dd8a8e6363501c98d353959b3ac414a82f2c714e1c589d84ae2a277db946761422188046cff040000000190e323f6e45d107d4c5cbe2c4cb4c18a466d71c43fb4b4613d3617ed45d8f456011d85b015e936981d3a869c16ed2e03aeeb2444206933acc3f7b384aeb963256601929f0d44045c58428bd8daca3e2c9ca5a0361b5573a4158251dbe9f63a84e94901931c48ea50688eae5e54c24d0df7a6b00ce498f92eb5e1cfd6a2d87d8ebd5364017d1ce2f0839bdbf1bad7ae37f845e7fe2116e0c1197536bfbad549f3876c3c590000013e2598f743726006b8de42476ed56a55a75629a7b82e430c4e7c101a69e9b02a011619f99023a69bb647eab2d2aa1a73c3673c74bb033c3c4930eacda19e6fd93b0000000160272b134ca494b602137d89e528c751c06d3ef4a87a45f33af343c15060cc1e0000000000",
"orchardTree": "01f39ab659655937b4ab428b461a668460678bd52c64de4aec9556c84d3163ff19001f00000175b050fff4d627227048fdaecf0161bd324d42e49e61fea5ac4a989f335dc10e0000011e5506abb4e51ec113021ac6e9d8fa3eaad6ea67786045e153806d386f2f5a270001bb75504716851fff3039de74da02e73a161d41e2329fcc2518b3c926537f432e0001b18fbc455cba5fc45e3459795eaee992eaac3a73b66cc00b48c8761432e9a12000015525a5ccc765e2f933777090dd6b248b79d43f966e384828e7817ac84a14ea1e000000012058ed30845b642624f5e97c395da919472fc4cf33310e9c6c5592fb2402863a01e4bb5b2b7df9f4c3f508da258d91255399df66e84af8795377b7696bb87df42300012829e8aacdf1501baaeb5cb6e189d4e7182228e3d4b9acf54713595241e97f21017c8ece2b2ab2355d809b58809b21c7a5e95cfc693cd689387f7533ec8749261e01cc2dcaa338b312112db04b435a706d63244dd435238f0aa1e9e1598d35470810012dcc4273c8a0ed2337ecf7879380a07e7d427c7f9d82e538002bd1442978402c01daf63debf5b40df902dae98dadc029f281474d190cddecef1b10653248a234150001e2bca6a8d987d668defba89dc082196a922634ed88e065c669e526bb8815ee1b000000000000"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"network": "main",
"height": "3350000",
"hash": "00000000007cf26cfa1ad66d6b09d49adb6b4cf18bf6409bfc621600c01504e1",
"time": 1779359129,
"saplingTree": "01fca7be66740db6352ed4499a6f4bb4508a6e46bc33f2d636cb19b362b21ba739001f0000000159e0fbf2bc549165950198a8fb11866defa168404dcb3b4f31d3e4d5a57e941a0000000157aff948d08dc586d69663d49816ebf59dc466cf4ba819903e865f39c41cf75500017d1a68c8d2a5fa9c517c8b24dd71ccbb332a7bf6e2518d71a253f88c4905584f012946f1f71e50fe21515671354c0447f30378066e0ed9c12664bae82f3cc77b1300000190e323f6e45d107d4c5cbe2c4cb4c18a466d71c43fb4b4613d3617ed45d8f456011d85b015e936981d3a869c16ed2e03aeeb2444206933acc3f7b384aeb963256601929f0d44045c58428bd8daca3e2c9ca5a0361b5573a4158251dbe9f63a84e94901931c48ea50688eae5e54c24d0df7a6b00ce498f92eb5e1cfd6a2d87d8ebd5364017d1ce2f0839bdbf1bad7ae37f845e7fe2116e0c1197536bfbad549f3876c3c590000013e2598f743726006b8de42476ed56a55a75629a7b82e430c4e7c101a69e9b02a011619f99023a69bb647eab2d2aa1a73c3673c74bb033c3c4930eacda19e6fd93b0000000160272b134ca494b602137d89e528c751c06d3ef4a87a45f33af343c15060cc1e0000000000",
"orchardTree": "01984c9b721a04ec43f83af2fe55be4d5c35a3ffe4c5ef66f5c470f36656c30f01010355c689bb56ce852be016174c5dfb9dc318afeb7d073f65017ac66babac5e321f01307c9f8ee0f436765b99d2314a9d1bf9005bf7d43a57b29593efc2ee1d4e42120000000101a6c04f0de2a7683af45e5e89a71498c3f916da5857454f85835ae0765e5b1c01024543199efdffc0bf65e01742445be10f0e29a803117320f1465846d6a73a38000114e9dad761c617620e2222f7d0f13c21330fbdcb2fb6ad467b673cf5273c4b1b000001ddaf39259ef5e6d5b21d4213c1452be45e2f7af711bbb1176c3cf973a8c45e250164a1f5c861aea42e28991321d00dbb8ed5a0bf0a9e51a453b5766b10fabc5f2a01d4607d9c3a44b2a0e4a25a4852a897c1da40bd8e168183ba8177407a452d9d180000012058ed30845b642624f5e97c395da919472fc4cf33310e9c6c5592fb2402863a01e4bb5b2b7df9f4c3f508da258d91255399df66e84af8795377b7696bb87df42300012829e8aacdf1501baaeb5cb6e189d4e7182228e3d4b9acf54713595241e97f21017c8ece2b2ab2355d809b58809b21c7a5e95cfc693cd689387f7533ec8749261e01cc2dcaa338b312112db04b435a706d63244dd435238f0aa1e9e1598d35470810012dcc4273c8a0ed2337ecf7879380a07e7d427c7f9d82e538002bd1442978402c01daf63debf5b40df902dae98dadc029f281474d190cddecef1b10653248a234150001e2bca6a8d987d668defba89dc082196a922634ed88e065c669e526bb8815ee1b000000000000"
}
Loading
Loading