diff --git a/protobufs/user_agent.proto b/protobufs/user_agent.proto index 84d3d3d..ee3af0e 100644 --- a/protobufs/user_agent.proto +++ b/protobufs/user_agent.proto @@ -30,7 +30,8 @@ message SdkClientRevokeRequest { message SdkClientEntry { int32 id = 1; bytes pubkey = 2; - int32 created_at = 3; + arbiter.client.ClientInfo info = 3; + int32 created_at = 4; } message SdkClientList { diff --git a/server/crates/arbiter-server/src/actors/user_agent/session.rs b/server/crates/arbiter-server/src/actors/user_agent/session.rs index 70e4668..d558e90 100644 --- a/server/crates/arbiter-server/src/actors/user_agent/session.rs +++ b/server/crates/arbiter-server/src/actors/user_agent/session.rs @@ -25,6 +25,19 @@ pub enum Error { Internal { message: Cow<'static, str> }, } +impl From for Error { + fn from(err: crate::db::PoolError) -> Self { + error!(?err, "Database pool error"); + Self::internal("Database pool error") + } +} +impl From for Error { + fn from(err: diesel::result::Error) -> Self { + error!(?err, "Database error"); + Self::internal("Database error") + } +} + impl Error { pub fn internal(message: impl Into>) -> Self { Self::Internal { @@ -49,7 +62,7 @@ mod connection; pub(crate) use connection::{ BootstrapError, HandleBootstrapEncryptedKey, HandleEvmWalletCreate, HandleEvmWalletList, HandleGrantCreate, HandleGrantDelete, HandleGrantList, HandleNewClientApprove, - HandleQueryVaultState, + HandleQueryVaultState, HandleSdkClientList, }; pub use connection::{HandleUnsealEncryptedKey, HandleUnsealRequest, UnsealError}; diff --git a/server/crates/arbiter-server/src/actors/user_agent/session/connection.rs b/server/crates/arbiter-server/src/actors/user_agent/session/connection.rs index b21872a..397b563 100644 --- a/server/crates/arbiter-server/src/actors/user_agent/session/connection.rs +++ b/server/crates/arbiter-server/src/actors/user_agent/session/connection.rs @@ -2,15 +2,18 @@ use std::sync::Mutex; use alloy::primitives::Address; use chacha20poly1305::{AeadInPlace, XChaCha20Poly1305, XNonce, aead::KeyInit}; +use diesel::{QueryDsl as _, SelectableHelper}; +use diesel_async::RunQueryDsl; use kameo::error::SendError; -use kameo::messages; use kameo::prelude::Context; +use kameo::{message, messages}; use tracing::{error, info}; use x25519_dalek::{EphemeralSecret, PublicKey}; use crate::actors::flow_coordinator::client_connect_approval::ClientApprovalAnswer; use crate::actors::keyholder::KeyHolderState; use crate::actors::user_agent::session::Error; +use crate::db::models::{ProgramClient, ProgramClientMetadata}; use crate::evm::policies::{Grant, SpecificGrant}; use crate::safe_cell::SafeCell; use crate::{ @@ -383,4 +386,20 @@ impl UserAgentSession { Ok(()) } -} + + #[message] + pub(crate) async fn handle_sdk_client_list( + &mut self, + ) -> Result, Error> { + use crate::db::schema::{program_client, client_metadata}; + let mut conn = self.props.db.get().await?; + + let clients = program_client::table + .inner_join(client_metadata::table) + .select((ProgramClient::as_select(), ProgramClientMetadata::as_select())) + .load::<(ProgramClient, ProgramClientMetadata)>(&mut conn) + .await?; + + Ok(clients) + } +} \ No newline at end of file diff --git a/server/crates/arbiter-server/src/grpc/user_agent.rs b/server/crates/arbiter-server/src/grpc/user_agent.rs index e80370b..6855d54 100644 --- a/server/crates/arbiter-server/src/grpc/user_agent.rs +++ b/server/crates/arbiter-server/src/grpc/user_agent.rs @@ -21,10 +21,14 @@ use arbiter_proto::{ user_agent::{ BootstrapEncryptedKey as ProtoBootstrapEncryptedKey, BootstrapResult as ProtoBootstrapResult, + SdkClientEntry as ProtoSdkClientEntry, SdkClientError as ProtoSdkClientError, SdkClientConnectionCancel as ProtoSdkClientConnectionCancel, SdkClientConnectionRequest as ProtoSdkClientConnectionRequest, + SdkClientList as ProtoSdkClientList, + SdkClientListResponse as ProtoSdkClientListResponse, UnsealEncryptedKey as ProtoUnsealEncryptedKey, UnsealResult as ProtoUnsealResult, UnsealStart, UserAgentRequest, UserAgentResponse, VaultState as ProtoVaultState, + sdk_client_list_response::Result as ProtoSdkClientListResult, user_agent_request::Payload as UserAgentRequestPayload, user_agent_response::Payload as UserAgentResponsePayload, }, @@ -49,7 +53,8 @@ use crate::{ session::{ BootstrapError, Error, HandleBootstrapEncryptedKey, HandleEvmWalletCreate, HandleEvmWalletList, HandleGrantCreate, HandleGrantDelete, HandleGrantList, - HandleNewClientApprove, HandleQueryVaultState, HandleUnsealEncryptedKey, + HandleNewClientApprove, HandleQueryVaultState, HandleSdkClientList, + HandleUnsealEncryptedKey, HandleUnsealRequest, UnsealError, }, }, @@ -303,7 +308,11 @@ async fn dispatch_conn_message( return Ok(()); } UserAgentRequestPayload::SdkClientRevoke(_sdk_client_revoke_request) => todo!(), - UserAgentRequestPayload::SdkClientList(_) => todo!(), + UserAgentRequestPayload::SdkClientList(_) => { + UserAgentResponsePayload::SdkClientListResponse( + SdkClient::list_response(actor.ask(HandleSdkClientList {}).await), + ) + }, UserAgentRequestPayload::AuthChallengeRequest(..) | UserAgentRequestPayload::AuthChallengeSolution(..) => { warn!(?payload, "Unsupported post-auth user agent request"); @@ -355,6 +364,43 @@ async fn send_out_of_band( .map_err(|_| ()) } +struct SdkClient; + +impl SdkClient { + fn list_response( + result: Result< + Vec<(crate::db::models::ProgramClient, crate::db::models::ProgramClientMetadata)>, + SendError, + >, + ) -> ProtoSdkClientListResponse { + let result = match result { + Ok(clients) => ProtoSdkClientListResult::Clients(ProtoSdkClientList { + clients: clients + .into_iter() + .map(|(client, metadata)| ProtoSdkClientEntry { + id: client.id, + pubkey: client.public_key, + info: Some(ProtoClientMetadata { + name: metadata.name, + description: metadata.description, + version: metadata.version, + }), + created_at: client.created_at.0.timestamp() as i32, + }) + .collect(), + }), + Err(err) => { + warn!(error = ?err, "Failed to list SDK clients"); + ProtoSdkClientListResult::Error(ProtoSdkClientError::Internal.into()) + } + }; + + ProtoSdkClientListResponse { + result: Some(result), + } + } +} + fn parse_grant_request( shared: Option, specific: Option, diff --git a/useragent/lib/features/connection/evm/grants.dart b/useragent/lib/features/connection/evm/grants.dart index 08550e3..338f0a8 100644 --- a/useragent/lib/features/connection/evm/grants.dart +++ b/useragent/lib/features/connection/evm/grants.dart @@ -4,14 +4,8 @@ import 'package:arbiter/proto/user_agent.pb.dart'; import 'package:fixnum/fixnum.dart'; import 'package:protobuf/well_known_types/google/protobuf/timestamp.pb.dart'; -Future> listEvmGrants( - Connection connection, { - int? walletId, -}) async { +Future> listEvmGrants(Connection connection) async { final request = EvmGrantListRequest(); - if (walletId != null) { - request.walletId = walletId; - } final response = await connection.request( UserAgentRequest(evmGrantList: request), @@ -45,38 +39,7 @@ Future createEvmGrant( TransactionRateLimit? rateLimit, required SpecificGrant specific, }) async { - final response = await connection.request( - UserAgentRequest( - evmGrantCreate: EvmGrantCreateRequest( - clientId: clientId, - shared: SharedSettings( - walletId: walletId, - chainId: chainId, - validFrom: validFrom == null ? null : _toTimestamp(validFrom), - validUntil: validUntil == null ? null : _toTimestamp(validUntil), - maxGasFeePerGas: maxGasFeePerGas, - maxPriorityFeePerGas: maxPriorityFeePerGas, - rateLimit: rateLimit, - ), - specific: specific, - ), - ), - ); - if (!response.hasEvmGrantCreate()) { - throw Exception( - 'Expected EVM grant create response, got ${response.whichPayload()}', - ); - } - - final result = response.evmGrantCreate; - switch (result.whichResult()) { - case EvmGrantCreateResponse_Result.grantId: - return result.grantId; - case EvmGrantCreateResponse_Result.error: - throw Exception(_describeGrantError(result.error)); - case EvmGrantCreateResponse_Result.notSet: - throw Exception('Grant creation returned no result.'); - } + throw UnimplementedError('EVM grant creation is not yet implemented.'); } Future deleteEvmGrant(Connection connection, int grantId) async { diff --git a/useragent/lib/proto/client.pb.dart b/useragent/lib/proto/client.pb.dart index 8d0a540..3f5cab1 100644 --- a/useragent/lib/proto/client.pb.dart +++ b/useragent/lib/proto/client.pb.dart @@ -22,12 +22,91 @@ export 'package:protobuf/protobuf.dart' show GeneratedMessageGenericExtensions; export 'client.pbenum.dart'; +class ClientInfo extends $pb.GeneratedMessage { + factory ClientInfo({ + $core.String? name, + $core.String? description, + $core.String? version, + }) { + final result = create(); + if (name != null) result.name = name; + if (description != null) result.description = description; + if (version != null) result.version = version; + return result; + } + + ClientInfo._(); + + factory ClientInfo.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory ClientInfo.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'ClientInfo', + package: const $pb.PackageName(_omitMessageNames ? '' : 'arbiter.client'), + createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'name') + ..aOS(2, _omitFieldNames ? '' : 'description') + ..aOS(3, _omitFieldNames ? '' : 'version') + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + ClientInfo clone() => deepCopy(); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + ClientInfo copyWith(void Function(ClientInfo) updates) => + super.copyWith((message) => updates(message as ClientInfo)) as ClientInfo; + + @$core.override + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static ClientInfo create() => ClientInfo._(); + @$core.override + ClientInfo createEmptyInstance() => create(); + @$core.pragma('dart2js:noInline') + static ClientInfo getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static ClientInfo? _defaultInstance; + + @$pb.TagNumber(1) + $core.String get name => $_getSZ(0); + @$pb.TagNumber(1) + set name($core.String value) => $_setString(0, value); + @$pb.TagNumber(1) + $core.bool hasName() => $_has(0); + @$pb.TagNumber(1) + void clearName() => $_clearField(1); + + @$pb.TagNumber(2) + $core.String get description => $_getSZ(1); + @$pb.TagNumber(2) + set description($core.String value) => $_setString(1, value); + @$pb.TagNumber(2) + $core.bool hasDescription() => $_has(1); + @$pb.TagNumber(2) + void clearDescription() => $_clearField(2); + + @$pb.TagNumber(3) + $core.String get version => $_getSZ(2); + @$pb.TagNumber(3) + set version($core.String value) => $_setString(2, value); + @$pb.TagNumber(3) + $core.bool hasVersion() => $_has(2); + @$pb.TagNumber(3) + void clearVersion() => $_clearField(3); +} + class AuthChallengeRequest extends $pb.GeneratedMessage { factory AuthChallengeRequest({ $core.List<$core.int>? pubkey, + ClientInfo? clientInfo, }) { final result = create(); if (pubkey != null) result.pubkey = pubkey; + if (clientInfo != null) result.clientInfo = clientInfo; return result; } @@ -46,6 +125,8 @@ class AuthChallengeRequest extends $pb.GeneratedMessage { createEmptyInstance: create) ..a<$core.List<$core.int>>( 1, _omitFieldNames ? '' : 'pubkey', $pb.PbFieldType.OY) + ..aOM(2, _omitFieldNames ? '' : 'clientInfo', + subBuilder: ClientInfo.create) ..hasRequiredFields = false; @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') @@ -75,6 +156,17 @@ class AuthChallengeRequest extends $pb.GeneratedMessage { $core.bool hasPubkey() => $_has(0); @$pb.TagNumber(1) void clearPubkey() => $_clearField(1); + + @$pb.TagNumber(2) + ClientInfo get clientInfo => $_getN(1); + @$pb.TagNumber(2) + set clientInfo(ClientInfo value) => $_setField(2, value); + @$pb.TagNumber(2) + $core.bool hasClientInfo() => $_has(1); + @$pb.TagNumber(2) + void clearClientInfo() => $_clearField(2); + @$pb.TagNumber(2) + ClientInfo ensureClientInfo() => $_ensure(1); } class AuthChallenge extends $pb.GeneratedMessage { diff --git a/useragent/lib/proto/client.pbjson.dart b/useragent/lib/proto/client.pbjson.dart index 97f914d..bc90b04 100644 --- a/useragent/lib/proto/client.pbjson.dart +++ b/useragent/lib/proto/client.pbjson.dart @@ -55,18 +55,62 @@ final $typed_data.Uint8List vaultStateDescriptor = $convert.base64Decode( 'VfVU5CT09UU1RSQVBQRUQQARIWChJWQVVMVF9TVEFURV9TRUFMRUQQAhIYChRWQVVMVF9TVEFU' 'RV9VTlNFQUxFRBADEhUKEVZBVUxUX1NUQVRFX0VSUk9SEAQ='); +@$core.Deprecated('Use clientInfoDescriptor instead') +const ClientInfo$json = { + '1': 'ClientInfo', + '2': [ + {'1': 'name', '3': 1, '4': 1, '5': 9, '10': 'name'}, + { + '1': 'description', + '3': 2, + '4': 1, + '5': 9, + '9': 0, + '10': 'description', + '17': true + }, + { + '1': 'version', + '3': 3, + '4': 1, + '5': 9, + '9': 1, + '10': 'version', + '17': true + }, + ], + '8': [ + {'1': '_description'}, + {'1': '_version'}, + ], +}; + +/// Descriptor for `ClientInfo`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List clientInfoDescriptor = $convert.base64Decode( + 'CgpDbGllbnRJbmZvEhIKBG5hbWUYASABKAlSBG5hbWUSJQoLZGVzY3JpcHRpb24YAiABKAlIAF' + 'ILZGVzY3JpcHRpb26IAQESHQoHdmVyc2lvbhgDIAEoCUgBUgd2ZXJzaW9uiAEBQg4KDF9kZXNj' + 'cmlwdGlvbkIKCghfdmVyc2lvbg=='); + @$core.Deprecated('Use authChallengeRequestDescriptor instead') const AuthChallengeRequest$json = { '1': 'AuthChallengeRequest', '2': [ {'1': 'pubkey', '3': 1, '4': 1, '5': 12, '10': 'pubkey'}, + { + '1': 'client_info', + '3': 2, + '4': 1, + '5': 11, + '6': '.arbiter.client.ClientInfo', + '10': 'clientInfo' + }, ], }; /// Descriptor for `AuthChallengeRequest`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List authChallengeRequestDescriptor = - $convert.base64Decode( - 'ChRBdXRoQ2hhbGxlbmdlUmVxdWVzdBIWCgZwdWJrZXkYASABKAxSBnB1YmtleQ=='); +final $typed_data.Uint8List authChallengeRequestDescriptor = $convert.base64Decode( + 'ChRBdXRoQ2hhbGxlbmdlUmVxdWVzdBIWCgZwdWJrZXkYASABKAxSBnB1YmtleRI7CgtjbGllbn' + 'RfaW5mbxgCIAEoCzIaLmFyYml0ZXIuY2xpZW50LkNsaWVudEluZm9SCmNsaWVudEluZm8='); @$core.Deprecated('Use authChallengeDescriptor instead') const AuthChallenge$json = { diff --git a/useragent/lib/proto/evm.pb.dart b/useragent/lib/proto/evm.pb.dart index d748202..eac4433 100644 --- a/useragent/lib/proto/evm.pb.dart +++ b/useragent/lib/proto/evm.pb.dart @@ -436,7 +436,7 @@ class VolumeRateLimit extends $pb.GeneratedMessage { class SharedSettings extends $pb.GeneratedMessage { factory SharedSettings({ - $core.int? walletId, + $core.int? walletAccessId, $fixnum.Int64? chainId, $0.Timestamp? validFrom, $0.Timestamp? validUntil, @@ -445,7 +445,7 @@ class SharedSettings extends $pb.GeneratedMessage { TransactionRateLimit? rateLimit, }) { final result = create(); - if (walletId != null) result.walletId = walletId; + if (walletAccessId != null) result.walletAccessId = walletAccessId; if (chainId != null) result.chainId = chainId; if (validFrom != null) result.validFrom = validFrom; if (validUntil != null) result.validUntil = validUntil; @@ -469,7 +469,7 @@ class SharedSettings extends $pb.GeneratedMessage { _omitMessageNames ? '' : 'SharedSettings', package: const $pb.PackageName(_omitMessageNames ? '' : 'arbiter.evm'), createEmptyInstance: create) - ..aI(1, _omitFieldNames ? '' : 'walletId') + ..aI(1, _omitFieldNames ? '' : 'walletAccessId') ..a<$fixnum.Int64>(2, _omitFieldNames ? '' : 'chainId', $pb.PbFieldType.OU6, defaultOrMaker: $fixnum.Int64.ZERO) ..aOM<$0.Timestamp>(3, _omitFieldNames ? '' : 'validFrom', @@ -504,13 +504,13 @@ class SharedSettings extends $pb.GeneratedMessage { static SharedSettings? _defaultInstance; @$pb.TagNumber(1) - $core.int get walletId => $_getIZ(0); + $core.int get walletAccessId => $_getIZ(0); @$pb.TagNumber(1) - set walletId($core.int value) => $_setSignedInt32(0, value); + set walletAccessId($core.int value) => $_setSignedInt32(0, value); @$pb.TagNumber(1) - $core.bool hasWalletId() => $_has(0); + $core.bool hasWalletAccessId() => $_has(0); @$pb.TagNumber(1) - void clearWalletId() => $_clearField(1); + void clearWalletAccessId() => $_clearField(1); @$pb.TagNumber(2) $fixnum.Int64 get chainId => $_getI64(1); @@ -1625,12 +1625,10 @@ class TransactionEvalError extends $pb.GeneratedMessage { /// --- UserAgent grant management --- class EvmGrantCreateRequest extends $pb.GeneratedMessage { factory EvmGrantCreateRequest({ - $core.int? clientId, SharedSettings? shared, SpecificGrant? specific, }) { final result = create(); - if (clientId != null) result.clientId = clientId; if (shared != null) result.shared = shared; if (specific != null) result.specific = specific; return result; @@ -1649,10 +1647,9 @@ class EvmGrantCreateRequest extends $pb.GeneratedMessage { _omitMessageNames ? '' : 'EvmGrantCreateRequest', package: const $pb.PackageName(_omitMessageNames ? '' : 'arbiter.evm'), createEmptyInstance: create) - ..aI(1, _omitFieldNames ? '' : 'clientId') - ..aOM(2, _omitFieldNames ? '' : 'shared', + ..aOM(1, _omitFieldNames ? '' : 'shared', subBuilder: SharedSettings.create) - ..aOM(3, _omitFieldNames ? '' : 'specific', + ..aOM(2, _omitFieldNames ? '' : 'specific', subBuilder: SpecificGrant.create) ..hasRequiredFields = false; @@ -1677,35 +1674,26 @@ class EvmGrantCreateRequest extends $pb.GeneratedMessage { static EvmGrantCreateRequest? _defaultInstance; @$pb.TagNumber(1) - $core.int get clientId => $_getIZ(0); + SharedSettings get shared => $_getN(0); @$pb.TagNumber(1) - set clientId($core.int value) => $_setSignedInt32(0, value); + set shared(SharedSettings value) => $_setField(1, value); @$pb.TagNumber(1) - $core.bool hasClientId() => $_has(0); + $core.bool hasShared() => $_has(0); @$pb.TagNumber(1) - void clearClientId() => $_clearField(1); + void clearShared() => $_clearField(1); + @$pb.TagNumber(1) + SharedSettings ensureShared() => $_ensure(0); @$pb.TagNumber(2) - SharedSettings get shared => $_getN(1); + SpecificGrant get specific => $_getN(1); @$pb.TagNumber(2) - set shared(SharedSettings value) => $_setField(2, value); + set specific(SpecificGrant value) => $_setField(2, value); @$pb.TagNumber(2) - $core.bool hasShared() => $_has(1); + $core.bool hasSpecific() => $_has(1); @$pb.TagNumber(2) - void clearShared() => $_clearField(2); + void clearSpecific() => $_clearField(2); @$pb.TagNumber(2) - SharedSettings ensureShared() => $_ensure(1); - - @$pb.TagNumber(3) - SpecificGrant get specific => $_getN(2); - @$pb.TagNumber(3) - set specific(SpecificGrant value) => $_setField(3, value); - @$pb.TagNumber(3) - $core.bool hasSpecific() => $_has(2); - @$pb.TagNumber(3) - void clearSpecific() => $_clearField(3); - @$pb.TagNumber(3) - SpecificGrant ensureSpecific() => $_ensure(2); + SpecificGrant ensureSpecific() => $_ensure(1); } enum EvmGrantCreateResponse_Result { grantId, error, notSet } @@ -1939,13 +1927,13 @@ class EvmGrantDeleteResponse extends $pb.GeneratedMessage { class GrantEntry extends $pb.GeneratedMessage { factory GrantEntry({ $core.int? id, - $core.int? clientId, + $core.int? walletAccessId, SharedSettings? shared, SpecificGrant? specific, }) { final result = create(); if (id != null) result.id = id; - if (clientId != null) result.clientId = clientId; + if (walletAccessId != null) result.walletAccessId = walletAccessId; if (shared != null) result.shared = shared; if (specific != null) result.specific = specific; return result; @@ -1965,7 +1953,7 @@ class GrantEntry extends $pb.GeneratedMessage { package: const $pb.PackageName(_omitMessageNames ? '' : 'arbiter.evm'), createEmptyInstance: create) ..aI(1, _omitFieldNames ? '' : 'id') - ..aI(2, _omitFieldNames ? '' : 'clientId') + ..aI(2, _omitFieldNames ? '' : 'walletAccessId') ..aOM(3, _omitFieldNames ? '' : 'shared', subBuilder: SharedSettings.create) ..aOM(4, _omitFieldNames ? '' : 'specific', @@ -2000,13 +1988,13 @@ class GrantEntry extends $pb.GeneratedMessage { void clearId() => $_clearField(1); @$pb.TagNumber(2) - $core.int get clientId => $_getIZ(1); + $core.int get walletAccessId => $_getIZ(1); @$pb.TagNumber(2) - set clientId($core.int value) => $_setSignedInt32(1, value); + set walletAccessId($core.int value) => $_setSignedInt32(1, value); @$pb.TagNumber(2) - $core.bool hasClientId() => $_has(1); + $core.bool hasWalletAccessId() => $_has(1); @$pb.TagNumber(2) - void clearClientId() => $_clearField(2); + void clearWalletAccessId() => $_clearField(2); @$pb.TagNumber(3) SharedSettings get shared => $_getN(2); @@ -2033,10 +2021,10 @@ class GrantEntry extends $pb.GeneratedMessage { class EvmGrantListRequest extends $pb.GeneratedMessage { factory EvmGrantListRequest({ - $core.int? walletId, + $core.int? walletAccessId, }) { final result = create(); - if (walletId != null) result.walletId = walletId; + if (walletAccessId != null) result.walletAccessId = walletAccessId; return result; } @@ -2053,7 +2041,7 @@ class EvmGrantListRequest extends $pb.GeneratedMessage { _omitMessageNames ? '' : 'EvmGrantListRequest', package: const $pb.PackageName(_omitMessageNames ? '' : 'arbiter.evm'), createEmptyInstance: create) - ..aI(1, _omitFieldNames ? '' : 'walletId') + ..aI(1, _omitFieldNames ? '' : 'walletAccessId') ..hasRequiredFields = false; @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') @@ -2076,13 +2064,13 @@ class EvmGrantListRequest extends $pb.GeneratedMessage { static EvmGrantListRequest? _defaultInstance; @$pb.TagNumber(1) - $core.int get walletId => $_getIZ(0); + $core.int get walletAccessId => $_getIZ(0); @$pb.TagNumber(1) - set walletId($core.int value) => $_setSignedInt32(0, value); + set walletAccessId($core.int value) => $_setSignedInt32(0, value); @$pb.TagNumber(1) - $core.bool hasWalletId() => $_has(0); + $core.bool hasWalletAccessId() => $_has(0); @$pb.TagNumber(1) - void clearWalletId() => $_clearField(1); + void clearWalletAccessId() => $_clearField(1); } enum EvmGrantListResponse_Result { grants, error, notSet } diff --git a/useragent/lib/proto/evm.pbjson.dart b/useragent/lib/proto/evm.pbjson.dart index a4a9d09..7b7a918 100644 --- a/useragent/lib/proto/evm.pbjson.dart +++ b/useragent/lib/proto/evm.pbjson.dart @@ -162,7 +162,7 @@ final $typed_data.Uint8List volumeRateLimitDescriptor = $convert.base64Decode( const SharedSettings$json = { '1': 'SharedSettings', '2': [ - {'1': 'wallet_id', '3': 1, '4': 1, '5': 5, '10': 'walletId'}, + {'1': 'wallet_access_id', '3': 1, '4': 1, '5': 5, '10': 'walletAccessId'}, {'1': 'chain_id', '3': 2, '4': 1, '5': 4, '10': 'chainId'}, { '1': 'valid_from', @@ -224,15 +224,15 @@ const SharedSettings$json = { /// Descriptor for `SharedSettings`. Decode as a `google.protobuf.DescriptorProto`. final $typed_data.Uint8List sharedSettingsDescriptor = $convert.base64Decode( - 'Cg5TaGFyZWRTZXR0aW5ncxIbCgl3YWxsZXRfaWQYASABKAVSCHdhbGxldElkEhkKCGNoYWluX2' - 'lkGAIgASgEUgdjaGFpbklkEj4KCnZhbGlkX2Zyb20YAyABKAsyGi5nb29nbGUucHJvdG9idWYu' - 'VGltZXN0YW1wSABSCXZhbGlkRnJvbYgBARJACgt2YWxpZF91bnRpbBgEIAEoCzIaLmdvb2dsZS' - '5wcm90b2J1Zi5UaW1lc3RhbXBIAVIKdmFsaWRVbnRpbIgBARIxChNtYXhfZ2FzX2ZlZV9wZXJf' - 'Z2FzGAUgASgMSAJSD21heEdhc0ZlZVBlckdhc4gBARI7ChhtYXhfcHJpb3JpdHlfZmVlX3Blcl' - '9nYXMYBiABKAxIA1IUbWF4UHJpb3JpdHlGZWVQZXJHYXOIAQESRQoKcmF0ZV9saW1pdBgHIAEo' - 'CzIhLmFyYml0ZXIuZXZtLlRyYW5zYWN0aW9uUmF0ZUxpbWl0SARSCXJhdGVMaW1pdIgBAUINCg' - 'tfdmFsaWRfZnJvbUIOCgxfdmFsaWRfdW50aWxCFgoUX21heF9nYXNfZmVlX3Blcl9nYXNCGwoZ' - 'X21heF9wcmlvcml0eV9mZWVfcGVyX2dhc0INCgtfcmF0ZV9saW1pdA=='); + 'Cg5TaGFyZWRTZXR0aW5ncxIoChB3YWxsZXRfYWNjZXNzX2lkGAEgASgFUg53YWxsZXRBY2Nlc3' + 'NJZBIZCghjaGFpbl9pZBgCIAEoBFIHY2hhaW5JZBI+Cgp2YWxpZF9mcm9tGAMgASgLMhouZ29v' + 'Z2xlLnByb3RvYnVmLlRpbWVzdGFtcEgAUgl2YWxpZEZyb22IAQESQAoLdmFsaWRfdW50aWwYBC' + 'ABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wSAFSCnZhbGlkVW50aWyIAQESMQoTbWF4' + 'X2dhc19mZWVfcGVyX2dhcxgFIAEoDEgCUg9tYXhHYXNGZWVQZXJHYXOIAQESOwoYbWF4X3ByaW' + '9yaXR5X2ZlZV9wZXJfZ2FzGAYgASgMSANSFG1heFByaW9yaXR5RmVlUGVyR2FziAEBEkUKCnJh' + 'dGVfbGltaXQYByABKAsyIS5hcmJpdGVyLmV2bS5UcmFuc2FjdGlvblJhdGVMaW1pdEgEUglyYX' + 'RlTGltaXSIAQFCDQoLX3ZhbGlkX2Zyb21CDgoMX3ZhbGlkX3VudGlsQhYKFF9tYXhfZ2FzX2Zl' + 'ZV9wZXJfZ2FzQhsKGV9tYXhfcHJpb3JpdHlfZmVlX3Blcl9nYXNCDQoLX3JhdGVfbGltaXQ='); @$core.Deprecated('Use etherTransferSettingsDescriptor instead') const EtherTransferSettings$json = { @@ -631,10 +631,9 @@ final $typed_data.Uint8List transactionEvalErrorDescriptor = $convert.base64Deco const EvmGrantCreateRequest$json = { '1': 'EvmGrantCreateRequest', '2': [ - {'1': 'client_id', '3': 1, '4': 1, '5': 5, '10': 'clientId'}, { '1': 'shared', - '3': 2, + '3': 1, '4': 1, '5': 11, '6': '.arbiter.evm.SharedSettings', @@ -642,7 +641,7 @@ const EvmGrantCreateRequest$json = { }, { '1': 'specific', - '3': 3, + '3': 2, '4': 1, '5': 11, '6': '.arbiter.evm.SpecificGrant', @@ -653,9 +652,9 @@ const EvmGrantCreateRequest$json = { /// Descriptor for `EvmGrantCreateRequest`. Decode as a `google.protobuf.DescriptorProto`. final $typed_data.Uint8List evmGrantCreateRequestDescriptor = $convert.base64Decode( - 'ChVFdm1HcmFudENyZWF0ZVJlcXVlc3QSGwoJY2xpZW50X2lkGAEgASgFUghjbGllbnRJZBIzCg' - 'ZzaGFyZWQYAiABKAsyGy5hcmJpdGVyLmV2bS5TaGFyZWRTZXR0aW5nc1IGc2hhcmVkEjYKCHNw' - 'ZWNpZmljGAMgASgLMhouYXJiaXRlci5ldm0uU3BlY2lmaWNHcmFudFIIc3BlY2lmaWM='); + 'ChVFdm1HcmFudENyZWF0ZVJlcXVlc3QSMwoGc2hhcmVkGAEgASgLMhsuYXJiaXRlci5ldm0uU2' + 'hhcmVkU2V0dGluZ3NSBnNoYXJlZBI2CghzcGVjaWZpYxgCIAEoCzIaLmFyYml0ZXIuZXZtLlNw' + 'ZWNpZmljR3JhbnRSCHNwZWNpZmlj'); @$core.Deprecated('Use evmGrantCreateResponseDescriptor instead') const EvmGrantCreateResponse$json = { @@ -734,7 +733,7 @@ const GrantEntry$json = { '1': 'GrantEntry', '2': [ {'1': 'id', '3': 1, '4': 1, '5': 5, '10': 'id'}, - {'1': 'client_id', '3': 2, '4': 1, '5': 5, '10': 'clientId'}, + {'1': 'wallet_access_id', '3': 2, '4': 1, '5': 5, '10': 'walletAccessId'}, { '1': 'shared', '3': 3, @@ -756,34 +755,34 @@ const GrantEntry$json = { /// Descriptor for `GrantEntry`. Decode as a `google.protobuf.DescriptorProto`. final $typed_data.Uint8List grantEntryDescriptor = $convert.base64Decode( - 'CgpHcmFudEVudHJ5Eg4KAmlkGAEgASgFUgJpZBIbCgljbGllbnRfaWQYAiABKAVSCGNsaWVudE' - 'lkEjMKBnNoYXJlZBgDIAEoCzIbLmFyYml0ZXIuZXZtLlNoYXJlZFNldHRpbmdzUgZzaGFyZWQS' - 'NgoIc3BlY2lmaWMYBCABKAsyGi5hcmJpdGVyLmV2bS5TcGVjaWZpY0dyYW50UghzcGVjaWZpYw' - '=='); + 'CgpHcmFudEVudHJ5Eg4KAmlkGAEgASgFUgJpZBIoChB3YWxsZXRfYWNjZXNzX2lkGAIgASgFUg' + '53YWxsZXRBY2Nlc3NJZBIzCgZzaGFyZWQYAyABKAsyGy5hcmJpdGVyLmV2bS5TaGFyZWRTZXR0' + 'aW5nc1IGc2hhcmVkEjYKCHNwZWNpZmljGAQgASgLMhouYXJiaXRlci5ldm0uU3BlY2lmaWNHcm' + 'FudFIIc3BlY2lmaWM='); @$core.Deprecated('Use evmGrantListRequestDescriptor instead') const EvmGrantListRequest$json = { '1': 'EvmGrantListRequest', '2': [ { - '1': 'wallet_id', + '1': 'wallet_access_id', '3': 1, '4': 1, '5': 5, '9': 0, - '10': 'walletId', + '10': 'walletAccessId', '17': true }, ], '8': [ - {'1': '_wallet_id'}, + {'1': '_wallet_access_id'}, ], }; /// Descriptor for `EvmGrantListRequest`. Decode as a `google.protobuf.DescriptorProto`. final $typed_data.Uint8List evmGrantListRequestDescriptor = $convert.base64Decode( - 'ChNFdm1HcmFudExpc3RSZXF1ZXN0EiAKCXdhbGxldF9pZBgBIAEoBUgAUgh3YWxsZXRJZIgBAU' - 'IMCgpfd2FsbGV0X2lk'); + 'ChNFdm1HcmFudExpc3RSZXF1ZXN0Ei0KEHdhbGxldF9hY2Nlc3NfaWQYASABKAVIAFIOd2FsbG' + 'V0QWNjZXNzSWSIAQFCEwoRX3dhbGxldF9hY2Nlc3NfaWQ='); @$core.Deprecated('Use evmGrantListResponseDescriptor instead') const EvmGrantListResponse$json = { diff --git a/useragent/lib/proto/user_agent.pb.dart b/useragent/lib/proto/user_agent.pb.dart index 3b85474..177d3d4 100644 --- a/useragent/lib/proto/user_agent.pb.dart +++ b/useragent/lib/proto/user_agent.pb.dart @@ -13,15 +13,394 @@ import 'dart:core' as $core; import 'package:protobuf/protobuf.dart' as $pb; -import 'package:protobuf/well_known_types/google/protobuf/empty.pb.dart' as $0; +import 'package:protobuf/well_known_types/google/protobuf/empty.pb.dart' as $1; -import 'evm.pb.dart' as $1; +import 'client.pb.dart' as $0; +import 'evm.pb.dart' as $2; import 'user_agent.pbenum.dart'; export 'package:protobuf/protobuf.dart' show GeneratedMessageGenericExtensions; export 'user_agent.pbenum.dart'; +class SdkClientRevokeRequest extends $pb.GeneratedMessage { + factory SdkClientRevokeRequest({ + $core.int? clientId, + }) { + final result = create(); + if (clientId != null) result.clientId = clientId; + return result; + } + + SdkClientRevokeRequest._(); + + factory SdkClientRevokeRequest.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory SdkClientRevokeRequest.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'SdkClientRevokeRequest', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'arbiter.user_agent'), + createEmptyInstance: create) + ..aI(1, _omitFieldNames ? '' : 'clientId') + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + SdkClientRevokeRequest clone() => deepCopy(); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + SdkClientRevokeRequest copyWith( + void Function(SdkClientRevokeRequest) updates) => + super.copyWith((message) => updates(message as SdkClientRevokeRequest)) + as SdkClientRevokeRequest; + + @$core.override + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static SdkClientRevokeRequest create() => SdkClientRevokeRequest._(); + @$core.override + SdkClientRevokeRequest createEmptyInstance() => create(); + @$core.pragma('dart2js:noInline') + static SdkClientRevokeRequest getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static SdkClientRevokeRequest? _defaultInstance; + + @$pb.TagNumber(1) + $core.int get clientId => $_getIZ(0); + @$pb.TagNumber(1) + set clientId($core.int value) => $_setSignedInt32(0, value); + @$pb.TagNumber(1) + $core.bool hasClientId() => $_has(0); + @$pb.TagNumber(1) + void clearClientId() => $_clearField(1); +} + +class SdkClientEntry extends $pb.GeneratedMessage { + factory SdkClientEntry({ + $core.int? id, + $core.List<$core.int>? pubkey, + $0.ClientInfo? info, + $core.int? createdAt, + }) { + final result = create(); + if (id != null) result.id = id; + if (pubkey != null) result.pubkey = pubkey; + if (info != null) result.info = info; + if (createdAt != null) result.createdAt = createdAt; + return result; + } + + SdkClientEntry._(); + + factory SdkClientEntry.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory SdkClientEntry.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'SdkClientEntry', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'arbiter.user_agent'), + createEmptyInstance: create) + ..aI(1, _omitFieldNames ? '' : 'id') + ..a<$core.List<$core.int>>( + 2, _omitFieldNames ? '' : 'pubkey', $pb.PbFieldType.OY) + ..aOM<$0.ClientInfo>(3, _omitFieldNames ? '' : 'info', + subBuilder: $0.ClientInfo.create) + ..aI(4, _omitFieldNames ? '' : 'createdAt') + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + SdkClientEntry clone() => deepCopy(); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + SdkClientEntry copyWith(void Function(SdkClientEntry) updates) => + super.copyWith((message) => updates(message as SdkClientEntry)) + as SdkClientEntry; + + @$core.override + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static SdkClientEntry create() => SdkClientEntry._(); + @$core.override + SdkClientEntry createEmptyInstance() => create(); + @$core.pragma('dart2js:noInline') + static SdkClientEntry getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static SdkClientEntry? _defaultInstance; + + @$pb.TagNumber(1) + $core.int get id => $_getIZ(0); + @$pb.TagNumber(1) + set id($core.int value) => $_setSignedInt32(0, value); + @$pb.TagNumber(1) + $core.bool hasId() => $_has(0); + @$pb.TagNumber(1) + void clearId() => $_clearField(1); + + @$pb.TagNumber(2) + $core.List<$core.int> get pubkey => $_getN(1); + @$pb.TagNumber(2) + set pubkey($core.List<$core.int> value) => $_setBytes(1, value); + @$pb.TagNumber(2) + $core.bool hasPubkey() => $_has(1); + @$pb.TagNumber(2) + void clearPubkey() => $_clearField(2); + + @$pb.TagNumber(3) + $0.ClientInfo get info => $_getN(2); + @$pb.TagNumber(3) + set info($0.ClientInfo value) => $_setField(3, value); + @$pb.TagNumber(3) + $core.bool hasInfo() => $_has(2); + @$pb.TagNumber(3) + void clearInfo() => $_clearField(3); + @$pb.TagNumber(3) + $0.ClientInfo ensureInfo() => $_ensure(2); + + @$pb.TagNumber(4) + $core.int get createdAt => $_getIZ(3); + @$pb.TagNumber(4) + set createdAt($core.int value) => $_setSignedInt32(3, value); + @$pb.TagNumber(4) + $core.bool hasCreatedAt() => $_has(3); + @$pb.TagNumber(4) + void clearCreatedAt() => $_clearField(4); +} + +class SdkClientList extends $pb.GeneratedMessage { + factory SdkClientList({ + $core.Iterable? clients, + }) { + final result = create(); + if (clients != null) result.clients.addAll(clients); + return result; + } + + SdkClientList._(); + + factory SdkClientList.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory SdkClientList.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'SdkClientList', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'arbiter.user_agent'), + createEmptyInstance: create) + ..pPM(1, _omitFieldNames ? '' : 'clients', + subBuilder: SdkClientEntry.create) + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + SdkClientList clone() => deepCopy(); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + SdkClientList copyWith(void Function(SdkClientList) updates) => + super.copyWith((message) => updates(message as SdkClientList)) + as SdkClientList; + + @$core.override + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static SdkClientList create() => SdkClientList._(); + @$core.override + SdkClientList createEmptyInstance() => create(); + @$core.pragma('dart2js:noInline') + static SdkClientList getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static SdkClientList? _defaultInstance; + + @$pb.TagNumber(1) + $pb.PbList get clients => $_getList(0); +} + +enum SdkClientRevokeResponse_Result { ok, error, notSet } + +class SdkClientRevokeResponse extends $pb.GeneratedMessage { + factory SdkClientRevokeResponse({ + $1.Empty? ok, + SdkClientError? error, + }) { + final result = create(); + if (ok != null) result.ok = ok; + if (error != null) result.error = error; + return result; + } + + SdkClientRevokeResponse._(); + + factory SdkClientRevokeResponse.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory SdkClientRevokeResponse.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); + + static const $core.Map<$core.int, SdkClientRevokeResponse_Result> + _SdkClientRevokeResponse_ResultByTag = { + 1: SdkClientRevokeResponse_Result.ok, + 2: SdkClientRevokeResponse_Result.error, + 0: SdkClientRevokeResponse_Result.notSet + }; + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'SdkClientRevokeResponse', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'arbiter.user_agent'), + createEmptyInstance: create) + ..oo(0, [1, 2]) + ..aOM<$1.Empty>(1, _omitFieldNames ? '' : 'ok', subBuilder: $1.Empty.create) + ..aE(2, _omitFieldNames ? '' : 'error', + enumValues: SdkClientError.values) + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + SdkClientRevokeResponse clone() => deepCopy(); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + SdkClientRevokeResponse copyWith( + void Function(SdkClientRevokeResponse) updates) => + super.copyWith((message) => updates(message as SdkClientRevokeResponse)) + as SdkClientRevokeResponse; + + @$core.override + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static SdkClientRevokeResponse create() => SdkClientRevokeResponse._(); + @$core.override + SdkClientRevokeResponse createEmptyInstance() => create(); + @$core.pragma('dart2js:noInline') + static SdkClientRevokeResponse getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static SdkClientRevokeResponse? _defaultInstance; + + @$pb.TagNumber(1) + @$pb.TagNumber(2) + SdkClientRevokeResponse_Result whichResult() => + _SdkClientRevokeResponse_ResultByTag[$_whichOneof(0)]!; + @$pb.TagNumber(1) + @$pb.TagNumber(2) + void clearResult() => $_clearField($_whichOneof(0)); + + @$pb.TagNumber(1) + $1.Empty get ok => $_getN(0); + @$pb.TagNumber(1) + set ok($1.Empty value) => $_setField(1, value); + @$pb.TagNumber(1) + $core.bool hasOk() => $_has(0); + @$pb.TagNumber(1) + void clearOk() => $_clearField(1); + @$pb.TagNumber(1) + $1.Empty ensureOk() => $_ensure(0); + + @$pb.TagNumber(2) + SdkClientError get error => $_getN(1); + @$pb.TagNumber(2) + set error(SdkClientError value) => $_setField(2, value); + @$pb.TagNumber(2) + $core.bool hasError() => $_has(1); + @$pb.TagNumber(2) + void clearError() => $_clearField(2); +} + +enum SdkClientListResponse_Result { clients, error, notSet } + +class SdkClientListResponse extends $pb.GeneratedMessage { + factory SdkClientListResponse({ + SdkClientList? clients, + SdkClientError? error, + }) { + final result = create(); + if (clients != null) result.clients = clients; + if (error != null) result.error = error; + return result; + } + + SdkClientListResponse._(); + + factory SdkClientListResponse.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory SdkClientListResponse.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); + + static const $core.Map<$core.int, SdkClientListResponse_Result> + _SdkClientListResponse_ResultByTag = { + 1: SdkClientListResponse_Result.clients, + 2: SdkClientListResponse_Result.error, + 0: SdkClientListResponse_Result.notSet + }; + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'SdkClientListResponse', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'arbiter.user_agent'), + createEmptyInstance: create) + ..oo(0, [1, 2]) + ..aOM(1, _omitFieldNames ? '' : 'clients', + subBuilder: SdkClientList.create) + ..aE(2, _omitFieldNames ? '' : 'error', + enumValues: SdkClientError.values) + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + SdkClientListResponse clone() => deepCopy(); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + SdkClientListResponse copyWith( + void Function(SdkClientListResponse) updates) => + super.copyWith((message) => updates(message as SdkClientListResponse)) + as SdkClientListResponse; + + @$core.override + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static SdkClientListResponse create() => SdkClientListResponse._(); + @$core.override + SdkClientListResponse createEmptyInstance() => create(); + @$core.pragma('dart2js:noInline') + static SdkClientListResponse getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static SdkClientListResponse? _defaultInstance; + + @$pb.TagNumber(1) + @$pb.TagNumber(2) + SdkClientListResponse_Result whichResult() => + _SdkClientListResponse_ResultByTag[$_whichOneof(0)]!; + @$pb.TagNumber(1) + @$pb.TagNumber(2) + void clearResult() => $_clearField($_whichOneof(0)); + + @$pb.TagNumber(1) + SdkClientList get clients => $_getN(0); + @$pb.TagNumber(1) + set clients(SdkClientList value) => $_setField(1, value); + @$pb.TagNumber(1) + $core.bool hasClients() => $_has(0); + @$pb.TagNumber(1) + void clearClients() => $_clearField(1); + @$pb.TagNumber(1) + SdkClientList ensureClients() => $_ensure(0); + + @$pb.TagNumber(2) + SdkClientError get error => $_getN(1); + @$pb.TagNumber(2) + set error(SdkClientError value) => $_setField(2, value); + @$pb.TagNumber(2) + $core.bool hasError() => $_has(1); + @$pb.TagNumber(2) + void clearError() => $_clearField(2); +} + class AuthChallengeRequest extends $pb.GeneratedMessage { factory AuthChallengeRequest({ $core.List<$core.int>? pubkey, @@ -492,52 +871,57 @@ class BootstrapEncryptedKey extends $pb.GeneratedMessage { void clearAssociatedData() => $_clearField(3); } -class ClientConnectionRequest extends $pb.GeneratedMessage { - factory ClientConnectionRequest({ +class SdkClientConnectionRequest extends $pb.GeneratedMessage { + factory SdkClientConnectionRequest({ $core.List<$core.int>? pubkey, + $0.ClientInfo? info, }) { final result = create(); if (pubkey != null) result.pubkey = pubkey; + if (info != null) result.info = info; return result; } - ClientConnectionRequest._(); + SdkClientConnectionRequest._(); - factory ClientConnectionRequest.fromBuffer($core.List<$core.int> data, + factory SdkClientConnectionRequest.fromBuffer($core.List<$core.int> data, [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(data, registry); - factory ClientConnectionRequest.fromJson($core.String json, + factory SdkClientConnectionRequest.fromJson($core.String json, [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo( - _omitMessageNames ? '' : 'ClientConnectionRequest', + _omitMessageNames ? '' : 'SdkClientConnectionRequest', package: const $pb.PackageName(_omitMessageNames ? '' : 'arbiter.user_agent'), createEmptyInstance: create) ..a<$core.List<$core.int>>( 1, _omitFieldNames ? '' : 'pubkey', $pb.PbFieldType.OY) + ..aOM<$0.ClientInfo>(2, _omitFieldNames ? '' : 'info', + subBuilder: $0.ClientInfo.create) ..hasRequiredFields = false; @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') - ClientConnectionRequest clone() => deepCopy(); + SdkClientConnectionRequest clone() => deepCopy(); @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') - ClientConnectionRequest copyWith( - void Function(ClientConnectionRequest) updates) => - super.copyWith((message) => updates(message as ClientConnectionRequest)) - as ClientConnectionRequest; + SdkClientConnectionRequest copyWith( + void Function(SdkClientConnectionRequest) updates) => + super.copyWith( + (message) => updates(message as SdkClientConnectionRequest)) + as SdkClientConnectionRequest; @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') - static ClientConnectionRequest create() => ClientConnectionRequest._(); + static SdkClientConnectionRequest create() => SdkClientConnectionRequest._(); @$core.override - ClientConnectionRequest createEmptyInstance() => create(); + SdkClientConnectionRequest createEmptyInstance() => create(); @$core.pragma('dart2js:noInline') - static ClientConnectionRequest getDefault() => _defaultInstance ??= - $pb.GeneratedMessage.$_defaultFor(create); - static ClientConnectionRequest? _defaultInstance; + static SdkClientConnectionRequest getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static SdkClientConnectionRequest? _defaultInstance; @$pb.TagNumber(1) $core.List<$core.int> get pubkey => $_getN(0); @@ -547,53 +931,70 @@ class ClientConnectionRequest extends $pb.GeneratedMessage { $core.bool hasPubkey() => $_has(0); @$pb.TagNumber(1) void clearPubkey() => $_clearField(1); + + @$pb.TagNumber(2) + $0.ClientInfo get info => $_getN(1); + @$pb.TagNumber(2) + set info($0.ClientInfo value) => $_setField(2, value); + @$pb.TagNumber(2) + $core.bool hasInfo() => $_has(1); + @$pb.TagNumber(2) + void clearInfo() => $_clearField(2); + @$pb.TagNumber(2) + $0.ClientInfo ensureInfo() => $_ensure(1); } -class ClientConnectionResponse extends $pb.GeneratedMessage { - factory ClientConnectionResponse({ +class SdkClientConnectionResponse extends $pb.GeneratedMessage { + factory SdkClientConnectionResponse({ $core.bool? approved, + $core.List<$core.int>? pubkey, }) { final result = create(); if (approved != null) result.approved = approved; + if (pubkey != null) result.pubkey = pubkey; return result; } - ClientConnectionResponse._(); + SdkClientConnectionResponse._(); - factory ClientConnectionResponse.fromBuffer($core.List<$core.int> data, + factory SdkClientConnectionResponse.fromBuffer($core.List<$core.int> data, [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(data, registry); - factory ClientConnectionResponse.fromJson($core.String json, + factory SdkClientConnectionResponse.fromJson($core.String json, [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo( - _omitMessageNames ? '' : 'ClientConnectionResponse', + _omitMessageNames ? '' : 'SdkClientConnectionResponse', package: const $pb.PackageName(_omitMessageNames ? '' : 'arbiter.user_agent'), createEmptyInstance: create) ..aOB(1, _omitFieldNames ? '' : 'approved') + ..a<$core.List<$core.int>>( + 2, _omitFieldNames ? '' : 'pubkey', $pb.PbFieldType.OY) ..hasRequiredFields = false; @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') - ClientConnectionResponse clone() => deepCopy(); + SdkClientConnectionResponse clone() => deepCopy(); @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') - ClientConnectionResponse copyWith( - void Function(ClientConnectionResponse) updates) => - super.copyWith((message) => updates(message as ClientConnectionResponse)) - as ClientConnectionResponse; + SdkClientConnectionResponse copyWith( + void Function(SdkClientConnectionResponse) updates) => + super.copyWith( + (message) => updates(message as SdkClientConnectionResponse)) + as SdkClientConnectionResponse; @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') - static ClientConnectionResponse create() => ClientConnectionResponse._(); + static SdkClientConnectionResponse create() => + SdkClientConnectionResponse._(); @$core.override - ClientConnectionResponse createEmptyInstance() => create(); + SdkClientConnectionResponse createEmptyInstance() => create(); @$core.pragma('dart2js:noInline') - static ClientConnectionResponse getDefault() => _defaultInstance ??= - $pb.GeneratedMessage.$_defaultFor(create); - static ClientConnectionResponse? _defaultInstance; + static SdkClientConnectionResponse getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static SdkClientConnectionResponse? _defaultInstance; @$pb.TagNumber(1) $core.bool get approved => $_getBF(0); @@ -603,46 +1004,72 @@ class ClientConnectionResponse extends $pb.GeneratedMessage { $core.bool hasApproved() => $_has(0); @$pb.TagNumber(1) void clearApproved() => $_clearField(1); + + @$pb.TagNumber(2) + $core.List<$core.int> get pubkey => $_getN(1); + @$pb.TagNumber(2) + set pubkey($core.List<$core.int> value) => $_setBytes(1, value); + @$pb.TagNumber(2) + $core.bool hasPubkey() => $_has(1); + @$pb.TagNumber(2) + void clearPubkey() => $_clearField(2); } -class ClientConnectionCancel extends $pb.GeneratedMessage { - factory ClientConnectionCancel() => create(); +class SdkClientConnectionCancel extends $pb.GeneratedMessage { + factory SdkClientConnectionCancel({ + $core.List<$core.int>? pubkey, + }) { + final result = create(); + if (pubkey != null) result.pubkey = pubkey; + return result; + } - ClientConnectionCancel._(); + SdkClientConnectionCancel._(); - factory ClientConnectionCancel.fromBuffer($core.List<$core.int> data, + factory SdkClientConnectionCancel.fromBuffer($core.List<$core.int> data, [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(data, registry); - factory ClientConnectionCancel.fromJson($core.String json, + factory SdkClientConnectionCancel.fromJson($core.String json, [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo( - _omitMessageNames ? '' : 'ClientConnectionCancel', + _omitMessageNames ? '' : 'SdkClientConnectionCancel', package: const $pb.PackageName(_omitMessageNames ? '' : 'arbiter.user_agent'), createEmptyInstance: create) + ..a<$core.List<$core.int>>( + 1, _omitFieldNames ? '' : 'pubkey', $pb.PbFieldType.OY) ..hasRequiredFields = false; @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') - ClientConnectionCancel clone() => deepCopy(); + SdkClientConnectionCancel clone() => deepCopy(); @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') - ClientConnectionCancel copyWith( - void Function(ClientConnectionCancel) updates) => - super.copyWith((message) => updates(message as ClientConnectionCancel)) - as ClientConnectionCancel; + SdkClientConnectionCancel copyWith( + void Function(SdkClientConnectionCancel) updates) => + super.copyWith((message) => updates(message as SdkClientConnectionCancel)) + as SdkClientConnectionCancel; @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') - static ClientConnectionCancel create() => ClientConnectionCancel._(); + static SdkClientConnectionCancel create() => SdkClientConnectionCancel._(); @$core.override - ClientConnectionCancel createEmptyInstance() => create(); + SdkClientConnectionCancel createEmptyInstance() => create(); @$core.pragma('dart2js:noInline') - static ClientConnectionCancel getDefault() => _defaultInstance ??= - $pb.GeneratedMessage.$_defaultFor(create); - static ClientConnectionCancel? _defaultInstance; + static SdkClientConnectionCancel getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static SdkClientConnectionCancel? _defaultInstance; + + @$pb.TagNumber(1) + $core.List<$core.int> get pubkey => $_getN(0); + @$pb.TagNumber(1) + set pubkey($core.List<$core.int> value) => $_setBytes(0, value); + @$pb.TagNumber(1) + $core.bool hasPubkey() => $_has(0); + @$pb.TagNumber(1) + void clearPubkey() => $_clearField(1); } enum UserAgentRequest_Payload { @@ -656,7 +1083,9 @@ enum UserAgentRequest_Payload { evmGrantCreate, evmGrantDelete, evmGrantList, - clientConnectionResponse, + sdkClientConnectionResponse, + sdkClientRevoke, + sdkClientList, bootstrapEncryptedKey, notSet } @@ -667,13 +1096,15 @@ class UserAgentRequest extends $pb.GeneratedMessage { AuthChallengeSolution? authChallengeSolution, UnsealStart? unsealStart, UnsealEncryptedKey? unsealEncryptedKey, - $0.Empty? queryVaultState, - $0.Empty? evmWalletCreate, - $0.Empty? evmWalletList, - $1.EvmGrantCreateRequest? evmGrantCreate, - $1.EvmGrantDeleteRequest? evmGrantDelete, - $1.EvmGrantListRequest? evmGrantList, - ClientConnectionResponse? clientConnectionResponse, + $1.Empty? queryVaultState, + $1.Empty? evmWalletCreate, + $1.Empty? evmWalletList, + $2.EvmGrantCreateRequest? evmGrantCreate, + $2.EvmGrantDeleteRequest? evmGrantDelete, + $2.EvmGrantListRequest? evmGrantList, + SdkClientConnectionResponse? sdkClientConnectionResponse, + SdkClientRevokeRequest? sdkClientRevoke, + $1.Empty? sdkClientList, BootstrapEncryptedKey? bootstrapEncryptedKey, $core.int? id, }) { @@ -691,8 +1122,10 @@ class UserAgentRequest extends $pb.GeneratedMessage { if (evmGrantCreate != null) result.evmGrantCreate = evmGrantCreate; if (evmGrantDelete != null) result.evmGrantDelete = evmGrantDelete; if (evmGrantList != null) result.evmGrantList = evmGrantList; - if (clientConnectionResponse != null) - result.clientConnectionResponse = clientConnectionResponse; + if (sdkClientConnectionResponse != null) + result.sdkClientConnectionResponse = sdkClientConnectionResponse; + if (sdkClientRevoke != null) result.sdkClientRevoke = sdkClientRevoke; + if (sdkClientList != null) result.sdkClientList = sdkClientList; if (bootstrapEncryptedKey != null) result.bootstrapEncryptedKey = bootstrapEncryptedKey; if (id != null) result.id = id; @@ -720,8 +1153,10 @@ class UserAgentRequest extends $pb.GeneratedMessage { 8: UserAgentRequest_Payload.evmGrantCreate, 9: UserAgentRequest_Payload.evmGrantDelete, 10: UserAgentRequest_Payload.evmGrantList, - 11: UserAgentRequest_Payload.clientConnectionResponse, - 12: UserAgentRequest_Payload.bootstrapEncryptedKey, + 11: UserAgentRequest_Payload.sdkClientConnectionResponse, + 13: UserAgentRequest_Payload.sdkClientRevoke, + 14: UserAgentRequest_Payload.sdkClientList, + 15: UserAgentRequest_Payload.bootstrapEncryptedKey, 0: UserAgentRequest_Payload.notSet }; static final $pb.BuilderInfo _i = $pb.BuilderInfo( @@ -729,7 +1164,7 @@ class UserAgentRequest extends $pb.GeneratedMessage { package: const $pb.PackageName(_omitMessageNames ? '' : 'arbiter.user_agent'), createEmptyInstance: create) - ..oo(0, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]) + ..oo(0, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]) ..aOM( 1, _omitFieldNames ? '' : 'authChallengeRequest', subBuilder: AuthChallengeRequest.create) @@ -740,25 +1175,29 @@ class UserAgentRequest extends $pb.GeneratedMessage { subBuilder: UnsealStart.create) ..aOM(4, _omitFieldNames ? '' : 'unsealEncryptedKey', subBuilder: UnsealEncryptedKey.create) - ..aOM<$0.Empty>(5, _omitFieldNames ? '' : 'queryVaultState', - subBuilder: $0.Empty.create) - ..aOM<$0.Empty>(6, _omitFieldNames ? '' : 'evmWalletCreate', - subBuilder: $0.Empty.create) - ..aOM<$0.Empty>(7, _omitFieldNames ? '' : 'evmWalletList', - subBuilder: $0.Empty.create) - ..aOM<$1.EvmGrantCreateRequest>(8, _omitFieldNames ? '' : 'evmGrantCreate', - subBuilder: $1.EvmGrantCreateRequest.create) - ..aOM<$1.EvmGrantDeleteRequest>(9, _omitFieldNames ? '' : 'evmGrantDelete', - subBuilder: $1.EvmGrantDeleteRequest.create) - ..aOM<$1.EvmGrantListRequest>(10, _omitFieldNames ? '' : 'evmGrantList', - subBuilder: $1.EvmGrantListRequest.create) - ..aOM( - 11, _omitFieldNames ? '' : 'clientConnectionResponse', - subBuilder: ClientConnectionResponse.create) + ..aOM<$1.Empty>(5, _omitFieldNames ? '' : 'queryVaultState', + subBuilder: $1.Empty.create) + ..aOM<$1.Empty>(6, _omitFieldNames ? '' : 'evmWalletCreate', + subBuilder: $1.Empty.create) + ..aOM<$1.Empty>(7, _omitFieldNames ? '' : 'evmWalletList', + subBuilder: $1.Empty.create) + ..aOM<$2.EvmGrantCreateRequest>(8, _omitFieldNames ? '' : 'evmGrantCreate', + subBuilder: $2.EvmGrantCreateRequest.create) + ..aOM<$2.EvmGrantDeleteRequest>(9, _omitFieldNames ? '' : 'evmGrantDelete', + subBuilder: $2.EvmGrantDeleteRequest.create) + ..aOM<$2.EvmGrantListRequest>(10, _omitFieldNames ? '' : 'evmGrantList', + subBuilder: $2.EvmGrantListRequest.create) + ..aOM( + 11, _omitFieldNames ? '' : 'sdkClientConnectionResponse', + subBuilder: SdkClientConnectionResponse.create) + ..aOM(13, _omitFieldNames ? '' : 'sdkClientRevoke', + subBuilder: SdkClientRevokeRequest.create) + ..aOM<$1.Empty>(14, _omitFieldNames ? '' : 'sdkClientList', + subBuilder: $1.Empty.create) ..aOM( - 12, _omitFieldNames ? '' : 'bootstrapEncryptedKey', + 15, _omitFieldNames ? '' : 'bootstrapEncryptedKey', subBuilder: BootstrapEncryptedKey.create) - ..aI(14, _omitFieldNames ? '' : 'id') + ..aI(16, _omitFieldNames ? '' : 'id') ..hasRequiredFields = false; @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') @@ -791,7 +1230,9 @@ class UserAgentRequest extends $pb.GeneratedMessage { @$pb.TagNumber(9) @$pb.TagNumber(10) @$pb.TagNumber(11) - @$pb.TagNumber(12) + @$pb.TagNumber(13) + @$pb.TagNumber(14) + @$pb.TagNumber(15) UserAgentRequest_Payload whichPayload() => _UserAgentRequest_PayloadByTag[$_whichOneof(0)]!; @$pb.TagNumber(1) @@ -805,7 +1246,9 @@ class UserAgentRequest extends $pb.GeneratedMessage { @$pb.TagNumber(9) @$pb.TagNumber(10) @$pb.TagNumber(11) - @$pb.TagNumber(12) + @$pb.TagNumber(13) + @$pb.TagNumber(14) + @$pb.TagNumber(15) void clearPayload() => $_clearField($_whichOneof(0)); @$pb.TagNumber(1) @@ -854,103 +1297,126 @@ class UserAgentRequest extends $pb.GeneratedMessage { UnsealEncryptedKey ensureUnsealEncryptedKey() => $_ensure(3); @$pb.TagNumber(5) - $0.Empty get queryVaultState => $_getN(4); + $1.Empty get queryVaultState => $_getN(4); @$pb.TagNumber(5) - set queryVaultState($0.Empty value) => $_setField(5, value); + set queryVaultState($1.Empty value) => $_setField(5, value); @$pb.TagNumber(5) $core.bool hasQueryVaultState() => $_has(4); @$pb.TagNumber(5) void clearQueryVaultState() => $_clearField(5); @$pb.TagNumber(5) - $0.Empty ensureQueryVaultState() => $_ensure(4); + $1.Empty ensureQueryVaultState() => $_ensure(4); @$pb.TagNumber(6) - $0.Empty get evmWalletCreate => $_getN(5); + $1.Empty get evmWalletCreate => $_getN(5); @$pb.TagNumber(6) - set evmWalletCreate($0.Empty value) => $_setField(6, value); + set evmWalletCreate($1.Empty value) => $_setField(6, value); @$pb.TagNumber(6) $core.bool hasEvmWalletCreate() => $_has(5); @$pb.TagNumber(6) void clearEvmWalletCreate() => $_clearField(6); @$pb.TagNumber(6) - $0.Empty ensureEvmWalletCreate() => $_ensure(5); + $1.Empty ensureEvmWalletCreate() => $_ensure(5); @$pb.TagNumber(7) - $0.Empty get evmWalletList => $_getN(6); + $1.Empty get evmWalletList => $_getN(6); @$pb.TagNumber(7) - set evmWalletList($0.Empty value) => $_setField(7, value); + set evmWalletList($1.Empty value) => $_setField(7, value); @$pb.TagNumber(7) $core.bool hasEvmWalletList() => $_has(6); @$pb.TagNumber(7) void clearEvmWalletList() => $_clearField(7); @$pb.TagNumber(7) - $0.Empty ensureEvmWalletList() => $_ensure(6); + $1.Empty ensureEvmWalletList() => $_ensure(6); @$pb.TagNumber(8) - $1.EvmGrantCreateRequest get evmGrantCreate => $_getN(7); + $2.EvmGrantCreateRequest get evmGrantCreate => $_getN(7); @$pb.TagNumber(8) - set evmGrantCreate($1.EvmGrantCreateRequest value) => $_setField(8, value); + set evmGrantCreate($2.EvmGrantCreateRequest value) => $_setField(8, value); @$pb.TagNumber(8) $core.bool hasEvmGrantCreate() => $_has(7); @$pb.TagNumber(8) void clearEvmGrantCreate() => $_clearField(8); @$pb.TagNumber(8) - $1.EvmGrantCreateRequest ensureEvmGrantCreate() => $_ensure(7); + $2.EvmGrantCreateRequest ensureEvmGrantCreate() => $_ensure(7); @$pb.TagNumber(9) - $1.EvmGrantDeleteRequest get evmGrantDelete => $_getN(8); + $2.EvmGrantDeleteRequest get evmGrantDelete => $_getN(8); @$pb.TagNumber(9) - set evmGrantDelete($1.EvmGrantDeleteRequest value) => $_setField(9, value); + set evmGrantDelete($2.EvmGrantDeleteRequest value) => $_setField(9, value); @$pb.TagNumber(9) $core.bool hasEvmGrantDelete() => $_has(8); @$pb.TagNumber(9) void clearEvmGrantDelete() => $_clearField(9); @$pb.TagNumber(9) - $1.EvmGrantDeleteRequest ensureEvmGrantDelete() => $_ensure(8); + $2.EvmGrantDeleteRequest ensureEvmGrantDelete() => $_ensure(8); @$pb.TagNumber(10) - $1.EvmGrantListRequest get evmGrantList => $_getN(9); + $2.EvmGrantListRequest get evmGrantList => $_getN(9); @$pb.TagNumber(10) - set evmGrantList($1.EvmGrantListRequest value) => $_setField(10, value); + set evmGrantList($2.EvmGrantListRequest value) => $_setField(10, value); @$pb.TagNumber(10) $core.bool hasEvmGrantList() => $_has(9); @$pb.TagNumber(10) void clearEvmGrantList() => $_clearField(10); @$pb.TagNumber(10) - $1.EvmGrantListRequest ensureEvmGrantList() => $_ensure(9); + $2.EvmGrantListRequest ensureEvmGrantList() => $_ensure(9); @$pb.TagNumber(11) - ClientConnectionResponse get clientConnectionResponse => $_getN(10); + SdkClientConnectionResponse get sdkClientConnectionResponse => $_getN(10); @$pb.TagNumber(11) - set clientConnectionResponse(ClientConnectionResponse value) => + set sdkClientConnectionResponse(SdkClientConnectionResponse value) => $_setField(11, value); @$pb.TagNumber(11) - $core.bool hasClientConnectionResponse() => $_has(10); + $core.bool hasSdkClientConnectionResponse() => $_has(10); @$pb.TagNumber(11) - void clearClientConnectionResponse() => $_clearField(11); + void clearSdkClientConnectionResponse() => $_clearField(11); @$pb.TagNumber(11) - ClientConnectionResponse ensureClientConnectionResponse() => $_ensure(10); + SdkClientConnectionResponse ensureSdkClientConnectionResponse() => + $_ensure(10); - @$pb.TagNumber(12) - BootstrapEncryptedKey get bootstrapEncryptedKey => $_getN(11); - @$pb.TagNumber(12) + @$pb.TagNumber(13) + SdkClientRevokeRequest get sdkClientRevoke => $_getN(11); + @$pb.TagNumber(13) + set sdkClientRevoke(SdkClientRevokeRequest value) => $_setField(13, value); + @$pb.TagNumber(13) + $core.bool hasSdkClientRevoke() => $_has(11); + @$pb.TagNumber(13) + void clearSdkClientRevoke() => $_clearField(13); + @$pb.TagNumber(13) + SdkClientRevokeRequest ensureSdkClientRevoke() => $_ensure(11); + + @$pb.TagNumber(14) + $1.Empty get sdkClientList => $_getN(12); + @$pb.TagNumber(14) + set sdkClientList($1.Empty value) => $_setField(14, value); + @$pb.TagNumber(14) + $core.bool hasSdkClientList() => $_has(12); + @$pb.TagNumber(14) + void clearSdkClientList() => $_clearField(14); + @$pb.TagNumber(14) + $1.Empty ensureSdkClientList() => $_ensure(12); + + @$pb.TagNumber(15) + BootstrapEncryptedKey get bootstrapEncryptedKey => $_getN(13); + @$pb.TagNumber(15) set bootstrapEncryptedKey(BootstrapEncryptedKey value) => - $_setField(12, value); - @$pb.TagNumber(12) - $core.bool hasBootstrapEncryptedKey() => $_has(11); - @$pb.TagNumber(12) - void clearBootstrapEncryptedKey() => $_clearField(12); - @$pb.TagNumber(12) - BootstrapEncryptedKey ensureBootstrapEncryptedKey() => $_ensure(11); + $_setField(15, value); + @$pb.TagNumber(15) + $core.bool hasBootstrapEncryptedKey() => $_has(13); + @$pb.TagNumber(15) + void clearBootstrapEncryptedKey() => $_clearField(15); + @$pb.TagNumber(15) + BootstrapEncryptedKey ensureBootstrapEncryptedKey() => $_ensure(13); - @$pb.TagNumber(14) - $core.int get id => $_getIZ(12); - @$pb.TagNumber(14) - set id($core.int value) => $_setSignedInt32(12, value); - @$pb.TagNumber(14) - $core.bool hasId() => $_has(12); - @$pb.TagNumber(14) - void clearId() => $_clearField(14); + @$pb.TagNumber(16) + $core.int get id => $_getIZ(14); + @$pb.TagNumber(16) + set id($core.int value) => $_setSignedInt32(14, value); + @$pb.TagNumber(16) + $core.bool hasId() => $_has(14); + @$pb.TagNumber(16) + void clearId() => $_clearField(16); } enum UserAgentResponse_Payload { @@ -964,8 +1430,10 @@ enum UserAgentResponse_Payload { evmGrantCreate, evmGrantDelete, evmGrantList, - clientConnectionRequest, - clientConnectionCancel, + sdkClientConnectionRequest, + sdkClientConnectionCancel, + sdkClientRevokeResponse, + sdkClientListResponse, bootstrapResult, notSet } @@ -977,13 +1445,15 @@ class UserAgentResponse extends $pb.GeneratedMessage { UnsealStartResponse? unsealStartResponse, UnsealResult? unsealResult, VaultState? vaultState, - $1.WalletCreateResponse? evmWalletCreate, - $1.WalletListResponse? evmWalletList, - $1.EvmGrantCreateResponse? evmGrantCreate, - $1.EvmGrantDeleteResponse? evmGrantDelete, - $1.EvmGrantListResponse? evmGrantList, - ClientConnectionRequest? clientConnectionRequest, - ClientConnectionCancel? clientConnectionCancel, + $2.WalletCreateResponse? evmWalletCreate, + $2.WalletListResponse? evmWalletList, + $2.EvmGrantCreateResponse? evmGrantCreate, + $2.EvmGrantDeleteResponse? evmGrantDelete, + $2.EvmGrantListResponse? evmGrantList, + SdkClientConnectionRequest? sdkClientConnectionRequest, + SdkClientConnectionCancel? sdkClientConnectionCancel, + SdkClientRevokeResponse? sdkClientRevokeResponse, + SdkClientListResponse? sdkClientListResponse, BootstrapResult? bootstrapResult, $core.int? id, }) { @@ -999,10 +1469,14 @@ class UserAgentResponse extends $pb.GeneratedMessage { if (evmGrantCreate != null) result.evmGrantCreate = evmGrantCreate; if (evmGrantDelete != null) result.evmGrantDelete = evmGrantDelete; if (evmGrantList != null) result.evmGrantList = evmGrantList; - if (clientConnectionRequest != null) - result.clientConnectionRequest = clientConnectionRequest; - if (clientConnectionCancel != null) - result.clientConnectionCancel = clientConnectionCancel; + if (sdkClientConnectionRequest != null) + result.sdkClientConnectionRequest = sdkClientConnectionRequest; + if (sdkClientConnectionCancel != null) + result.sdkClientConnectionCancel = sdkClientConnectionCancel; + if (sdkClientRevokeResponse != null) + result.sdkClientRevokeResponse = sdkClientRevokeResponse; + if (sdkClientListResponse != null) + result.sdkClientListResponse = sdkClientListResponse; if (bootstrapResult != null) result.bootstrapResult = bootstrapResult; if (id != null) result.id = id; return result; @@ -1029,9 +1503,11 @@ class UserAgentResponse extends $pb.GeneratedMessage { 8: UserAgentResponse_Payload.evmGrantCreate, 9: UserAgentResponse_Payload.evmGrantDelete, 10: UserAgentResponse_Payload.evmGrantList, - 11: UserAgentResponse_Payload.clientConnectionRequest, - 12: UserAgentResponse_Payload.clientConnectionCancel, - 13: UserAgentResponse_Payload.bootstrapResult, + 11: UserAgentResponse_Payload.sdkClientConnectionRequest, + 12: UserAgentResponse_Payload.sdkClientConnectionCancel, + 13: UserAgentResponse_Payload.sdkClientRevokeResponse, + 14: UserAgentResponse_Payload.sdkClientListResponse, + 15: UserAgentResponse_Payload.bootstrapResult, 0: UserAgentResponse_Payload.notSet }; static final $pb.BuilderInfo _i = $pb.BuilderInfo( @@ -1039,7 +1515,7 @@ class UserAgentResponse extends $pb.GeneratedMessage { package: const $pb.PackageName(_omitMessageNames ? '' : 'arbiter.user_agent'), createEmptyInstance: create) - ..oo(0, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]) + ..oo(0, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]) ..aOM(1, _omitFieldNames ? '' : 'authChallenge', subBuilder: AuthChallenge.create) ..aE(2, _omitFieldNames ? '' : 'authResult', @@ -1050,25 +1526,31 @@ class UserAgentResponse extends $pb.GeneratedMessage { enumValues: UnsealResult.values) ..aE(5, _omitFieldNames ? '' : 'vaultState', enumValues: VaultState.values) - ..aOM<$1.WalletCreateResponse>(6, _omitFieldNames ? '' : 'evmWalletCreate', - subBuilder: $1.WalletCreateResponse.create) - ..aOM<$1.WalletListResponse>(7, _omitFieldNames ? '' : 'evmWalletList', - subBuilder: $1.WalletListResponse.create) - ..aOM<$1.EvmGrantCreateResponse>(8, _omitFieldNames ? '' : 'evmGrantCreate', - subBuilder: $1.EvmGrantCreateResponse.create) - ..aOM<$1.EvmGrantDeleteResponse>(9, _omitFieldNames ? '' : 'evmGrantDelete', - subBuilder: $1.EvmGrantDeleteResponse.create) - ..aOM<$1.EvmGrantListResponse>(10, _omitFieldNames ? '' : 'evmGrantList', - subBuilder: $1.EvmGrantListResponse.create) - ..aOM( - 11, _omitFieldNames ? '' : 'clientConnectionRequest', - subBuilder: ClientConnectionRequest.create) - ..aOM( - 12, _omitFieldNames ? '' : 'clientConnectionCancel', - subBuilder: ClientConnectionCancel.create) - ..aE(13, _omitFieldNames ? '' : 'bootstrapResult', + ..aOM<$2.WalletCreateResponse>(6, _omitFieldNames ? '' : 'evmWalletCreate', + subBuilder: $2.WalletCreateResponse.create) + ..aOM<$2.WalletListResponse>(7, _omitFieldNames ? '' : 'evmWalletList', + subBuilder: $2.WalletListResponse.create) + ..aOM<$2.EvmGrantCreateResponse>(8, _omitFieldNames ? '' : 'evmGrantCreate', + subBuilder: $2.EvmGrantCreateResponse.create) + ..aOM<$2.EvmGrantDeleteResponse>(9, _omitFieldNames ? '' : 'evmGrantDelete', + subBuilder: $2.EvmGrantDeleteResponse.create) + ..aOM<$2.EvmGrantListResponse>(10, _omitFieldNames ? '' : 'evmGrantList', + subBuilder: $2.EvmGrantListResponse.create) + ..aOM( + 11, _omitFieldNames ? '' : 'sdkClientConnectionRequest', + subBuilder: SdkClientConnectionRequest.create) + ..aOM( + 12, _omitFieldNames ? '' : 'sdkClientConnectionCancel', + subBuilder: SdkClientConnectionCancel.create) + ..aOM( + 13, _omitFieldNames ? '' : 'sdkClientRevokeResponse', + subBuilder: SdkClientRevokeResponse.create) + ..aOM( + 14, _omitFieldNames ? '' : 'sdkClientListResponse', + subBuilder: SdkClientListResponse.create) + ..aE(15, _omitFieldNames ? '' : 'bootstrapResult', enumValues: BootstrapResult.values) - ..aI(14, _omitFieldNames ? '' : 'id') + ..aI(16, _omitFieldNames ? '' : 'id') ..hasRequiredFields = false; @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') @@ -1103,6 +1585,8 @@ class UserAgentResponse extends $pb.GeneratedMessage { @$pb.TagNumber(11) @$pb.TagNumber(12) @$pb.TagNumber(13) + @$pb.TagNumber(14) + @$pb.TagNumber(15) UserAgentResponse_Payload whichPayload() => _UserAgentResponse_PayloadByTag[$_whichOneof(0)]!; @$pb.TagNumber(1) @@ -1118,6 +1602,8 @@ class UserAgentResponse extends $pb.GeneratedMessage { @$pb.TagNumber(11) @$pb.TagNumber(12) @$pb.TagNumber(13) + @$pb.TagNumber(14) + @$pb.TagNumber(15) void clearPayload() => $_clearField($_whichOneof(0)); @$pb.TagNumber(1) @@ -1170,101 +1656,125 @@ class UserAgentResponse extends $pb.GeneratedMessage { void clearVaultState() => $_clearField(5); @$pb.TagNumber(6) - $1.WalletCreateResponse get evmWalletCreate => $_getN(5); + $2.WalletCreateResponse get evmWalletCreate => $_getN(5); @$pb.TagNumber(6) - set evmWalletCreate($1.WalletCreateResponse value) => $_setField(6, value); + set evmWalletCreate($2.WalletCreateResponse value) => $_setField(6, value); @$pb.TagNumber(6) $core.bool hasEvmWalletCreate() => $_has(5); @$pb.TagNumber(6) void clearEvmWalletCreate() => $_clearField(6); @$pb.TagNumber(6) - $1.WalletCreateResponse ensureEvmWalletCreate() => $_ensure(5); + $2.WalletCreateResponse ensureEvmWalletCreate() => $_ensure(5); @$pb.TagNumber(7) - $1.WalletListResponse get evmWalletList => $_getN(6); + $2.WalletListResponse get evmWalletList => $_getN(6); @$pb.TagNumber(7) - set evmWalletList($1.WalletListResponse value) => $_setField(7, value); + set evmWalletList($2.WalletListResponse value) => $_setField(7, value); @$pb.TagNumber(7) $core.bool hasEvmWalletList() => $_has(6); @$pb.TagNumber(7) void clearEvmWalletList() => $_clearField(7); @$pb.TagNumber(7) - $1.WalletListResponse ensureEvmWalletList() => $_ensure(6); + $2.WalletListResponse ensureEvmWalletList() => $_ensure(6); @$pb.TagNumber(8) - $1.EvmGrantCreateResponse get evmGrantCreate => $_getN(7); + $2.EvmGrantCreateResponse get evmGrantCreate => $_getN(7); @$pb.TagNumber(8) - set evmGrantCreate($1.EvmGrantCreateResponse value) => $_setField(8, value); + set evmGrantCreate($2.EvmGrantCreateResponse value) => $_setField(8, value); @$pb.TagNumber(8) $core.bool hasEvmGrantCreate() => $_has(7); @$pb.TagNumber(8) void clearEvmGrantCreate() => $_clearField(8); @$pb.TagNumber(8) - $1.EvmGrantCreateResponse ensureEvmGrantCreate() => $_ensure(7); + $2.EvmGrantCreateResponse ensureEvmGrantCreate() => $_ensure(7); @$pb.TagNumber(9) - $1.EvmGrantDeleteResponse get evmGrantDelete => $_getN(8); + $2.EvmGrantDeleteResponse get evmGrantDelete => $_getN(8); @$pb.TagNumber(9) - set evmGrantDelete($1.EvmGrantDeleteResponse value) => $_setField(9, value); + set evmGrantDelete($2.EvmGrantDeleteResponse value) => $_setField(9, value); @$pb.TagNumber(9) $core.bool hasEvmGrantDelete() => $_has(8); @$pb.TagNumber(9) void clearEvmGrantDelete() => $_clearField(9); @$pb.TagNumber(9) - $1.EvmGrantDeleteResponse ensureEvmGrantDelete() => $_ensure(8); + $2.EvmGrantDeleteResponse ensureEvmGrantDelete() => $_ensure(8); @$pb.TagNumber(10) - $1.EvmGrantListResponse get evmGrantList => $_getN(9); + $2.EvmGrantListResponse get evmGrantList => $_getN(9); @$pb.TagNumber(10) - set evmGrantList($1.EvmGrantListResponse value) => $_setField(10, value); + set evmGrantList($2.EvmGrantListResponse value) => $_setField(10, value); @$pb.TagNumber(10) $core.bool hasEvmGrantList() => $_has(9); @$pb.TagNumber(10) void clearEvmGrantList() => $_clearField(10); @$pb.TagNumber(10) - $1.EvmGrantListResponse ensureEvmGrantList() => $_ensure(9); + $2.EvmGrantListResponse ensureEvmGrantList() => $_ensure(9); @$pb.TagNumber(11) - ClientConnectionRequest get clientConnectionRequest => $_getN(10); + SdkClientConnectionRequest get sdkClientConnectionRequest => $_getN(10); @$pb.TagNumber(11) - set clientConnectionRequest(ClientConnectionRequest value) => + set sdkClientConnectionRequest(SdkClientConnectionRequest value) => $_setField(11, value); @$pb.TagNumber(11) - $core.bool hasClientConnectionRequest() => $_has(10); + $core.bool hasSdkClientConnectionRequest() => $_has(10); @$pb.TagNumber(11) - void clearClientConnectionRequest() => $_clearField(11); + void clearSdkClientConnectionRequest() => $_clearField(11); @$pb.TagNumber(11) - ClientConnectionRequest ensureClientConnectionRequest() => $_ensure(10); + SdkClientConnectionRequest ensureSdkClientConnectionRequest() => $_ensure(10); @$pb.TagNumber(12) - ClientConnectionCancel get clientConnectionCancel => $_getN(11); + SdkClientConnectionCancel get sdkClientConnectionCancel => $_getN(11); @$pb.TagNumber(12) - set clientConnectionCancel(ClientConnectionCancel value) => + set sdkClientConnectionCancel(SdkClientConnectionCancel value) => $_setField(12, value); @$pb.TagNumber(12) - $core.bool hasClientConnectionCancel() => $_has(11); + $core.bool hasSdkClientConnectionCancel() => $_has(11); @$pb.TagNumber(12) - void clearClientConnectionCancel() => $_clearField(12); + void clearSdkClientConnectionCancel() => $_clearField(12); @$pb.TagNumber(12) - ClientConnectionCancel ensureClientConnectionCancel() => $_ensure(11); + SdkClientConnectionCancel ensureSdkClientConnectionCancel() => $_ensure(11); @$pb.TagNumber(13) - BootstrapResult get bootstrapResult => $_getN(12); + SdkClientRevokeResponse get sdkClientRevokeResponse => $_getN(12); @$pb.TagNumber(13) - set bootstrapResult(BootstrapResult value) => $_setField(13, value); + set sdkClientRevokeResponse(SdkClientRevokeResponse value) => + $_setField(13, value); @$pb.TagNumber(13) - $core.bool hasBootstrapResult() => $_has(12); + $core.bool hasSdkClientRevokeResponse() => $_has(12); @$pb.TagNumber(13) - void clearBootstrapResult() => $_clearField(13); + void clearSdkClientRevokeResponse() => $_clearField(13); + @$pb.TagNumber(13) + SdkClientRevokeResponse ensureSdkClientRevokeResponse() => $_ensure(12); @$pb.TagNumber(14) - $core.int get id => $_getIZ(13); + SdkClientListResponse get sdkClientListResponse => $_getN(13); @$pb.TagNumber(14) - set id($core.int value) => $_setSignedInt32(13, value); + set sdkClientListResponse(SdkClientListResponse value) => + $_setField(14, value); @$pb.TagNumber(14) - $core.bool hasId() => $_has(13); + $core.bool hasSdkClientListResponse() => $_has(13); @$pb.TagNumber(14) - void clearId() => $_clearField(14); + void clearSdkClientListResponse() => $_clearField(14); + @$pb.TagNumber(14) + SdkClientListResponse ensureSdkClientListResponse() => $_ensure(13); + + @$pb.TagNumber(15) + BootstrapResult get bootstrapResult => $_getN(14); + @$pb.TagNumber(15) + set bootstrapResult(BootstrapResult value) => $_setField(15, value); + @$pb.TagNumber(15) + $core.bool hasBootstrapResult() => $_has(14); + @$pb.TagNumber(15) + void clearBootstrapResult() => $_clearField(15); + + @$pb.TagNumber(16) + $core.int get id => $_getIZ(15); + @$pb.TagNumber(16) + set id($core.int value) => $_setSignedInt32(15, value); + @$pb.TagNumber(16) + $core.bool hasId() => $_has(15); + @$pb.TagNumber(16) + void clearId() => $_clearField(16); } const $core.bool _omitFieldNames = diff --git a/useragent/lib/proto/user_agent.pbenum.dart b/useragent/lib/proto/user_agent.pbenum.dart index 66ff3be..dfc4a2d 100644 --- a/useragent/lib/proto/user_agent.pbenum.dart +++ b/useragent/lib/proto/user_agent.pbenum.dart @@ -39,6 +39,36 @@ class KeyType extends $pb.ProtobufEnum { const KeyType._(super.value, super.name); } +class SdkClientError extends $pb.ProtobufEnum { + static const SdkClientError SDK_CLIENT_ERROR_UNSPECIFIED = + SdkClientError._(0, _omitEnumNames ? '' : 'SDK_CLIENT_ERROR_UNSPECIFIED'); + static const SdkClientError SDK_CLIENT_ERROR_ALREADY_EXISTS = + SdkClientError._( + 1, _omitEnumNames ? '' : 'SDK_CLIENT_ERROR_ALREADY_EXISTS'); + static const SdkClientError SDK_CLIENT_ERROR_NOT_FOUND = + SdkClientError._(2, _omitEnumNames ? '' : 'SDK_CLIENT_ERROR_NOT_FOUND'); + static const SdkClientError SDK_CLIENT_ERROR_HAS_RELATED_DATA = + SdkClientError._( + 3, _omitEnumNames ? '' : 'SDK_CLIENT_ERROR_HAS_RELATED_DATA'); + static const SdkClientError SDK_CLIENT_ERROR_INTERNAL = + SdkClientError._(4, _omitEnumNames ? '' : 'SDK_CLIENT_ERROR_INTERNAL'); + + static const $core.List values = [ + SDK_CLIENT_ERROR_UNSPECIFIED, + SDK_CLIENT_ERROR_ALREADY_EXISTS, + SDK_CLIENT_ERROR_NOT_FOUND, + SDK_CLIENT_ERROR_HAS_RELATED_DATA, + SDK_CLIENT_ERROR_INTERNAL, + ]; + + static final $core.List _byValue = + $pb.ProtobufEnum.$_initByValueList(values, 4); + static SdkClientError? valueOf($core.int value) => + value < 0 || value >= _byValue.length ? null : _byValue[value]; + + const SdkClientError._(super.value, super.name); +} + class AuthResult extends $pb.ProtobufEnum { static const AuthResult AUTH_RESULT_UNSPECIFIED = AuthResult._(0, _omitEnumNames ? '' : 'AUTH_RESULT_UNSPECIFIED'); diff --git a/useragent/lib/proto/user_agent.pbjson.dart b/useragent/lib/proto/user_agent.pbjson.dart index b74a873..42676d1 100644 --- a/useragent/lib/proto/user_agent.pbjson.dart +++ b/useragent/lib/proto/user_agent.pbjson.dart @@ -31,6 +31,25 @@ final $typed_data.Uint8List keyTypeDescriptor = $convert.base64Decode( 'CgdLZXlUeXBlEhgKFEtFWV9UWVBFX1VOU1BFQ0lGSUVEEAASFAoQS0VZX1RZUEVfRUQyNTUxOR' 'ABEhwKGEtFWV9UWVBFX0VDRFNBX1NFQ1AyNTZLMRACEhAKDEtFWV9UWVBFX1JTQRAD'); +@$core.Deprecated('Use sdkClientErrorDescriptor instead') +const SdkClientError$json = { + '1': 'SdkClientError', + '2': [ + {'1': 'SDK_CLIENT_ERROR_UNSPECIFIED', '2': 0}, + {'1': 'SDK_CLIENT_ERROR_ALREADY_EXISTS', '2': 1}, + {'1': 'SDK_CLIENT_ERROR_NOT_FOUND', '2': 2}, + {'1': 'SDK_CLIENT_ERROR_HAS_RELATED_DATA', '2': 3}, + {'1': 'SDK_CLIENT_ERROR_INTERNAL', '2': 4}, + ], +}; + +/// Descriptor for `SdkClientError`. Decode as a `google.protobuf.EnumDescriptorProto`. +final $typed_data.Uint8List sdkClientErrorDescriptor = $convert.base64Decode( + 'Cg5TZGtDbGllbnRFcnJvchIgChxTREtfQ0xJRU5UX0VSUk9SX1VOU1BFQ0lGSUVEEAASIwofU0' + 'RLX0NMSUVOVF9FUlJPUl9BTFJFQURZX0VYSVNUUxABEh4KGlNES19DTElFTlRfRVJST1JfTk9U' + 'X0ZPVU5EEAISJQohU0RLX0NMSUVOVF9FUlJPUl9IQVNfUkVMQVRFRF9EQVRBEAMSHQoZU0RLX0' + 'NMSUVOVF9FUlJPUl9JTlRFUk5BTBAE'); + @$core.Deprecated('Use authResultDescriptor instead') const AuthResult$json = { '1': 'AuthResult', @@ -105,6 +124,131 @@ final $typed_data.Uint8List vaultStateDescriptor = $convert.base64Decode( 'VfVU5CT09UU1RSQVBQRUQQARIWChJWQVVMVF9TVEFURV9TRUFMRUQQAhIYChRWQVVMVF9TVEFU' 'RV9VTlNFQUxFRBADEhUKEVZBVUxUX1NUQVRFX0VSUk9SEAQ='); +@$core.Deprecated('Use sdkClientRevokeRequestDescriptor instead') +const SdkClientRevokeRequest$json = { + '1': 'SdkClientRevokeRequest', + '2': [ + {'1': 'client_id', '3': 1, '4': 1, '5': 5, '10': 'clientId'}, + ], +}; + +/// Descriptor for `SdkClientRevokeRequest`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List sdkClientRevokeRequestDescriptor = + $convert.base64Decode( + 'ChZTZGtDbGllbnRSZXZva2VSZXF1ZXN0EhsKCWNsaWVudF9pZBgBIAEoBVIIY2xpZW50SWQ='); + +@$core.Deprecated('Use sdkClientEntryDescriptor instead') +const SdkClientEntry$json = { + '1': 'SdkClientEntry', + '2': [ + {'1': 'id', '3': 1, '4': 1, '5': 5, '10': 'id'}, + {'1': 'pubkey', '3': 2, '4': 1, '5': 12, '10': 'pubkey'}, + { + '1': 'info', + '3': 3, + '4': 1, + '5': 11, + '6': '.arbiter.client.ClientInfo', + '10': 'info' + }, + {'1': 'created_at', '3': 4, '4': 1, '5': 5, '10': 'createdAt'}, + ], +}; + +/// Descriptor for `SdkClientEntry`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List sdkClientEntryDescriptor = $convert.base64Decode( + 'Cg5TZGtDbGllbnRFbnRyeRIOCgJpZBgBIAEoBVICaWQSFgoGcHVia2V5GAIgASgMUgZwdWJrZX' + 'kSLgoEaW5mbxgDIAEoCzIaLmFyYml0ZXIuY2xpZW50LkNsaWVudEluZm9SBGluZm8SHQoKY3Jl' + 'YXRlZF9hdBgEIAEoBVIJY3JlYXRlZEF0'); + +@$core.Deprecated('Use sdkClientListDescriptor instead') +const SdkClientList$json = { + '1': 'SdkClientList', + '2': [ + { + '1': 'clients', + '3': 1, + '4': 3, + '5': 11, + '6': '.arbiter.user_agent.SdkClientEntry', + '10': 'clients' + }, + ], +}; + +/// Descriptor for `SdkClientList`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List sdkClientListDescriptor = $convert.base64Decode( + 'Cg1TZGtDbGllbnRMaXN0EjwKB2NsaWVudHMYASADKAsyIi5hcmJpdGVyLnVzZXJfYWdlbnQuU2' + 'RrQ2xpZW50RW50cnlSB2NsaWVudHM='); + +@$core.Deprecated('Use sdkClientRevokeResponseDescriptor instead') +const SdkClientRevokeResponse$json = { + '1': 'SdkClientRevokeResponse', + '2': [ + { + '1': 'ok', + '3': 1, + '4': 1, + '5': 11, + '6': '.google.protobuf.Empty', + '9': 0, + '10': 'ok' + }, + { + '1': 'error', + '3': 2, + '4': 1, + '5': 14, + '6': '.arbiter.user_agent.SdkClientError', + '9': 0, + '10': 'error' + }, + ], + '8': [ + {'1': 'result'}, + ], +}; + +/// Descriptor for `SdkClientRevokeResponse`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List sdkClientRevokeResponseDescriptor = $convert.base64Decode( + 'ChdTZGtDbGllbnRSZXZva2VSZXNwb25zZRIoCgJvaxgBIAEoCzIWLmdvb2dsZS5wcm90b2J1Zi' + '5FbXB0eUgAUgJvaxI6CgVlcnJvchgCIAEoDjIiLmFyYml0ZXIudXNlcl9hZ2VudC5TZGtDbGll' + 'bnRFcnJvckgAUgVlcnJvckIICgZyZXN1bHQ='); + +@$core.Deprecated('Use sdkClientListResponseDescriptor instead') +const SdkClientListResponse$json = { + '1': 'SdkClientListResponse', + '2': [ + { + '1': 'clients', + '3': 1, + '4': 1, + '5': 11, + '6': '.arbiter.user_agent.SdkClientList', + '9': 0, + '10': 'clients' + }, + { + '1': 'error', + '3': 2, + '4': 1, + '5': 14, + '6': '.arbiter.user_agent.SdkClientError', + '9': 0, + '10': 'error' + }, + ], + '8': [ + {'1': 'result'}, + ], +}; + +/// Descriptor for `SdkClientListResponse`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List sdkClientListResponseDescriptor = $convert.base64Decode( + 'ChVTZGtDbGllbnRMaXN0UmVzcG9uc2USPQoHY2xpZW50cxgBIAEoCzIhLmFyYml0ZXIudXNlcl' + '9hZ2VudC5TZGtDbGllbnRMaXN0SABSB2NsaWVudHMSOgoFZXJyb3IYAiABKA4yIi5hcmJpdGVy' + 'LnVzZXJfYWdlbnQuU2RrQ2xpZW50RXJyb3JIAFIFZXJyb3JCCAoGcmVzdWx0'); + @$core.Deprecated('Use authChallengeRequestDescriptor instead') const AuthChallengeRequest$json = { '1': 'AuthChallengeRequest', @@ -224,46 +368,61 @@ final $typed_data.Uint8List bootstrapEncryptedKeyDescriptor = $convert.base64Dec 'RleHQYAiABKAxSCmNpcGhlcnRleHQSJwoPYXNzb2NpYXRlZF9kYXRhGAMgASgMUg5hc3NvY2lh' 'dGVkRGF0YQ=='); -@$core.Deprecated('Use clientConnectionRequestDescriptor instead') -const ClientConnectionRequest$json = { - '1': 'ClientConnectionRequest', +@$core.Deprecated('Use sdkClientConnectionRequestDescriptor instead') +const SdkClientConnectionRequest$json = { + '1': 'SdkClientConnectionRequest', + '2': [ + {'1': 'pubkey', '3': 1, '4': 1, '5': 12, '10': 'pubkey'}, + { + '1': 'info', + '3': 2, + '4': 1, + '5': 11, + '6': '.arbiter.client.ClientInfo', + '10': 'info' + }, + ], +}; + +/// Descriptor for `SdkClientConnectionRequest`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List sdkClientConnectionRequestDescriptor = + $convert.base64Decode( + 'ChpTZGtDbGllbnRDb25uZWN0aW9uUmVxdWVzdBIWCgZwdWJrZXkYASABKAxSBnB1YmtleRIuCg' + 'RpbmZvGAIgASgLMhouYXJiaXRlci5jbGllbnQuQ2xpZW50SW5mb1IEaW5mbw=='); + +@$core.Deprecated('Use sdkClientConnectionResponseDescriptor instead') +const SdkClientConnectionResponse$json = { + '1': 'SdkClientConnectionResponse', + '2': [ + {'1': 'approved', '3': 1, '4': 1, '5': 8, '10': 'approved'}, + {'1': 'pubkey', '3': 2, '4': 1, '5': 12, '10': 'pubkey'}, + ], +}; + +/// Descriptor for `SdkClientConnectionResponse`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List sdkClientConnectionResponseDescriptor = + $convert.base64Decode( + 'ChtTZGtDbGllbnRDb25uZWN0aW9uUmVzcG9uc2USGgoIYXBwcm92ZWQYASABKAhSCGFwcHJvdm' + 'VkEhYKBnB1YmtleRgCIAEoDFIGcHVia2V5'); + +@$core.Deprecated('Use sdkClientConnectionCancelDescriptor instead') +const SdkClientConnectionCancel$json = { + '1': 'SdkClientConnectionCancel', '2': [ {'1': 'pubkey', '3': 1, '4': 1, '5': 12, '10': 'pubkey'}, ], }; -/// Descriptor for `ClientConnectionRequest`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List clientConnectionRequestDescriptor = +/// Descriptor for `SdkClientConnectionCancel`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List sdkClientConnectionCancelDescriptor = $convert.base64Decode( - 'ChdDbGllbnRDb25uZWN0aW9uUmVxdWVzdBIWCgZwdWJrZXkYASABKAxSBnB1YmtleQ=='); - -@$core.Deprecated('Use clientConnectionResponseDescriptor instead') -const ClientConnectionResponse$json = { - '1': 'ClientConnectionResponse', - '2': [ - {'1': 'approved', '3': 1, '4': 1, '5': 8, '10': 'approved'}, - ], -}; - -/// Descriptor for `ClientConnectionResponse`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List clientConnectionResponseDescriptor = - $convert.base64Decode( - 'ChhDbGllbnRDb25uZWN0aW9uUmVzcG9uc2USGgoIYXBwcm92ZWQYASABKAhSCGFwcHJvdmVk'); - -@$core.Deprecated('Use clientConnectionCancelDescriptor instead') -const ClientConnectionCancel$json = { - '1': 'ClientConnectionCancel', -}; - -/// Descriptor for `ClientConnectionCancel`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List clientConnectionCancelDescriptor = - $convert.base64Decode('ChZDbGllbnRDb25uZWN0aW9uQ2FuY2Vs'); + 'ChlTZGtDbGllbnRDb25uZWN0aW9uQ2FuY2VsEhYKBnB1YmtleRgBIAEoDFIGcHVia2V5'); @$core.Deprecated('Use userAgentRequestDescriptor instead') const UserAgentRequest$json = { '1': 'UserAgentRequest', '2': [ - {'1': 'id', '3': 14, '4': 1, '5': 5, '10': 'id'}, + {'1': 'id', '3': 16, '4': 1, '5': 5, '10': 'id'}, { '1': 'auth_challenge_request', '3': 1, @@ -355,17 +514,35 @@ const UserAgentRequest$json = { '10': 'evmGrantList' }, { - '1': 'client_connection_response', + '1': 'sdk_client_connection_response', '3': 11, '4': 1, '5': 11, - '6': '.arbiter.user_agent.ClientConnectionResponse', + '6': '.arbiter.user_agent.SdkClientConnectionResponse', '9': 0, - '10': 'clientConnectionResponse' + '10': 'sdkClientConnectionResponse' + }, + { + '1': 'sdk_client_revoke', + '3': 13, + '4': 1, + '5': 11, + '6': '.arbiter.user_agent.SdkClientRevokeRequest', + '9': 0, + '10': 'sdkClientRevoke' + }, + { + '1': 'sdk_client_list', + '3': 14, + '4': 1, + '5': 11, + '6': '.google.protobuf.Empty', + '9': 0, + '10': 'sdkClientList' }, { '1': 'bootstrap_encrypted_key', - '3': 12, + '3': 15, '4': 1, '5': 11, '6': '.arbiter.user_agent.BootstrapEncryptedKey', @@ -380,7 +557,7 @@ const UserAgentRequest$json = { /// Descriptor for `UserAgentRequest`. Decode as a `google.protobuf.DescriptorProto`. final $typed_data.Uint8List userAgentRequestDescriptor = $convert.base64Decode( - 'ChBVc2VyQWdlbnRSZXF1ZXN0Eg4KAmlkGA4gASgFUgJpZBJgChZhdXRoX2NoYWxsZW5nZV9yZX' + 'ChBVc2VyQWdlbnRSZXF1ZXN0Eg4KAmlkGBAgASgFUgJpZBJgChZhdXRoX2NoYWxsZW5nZV9yZX' 'F1ZXN0GAEgASgLMiguYXJiaXRlci51c2VyX2FnZW50LkF1dGhDaGFsbGVuZ2VSZXF1ZXN0SABS' 'FGF1dGhDaGFsbGVuZ2VSZXF1ZXN0EmMKF2F1dGhfY2hhbGxlbmdlX3NvbHV0aW9uGAIgASgLMi' 'kuYXJiaXRlci51c2VyX2FnZW50LkF1dGhDaGFsbGVuZ2VTb2x1dGlvbkgAUhVhdXRoQ2hhbGxl' @@ -395,17 +572,20 @@ final $typed_data.Uint8List userAgentRequestDescriptor = $convert.base64Decode( 'DmV2bUdyYW50Q3JlYXRlEk4KEGV2bV9ncmFudF9kZWxldGUYCSABKAsyIi5hcmJpdGVyLmV2bS' '5Fdm1HcmFudERlbGV0ZVJlcXVlc3RIAFIOZXZtR3JhbnREZWxldGUSSAoOZXZtX2dyYW50X2xp' 'c3QYCiABKAsyIC5hcmJpdGVyLmV2bS5Fdm1HcmFudExpc3RSZXF1ZXN0SABSDGV2bUdyYW50TG' - 'lzdBJsChpjbGllbnRfY29ubmVjdGlvbl9yZXNwb25zZRgLIAEoCzIsLmFyYml0ZXIudXNlcl9h' - 'Z2VudC5DbGllbnRDb25uZWN0aW9uUmVzcG9uc2VIAFIYY2xpZW50Q29ubmVjdGlvblJlc3Bvbn' - 'NlEmMKF2Jvb3RzdHJhcF9lbmNyeXB0ZWRfa2V5GAwgASgLMikuYXJiaXRlci51c2VyX2FnZW50' - 'LkJvb3RzdHJhcEVuY3J5cHRlZEtleUgAUhVib290c3RyYXBFbmNyeXB0ZWRLZXlCCQoHcGF5bG' - '9hZA=='); + 'lzdBJ2Ch5zZGtfY2xpZW50X2Nvbm5lY3Rpb25fcmVzcG9uc2UYCyABKAsyLy5hcmJpdGVyLnVz' + 'ZXJfYWdlbnQuU2RrQ2xpZW50Q29ubmVjdGlvblJlc3BvbnNlSABSG3Nka0NsaWVudENvbm5lY3' + 'Rpb25SZXNwb25zZRJYChFzZGtfY2xpZW50X3Jldm9rZRgNIAEoCzIqLmFyYml0ZXIudXNlcl9h' + 'Z2VudC5TZGtDbGllbnRSZXZva2VSZXF1ZXN0SABSD3Nka0NsaWVudFJldm9rZRJACg9zZGtfY2' + 'xpZW50X2xpc3QYDiABKAsyFi5nb29nbGUucHJvdG9idWYuRW1wdHlIAFINc2RrQ2xpZW50TGlz' + 'dBJjChdib290c3RyYXBfZW5jcnlwdGVkX2tleRgPIAEoCzIpLmFyYml0ZXIudXNlcl9hZ2VudC' + '5Cb290c3RyYXBFbmNyeXB0ZWRLZXlIAFIVYm9vdHN0cmFwRW5jcnlwdGVkS2V5QgkKB3BheWxv' + 'YWQ='); @$core.Deprecated('Use userAgentResponseDescriptor instead') const UserAgentResponse$json = { '1': 'UserAgentResponse', '2': [ - {'1': 'id', '3': 14, '4': 1, '5': 5, '9': 1, '10': 'id', '17': true}, + {'1': 'id', '3': 16, '4': 1, '5': 5, '9': 1, '10': 'id', '17': true}, { '1': 'auth_challenge', '3': 1, @@ -497,26 +677,44 @@ const UserAgentResponse$json = { '10': 'evmGrantList' }, { - '1': 'client_connection_request', + '1': 'sdk_client_connection_request', '3': 11, '4': 1, '5': 11, - '6': '.arbiter.user_agent.ClientConnectionRequest', + '6': '.arbiter.user_agent.SdkClientConnectionRequest', '9': 0, - '10': 'clientConnectionRequest' + '10': 'sdkClientConnectionRequest' }, { - '1': 'client_connection_cancel', + '1': 'sdk_client_connection_cancel', '3': 12, '4': 1, '5': 11, - '6': '.arbiter.user_agent.ClientConnectionCancel', + '6': '.arbiter.user_agent.SdkClientConnectionCancel', '9': 0, - '10': 'clientConnectionCancel' + '10': 'sdkClientConnectionCancel' + }, + { + '1': 'sdk_client_revoke_response', + '3': 13, + '4': 1, + '5': 11, + '6': '.arbiter.user_agent.SdkClientRevokeResponse', + '9': 0, + '10': 'sdkClientRevokeResponse' + }, + { + '1': 'sdk_client_list_response', + '3': 14, + '4': 1, + '5': 11, + '6': '.arbiter.user_agent.SdkClientListResponse', + '9': 0, + '10': 'sdkClientListResponse' }, { '1': 'bootstrap_result', - '3': 13, + '3': 15, '4': 1, '5': 14, '6': '.arbiter.user_agent.BootstrapResult', @@ -532,7 +730,7 @@ const UserAgentResponse$json = { /// Descriptor for `UserAgentResponse`. Decode as a `google.protobuf.DescriptorProto`. final $typed_data.Uint8List userAgentResponseDescriptor = $convert.base64Decode( - 'ChFVc2VyQWdlbnRSZXNwb25zZRITCgJpZBgOIAEoBUgBUgJpZIgBARJKCg5hdXRoX2NoYWxsZW' + 'ChFVc2VyQWdlbnRSZXNwb25zZRITCgJpZBgQIAEoBUgBUgJpZIgBARJKCg5hdXRoX2NoYWxsZW' '5nZRgBIAEoCzIhLmFyYml0ZXIudXNlcl9hZ2VudC5BdXRoQ2hhbGxlbmdlSABSDWF1dGhDaGFs' 'bGVuZ2USQQoLYXV0aF9yZXN1bHQYAiABKA4yHi5hcmJpdGVyLnVzZXJfYWdlbnQuQXV0aFJlc3' 'VsdEgAUgphdXRoUmVzdWx0El0KFXVuc2VhbF9zdGFydF9yZXNwb25zZRgDIAEoCzInLmFyYml0' @@ -546,10 +744,14 @@ final $typed_data.Uint8List userAgentResponseDescriptor = $convert.base64Decode( '5ldm0uRXZtR3JhbnRDcmVhdGVSZXNwb25zZUgAUg5ldm1HcmFudENyZWF0ZRJPChBldm1fZ3Jh' 'bnRfZGVsZXRlGAkgASgLMiMuYXJiaXRlci5ldm0uRXZtR3JhbnREZWxldGVSZXNwb25zZUgAUg' '5ldm1HcmFudERlbGV0ZRJJCg5ldm1fZ3JhbnRfbGlzdBgKIAEoCzIhLmFyYml0ZXIuZXZtLkV2' - 'bUdyYW50TGlzdFJlc3BvbnNlSABSDGV2bUdyYW50TGlzdBJpChljbGllbnRfY29ubmVjdGlvbl' - '9yZXF1ZXN0GAsgASgLMisuYXJiaXRlci51c2VyX2FnZW50LkNsaWVudENvbm5lY3Rpb25SZXF1' - 'ZXN0SABSF2NsaWVudENvbm5lY3Rpb25SZXF1ZXN0EmYKGGNsaWVudF9jb25uZWN0aW9uX2Nhbm' - 'NlbBgMIAEoCzIqLmFyYml0ZXIudXNlcl9hZ2VudC5DbGllbnRDb25uZWN0aW9uQ2FuY2VsSABS' - 'FmNsaWVudENvbm5lY3Rpb25DYW5jZWwSUAoQYm9vdHN0cmFwX3Jlc3VsdBgNIAEoDjIjLmFyYm' - 'l0ZXIudXNlcl9hZ2VudC5Cb290c3RyYXBSZXN1bHRIAFIPYm9vdHN0cmFwUmVzdWx0QgkKB3Bh' - 'eWxvYWRCBQoDX2lk'); + 'bUdyYW50TGlzdFJlc3BvbnNlSABSDGV2bUdyYW50TGlzdBJzCh1zZGtfY2xpZW50X2Nvbm5lY3' + 'Rpb25fcmVxdWVzdBgLIAEoCzIuLmFyYml0ZXIudXNlcl9hZ2VudC5TZGtDbGllbnRDb25uZWN0' + 'aW9uUmVxdWVzdEgAUhpzZGtDbGllbnRDb25uZWN0aW9uUmVxdWVzdBJwChxzZGtfY2xpZW50X2' + 'Nvbm5lY3Rpb25fY2FuY2VsGAwgASgLMi0uYXJiaXRlci51c2VyX2FnZW50LlNka0NsaWVudENv' + 'bm5lY3Rpb25DYW5jZWxIAFIZc2RrQ2xpZW50Q29ubmVjdGlvbkNhbmNlbBJqChpzZGtfY2xpZW' + '50X3Jldm9rZV9yZXNwb25zZRgNIAEoCzIrLmFyYml0ZXIudXNlcl9hZ2VudC5TZGtDbGllbnRS' + 'ZXZva2VSZXNwb25zZUgAUhdzZGtDbGllbnRSZXZva2VSZXNwb25zZRJkChhzZGtfY2xpZW50X2' + 'xpc3RfcmVzcG9uc2UYDiABKAsyKS5hcmJpdGVyLnVzZXJfYWdlbnQuU2RrQ2xpZW50TGlzdFJl' + 'c3BvbnNlSABSFXNka0NsaWVudExpc3RSZXNwb25zZRJQChBib290c3RyYXBfcmVzdWx0GA8gAS' + 'gOMiMuYXJiaXRlci51c2VyX2FnZW50LkJvb3RzdHJhcFJlc3VsdEgAUg9ib290c3RyYXBSZXN1' + 'bHRCCQoHcGF5bG9hZEIFCgNfaWQ='); diff --git a/useragent/lib/providers/evm.dart b/useragent/lib/providers/evm/evm.dart similarity index 100% rename from useragent/lib/providers/evm.dart rename to useragent/lib/providers/evm/evm.dart diff --git a/useragent/lib/providers/evm.g.dart b/useragent/lib/providers/evm/evm.g.dart similarity index 100% rename from useragent/lib/providers/evm.g.dart rename to useragent/lib/providers/evm/evm.g.dart diff --git a/useragent/lib/providers/evm_grants.dart b/useragent/lib/providers/evm/evm_grants.dart similarity index 100% rename from useragent/lib/providers/evm_grants.dart rename to useragent/lib/providers/evm/evm_grants.dart diff --git a/useragent/lib/providers/evm_grants.freezed.dart b/useragent/lib/providers/evm/evm_grants.freezed.dart similarity index 100% rename from useragent/lib/providers/evm_grants.freezed.dart rename to useragent/lib/providers/evm/evm_grants.freezed.dart diff --git a/useragent/lib/providers/evm_grants.g.dart b/useragent/lib/providers/evm/evm_grants.g.dart similarity index 100% rename from useragent/lib/providers/evm_grants.g.dart rename to useragent/lib/providers/evm/evm_grants.g.dart diff --git a/useragent/lib/providers/sdk_clients/list.dart b/useragent/lib/providers/sdk_clients/list.dart new file mode 100644 index 0000000..507c451 --- /dev/null +++ b/useragent/lib/providers/sdk_clients/list.dart @@ -0,0 +1,34 @@ +import 'package:arbiter/proto/user_agent.pb.dart'; +import 'package:arbiter/providers/connection/connection_manager.dart'; +import 'package:protobuf/well_known_types/google/protobuf/empty.pb.dart'; +import 'package:riverpod_annotation/riverpod_annotation.dart'; + +part 'list.g.dart'; + +@riverpod +Future?> sdkClients(Ref ref) async { + final connection = await ref.watch(connectionManagerProvider.future); + if (connection == null) { + return null; + } + + final resp = await connection.request( + UserAgentRequest(sdkClientList: Empty()), + ); + + if (!resp.hasSdkClientListResponse()) { + throw Exception( + 'Expected SDK client list response, got ${resp.whichPayload()}', + ); + } + final result = resp.sdkClientListResponse; + + switch (result.whichResult()) { + case SdkClientListResponse_Result.clients: + return result.clients.clients.toList(growable: false); + case SdkClientListResponse_Result.error: + throw Exception('Error listing SDK clients: ${result.error}'); + case SdkClientListResponse_Result.notSet: + throw Exception('SDK client list response was empty.'); + } +} diff --git a/useragent/lib/providers/sdk_clients/list.g.dart b/useragent/lib/providers/sdk_clients/list.g.dart new file mode 100644 index 0000000..0a69fea --- /dev/null +++ b/useragent/lib/providers/sdk_clients/list.g.dart @@ -0,0 +1,51 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'list.dart'; + +// ************************************************************************** +// RiverpodGenerator +// ************************************************************************** + +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint, type=warning + +@ProviderFor(sdkClients) +final sdkClientsProvider = SdkClientsProvider._(); + +final class SdkClientsProvider + extends + $FunctionalProvider< + AsyncValue?>, + List?, + FutureOr?> + > + with + $FutureModifier?>, + $FutureProvider?> { + SdkClientsProvider._() + : super( + from: null, + argument: null, + retry: null, + name: r'sdkClientsProvider', + isAutoDispose: true, + dependencies: null, + $allTransitiveDependencies: null, + ); + + @override + String debugGetCreateSourceHash() => _$sdkClientsHash(); + + @$internal + @override + $FutureProviderElement?> $createElement( + $ProviderPointer pointer, + ) => $FutureProviderElement(pointer); + + @override + FutureOr?> create(Ref ref) { + return sdkClients(ref); + } +} + +String _$sdkClientsHash() => r'833c249d9cc2f83921453e0ece354a9a2d9f4482'; diff --git a/useragent/lib/router.dart b/useragent/lib/router.dart index 977b75b..c5a17f2 100644 --- a/useragent/lib/router.dart +++ b/useragent/lib/router.dart @@ -17,7 +17,7 @@ class Router extends RootStackRouter { path: '/dashboard', children: [ AutoRoute(page: EvmRoute.page, path: 'evm'), - AutoRoute(page: EvmGrantsRoute.page, path: 'grants'), + AutoRoute(page: ClientsRoute.page, path: 'clients'), AutoRoute(page: AboutRoute.page, path: 'about'), ], ), diff --git a/useragent/lib/router.gr.dart b/useragent/lib/router.gr.dart index 82c8625..3e303ab 100644 --- a/useragent/lib/router.gr.dart +++ b/useragent/lib/router.gr.dart @@ -10,11 +10,11 @@ // ignore_for_file: no_leading_underscores_for_library_prefixes import 'package:arbiter/screens/bootstrap.dart' as _i2; -import 'package:arbiter/screens/dashboard.dart' as _i4; +import 'package:arbiter/screens/dashboard.dart' as _i5; import 'package:arbiter/screens/dashboard/about.dart' as _i1; -import 'package:arbiter/screens/dashboard/evm.dart' as _i6; -import 'package:arbiter/screens/dashboard/evm_grant_create.dart' as _i3; -import 'package:arbiter/screens/dashboard/evm_grants.dart' as _i5; +import 'package:arbiter/screens/dashboard/clients/table.dart' as _i3; +import 'package:arbiter/screens/dashboard/evm/evm.dart' as _i6; +import 'package:arbiter/screens/dashboard/evm/grants/grant_create.dart' as _i4; import 'package:arbiter/screens/server_connection.dart' as _i7; import 'package:arbiter/screens/server_info_setup.dart' as _i8; import 'package:arbiter/screens/vault_setup.dart' as _i9; @@ -54,7 +54,23 @@ class Bootstrap extends _i10.PageRouteInfo { } /// generated route for -/// [_i3.CreateEvmGrantScreen] +/// [_i3.ClientsScreen] +class ClientsRoute extends _i10.PageRouteInfo { + const ClientsRoute({List<_i10.PageRouteInfo>? children}) + : super(ClientsRoute.name, initialChildren: children); + + static const String name = 'ClientsRoute'; + + static _i10.PageInfo page = _i10.PageInfo( + name, + builder: (data) { + return const _i3.ClientsScreen(); + }, + ); +} + +/// generated route for +/// [_i4.CreateEvmGrantScreen] class CreateEvmGrantRoute extends _i10.PageRouteInfo { const CreateEvmGrantRoute({List<_i10.PageRouteInfo>? children}) : super(CreateEvmGrantRoute.name, initialChildren: children); @@ -64,13 +80,13 @@ class CreateEvmGrantRoute extends _i10.PageRouteInfo { static _i10.PageInfo page = _i10.PageInfo( name, builder: (data) { - return const _i3.CreateEvmGrantScreen(); + return const _i4.CreateEvmGrantScreen(); }, ); } /// generated route for -/// [_i4.DashboardRouter] +/// [_i5.DashboardRouter] class DashboardRouter extends _i10.PageRouteInfo { const DashboardRouter({List<_i10.PageRouteInfo>? children}) : super(DashboardRouter.name, initialChildren: children); @@ -80,23 +96,7 @@ class DashboardRouter extends _i10.PageRouteInfo { static _i10.PageInfo page = _i10.PageInfo( name, builder: (data) { - return const _i4.DashboardRouter(); - }, - ); -} - -/// generated route for -/// [_i5.EvmGrantsScreen] -class EvmGrantsRoute extends _i10.PageRouteInfo { - const EvmGrantsRoute({List<_i10.PageRouteInfo>? children}) - : super(EvmGrantsRoute.name, initialChildren: children); - - static const String name = 'EvmGrantsRoute'; - - static _i10.PageInfo page = _i10.PageInfo( - name, - builder: (data) { - return const _i5.EvmGrantsScreen(); + return const _i5.DashboardRouter(); }, ); } diff --git a/useragent/lib/screens/dashboard.dart b/useragent/lib/screens/dashboard.dart index e89a8d3..a9a6156 100644 --- a/useragent/lib/screens/dashboard.dart +++ b/useragent/lib/screens/dashboard.dart @@ -5,7 +5,7 @@ import 'package:flutter_adaptive_scaffold/flutter_adaptive_scaffold.dart'; const breakpoints = MaterialAdaptiveBreakpoints(); -final routes = [const EvmRoute(), const EvmGrantsRoute(), const AboutRoute()]; +final routes = [const EvmRoute(), const ClientsRoute(), const AboutRoute()]; @RoutePage() class DashboardRouter extends StatelessWidget { @@ -35,6 +35,11 @@ class DashboardRouter extends StatelessWidget { selectedIcon: Icon(Icons.rule_folder), label: "Grants", ), + NavigationDestination( + icon: Icon(Icons.devices_other_outlined), + selectedIcon: Icon(Icons.devices_other), + label: "Clients", + ), NavigationDestination( icon: Icon(Icons.info_outline), selectedIcon: Icon(Icons.info), diff --git a/useragent/lib/screens/dashboard/clients/table.dart b/useragent/lib/screens/dashboard/clients/table.dart new file mode 100644 index 0000000..ac1e944 --- /dev/null +++ b/useragent/lib/screens/dashboard/clients/table.dart @@ -0,0 +1,585 @@ +import 'dart:math' as math; + +import 'package:arbiter/proto/user_agent.pb.dart'; +import 'package:arbiter/providers/connection/connection_manager.dart'; +import 'package:arbiter/providers/sdk_clients/list.dart'; +import 'package:auto_route/auto_route.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_hooks/flutter_hooks.dart'; +import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:sizer/sizer.dart'; + +// ─── Palette ────────────────────────────────────────────────────────────────── + +class _Palette { + static const ink = Color(0xFF15263C); + static const coral = Color(0xFFE26254); + static const cream = Color(0xFFFFFAF4); + static const line = Color(0x1A15263C); +} + +// ─── Column width getters ───────────────────────────────────────────────────── + +double get _accentStripWidth => 0.8.w; +double get _cellHPad => 1.8.w; +double get _colGap => 1.8.w; +double get _idColWidth => 8.w; +double get _nameColWidth => 20.w; +double get _versionColWidth => 12.w; +double get _registeredColWidth => 18.w; +double get _chevronColWidth => 4.w; +double get _tableMinWidth => 72.w; + +// ─── Helpers ────────────────────────────────────────────────────────────────── + +Color _accentColor(List bytes) { + final seed = bytes.fold(0, (v, b) => v + b); + final hue = (seed * 17) % 360; + return HSLColor.fromAHSL(1, hue.toDouble(), 0.68, 0.54).toColor(); +} + +// ed25519 public keys are always 32 bytes (64 hex chars); guard is defensive. +String _shortPubkey(List bytes) { + final hex = bytes.map((b) => b.toRadixString(16).padLeft(2, '0')).join(); + if (hex.length < 12) return '0x$hex'; + return '0x${hex.substring(0, 8)}...${hex.substring(hex.length - 4)}'; +} + +String _fullPubkey(List bytes) { + final hex = bytes.map((b) => b.toRadixString(16).padLeft(2, '0')).join(); + return '0x$hex'; +} + +String _formatDate(int unixSecs) { + final dt = DateTime.fromMillisecondsSinceEpoch(unixSecs * 1000).toLocal(); + return '${dt.year}-' + '${dt.month.toString().padLeft(2, '0')}-' + '${dt.day.toString().padLeft(2, '0')}'; +} + +String _formatError(Object error) { + final message = error.toString(); + if (message.startsWith('Exception: ')) { + return message.substring('Exception: '.length); + } + return message; +} + +// ─── State panel ───────────────────────────────────────────────────────────── + +class _StatePanel extends StatelessWidget { + const _StatePanel({ + required this.icon, + required this.title, + required this.body, + this.actionLabel, + this.onAction, + this.busy = false, + }); + + final IconData icon; + final String title; + final String body; + final String? actionLabel; + final Future Function()? onAction; + final bool busy; + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + return Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(24), + color: _Palette.cream.withValues(alpha: 0.92), + border: Border.all(color: _Palette.line), + ), + child: Padding( + padding: EdgeInsets.all(2.8.h), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + if (busy) + SizedBox( + width: 2.8.h, + height: 2.8.h, + child: const CircularProgressIndicator(strokeWidth: 2.5), + ) + else + Icon(icon, size: 34, color: _Palette.coral), + SizedBox(height: 1.8.h), + Text( + title, + style: theme.textTheme.headlineSmall?.copyWith( + color: _Palette.ink, + fontWeight: FontWeight.w800, + ), + ), + SizedBox(height: 1.h), + Text( + body, + style: theme.textTheme.bodyLarge?.copyWith( + color: _Palette.ink.withValues(alpha: 0.72), + height: 1.5, + ), + ), + if (actionLabel != null && onAction != null) ...[ + SizedBox(height: 2.h), + OutlinedButton.icon( + onPressed: () => onAction!(), + icon: const Icon(Icons.refresh), + label: Text(actionLabel!), + ), + ], + ], + ), + ), + ); + } +} + +// ─── Header ─────────────────────────────────────────────────────────────────── + +class _Header extends StatelessWidget { + const _Header({required this.isBusy, required this.onRefresh}); + + final bool isBusy; + final Future Function() onRefresh; + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + return Container( + padding: EdgeInsets.symmetric(horizontal: 1.6.w, vertical: 1.2.h), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(18), + color: _Palette.cream, + border: Border.all(color: _Palette.line), + ), + child: Row( + children: [ + Expanded( + child: Text( + 'SDK Clients', + style: theme.textTheme.titleMedium?.copyWith( + color: _Palette.ink, + fontWeight: FontWeight.w800, + ), + ), + ), + if (isBusy) ...[ + Text( + 'Syncing', + style: theme.textTheme.bodySmall?.copyWith( + color: _Palette.ink.withValues(alpha: 0.62), + fontWeight: FontWeight.w700, + ), + ), + SizedBox(width: 1.w), + ], + OutlinedButton.icon( + onPressed: () => onRefresh(), + style: OutlinedButton.styleFrom( + foregroundColor: _Palette.ink, + side: BorderSide(color: _Palette.line), + padding: EdgeInsets.symmetric( + horizontal: 1.4.w, + vertical: 1.2.h, + ), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(14), + ), + ), + icon: const Icon(Icons.refresh, size: 18), + label: const Text('Refresh'), + ), + ], + ), + ); + } +} + +// ─── Table header row ───────────────────────────────────────────────────────── + +class _ClientTableHeader extends StatelessWidget { + const _ClientTableHeader(); + + @override + Widget build(BuildContext context) { + final style = Theme.of(context).textTheme.labelLarge?.copyWith( + color: _Palette.ink.withValues(alpha: 0.72), + fontWeight: FontWeight.w800, + letterSpacing: 0.3, + ); + + return Container( + padding: EdgeInsets.symmetric(vertical: 1.4.h), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(16), + color: _Palette.ink.withValues(alpha: 0.04), + ), + child: Row( + children: [ + SizedBox(width: _accentStripWidth + _cellHPad), + SizedBox(width: _idColWidth, child: Text('ID', style: style)), + SizedBox(width: _colGap), + SizedBox(width: _nameColWidth, child: Text('Name', style: style)), + SizedBox(width: _colGap), + SizedBox( + width: _versionColWidth, + child: Text('Version', style: style), + ), + SizedBox(width: _colGap), + SizedBox( + width: _registeredColWidth, + child: Text('Registered', style: style), + ), + SizedBox(width: _colGap), + SizedBox(width: _chevronColWidth), + SizedBox(width: _cellHPad), + ], + ), + ); + } +} + +// ─── Table row (owns its own expand state) ──────────────────────────────────── + +class _ClientTableRow extends HookWidget { + const _ClientTableRow({required this.client}); + + final SdkClientEntry client; + + @override + Widget build(BuildContext context) { + final expanded = useState(false); + final accent = _accentColor(client.pubkey); + final theme = Theme.of(context); + final muted = _Palette.ink.withValues(alpha: 0.62); + + final name = client.info.name.isEmpty ? '—' : client.info.name; + final version = client.info.version.isEmpty ? '—' : client.info.version; + final registered = _formatDate(client.createdAt); + + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // ── Collapsed row ────────────────────────────────────────────────────── + GestureDetector( + onTap: () => expanded.value = !expanded.value, + child: Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(18), + color: accent.withValues(alpha: 0.10), + border: Border.all(color: accent.withValues(alpha: 0.28)), + ), + child: IntrinsicHeight( + child: Row( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Container( + width: _accentStripWidth, + decoration: BoxDecoration( + color: accent, + borderRadius: const BorderRadius.horizontal( + left: Radius.circular(18), + ), + ), + ), + Expanded( + child: Padding( + padding: EdgeInsets.symmetric( + horizontal: _cellHPad, + vertical: 1.4.h, + ), + child: Row( + children: [ + SizedBox( + width: _idColWidth, + child: Text( + '${client.id}', + style: theme.textTheme.bodyLarge?.copyWith( + color: _Palette.ink, + ), + ), + ), + SizedBox(width: _colGap), + SizedBox( + width: _nameColWidth, + child: Text( + name, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: theme.textTheme.bodyMedium?.copyWith( + color: _Palette.ink, + ), + ), + ), + SizedBox(width: _colGap), + SizedBox( + width: _versionColWidth, + child: Text( + version, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: theme.textTheme.bodySmall?.copyWith( + color: muted, + ), + ), + ), + SizedBox(width: _colGap), + SizedBox( + width: _registeredColWidth, + child: Text( + registered, + style: theme.textTheme.bodySmall?.copyWith( + color: muted, + ), + ), + ), + SizedBox(width: _colGap), + SizedBox( + width: _chevronColWidth, + child: Icon( + expanded.value + ? Icons.expand_more + : Icons.chevron_right, + color: muted, + ), + ), + ], + ), + ), + ), + ], + ), + ), + ), + ), + // ── Expansion panel (AnimatedSize wraps only this section) ──────────── + AnimatedSize( + duration: const Duration(milliseconds: 200), + curve: Curves.easeInOut, + child: expanded.value + ? Container( + margin: EdgeInsets.only(top: 0.6.h), + padding: EdgeInsets.symmetric( + horizontal: 1.6.w, + vertical: 1.4.h, + ), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(14), + color: accent.withValues(alpha: 0.06), + border: Border( + left: BorderSide(color: accent, width: 0.4.w), + ), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + client.info.description.isEmpty + ? 'No description provided.' + : client.info.description, + style: theme.textTheme.bodyMedium?.copyWith( + color: muted, + height: 1.5, + ), + ), + SizedBox(height: 1.h), + Row( + children: [ + Expanded( + child: Text( + _shortPubkey(client.pubkey), + style: theme.textTheme.bodySmall?.copyWith( + color: _Palette.ink, + fontFamily: 'monospace', + ), + ), + ), + IconButton( + icon: const Icon(Icons.copy_rounded, size: 18), + color: muted, + onPressed: () async { + await Clipboard.setData( + ClipboardData( + text: _fullPubkey(client.pubkey), + ), + ); + if (!context.mounted) return; + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar( + content: Text('Public key copied.'), + behavior: SnackBarBehavior.floating, + ), + ); + }, + ), + ], + ), + ], + ), + ) + : const SizedBox.shrink(), + ), + ], + ); + } +} + +// ─── Table container ────────────────────────────────────────────────────────── + +class _ClientTable extends StatelessWidget { + const _ClientTable({required this.clients}); + + final List clients; + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + return Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(24), + color: _Palette.cream.withValues(alpha: 0.92), + border: Border.all(color: _Palette.line), + ), + child: Padding( + padding: EdgeInsets.all(2.h), + child: LayoutBuilder( + builder: (context, constraints) { + final tableWidth = math.max(_tableMinWidth, constraints.maxWidth); + + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'Registered clients', + style: theme.textTheme.titleLarge?.copyWith( + color: _Palette.ink, + fontWeight: FontWeight.w800, + ), + ), + SizedBox(height: 0.6.h), + Text( + 'Every entry here has authenticated with Arbiter at least once.', + style: theme.textTheme.bodyMedium?.copyWith( + color: _Palette.ink.withValues(alpha: 0.70), + height: 1.4, + ), + ), + SizedBox(height: 1.6.h), + SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: SizedBox( + width: tableWidth, + child: Column( + children: [ + const _ClientTableHeader(), + SizedBox(height: 1.h), + for (var i = 0; i < clients.length; i++) + Padding( + padding: EdgeInsets.only( + bottom: i == clients.length - 1 ? 0 : 1.h, + ), + child: _ClientTableRow(client: clients[i]), + ), + ], + ), + ), + ), + ], + ); + }, + ), + ), + ); + } +} + +// ─── Screen ─────────────────────────────────────────────────────────────────── + +@RoutePage() +class ClientsScreen extends HookConsumerWidget { + const ClientsScreen({super.key}); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final clientsAsync = ref.watch(sdkClientsProvider); + final isConnected = + ref.watch(connectionManagerProvider).asData?.value != null; + + void showMessage(String message) { + if (!context.mounted) return; + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text(message), behavior: SnackBarBehavior.floating), + ); + } + + Future refresh() async { + try { + final future = ref.refresh(sdkClientsProvider.future); + await future; + } catch (error) { + showMessage(_formatError(error)); + } + } + + final clients = clientsAsync.asData?.value; + + final content = switch (clientsAsync) { + AsyncLoading() when clients == null => const _StatePanel( + icon: Icons.hourglass_top, + title: 'Loading clients', + body: 'Pulling client registry from Arbiter.', + busy: true, + ), + AsyncError(:final error) => _StatePanel( + icon: Icons.sync_problem, + title: 'Client registry unavailable', + body: _formatError(error), + actionLabel: 'Retry', + onAction: refresh, + ), + _ when !isConnected => _StatePanel( + icon: Icons.portable_wifi_off, + title: 'No active server connection', + body: 'Reconnect to Arbiter to list SDK clients.', + actionLabel: 'Refresh', + onAction: refresh, + ), + _ when clients != null && clients.isEmpty => _StatePanel( + icon: Icons.devices_other_outlined, + title: 'No clients yet', + body: 'SDK clients appear here once they register with Arbiter.', + actionLabel: 'Refresh', + onAction: refresh, + ), + _ => _ClientTable(clients: clients ?? const []), + }; + + return Scaffold( + body: SafeArea( + child: RefreshIndicator.adaptive( + color: _Palette.ink, + backgroundColor: Colors.white, + onRefresh: refresh, + child: ListView( + physics: const BouncingScrollPhysics( + parent: AlwaysScrollableScrollPhysics(), + ), + padding: EdgeInsets.fromLTRB(2.4.w, 2.4.h, 2.4.w, 3.2.h), + children: [ + _Header(isBusy: clientsAsync.isLoading, onRefresh: refresh), + SizedBox(height: 1.8.h), + content, + ], + ), + ), + ), + ); + } +} diff --git a/useragent/lib/screens/dashboard/evm.dart b/useragent/lib/screens/dashboard/evm/evm.dart similarity index 99% rename from useragent/lib/screens/dashboard/evm.dart rename to useragent/lib/screens/dashboard/evm/evm.dart index 8565e0a..f6967d0 100644 --- a/useragent/lib/screens/dashboard/evm.dart +++ b/useragent/lib/screens/dashboard/evm/evm.dart @@ -2,7 +2,7 @@ import 'dart:math' as math; import 'package:arbiter/proto/evm.pb.dart'; import 'package:arbiter/providers/connection/connection_manager.dart'; -import 'package:arbiter/providers/evm.dart'; +import 'package:arbiter/providers/evm/evm.dart'; import 'package:auto_route/auto_route.dart'; import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; diff --git a/useragent/lib/screens/dashboard/evm_grant_create.dart b/useragent/lib/screens/dashboard/evm/grants/grant_create.dart similarity index 99% rename from useragent/lib/screens/dashboard/evm_grant_create.dart rename to useragent/lib/screens/dashboard/evm/grants/grant_create.dart index 51cad20..4cb27a4 100644 --- a/useragent/lib/screens/dashboard/evm_grant_create.dart +++ b/useragent/lib/screens/dashboard/evm/grants/grant_create.dart @@ -1,6 +1,6 @@ import 'package:arbiter/proto/evm.pb.dart'; -import 'package:arbiter/providers/evm.dart'; -import 'package:arbiter/providers/evm_grants.dart'; +import 'package:arbiter/providers/evm/evm.dart'; +import 'package:arbiter/providers/evm/evm_grants.dart'; import 'package:auto_route/auto_route.dart'; import 'package:fixnum/fixnum.dart'; import 'package:flutter/material.dart'; diff --git a/useragent/lib/screens/dashboard/evm_grants.dart b/useragent/lib/screens/dashboard/evm_grants.dart deleted file mode 100644 index 79710c3..0000000 --- a/useragent/lib/screens/dashboard/evm_grants.dart +++ /dev/null @@ -1,1007 +0,0 @@ -import 'dart:math' as math; - -import 'package:arbiter/proto/evm.pb.dart'; -import 'package:arbiter/providers/connection/connection_manager.dart'; -import 'package:arbiter/providers/evm.dart'; -import 'package:arbiter/providers/evm_grants.dart'; -import 'package:arbiter/router.gr.dart'; -import 'package:arbiter/widgets/bottom_popup.dart'; -import 'package:auto_route/auto_route.dart'; -import 'package:flutter/material.dart'; -import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:hooks_riverpod/experimental/mutation.dart'; -import 'package:sizer/sizer.dart'; - -@RoutePage() -class EvmGrantsScreen extends ConsumerWidget { - const EvmGrantsScreen({super.key}); - - @override - Widget build(BuildContext context, WidgetRef ref) { - final grantsAsync = ref.watch(evmGrantsProvider); - final grantsState = grantsAsync.asData?.value; - final wallets = ref.watch(evmProvider).asData?.value ?? const []; - final revokeMutation = ref.watch(revokeEvmGrantMutation); - final isConnected = - ref.watch(connectionManagerProvider).asData?.value != null; - - Future refresh() async { - try { - await ref.read(evmGrantsProvider.notifier).refresh(); - } catch (error) { - if (!context.mounted) { - return; - } - _showMessage(context, _formatError(error)); - } - } - - Future revokeGrant(GrantEntry grant) async { - try { - await executeRevokeEvmGrant(ref, grantId: grant.id); - if (context.mounted) { - Navigator.of(context).pop(); - _showMessage(context, 'Grant revoked.'); - } - } catch (error) { - if (!context.mounted) { - return; - } - _showMessage(context, _formatError(error)); - } - } - - Future openCreate() async { - await context.router.push(const CreateEvmGrantRoute()); - } - - final content = switch (grantsAsync) { - AsyncLoading() when grantsState == null => const _GrantStatePanel( - icon: Icons.hourglass_top, - title: 'Loading grants', - body: 'Pulling EVM grants and wallet context from Arbiter.', - busy: true, - ), - AsyncError(:final error) => _GrantStatePanel( - icon: Icons.sync_problem, - title: 'Grant registry unavailable', - body: _formatError(error), - actionLabel: 'Retry', - onAction: refresh, - ), - _ when !isConnected => _GrantStatePanel( - icon: Icons.portable_wifi_off, - title: 'No active server connection', - body: 'Reconnect to Arbiter to inspect or create EVM grants.', - actionLabel: 'Refresh', - onAction: refresh, - ), - _ when grantsState == null => const SizedBox.shrink(), - _ when grantsState.grants.isEmpty => _GrantStatePanel( - icon: Icons.rule_folder_outlined, - title: 'No grants yet', - body: - 'Create the first grant to authorize scoped transaction signing for a client.', - actionLabel: 'Create grant', - onAction: openCreate, - ), - _ => _GrantGrid( - state: grantsState, - wallets: wallets, - onGrantTap: (grant) { - return showBottomPopup( - context: context, - builder: (popupContext) => _GrantDetailSheet( - grant: grant, - wallets: wallets, - isRevoking: revokeMutation is MutationPending, - onRevoke: () => revokeGrant(grant), - ), - ); - }, - ), - }; - - return Scaffold( - body: SafeArea( - child: RefreshIndicator.adaptive( - color: _GrantPalette.ink, - backgroundColor: Colors.white, - onRefresh: refresh, - child: ListView( - physics: const BouncingScrollPhysics( - parent: AlwaysScrollableScrollPhysics(), - ), - padding: EdgeInsets.fromLTRB(2.4.w, 2.4.h, 2.4.w, 3.2.h), - children: [ - _GrantHeader( - state: grantsState, - isRefreshing: grantsAsync.isLoading, - onRefresh: refresh, - onCreate: openCreate, - onToggleShowRevoked: (value) { - ref.read(evmGrantsProvider.notifier).toggleShowRevoked(value); - if (value) { - _showMessage( - context, - 'Revoked grant history is waiting on backend support. Active grants only for now.', - ); - } - }, - ), - if (grantsState?.showRevoked == true) - Padding( - padding: EdgeInsets.only(top: 1.4.h), - child: const _RevokedSupportBanner(), - ), - SizedBox(height: 1.8.h), - content, - ], - ), - ), - ), - ); - } -} - -class _GrantPalette { - static const ink = Color(0xFF17324A); - static const sea = Color(0xFF0F766E); - static const gold = Color(0xFFE19A2A); - static const coral = Color(0xFFE46B56); - static const mist = Color(0xFFF7F8FB); - static const line = Color(0x1A17324A); -} - -class _GrantHeader extends StatelessWidget { - const _GrantHeader({ - required this.state, - required this.isRefreshing, - required this.onRefresh, - required this.onCreate, - required this.onToggleShowRevoked, - }); - - final EvmGrantsState? state; - final bool isRefreshing; - final Future Function() onRefresh; - final Future Function() onCreate; - final ValueChanged onToggleShowRevoked; - - @override - Widget build(BuildContext context) { - final theme = Theme.of(context); - final menuValue = state?.showRevoked ?? false; - - return Container( - padding: EdgeInsets.symmetric(horizontal: 1.8.w, vertical: 1.4.h), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(22), - gradient: const LinearGradient( - colors: [Color(0xFFF6F8FC), Color(0xFFFDF7EF)], - begin: Alignment.topLeft, - end: Alignment.bottomRight, - ), - border: Border.all(color: _GrantPalette.line), - ), - child: Row( - children: [ - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - 'EVM Grants', - style: theme.textTheme.titleLarge?.copyWith( - color: _GrantPalette.ink, - fontWeight: FontWeight.w800, - ), - ), - SizedBox(height: 0.4.h), - Text( - 'Browse active permissions, inspect policy details, and create new grants.', - style: theme.textTheme.bodyMedium?.copyWith( - color: _GrantPalette.ink.withValues(alpha: 0.70), - height: 1.35, - ), - ), - ], - ), - ), - IconButton.filledTonal( - tooltip: 'Filters', - onPressed: () async { - final button = context.findRenderObject() as RenderBox?; - final overlay = - Overlay.of(context).context.findRenderObject() as RenderBox?; - if (button == null || overlay == null) { - return; - } - final selected = await showMenu( - context: context, - position: RelativeRect.fromRect( - Rect.fromPoints( - button.localToGlobal(Offset.zero, ancestor: overlay), - button.localToGlobal( - button.size.bottomRight(Offset.zero), - ancestor: overlay, - ), - ), - Offset.zero & overlay.size, - ), - items: [ - CheckedPopupMenuItem( - value: !menuValue, - checked: menuValue, - child: Text( - menuValue ? 'Hide revoked grants' : 'Show revoked grants', - ), - ), - ], - ); - if (selected != null) { - onToggleShowRevoked(selected); - } - }, - icon: const Icon(Icons.filter_list_rounded), - ), - SizedBox(width: 0.8.w), - OutlinedButton.icon( - onPressed: isRefreshing ? null : () => onRefresh(), - icon: isRefreshing - ? SizedBox( - width: 1.8.h, - height: 1.8.h, - child: const CircularProgressIndicator(strokeWidth: 2.2), - ) - : const Icon(Icons.refresh_rounded, size: 18), - label: const Text('Refresh'), - ), - SizedBox(width: 0.8.w), - FilledButton.icon( - onPressed: () => onCreate(), - style: FilledButton.styleFrom( - backgroundColor: _GrantPalette.ink, - foregroundColor: Colors.white, - ), - icon: const Icon(Icons.add_rounded, size: 18), - label: const Text('Create'), - ), - ], - ), - ); - } -} - -class _RevokedSupportBanner extends StatelessWidget { - const _RevokedSupportBanner(); - - @override - Widget build(BuildContext context) { - return Container( - padding: EdgeInsets.all(1.6.h), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(18), - color: _GrantPalette.gold.withValues(alpha: 0.12), - border: Border.all(color: _GrantPalette.gold.withValues(alpha: 0.28)), - ), - child: Row( - children: [ - Icon(Icons.info_outline_rounded, color: _GrantPalette.gold), - SizedBox(width: 1.2.w), - Expanded( - child: Text( - 'Revoked grant history is not exposed by the current backend yet. This screen still shows active grants only.', - style: Theme.of(context).textTheme.bodyMedium?.copyWith( - color: _GrantPalette.ink.withValues(alpha: 0.78), - height: 1.35, - ), - ), - ), - ], - ), - ); - } -} - -class _GrantGrid extends StatelessWidget { - const _GrantGrid({ - required this.state, - required this.wallets, - required this.onGrantTap, - }); - - final EvmGrantsState state; - final List wallets; - final Future Function(GrantEntry grant) onGrantTap; - - @override - Widget build(BuildContext context) { - final grantsByWallet = >{}; - for (final grant in state.grants) { - grantsByWallet.putIfAbsent(grant.shared.walletId, () => []).add(grant); - } - - final walletIds = grantsByWallet.keys.toList()..sort(); - - return Column( - children: [ - for (final walletId in walletIds) - Padding( - padding: EdgeInsets.only(bottom: 1.8.h), - child: _WalletGrantSection( - walletId: walletId, - walletAddress: _addressForWalletId(wallets, walletId), - grants: grantsByWallet[walletId]!, - onGrantTap: onGrantTap, - ), - ), - ], - ); - } -} - -class _WalletGrantSection extends StatelessWidget { - const _WalletGrantSection({ - required this.walletId, - required this.walletAddress, - required this.grants, - required this.onGrantTap, - }); - - final int walletId; - final List? walletAddress; - final List grants; - final Future Function(GrantEntry grant) onGrantTap; - - @override - Widget build(BuildContext context) { - final theme = Theme.of(context); - - return Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(24), - color: _GrantPalette.mist, - border: Border.all(color: _GrantPalette.line), - ), - padding: EdgeInsets.all(2.h), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - 'Wallet ${walletId.toString().padLeft(2, '0')}', - style: theme.textTheme.titleMedium?.copyWith( - color: _GrantPalette.ink, - fontWeight: FontWeight.w800, - ), - ), - SizedBox(height: 0.4.h), - Text( - walletAddress == null - ? 'Wallet address unavailable in the current API.' - : _hexAddress(walletAddress!), - style: theme.textTheme.bodySmall?.copyWith( - color: _GrantPalette.ink.withValues(alpha: 0.70), - ), - ), - SizedBox(height: 1.8.h), - LayoutBuilder( - builder: (context, constraints) { - final maxWidth = constraints.maxWidth; - final cardWidth = maxWidth >= 900 - ? (maxWidth - 2.w * 2) / 3 - : maxWidth >= 620 - ? (maxWidth - 2.w) / 2 - : maxWidth; - return Wrap( - spacing: 1.4.w, - runSpacing: 1.4.h, - children: [ - for (final grant in grants) - SizedBox( - width: math.max(280, cardWidth), - child: _GrantCardRouter( - grant: grant, - walletAddress: walletAddress, - onTap: () => onGrantTap(grant), - ), - ), - ], - ); - }, - ), - ], - ), - ); - } -} - -class _GrantCardRouter extends StatelessWidget { - const _GrantCardRouter({ - required this.grant, - required this.walletAddress, - required this.onTap, - }); - - final GrantEntry grant; - final List? walletAddress; - final VoidCallback onTap; - - @override - Widget build(BuildContext context) { - return switch (grant.specific.whichGrant()) { - SpecificGrant_Grant.etherTransfer => _EtherGrantCard( - grant: grant, - walletAddress: walletAddress, - onTap: onTap, - ), - SpecificGrant_Grant.tokenTransfer => _TokenGrantCard( - grant: grant, - walletAddress: walletAddress, - onTap: onTap, - ), - _ => _UnsupportedGrantCard(grant: grant, onTap: onTap), - }; - } -} - -class _GrantCardFrame extends StatelessWidget { - const _GrantCardFrame({ - required this.icon, - required this.iconColor, - required this.title, - required this.subtitle, - required this.chips, - required this.onTap, - }); - - final IconData icon; - final Color iconColor; - final String title; - final String subtitle; - final List chips; - final VoidCallback onTap; - - @override - Widget build(BuildContext context) { - final theme = Theme.of(context); - - return Material( - color: Colors.white, - borderRadius: BorderRadius.circular(22), - child: InkWell( - onTap: onTap, - borderRadius: BorderRadius.circular(22), - child: Ink( - padding: EdgeInsets.all(2.h), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(22), - border: Border.all(color: _GrantPalette.line), - boxShadow: [ - BoxShadow( - color: _GrantPalette.ink.withValues(alpha: 0.05), - blurRadius: 24, - offset: const Offset(0, 12), - ), - ], - ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Align( - child: Container( - width: 6.2.h, - height: 6.2.h, - decoration: BoxDecoration( - shape: BoxShape.circle, - color: iconColor.withValues(alpha: 0.14), - ), - child: Icon(icon, color: iconColor, size: 3.h), - ), - ), - SizedBox(height: 1.6.h), - Text( - title, - style: theme.textTheme.titleMedium?.copyWith( - color: _GrantPalette.ink, - fontWeight: FontWeight.w800, - ), - ), - SizedBox(height: 0.5.h), - Text( - subtitle, - style: theme.textTheme.bodyMedium?.copyWith( - color: _GrantPalette.ink.withValues(alpha: 0.72), - height: 1.35, - ), - ), - SizedBox(height: 1.4.h), - Wrap( - spacing: 0.8.w, - runSpacing: 0.8.h, - children: [ - for (final chip in chips) _GrantChip(label: chip), - ], - ), - ], - ), - ), - ), - ); - } -} - -class _EtherGrantCard extends StatelessWidget { - const _EtherGrantCard({ - required this.grant, - required this.walletAddress, - required this.onTap, - }); - - final GrantEntry grant; - final List? walletAddress; - final VoidCallback onTap; - - @override - Widget build(BuildContext context) { - final settings = grant.specific.etherTransfer; - final targets = settings.targets.length; - final subtitle = targets == 0 - ? 'ETH transfers with a shared limit profile.' - : '$targets target${targets == 1 ? '' : 's'} authorized.'; - - return _GrantCardFrame( - icon: Icons.bolt_rounded, - iconColor: _GrantPalette.gold, - title: 'Ether Transfer', - subtitle: subtitle, - chips: [ - 'Client ${grant.clientId}', - 'Wallet ${grant.shared.walletId}', - if (walletAddress != null) _shortAddress(walletAddress!), - ], - onTap: onTap, - ); - } -} - -class _TokenGrantCard extends StatelessWidget { - const _TokenGrantCard({ - required this.grant, - required this.walletAddress, - required this.onTap, - }); - - final GrantEntry grant; - final List? walletAddress; - final VoidCallback onTap; - - @override - Widget build(BuildContext context) { - final settings = grant.specific.tokenTransfer; - - return _GrantCardFrame( - icon: Icons.token_rounded, - iconColor: _GrantPalette.sea, - title: 'Token Transfer', - subtitle: - 'Contract ${_shortAddress(settings.tokenContract)} with ${settings.volumeLimits.length} volume rule${settings.volumeLimits.length == 1 ? '' : 's'}.', - chips: [ - 'Client ${grant.clientId}', - 'Wallet ${grant.shared.walletId}', - if (walletAddress != null) _shortAddress(walletAddress!), - ], - onTap: onTap, - ); - } -} - -class _UnsupportedGrantCard extends StatelessWidget { - const _UnsupportedGrantCard({required this.grant, required this.onTap}); - - final GrantEntry grant; - final VoidCallback onTap; - - @override - Widget build(BuildContext context) { - return _GrantCardFrame( - icon: Icons.help_outline_rounded, - iconColor: _GrantPalette.coral, - title: 'Unsupported Grant', - subtitle: 'This grant type cannot be rendered in the current useragent.', - chips: ['Grant ${grant.id}'], - onTap: onTap, - ); - } -} - -class _GrantChip extends StatelessWidget { - const _GrantChip({required this.label}); - - final String label; - - @override - Widget build(BuildContext context) { - return Container( - padding: EdgeInsets.symmetric(horizontal: 1.1.w, vertical: 0.7.h), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(999), - color: _GrantPalette.ink.withValues(alpha: 0.06), - ), - child: Text( - label, - style: Theme.of(context).textTheme.labelMedium?.copyWith( - color: _GrantPalette.ink.withValues(alpha: 0.76), - fontWeight: FontWeight.w700, - ), - ), - ); - } -} - -class _GrantDetailSheet extends StatelessWidget { - const _GrantDetailSheet({ - required this.grant, - required this.wallets, - required this.isRevoking, - required this.onRevoke, - }); - - final GrantEntry grant; - final List wallets; - final bool isRevoking; - final Future Function() onRevoke; - - @override - Widget build(BuildContext context) { - final walletAddress = _addressForWalletId(wallets, grant.shared.walletId); - - return Container( - width: 100.w, - constraints: BoxConstraints(maxWidth: 760), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(28), - color: Colors.white, - ), - padding: EdgeInsets.all(2.2.h), - child: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - children: [ - Expanded( - child: Text( - 'Grant #${grant.id}', - style: Theme.of(context).textTheme.headlineSmall?.copyWith( - color: _GrantPalette.ink, - fontWeight: FontWeight.w800, - ), - ), - ), - IconButton( - onPressed: () => Navigator.of(context).pop(), - icon: const Icon(Icons.close_rounded), - ), - ], - ), - SizedBox(height: 1.2.h), - Wrap( - spacing: 1.w, - runSpacing: 0.8.h, - children: [ - _GrantChip(label: 'Client ${grant.clientId}'), - _GrantChip(label: 'Wallet ${grant.shared.walletId}'), - if (walletAddress != null) _GrantChip(label: _shortAddress(walletAddress)), - ], - ), - SizedBox(height: 2.h), - _SectionTitle(title: 'Shared policy'), - _FieldSummary(label: 'Chain ID', value: grant.shared.chainId.toString()), - _FieldSummary( - label: 'Validity', - value: _validitySummary(grant.shared), - ), - _FieldSummary( - label: 'Gas fee cap', - value: _optionalBigInt(grant.shared.maxGasFeePerGas), - ), - _FieldSummary( - label: 'Priority fee cap', - value: _optionalBigInt(grant.shared.maxPriorityFeePerGas), - ), - _FieldSummary( - label: 'Tx count limit', - value: grant.shared.hasRateLimit() - ? '${grant.shared.rateLimit.count} tx / ${grant.shared.rateLimit.windowSecs}s' - : 'Not set', - ), - SizedBox(height: 1.8.h), - _SectionTitle(title: 'Grant-specific settings'), - switch (grant.specific.whichGrant()) { - SpecificGrant_Grant.etherTransfer => _EtherGrantDetails( - settings: grant.specific.etherTransfer, - ), - SpecificGrant_Grant.tokenTransfer => _TokenGrantDetails( - settings: grant.specific.tokenTransfer, - ), - _ => const Text('Unsupported grant type'), - }, - SizedBox(height: 2.2.h), - Align( - alignment: Alignment.centerRight, - child: FilledButton.icon( - onPressed: isRevoking ? null : () => onRevoke(), - style: FilledButton.styleFrom( - backgroundColor: _GrantPalette.coral, - foregroundColor: Colors.white, - ), - icon: isRevoking - ? SizedBox( - width: 1.8.h, - height: 1.8.h, - child: const CircularProgressIndicator(strokeWidth: 2.2), - ) - : const Icon(Icons.block_rounded), - label: Text(isRevoking ? 'Revoking...' : 'Revoke grant'), - ), - ), - ], - ), - ); - } -} - -class _EtherGrantDetails extends StatelessWidget { - const _EtherGrantDetails({required this.settings}); - - final EtherTransferSettings settings; - - @override - Widget build(BuildContext context) { - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - _FieldSummary( - label: 'Targets', - value: settings.targets.isEmpty - ? 'No explicit target restriction' - : settings.targets.map(_hexAddress).join(', '), - ), - _FieldSummary( - label: 'Volume limit', - value: settings.hasLimit() - ? '${_optionalBigInt(settings.limit.maxVolume)} / ${settings.limit.windowSecs}s' - : 'Not set', - ), - ], - ); - } -} - -class _TokenGrantDetails extends StatelessWidget { - const _TokenGrantDetails({required this.settings}); - - final TokenTransferSettings settings; - - @override - Widget build(BuildContext context) { - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - _FieldSummary( - label: 'Token contract', - value: _hexAddress(settings.tokenContract), - ), - _FieldSummary( - label: 'Recipient', - value: settings.hasTarget() ? _hexAddress(settings.target) : 'Any recipient', - ), - _FieldSummary( - label: 'Volume rules', - value: settings.volumeLimits.isEmpty - ? 'Not set' - : settings.volumeLimits - .map( - (limit) => - '${_optionalBigInt(limit.maxVolume)} / ${limit.windowSecs}s', - ) - .join('\n'), - ), - ], - ); - } -} - -class _FieldSummary extends StatelessWidget { - const _FieldSummary({required this.label, required this.value}); - - final String label; - final String value; - - @override - Widget build(BuildContext context) { - return Padding( - padding: EdgeInsets.only(bottom: 1.h), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - label, - style: Theme.of(context).textTheme.labelLarge?.copyWith( - color: _GrantPalette.ink.withValues(alpha: 0.60), - fontWeight: FontWeight.w800, - ), - ), - SizedBox(height: 0.3.h), - Text( - value, - style: Theme.of(context).textTheme.bodyMedium?.copyWith( - color: _GrantPalette.ink, - height: 1.4, - ), - ), - ], - ), - ); - } -} - -class _SectionTitle extends StatelessWidget { - const _SectionTitle({required this.title}); - - final String title; - - @override - Widget build(BuildContext context) { - return Padding( - padding: EdgeInsets.only(bottom: 1.1.h), - child: Text( - title, - style: Theme.of(context).textTheme.titleMedium?.copyWith( - color: _GrantPalette.ink, - fontWeight: FontWeight.w800, - ), - ), - ); - } -} - -class _GrantStatePanel extends StatelessWidget { - const _GrantStatePanel({ - required this.icon, - required this.title, - required this.body, - this.actionLabel, - this.onAction, - this.busy = false, - }); - - final IconData icon; - final String title; - final String body; - final String? actionLabel; - final Future Function()? onAction; - final bool busy; - - @override - Widget build(BuildContext context) { - return Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(24), - color: _GrantPalette.mist, - border: Border.all(color: _GrantPalette.line), - ), - child: Padding( - padding: EdgeInsets.all(2.8.h), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - if (busy) - SizedBox( - width: 2.8.h, - height: 2.8.h, - child: const CircularProgressIndicator(strokeWidth: 2.5), - ) - else - Icon(icon, size: 34, color: _GrantPalette.coral), - SizedBox(height: 1.8.h), - Text( - title, - style: Theme.of(context).textTheme.headlineSmall?.copyWith( - color: _GrantPalette.ink, - fontWeight: FontWeight.w800, - ), - ), - SizedBox(height: 1.h), - Text( - body, - style: Theme.of(context).textTheme.bodyLarge?.copyWith( - color: _GrantPalette.ink.withValues(alpha: 0.72), - height: 1.5, - ), - ), - if (actionLabel != null && onAction != null) ...[ - SizedBox(height: 2.h), - OutlinedButton.icon( - onPressed: () => onAction!(), - icon: const Icon(Icons.refresh), - label: Text(actionLabel!), - ), - ], - ], - ), - ), - ); - } -} - -List? _addressForWalletId(List wallets, int walletId) { - final index = walletId - 1; - if (index < 0 || index >= wallets.length) { - return null; - } - return wallets[index].address; -} - -String _shortAddress(List bytes) { - final value = _hexAddress(bytes); - if (value.length <= 14) { - return value; - } - return '${value.substring(0, 8)}...${value.substring(value.length - 4)}'; -} - -String _hexAddress(List bytes) { - final hex = bytes - .map((byte) => byte.toRadixString(16).padLeft(2, '0')) - .join(); - return '0x$hex'; -} - -String _optionalBigInt(List bytes) { - if (bytes.isEmpty) { - return 'Not set'; - } - return _bytesToBigInt(bytes).toString(); -} - -String _validitySummary(SharedSettings shared) { - final from = shared.hasValidFrom() - ? DateTime.fromMillisecondsSinceEpoch( - shared.validFrom.seconds.toInt() * 1000, - isUtc: true, - ).toLocal().toString() - : 'Immediate'; - final until = shared.hasValidUntil() - ? DateTime.fromMillisecondsSinceEpoch( - shared.validUntil.seconds.toInt() * 1000, - isUtc: true, - ).toLocal().toString() - : 'Open-ended'; - return '$from -> $until'; -} - -BigInt _bytesToBigInt(List bytes) { - return bytes.fold( - BigInt.zero, - (value, byte) => (value << 8) | BigInt.from(byte), - ); -} - -void _showMessage(BuildContext context, String message) { - if (!context.mounted) { - return; - } - ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text(message), behavior: SnackBarBehavior.floating), - ); -} - -String _formatError(Object error) { - final message = error.toString(); - if (message.startsWith('Exception: ')) { - return message.substring('Exception: '.length); - } - return message; -}