commit ed740fd55a119e4946a483762d7d7df3795303a0
parent 04e2ae207ec429ee3633ba16ec871c20b7bd8724
Author: triesap <tyson@radroots.org>
Date: Mon, 14 Sep 2026 10:08:43 +0000
publication: reconcile ambiguous signing outcomes
- Retain verified authored signatures after caller timeout or cancellation
- Recover exact durable operation facts without another signer call
- Adopt verified signing evidence storage and Sync reconciliation
- Regenerate artifacts and verify native deadline and clock recovery
Diffstat:
24 files changed, 1238 insertions(+), 468 deletions(-)
diff --git a/Cargo.lock b/Cargo.lock
@@ -1876,7 +1876,7 @@ checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf"
[[package]]
name = "radroots_blossom"
version = "0.1.0-alpha"
-source = "git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f"
+source = "git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13"
dependencies = [
"mediatype",
"serde",
@@ -1888,7 +1888,7 @@ dependencies = [
[[package]]
name = "radroots_core"
version = "0.1.0-alpha"
-source = "git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f"
+source = "git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13"
dependencies = [
"rust_decimal",
"serde",
@@ -1897,7 +1897,7 @@ dependencies = [
[[package]]
name = "radroots_event"
version = "0.1.0-alpha"
-source = "git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f"
+source = "git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13"
dependencies = [
"hex",
"jiff-tzdb",
@@ -1915,7 +1915,7 @@ dependencies = [
[[package]]
name = "radroots_event_codec"
version = "0.1.0-alpha"
-source = "git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f"
+source = "git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13"
dependencies = [
"hex",
"radroots_blossom",
@@ -1932,7 +1932,7 @@ dependencies = [
[[package]]
name = "radroots_identity"
version = "0.1.0-alpha"
-source = "git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f"
+source = "git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13"
dependencies = [
"k256",
"serde",
@@ -1942,7 +1942,7 @@ dependencies = [
[[package]]
name = "radroots_nostr"
version = "0.1.0-alpha"
-source = "git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f"
+source = "git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13"
dependencies = [
"base64",
"nostr 0.44.8",
@@ -1959,7 +1959,7 @@ dependencies = [
[[package]]
name = "radroots_protocol"
version = "0.1.0-alpha"
-source = "git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f"
+source = "git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13"
dependencies = [
"serde",
]
@@ -1967,7 +1967,7 @@ dependencies = [
[[package]]
name = "radroots_sdk"
version = "0.1.0-alpha"
-source = "git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f"
+source = "git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13"
dependencies = [
"radroots_blossom",
"radroots_core",
@@ -1992,7 +1992,7 @@ dependencies = [
[[package]]
name = "radroots_secrets"
version = "0.1.0-alpha"
-source = "git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f"
+source = "git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13"
dependencies = [
"chacha20poly1305",
"sha2",
@@ -2003,7 +2003,7 @@ dependencies = [
[[package]]
name = "radroots_signing"
version = "0.1.0-alpha"
-source = "git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f"
+source = "git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13"
dependencies = [
"hex",
"radroots_event",
@@ -2017,7 +2017,7 @@ dependencies = [
[[package]]
name = "radroots_storage"
version = "0.1.0-alpha"
-source = "git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f"
+source = "git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13"
dependencies = [
"radroots_event",
"radroots_event_codec",
@@ -2031,7 +2031,7 @@ dependencies = [
[[package]]
name = "radroots_storage_sqlite"
version = "0.1.0-alpha"
-source = "git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f"
+source = "git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13"
dependencies = [
"fs2",
"radroots_event",
@@ -2048,7 +2048,7 @@ dependencies = [
[[package]]
name = "radroots_sync"
version = "0.1.0-alpha"
-source = "git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f"
+source = "git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13"
dependencies = [
"radroots_event",
"radroots_event_codec",
@@ -2063,7 +2063,7 @@ dependencies = [
[[package]]
name = "radroots_trade"
version = "0.1.0-alpha"
-source = "git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f"
+source = "git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13"
dependencies = [
"hex",
"radroots_core",
@@ -2077,7 +2077,7 @@ dependencies = [
[[package]]
name = "radroots_transport"
version = "0.1.0-alpha"
-source = "git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f"
+source = "git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13"
dependencies = [
"radroots_event",
"radroots_identity",
@@ -2089,7 +2089,7 @@ dependencies = [
[[package]]
name = "radroots_transport_nostr"
version = "0.1.0-alpha"
-source = "git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f"
+source = "git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13"
dependencies = [
"async-wsocket",
"futures",
diff --git a/Cargo.toml b/Cargo.toml
@@ -31,18 +31,18 @@ jiff_tzdb = { package = "jiff-tzdb", version = "=0.1.8", default-features = fals
futures-util = { version = "0.3", default-features = false, features = ["sink", "std"] }
hex = { version = "0.4" }
nostr = { version = "0.44.7", default-features = false }
-radroots_blossom = { package = "radroots_blossom", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "e528bd0be26bdaa25266859ce139f59903b43f3f" }
-radroots_event = { package = "radroots_event", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "e528bd0be26bdaa25266859ce139f59903b43f3f" }
-radroots_event_codec = { package = "radroots_event_codec", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "e528bd0be26bdaa25266859ce139f59903b43f3f" }
-radroots_identity = { package = "radroots_identity", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "e528bd0be26bdaa25266859ce139f59903b43f3f" }
-radroots_nostr = { package = "radroots_nostr", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "e528bd0be26bdaa25266859ce139f59903b43f3f" }
-radroots_protocol = { package = "radroots_protocol", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "e528bd0be26bdaa25266859ce139f59903b43f3f" }
-radroots_sdk = { version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "e528bd0be26bdaa25266859ce139f59903b43f3f" }
-radroots_signing = { package = "radroots_signing", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "e528bd0be26bdaa25266859ce139f59903b43f3f" }
-radroots_storage = { package = "radroots_storage", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "e528bd0be26bdaa25266859ce139f59903b43f3f" }
-radroots_sync = { package = "radroots_sync", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "e528bd0be26bdaa25266859ce139f59903b43f3f" }
-radroots_transport = { package = "radroots_transport", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "e528bd0be26bdaa25266859ce139f59903b43f3f" }
-radroots_transport_nostr = { package = "radroots_transport_nostr", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "e528bd0be26bdaa25266859ce139f59903b43f3f" }
+radroots_blossom = { package = "radroots_blossom", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "f578069cf894b34695bdf0ed2298e0aa162b5c13" }
+radroots_event = { package = "radroots_event", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "f578069cf894b34695bdf0ed2298e0aa162b5c13" }
+radroots_event_codec = { package = "radroots_event_codec", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "f578069cf894b34695bdf0ed2298e0aa162b5c13" }
+radroots_identity = { package = "radroots_identity", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "f578069cf894b34695bdf0ed2298e0aa162b5c13" }
+radroots_nostr = { package = "radroots_nostr", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "f578069cf894b34695bdf0ed2298e0aa162b5c13" }
+radroots_protocol = { package = "radroots_protocol", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "f578069cf894b34695bdf0ed2298e0aa162b5c13" }
+radroots_sdk = { version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "f578069cf894b34695bdf0ed2298e0aa162b5c13" }
+radroots_signing = { package = "radroots_signing", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "f578069cf894b34695bdf0ed2298e0aa162b5c13" }
+radroots_storage = { package = "radroots_storage", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "f578069cf894b34695bdf0ed2298e0aa162b5c13" }
+radroots_sync = { package = "radroots_sync", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "f578069cf894b34695bdf0ed2298e0aa162b5c13" }
+radroots_transport = { package = "radroots_transport", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "f578069cf894b34695bdf0ed2298e0aa162b5c13" }
+radroots_transport_nostr = { package = "radroots_transport_nostr", version = "=0.1.0-alpha", default-features = false, git = "https://github.com/radrootslabs/lib", rev = "f578069cf894b34695bdf0ed2298e0aa162b5c13" }
serde = { version = "1", default-features = false, features = ["derive", "alloc"] }
serde_json = { version = "1", default-features = false, features = ["alloc"] }
sha2 = { version = "0.10", default-features = false }
diff --git a/Package.swift b/Package.swift
@@ -75,6 +75,7 @@ let package = Package(
"Runtime/TeraGeneratedCalendarCards.swift",
"Runtime/TeraGeneratedComposer.swift",
"Runtime/TeraGeneratedDraftInventory.swift",
+ "Runtime/TeraGeneratedHostSigner.swift",
"Runtime/TeraGeneratedRuntimeBackend.swift",
"Runtime/TeraGeneratedRuntimeBackendComposer.swift",
"Runtime/TeraGeneratedSubmission.swift",
diff --git a/Tera.xcodeproj/project.pbxproj b/Tera.xcodeproj/project.pbxproj
@@ -96,6 +96,7 @@
E892ED14E1F39D81128A8F0E /* TeraComposerSaveLatencyTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C4A465852C5D5BDFC879D6E /* TeraComposerSaveLatencyTests.swift */; };
E98A5C885E3955D4DC4BB1EC /* TeraTodayCacheFirstTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53CB51FEF4CE772320B3264C /* TeraTodayCacheFirstTests.swift */; };
EF7293C553BF1DB45EEEBD49 /* local-social-personas.v1.json in Resources */ = {isa = PBXBuildFile; fileRef = 27D9D40699A01FFB02F30B11 /* local-social-personas.v1.json */; };
+ F13090A3350CAE9CA3FFF3F3 /* TeraLateSigningTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 217E44A3221756EC904702D6 /* TeraLateSigningTests.swift */; };
F14217EA66C2A9397E36E3FA /* TeraEditingOperationProtectionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = AC9B19425D3374B899485C17 /* TeraEditingOperationProtectionTests.swift */; };
F4AF91E71B691FE30C191852 /* TeraAddObservationStartupTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 44A4460928B20A21A94BECCE /* TeraAddObservationStartupTests.swift */; };
F8C87782857DC930D47E6A90 /* TeraRuntimeResourceTaskTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4D01C023E258AC3B3B1C27D /* TeraRuntimeResourceTaskTests.swift */; };
@@ -131,6 +132,7 @@
0F97ECE43BB7028B5A497720 /* TeraEditingReplacementTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TeraEditingReplacementTests.swift; sourceTree = "<group>"; };
11E9C876EA26B30C8AFE116F /* TeraScopeFixtures.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TeraScopeFixtures.swift; sourceTree = "<group>"; };
194084009776463236C79B72 /* TeraSubmissionStoreTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TeraSubmissionStoreTests.swift; sourceTree = "<group>"; };
+ 217E44A3221756EC904702D6 /* TeraLateSigningTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TeraLateSigningTests.swift; sourceTree = "<group>"; };
21DD785439F415278214D746 /* TeraObservationCoalescingTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TeraObservationCoalescingTests.swift; sourceTree = "<group>"; };
226F5C2370522AAFAD9D1C3D /* TeraRuntimeResourceLifecycleTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TeraRuntimeResourceLifecycleTests.swift; sourceTree = "<group>"; };
2521493B0CD2B82445974E81 /* TeraMediaOwnershipFFITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TeraMediaOwnershipFFITests.swift; sourceTree = "<group>"; };
@@ -311,6 +313,7 @@
B310FD8CCA9F9C2DA19BE8CF /* TeraEditingReplacementFFITests.swift */,
0F97ECE43BB7028B5A497720 /* TeraEditingReplacementTests.swift */,
93A3358AFC23C567DB9CB02F /* TeraErrorRecoveryTests.swift */,
+ 217E44A3221756EC904702D6 /* TeraLateSigningTests.swift */,
C890BDE885536BC2AB215393 /* TeraLifecycleTests.swift */,
F596D3A9B9E236963DCE15D7 /* TeraMediaBudgetTests.swift */,
D3C914B349DAE2EF66658229 /* TeraMediaFileFixture.swift */,
@@ -600,6 +603,7 @@
888B178679E012BB053FE31B /* TeraEditingReplacementFFITests.swift in Sources */,
7B8C7C130DC15AF0266F2544 /* TeraEditingReplacementTests.swift in Sources */,
D918A664D9A4B9859A1A6503 /* TeraErrorRecoveryTests.swift in Sources */,
+ F13090A3350CAE9CA3FFF3F3 /* TeraLateSigningTests.swift in Sources */,
671EF50DB4EFBC25AABF26DC /* TeraLifecycleTests.swift in Sources */,
85404A5125CF3E64E6009DC1 /* TeraMediaBudgetTests.swift in Sources */,
D64AC2FDC6FE05A39114D2DB /* TeraMediaFileFixture.swift in Sources */,
diff --git a/Tera/Runtime/TeraGeneratedHostSigner.swift b/Tera/Runtime/TeraGeneratedHostSigner.swift
@@ -0,0 +1,125 @@
+import Foundation
+import TeraKitBindings
+
+final class TeraGeneratedHostSigner: TeraHostSigner, @unchecked Sendable {
+ typealias QualificationEvidenceRecorder = @Sendable (HostSigningRequest, String) throws -> Void
+
+ private let signer: any TeraRuntimeSigner
+ private let clock: TeraClock
+ private let qualificationEvidenceRecorder: QualificationEvidenceRecorder
+
+ init(
+ signer: any TeraRuntimeSigner,
+ clock: TeraClock = .system,
+ qualificationEvidenceRecorder: @escaping QualificationEvidenceRecorder =
+ TeraRemoteQualificationEvidence.recordBlossomAuthorization
+ ) {
+ self.signer = signer
+ self.clock = clock
+ self.qualificationEvidenceRecorder = qualificationEvidenceRecorder
+ }
+
+ func signerStatus() async -> SignerStatusRecord {
+ await SignerStatusRecord(
+ schemaVersion: 1,
+ availability: signer.availability().generatedValue
+ )
+ }
+
+ func sign(request: HostSigningRequest) async -> HostSigningResult {
+ guard (try? clock.unixMilliseconds()) != nil else {
+ return failedSigningResult(for: request)
+ }
+ let purpose = request.purpose.appValue
+ let outcome = await signer.sign(
+ TeraRuntimeSigningRequest(
+ operationID: request.operationId,
+ signerRequestID: request.signerRequestId,
+ publicKeyHex: request.publicKey,
+ purpose: purpose,
+ deadlineUnixMilliseconds: request.deadlineUnixMs,
+ digest: request.eventIdDigest
+ )
+ )
+ #if DEBUG
+ if request.purpose == .blossomUpload,
+ let signatureHex = outcome.signatureHex
+ {
+ do {
+ try qualificationEvidenceRecorder(request, signatureHex)
+ } catch {
+ return failedSigningResult(for: request)
+ }
+ }
+ #endif
+ let completedAtUnixMilliseconds = try? clock.unixMilliseconds()
+ guard completedAtUnixMilliseconds != nil || (request.purpose == .nostrEvent && outcome.signatureHex != nil) else {
+ return failedSigningResult(for: request)
+ }
+ return HostSigningResult(
+ schemaVersion: 1,
+ outcome: outcome.generatedOutcome,
+ operationId: request.operationId,
+ signerRequestId: request.signerRequestId,
+ publicKey: request.publicKey,
+ purpose: request.purpose,
+ signatureHex: outcome.signatureHex,
+ completedAtUnixMs: completedAtUnixMilliseconds ?? 0
+ )
+ }
+
+ private func failedSigningResult(for request: HostSigningRequest) -> HostSigningResult {
+ HostSigningResult(
+ schemaVersion: 1,
+ outcome: .failed,
+ operationId: request.operationId,
+ signerRequestId: request.signerRequestId,
+ publicKey: request.publicKey,
+ purpose: request.purpose,
+ signatureHex: nil,
+ completedAtUnixMs: 0
+ )
+ }
+}
+
+extension TeraRuntimeSignerAvailability {
+ fileprivate var generatedValue: SignerAvailabilityRecord {
+ switch self {
+ case .ready: .ready
+ case .busy: .busy
+ case .locked: .locked
+ case .unavailable: .unavailable
+ }
+ }
+}
+
+extension HostSigningPurpose {
+ fileprivate var appValue: TeraRuntimeSigningPurpose {
+ switch self {
+ case .nostrEvent: .nostrEvent
+ case .blossomUpload: .blossomUpload
+ }
+ }
+}
+
+extension TeraRuntimeSigningOutcome {
+ fileprivate var generatedOutcome: HostSigningOutcome {
+ switch self {
+ case .signed: .signed
+ case .locked: .locked
+ case .cancelled: .cancelled
+ case .rejected: .rejected
+ case .timedOut: .timedOut
+ case .unavailable: .unavailable
+ case .invalidated: .invalidated
+ case .failed: .failed
+ }
+ }
+
+ fileprivate var signatureHex: String? {
+ if case let .signed(signatureHex) = self {
+ return signatureHex
+ }
+ return nil
+ }
+}
diff --git a/Tera/Runtime/TeraGeneratedRuntimeBackend.swift b/Tera/Runtime/TeraGeneratedRuntimeBackend.swift
@@ -1,86 +1,6 @@
import Foundation
import TeraKitBindings
-final class TeraGeneratedHostSigner: TeraHostSigner, @unchecked Sendable {
- typealias QualificationEvidenceRecorder = @Sendable (HostSigningRequest, String) throws -> Void
-
- private let signer: any TeraRuntimeSigner
- private let clock: TeraClock
- private let qualificationEvidenceRecorder: QualificationEvidenceRecorder
-
- init(
- signer: any TeraRuntimeSigner,
- clock: TeraClock = .system,
- qualificationEvidenceRecorder: @escaping QualificationEvidenceRecorder =
- TeraRemoteQualificationEvidence.recordBlossomAuthorization
- ) {
- self.signer = signer
- self.clock = clock
- self.qualificationEvidenceRecorder = qualificationEvidenceRecorder
- }
-
- func signerStatus() async -> SignerStatusRecord {
- await SignerStatusRecord(
- schemaVersion: 1,
- availability: signer.availability().generatedValue
- )
- }
-
- func sign(request: HostSigningRequest) async -> HostSigningResult {
- guard (try? clock.unixMilliseconds()) != nil else {
- return failedSigningResult(for: request)
- }
- let purpose = request.purpose.appValue
- let outcome = await signer.sign(
- TeraRuntimeSigningRequest(
- operationID: request.operationId,
- signerRequestID: request.signerRequestId,
- publicKeyHex: request.publicKey,
- purpose: purpose,
- deadlineUnixMilliseconds: request.deadlineUnixMs,
- digest: request.eventIdDigest
- )
- )
- #if DEBUG
- if request.purpose == .blossomUpload,
- let signatureHex = outcome.signatureHex
- {
- do {
- try qualificationEvidenceRecorder(request, signatureHex)
- } catch {
- return failedSigningResult(for: request)
- }
- }
- #endif
- guard let completedAtUnixMilliseconds = try? clock.unixMilliseconds() else {
- return failedSigningResult(for: request)
- }
- return HostSigningResult(
- schemaVersion: 1,
- outcome: outcome.generatedOutcome,
- operationId: request.operationId,
- signerRequestId: request.signerRequestId,
- publicKey: request.publicKey,
- purpose: request.purpose,
- signatureHex: outcome.signatureHex,
- completedAtUnixMs: completedAtUnixMilliseconds
- )
- }
-
- private func failedSigningResult(for request: HostSigningRequest) -> HostSigningResult {
- HostSigningResult(
- schemaVersion: 1,
- outcome: .failed,
- operationId: request.operationId,
- signerRequestId: request.signerRequestId,
- publicKey: request.publicKey,
- purpose: request.purpose,
- signatureHex: nil,
- completedAtUnixMs: 0
- )
- }
-}
-
private actor TeraGeneratedSubscriptionToken: TeraRuntimeSubscriptionToken {
private var handle: FfiSubscriptionHandle?
private var observer: TeraGeneratedRuntimeObserver?
@@ -659,48 +579,6 @@ extension TeraBlossomEndpointAuthority {
}
}
-extension TeraRuntimeSignerAvailability {
- fileprivate var generatedValue: SignerAvailabilityRecord {
- switch self {
- case .ready: .ready
- case .busy: .busy
- case .locked: .locked
- case .unavailable: .unavailable
- }
- }
-}
-
-extension HostSigningPurpose {
- fileprivate var appValue: TeraRuntimeSigningPurpose {
- switch self {
- case .nostrEvent: .nostrEvent
- case .blossomUpload: .blossomUpload
- }
- }
-}
-
-extension TeraRuntimeSigningOutcome {
- fileprivate var generatedOutcome: HostSigningOutcome {
- switch self {
- case .signed: .signed
- case .locked: .locked
- case .cancelled: .cancelled
- case .rejected: .rejected
- case .timedOut: .timedOut
- case .unavailable: .unavailable
- case .invalidated: .invalidated
- case .failed: .failed
- }
- }
-
- fileprivate var signatureHex: String? {
- if case let .signed(signatureHex) = self {
- return signatureHex
- }
- return nil
- }
-}
-
extension TeraRuntimeClient {
static func production() -> TeraRuntimeClient {
TeraRuntimeClient { configuration in
diff --git a/Tera/Runtime/TeraRuntimeClientSubmission.swift b/Tera/Runtime/TeraRuntimeClientSubmission.swift
@@ -8,7 +8,7 @@ extension TeraRuntimeClient {
}
func submissionStatus(request: TeraSubmissionRequest) async throws -> TeraSubmissionStatus {
- try await addOperation("runtime.submission.status", submission: true) { try await $0.submissionStatus(request: request) }
+ try await addOperation("runtime.submission.status") { try await $0.submissionStatus(request: request) }
}
func advanceSubmission(request: TeraSubmissionRequest, expectedRevision: UInt64) async throws -> TeraSubmissionStatus {
diff --git a/TeraFFI/provenance.json b/TeraFFI/provenance.json
@@ -22,9 +22,9 @@
"sha256": "3ed9b7ece2f86e5b5d1ddc6ecbb97deb49c46ca2ea91a930eaec1b580232345c"
},
{
- "bytes": 75585568,
+ "bytes": 75621464,
"path": "TeraFFI.xcframework/ios-arm64-simulator/libtera_ffi.a",
- "sha256": "907872b38d2000788658554cdcdd03980646a153d2c89be0dfed21048115b3a7"
+ "sha256": "e370fe73646fd24fe011a571daf385f882cf864772f5d56ce18cb3d4629aca47"
},
{
"bytes": 79037,
@@ -37,9 +37,9 @@
"sha256": "3ed9b7ece2f86e5b5d1ddc6ecbb97deb49c46ca2ea91a930eaec1b580232345c"
},
{
- "bytes": 75657248,
+ "bytes": 75690040,
"path": "TeraFFI.xcframework/ios-arm64/libtera_ffi.a",
- "sha256": "97350de7fc98e37aaf29acd205aadb22d5cb63a380afacddfc329bb8fc77428d"
+ "sha256": "d370f6798628cb753e4ab85b278a89787909848e928d39abefb435ae8ea36d16"
},
{
"bytes": 47998,
@@ -62,9 +62,9 @@
"sha256": "3ed9b7ece2f86e5b5d1ddc6ecbb97deb49c46ca2ea91a930eaec1b580232345c"
},
{
- "bytes": 631744,
+ "bytes": 632128,
"path": "generated/TeraKitBindings.swift",
- "sha256": "833e170b33bf93a3296b242d53e0d491ccd4ffda69bb9f52f215eebe49c4e9f9"
+ "sha256": "7048319be83aff6578502f4d21ea288f645d4a122b5db6ff6d26299770205ee2"
},
{
"bytes": 79037,
@@ -77,34 +77,34 @@
"sha256": "3ed9b7ece2f86e5b5d1ddc6ecbb97deb49c46ca2ea91a930eaec1b580232345c"
},
{
- "bytes": 21432560,
+ "bytes": 21460928,
"path": "native/aarch64-apple-darwin/libtera_ffi.dylib",
- "sha256": "99916ff625f5235dc108923357138e3c04fd8bd62fdfa253ebdb5c23cf1f7cb5"
+ "sha256": "84bf9d6340e23de489995bc318674cedcc90965333b1159565f093107811ab80"
},
{
- "bytes": 75585568,
+ "bytes": 75621464,
"path": "native/aarch64-apple-ios-sim/libtera_ffi.a",
- "sha256": "907872b38d2000788658554cdcdd03980646a153d2c89be0dfed21048115b3a7"
+ "sha256": "e370fe73646fd24fe011a571daf385f882cf864772f5d56ce18cb3d4629aca47"
},
{
- "bytes": 75657248,
+ "bytes": 75690040,
"path": "native/aarch64-apple-ios/libtera_ffi.a",
- "sha256": "97350de7fc98e37aaf29acd205aadb22d5cb63a380afacddfc329bb8fc77428d"
+ "sha256": "d370f6798628cb753e4ab85b278a89787909848e928d39abefb435ae8ea36d16"
},
{
- "bytes": 94518,
+ "bytes": 95338,
"path": "source/aarch64-apple-darwin.json",
- "sha256": "a23138d28fa402dadb92bfc7f7c23006d5b49b60f8317704bd5596dcaac8f74b"
+ "sha256": "04e48f8da1031d46a26c6351dac11f6142b494a549937977b3c3f0f864fa70dc"
},
{
- "bytes": 94362,
+ "bytes": 95182,
"path": "source/aarch64-apple-ios-sim.json",
- "sha256": "9c058ad196e603afa1a306cfe9f1bd847e1e24fc721d790af6b36b980c7db68e"
+ "sha256": "f4feb2bbf66ef1618f81aa8ff6313c1aa0e891e92cbc29e6b4f8d0aa90c4396d"
},
{
- "bytes": 94358,
+ "bytes": 95178,
"path": "source/aarch64-apple-ios.json",
- "sha256": "42bb127ef49e2f6efd8fc54bcf7289bff2309a7c79247d161cbfcacb15167759"
+ "sha256": "95fae99c8ed84159c16b483f5ac73de76cf8bc188187c1811b0eeec70443d3fc"
}
],
"language": "swift",
@@ -112,7 +112,7 @@
"schema": "radroots.artifact-manifest.v2",
"source": {
"repository": "https://github.com/radrootslabs/tera",
- "tree": "1daa4095adf3f27c9156af9f073d4271120f6295"
+ "tree": "ab88093ebe0fee1d20a0fbbd7d2d72a6d1f34325"
},
"source_records": {
"aarch64-apple-darwin": "source/aarch64-apple-darwin.json",
@@ -139,9 +139,9 @@
"sha256": "3ed9b7ece2f86e5b5d1ddc6ecbb97deb49c46ca2ea91a930eaec1b580232345c"
},
{
- "bytes": 75585568,
+ "bytes": 75621464,
"path": "Tera/Frameworks/TeraFFI.xcframework/ios-arm64-simulator/libtera_ffi.a",
- "sha256": "907872b38d2000788658554cdcdd03980646a153d2c89be0dfed21048115b3a7"
+ "sha256": "e370fe73646fd24fe011a571daf385f882cf864772f5d56ce18cb3d4629aca47"
},
{
"bytes": 79037,
@@ -154,14 +154,14 @@
"sha256": "3ed9b7ece2f86e5b5d1ddc6ecbb97deb49c46ca2ea91a930eaec1b580232345c"
},
{
- "bytes": 75657248,
+ "bytes": 75690040,
"path": "Tera/Frameworks/TeraFFI.xcframework/ios-arm64/libtera_ffi.a",
- "sha256": "97350de7fc98e37aaf29acd205aadb22d5cb63a380afacddfc329bb8fc77428d"
+ "sha256": "d370f6798628cb753e4ab85b278a89787909848e928d39abefb435ae8ea36d16"
},
{
- "bytes": 631744,
+ "bytes": 632128,
"path": "Tera/Generated/TeraKitBindings.swift",
- "sha256": "833e170b33bf93a3296b242d53e0d491ccd4ffda69bb9f52f215eebe49c4e9f9"
+ "sha256": "7048319be83aff6578502f4d21ea288f645d4a122b5db6ff6d26299770205ee2"
},
{
"bytes": 47998,
@@ -174,19 +174,19 @@
"sha256": "79c86a44fd77c30b5b55d209cf356d01e6c4b60fe6d1f8aa33cccc5029a58aa4"
},
{
- "bytes": 94518,
+ "bytes": 95338,
"path": "TeraFFI/source/aarch64-apple-darwin.json",
- "sha256": "a23138d28fa402dadb92bfc7f7c23006d5b49b60f8317704bd5596dcaac8f74b"
+ "sha256": "04e48f8da1031d46a26c6351dac11f6142b494a549937977b3c3f0f864fa70dc"
},
{
- "bytes": 94362,
+ "bytes": 95182,
"path": "TeraFFI/source/aarch64-apple-ios-sim.json",
- "sha256": "9c058ad196e603afa1a306cfe9f1bd847e1e24fc721d790af6b36b980c7db68e"
+ "sha256": "f4feb2bbf66ef1618f81aa8ff6313c1aa0e891e92cbc29e6b4f8d0aa90c4396d"
},
{
- "bytes": 94358,
+ "bytes": 95178,
"path": "TeraFFI/source/aarch64-apple-ios.json",
- "sha256": "42bb127ef49e2f6efd8fc54bcf7289bff2309a7c79247d161cbfcacb15167759"
+ "sha256": "95fae99c8ed84159c16b483f5ac73de76cf8bc188187c1811b0eeec70443d3fc"
}
],
"schema": "tera.installed-native-artifacts.v1"
diff --git a/TeraFFI/source.lock b/TeraFFI/source.lock
@@ -1,10 +1,10 @@
schema = "tera.installed-source.v1"
repository = "https://github.com/radrootslabs/tera"
-source_tree = "1daa4095adf3f27c9156af9f073d4271120f6295"
-manifest_sha256 = "f99a56fe78ba17464373e6cc3599ca98adaa4235a4f502faf9be5a487c0d8779"
+source_tree = "ab88093ebe0fee1d20a0fbbd7d2d72a6d1f34325"
+manifest_sha256 = "5eea0a40f2954238ac356da87d602aa4088813ab03a653ed50b2b7e30fea08a2"
source_date_epoch = 1787871027
[foundation]
repository = "https://github.com/radrootslabs/lib"
-revision = "e528bd0be26bdaa25266859ce139f59903b43f3f"
+revision = "f578069cf894b34695bdf0ed2298e0aa162b5c13"
version = "0.1.0-alpha"
diff --git a/TeraFFI/source/aarch64-apple-darwin.json b/TeraFFI/source/aarch64-apple-darwin.json
@@ -186,36 +186,36 @@
"proc-macro2 v1.0.107|default,proc-macro (*)",
"quote v1.0.47|default,proc-macro",
"quote v1.0.47|default,proc-macro (*)",
- "radroots_blossom v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0b)|serde,std",
- "radroots_blossom v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0b)|serde,std (*)",
- "radroots_core v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0b)|serde,std",
- "radroots_core v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0b)|serde,std (*)",
- "radroots_event v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0b)|serde,std",
- "radroots_event v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0b)|serde,std (*)",
- "radroots_event_codec v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0b)|json,serde,std",
- "radroots_event_codec v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0b)|json,serde,std (*)",
- "radroots_identity v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0b)|serde,std",
- "radroots_identity v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0b)|serde,std (*)",
- "radroots_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0b)|blossom,events,std",
- "radroots_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0b)|blossom,events,std (*)",
- "radroots_protocol v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0b)|serde,std",
- "radroots_protocol v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0b)|serde,std (*)",
- "radroots_sdk v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0b)|blossom,nostr,sqlite,sync",
- "radroots_sdk v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0b)|blossom,nostr,sqlite,sync (*)",
- "radroots_secrets v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0b)|",
- "radroots_signing v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0b)|serde,std",
- "radroots_signing v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0b)|serde,std (*)",
- "radroots_storage v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0b)|serde",
- "radroots_storage v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0b)|serde (*)",
- "radroots_storage_sqlite v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0b)|",
- "radroots_sync v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0b)|",
- "radroots_sync v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0b)| (*)",
- "radroots_trade v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0b)|json,serde,std",
- "radroots_trade v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0b)|json,serde,std (*)",
- "radroots_transport v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0b)|serde,std",
- "radroots_transport v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0b)|serde,std (*)",
- "radroots_transport_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0b)|",
- "radroots_transport_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0b)| (*)",
+ "radroots_blossom v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069c)|serde,std",
+ "radroots_blossom v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069c)|serde,std (*)",
+ "radroots_core v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069c)|serde,std",
+ "radroots_core v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069c)|serde,std (*)",
+ "radroots_event v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069c)|serde,std",
+ "radroots_event v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069c)|serde,std (*)",
+ "radroots_event_codec v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069c)|json,serde,std",
+ "radroots_event_codec v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069c)|json,serde,std (*)",
+ "radroots_identity v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069c)|serde,std",
+ "radroots_identity v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069c)|serde,std (*)",
+ "radroots_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069c)|blossom,events,std",
+ "radroots_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069c)|blossom,events,std (*)",
+ "radroots_protocol v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069c)|serde,std",
+ "radroots_protocol v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069c)|serde,std (*)",
+ "radroots_sdk v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069c)|blossom,nostr,sqlite,sync",
+ "radroots_sdk v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069c)|blossom,nostr,sqlite,sync (*)",
+ "radroots_secrets v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069c)|",
+ "radroots_signing v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069c)|serde,std",
+ "radroots_signing v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069c)|serde,std (*)",
+ "radroots_storage v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069c)|serde",
+ "radroots_storage v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069c)|serde (*)",
+ "radroots_storage_sqlite v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069c)|",
+ "radroots_sync v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069c)|",
+ "radroots_sync v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069c)| (*)",
+ "radroots_trade v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069c)|json,serde,std",
+ "radroots_trade v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069c)|json,serde,std (*)",
+ "radroots_transport v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069c)|serde,std",
+ "radroots_transport v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069c)|serde,std (*)",
+ "radroots_transport_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069c)|",
+ "radroots_transport_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069c)| (*)",
"rand v0.8.7|alloc,getrandom,libc,rand_chacha,std,std_rng",
"rand v0.9.5|alloc,default,os_rng,small_rng,std,std_rng,thread_rng",
"rand_chacha v0.3.1|std",
@@ -385,15 +385,15 @@
"symbol_reader": "llvm-nm, compatible with GNU nm\nLLVM (http://llvm.org/):\n LLVM version 22.1.6-rust-1.97.1-stable\n Optimized build.",
"target": "aarch64-apple-darwin"
},
- "cargo_lock_sha256": "202529ccbed5b11c60f9d1fe069f23ca0d94868ce16588e97554dbbba67c5a32",
+ "cargo_lock_sha256": "ef6dba164299dc28990d220d4e62cd587ea25c2a56c584c1b056ab22741bcc6b",
"disposition": "local_staged_source_only",
"foundation": {
"architecture": "radroots.crates.release.v2",
- "lockfile_sha256": "202529ccbed5b11c60f9d1fe069f23ca0d94868ce16588e97554dbbba67c5a32",
+ "lockfile_sha256": "ef6dba164299dc28990d220d4e62cd587ea25c2a56c584c1b056ab22741bcc6b",
"repository": "https://github.com/radrootslabs/lib",
- "revision": "e528bd0be26bdaa25266859ce139f59903b43f3f",
+ "revision": "f578069cf894b34695bdf0ed2298e0aa162b5c13",
"schema": "radroots.lib.source-lock.v1",
- "source_archive_sha256": "f24060d4fbf04d418f81f335d64f6a030a9bc8ea81ab79d6f9cecf876e35c507",
+ "source_archive_sha256": "bf33fb5999c52c26436596b80b7428450f84719190785aa6e83177d94a130ff9",
"version": "0.1.0-alpha",
"workspace_catalog_sha256": "ee295f2352e2577a4052d980624415aec9871197d4fc9910a4c21c83a9179200"
},
@@ -502,15 +502,15 @@
"files": {
"Cargo.lock": {
"bytes": 94853,
- "git_blob": "6623eab86e41386d1019047f9a28c6524e5ff2cc",
+ "git_blob": "f81d55e94c3a09b282c85abefb55720a1f92e4d6",
"mode": "100644",
- "sha256": "202529ccbed5b11c60f9d1fe069f23ca0d94868ce16588e97554dbbba67c5a32"
+ "sha256": "ef6dba164299dc28990d220d4e62cd587ea25c2a56c584c1b056ab22741bcc6b"
},
"Cargo.toml": {
"bytes": 4442,
- "git_blob": "e10fcd524ce7add616a0ce136d065c098f366f5f",
+ "git_blob": "1ad2512253eb3a215017b583e22d9e6371e632b2",
"mode": "100644",
- "sha256": "c730168722394021df54a75c9fd40e3d7de24721f5a8bc2345e5b9f2a6757632"
+ "sha256": "eff1ff40591ecf76d4aa32865cb2fa1688ab2658b644f800874c1871887a6aa8"
},
"Makefile": {
"bytes": 3934,
@@ -1377,10 +1377,16 @@
"sha256": "d49788780b2750bfdbd4f04fdaa10fbde91be1a98e4a73f1e35f117890814d8b"
},
"core/crates/tera_ffi/src/signer.rs": {
- "bytes": 13853,
- "git_blob": "1969c4f3d8896a893f2dc964a12a8a960490890f",
+ "bytes": 15963,
+ "git_blob": "11db3254ad5ecb139dbcb894123ff43561080b57",
"mode": "100644",
- "sha256": "4c0800499f248e61011f7ffe78968e0d8afb13ddfe2332390fb25de444f7e6b7"
+ "sha256": "2d32d68d4d8080bbdad439c348eab26b82f7e7e242daff2afed33305045e88c7"
+ },
+ "core/crates/tera_ffi/src/signer/evidence_tests.rs": {
+ "bytes": 6256,
+ "git_blob": "97914aca4db31acac8cba306ba597a9649a354ea",
+ "mode": "100644",
+ "sha256": "9cb7d20bd2183a3a94d36ea5eee2084cef35acc771baab1f5be293fc11ac3c0d"
},
"core/crates/tera_ffi/src/submission.rs": {
"bytes": 5191,
@@ -1508,6 +1514,12 @@
"mode": "100644",
"sha256": "e346ffef5eeb4c5aaf4de88db6cec7760a919da67a6deec1afe7e55ee48b5e6b"
},
+ "core/crates/tera_ffi/tests/submission_late_signing.rs": {
+ "bytes": 7998,
+ "git_blob": "59609f29e3464015d7b9ef9e69f21f331d5c3199",
+ "mode": "100644",
+ "sha256": "af4d50b2df36574f9ce59f4090c1d961f2ae04e2a3187c112cfe477a2c7cda1e"
+ },
"core/crates/tera_ffi/tests/submission_operation_contract.rs": {
"bytes": 8349,
"git_blob": "46af0553f7bb7b4a01a3cb2ddbb5fd6098251b55",
@@ -1694,11 +1706,17 @@
"mode": "100644",
"sha256": "67dcbfafa8b2736b0b82c3a22bb33cc4005327e1bd54bd451d82a458e35c00b5"
},
+ "core/test-fixtures/tera_ffi/signing_evidence_decision.v1.json": {
+ "bytes": 2203,
+ "git_blob": "b5cdd8f1b1dec1beeed06ff060c06511ddb7511c",
+ "mode": "100644",
+ "sha256": "ff0af780a2ed66099f6e207058f9c5523aa9789c69722ddd026ab95d3a1852f9"
+ },
"radroots.lib.source-lock.v1.toml": {
"bytes": 482,
- "git_blob": "5f85618326d3521513383d11c415d8940e7091a5",
+ "git_blob": "03045145f76dd58bb47342f2366f413d19479a8d",
"mode": "100644",
- "sha256": "ec8532030b8bb9367bb882f439f3bb8ea15dd6ca3d6df36dc3c121fff770454d"
+ "sha256": "6ff184d3eb8b646d5d9b18685351e95b01f28a31c87802347a3bdc76ffa8291b"
},
"rust-toolchain.toml": {
"bytes": 79,
@@ -2019,13 +2037,13 @@
"sha256": "b052a73a824e8f8b26af2646a4758f13655e04de9551a8271890d3cf2b63209d"
},
"test-fixtures/legacy-identifiers.v1.json": {
- "bytes": 134540,
- "git_blob": "65653d77a42b56e472da03e38dbc76f568a84340",
+ "bytes": 135492,
+ "git_blob": "c7ee97d8cd9ec972a54023b120d62e1ceb7869a8",
"mode": "100644",
- "sha256": "0a5f18d3ce7fcdec536dd72504b1e1556d9458d8e215bb54bfd888ad582d7e8c"
+ "sha256": "bf36b452029fe610c213b2d31af0b067dd569e63acaac21e7b09926275978a2f"
}
},
"policy": "staged_inputs",
- "tree": "1daa4095adf3f27c9156af9f073d4271120f6295"
+ "tree": "ab88093ebe0fee1d20a0fbbd7d2d72a6d1f34325"
}
}
diff --git a/TeraFFI/source/aarch64-apple-ios-sim.json b/TeraFFI/source/aarch64-apple-ios-sim.json
@@ -186,36 +186,36 @@
"proc-macro2 v1.0.107|default,proc-macro (*)",
"quote v1.0.47|default,proc-macro",
"quote v1.0.47|default,proc-macro (*)",
- "radroots_blossom v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0b)|serde,std",
- "radroots_blossom v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0b)|serde,std (*)",
- "radroots_core v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0b)|serde,std",
- "radroots_core v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0b)|serde,std (*)",
- "radroots_event v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0b)|serde,std",
- "radroots_event v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0b)|serde,std (*)",
- "radroots_event_codec v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0b)|json,serde,std",
- "radroots_event_codec v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0b)|json,serde,std (*)",
- "radroots_identity v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0b)|serde,std",
- "radroots_identity v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0b)|serde,std (*)",
- "radroots_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0b)|blossom,events,std",
- "radroots_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0b)|blossom,events,std (*)",
- "radroots_protocol v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0b)|serde,std",
- "radroots_protocol v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0b)|serde,std (*)",
- "radroots_sdk v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0b)|blossom,nostr,sqlite,sync",
- "radroots_sdk v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0b)|blossom,nostr,sqlite,sync (*)",
- "radroots_secrets v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0b)|",
- "radroots_signing v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0b)|serde,std",
- "radroots_signing v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0b)|serde,std (*)",
- "radroots_storage v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0b)|serde",
- "radroots_storage v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0b)|serde (*)",
- "radroots_storage_sqlite v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0b)|",
- "radroots_sync v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0b)|",
- "radroots_sync v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0b)| (*)",
- "radroots_trade v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0b)|json,serde,std",
- "radroots_trade v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0b)|json,serde,std (*)",
- "radroots_transport v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0b)|serde,std",
- "radroots_transport v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0b)|serde,std (*)",
- "radroots_transport_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0b)|",
- "radroots_transport_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0b)| (*)",
+ "radroots_blossom v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069c)|serde,std",
+ "radroots_blossom v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069c)|serde,std (*)",
+ "radroots_core v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069c)|serde,std",
+ "radroots_core v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069c)|serde,std (*)",
+ "radroots_event v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069c)|serde,std",
+ "radroots_event v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069c)|serde,std (*)",
+ "radroots_event_codec v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069c)|json,serde,std",
+ "radroots_event_codec v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069c)|json,serde,std (*)",
+ "radroots_identity v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069c)|serde,std",
+ "radroots_identity v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069c)|serde,std (*)",
+ "radroots_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069c)|blossom,events,std",
+ "radroots_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069c)|blossom,events,std (*)",
+ "radroots_protocol v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069c)|serde,std",
+ "radroots_protocol v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069c)|serde,std (*)",
+ "radroots_sdk v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069c)|blossom,nostr,sqlite,sync",
+ "radroots_sdk v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069c)|blossom,nostr,sqlite,sync (*)",
+ "radroots_secrets v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069c)|",
+ "radroots_signing v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069c)|serde,std",
+ "radroots_signing v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069c)|serde,std (*)",
+ "radroots_storage v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069c)|serde",
+ "radroots_storage v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069c)|serde (*)",
+ "radroots_storage_sqlite v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069c)|",
+ "radroots_sync v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069c)|",
+ "radroots_sync v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069c)| (*)",
+ "radroots_trade v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069c)|json,serde,std",
+ "radroots_trade v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069c)|json,serde,std (*)",
+ "radroots_transport v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069c)|serde,std",
+ "radroots_transport v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069c)|serde,std (*)",
+ "radroots_transport_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069c)|",
+ "radroots_transport_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069c)| (*)",
"rand v0.8.7|alloc,getrandom,libc,rand_chacha,std,std_rng",
"rand v0.9.5|alloc,default,os_rng,small_rng,std,std_rng,thread_rng",
"rand_chacha v0.3.1|std",
@@ -381,15 +381,15 @@
"symbol_reader": "llvm-nm, compatible with GNU nm\nLLVM (http://llvm.org/):\n LLVM version 22.1.6-rust-1.97.1-stable\n Optimized build.",
"target": "aarch64-apple-ios-sim"
},
- "cargo_lock_sha256": "202529ccbed5b11c60f9d1fe069f23ca0d94868ce16588e97554dbbba67c5a32",
+ "cargo_lock_sha256": "ef6dba164299dc28990d220d4e62cd587ea25c2a56c584c1b056ab22741bcc6b",
"disposition": "local_staged_source_only",
"foundation": {
"architecture": "radroots.crates.release.v2",
- "lockfile_sha256": "202529ccbed5b11c60f9d1fe069f23ca0d94868ce16588e97554dbbba67c5a32",
+ "lockfile_sha256": "ef6dba164299dc28990d220d4e62cd587ea25c2a56c584c1b056ab22741bcc6b",
"repository": "https://github.com/radrootslabs/lib",
- "revision": "e528bd0be26bdaa25266859ce139f59903b43f3f",
+ "revision": "f578069cf894b34695bdf0ed2298e0aa162b5c13",
"schema": "radroots.lib.source-lock.v1",
- "source_archive_sha256": "f24060d4fbf04d418f81f335d64f6a030a9bc8ea81ab79d6f9cecf876e35c507",
+ "source_archive_sha256": "bf33fb5999c52c26436596b80b7428450f84719190785aa6e83177d94a130ff9",
"version": "0.1.0-alpha",
"workspace_catalog_sha256": "ee295f2352e2577a4052d980624415aec9871197d4fc9910a4c21c83a9179200"
},
@@ -498,15 +498,15 @@
"files": {
"Cargo.lock": {
"bytes": 94853,
- "git_blob": "6623eab86e41386d1019047f9a28c6524e5ff2cc",
+ "git_blob": "f81d55e94c3a09b282c85abefb55720a1f92e4d6",
"mode": "100644",
- "sha256": "202529ccbed5b11c60f9d1fe069f23ca0d94868ce16588e97554dbbba67c5a32"
+ "sha256": "ef6dba164299dc28990d220d4e62cd587ea25c2a56c584c1b056ab22741bcc6b"
},
"Cargo.toml": {
"bytes": 4442,
- "git_blob": "e10fcd524ce7add616a0ce136d065c098f366f5f",
+ "git_blob": "1ad2512253eb3a215017b583e22d9e6371e632b2",
"mode": "100644",
- "sha256": "c730168722394021df54a75c9fd40e3d7de24721f5a8bc2345e5b9f2a6757632"
+ "sha256": "eff1ff40591ecf76d4aa32865cb2fa1688ab2658b644f800874c1871887a6aa8"
},
"Makefile": {
"bytes": 3934,
@@ -1373,10 +1373,16 @@
"sha256": "d49788780b2750bfdbd4f04fdaa10fbde91be1a98e4a73f1e35f117890814d8b"
},
"core/crates/tera_ffi/src/signer.rs": {
- "bytes": 13853,
- "git_blob": "1969c4f3d8896a893f2dc964a12a8a960490890f",
+ "bytes": 15963,
+ "git_blob": "11db3254ad5ecb139dbcb894123ff43561080b57",
"mode": "100644",
- "sha256": "4c0800499f248e61011f7ffe78968e0d8afb13ddfe2332390fb25de444f7e6b7"
+ "sha256": "2d32d68d4d8080bbdad439c348eab26b82f7e7e242daff2afed33305045e88c7"
+ },
+ "core/crates/tera_ffi/src/signer/evidence_tests.rs": {
+ "bytes": 6256,
+ "git_blob": "97914aca4db31acac8cba306ba597a9649a354ea",
+ "mode": "100644",
+ "sha256": "9cb7d20bd2183a3a94d36ea5eee2084cef35acc771baab1f5be293fc11ac3c0d"
},
"core/crates/tera_ffi/src/submission.rs": {
"bytes": 5191,
@@ -1504,6 +1510,12 @@
"mode": "100644",
"sha256": "e346ffef5eeb4c5aaf4de88db6cec7760a919da67a6deec1afe7e55ee48b5e6b"
},
+ "core/crates/tera_ffi/tests/submission_late_signing.rs": {
+ "bytes": 7998,
+ "git_blob": "59609f29e3464015d7b9ef9e69f21f331d5c3199",
+ "mode": "100644",
+ "sha256": "af4d50b2df36574f9ce59f4090c1d961f2ae04e2a3187c112cfe477a2c7cda1e"
+ },
"core/crates/tera_ffi/tests/submission_operation_contract.rs": {
"bytes": 8349,
"git_blob": "46af0553f7bb7b4a01a3cb2ddbb5fd6098251b55",
@@ -1690,11 +1702,17 @@
"mode": "100644",
"sha256": "67dcbfafa8b2736b0b82c3a22bb33cc4005327e1bd54bd451d82a458e35c00b5"
},
+ "core/test-fixtures/tera_ffi/signing_evidence_decision.v1.json": {
+ "bytes": 2203,
+ "git_blob": "b5cdd8f1b1dec1beeed06ff060c06511ddb7511c",
+ "mode": "100644",
+ "sha256": "ff0af780a2ed66099f6e207058f9c5523aa9789c69722ddd026ab95d3a1852f9"
+ },
"radroots.lib.source-lock.v1.toml": {
"bytes": 482,
- "git_blob": "5f85618326d3521513383d11c415d8940e7091a5",
+ "git_blob": "03045145f76dd58bb47342f2366f413d19479a8d",
"mode": "100644",
- "sha256": "ec8532030b8bb9367bb882f439f3bb8ea15dd6ca3d6df36dc3c121fff770454d"
+ "sha256": "6ff184d3eb8b646d5d9b18685351e95b01f28a31c87802347a3bdc76ffa8291b"
},
"rust-toolchain.toml": {
"bytes": 79,
@@ -2015,13 +2033,13 @@
"sha256": "b052a73a824e8f8b26af2646a4758f13655e04de9551a8271890d3cf2b63209d"
},
"test-fixtures/legacy-identifiers.v1.json": {
- "bytes": 134540,
- "git_blob": "65653d77a42b56e472da03e38dbc76f568a84340",
+ "bytes": 135492,
+ "git_blob": "c7ee97d8cd9ec972a54023b120d62e1ceb7869a8",
"mode": "100644",
- "sha256": "0a5f18d3ce7fcdec536dd72504b1e1556d9458d8e215bb54bfd888ad582d7e8c"
+ "sha256": "bf36b452029fe610c213b2d31af0b067dd569e63acaac21e7b09926275978a2f"
}
},
"policy": "staged_inputs",
- "tree": "1daa4095adf3f27c9156af9f073d4271120f6295"
+ "tree": "ab88093ebe0fee1d20a0fbbd7d2d72a6d1f34325"
}
}
diff --git a/TeraFFI/source/aarch64-apple-ios.json b/TeraFFI/source/aarch64-apple-ios.json
@@ -186,36 +186,36 @@
"proc-macro2 v1.0.107|default,proc-macro (*)",
"quote v1.0.47|default,proc-macro",
"quote v1.0.47|default,proc-macro (*)",
- "radroots_blossom v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0b)|serde,std",
- "radroots_blossom v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0b)|serde,std (*)",
- "radroots_core v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0b)|serde,std",
- "radroots_core v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0b)|serde,std (*)",
- "radroots_event v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0b)|serde,std",
- "radroots_event v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0b)|serde,std (*)",
- "radroots_event_codec v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0b)|json,serde,std",
- "radroots_event_codec v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0b)|json,serde,std (*)",
- "radroots_identity v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0b)|serde,std",
- "radroots_identity v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0b)|serde,std (*)",
- "radroots_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0b)|blossom,events,std",
- "radroots_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0b)|blossom,events,std (*)",
- "radroots_protocol v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0b)|serde,std",
- "radroots_protocol v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0b)|serde,std (*)",
- "radroots_sdk v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0b)|blossom,nostr,sqlite,sync",
- "radroots_sdk v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0b)|blossom,nostr,sqlite,sync (*)",
- "radroots_secrets v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0b)|",
- "radroots_signing v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0b)|serde,std",
- "radroots_signing v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0b)|serde,std (*)",
- "radroots_storage v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0b)|serde",
- "radroots_storage v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0b)|serde (*)",
- "radroots_storage_sqlite v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0b)|",
- "radroots_sync v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0b)|",
- "radroots_sync v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0b)| (*)",
- "radroots_trade v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0b)|json,serde,std",
- "radroots_trade v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0b)|json,serde,std (*)",
- "radroots_transport v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0b)|serde,std",
- "radroots_transport v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0b)|serde,std (*)",
- "radroots_transport_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0b)|",
- "radroots_transport_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0b)| (*)",
+ "radroots_blossom v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069c)|serde,std",
+ "radroots_blossom v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069c)|serde,std (*)",
+ "radroots_core v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069c)|serde,std",
+ "radroots_core v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069c)|serde,std (*)",
+ "radroots_event v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069c)|serde,std",
+ "radroots_event v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069c)|serde,std (*)",
+ "radroots_event_codec v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069c)|json,serde,std",
+ "radroots_event_codec v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069c)|json,serde,std (*)",
+ "radroots_identity v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069c)|serde,std",
+ "radroots_identity v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069c)|serde,std (*)",
+ "radroots_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069c)|blossom,events,std",
+ "radroots_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069c)|blossom,events,std (*)",
+ "radroots_protocol v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069c)|serde,std",
+ "radroots_protocol v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069c)|serde,std (*)",
+ "radroots_sdk v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069c)|blossom,nostr,sqlite,sync",
+ "radroots_sdk v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069c)|blossom,nostr,sqlite,sync (*)",
+ "radroots_secrets v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069c)|",
+ "radroots_signing v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069c)|serde,std",
+ "radroots_signing v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069c)|serde,std (*)",
+ "radroots_storage v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069c)|serde",
+ "radroots_storage v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069c)|serde (*)",
+ "radroots_storage_sqlite v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069c)|",
+ "radroots_sync v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069c)|",
+ "radroots_sync v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069c)| (*)",
+ "radroots_trade v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069c)|json,serde,std",
+ "radroots_trade v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069c)|json,serde,std (*)",
+ "radroots_transport v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069c)|serde,std",
+ "radroots_transport v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069c)|serde,std (*)",
+ "radroots_transport_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069c)|",
+ "radroots_transport_nostr v0.1.0-alpha (https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069c)| (*)",
"rand v0.8.7|alloc,getrandom,libc,rand_chacha,std,std_rng",
"rand v0.9.5|alloc,default,os_rng,small_rng,std,std_rng,thread_rng",
"rand_chacha v0.3.1|std",
@@ -381,15 +381,15 @@
"symbol_reader": "llvm-nm, compatible with GNU nm\nLLVM (http://llvm.org/):\n LLVM version 22.1.6-rust-1.97.1-stable\n Optimized build.",
"target": "aarch64-apple-ios"
},
- "cargo_lock_sha256": "202529ccbed5b11c60f9d1fe069f23ca0d94868ce16588e97554dbbba67c5a32",
+ "cargo_lock_sha256": "ef6dba164299dc28990d220d4e62cd587ea25c2a56c584c1b056ab22741bcc6b",
"disposition": "local_staged_source_only",
"foundation": {
"architecture": "radroots.crates.release.v2",
- "lockfile_sha256": "202529ccbed5b11c60f9d1fe069f23ca0d94868ce16588e97554dbbba67c5a32",
+ "lockfile_sha256": "ef6dba164299dc28990d220d4e62cd587ea25c2a56c584c1b056ab22741bcc6b",
"repository": "https://github.com/radrootslabs/lib",
- "revision": "e528bd0be26bdaa25266859ce139f59903b43f3f",
+ "revision": "f578069cf894b34695bdf0ed2298e0aa162b5c13",
"schema": "radroots.lib.source-lock.v1",
- "source_archive_sha256": "f24060d4fbf04d418f81f335d64f6a030a9bc8ea81ab79d6f9cecf876e35c507",
+ "source_archive_sha256": "bf33fb5999c52c26436596b80b7428450f84719190785aa6e83177d94a130ff9",
"version": "0.1.0-alpha",
"workspace_catalog_sha256": "ee295f2352e2577a4052d980624415aec9871197d4fc9910a4c21c83a9179200"
},
@@ -498,15 +498,15 @@
"files": {
"Cargo.lock": {
"bytes": 94853,
- "git_blob": "6623eab86e41386d1019047f9a28c6524e5ff2cc",
+ "git_blob": "f81d55e94c3a09b282c85abefb55720a1f92e4d6",
"mode": "100644",
- "sha256": "202529ccbed5b11c60f9d1fe069f23ca0d94868ce16588e97554dbbba67c5a32"
+ "sha256": "ef6dba164299dc28990d220d4e62cd587ea25c2a56c584c1b056ab22741bcc6b"
},
"Cargo.toml": {
"bytes": 4442,
- "git_blob": "e10fcd524ce7add616a0ce136d065c098f366f5f",
+ "git_blob": "1ad2512253eb3a215017b583e22d9e6371e632b2",
"mode": "100644",
- "sha256": "c730168722394021df54a75c9fd40e3d7de24721f5a8bc2345e5b9f2a6757632"
+ "sha256": "eff1ff40591ecf76d4aa32865cb2fa1688ab2658b644f800874c1871887a6aa8"
},
"Makefile": {
"bytes": 3934,
@@ -1373,10 +1373,16 @@
"sha256": "d49788780b2750bfdbd4f04fdaa10fbde91be1a98e4a73f1e35f117890814d8b"
},
"core/crates/tera_ffi/src/signer.rs": {
- "bytes": 13853,
- "git_blob": "1969c4f3d8896a893f2dc964a12a8a960490890f",
+ "bytes": 15963,
+ "git_blob": "11db3254ad5ecb139dbcb894123ff43561080b57",
"mode": "100644",
- "sha256": "4c0800499f248e61011f7ffe78968e0d8afb13ddfe2332390fb25de444f7e6b7"
+ "sha256": "2d32d68d4d8080bbdad439c348eab26b82f7e7e242daff2afed33305045e88c7"
+ },
+ "core/crates/tera_ffi/src/signer/evidence_tests.rs": {
+ "bytes": 6256,
+ "git_blob": "97914aca4db31acac8cba306ba597a9649a354ea",
+ "mode": "100644",
+ "sha256": "9cb7d20bd2183a3a94d36ea5eee2084cef35acc771baab1f5be293fc11ac3c0d"
},
"core/crates/tera_ffi/src/submission.rs": {
"bytes": 5191,
@@ -1504,6 +1510,12 @@
"mode": "100644",
"sha256": "e346ffef5eeb4c5aaf4de88db6cec7760a919da67a6deec1afe7e55ee48b5e6b"
},
+ "core/crates/tera_ffi/tests/submission_late_signing.rs": {
+ "bytes": 7998,
+ "git_blob": "59609f29e3464015d7b9ef9e69f21f331d5c3199",
+ "mode": "100644",
+ "sha256": "af4d50b2df36574f9ce59f4090c1d961f2ae04e2a3187c112cfe477a2c7cda1e"
+ },
"core/crates/tera_ffi/tests/submission_operation_contract.rs": {
"bytes": 8349,
"git_blob": "46af0553f7bb7b4a01a3cb2ddbb5fd6098251b55",
@@ -1690,11 +1702,17 @@
"mode": "100644",
"sha256": "67dcbfafa8b2736b0b82c3a22bb33cc4005327e1bd54bd451d82a458e35c00b5"
},
+ "core/test-fixtures/tera_ffi/signing_evidence_decision.v1.json": {
+ "bytes": 2203,
+ "git_blob": "b5cdd8f1b1dec1beeed06ff060c06511ddb7511c",
+ "mode": "100644",
+ "sha256": "ff0af780a2ed66099f6e207058f9c5523aa9789c69722ddd026ab95d3a1852f9"
+ },
"radroots.lib.source-lock.v1.toml": {
"bytes": 482,
- "git_blob": "5f85618326d3521513383d11c415d8940e7091a5",
+ "git_blob": "03045145f76dd58bb47342f2366f413d19479a8d",
"mode": "100644",
- "sha256": "ec8532030b8bb9367bb882f439f3bb8ea15dd6ca3d6df36dc3c121fff770454d"
+ "sha256": "6ff184d3eb8b646d5d9b18685351e95b01f28a31c87802347a3bdc76ffa8291b"
},
"rust-toolchain.toml": {
"bytes": 79,
@@ -2015,13 +2033,13 @@
"sha256": "b052a73a824e8f8b26af2646a4758f13655e04de9551a8271890d3cf2b63209d"
},
"test-fixtures/legacy-identifiers.v1.json": {
- "bytes": 134540,
- "git_blob": "65653d77a42b56e472da03e38dbc76f568a84340",
+ "bytes": 135492,
+ "git_blob": "c7ee97d8cd9ec972a54023b120d62e1ceb7869a8",
"mode": "100644",
- "sha256": "0a5f18d3ce7fcdec536dd72504b1e1556d9458d8e215bb54bfd888ad582d7e8c"
+ "sha256": "bf36b452029fe610c213b2d31af0b067dd569e63acaac21e7b09926275978a2f"
}
},
"policy": "staged_inputs",
- "tree": "1daa4095adf3f27c9156af9f073d4271120f6295"
+ "tree": "ab88093ebe0fee1d20a0fbbd7d2d72a6d1f34325"
}
}
diff --git a/TeraTests/TeraLateSigningTests.swift b/TeraTests/TeraLateSigningTests.swift
@@ -0,0 +1,191 @@
+import Foundation
+import RadrootsKit
+@testable import TeraApp
+import TeraKitBindings
+import XCTest
+
+@MainActor
+final class TeraLateSigningTests: XCTestCase {
+ func testCancelledNativeWaitRetainsLateSignatureAcrossRestart() async throws {
+ try await checkLateSigning(cancelWait: true, failHostClock: false)
+ }
+
+ func testNativeDeadlineAndMissingHostClockRetainLateSignatureAcrossRestart() async throws {
+ try await checkLateSigning(cancelWait: false, failHostClock: true)
+ }
+
+ private func checkLateSigning(cancelWait: Bool, failHostClock: Bool) async throws {
+ let fixture = try MediaOwnershipFixture()
+ defer { fixture.remove() }
+ let signer = try await LateNativeSigner.make()
+ let clock = LateSigningClock()
+ let client = client(clock: clock)
+ let configuration = configuration(fixture, signer: signer)
+ _ = try await client.start(configuration: configuration)
+ var form = TeraAddForm.empty(.createUpdate)
+ form.content = "PRIVATE original native signing capture"
+ let source = try await client.saveComposer(request: TeraComposerSaveRequest(
+ scope: scope, id: client.reserveComposerID(), expectedRevision: nil, editSequence: 1,
+ form: TeraComposerForm(editing: form)
+ ))
+ let request = try await TeraSubmissionRequest(commandID: client.reserveSubmissionID(), scope: scope,
+ composerID: source.draft.id, expectedRevision: 1)
+ let prepared = try await client.prepareSubmission(request: request, media: [])
+ let waiting = Task {
+ do {
+ _ = try await client.advanceSubmission(request: request, expectedRevision: prepared.revision)
+ return true
+ } catch { return false }
+ }
+ await signer.pause.entered.wait()
+ if cancelWait {
+ waiting.cancel()
+ }
+ let returnedSuccess = await waiting.value
+ XCTAssertFalse(returnedSuccess)
+ let pending = try await client.submissionStatus(request: request)
+ XCTAssertEqual(pending.captured, prepared.captured)
+ XCTAssertEqual(pending.settlement.signed, 0)
+ do {
+ _ = try await client.advanceSubmission(request: request, expectedRevision: pending.revision)
+ XCTFail("The original native callback still owns admission")
+ } catch {
+ XCTAssertEqual(TeraAddPresentation.failure(for: error)?.code, "operation_in_progress")
+ }
+ try await passSigningDeadline(signer)
+ if failHostClock {
+ clock.fail()
+ }
+ await signer.pause.resume.open()
+ let retained = try await signedStatus(client, request: request)
+ XCTAssertEqual(retained.captured, prepared.captured)
+ XCTAssertEqual(retained.operationID, prepared.operationID)
+ XCTAssertEqual(retained.settlement.signed, 1)
+ XCTAssertEqual(retained.settlement.admitted, 0)
+ XCTAssertEqual(retained.settlement.deliverySatisfied, 0)
+ try await checkReconstruction(client, signer: signer, configuration: configuration, request: request, retained: retained)
+ }
+
+ private func passSigningDeadline(_ signer: LateNativeSigner) async throws {
+ let capturedDeadline = await signer.deadline()
+ let deadline = try XCTUnwrap(capturedDeadline)
+ let now = try TeraClock.system.unixMilliseconds(requirePositive: true)
+ let remaining = deadline > now ? deadline - now : 0
+ XCTAssertLessThanOrEqual(remaining, 30000)
+ try await Task.sleep(nanoseconds: (remaining + 20) * 1_000_000)
+ }
+
+ private func client(clock: LateSigningClock) -> TeraRuntimeClient {
+ TeraRuntimeClient(factory: { configuration in
+ let runtime = try await TeraRuntime.withHostSigner(
+ applicationSupportDirectory: configuration.applicationSupportDirectory,
+ publicKeyHex: configuration.publicKeyHex,
+ sourceGenerationHex: configuration.sourceGenerationHex,
+ sourceGenerationCreatedAtUnixMs: configuration.sourceGenerationCreatedAtUnixMilliseconds,
+ protectedData: .available,
+ hostSigner: TeraGeneratedHostSigner(signer: configuration.signer, clock: TeraClock(now: { clock.now() }))
+ )
+ try runtime.configureSimulatorRelays(loopbackRelays: ["ws://127.0.0.1:19999"])
+ let backend = TeraGeneratedRuntimeBackend(runtime: runtime)
+ return try await TeraRuntimeBackendStart(backend: backend, snapshot: backend.snapshot())
+ }, deadlines: TeraRuntimeDeadlinePolicy(operationNanoseconds: 3_000_000_000))
+ }
+
+ private func checkReconstruction(
+ _ client: TeraRuntimeClient, signer: LateNativeSigner, configuration: TeraRuntimeLaunchConfiguration,
+ request: TeraSubmissionRequest, retained: TeraSubmissionStatus
+ ) async throws {
+ _ = try await client.stop()
+ await signer.disable()
+ _ = try await client.start(configuration: configuration)
+ let recovered = try await client.recoverSubmission(request: request)
+ XCTAssertEqual(recovered, retained)
+ let count = await signer.count()
+ XCTAssertEqual(count, 1)
+ _ = try await client.stop()
+ }
+
+ private func signedStatus(_ client: TeraRuntimeClient, request: TeraSubmissionRequest) async throws -> TeraSubmissionStatus {
+ for _ in 0 ..< 100 {
+ let status = try await client.submissionStatus(request: request)
+ if status.settlement.signed == 1 {
+ return status
+ }
+ try await Task.sleep(nanoseconds: 20_000_000)
+ }
+ XCTFail("The generated bridge did not retain the already-created signature")
+ return try await client.submissionStatus(request: request)
+ }
+
+ private var scope: TeraComposerScope {
+ TeraComposerScope(authorPublicKey: "79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798", localNetworkID: "nearby")
+ }
+
+ private func configuration(_ fixture: MediaOwnershipFixture, signer: LateNativeSigner) -> TeraRuntimeLaunchConfiguration {
+ TeraRuntimeLaunchConfiguration(applicationSupportDirectory: fixture.root.path, publicKeyHex: scope.authorPublicKey,
+ sourceGenerationHex: String(repeating: "04", count: 32), sourceGenerationCreatedAtUnixMilliseconds: 1_800_000_000_000,
+ protectedData: .available, networkProfile: .publicNetwork, writableRelays: [], blossom: nil,
+ app: TeraRuntimeAppMetadata(bundleIdentifier: "test.late-signing", version: "1", buildNumber: "1", buildSHA: nil),
+ signerGeneration: "late-signing-test", signer: signer, adoptBootstrapSettings: false)
+ }
+}
+
+private actor LateNativeSigner: TeraRuntimeSigner {
+ let pause = ResourceTestPause()
+ private let signer: any TeraRuntimeSigner
+ private var calls = 0
+ private var lastDeadline: UInt64?
+ private var available = true
+
+ init(signer: any TeraRuntimeSigner) {
+ self.signer = signer
+ }
+
+ static func make() async throws -> LateNativeSigner {
+ let secureStore = InMemorySecureStore()
+ let custody = try RadrootsIdentityCustody(configuration: RadrootsIdentityCustodyConfiguration(
+ namespace: "radroots_identity_v1", secretPolicy: .secureLocalSecret
+ ), secureStore: secureStore, metadataStore: InMemoryIdentityMetadataStore(), userPresence: AllowingUserPresence())
+ let store = TeraIdentityStore(custody: custody, secureStore: secureStore,
+ servicePrefix: "org.tera.tests.late_signing.\(UUID().uuidString)")
+ let identity = try await store.importIdentity(RadrootsIdentitySecretMaterial(importText: String(repeating: "0", count: 63) + "1"))
+ return try await LateNativeSigner(signer: store.signer(for: identity))
+ }
+
+ func availability() async -> TeraRuntimeSignerAvailability {
+ available ? .ready : .unavailable
+ }
+
+ func count() -> Int {
+ calls
+ }
+
+ func deadline() -> UInt64? {
+ lastDeadline
+ }
+
+ func disable() {
+ available = false
+ }
+
+ func sign(_ request: TeraRuntimeSigningRequest) async -> TeraRuntimeSigningOutcome {
+ calls += 1
+ guard available else { return .unavailable }
+ lastDeadline = request.deadlineUnixMilliseconds
+ let result = await signer.sign(request)
+ await pause.wait()
+ return result
+ }
+}
+
+private final class LateSigningClock: @unchecked Sendable {
+ private let lock = NSLock()
+ private var failed = false
+ func fail() {
+ lock.withLock { failed = true }
+ }
+
+ func now() -> Date {
+ lock.withLock { failed ? Date(timeIntervalSince1970: .nan) : Date() }
+ }
+}
diff --git a/core/crates/tera_ffi/src/signer.rs b/core/crates/tera_ffi/src/signer.rs
@@ -4,7 +4,7 @@ use std::sync::Arc;
use radroots_event::{SignedEvent, wire::v1::Nip01EventWire};
use radroots_signing::{
- Error, SignReceipt, SignRequest, Signer, SignerStatus,
+ AuthoredSignEvidence, Error, SignReceipt, SignRequest, Signer, SignerStatus,
capability::{CancellationSupport, SignerCapability, SignerKind},
error::Kind,
recovery::ReplayCapability,
@@ -16,6 +16,9 @@ use crate::MOBILE_FFI_SCHEMA_VERSION;
const SIGNED_EVENT_MAX_BYTES: usize = 1_048_576;
+#[cfg(test)]
+mod evidence_tests;
+
#[derive(Clone, Copy, Debug, Eq, PartialEq, uniffi::Enum)]
pub enum SignerAvailabilityRecord {
Ready,
@@ -75,6 +78,8 @@ pub struct HostSigningResult {
pub public_key: String,
pub purpose: HostSigningPurpose,
pub signature_hex: Option<String>,
+ /// Host completion time, or zero when unavailable. Authored signed evidence
+ /// may be verified with a separate local observation; strict receipts require time.
pub completed_at_unix_ms: u64,
}
@@ -145,6 +150,36 @@ impl Signer for HostSignerAdapter {
}
})
}
+
+ fn sign_authored_evidence(
+ &self,
+ request: SignRequest,
+ ) -> BoxFuture<'_, Result<AuthoredSignEvidence, Error>> {
+ Box::pin(async move {
+ if request.authored_plan().is_none() {
+ return Err(Error::new(Kind::InvalidArgument));
+ }
+ request.ensure_active(now_unix_ms())?;
+ let ffi_request = HostSigningRequest::from_request(&request)?;
+ let result = self.host.sign(ffi_request.clone()).await;
+ validate_result_identity(&ffi_request, &result)?;
+ match result.outcome {
+ HostSigningOutcome::Signed => AuthoredSignEvidence::from_signed_event(
+ &request,
+ signed_event(&request, result)?,
+ now_unix_ms(),
+ ),
+ HostSigningOutcome::Locked | HostSigningOutcome::Unavailable => {
+ Err(Error::new(Kind::SignerUnavailable))
+ }
+ HostSigningOutcome::Cancelled => Err(Error::new(Kind::SignerCancelled)),
+ HostSigningOutcome::Rejected => Err(Error::new(Kind::SignerRejected)),
+ HostSigningOutcome::TimedOut => Err(Error::new(Kind::SignerTimeout)),
+ HostSigningOutcome::Invalidated => Err(Error::new(Kind::SignerOutputInvalid)),
+ HostSigningOutcome::Failed => Err(Error::new(Kind::InternalError)),
+ }
+ })
+ }
}
impl HostSigningRequest {
@@ -179,12 +214,22 @@ fn validate_result_binding(
request: &HostSigningRequest,
result: &HostSigningResult,
) -> Result<(), Error> {
+ validate_result_identity(request, result)?;
+ if result.completed_at_unix_ms == 0 {
+ return Err(Error::new(Kind::SignerOutputInvalid));
+ }
+ Ok(())
+}
+
+fn validate_result_identity(
+ request: &HostSigningRequest,
+ result: &HostSigningResult,
+) -> Result<(), Error> {
if result.schema_version != MOBILE_FFI_SCHEMA_VERSION
|| result.operation_id != request.operation_id
|| result.signer_request_id != request.signer_request_id
|| result.public_key != request.public_key
|| result.purpose != request.purpose
- || result.completed_at_unix_ms == 0
|| (result.outcome == HostSigningOutcome::Signed) != result.signature_hex.is_some()
{
return Err(Error::new(Kind::SignerOutputInvalid));
@@ -193,6 +238,15 @@ fn validate_result_binding(
}
fn signed_receipt(request: &SignRequest, result: HostSigningResult) -> Result<SignReceipt, Error> {
+ let completed_at_unix_ms = result.completed_at_unix_ms;
+ SignReceipt::from_signed_event(
+ request,
+ signed_event(request, result)?,
+ completed_at_unix_ms,
+ )
+}
+
+fn signed_event(request: &SignRequest, result: HostSigningResult) -> Result<SignedEvent, Error> {
let signature = result
.signature_hex
.filter(|value| {
@@ -216,9 +270,8 @@ fn signed_receipt(request: &SignRequest, result: HostSigningResult) -> Result<Si
if raw_json.len() > SIGNED_EVENT_MAX_BYTES {
return Err(Error::new(Kind::SignerOutputInvalid));
}
- let signed = SignedEvent::from_wire_verified_id(wire, raw_json)
- .map_err(|_| Error::new(Kind::SignerOutputInvalid))?;
- SignReceipt::from_signed_event(request, signed, result.completed_at_unix_ms)
+ SignedEvent::from_wire_verified_id(wire, raw_json)
+ .map_err(|_| Error::new(Kind::SignerOutputInvalid))
}
fn uuid_string(bytes: &[u8; 16]) -> String {
diff --git a/core/crates/tera_ffi/src/signer/evidence_tests.rs b/core/crates/tera_ffi/src/signer/evidence_tests.rs
@@ -0,0 +1,176 @@
+use super::*;
+use radroots_blossom::authorization::{AuthoredUploadClaim, AuthorizationContent, ServerDomain};
+use radroots_event::contract::AuthorRole;
+use radroots_signing::{
+ Actor, AuthoredArtifactId, SigningIntentId, SigningOperationId,
+ actor::ActorSource,
+ request::{CancellationPolicy, CancellationSignal, SignPolicy},
+};
+use secp256k1::{Keypair, Message, Secp256k1, SecretKey};
+use std::sync::atomic::{AtomicUsize, Ordering};
+use tera_core::runtime::product_surface::{CreateUpdate, Phase1AddCommand};
+
+enum Completion {
+ Late,
+ Cancelled(CancellationSignal),
+ MissingTime,
+}
+
+struct Host {
+ completion: Completion,
+ calls: Arc<AtomicUsize>,
+}
+
+#[async_trait::async_trait]
+impl TeraHostSigner for Host {
+ async fn signer_status(&self) -> SignerStatusRecord {
+ SignerStatusRecord {
+ schema_version: 1,
+ availability: SignerAvailabilityRecord::Ready,
+ }
+ }
+
+ async fn sign(&self, request: HostSigningRequest) -> HostSigningResult {
+ self.calls.fetch_add(1, Ordering::Relaxed);
+ let mut secret = [0; 32];
+ secret[31] = 1;
+ let key =
+ Keypair::from_secret_key(&Secp256k1::new(), &SecretKey::from_slice(&secret).unwrap());
+ let signature = Secp256k1::new()
+ .sign_schnorr_no_aux_rand(
+ &Message::from_digest(request.event_id_digest.clone().try_into().unwrap()),
+ &key,
+ )
+ .to_string();
+ match &self.completion {
+ Completion::Late => {
+ tokio::time::sleep(std::time::Duration::from_millis(
+ request.deadline_unix_ms.saturating_sub(now_unix_ms()) + 2,
+ ))
+ .await
+ }
+ Completion::Cancelled(signal) => signal.cancel(),
+ Completion::MissingTime => {}
+ }
+ HostSigningResult {
+ schema_version: 1,
+ outcome: HostSigningOutcome::Signed,
+ operation_id: request.operation_id,
+ signer_request_id: request.signer_request_id,
+ public_key: request.public_key,
+ purpose: request.purpose,
+ signature_hex: Some(signature),
+ completed_at_unix_ms: if matches!(self.completion, Completion::MissingTime) {
+ 0
+ } else {
+ now_unix_ms()
+ },
+ }
+ }
+}
+
+fn request(blossom: bool) -> SignRequest {
+ let at = now_unix_ms();
+ let plan =
+ Phase1AddCommand::CreateUpdate(CreateUpdate::new("exact authored signature").unwrap())
+ .authored_plan(
+ at / 1000,
+ "79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798",
+ )
+ .unwrap();
+ let author = *plan.author();
+ let actor = Actor::new(author, ActorSource::ExplicitPublicKey, [AuthorRole::Any]).unwrap();
+ let intent = SigningIntentId::new(
+ SigningOperationId::new([1; 16]).unwrap(),
+ AuthoredArtifactId::new([2; 16]).unwrap(),
+ );
+ // Decode the governed wire operation ID through its public Serde contract.
+ let operation = serde_json::from_str("\"sync.push\"").unwrap();
+ let policy = SignPolicy::new(at + 100, CancellationPolicy::LocalCooperative).unwrap();
+ if blossom {
+ let claim = AuthoredUploadClaim::new(
+ AuthorizationContent::parse("Upload exact image").unwrap(),
+ ServerDomain::parse("media.example").unwrap(),
+ radroots_blossom::Sha256::digest(b"image"),
+ at / 1000,
+ 60,
+ )
+ .unwrap();
+ SignRequest::blossom_upload(
+ operation,
+ intent,
+ actor,
+ radroots_sdk::signing::BlossomAuthorizationPlan::for_upload(&claim, author).unwrap(),
+ policy,
+ )
+ .unwrap()
+ } else {
+ SignRequest::new(operation, intent, actor, plan, policy).unwrap()
+ }
+}
+
+#[tokio::test]
+async fn authored_evidence_retains_facts_while_strict_receipts_reject_late_cancelled_and_untimed_results()
+ {
+ for (mode, expected) in [
+ (0, Kind::DeadlineExceeded),
+ (1, Kind::SignerCancelled),
+ (2, Kind::SignerOutputInvalid),
+ ] {
+ for evidence in [false, true] {
+ let request = request(false);
+ let completion = match mode {
+ 0 => Completion::Late,
+ 1 => Completion::Cancelled(request.cancellation_signal().clone()),
+ _ => Completion::MissingTime,
+ };
+ let calls = Arc::new(AtomicUsize::new(0));
+ let adapter = HostSignerAdapter::new(Box::new(Host {
+ completion,
+ calls: calls.clone(),
+ }));
+ if evidence {
+ let retained = adapter
+ .sign_authored_evidence(request.clone())
+ .await
+ .unwrap();
+ assert_eq!(retained.signed_event().id(), request.expected_event_id());
+ assert_eq!(retained.signed_event().created_at(), request.created_at());
+ assert!(retained.observed_at_unix_ms() > 0);
+ assert_eq!(
+ retained
+ .revalidate(&request, now_unix_ms())
+ .unwrap()
+ .signed_event(),
+ retained.signed_event()
+ );
+ } else {
+ assert_eq!(adapter.sign(request).await.unwrap_err().kind(), expected);
+ }
+ assert_eq!(calls.load(Ordering::Relaxed), 1);
+ }
+ }
+}
+
+#[tokio::test]
+async fn blossom_never_enters_the_evidence_hook_and_keeps_strict_expiry() {
+ let calls = Arc::new(AtomicUsize::new(0));
+ let adapter = HostSignerAdapter::new(Box::new(Host {
+ completion: Completion::Late,
+ calls: calls.clone(),
+ }));
+ assert_eq!(
+ adapter
+ .sign_authored_evidence(request(true))
+ .await
+ .unwrap_err()
+ .kind(),
+ Kind::InvalidArgument
+ );
+ assert_eq!(calls.load(Ordering::Relaxed), 0);
+ assert_eq!(
+ adapter.sign(request(true)).await.unwrap_err().kind(),
+ Kind::DeadlineExceeded
+ );
+ assert_eq!(calls.load(Ordering::Relaxed), 1);
+}
diff --git a/core/crates/tera_ffi/tests/submission_late_signing.rs b/core/crates/tera_ffi/tests/submission_late_signing.rs
@@ -0,0 +1,240 @@
+use std::{
+ sync::{Arc, Mutex},
+ time::{Duration, SystemTime, UNIX_EPOCH},
+};
+
+use nostr_relay_builder::MockRelay;
+use secp256k1::{Keypair, Message, Secp256k1, SecretKey};
+use tera_core::runtime::product_surface::{AddCommandType, ComposerFormInput, ComposerPartialForm};
+use tera_ffi::*;
+use tokio::sync::Notify;
+
+mod support;
+
+#[derive(Clone, Default)]
+struct HeldHost {
+ requests: Arc<Mutex<Vec<HostSigningRequest>>>,
+ entered: Arc<Notify>,
+ resume: Arc<Notify>,
+ completion_unavailable: bool,
+}
+
+#[async_trait::async_trait]
+impl TeraHostSigner for HeldHost {
+ async fn signer_status(&self) -> SignerStatusRecord {
+ SignerStatusRecord {
+ schema_version: 1,
+ availability: SignerAvailabilityRecord::Ready,
+ }
+ }
+
+ async fn sign(&self, request: HostSigningRequest) -> HostSigningResult {
+ self.requests.lock().unwrap().push(request.clone());
+ self.entered.notify_one();
+ self.resume.notified().await;
+ let mut secret = [0; 32];
+ secret[31] = 1;
+ let key =
+ Keypair::from_secret_key(&Secp256k1::new(), &SecretKey::from_slice(&secret).unwrap());
+ let signature = Secp256k1::new().sign_schnorr_no_aux_rand(
+ &Message::from_digest(request.event_id_digest.clone().try_into().unwrap()),
+ &key,
+ );
+ HostSigningResult {
+ schema_version: 1,
+ outcome: HostSigningOutcome::Signed,
+ operation_id: request.operation_id,
+ signer_request_id: request.signer_request_id,
+ public_key: request.public_key,
+ purpose: request.purpose,
+ signature_hex: Some(signature.to_string()),
+ completed_at_unix_ms: if self.completion_unavailable {
+ 0
+ } else {
+ now()
+ },
+ }
+ }
+}
+
+fn now() -> u64 {
+ SystemTime::now()
+ .duration_since(UNIX_EPOCH)
+ .unwrap()
+ .as_millis()
+ .try_into()
+ .unwrap()
+}
+
+async fn prepare(
+ runtime: &TeraRuntime,
+) -> (
+ FfiSubmissionReservationRequest,
+ FfiSubmissionOperationRecord,
+) {
+ let mut form = ComposerFormInput::empty(AddCommandType::CreateUpdate);
+ form.content = "PRIVATE retained authored result".into();
+ let source = FfiComposerSaveRequest {
+ schema_version: 1,
+ scope: FfiComposerScopeRecord {
+ schema_version: 1,
+ author_public_key: support::PUBLIC_KEY.into(),
+ local_network_id: "nearby".into(),
+ },
+ id: composer_reserve_id().unwrap().id,
+ expected_revision: None,
+ edit_sequence: 1,
+ form: (&ComposerPartialForm::new(form).unwrap()).into(),
+ };
+ runtime.composer_save(source.clone()).await.unwrap();
+ let request = FfiSubmissionReservationRequest {
+ schema_version: 1,
+ command_id: submission_reserve_id().unwrap().id,
+ scope: source.scope,
+ composer_id: source.id,
+ expected_revision: 1,
+ };
+ let prepared = runtime
+ .submission_prepare(request.clone(), vec![])
+ .await
+ .unwrap();
+ (request, prepared)
+}
+
+async fn run_case(completion_unavailable: bool) {
+ let relay = MockRelay::run().await.unwrap();
+ let relay_url = relay.url().await.to_string();
+ let (root, initial) = support::runtime().await;
+ initial.shutdown().await.unwrap();
+ drop(initial);
+ let host = HeldHost {
+ completion_unavailable,
+ ..Default::default()
+ };
+ let runtime = Arc::new(
+ TeraRuntime::with_host_signer(
+ root.path().to_string_lossy().into_owned(),
+ support::PUBLIC_KEY.into(),
+ support::GENERATION.into(),
+ 1_800_000_000_000,
+ ProtectedDataAvailability::Available,
+ Box::new(host.clone()),
+ )
+ .await
+ .unwrap(),
+ );
+ runtime
+ .configure_simulator_relays(vec![relay_url.clone()])
+ .unwrap();
+ let (request, prepared) = prepare(&runtime).await;
+ let mut task = {
+ let runtime = runtime.clone();
+ let request = request.clone();
+ tokio::spawn(async move { runtime.submission_advance(request, 1).await })
+ };
+ tokio::time::timeout(Duration::from_secs(5), host.entered.notified())
+ .await
+ .unwrap();
+ // A caller wait timeout must not be treated as a failed signing operation.
+ assert!(
+ tokio::time::timeout(Duration::from_millis(10), &mut task)
+ .await
+ .is_err()
+ );
+ let signing = runtime.submission_status(request.clone()).await.unwrap();
+ assert_eq!(signing.settlement.signed, 0);
+ assert_eq!(signing.captured, prepared.captured);
+ assert!(
+ runtime
+ .submission_advance(request.clone(), signing.revision)
+ .await
+ .is_err()
+ );
+ let original = host.requests.lock().unwrap()[0].clone();
+ if !completion_unavailable {
+ let remaining = original.deadline_unix_ms.saturating_sub(now());
+ assert!(remaining <= 30_000);
+ tokio::time::sleep(Duration::from_millis(remaining + 10)).await;
+ assert!(now() >= original.deadline_unix_ms);
+ }
+ host.resume.notify_one();
+ let result = tokio::time::timeout(Duration::from_secs(10), task)
+ .await
+ .unwrap()
+ .unwrap();
+ if !completion_unavailable {
+ assert!(result.is_err());
+ }
+ let retained = runtime.submission_status(request.clone()).await.unwrap();
+ assert_eq!(retained.settlement.signed, 1);
+ if !completion_unavailable {
+ assert_eq!(retained.settlement.admitted, 0);
+ }
+ assert_eq!(retained.captured, prepared.captured);
+ assert_eq!(retained.operation_id, prepared.operation_id);
+ assert_eq!(host.requests.lock().unwrap().len(), 1);
+ runtime.shutdown().await.unwrap();
+ drop(runtime);
+
+ // Reopen with no signer at all. Durable evidence permits admission and delivery.
+ let recovered = TeraRuntime::new(
+ root.path().to_string_lossy().into_owned(),
+ support::PUBLIC_KEY.into(),
+ support::GENERATION.into(),
+ 1_800_000_000_000,
+ ProtectedDataAvailability::Available,
+ )
+ .await
+ .unwrap();
+ recovered
+ .configure_simulator_relays(vec![relay_url.clone()])
+ .unwrap();
+ assert_eq!(
+ recovered.submission_status(request.clone()).await.unwrap(),
+ retained
+ );
+ let delivered = recovered
+ .submission_advance(request.clone(), retained.revision)
+ .await
+ .unwrap();
+ assert_eq!(delivered.settlement.signed, 1);
+ assert_eq!(delivered.settlement.admitted, 1);
+ assert_eq!(delivered.settlement.delivery_satisfied, 1);
+ assert_eq!(
+ recovered
+ .submission_advance(request.clone(), delivered.revision)
+ .await
+ .unwrap(),
+ delivered
+ );
+ assert_eq!(host.requests.lock().unwrap().len(), 1);
+
+ let observer = nostr_sdk::Client::default();
+ observer.add_relay(relay_url).await.unwrap();
+ observer.connect().await;
+ let events = observer
+ .fetch_events(
+ nostr::Filter::new().id(nostr::EventId::from_hex(&original.expected_event_id).unwrap()),
+ Duration::from_secs(5),
+ )
+ .await
+ .unwrap();
+ assert_eq!(events.len(), 1);
+ let event = events.into_iter().next().unwrap();
+ event.verify().unwrap();
+ assert_eq!(event.content, original.content);
+ assert_eq!(event.created_at.as_secs(), original.created_at_unix_s);
+ assert_eq!(event.pubkey.to_hex(), original.public_key);
+ observer.shutdown().await;
+ recovered.shutdown().await.unwrap();
+}
+
+#[tokio::test(flavor = "multi_thread", worker_threads = 4)]
+async fn late_native_fact_survives_deadline_restart_and_duplicate_without_credentials() {
+ run_case(false).await;
+}
+
+#[tokio::test(flavor = "multi_thread", worker_threads = 4)]
+async fn native_signed_evidence_does_not_require_a_host_completion_timestamp() {
+ run_case(true).await;
+}
diff --git a/core/test-fixtures/tera_ffi/signing_evidence_decision.v1.json b/core/test-fixtures/tera_ffi/signing_evidence_decision.v1.json
@@ -0,0 +1,11 @@
+{
+ "schema": "tera.host-signing-evidence.v1",
+ "status": "approved",
+ "purpose": "Preserve already-created authored signatures across caller wait timeout, cancellation and host observation-clock failure.",
+ "authored": "Check request activity before invoking the host. After invocation, validate schema, operation ID, signer request ID, public key, purpose, outcome/signature consistency and the exact signed event cryptographically. Return AuthoredSignEvidence with a positive Rust-local observation time regardless of the caller's remaining wait.",
+ "host_time": "HostSigningResult.completed_at_unix_ms equal to zero represents unavailable host completion time. Only authored Signed evidence may be retained without it, using separate local observation; zero is never a fabricated signing or event timestamp. If Swift cannot read its post-sign clock, it preserves an existing NostrEvent signature with zero time. Pre-invocation clock failure still prevents the call.",
+ "strict_receipt": "Signer::sign remains strict before and after the callback and at host completion time. It requires a nonzero host time, active cancellation/deadline policy, exact binding and valid cryptography. Expiring Blossom upload authorization does not use the authored-evidence hook and retains its prior failure behavior.",
+ "durability": "The shared signing, storage and Sync owners persist evidence under the original durable claim, reload current status and preserve stopped/uncertain outcomes. Recovery queries the original operation before signing again; no replacement key, preimage or event timestamp is permitted.",
+ "lifetime": "The existing native runtime client retains operation admission until the generated async call settles. A waiter timeout or cancellation does not authorize another in-flight invocation. No additional worker or timer is introduced; direct destruction of a Rust future leaves durable attempt recovery rather than a promise of background completion.",
+ "scope": "No new FFI field, ABI type, storage authority, transport or credential owner. Global delivery-stop semantics remain separate. Native tests are simulator evidence, not physical-device or power-loss qualification."
+}
diff --git a/project.yml b/project.yml
@@ -51,6 +51,7 @@ targets:
- path: TeraTests/TeraSubmissionAdmissionTests.swift
- path: TeraTests/TeraSubmissionStoreTests.swift
- path: TeraTests/TeraSubmissionOperationFFITests.swift
+ - path: TeraTests/TeraLateSigningTests.swift
- path: TeraTests/TeraAddSignerFixture.swift
- path: TeraTests/TeraRuntimeClientTests.swift
- path: TeraTests/TeraComposerPersistenceFFITests.swift
diff --git a/radroots.lib.source-lock.v1.toml b/radroots.lib.source-lock.v1.toml
@@ -1,8 +1,8 @@
schema = "radroots.lib.source-lock.v1"
repository = "https://github.com/radrootslabs/lib"
-revision = "e528bd0be26bdaa25266859ce139f59903b43f3f"
+revision = "f578069cf894b34695bdf0ed2298e0aa162b5c13"
architecture = "radroots.crates.release.v2"
workspace_catalog_sha256 = "ee295f2352e2577a4052d980624415aec9871197d4fc9910a4c21c83a9179200"
version = "0.1.0-alpha"
-source_archive_sha256 = "f24060d4fbf04d418f81f335d64f6a030a9bc8ea81ab79d6f9cecf876e35c507"
-lockfile_sha256 = "202529ccbed5b11c60f9d1fe069f23ca0d94868ce16588e97554dbbba67c5a32"
+source_archive_sha256 = "bf33fb5999c52c26436596b80b7428450f84719190785aa6e83177d94a130ff9"
+lockfile_sha256 = "ef6dba164299dc28990d220d4e62cd587ea25c2a56c584c1b056ab22741bcc6b"
diff --git a/release/provenance.json b/release/provenance.json
@@ -2,11 +2,11 @@
"artifacts": {
"app_api_sha256": "020924097c0d7efc33128cb8fd3d3b2026d95f57c44da71880e585aff80f070b",
"ffi_api_sha256": "79c86a44fd77c30b5b55d209cf356d01e6c4b60fe6d1f8aa33cccc5029a58aa4",
- "ffi_provenance_sha256": "f99a56fe78ba17464373e6cc3599ca98adaa4235a4f502faf9be5a487c0d8779",
+ "ffi_provenance_sha256": "5eea0a40f2954238ac356da87d602aa4088813ab03a653ed50b2b7e30fea08a2",
"info_plist_sha256": "15ef08b1cdd1096cfb9eeaf5be5bf8f814807a7ca9350bbbb47860fa72ec13ef",
"privacy_manifest_sha256": "a331d51864743ebe4e00dd22360b4a538b6b3ac26a6b3eb54094e60a36959a12",
- "sbom_sha256": "749c6f824d9b9f40517353be28d1d982c698a96899dff4877aac0370957e3750",
- "xcode_project_sha256": "1f672fa9ccfaf4fe23e846806f2e6f3921639f5f9fc6cc2943053039593dd2d2"
+ "sbom_sha256": "b039645576cb342f3e2ef76fc0d3ddd51e42b8f3676e13bbee91263569003116",
+ "xcode_project_sha256": "a76bdeeecaf4d992b7be8ead90dcddfe8d1e22e547f17fc06460ecd446b4b9d3"
},
"disposition": "unsigned",
"platforms": [
@@ -17,12 +17,12 @@
"repository": "https://github.com/radrootslabs/tera",
"schema": "tera.release-provenance.v1",
"source": {
- "cargo_lock_sha256": "202529ccbed5b11c60f9d1fe069f23ca0d94868ce16588e97554dbbba67c5a32",
- "consumer_source_lock_sha256": "ec8532030b8bb9367bb882f439f3bb8ea15dd6ca3d6df36dc3c121fff770454d",
- "lib_revision": "e528bd0be26bdaa25266859ce139f59903b43f3f",
+ "cargo_lock_sha256": "ef6dba164299dc28990d220d4e62cd587ea25c2a56c584c1b056ab22741bcc6b",
+ "consumer_source_lock_sha256": "6ff184d3eb8b646d5d9b18685351e95b01f28a31c87802347a3bdc76ffa8291b",
+ "lib_revision": "f578069cf894b34695bdf0ed2298e0aa162b5c13",
"source_date_epoch": 1787871027,
"swift_package_lock_sha256": "9b831ccdd3a6c697d142f1e865913eeed9553cb2dc97b492b229771c7669571f",
- "tera_ffi_source_tree": "1daa4095adf3f27c9156af9f073d4271120f6295",
+ "tera_ffi_source_tree": "ab88093ebe0fee1d20a0fbbd7d2d72a6d1f34325",
"xcode_package_lock_sha256": "1a703864d2eb2f4fcb23e78c8552cfe93036af255de866e49756fa59381e730c"
},
"version": "0.1.0-alpha"
diff --git a/release/sbom.cdx.json b/release/sbom.cdx.json
@@ -4034,7 +4034,7 @@
"version": "6.0.0"
},
{
- "bom-ref": "cargo:radroots_blossom@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
+ "bom-ref": "cargo:radroots_blossom@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
"licenses": [
{
"expression": "MIT OR Apache-2.0"
@@ -4048,14 +4048,14 @@
},
{
"name": "radroots.package.source",
- "value": "git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f"
+ "value": "git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13"
}
],
"type": "library",
"version": "0.1.0-alpha"
},
{
- "bom-ref": "cargo:radroots_core@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
+ "bom-ref": "cargo:radroots_core@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
"licenses": [
{
"expression": "MIT OR Apache-2.0"
@@ -4069,14 +4069,14 @@
},
{
"name": "radroots.package.source",
- "value": "git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f"
+ "value": "git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13"
}
],
"type": "library",
"version": "0.1.0-alpha"
},
{
- "bom-ref": "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
+ "bom-ref": "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
"licenses": [
{
"expression": "MIT OR Apache-2.0"
@@ -4090,14 +4090,14 @@
},
{
"name": "radroots.package.source",
- "value": "git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f"
+ "value": "git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13"
}
],
"type": "library",
"version": "0.1.0-alpha"
},
{
- "bom-ref": "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
+ "bom-ref": "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
"licenses": [
{
"expression": "MIT OR Apache-2.0"
@@ -4111,14 +4111,14 @@
},
{
"name": "radroots.package.source",
- "value": "git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f"
+ "value": "git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13"
}
],
"type": "library",
"version": "0.1.0-alpha"
},
{
- "bom-ref": "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
+ "bom-ref": "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
"licenses": [
{
"expression": "MIT OR Apache-2.0"
@@ -4132,14 +4132,14 @@
},
{
"name": "radroots.package.source",
- "value": "git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f"
+ "value": "git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13"
}
],
"type": "library",
"version": "0.1.0-alpha"
},
{
- "bom-ref": "cargo:radroots_nostr@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
+ "bom-ref": "cargo:radroots_nostr@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
"licenses": [
{
"expression": "MIT OR Apache-2.0"
@@ -4153,14 +4153,14 @@
},
{
"name": "radroots.package.source",
- "value": "git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f"
+ "value": "git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13"
}
],
"type": "library",
"version": "0.1.0-alpha"
},
{
- "bom-ref": "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
+ "bom-ref": "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
"licenses": [
{
"expression": "MIT OR Apache-2.0"
@@ -4174,14 +4174,14 @@
},
{
"name": "radroots.package.source",
- "value": "git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f"
+ "value": "git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13"
}
],
"type": "library",
"version": "0.1.0-alpha"
},
{
- "bom-ref": "cargo:radroots_sdk@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
+ "bom-ref": "cargo:radroots_sdk@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
"licenses": [
{
"expression": "MIT OR Apache-2.0"
@@ -4195,14 +4195,14 @@
},
{
"name": "radroots.package.source",
- "value": "git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f"
+ "value": "git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13"
}
],
"type": "library",
"version": "0.1.0-alpha"
},
{
- "bom-ref": "cargo:radroots_secrets@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
+ "bom-ref": "cargo:radroots_secrets@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
"licenses": [
{
"expression": "MIT OR Apache-2.0"
@@ -4216,14 +4216,14 @@
},
{
"name": "radroots.package.source",
- "value": "git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f"
+ "value": "git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13"
}
],
"type": "library",
"version": "0.1.0-alpha"
},
{
- "bom-ref": "cargo:radroots_signing@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
+ "bom-ref": "cargo:radroots_signing@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
"licenses": [
{
"expression": "MIT OR Apache-2.0"
@@ -4237,14 +4237,14 @@
},
{
"name": "radroots.package.source",
- "value": "git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f"
+ "value": "git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13"
}
],
"type": "library",
"version": "0.1.0-alpha"
},
{
- "bom-ref": "cargo:radroots_storage@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
+ "bom-ref": "cargo:radroots_storage@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
"licenses": [
{
"expression": "MIT OR Apache-2.0"
@@ -4258,14 +4258,14 @@
},
{
"name": "radroots.package.source",
- "value": "git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f"
+ "value": "git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13"
}
],
"type": "library",
"version": "0.1.0-alpha"
},
{
- "bom-ref": "cargo:radroots_storage_sqlite@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
+ "bom-ref": "cargo:radroots_storage_sqlite@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
"licenses": [
{
"expression": "MIT OR Apache-2.0"
@@ -4279,14 +4279,14 @@
},
{
"name": "radroots.package.source",
- "value": "git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f"
+ "value": "git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13"
}
],
"type": "library",
"version": "0.1.0-alpha"
},
{
- "bom-ref": "cargo:radroots_sync@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
+ "bom-ref": "cargo:radroots_sync@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
"licenses": [
{
"expression": "MIT OR Apache-2.0"
@@ -4300,14 +4300,14 @@
},
{
"name": "radroots.package.source",
- "value": "git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f"
+ "value": "git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13"
}
],
"type": "library",
"version": "0.1.0-alpha"
},
{
- "bom-ref": "cargo:radroots_trade@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
+ "bom-ref": "cargo:radroots_trade@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
"licenses": [
{
"expression": "MIT OR Apache-2.0"
@@ -4321,14 +4321,14 @@
},
{
"name": "radroots.package.source",
- "value": "git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f"
+ "value": "git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13"
}
],
"type": "library",
"version": "0.1.0-alpha"
},
{
- "bom-ref": "cargo:radroots_transport@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
+ "bom-ref": "cargo:radroots_transport@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
"licenses": [
{
"expression": "MIT OR Apache-2.0"
@@ -4342,14 +4342,14 @@
},
{
"name": "radroots.package.source",
- "value": "git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f"
+ "value": "git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13"
}
],
"type": "library",
"version": "0.1.0-alpha"
},
{
- "bom-ref": "cargo:radroots_transport_nostr@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
+ "bom-ref": "cargo:radroots_transport_nostr@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
"licenses": [
{
"expression": "MIT OR Apache-2.0"
@@ -4363,7 +4363,7 @@
},
{
"name": "radroots.package.source",
- "value": "git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f"
+ "value": "git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13"
}
],
"type": "library",
@@ -9273,45 +9273,45 @@
"cargo:unicode-general-category@1.1.0?source=registry+https://github.com/rust-lang/crates.io-index",
"cargo:url@2.5.8?source=registry+https://github.com/rust-lang/crates.io-index"
],
- "ref": "cargo:radroots_blossom@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f"
+ "ref": "cargo:radroots_blossom@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13"
},
{
"dependsOn": [
"cargo:rust_decimal@1.42.1?source=registry+https://github.com/rust-lang/crates.io-index",
"cargo:serde@1.0.229?source=registry+https://github.com/rust-lang/crates.io-index"
],
- "ref": "cargo:radroots_core@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f"
+ "ref": "cargo:radroots_core@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13"
},
{
"dependsOn": [
"cargo:hex@0.4.3?source=registry+https://github.com/rust-lang/crates.io-index",
"cargo:jiff-tzdb@0.1.8?source=registry+https://github.com/rust-lang/crates.io-index",
- "cargo:radroots_blossom@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
- "cargo:radroots_core@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
- "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
- "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
+ "cargo:radroots_blossom@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
+ "cargo:radroots_core@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
+ "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
+ "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
"cargo:serde@1.0.229?source=registry+https://github.com/rust-lang/crates.io-index",
"cargo:serde_json@1.0.151?source=registry+https://github.com/rust-lang/crates.io-index",
"cargo:sha2@0.10.9?source=registry+https://github.com/rust-lang/crates.io-index",
"cargo:unicode-general-category@1.1.0?source=registry+https://github.com/rust-lang/crates.io-index",
"cargo:url@2.5.8?source=registry+https://github.com/rust-lang/crates.io-index"
],
- "ref": "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f"
+ "ref": "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13"
},
{
"dependsOn": [
"cargo:hex@0.4.3?source=registry+https://github.com/rust-lang/crates.io-index",
- "cargo:radroots_blossom@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
- "cargo:radroots_core@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
- "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
- "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
- "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
+ "cargo:radroots_blossom@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
+ "cargo:radroots_core@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
+ "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
+ "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
+ "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
"cargo:secp256k1@0.29.1?source=registry+https://github.com/rust-lang/crates.io-index",
"cargo:serde@1.0.229?source=registry+https://github.com/rust-lang/crates.io-index",
"cargo:serde_json@1.0.151?source=registry+https://github.com/rust-lang/crates.io-index",
"cargo:sha2@0.10.9?source=registry+https://github.com/rust-lang/crates.io-index"
],
- "ref": "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f"
+ "ref": "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13"
},
{
"dependsOn": [
@@ -9319,51 +9319,51 @@
"cargo:serde@1.0.229?source=registry+https://github.com/rust-lang/crates.io-index",
"cargo:thiserror@2.0.19?source=registry+https://github.com/rust-lang/crates.io-index"
],
- "ref": "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f"
+ "ref": "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13"
},
{
"dependsOn": [
"cargo:base64@0.22.1?source=registry+https://github.com/rust-lang/crates.io-index",
"cargo:nostr@0.44.8?source=registry+https://github.com/rust-lang/crates.io-index",
- "cargo:radroots_blossom@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
- "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
- "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
- "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
- "cargo:radroots_signing@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
+ "cargo:radroots_blossom@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
+ "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
+ "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
+ "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
+ "cargo:radroots_signing@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
"cargo:serde@1.0.229?source=registry+https://github.com/rust-lang/crates.io-index",
"cargo:serde_json@1.0.151?source=registry+https://github.com/rust-lang/crates.io-index",
"cargo:thiserror@2.0.19?source=registry+https://github.com/rust-lang/crates.io-index"
],
- "ref": "cargo:radroots_nostr@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f"
+ "ref": "cargo:radroots_nostr@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13"
},
{
"dependsOn": [
"cargo:serde@1.0.229?source=registry+https://github.com/rust-lang/crates.io-index"
],
- "ref": "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f"
+ "ref": "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13"
},
{
"dependsOn": [
- "cargo:radroots_blossom@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
- "cargo:radroots_core@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
- "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
- "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
- "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
- "cargo:radroots_nostr@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
- "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
- "cargo:radroots_signing@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
- "cargo:radroots_storage@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
- "cargo:radroots_storage_sqlite@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
- "cargo:radroots_sync@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
- "cargo:radroots_trade@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
- "cargo:radroots_transport@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
- "cargo:radroots_transport_nostr@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
+ "cargo:radroots_blossom@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
+ "cargo:radroots_core@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
+ "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
+ "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
+ "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
+ "cargo:radroots_nostr@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
+ "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
+ "cargo:radroots_signing@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
+ "cargo:radroots_storage@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
+ "cargo:radroots_storage_sqlite@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
+ "cargo:radroots_sync@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
+ "cargo:radroots_trade@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
+ "cargo:radroots_transport@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
+ "cargo:radroots_transport_nostr@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
"cargo:reqwest@0.12.28?source=registry+https://github.com/rust-lang/crates.io-index",
"cargo:serde_json@1.0.151?source=registry+https://github.com/rust-lang/crates.io-index",
"cargo:tokio@1.53.1?source=registry+https://github.com/rust-lang/crates.io-index",
"cargo:uuid@1.24.0?source=registry+https://github.com/rust-lang/crates.io-index"
],
- "ref": "cargo:radroots_sdk@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f"
+ "ref": "cargo:radroots_sdk@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13"
},
{
"dependsOn": [
@@ -9372,81 +9372,81 @@
"cargo:subtle@2.6.1?source=registry+https://github.com/rust-lang/crates.io-index",
"cargo:zeroize@1.9.0?source=registry+https://github.com/rust-lang/crates.io-index"
],
- "ref": "cargo:radroots_secrets@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f"
+ "ref": "cargo:radroots_secrets@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13"
},
{
"dependsOn": [
"cargo:hex@0.4.3?source=registry+https://github.com/rust-lang/crates.io-index",
- "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
- "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
- "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
- "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
+ "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
+ "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
+ "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
+ "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
"cargo:serde@1.0.229?source=registry+https://github.com/rust-lang/crates.io-index",
"cargo:sha2@0.10.9?source=registry+https://github.com/rust-lang/crates.io-index"
],
- "ref": "cargo:radroots_signing@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f"
+ "ref": "cargo:radroots_signing@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13"
},
{
"dependsOn": [
- "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
- "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
- "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
- "cargo:radroots_trade@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
- "cargo:radroots_transport@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
+ "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
+ "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
+ "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
+ "cargo:radroots_trade@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
+ "cargo:radroots_transport@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
"cargo:serde@1.0.229?source=registry+https://github.com/rust-lang/crates.io-index",
"cargo:sha2@0.10.9?source=registry+https://github.com/rust-lang/crates.io-index"
],
- "ref": "cargo:radroots_storage@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f"
+ "ref": "cargo:radroots_storage@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13"
},
{
"dependsOn": [
"cargo:fs2@0.4.3?source=registry+https://github.com/rust-lang/crates.io-index",
- "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
- "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
- "cargo:radroots_secrets@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
- "cargo:radroots_storage@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
- "cargo:radroots_transport@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
+ "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
+ "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
+ "cargo:radroots_secrets@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
+ "cargo:radroots_storage@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
+ "cargo:radroots_transport@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
"cargo:serde@1.0.229?source=registry+https://github.com/rust-lang/crates.io-index",
"cargo:serde_json@1.0.151?source=registry+https://github.com/rust-lang/crates.io-index",
"cargo:sha2@0.10.9?source=registry+https://github.com/rust-lang/crates.io-index",
"cargo:sqlx@0.9.0?source=registry+https://github.com/rust-lang/crates.io-index"
],
- "ref": "cargo:radroots_storage_sqlite@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f"
+ "ref": "cargo:radroots_storage_sqlite@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13"
},
{
"dependsOn": [
- "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
- "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
- "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
- "cargo:radroots_signing@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
- "cargo:radroots_storage@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
- "cargo:radroots_trade@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
- "cargo:radroots_transport@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
+ "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
+ "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
+ "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
+ "cargo:radroots_signing@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
+ "cargo:radroots_storage@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
+ "cargo:radroots_trade@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
+ "cargo:radroots_transport@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
"cargo:sha2@0.10.9?source=registry+https://github.com/rust-lang/crates.io-index"
],
- "ref": "cargo:radroots_sync@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f"
+ "ref": "cargo:radroots_sync@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13"
},
{
"dependsOn": [
"cargo:hex@0.4.3?source=registry+https://github.com/rust-lang/crates.io-index",
- "cargo:radroots_core@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
- "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
- "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
+ "cargo:radroots_core@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
+ "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
+ "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
"cargo:serde@1.0.229?source=registry+https://github.com/rust-lang/crates.io-index",
"cargo:serde_json@1.0.151?source=registry+https://github.com/rust-lang/crates.io-index",
"cargo:sha2@0.10.9?source=registry+https://github.com/rust-lang/crates.io-index"
],
- "ref": "cargo:radroots_trade@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f"
+ "ref": "cargo:radroots_trade@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13"
},
{
"dependsOn": [
- "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
- "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
- "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
+ "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
+ "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
+ "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
"cargo:serde@1.0.229?source=registry+https://github.com/rust-lang/crates.io-index",
"cargo:sha2@0.10.9?source=registry+https://github.com/rust-lang/crates.io-index"
],
- "ref": "cargo:radroots_transport@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f"
+ "ref": "cargo:radroots_transport@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13"
},
{
"dependsOn": [
@@ -9454,17 +9454,17 @@
"cargo:futures@0.3.33?source=registry+https://github.com/rust-lang/crates.io-index",
"cargo:nostr-relay-pool@0.44.3?source=registry+https://github.com/rust-lang/crates.io-index",
"cargo:nostr-sdk@0.44.1?source=registry+https://github.com/rust-lang/crates.io-index",
- "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
- "cargo:radroots_nostr@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
- "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
- "cargo:radroots_transport@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
+ "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
+ "cargo:radroots_nostr@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
+ "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
+ "cargo:radroots_transport@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
"cargo:serde_json@1.0.151?source=registry+https://github.com/rust-lang/crates.io-index",
"cargo:sha2@0.10.9?source=registry+https://github.com/rust-lang/crates.io-index",
"cargo:tokio-tungstenite@0.26.2?source=registry+https://github.com/rust-lang/crates.io-index",
"cargo:tokio@1.53.1?source=registry+https://github.com/rust-lang/crates.io-index",
"cargo:url@2.5.8?source=registry+https://github.com/rust-lang/crates.io-index"
],
- "ref": "cargo:radroots_transport_nostr@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f"
+ "ref": "cargo:radroots_transport_nostr@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13"
},
{
"dependsOn": [
@@ -9959,18 +9959,18 @@
"cargo:jiff-tzdb@0.1.8?source=registry+https://github.com/rust-lang/crates.io-index",
"cargo:jiff@0.2.35?source=registry+https://github.com/rust-lang/crates.io-index",
"cargo:nostr@0.44.8?source=registry+https://github.com/rust-lang/crates.io-index",
- "cargo:radroots_blossom@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
- "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
- "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
- "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
- "cargo:radroots_nostr@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
- "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
- "cargo:radroots_sdk@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
- "cargo:radroots_signing@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
- "cargo:radroots_storage@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
- "cargo:radroots_sync@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
- "cargo:radroots_transport@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
- "cargo:radroots_transport_nostr@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
+ "cargo:radroots_blossom@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
+ "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
+ "cargo:radroots_event_codec@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
+ "cargo:radroots_identity@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
+ "cargo:radroots_nostr@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
+ "cargo:radroots_protocol@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
+ "cargo:radroots_sdk@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
+ "cargo:radroots_signing@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
+ "cargo:radroots_storage@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
+ "cargo:radroots_sync@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
+ "cargo:radroots_transport@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
+ "cargo:radroots_transport_nostr@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
"cargo:serde@1.0.229?source=registry+https://github.com/rust-lang/crates.io-index",
"cargo:serde_json@1.0.151?source=registry+https://github.com/rust-lang/crates.io-index",
"cargo:sha2@0.10.9?source=registry+https://github.com/rust-lang/crates.io-index",
@@ -9991,11 +9991,11 @@
"cargo:nostr-relay-builder@0.44.0?source=git+https://github.com/rust-nostr/nostr.git?rev=5bba5163eb77107f82c4a8262cf29d7f33a73219#5bba5163eb77107f82c4a8262cf29d7f33a73219",
"cargo:nostr-sdk@0.44.0?source=git+https://github.com/rust-nostr/nostr.git?rev=5bba5163eb77107f82c4a8262cf29d7f33a73219#5bba5163eb77107f82c4a8262cf29d7f33a73219",
"cargo:nostr@0.44.1?source=git+https://github.com/rust-nostr/nostr.git?rev=5bba5163eb77107f82c4a8262cf29d7f33a73219#5bba5163eb77107f82c4a8262cf29d7f33a73219",
- "cargo:radroots_blossom@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
- "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
- "cargo:radroots_sdk@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
- "cargo:radroots_signing@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
- "cargo:radroots_storage@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=e528bd0be26bdaa25266859ce139f59903b43f3f#e528bd0be26bdaa25266859ce139f59903b43f3f",
+ "cargo:radroots_blossom@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
+ "cargo:radroots_event@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
+ "cargo:radroots_sdk@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
+ "cargo:radroots_signing@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
+ "cargo:radroots_storage@0.1.0-alpha?source=git+https://github.com/radrootslabs/lib?rev=f578069cf894b34695bdf0ed2298e0aa162b5c13#f578069cf894b34695bdf0ed2298e0aa162b5c13",
"cargo:rustix@1.1.4?source=registry+https://github.com/rust-lang/crates.io-index",
"cargo:secp256k1@0.29.1?source=registry+https://github.com/rust-lang/crates.io-index",
"cargo:serde_json@1.0.151?source=registry+https://github.com/rust-lang/crates.io-index",
diff --git a/test-fixtures/legacy-identifiers.v1.json b/test-fixtures/legacy-identifiers.v1.json
@@ -905,6 +905,10 @@
"count": 5
},
{
+ "path": "TeraTests/TeraLateSigningTests.swift",
+ "count": 1
+ },
+ {
"path": "TeraTests/TeraSessionResourceTests.swift",
"count": 1
},
@@ -923,6 +927,10 @@
"count": 4
},
{
+ "path": "TeraTests/TeraLateSigningTests.swift",
+ "count": 1
+ },
+ {
"path": "TeraTests/TeraSessionResourceTests.swift",
"count": 1
},
@@ -995,6 +1003,10 @@
{
"path": "Tera/Views/RuntimeStatusView.swift",
"count": 5
+ },
+ {
+ "path": "TeraTests/TeraLateSigningTests.swift",
+ "count": 1
}
]
},
@@ -1107,6 +1119,10 @@
"count": 1
},
{
+ "path": "TeraTests/TeraLateSigningTests.swift",
+ "count": 1
+ },
+ {
"path": "TeraTests/TeraLifecycleTests.swift",
"count": 1
},
@@ -4119,6 +4135,10 @@
"count": 1
},
{
+ "path": "core/crates/tera_ffi/src/signer/evidence_tests.rs",
+ "count": 2
+ },
+ {
"path": "core/crates/tera_ffi/tests/local_mvp_real_io.rs",
"count": 1
},
@@ -4277,6 +4297,10 @@
"count": 1
},
{
+ "path": "core/crates/tera_ffi/src/signer/evidence_tests.rs",
+ "count": 1
+ },
+ {
"path": "core/crates/tera_ffi/tests/runtime_delegation.rs",
"count": 1
}
@@ -4437,6 +4461,10 @@
"count": 1
},
{
+ "path": "TeraTests/TeraLateSigningTests.swift",
+ "count": 1
+ },
+ {
"path": "TeraTests/TeraSessionResourceTests.swift",
"count": 1
},
@@ -4729,6 +4757,10 @@
"count": 1
},
{
+ "path": "core/crates/tera_ffi/src/signer/evidence_tests.rs",
+ "count": 1
+ },
+ {
"path": "scripts/test_app_dependency_graph.py",
"count": 1
},
@@ -4789,6 +4821,10 @@
{
"path": "core/crates/tera_ffi/src/signer.rs",
"count": 3
+ },
+ {
+ "path": "core/crates/tera_ffi/src/signer/evidence_tests.rs",
+ "count": 1
}
]
},
diff --git a/test-fixtures/maintainability-baseline.v1.json b/test-fixtures/maintainability-baseline.v1.json
@@ -8,7 +8,7 @@
"python_function_complexity": 10
},
"swift_file_exception": [
- {"path": "Tera/Runtime/TeraGeneratedRuntimeBackend.swift", "maximum_lines": 1458},
+ {"path": "Tera/Runtime/TeraGeneratedRuntimeBackend.swift", "maximum_lines": 1308},
{"path": "Tera/Runtime/TeraRuntimeClient.swift", "maximum_lines": 820},
{"path": "Tera/Runtime/TeraRuntimeModels.swift", "maximum_lines": 1154},
{"path": "Tera/State/TeraAddStore.swift", "maximum_lines": 783},
diff --git a/test-fixtures/swiftlint-maintainability-baseline.v1.json b/test-fixtures/swiftlint-maintainability-baseline.v1.json
@@ -1 +1 @@
-[{"text":" init(","violation":{"severity":"warning","location":{"character":3,"line":21,"file":"Tera\/App\/TeraAppModel.swift"},"ruleName":"Function Body Length","ruleIdentifier":"function_body_length","reason":"Initializer body should span 50 lines or less excluding comments and whitespace: currently spans 52 lines","ruleDescription":"Function bodies should not span too many lines"}},{"text":"actor TeraAddMediaCoordinator: TeraAddMediaHandling {","violation":{"severity":"warning","location":{"character":1,"line":55,"file":"Tera\/Runtime\/TeraAddMediaCoordinator.swift"},"ruleName":"Type Body Length","ruleIdentifier":"type_body_length","reason":"Actor body should span 250 lines or less excluding comments and whitespace: currently spans 321 lines","ruleDescription":"Type bodies should not span too many lines"}},{"text":"#endif","violation":{"severity":"warning","location":{"character":1,"line":456,"file":"Tera\/Runtime\/TeraAddMediaCoordinator.swift"},"ruleName":"File Length","ruleIdentifier":"file_length","reason":"File should contain 400 lines or less: currently contains 456","ruleDescription":"Files should not span too many lines."}},{"text":"final class TeraGeneratedRuntimeBackend: TeraRuntimeBackend, @unchecked Sendable {","violation":{"severity":"error","location":{"character":7,"line":111,"file":"Tera\/Runtime\/TeraGeneratedRuntimeBackend.swift"},"ruleName":"Type Body Length","ruleIdentifier":"type_body_length","reason":"Class body should span 350 lines or less excluding comments and whitespace: currently spans 455 lines","ruleDescription":"Type bodies should not span too many lines"}},{"text":"}","violation":{"severity":"error","location":{"character":1,"line":1430,"file":"Tera\/Runtime\/TeraGeneratedRuntimeBackend.swift"},"ruleName":"File Length","ruleIdentifier":"file_length","reason":"File should contain 1000 lines or less: currently contains 1430","ruleDescription":"Files should not span too many lines."}},{"text":"actor TeraRuntimeClient {","violation":{"severity":"error","location":{"character":1,"line":3,"file":"Tera\/Runtime\/TeraRuntimeClient.swift"},"ruleName":"Type Body Length","ruleIdentifier":"type_body_length","reason":"Actor body should span 350 lines or less excluding comments and whitespace: currently spans 698 lines","ruleDescription":"Type bodies should not span too many lines"}},{"text":" func changes(bufferCapacity: Int = 16) async throws -> AsyncStream<TeraRuntimeChange> {","violation":{"severity":"warning","location":{"character":3,"line":380,"file":"Tera\/Runtime\/TeraRuntimeClient.swift"},"ruleName":"Function Body Length","ruleIdentifier":"function_body_length","reason":"Function body should span 50 lines or less excluding comments and whitespace: currently spans 70 lines","ruleDescription":"Function bodies should not span too many lines"}},{"text":"}","violation":{"severity":"warning","location":{"character":1,"line":776,"file":"Tera\/Runtime\/TeraRuntimeClient.swift"},"ruleName":"File Length","ruleIdentifier":"file_length","reason":"File should contain 400 lines or less: currently contains 776","ruleDescription":"Files should not span too many lines."}},{"text":"}","violation":{"severity":"error","location":{"character":1,"line":1145,"file":"Tera\/Runtime\/TeraRuntimeModels.swift"},"ruleName":"File Length","ruleIdentifier":"file_length","reason":"File should contain 1000 lines or less: currently contains 1145","ruleDescription":"Files should not span too many lines."}},{"text":"final class TeraAddStore: ObservableObject {","violation":{"severity":"error","location":{"character":7,"line":4,"file":"Tera\/State\/TeraAddStore.swift"},"ruleName":"Type Body Length","ruleIdentifier":"type_body_length","reason":"Class body should span 350 lines or less excluding comments and whitespace: currently spans 524 lines","ruleDescription":"Type bodies should not span too many lines"}},{"text":"}","violation":{"severity":"warning","location":{"character":1,"line":712,"file":"Tera\/State\/TeraAddStore.swift"},"ruleName":"File Length","ruleIdentifier":"file_length","reason":"File should contain 400 lines or less: currently contains 712","ruleDescription":"Files should not span too many lines."}},{"text":"actor TeraConfigurationStore {","violation":{"severity":"error","location":{"character":1,"line":78,"file":"Tera\/State\/TeraConfigurationStore.swift"},"ruleName":"Type Body Length","ruleIdentifier":"type_body_length","reason":"Actor body should span 350 lines or less excluding comments and whitespace: currently spans 468 lines","ruleDescription":"Type bodies should not span too many lines"}},{"text":" func load() throws -> TeraAppConfiguration {","violation":{"severity":"error","location":{"character":5,"line":148,"file":"Tera\/State\/TeraConfigurationStore.swift"},"ruleName":"Function Body Length","ruleIdentifier":"function_body_length","reason":"Function body should span 100 lines or less excluding comments and whitespace: currently spans 109 lines","ruleDescription":"Function bodies should not span too many lines"}},{"text":"}","violation":{"severity":"warning","location":{"character":1,"line":759,"file":"Tera\/State\/TeraConfigurationStore.swift"},"ruleName":"File Length","ruleIdentifier":"file_length","reason":"File should contain 400 lines or less: currently contains 759","ruleDescription":"Files should not span too many lines."}},{"text":"actor TeraSessionStore {","violation":{"severity":"error","location":{"character":1,"line":39,"file":"Tera\/State\/TeraSessionStore.swift"},"ruleName":"Type Body Length","ruleIdentifier":"type_body_length","reason":"Actor body should span 350 lines or less excluding comments and whitespace: currently spans 390 lines","ruleDescription":"Type bodies should not span too many lines"}},{"text":" private func start(acceptingReconfiguration: Bool) async -> TeraSessionPhase {","violation":{"severity":"warning","location":{"character":11,"line":125,"file":"Tera\/State\/TeraSessionStore.swift"},"ruleName":"Cyclomatic Complexity","ruleIdentifier":"cyclomatic_complexity","reason":"Function should have complexity 10 or less; currently complexity is 13","ruleDescription":"Complexity of function bodies should be limited."}},{"text":"}","violation":{"severity":"warning","location":{"character":1,"line":452,"file":"Tera\/State\/TeraSessionStore.swift"},"ruleName":"File Length","ruleIdentifier":"file_length","reason":"File should contain 400 lines or less: currently contains 452","ruleDescription":"Files should not span too many lines."}},{"text":"struct TeraAddView: View {","violation":{"severity":"warning","location":{"character":1,"line":4,"file":"Tera\/Views\/TeraAddView.swift"},"ruleName":"Type Body Length","ruleIdentifier":"type_body_length","reason":"Struct body should span 250 lines or less excluding comments and whitespace: currently spans 342 lines","ruleDescription":"Type bodies should not span too many lines"}},{"text":"struct TeraSettingsView: View {","violation":{"severity":"warning","location":{"character":1,"line":365,"file":"Tera\/Views\/TeraSupportingViews.swift"},"ruleName":"Type Body Length","ruleIdentifier":"type_body_length","reason":"Struct body should span 250 lines or less excluding comments and whitespace: currently spans 259 lines","ruleDescription":"Type bodies should not span too many lines"}},{"text":"}","violation":{"severity":"warning","location":{"character":1,"line":629,"file":"Tera\/Views\/TeraSupportingViews.swift"},"ruleName":"File Length","ruleIdentifier":"file_length","reason":"File should contain 400 lines or less: currently contains 629","ruleDescription":"Files should not span too many lines."}},{"text":"final class TeraAddStoreTests: XCTestCase {","violation":{"severity":"error","location":{"character":7,"line":6,"file":"TeraTests\/TeraAddStoreTests.swift"},"ruleName":"Type Body Length","ruleIdentifier":"type_body_length","reason":"Class body should span 350 lines or less excluding comments and whitespace: currently spans 637 lines","ruleDescription":"Type bodies should not span too many lines"}},{"text":"actor AddBackend: TeraRuntimeBackend {","violation":{"severity":"error","location":{"character":1,"line":717,"file":"TeraTests\/TeraAddStoreTests.swift"},"ruleName":"Type Body Length","ruleIdentifier":"type_body_length","reason":"Actor body should span 350 lines or less excluding comments and whitespace: currently spans 454 lines","ruleDescription":"Type bodies should not span too many lines"}},{"text":" private func makeStatus(","violation":{"severity":"warning","location":{"character":11,"line":1118,"file":"TeraTests\/TeraAddStoreTests.swift"},"ruleName":"Function Parameter Count","ruleIdentifier":"function_parameter_count","reason":"Function should have 5 parameters or less: it currently has 8","ruleDescription":"Number of function parameters should be low."}},{"text":"}","violation":{"severity":"error","location":{"character":1,"line":1330,"file":"TeraTests\/TeraAddStoreTests.swift"},"ruleName":"File Length","ruleIdentifier":"file_length","reason":"File should contain 1000 lines or less: currently contains 1330","ruleDescription":"Files should not span too many lines."}},{"text":"final class TeraRemoteQualificationTests: XCTestCase {","violation":{"severity":"warning","location":{"character":7,"line":7,"file":"TeraTests\/TeraRemoteQualificationTests.swift"},"ruleName":"Type Body Length","ruleIdentifier":"type_body_length","reason":"Class body should span 250 lines or less excluding comments and whitespace: currently spans 307 lines","ruleDescription":"Type bodies should not span too many lines"}},{"text":" func testQualificationRejectsAmbiguousOrUnsafeHarnessValues() {","violation":{"severity":"warning","location":{"character":3,"line":45,"file":"TeraTests\/TeraRemoteQualificationTests.swift"},"ruleName":"Function Body Length","ruleIdentifier":"function_body_length","reason":"Function body should span 50 lines or less excluding comments and whitespace: currently spans 94 lines","ruleDescription":"Function bodies should not span too many lines"}},{"text":" func testAuthorizationEvidenceIsRedactedEphemeralAndRelaunchCleaned() throws {","violation":{"severity":"warning","location":{"character":3,"line":212,"file":"TeraTests\/TeraRemoteQualificationTests.swift"},"ruleName":"Function Body Length","ruleIdentifier":"function_body_length","reason":"Function body should span 50 lines or less excluding comments and whitespace: currently spans 53 lines","ruleDescription":"Function bodies should not span too many lines"}},{"text":"final class TeraRuntimeClientTests: XCTestCase {","violation":{"severity":"warning","location":{"character":7,"line":4,"file":"TeraTests\/TeraRuntimeClientTests.swift"},"ruleName":"Type Body Length","ruleIdentifier":"type_body_length","reason":"Class body should span 250 lines or less excluding comments and whitespace: currently spans 298 lines","ruleDescription":"Type bodies should not span too many lines"}},{"text":"final class TeraStateMigrationTests: XCTestCase {","violation":{"severity":"error","location":{"character":7,"line":6,"file":"TeraTests\/TeraStateMigrationTests.swift"},"ruleName":"Type Body Length","ruleIdentifier":"type_body_length","reason":"Class body should span 350 lines or less excluding comments and whitespace: currently spans 580 lines","ruleDescription":"Type bodies should not span too many lines"}},{"text":" func testRelayValidationMatchesRuntimeProfiles() throws {","violation":{"severity":"warning","location":{"character":5,"line":7,"file":"TeraTests\/TeraStateMigrationTests.swift"},"ruleName":"Function Body Length","ruleIdentifier":"function_body_length","reason":"Function body should span 50 lines or less excluding comments and whitespace: currently spans 61 lines","ruleDescription":"Function bodies should not span too many lines"}},{"text":"}","violation":{"severity":"warning","location":{"character":1,"line":622,"file":"TeraTests\/TeraStateMigrationTests.swift"},"ruleName":"File Length","ruleIdentifier":"file_length","reason":"File should contain 400 lines or less: currently contains 622","ruleDescription":"Files should not span too many lines."}},{"text":"private actor SupportingBackend: TeraRuntimeBackend {","violation":{"severity":"warning","location":{"character":9,"line":207,"file":"TeraTests\/TeraSupportingStoreTests.swift"},"ruleName":"Type Body Length","ruleIdentifier":"type_body_length","reason":"Actor body should span 250 lines or less excluding comments and whitespace: currently spans 252 lines","ruleDescription":"Type bodies should not span too many lines"}},{"text":"}","violation":{"severity":"warning","location":{"character":1,"line":486,"file":"TeraTests\/TeraSupportingStoreTests.swift"},"ruleName":"File Length","ruleIdentifier":"file_length","reason":"File should contain 400 lines or less: currently contains 486","ruleDescription":"Files should not span too many lines."}},{"text":"final class TeraRemoteQualificationUITests: XCTestCase {","violation":{"severity":"error","location":{"character":7,"line":4,"file":"TeraUITests\/TeraRemoteQualificationUITests.swift"},"ruleName":"Type Body Length","ruleIdentifier":"type_body_length","reason":"Class body should span 350 lines or less excluding comments and whitespace: currently spans 1365 lines","ruleDescription":"Type bodies should not span too many lines"}},{"text":" func testLocalSocialFiveFlowScenario() throws {","violation":{"severity":"warning","location":{"character":3,"line":62,"file":"TeraUITests\/TeraRemoteQualificationUITests.swift"},"ruleName":"Function Body Length","ruleIdentifier":"function_body_length","reason":"Function body should span 50 lines or less excluding comments and whitespace: currently spans 65 lines","ruleDescription":"Function bodies should not span too many lines"}},{"text":" func testLocalSocialDeterministicPersonas() throws {","violation":{"severity":"warning","location":{"character":3,"line":166,"file":"TeraUITests\/TeraRemoteQualificationUITests.swift"},"ruleName":"Function Body Length","ruleIdentifier":"function_body_length","reason":"Function body should span 50 lines or less excluding comments and whitespace: currently spans 66 lines","ruleDescription":"Function bodies should not span too many lines"}},{"text":" func testRemoteBlossomUploadAndRecovery() throws {","violation":{"severity":"warning","location":{"character":3,"line":239,"file":"TeraUITests\/TeraRemoteQualificationUITests.swift"},"ruleName":"Function Body Length","ruleIdentifier":"function_body_length","reason":"Function body should span 50 lines or less excluding comments and whitespace: currently spans 54 lines","ruleDescription":"Function bodies should not span too many lines"}},{"text":" private func expectedAddFieldLabel(_ identifier: String, type: String) -> String {","violation":{"severity":"warning","location":{"character":11,"line":566,"file":"TeraUITests\/TeraRemoteQualificationUITests.swift"},"ruleName":"Cyclomatic Complexity","ruleIdentifier":"cyclomatic_complexity","reason":"Function should have complexity 10 or less; currently complexity is 18","ruleDescription":"Complexity of function bodies should be limited."}},{"text":" static func environment(","violation":{"severity":"warning","location":{"character":10,"line":1601,"file":"TeraUITests\/TeraRemoteQualificationUITests.swift"},"ruleName":"Function Body Length","ruleIdentifier":"function_body_length","reason":"Function body should span 50 lines or less excluding comments and whitespace: currently spans 67 lines","ruleDescription":"Function bodies should not span too many lines"}},{"text":"}","violation":{"severity":"error","location":{"character":1,"line":2077,"file":"TeraUITests\/TeraRemoteQualificationUITests.swift"},"ruleName":"File Length","ruleIdentifier":"file_length","reason":"File should contain 1000 lines or less: currently contains 2077","ruleDescription":"Files should not span too many lines."}}]
-\ No newline at end of file
+[{"text":" init(","violation":{"severity":"warning","location":{"character":3,"line":21,"file":"Tera\/App\/TeraAppModel.swift"},"ruleName":"Function Body Length","ruleIdentifier":"function_body_length","reason":"Initializer body should span 50 lines or less excluding comments and whitespace: currently spans 52 lines","ruleDescription":"Function bodies should not span too many lines"}},{"text":"actor TeraAddMediaCoordinator: TeraAddMediaHandling {","violation":{"severity":"warning","location":{"character":1,"line":55,"file":"Tera\/Runtime\/TeraAddMediaCoordinator.swift"},"ruleName":"Type Body Length","ruleIdentifier":"type_body_length","reason":"Actor body should span 250 lines or less excluding comments and whitespace: currently spans 321 lines","ruleDescription":"Type bodies should not span too many lines"}},{"text":"#endif","violation":{"severity":"warning","location":{"character":1,"line":456,"file":"Tera\/Runtime\/TeraAddMediaCoordinator.swift"},"ruleName":"File Length","ruleIdentifier":"file_length","reason":"File should contain 400 lines or less: currently contains 456","ruleDescription":"Files should not span too many lines."}},{"text":"final class TeraGeneratedRuntimeBackend: TeraRuntimeBackend, @unchecked Sendable {","violation":{"severity":"error","location":{"character":7,"line":111,"file":"Tera\/Runtime\/TeraGeneratedRuntimeBackend.swift"},"ruleName":"Type Body Length","ruleIdentifier":"type_body_length","reason":"Class body should span 350 lines or less excluding comments and whitespace: currently spans 455 lines","ruleDescription":"Type bodies should not span too many lines"}},{"text":"}","violation":{"severity":"error","location":{"character":1,"line":1308,"file":"Tera\/Runtime\/TeraGeneratedRuntimeBackend.swift"},"ruleName":"File Length","ruleIdentifier":"file_length","reason":"File should contain 1000 lines or less: currently contains 1308","ruleDescription":"Files should not span too many lines."}},{"text":"actor TeraRuntimeClient {","violation":{"severity":"error","location":{"character":1,"line":3,"file":"Tera\/Runtime\/TeraRuntimeClient.swift"},"ruleName":"Type Body Length","ruleIdentifier":"type_body_length","reason":"Actor body should span 350 lines or less excluding comments and whitespace: currently spans 698 lines","ruleDescription":"Type bodies should not span too many lines"}},{"text":" func changes(bufferCapacity: Int = 16) async throws -> AsyncStream<TeraRuntimeChange> {","violation":{"severity":"warning","location":{"character":3,"line":380,"file":"Tera\/Runtime\/TeraRuntimeClient.swift"},"ruleName":"Function Body Length","ruleIdentifier":"function_body_length","reason":"Function body should span 50 lines or less excluding comments and whitespace: currently spans 70 lines","ruleDescription":"Function bodies should not span too many lines"}},{"text":"}","violation":{"severity":"warning","location":{"character":1,"line":776,"file":"Tera\/Runtime\/TeraRuntimeClient.swift"},"ruleName":"File Length","ruleIdentifier":"file_length","reason":"File should contain 400 lines or less: currently contains 776","ruleDescription":"Files should not span too many lines."}},{"text":"}","violation":{"severity":"error","location":{"character":1,"line":1145,"file":"Tera\/Runtime\/TeraRuntimeModels.swift"},"ruleName":"File Length","ruleIdentifier":"file_length","reason":"File should contain 1000 lines or less: currently contains 1145","ruleDescription":"Files should not span too many lines."}},{"text":"final class TeraAddStore: ObservableObject {","violation":{"severity":"error","location":{"character":7,"line":4,"file":"Tera\/State\/TeraAddStore.swift"},"ruleName":"Type Body Length","ruleIdentifier":"type_body_length","reason":"Class body should span 350 lines or less excluding comments and whitespace: currently spans 524 lines","ruleDescription":"Type bodies should not span too many lines"}},{"text":"}","violation":{"severity":"warning","location":{"character":1,"line":712,"file":"Tera\/State\/TeraAddStore.swift"},"ruleName":"File Length","ruleIdentifier":"file_length","reason":"File should contain 400 lines or less: currently contains 712","ruleDescription":"Files should not span too many lines."}},{"text":"actor TeraConfigurationStore {","violation":{"severity":"error","location":{"character":1,"line":78,"file":"Tera\/State\/TeraConfigurationStore.swift"},"ruleName":"Type Body Length","ruleIdentifier":"type_body_length","reason":"Actor body should span 350 lines or less excluding comments and whitespace: currently spans 468 lines","ruleDescription":"Type bodies should not span too many lines"}},{"text":" func load() throws -> TeraAppConfiguration {","violation":{"severity":"error","location":{"character":5,"line":148,"file":"Tera\/State\/TeraConfigurationStore.swift"},"ruleName":"Function Body Length","ruleIdentifier":"function_body_length","reason":"Function body should span 100 lines or less excluding comments and whitespace: currently spans 109 lines","ruleDescription":"Function bodies should not span too many lines"}},{"text":"}","violation":{"severity":"warning","location":{"character":1,"line":759,"file":"Tera\/State\/TeraConfigurationStore.swift"},"ruleName":"File Length","ruleIdentifier":"file_length","reason":"File should contain 400 lines or less: currently contains 759","ruleDescription":"Files should not span too many lines."}},{"text":"actor TeraSessionStore {","violation":{"severity":"error","location":{"character":1,"line":39,"file":"Tera\/State\/TeraSessionStore.swift"},"ruleName":"Type Body Length","ruleIdentifier":"type_body_length","reason":"Actor body should span 350 lines or less excluding comments and whitespace: currently spans 390 lines","ruleDescription":"Type bodies should not span too many lines"}},{"text":" private func start(acceptingReconfiguration: Bool) async -> TeraSessionPhase {","violation":{"severity":"warning","location":{"character":11,"line":125,"file":"Tera\/State\/TeraSessionStore.swift"},"ruleName":"Cyclomatic Complexity","ruleIdentifier":"cyclomatic_complexity","reason":"Function should have complexity 10 or less; currently complexity is 13","ruleDescription":"Complexity of function bodies should be limited."}},{"text":"}","violation":{"severity":"warning","location":{"character":1,"line":452,"file":"Tera\/State\/TeraSessionStore.swift"},"ruleName":"File Length","ruleIdentifier":"file_length","reason":"File should contain 400 lines or less: currently contains 452","ruleDescription":"Files should not span too many lines."}},{"text":"struct TeraAddView: View {","violation":{"severity":"warning","location":{"character":1,"line":4,"file":"Tera\/Views\/TeraAddView.swift"},"ruleName":"Type Body Length","ruleIdentifier":"type_body_length","reason":"Struct body should span 250 lines or less excluding comments and whitespace: currently spans 342 lines","ruleDescription":"Type bodies should not span too many lines"}},{"text":"struct TeraSettingsView: View {","violation":{"severity":"warning","location":{"character":1,"line":365,"file":"Tera\/Views\/TeraSupportingViews.swift"},"ruleName":"Type Body Length","ruleIdentifier":"type_body_length","reason":"Struct body should span 250 lines or less excluding comments and whitespace: currently spans 259 lines","ruleDescription":"Type bodies should not span too many lines"}},{"text":"}","violation":{"severity":"warning","location":{"character":1,"line":629,"file":"Tera\/Views\/TeraSupportingViews.swift"},"ruleName":"File Length","ruleIdentifier":"file_length","reason":"File should contain 400 lines or less: currently contains 629","ruleDescription":"Files should not span too many lines."}},{"text":"final class TeraAddStoreTests: XCTestCase {","violation":{"severity":"error","location":{"character":7,"line":6,"file":"TeraTests\/TeraAddStoreTests.swift"},"ruleName":"Type Body Length","ruleIdentifier":"type_body_length","reason":"Class body should span 350 lines or less excluding comments and whitespace: currently spans 637 lines","ruleDescription":"Type bodies should not span too many lines"}},{"text":"actor AddBackend: TeraRuntimeBackend {","violation":{"severity":"error","location":{"character":1,"line":717,"file":"TeraTests\/TeraAddStoreTests.swift"},"ruleName":"Type Body Length","ruleIdentifier":"type_body_length","reason":"Actor body should span 350 lines or less excluding comments and whitespace: currently spans 454 lines","ruleDescription":"Type bodies should not span too many lines"}},{"text":" private func makeStatus(","violation":{"severity":"warning","location":{"character":11,"line":1118,"file":"TeraTests\/TeraAddStoreTests.swift"},"ruleName":"Function Parameter Count","ruleIdentifier":"function_parameter_count","reason":"Function should have 5 parameters or less: it currently has 8","ruleDescription":"Number of function parameters should be low."}},{"text":"}","violation":{"severity":"error","location":{"character":1,"line":1330,"file":"TeraTests\/TeraAddStoreTests.swift"},"ruleName":"File Length","ruleIdentifier":"file_length","reason":"File should contain 1000 lines or less: currently contains 1330","ruleDescription":"Files should not span too many lines."}},{"text":"final class TeraRemoteQualificationTests: XCTestCase {","violation":{"severity":"warning","location":{"character":7,"line":7,"file":"TeraTests\/TeraRemoteQualificationTests.swift"},"ruleName":"Type Body Length","ruleIdentifier":"type_body_length","reason":"Class body should span 250 lines or less excluding comments and whitespace: currently spans 307 lines","ruleDescription":"Type bodies should not span too many lines"}},{"text":" func testQualificationRejectsAmbiguousOrUnsafeHarnessValues() {","violation":{"severity":"warning","location":{"character":3,"line":45,"file":"TeraTests\/TeraRemoteQualificationTests.swift"},"ruleName":"Function Body Length","ruleIdentifier":"function_body_length","reason":"Function body should span 50 lines or less excluding comments and whitespace: currently spans 94 lines","ruleDescription":"Function bodies should not span too many lines"}},{"text":" func testAuthorizationEvidenceIsRedactedEphemeralAndRelaunchCleaned() throws {","violation":{"severity":"warning","location":{"character":3,"line":212,"file":"TeraTests\/TeraRemoteQualificationTests.swift"},"ruleName":"Function Body Length","ruleIdentifier":"function_body_length","reason":"Function body should span 50 lines or less excluding comments and whitespace: currently spans 53 lines","ruleDescription":"Function bodies should not span too many lines"}},{"text":"final class TeraRuntimeClientTests: XCTestCase {","violation":{"severity":"warning","location":{"character":7,"line":4,"file":"TeraTests\/TeraRuntimeClientTests.swift"},"ruleName":"Type Body Length","ruleIdentifier":"type_body_length","reason":"Class body should span 250 lines or less excluding comments and whitespace: currently spans 298 lines","ruleDescription":"Type bodies should not span too many lines"}},{"text":"final class TeraStateMigrationTests: XCTestCase {","violation":{"severity":"error","location":{"character":7,"line":6,"file":"TeraTests\/TeraStateMigrationTests.swift"},"ruleName":"Type Body Length","ruleIdentifier":"type_body_length","reason":"Class body should span 350 lines or less excluding comments and whitespace: currently spans 580 lines","ruleDescription":"Type bodies should not span too many lines"}},{"text":" func testRelayValidationMatchesRuntimeProfiles() throws {","violation":{"severity":"warning","location":{"character":5,"line":7,"file":"TeraTests\/TeraStateMigrationTests.swift"},"ruleName":"Function Body Length","ruleIdentifier":"function_body_length","reason":"Function body should span 50 lines or less excluding comments and whitespace: currently spans 61 lines","ruleDescription":"Function bodies should not span too many lines"}},{"text":"}","violation":{"severity":"warning","location":{"character":1,"line":622,"file":"TeraTests\/TeraStateMigrationTests.swift"},"ruleName":"File Length","ruleIdentifier":"file_length","reason":"File should contain 400 lines or less: currently contains 622","ruleDescription":"Files should not span too many lines."}},{"text":"private actor SupportingBackend: TeraRuntimeBackend {","violation":{"severity":"warning","location":{"character":9,"line":207,"file":"TeraTests\/TeraSupportingStoreTests.swift"},"ruleName":"Type Body Length","ruleIdentifier":"type_body_length","reason":"Actor body should span 250 lines or less excluding comments and whitespace: currently spans 252 lines","ruleDescription":"Type bodies should not span too many lines"}},{"text":"}","violation":{"severity":"warning","location":{"character":1,"line":486,"file":"TeraTests\/TeraSupportingStoreTests.swift"},"ruleName":"File Length","ruleIdentifier":"file_length","reason":"File should contain 400 lines or less: currently contains 486","ruleDescription":"Files should not span too many lines."}},{"text":"final class TeraRemoteQualificationUITests: XCTestCase {","violation":{"severity":"error","location":{"character":7,"line":4,"file":"TeraUITests\/TeraRemoteQualificationUITests.swift"},"ruleName":"Type Body Length","ruleIdentifier":"type_body_length","reason":"Class body should span 350 lines or less excluding comments and whitespace: currently spans 1365 lines","ruleDescription":"Type bodies should not span too many lines"}},{"text":" func testLocalSocialFiveFlowScenario() throws {","violation":{"severity":"warning","location":{"character":3,"line":62,"file":"TeraUITests\/TeraRemoteQualificationUITests.swift"},"ruleName":"Function Body Length","ruleIdentifier":"function_body_length","reason":"Function body should span 50 lines or less excluding comments and whitespace: currently spans 65 lines","ruleDescription":"Function bodies should not span too many lines"}},{"text":" func testLocalSocialDeterministicPersonas() throws {","violation":{"severity":"warning","location":{"character":3,"line":166,"file":"TeraUITests\/TeraRemoteQualificationUITests.swift"},"ruleName":"Function Body Length","ruleIdentifier":"function_body_length","reason":"Function body should span 50 lines or less excluding comments and whitespace: currently spans 66 lines","ruleDescription":"Function bodies should not span too many lines"}},{"text":" func testRemoteBlossomUploadAndRecovery() throws {","violation":{"severity":"warning","location":{"character":3,"line":239,"file":"TeraUITests\/TeraRemoteQualificationUITests.swift"},"ruleName":"Function Body Length","ruleIdentifier":"function_body_length","reason":"Function body should span 50 lines or less excluding comments and whitespace: currently spans 54 lines","ruleDescription":"Function bodies should not span too many lines"}},{"text":" private func expectedAddFieldLabel(_ identifier: String, type: String) -> String {","violation":{"severity":"warning","location":{"character":11,"line":566,"file":"TeraUITests\/TeraRemoteQualificationUITests.swift"},"ruleName":"Cyclomatic Complexity","ruleIdentifier":"cyclomatic_complexity","reason":"Function should have complexity 10 or less; currently complexity is 18","ruleDescription":"Complexity of function bodies should be limited."}},{"text":" static func environment(","violation":{"severity":"warning","location":{"character":10,"line":1601,"file":"TeraUITests\/TeraRemoteQualificationUITests.swift"},"ruleName":"Function Body Length","ruleIdentifier":"function_body_length","reason":"Function body should span 50 lines or less excluding comments and whitespace: currently spans 67 lines","ruleDescription":"Function bodies should not span too many lines"}},{"text":"}","violation":{"severity":"error","location":{"character":1,"line":2077,"file":"TeraUITests\/TeraRemoteQualificationUITests.swift"},"ruleName":"File Length","ruleIdentifier":"file_length","reason":"File should contain 1000 lines or less: currently contains 2077","ruleDescription":"Files should not span too many lines."}}]
+\ No newline at end of file