field_ios

In-the-field app for Radroots on iOS
git clone https://radroots.dev/git/field_ios.git
Log | Files | Refs | README | LICENSE

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:
MCargo.lock | 32++++++++++++++++----------------
MCargo.toml | 24++++++++++++------------
MPackage.swift | 1+
MTera.xcodeproj/project.pbxproj | 4++++
ATera/Runtime/TeraGeneratedHostSigner.swift | 125+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
MTera/Runtime/TeraGeneratedRuntimeBackend.swift | 122-------------------------------------------------------------------------------
MTera/Runtime/TeraRuntimeClientSubmission.swift | 2+-
MTeraFFI/provenance.json | 62+++++++++++++++++++++++++++++++-------------------------------
MTeraFFI/source.lock | 6+++---
MTeraFFI/source/aarch64-apple-darwin.json | 112++++++++++++++++++++++++++++++++++++++++++++++---------------------------------
MTeraFFI/source/aarch64-apple-ios-sim.json | 112++++++++++++++++++++++++++++++++++++++++++++++---------------------------------
MTeraFFI/source/aarch64-apple-ios.json | 112++++++++++++++++++++++++++++++++++++++++++++++---------------------------------
ATeraTests/TeraLateSigningTests.swift | 191+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mcore/crates/tera_ffi/src/signer.rs | 63++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-----
Acore/crates/tera_ffi/src/signer/evidence_tests.rs | 176+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acore/crates/tera_ffi/tests/submission_late_signing.rs | 240+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acore/test-fixtures/tera_ffi/signing_evidence_decision.v1.json | 11+++++++++++
Mproject.yml | 1+
Mradroots.lib.source-lock.v1.toml | 6+++---
Mrelease/provenance.json | 14+++++++-------
Mrelease/sbom.cdx.json | 248++++++++++++++++++++++++++++++++++++++++----------------------------------------
Mtest-fixtures/legacy-identifiers.v1.json | 36++++++++++++++++++++++++++++++++++++
Mtest-fixtures/maintainability-baseline.v1.json | 2+-
Mtest-fixtures/swiftlint-maintainability-baseline.v1.json | 4++--
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