From bbf8a8019c388e00362356e7c7329b5e40142bba Mon Sep 17 00:00:00 2001 From: hdbg Date: Wed, 25 Mar 2026 15:26:00 +0100 Subject: [PATCH] feat(evm): add wallet access grant/revoke functionality --- protobufs/user_agent.proto | 10 +- .../arbiter-server/src/actors/evm/mod.rs | 4 +- .../src/actors/user_agent/mod.rs | 5 + .../src/actors/user_agent/session.rs | 8 +- .../actors/user_agent/session/connection.rs | 93 ++++- server/crates/arbiter-server/src/db/models.rs | 6 + .../arbiter-server/src/grpc/user_agent.rs | 68 +++- .../src/grpc/user_agent/inbound.rs | 17 + .../src/grpc/user_agent/outbound.rs | 34 +- .../arbiter-server/tests/user_agent/unseal.rs | 6 +- .../features/callouts/callout_manager.g.dart | 2 +- useragent/lib/proto/evm.pb.dart | 22 +- useragent/lib/proto/evm.pbjson.dart | 8 +- useragent/lib/proto/user_agent.pb.dart | 372 ++++++++++++++++-- useragent/lib/proto/user_agent.pbjson.dart | 137 ++++++- .../connection/connection_manager.g.dart | 2 +- .../providers/sdk_clients/wallet_access.dart | 25 ++ .../sdk_clients/wallet_access.g.dart | 51 +++ useragent/lib/router.gr.dart | 153 ++++--- .../screens/dashboard/clients/details.dart | 17 + 20 files changed, 893 insertions(+), 147 deletions(-) create mode 100644 useragent/lib/providers/sdk_clients/wallet_access.dart create mode 100644 useragent/lib/providers/sdk_clients/wallet_access.g.dart create mode 100644 useragent/lib/screens/dashboard/clients/details.dart diff --git a/protobufs/user_agent.proto b/protobufs/user_agent.proto index d2a697e..edcbbbf 100644 --- a/protobufs/user_agent.proto +++ b/protobufs/user_agent.proto @@ -145,6 +145,10 @@ message SdkClientRevokeWalletAccess { repeated SdkClientWalletAccess accesses = 1; } +message ListWalletAccessResponse { + repeated SdkClientWalletAccess accesses = 1; +} + message UserAgentRequest { int32 id = 16; oneof payload { @@ -162,8 +166,9 @@ message UserAgentRequest { SdkClientRevokeRequest sdk_client_revoke = 12; google.protobuf.Empty sdk_client_list = 13; BootstrapEncryptedKey bootstrap_encrypted_key = 14; - SdkClientGrantWalletAccess grant_wallet_access_list = 15; - SdkClientRevokeWalletAccess revoke_wallet_access_list = 17; + SdkClientGrantWalletAccess grant_wallet_access = 15; + SdkClientRevokeWalletAccess revoke_wallet_access = 17; + google.protobuf.Empty list_wallet_access = 18; } } message UserAgentResponse { @@ -184,5 +189,6 @@ message UserAgentResponse { SdkClientRevokeResponse sdk_client_revoke_response = 13; SdkClientListResponse sdk_client_list_response = 14; BootstrapResult bootstrap_result = 15; + ListWalletAccessResponse list_wallet_access_response = 17; } } diff --git a/server/crates/arbiter-server/src/actors/evm/mod.rs b/server/crates/arbiter-server/src/actors/evm/mod.rs index c875b18..c44da1a 100644 --- a/server/crates/arbiter-server/src/actors/evm/mod.rs +++ b/server/crates/arbiter-server/src/actors/evm/mod.rs @@ -130,7 +130,7 @@ impl EvmActor { } #[message] - pub async fn list_wallets(&self) -> Result, Error> { + pub async fn list_wallets(&self) -> Result, Error> { let mut conn = self.db.get().await?; let rows: Vec = schema::evm_wallet::table .select(models::EvmWallet::as_select()) @@ -139,7 +139,7 @@ impl EvmActor { Ok(rows .into_iter() - .map(|w| Address::from_slice(&w.address)) + .map(|w| (w.id, Address::from_slice(&w.address))) .collect()) } } diff --git a/server/crates/arbiter-server/src/actors/user_agent/mod.rs b/server/crates/arbiter-server/src/actors/user_agent/mod.rs index 3a45cc5..33ea98d 100644 --- a/server/crates/arbiter-server/src/actors/user_agent/mod.rs +++ b/server/crates/arbiter-server/src/actors/user_agent/mod.rs @@ -3,6 +3,11 @@ use crate::{ db::{self, models::KeyType}, }; +pub struct EvmAccessEntry { + pub wallet_id: i32, + pub sdk_client_id: i32, +} + /// Abstraction over Ed25519 / ECDSA-secp256k1 / RSA public keys used during the auth handshake. #[derive(Clone, Debug)] pub enum AuthPublicKey { 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 d558e90..182db6e 100644 --- a/server/crates/arbiter-server/src/actors/user_agent/session.rs +++ b/server/crates/arbiter-server/src/actors/user_agent/session.rs @@ -58,13 +58,7 @@ pub struct UserAgentSession { pending_client_approvals: HashMap, } -mod connection; -pub(crate) use connection::{ - BootstrapError, HandleBootstrapEncryptedKey, HandleEvmWalletCreate, HandleEvmWalletList, - HandleGrantCreate, HandleGrantDelete, HandleGrantList, HandleNewClientApprove, - HandleQueryVaultState, HandleSdkClientList, -}; -pub use connection::{HandleUnsealEncryptedKey, HandleUnsealRequest, UnsealError}; +pub mod connection; impl UserAgentSession { pub(crate) fn new(props: UserAgentConnection, sender: Box>) -> Self { 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 85074a1..ac63c87 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,8 +2,9 @@ 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 diesel::sql_types::ops::Add; +use diesel::{BoolExpressionMethods as _, ExpressionMethods as _, QueryDsl as _, SelectableHelper}; +use diesel_async::{AsyncConnection, RunQueryDsl}; use kameo::error::SendError; use kameo::prelude::Context; use kameo::{message, messages}; @@ -12,8 +13,10 @@ use x25519_dalek::{EphemeralSecret, PublicKey}; use crate::actors::flow_coordinator::client_connect_approval::ClientApprovalAnswer; use crate::actors::keyholder::KeyHolderState; +use crate::actors::user_agent::EvmAccessEntry; use crate::actors::user_agent::session::Error; use crate::db::models::{ProgramClient, ProgramClientMetadata}; +use crate::db::schema::evm_wallet_access; use crate::evm::policies::{Grant, SpecificGrant}; use crate::safe_cell::SafeCell; use crate::{ @@ -290,7 +293,7 @@ impl UserAgentSession { } #[message] - pub(crate) async fn handle_evm_wallet_list(&mut self) -> Result, Error> { + pub(crate) async fn handle_evm_wallet_list(&mut self) -> Result, Error> { match self.props.actors.evm.ask(ListWallets {}).await { Ok(wallets) => Ok(wallets), Err(err) => { @@ -301,6 +304,8 @@ impl UserAgentSession { } } + + #[messages] impl UserAgentSession { #[message] @@ -351,6 +356,79 @@ impl UserAgentSession { } } } + + #[message] + pub(crate) async fn handle_grant_evm_wallet_access( + &mut self, + entries: Vec, + ) -> Result<(), Error> { + let mut conn = self.props.db.get().await?; + conn.transaction(|conn| { + Box::pin(async move { + use crate::db::models::NewEvmWalletAccess; + use crate::db::schema::evm_wallet_access; + + for entry in entries { + diesel::insert_into(evm_wallet_access::table) + .values(&NewEvmWalletAccess { + wallet_id: entry.wallet_id, + client_id: entry.sdk_client_id, + }) + .on_conflict_do_nothing() + .execute(conn) + .await?; + } + + Result::<_, Error>::Ok(()) + }) + }) + .await?; + Ok(()) + } + + #[message] + pub(crate) async fn handle_revoke_evm_wallet_access( + &mut self, + entries: Vec, + ) -> Result<(), Error> { + let mut conn = self.props.db.get().await?; + conn.transaction(|conn| { + Box::pin(async move { + use crate::db::schema::evm_wallet_access; + for entry in entries { + diesel::delete(evm_wallet_access::table) + .filter( + evm_wallet_access::wallet_id + .eq(entry.wallet_id) + .and(evm_wallet_access::client_id.eq(entry.sdk_client_id)), + ) + .execute(conn) + .await?; + } + + Result::<_, Error>::Ok(()) + }) + }) + .await?; + Ok(()) + } + + #[message] + pub(crate) async fn handle_list_wallet_access(&mut self) -> Result, Error> { + let mut conn = self.props.db.get().await?; + use crate::db::schema::evm_wallet_access; + let access_entries = evm_wallet_access::table + .select((evm_wallet_access::wallet_id, evm_wallet_access::client_id)) + .load::<(i32, i32)>(&mut conn) + .await? + .into_iter() + .map(|(wallet_id, sdk_client_id)| EvmAccessEntry { + wallet_id, + sdk_client_id, + }) + .collect(); + Ok(access_entries) + } } #[messages] @@ -391,15 +469,18 @@ impl UserAgentSession { pub(crate) async fn handle_sdk_client_list( &mut self, ) -> Result, Error> { - use crate::db::schema::{program_client, client_metadata}; + use crate::db::schema::{client_metadata, program_client}; 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())) + .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/db/models.rs b/server/crates/arbiter-server/src/db/models.rs index 2b940e1..2925039 100644 --- a/server/crates/arbiter-server/src/db/models.rs +++ b/server/crates/arbiter-server/src/db/models.rs @@ -187,6 +187,12 @@ pub struct EvmWallet { #[derive(Models, Queryable, Debug, Insertable, Selectable, Clone)] #[diesel(table_name = schema::evm_wallet_access, check_for_backend(Sqlite))] +#[view( + NewEvmWalletAccess, + derive(Insertable), + omit(id, created_at), + attributes_with = "deriveless" +)] pub struct EvmWalletAccess { pub id: i32, pub wallet_id: i32, diff --git a/server/crates/arbiter-server/src/grpc/user_agent.rs b/server/crates/arbiter-server/src/grpc/user_agent.rs index 470b479..7ad74c1 100644 --- a/server/crates/arbiter-server/src/grpc/user_agent.rs +++ b/server/crates/arbiter-server/src/grpc/user_agent.rs @@ -15,14 +15,15 @@ use arbiter_proto::{ }, user_agent::{ BootstrapEncryptedKey as ProtoBootstrapEncryptedKey, - BootstrapResult as ProtoBootstrapResult, + BootstrapResult as ProtoBootstrapResult, ListWalletAccessResponse, SdkClientConnectionCancel as ProtoSdkClientConnectionCancel, SdkClientConnectionRequest as ProtoSdkClientConnectionRequest, SdkClientEntry as ProtoSdkClientEntry, SdkClientError as ProtoSdkClientError, - SdkClientList as ProtoSdkClientList, - SdkClientListResponse as ProtoSdkClientListResponse, - UnsealEncryptedKey as ProtoUnsealEncryptedKey, UnsealResult as ProtoUnsealResult, - UnsealStart, UserAgentRequest, UserAgentResponse, VaultState as ProtoVaultState, + SdkClientGrantWalletAccess, SdkClientList as ProtoSdkClientList, + SdkClientListResponse as ProtoSdkClientListResponse, SdkClientRevokeWalletAccess, + SdkClientWalletAccess, 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, @@ -43,11 +44,8 @@ use crate::{ keyholder::KeyHolderState, user_agent::{ OutOfBand, UserAgentConnection, UserAgentSession, - session::{ - BootstrapError, HandleBootstrapEncryptedKey, HandleEvmWalletCreate, - HandleEvmWalletList, HandleGrantCreate, HandleGrantDelete, HandleGrantList, - HandleNewClientApprove, HandleQueryVaultState, HandleSdkClientList, - HandleUnsealEncryptedKey, HandleUnsealRequest, UnsealError, + session::connection::{ + BootstrapError, HandleBootstrapEncryptedKey, HandleEvmWalletCreate, HandleEvmWalletList, HandleGrantCreate, HandleGrantDelete, HandleGrantEvmWalletAccess, HandleGrantList, HandleListWalletAccess, HandleNewClientApprove, HandleQueryVaultState, HandleRevokeEvmWalletAccess, HandleSdkClientList, HandleUnsealEncryptedKey, HandleUnsealRequest, UnsealError }, }, }, @@ -263,9 +261,9 @@ async fn dispatch_inner( Ok(wallets) => WalletListResult::Wallets(WalletList { wallets: wallets .into_iter() - .map(|w| WalletEntry { - address: w.to_vec(), - id: todo!(), + .map(|(id, address)| WalletEntry { + address: address.to_vec(), + id, }) .collect(), }), @@ -384,8 +382,48 @@ async fn dispatch_inner( }) } - UserAgentRequestPayload::GrantWalletAccessList(_) - | UserAgentRequestPayload::RevokeWalletAccessList(_) => todo!(), + UserAgentRequestPayload::GrantWalletAccess(SdkClientGrantWalletAccess { accesses }) => { + let entries = accesses.try_convert()?; + + match actor.ask(HandleGrantEvmWalletAccess { entries }).await { + Ok(()) => { + info!("Successfully granted wallet access"); + return Ok(None); + } + Err(err) => { + warn!(error = ?err, "Failed to grant wallet access"); + return Err(Status::internal("Failed to grant wallet access")); + } + } + } + + UserAgentRequestPayload::RevokeWalletAccess(SdkClientRevokeWalletAccess { accesses }) => { + let entries = accesses.try_convert()?; + + match actor.ask(HandleRevokeEvmWalletAccess { entries }).await { + Ok(()) => { + info!("Successfully revoked wallet access"); + return Ok(None); + } + Err(err) => { + warn!(error = ?err, "Failed to revoke wallet access"); + return Err(Status::internal("Failed to revoke wallet access")); + } + } + } + + UserAgentRequestPayload::ListWalletAccess(_) => { + let result = match actor.ask(HandleListWalletAccess {}).await { + Ok(accesses) => ListWalletAccessResponse { + accesses: accesses.into_iter().map(|a| a.convert()).collect(), + }, + Err(err) => { + warn!(error = ?err, "Failed to list wallet access"); + return Err(Status::internal("Failed to list wallet access")); + } + }; + UserAgentResponsePayload::ListWalletAccessResponse(result) + } UserAgentRequestPayload::AuthChallengeRequest(..) | UserAgentRequestPayload::AuthChallengeSolution(..) => { diff --git a/server/crates/arbiter-server/src/grpc/user_agent/inbound.rs b/server/crates/arbiter-server/src/grpc/user_agent/inbound.rs index 15466a2..6c6572f 100644 --- a/server/crates/arbiter-server/src/grpc/user_agent/inbound.rs +++ b/server/crates/arbiter-server/src/grpc/user_agent/inbound.rs @@ -7,11 +7,13 @@ use arbiter_proto::proto::evm::{ VolumeRateLimit as ProtoVolumeRateLimit, specific_grant::Grant as ProtoSpecificGrantType, }; +use arbiter_proto::proto::user_agent::SdkClientWalletAccess; use alloy::primitives::{Address, U256}; use chrono::{DateTime, TimeZone, Utc}; use prost_types::Timestamp as ProtoTimestamp; use tonic::Status; +use crate::actors::user_agent::EvmAccessEntry; use crate::{ evm::policies::{ SharedGrantSettings, SpecificGrant, TransactionRateLimit, VolumeRateLimit, @@ -133,3 +135,18 @@ impl TryConvert for ProtoSpecificGrant { } } } + +impl TryConvert for Vec { + type Output = Vec; + type Error = Status; + + fn try_convert(self) -> Result, Status> { + Ok(self + .into_iter() + .map(|SdkClientWalletAccess { client_id, wallet_id }| EvmAccessEntry { + wallet_id, + sdk_client_id: client_id, + }) + .collect()) + } +} diff --git a/server/crates/arbiter-server/src/grpc/user_agent/outbound.rs b/server/crates/arbiter-server/src/grpc/user_agent/outbound.rs index ddc6313..af93635 100644 --- a/server/crates/arbiter-server/src/grpc/user_agent/outbound.rs +++ b/server/crates/arbiter-server/src/grpc/user_agent/outbound.rs @@ -1,16 +1,17 @@ -use arbiter_proto::proto::evm::{ - EtherTransferSettings as ProtoEtherTransferSettings, - SharedSettings as ProtoSharedSettings, - SpecificGrant as ProtoSpecificGrant, - TokenTransferSettings as ProtoTokenTransferSettings, - TransactionRateLimit as ProtoTransactionRateLimit, - VolumeRateLimit as ProtoVolumeRateLimit, - specific_grant::Grant as ProtoSpecificGrantType, +use arbiter_proto::proto::{ + evm::{ + EtherTransferSettings as ProtoEtherTransferSettings, SharedSettings as ProtoSharedSettings, + SpecificGrant as ProtoSpecificGrant, TokenTransferSettings as ProtoTokenTransferSettings, + TransactionRateLimit as ProtoTransactionRateLimit, VolumeRateLimit as ProtoVolumeRateLimit, + specific_grant::Grant as ProtoSpecificGrantType, + }, + user_agent::SdkClientWalletAccess as ProtoSdkClientWalletAccess, }; use chrono::{DateTime, Utc}; use prost_types::Timestamp as ProtoTimestamp; use crate::{ + actors::user_agent::EvmAccessEntry, evm::policies::{SharedGrantSettings, SpecificGrant, TransactionRateLimit, VolumeRateLimit}, grpc::Convert, }; @@ -83,10 +84,25 @@ impl Convert for SpecificGrant { ProtoSpecificGrantType::TokenTransfer(ProtoTokenTransferSettings { token_contract: s.token_contract.to_vec(), target: s.target.map(|a| a.to_vec()), - volume_limits: s.volume_limits.into_iter().map(VolumeRateLimit::convert).collect(), + volume_limits: s + .volume_limits + .into_iter() + .map(VolumeRateLimit::convert) + .collect(), }) } }; ProtoSpecificGrant { grant: Some(grant) } } } + +impl Convert for EvmAccessEntry { + type Output = ProtoSdkClientWalletAccess; + + fn convert(self) -> Self::Output { + ProtoSdkClientWalletAccess { + client_id: self.sdk_client_id, + wallet_id: self.wallet_id, + } + } +} diff --git a/server/crates/arbiter-server/tests/user_agent/unseal.rs b/server/crates/arbiter-server/tests/user_agent/unseal.rs index cd59b01..76a68aa 100644 --- a/server/crates/arbiter-server/tests/user_agent/unseal.rs +++ b/server/crates/arbiter-server/tests/user_agent/unseal.rs @@ -2,9 +2,9 @@ use arbiter_server::{ actors::{ GlobalActors, keyholder::{Bootstrap, Seal}, - user_agent::session::{ - HandleUnsealEncryptedKey, HandleUnsealRequest, UnsealError, UserAgentSession, - }, + user_agent::{UserAgentSession, session::connection::{ + HandleUnsealEncryptedKey, HandleUnsealRequest, UnsealError, + }}, }, db, safe_cell::{SafeCell, SafeCellHandle as _}, diff --git a/useragent/lib/features/callouts/callout_manager.g.dart b/useragent/lib/features/callouts/callout_manager.g.dart index d5d4097..2f20330 100644 --- a/useragent/lib/features/callouts/callout_manager.g.dart +++ b/useragent/lib/features/callouts/callout_manager.g.dart @@ -41,7 +41,7 @@ final class CalloutManagerProvider } } -String _$calloutManagerHash() => r'1d42ddcd9e5b8669a7ec08709b9dde9df6865bda'; +String _$calloutManagerHash() => r'ff8c9a03a6bbbca822242eb497c503b18240a289'; abstract class _$CalloutManager extends $Notifier> { Map build(); diff --git a/useragent/lib/proto/evm.pb.dart b/useragent/lib/proto/evm.pb.dart index eac4433..705d79f 100644 --- a/useragent/lib/proto/evm.pb.dart +++ b/useragent/lib/proto/evm.pb.dart @@ -26,9 +26,11 @@ export 'evm.pbenum.dart'; class WalletEntry extends $pb.GeneratedMessage { factory WalletEntry({ + $core.int? id, $core.List<$core.int>? address, }) { final result = create(); + if (id != null) result.id = id; if (address != null) result.address = address; return result; } @@ -46,8 +48,9 @@ class WalletEntry extends $pb.GeneratedMessage { _omitMessageNames ? '' : 'WalletEntry', package: const $pb.PackageName(_omitMessageNames ? '' : 'arbiter.evm'), createEmptyInstance: create) + ..aI(1, _omitFieldNames ? '' : 'id') ..a<$core.List<$core.int>>( - 1, _omitFieldNames ? '' : 'address', $pb.PbFieldType.OY) + 2, _omitFieldNames ? '' : 'address', $pb.PbFieldType.OY) ..hasRequiredFields = false; @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') @@ -70,13 +73,22 @@ class WalletEntry extends $pb.GeneratedMessage { static WalletEntry? _defaultInstance; @$pb.TagNumber(1) - $core.List<$core.int> get address => $_getN(0); + $core.int get id => $_getIZ(0); @$pb.TagNumber(1) - set address($core.List<$core.int> value) => $_setBytes(0, value); + set id($core.int value) => $_setSignedInt32(0, value); @$pb.TagNumber(1) - $core.bool hasAddress() => $_has(0); + $core.bool hasId() => $_has(0); @$pb.TagNumber(1) - void clearAddress() => $_clearField(1); + void clearId() => $_clearField(1); + + @$pb.TagNumber(2) + $core.List<$core.int> get address => $_getN(1); + @$pb.TagNumber(2) + set address($core.List<$core.int> value) => $_setBytes(1, value); + @$pb.TagNumber(2) + $core.bool hasAddress() => $_has(1); + @$pb.TagNumber(2) + void clearAddress() => $_clearField(2); } class WalletList extends $pb.GeneratedMessage { diff --git a/useragent/lib/proto/evm.pbjson.dart b/useragent/lib/proto/evm.pbjson.dart index 7b7a918..ad6fa07 100644 --- a/useragent/lib/proto/evm.pbjson.dart +++ b/useragent/lib/proto/evm.pbjson.dart @@ -34,13 +34,15 @@ final $typed_data.Uint8List evmErrorDescriptor = $convert.base64Decode( const WalletEntry$json = { '1': 'WalletEntry', '2': [ - {'1': 'address', '3': 1, '4': 1, '5': 12, '10': 'address'}, + {'1': 'id', '3': 1, '4': 1, '5': 5, '10': 'id'}, + {'1': 'address', '3': 2, '4': 1, '5': 12, '10': 'address'}, ], }; /// Descriptor for `WalletEntry`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List walletEntryDescriptor = $convert - .base64Decode('CgtXYWxsZXRFbnRyeRIYCgdhZGRyZXNzGAEgASgMUgdhZGRyZXNz'); +final $typed_data.Uint8List walletEntryDescriptor = $convert.base64Decode( + 'CgtXYWxsZXRFbnRyeRIOCgJpZBgBIAEoBVICaWQSGAoHYWRkcmVzcxgCIAEoDFIHYWRkcmVzcw' + '=='); @$core.Deprecated('Use walletListDescriptor instead') const WalletList$json = { diff --git a/useragent/lib/proto/user_agent.pb.dart b/useragent/lib/proto/user_agent.pb.dart index 177d3d4..51195bb 100644 --- a/useragent/lib/proto/user_agent.pb.dart +++ b/useragent/lib/proto/user_agent.pb.dart @@ -1072,6 +1072,230 @@ class SdkClientConnectionCancel extends $pb.GeneratedMessage { void clearPubkey() => $_clearField(1); } +class SdkClientWalletAccess extends $pb.GeneratedMessage { + factory SdkClientWalletAccess({ + $core.int? clientId, + $core.int? walletId, + }) { + final result = create(); + if (clientId != null) result.clientId = clientId; + if (walletId != null) result.walletId = walletId; + return result; + } + + SdkClientWalletAccess._(); + + factory SdkClientWalletAccess.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory SdkClientWalletAccess.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'SdkClientWalletAccess', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'arbiter.user_agent'), + createEmptyInstance: create) + ..aI(1, _omitFieldNames ? '' : 'clientId') + ..aI(2, _omitFieldNames ? '' : 'walletId') + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + SdkClientWalletAccess clone() => deepCopy(); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + SdkClientWalletAccess copyWith( + void Function(SdkClientWalletAccess) updates) => + super.copyWith((message) => updates(message as SdkClientWalletAccess)) + as SdkClientWalletAccess; + + @$core.override + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static SdkClientWalletAccess create() => SdkClientWalletAccess._(); + @$core.override + SdkClientWalletAccess createEmptyInstance() => create(); + @$core.pragma('dart2js:noInline') + static SdkClientWalletAccess getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static SdkClientWalletAccess? _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); + + @$pb.TagNumber(2) + $core.int get walletId => $_getIZ(1); + @$pb.TagNumber(2) + set walletId($core.int value) => $_setSignedInt32(1, value); + @$pb.TagNumber(2) + $core.bool hasWalletId() => $_has(1); + @$pb.TagNumber(2) + void clearWalletId() => $_clearField(2); +} + +class SdkClientGrantWalletAccess extends $pb.GeneratedMessage { + factory SdkClientGrantWalletAccess({ + $core.Iterable? accesses, + }) { + final result = create(); + if (accesses != null) result.accesses.addAll(accesses); + return result; + } + + SdkClientGrantWalletAccess._(); + + factory SdkClientGrantWalletAccess.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory SdkClientGrantWalletAccess.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'SdkClientGrantWalletAccess', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'arbiter.user_agent'), + createEmptyInstance: create) + ..pPM(1, _omitFieldNames ? '' : 'accesses', + subBuilder: SdkClientWalletAccess.create) + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + SdkClientGrantWalletAccess clone() => deepCopy(); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + SdkClientGrantWalletAccess copyWith( + void Function(SdkClientGrantWalletAccess) updates) => + super.copyWith( + (message) => updates(message as SdkClientGrantWalletAccess)) + as SdkClientGrantWalletAccess; + + @$core.override + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static SdkClientGrantWalletAccess create() => SdkClientGrantWalletAccess._(); + @$core.override + SdkClientGrantWalletAccess createEmptyInstance() => create(); + @$core.pragma('dart2js:noInline') + static SdkClientGrantWalletAccess getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static SdkClientGrantWalletAccess? _defaultInstance; + + @$pb.TagNumber(1) + $pb.PbList get accesses => $_getList(0); +} + +class SdkClientRevokeWalletAccess extends $pb.GeneratedMessage { + factory SdkClientRevokeWalletAccess({ + $core.Iterable? accesses, + }) { + final result = create(); + if (accesses != null) result.accesses.addAll(accesses); + return result; + } + + SdkClientRevokeWalletAccess._(); + + factory SdkClientRevokeWalletAccess.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory SdkClientRevokeWalletAccess.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'SdkClientRevokeWalletAccess', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'arbiter.user_agent'), + createEmptyInstance: create) + ..pPM(1, _omitFieldNames ? '' : 'accesses', + subBuilder: SdkClientWalletAccess.create) + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + SdkClientRevokeWalletAccess clone() => deepCopy(); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + SdkClientRevokeWalletAccess copyWith( + void Function(SdkClientRevokeWalletAccess) updates) => + super.copyWith( + (message) => updates(message as SdkClientRevokeWalletAccess)) + as SdkClientRevokeWalletAccess; + + @$core.override + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static SdkClientRevokeWalletAccess create() => + SdkClientRevokeWalletAccess._(); + @$core.override + SdkClientRevokeWalletAccess createEmptyInstance() => create(); + @$core.pragma('dart2js:noInline') + static SdkClientRevokeWalletAccess getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static SdkClientRevokeWalletAccess? _defaultInstance; + + @$pb.TagNumber(1) + $pb.PbList get accesses => $_getList(0); +} + +class ListWalletAccessResponse extends $pb.GeneratedMessage { + factory ListWalletAccessResponse({ + $core.Iterable? accesses, + }) { + final result = create(); + if (accesses != null) result.accesses.addAll(accesses); + return result; + } + + ListWalletAccessResponse._(); + + factory ListWalletAccessResponse.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory ListWalletAccessResponse.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'ListWalletAccessResponse', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'arbiter.user_agent'), + createEmptyInstance: create) + ..pPM(1, _omitFieldNames ? '' : 'accesses', + subBuilder: SdkClientWalletAccess.create) + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + ListWalletAccessResponse clone() => deepCopy(); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + ListWalletAccessResponse copyWith( + void Function(ListWalletAccessResponse) updates) => + super.copyWith((message) => updates(message as ListWalletAccessResponse)) + as ListWalletAccessResponse; + + @$core.override + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static ListWalletAccessResponse create() => ListWalletAccessResponse._(); + @$core.override + ListWalletAccessResponse createEmptyInstance() => create(); + @$core.pragma('dart2js:noInline') + static ListWalletAccessResponse getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static ListWalletAccessResponse? _defaultInstance; + + @$pb.TagNumber(1) + $pb.PbList get accesses => $_getList(0); +} + enum UserAgentRequest_Payload { authChallengeRequest, authChallengeSolution, @@ -1087,6 +1311,9 @@ enum UserAgentRequest_Payload { sdkClientRevoke, sdkClientList, bootstrapEncryptedKey, + grantWalletAccess, + revokeWalletAccess, + listWalletAccess, notSet } @@ -1106,7 +1333,10 @@ class UserAgentRequest extends $pb.GeneratedMessage { SdkClientRevokeRequest? sdkClientRevoke, $1.Empty? sdkClientList, BootstrapEncryptedKey? bootstrapEncryptedKey, + SdkClientGrantWalletAccess? grantWalletAccess, $core.int? id, + SdkClientRevokeWalletAccess? revokeWalletAccess, + $1.Empty? listWalletAccess, }) { final result = create(); if (authChallengeRequest != null) @@ -1128,7 +1358,11 @@ class UserAgentRequest extends $pb.GeneratedMessage { if (sdkClientList != null) result.sdkClientList = sdkClientList; if (bootstrapEncryptedKey != null) result.bootstrapEncryptedKey = bootstrapEncryptedKey; + if (grantWalletAccess != null) result.grantWalletAccess = grantWalletAccess; if (id != null) result.id = id; + if (revokeWalletAccess != null) + result.revokeWalletAccess = revokeWalletAccess; + if (listWalletAccess != null) result.listWalletAccess = listWalletAccess; return result; } @@ -1154,9 +1388,12 @@ class UserAgentRequest extends $pb.GeneratedMessage { 9: UserAgentRequest_Payload.evmGrantDelete, 10: UserAgentRequest_Payload.evmGrantList, 11: UserAgentRequest_Payload.sdkClientConnectionResponse, - 13: UserAgentRequest_Payload.sdkClientRevoke, - 14: UserAgentRequest_Payload.sdkClientList, - 15: UserAgentRequest_Payload.bootstrapEncryptedKey, + 12: UserAgentRequest_Payload.sdkClientRevoke, + 13: UserAgentRequest_Payload.sdkClientList, + 14: UserAgentRequest_Payload.bootstrapEncryptedKey, + 15: UserAgentRequest_Payload.grantWalletAccess, + 17: UserAgentRequest_Payload.revokeWalletAccess, + 18: UserAgentRequest_Payload.listWalletAccess, 0: UserAgentRequest_Payload.notSet }; static final $pb.BuilderInfo _i = $pb.BuilderInfo( @@ -1164,7 +1401,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, 13, 14, 15]) + ..oo(0, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 17, 18]) ..aOM( 1, _omitFieldNames ? '' : 'authChallengeRequest', subBuilder: AuthChallengeRequest.create) @@ -1190,14 +1427,22 @@ class UserAgentRequest extends $pb.GeneratedMessage { ..aOM( 11, _omitFieldNames ? '' : 'sdkClientConnectionResponse', subBuilder: SdkClientConnectionResponse.create) - ..aOM(13, _omitFieldNames ? '' : 'sdkClientRevoke', + ..aOM(12, _omitFieldNames ? '' : 'sdkClientRevoke', subBuilder: SdkClientRevokeRequest.create) - ..aOM<$1.Empty>(14, _omitFieldNames ? '' : 'sdkClientList', + ..aOM<$1.Empty>(13, _omitFieldNames ? '' : 'sdkClientList', subBuilder: $1.Empty.create) ..aOM( - 15, _omitFieldNames ? '' : 'bootstrapEncryptedKey', + 14, _omitFieldNames ? '' : 'bootstrapEncryptedKey', subBuilder: BootstrapEncryptedKey.create) + ..aOM( + 15, _omitFieldNames ? '' : 'grantWalletAccess', + subBuilder: SdkClientGrantWalletAccess.create) ..aI(16, _omitFieldNames ? '' : 'id') + ..aOM( + 17, _omitFieldNames ? '' : 'revokeWalletAccess', + subBuilder: SdkClientRevokeWalletAccess.create) + ..aOM<$1.Empty>(18, _omitFieldNames ? '' : 'listWalletAccess', + subBuilder: $1.Empty.create) ..hasRequiredFields = false; @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') @@ -1230,9 +1475,12 @@ 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) + @$pb.TagNumber(17) + @$pb.TagNumber(18) UserAgentRequest_Payload whichPayload() => _UserAgentRequest_PayloadByTag[$_whichOneof(0)]!; @$pb.TagNumber(1) @@ -1246,9 +1494,12 @@ 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) + @$pb.TagNumber(17) + @$pb.TagNumber(18) void clearPayload() => $_clearField($_whichOneof(0)); @$pb.TagNumber(1) @@ -1375,48 +1626,83 @@ class UserAgentRequest extends $pb.GeneratedMessage { SdkClientConnectionResponse ensureSdkClientConnectionResponse() => $_ensure(10); - @$pb.TagNumber(13) + @$pb.TagNumber(12) SdkClientRevokeRequest get sdkClientRevoke => $_getN(11); - @$pb.TagNumber(13) - set sdkClientRevoke(SdkClientRevokeRequest value) => $_setField(13, value); - @$pb.TagNumber(13) + @$pb.TagNumber(12) + set sdkClientRevoke(SdkClientRevokeRequest value) => $_setField(12, value); + @$pb.TagNumber(12) $core.bool hasSdkClientRevoke() => $_has(11); - @$pb.TagNumber(13) - void clearSdkClientRevoke() => $_clearField(13); - @$pb.TagNumber(13) + @$pb.TagNumber(12) + void clearSdkClientRevoke() => $_clearField(12); + @$pb.TagNumber(12) SdkClientRevokeRequest ensureSdkClientRevoke() => $_ensure(11); - @$pb.TagNumber(14) + @$pb.TagNumber(13) $1.Empty get sdkClientList => $_getN(12); - @$pb.TagNumber(14) - set sdkClientList($1.Empty value) => $_setField(14, value); - @$pb.TagNumber(14) + @$pb.TagNumber(13) + set sdkClientList($1.Empty value) => $_setField(13, value); + @$pb.TagNumber(13) $core.bool hasSdkClientList() => $_has(12); - @$pb.TagNumber(14) - void clearSdkClientList() => $_clearField(14); - @$pb.TagNumber(14) + @$pb.TagNumber(13) + void clearSdkClientList() => $_clearField(13); + @$pb.TagNumber(13) $1.Empty ensureSdkClientList() => $_ensure(12); - @$pb.TagNumber(15) + @$pb.TagNumber(14) BootstrapEncryptedKey get bootstrapEncryptedKey => $_getN(13); - @$pb.TagNumber(15) + @$pb.TagNumber(14) set bootstrapEncryptedKey(BootstrapEncryptedKey value) => - $_setField(15, value); - @$pb.TagNumber(15) + $_setField(14, value); + @$pb.TagNumber(14) $core.bool hasBootstrapEncryptedKey() => $_has(13); - @$pb.TagNumber(15) - void clearBootstrapEncryptedKey() => $_clearField(15); - @$pb.TagNumber(15) + @$pb.TagNumber(14) + void clearBootstrapEncryptedKey() => $_clearField(14); + @$pb.TagNumber(14) BootstrapEncryptedKey ensureBootstrapEncryptedKey() => $_ensure(13); + @$pb.TagNumber(15) + SdkClientGrantWalletAccess get grantWalletAccess => $_getN(14); + @$pb.TagNumber(15) + set grantWalletAccess(SdkClientGrantWalletAccess value) => + $_setField(15, value); + @$pb.TagNumber(15) + $core.bool hasGrantWalletAccess() => $_has(14); + @$pb.TagNumber(15) + void clearGrantWalletAccess() => $_clearField(15); + @$pb.TagNumber(15) + SdkClientGrantWalletAccess ensureGrantWalletAccess() => $_ensure(14); + @$pb.TagNumber(16) - $core.int get id => $_getIZ(14); + $core.int get id => $_getIZ(15); @$pb.TagNumber(16) - set id($core.int value) => $_setSignedInt32(14, value); + set id($core.int value) => $_setSignedInt32(15, value); @$pb.TagNumber(16) - $core.bool hasId() => $_has(14); + $core.bool hasId() => $_has(15); @$pb.TagNumber(16) void clearId() => $_clearField(16); + + @$pb.TagNumber(17) + SdkClientRevokeWalletAccess get revokeWalletAccess => $_getN(16); + @$pb.TagNumber(17) + set revokeWalletAccess(SdkClientRevokeWalletAccess value) => + $_setField(17, value); + @$pb.TagNumber(17) + $core.bool hasRevokeWalletAccess() => $_has(16); + @$pb.TagNumber(17) + void clearRevokeWalletAccess() => $_clearField(17); + @$pb.TagNumber(17) + SdkClientRevokeWalletAccess ensureRevokeWalletAccess() => $_ensure(16); + + @$pb.TagNumber(18) + $1.Empty get listWalletAccess => $_getN(17); + @$pb.TagNumber(18) + set listWalletAccess($1.Empty value) => $_setField(18, value); + @$pb.TagNumber(18) + $core.bool hasListWalletAccess() => $_has(17); + @$pb.TagNumber(18) + void clearListWalletAccess() => $_clearField(18); + @$pb.TagNumber(18) + $1.Empty ensureListWalletAccess() => $_ensure(17); } enum UserAgentResponse_Payload { @@ -1435,6 +1721,7 @@ enum UserAgentResponse_Payload { sdkClientRevokeResponse, sdkClientListResponse, bootstrapResult, + listWalletAccessResponse, notSet } @@ -1456,6 +1743,7 @@ class UserAgentResponse extends $pb.GeneratedMessage { SdkClientListResponse? sdkClientListResponse, BootstrapResult? bootstrapResult, $core.int? id, + ListWalletAccessResponse? listWalletAccessResponse, }) { final result = create(); if (authChallenge != null) result.authChallenge = authChallenge; @@ -1479,6 +1767,8 @@ class UserAgentResponse extends $pb.GeneratedMessage { result.sdkClientListResponse = sdkClientListResponse; if (bootstrapResult != null) result.bootstrapResult = bootstrapResult; if (id != null) result.id = id; + if (listWalletAccessResponse != null) + result.listWalletAccessResponse = listWalletAccessResponse; return result; } @@ -1508,6 +1798,7 @@ class UserAgentResponse extends $pb.GeneratedMessage { 13: UserAgentResponse_Payload.sdkClientRevokeResponse, 14: UserAgentResponse_Payload.sdkClientListResponse, 15: UserAgentResponse_Payload.bootstrapResult, + 17: UserAgentResponse_Payload.listWalletAccessResponse, 0: UserAgentResponse_Payload.notSet }; static final $pb.BuilderInfo _i = $pb.BuilderInfo( @@ -1515,7 +1806,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, 14, 15]) + ..oo(0, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 17]) ..aOM(1, _omitFieldNames ? '' : 'authChallenge', subBuilder: AuthChallenge.create) ..aE(2, _omitFieldNames ? '' : 'authResult', @@ -1551,6 +1842,9 @@ class UserAgentResponse extends $pb.GeneratedMessage { ..aE(15, _omitFieldNames ? '' : 'bootstrapResult', enumValues: BootstrapResult.values) ..aI(16, _omitFieldNames ? '' : 'id') + ..aOM( + 17, _omitFieldNames ? '' : 'listWalletAccessResponse', + subBuilder: ListWalletAccessResponse.create) ..hasRequiredFields = false; @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') @@ -1587,6 +1881,7 @@ class UserAgentResponse extends $pb.GeneratedMessage { @$pb.TagNumber(13) @$pb.TagNumber(14) @$pb.TagNumber(15) + @$pb.TagNumber(17) UserAgentResponse_Payload whichPayload() => _UserAgentResponse_PayloadByTag[$_whichOneof(0)]!; @$pb.TagNumber(1) @@ -1604,6 +1899,7 @@ class UserAgentResponse extends $pb.GeneratedMessage { @$pb.TagNumber(13) @$pb.TagNumber(14) @$pb.TagNumber(15) + @$pb.TagNumber(17) void clearPayload() => $_clearField($_whichOneof(0)); @$pb.TagNumber(1) @@ -1775,6 +2071,18 @@ class UserAgentResponse extends $pb.GeneratedMessage { $core.bool hasId() => $_has(15); @$pb.TagNumber(16) void clearId() => $_clearField(16); + + @$pb.TagNumber(17) + ListWalletAccessResponse get listWalletAccessResponse => $_getN(16); + @$pb.TagNumber(17) + set listWalletAccessResponse(ListWalletAccessResponse value) => + $_setField(17, value); + @$pb.TagNumber(17) + $core.bool hasListWalletAccessResponse() => $_has(16); + @$pb.TagNumber(17) + void clearListWalletAccessResponse() => $_clearField(17); + @$pb.TagNumber(17) + ListWalletAccessResponse ensureListWalletAccessResponse() => $_ensure(16); } const $core.bool _omitFieldNames = diff --git a/useragent/lib/proto/user_agent.pbjson.dart b/useragent/lib/proto/user_agent.pbjson.dart index 42676d1..cb98a21 100644 --- a/useragent/lib/proto/user_agent.pbjson.dart +++ b/useragent/lib/proto/user_agent.pbjson.dart @@ -418,6 +418,83 @@ final $typed_data.Uint8List sdkClientConnectionCancelDescriptor = $convert.base64Decode( 'ChlTZGtDbGllbnRDb25uZWN0aW9uQ2FuY2VsEhYKBnB1YmtleRgBIAEoDFIGcHVia2V5'); +@$core.Deprecated('Use sdkClientWalletAccessDescriptor instead') +const SdkClientWalletAccess$json = { + '1': 'SdkClientWalletAccess', + '2': [ + {'1': 'client_id', '3': 1, '4': 1, '5': 5, '10': 'clientId'}, + {'1': 'wallet_id', '3': 2, '4': 1, '5': 5, '10': 'walletId'}, + ], +}; + +/// Descriptor for `SdkClientWalletAccess`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List sdkClientWalletAccessDescriptor = $convert.base64Decode( + 'ChVTZGtDbGllbnRXYWxsZXRBY2Nlc3MSGwoJY2xpZW50X2lkGAEgASgFUghjbGllbnRJZBIbCg' + 'l3YWxsZXRfaWQYAiABKAVSCHdhbGxldElk'); + +@$core.Deprecated('Use sdkClientGrantWalletAccessDescriptor instead') +const SdkClientGrantWalletAccess$json = { + '1': 'SdkClientGrantWalletAccess', + '2': [ + { + '1': 'accesses', + '3': 1, + '4': 3, + '5': 11, + '6': '.arbiter.user_agent.SdkClientWalletAccess', + '10': 'accesses' + }, + ], +}; + +/// Descriptor for `SdkClientGrantWalletAccess`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List sdkClientGrantWalletAccessDescriptor = + $convert.base64Decode( + 'ChpTZGtDbGllbnRHcmFudFdhbGxldEFjY2VzcxJFCghhY2Nlc3NlcxgBIAMoCzIpLmFyYml0ZX' + 'IudXNlcl9hZ2VudC5TZGtDbGllbnRXYWxsZXRBY2Nlc3NSCGFjY2Vzc2Vz'); + +@$core.Deprecated('Use sdkClientRevokeWalletAccessDescriptor instead') +const SdkClientRevokeWalletAccess$json = { + '1': 'SdkClientRevokeWalletAccess', + '2': [ + { + '1': 'accesses', + '3': 1, + '4': 3, + '5': 11, + '6': '.arbiter.user_agent.SdkClientWalletAccess', + '10': 'accesses' + }, + ], +}; + +/// Descriptor for `SdkClientRevokeWalletAccess`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List sdkClientRevokeWalletAccessDescriptor = + $convert.base64Decode( + 'ChtTZGtDbGllbnRSZXZva2VXYWxsZXRBY2Nlc3MSRQoIYWNjZXNzZXMYASADKAsyKS5hcmJpdG' + 'VyLnVzZXJfYWdlbnQuU2RrQ2xpZW50V2FsbGV0QWNjZXNzUghhY2Nlc3Nlcw=='); + +@$core.Deprecated('Use listWalletAccessResponseDescriptor instead') +const ListWalletAccessResponse$json = { + '1': 'ListWalletAccessResponse', + '2': [ + { + '1': 'accesses', + '3': 1, + '4': 3, + '5': 11, + '6': '.arbiter.user_agent.SdkClientWalletAccess', + '10': 'accesses' + }, + ], +}; + +/// Descriptor for `ListWalletAccessResponse`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List listWalletAccessResponseDescriptor = + $convert.base64Decode( + 'ChhMaXN0V2FsbGV0QWNjZXNzUmVzcG9uc2USRQoIYWNjZXNzZXMYASADKAsyKS5hcmJpdGVyLn' + 'VzZXJfYWdlbnQuU2RrQ2xpZW50V2FsbGV0QWNjZXNzUghhY2Nlc3Nlcw=='); + @$core.Deprecated('Use userAgentRequestDescriptor instead') const UserAgentRequest$json = { '1': 'UserAgentRequest', @@ -524,7 +601,7 @@ const UserAgentRequest$json = { }, { '1': 'sdk_client_revoke', - '3': 13, + '3': 12, '4': 1, '5': 11, '6': '.arbiter.user_agent.SdkClientRevokeRequest', @@ -533,7 +610,7 @@ const UserAgentRequest$json = { }, { '1': 'sdk_client_list', - '3': 14, + '3': 13, '4': 1, '5': 11, '6': '.google.protobuf.Empty', @@ -542,13 +619,40 @@ const UserAgentRequest$json = { }, { '1': 'bootstrap_encrypted_key', - '3': 15, + '3': 14, '4': 1, '5': 11, '6': '.arbiter.user_agent.BootstrapEncryptedKey', '9': 0, '10': 'bootstrapEncryptedKey' }, + { + '1': 'grant_wallet_access', + '3': 15, + '4': 1, + '5': 11, + '6': '.arbiter.user_agent.SdkClientGrantWalletAccess', + '9': 0, + '10': 'grantWalletAccess' + }, + { + '1': 'revoke_wallet_access', + '3': 17, + '4': 1, + '5': 11, + '6': '.arbiter.user_agent.SdkClientRevokeWalletAccess', + '9': 0, + '10': 'revokeWalletAccess' + }, + { + '1': 'list_wallet_access', + '3': 18, + '4': 1, + '5': 11, + '6': '.google.protobuf.Empty', + '9': 0, + '10': 'listWalletAccess' + }, ], '8': [ {'1': 'payload'}, @@ -574,12 +678,16 @@ final $typed_data.Uint8List userAgentRequestDescriptor = $convert.base64Decode( 'c3QYCiABKAsyIC5hcmJpdGVyLmV2bS5Fdm1HcmFudExpc3RSZXF1ZXN0SABSDGV2bUdyYW50TG' 'lzdBJ2Ch5zZGtfY2xpZW50X2Nvbm5lY3Rpb25fcmVzcG9uc2UYCyABKAsyLy5hcmJpdGVyLnVz' 'ZXJfYWdlbnQuU2RrQ2xpZW50Q29ubmVjdGlvblJlc3BvbnNlSABSG3Nka0NsaWVudENvbm5lY3' - 'Rpb25SZXNwb25zZRJYChFzZGtfY2xpZW50X3Jldm9rZRgNIAEoCzIqLmFyYml0ZXIudXNlcl9h' + 'Rpb25SZXNwb25zZRJYChFzZGtfY2xpZW50X3Jldm9rZRgMIAEoCzIqLmFyYml0ZXIudXNlcl9h' 'Z2VudC5TZGtDbGllbnRSZXZva2VSZXF1ZXN0SABSD3Nka0NsaWVudFJldm9rZRJACg9zZGtfY2' - 'xpZW50X2xpc3QYDiABKAsyFi5nb29nbGUucHJvdG9idWYuRW1wdHlIAFINc2RrQ2xpZW50TGlz' - 'dBJjChdib290c3RyYXBfZW5jcnlwdGVkX2tleRgPIAEoCzIpLmFyYml0ZXIudXNlcl9hZ2VudC' - '5Cb290c3RyYXBFbmNyeXB0ZWRLZXlIAFIVYm9vdHN0cmFwRW5jcnlwdGVkS2V5QgkKB3BheWxv' - 'YWQ='); + 'xpZW50X2xpc3QYDSABKAsyFi5nb29nbGUucHJvdG9idWYuRW1wdHlIAFINc2RrQ2xpZW50TGlz' + 'dBJjChdib290c3RyYXBfZW5jcnlwdGVkX2tleRgOIAEoCzIpLmFyYml0ZXIudXNlcl9hZ2VudC' + '5Cb290c3RyYXBFbmNyeXB0ZWRLZXlIAFIVYm9vdHN0cmFwRW5jcnlwdGVkS2V5EmAKE2dyYW50' + 'X3dhbGxldF9hY2Nlc3MYDyABKAsyLi5hcmJpdGVyLnVzZXJfYWdlbnQuU2RrQ2xpZW50R3Jhbn' + 'RXYWxsZXRBY2Nlc3NIAFIRZ3JhbnRXYWxsZXRBY2Nlc3MSYwoUcmV2b2tlX3dhbGxldF9hY2Nl' + 'c3MYESABKAsyLy5hcmJpdGVyLnVzZXJfYWdlbnQuU2RrQ2xpZW50UmV2b2tlV2FsbGV0QWNjZX' + 'NzSABSEnJldm9rZVdhbGxldEFjY2VzcxJGChJsaXN0X3dhbGxldF9hY2Nlc3MYEiABKAsyFi5n' + 'b29nbGUucHJvdG9idWYuRW1wdHlIAFIQbGlzdFdhbGxldEFjY2Vzc0IJCgdwYXlsb2Fk'); @$core.Deprecated('Use userAgentResponseDescriptor instead') const UserAgentResponse$json = { @@ -721,6 +829,15 @@ const UserAgentResponse$json = { '9': 0, '10': 'bootstrapResult' }, + { + '1': 'list_wallet_access_response', + '3': 17, + '4': 1, + '5': 11, + '6': '.arbiter.user_agent.ListWalletAccessResponse', + '9': 0, + '10': 'listWalletAccessResponse' + }, ], '8': [ {'1': 'payload'}, @@ -754,4 +871,6 @@ final $typed_data.Uint8List userAgentResponseDescriptor = $convert.base64Decode( 'xpc3RfcmVzcG9uc2UYDiABKAsyKS5hcmJpdGVyLnVzZXJfYWdlbnQuU2RrQ2xpZW50TGlzdFJl' 'c3BvbnNlSABSFXNka0NsaWVudExpc3RSZXNwb25zZRJQChBib290c3RyYXBfcmVzdWx0GA8gAS' 'gOMiMuYXJiaXRlci51c2VyX2FnZW50LkJvb3RzdHJhcFJlc3VsdEgAUg9ib290c3RyYXBSZXN1' - 'bHRCCQoHcGF5bG9hZEIFCgNfaWQ='); + 'bHQSbQobbGlzdF93YWxsZXRfYWNjZXNzX3Jlc3BvbnNlGBEgASgLMiwuYXJiaXRlci51c2VyX2' + 'FnZW50Lkxpc3RXYWxsZXRBY2Nlc3NSZXNwb25zZUgAUhhsaXN0V2FsbGV0QWNjZXNzUmVzcG9u' + 'c2VCCQoHcGF5bG9hZEIFCgNfaWQ='); diff --git a/useragent/lib/providers/connection/connection_manager.g.dart b/useragent/lib/providers/connection/connection_manager.g.dart index 4869eff..ce66127 100644 --- a/useragent/lib/providers/connection/connection_manager.g.dart +++ b/useragent/lib/providers/connection/connection_manager.g.dart @@ -33,7 +33,7 @@ final class ConnectionManagerProvider ConnectionManager create() => ConnectionManager(); } -String _$connectionManagerHash() => r'd01084e550f315bc6cadfe74413a7f959426a80e'; +String _$connectionManagerHash() => r'f471afb49bdcde77238424942f5af1716634f084'; abstract class _$ConnectionManager extends $AsyncNotifier { FutureOr build(); diff --git a/useragent/lib/providers/sdk_clients/wallet_access.dart b/useragent/lib/providers/sdk_clients/wallet_access.dart new file mode 100644 index 0000000..1e0e1bc --- /dev/null +++ b/useragent/lib/providers/sdk_clients/wallet_access.dart @@ -0,0 +1,25 @@ + +import 'package:arbiter/proto/user_agent.pb.dart'; +import 'package:arbiter/providers/connection/connection_manager.dart'; +import 'package:mtcore/markettakers.dart'; +import 'package:protobuf/well_known_types/google/protobuf/empty.pb.dart'; +import 'package:riverpod_annotation/riverpod_annotation.dart'; + +part 'wallet_access.g.dart'; + +@riverpod +Future?> walletAccess(Ref ref) async { + final connection = await ref.watch(connectionManagerProvider.future); + if (connection == null) { + return null; + } + + final accesses = await connection.ask(UserAgentRequest(listWalletAccess: Empty())); + + if (accesses.hasListWalletAccessResponse()) { + return accesses.listWalletAccessResponse.accesses.toList(); + } else { + talker.warning('Received unexpected response for listWalletAccess: $accesses'); + return null; + } +} diff --git a/useragent/lib/providers/sdk_clients/wallet_access.g.dart b/useragent/lib/providers/sdk_clients/wallet_access.g.dart new file mode 100644 index 0000000..cb61d63 --- /dev/null +++ b/useragent/lib/providers/sdk_clients/wallet_access.g.dart @@ -0,0 +1,51 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'wallet_access.dart'; + +// ************************************************************************** +// RiverpodGenerator +// ************************************************************************** + +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint, type=warning + +@ProviderFor(walletAccess) +final walletAccessProvider = WalletAccessProvider._(); + +final class WalletAccessProvider + extends + $FunctionalProvider< + AsyncValue?>, + List?, + FutureOr?> + > + with + $FutureModifier?>, + $FutureProvider?> { + WalletAccessProvider._() + : super( + from: null, + argument: null, + retry: null, + name: r'walletAccessProvider', + isAutoDispose: true, + dependencies: null, + $allTransitiveDependencies: null, + ); + + @override + String debugGetCreateSourceHash() => _$walletAccessHash(); + + @$internal + @override + $FutureProviderElement?> $createElement( + $ProviderPointer pointer, + ) => $FutureProviderElement(pointer); + + @override + FutureOr?> create(Ref ref) { + return walletAccess(ref); + } +} + +String _$walletAccessHash() => r'954aae12d2d18999efaa97d01be983bf849f2296'; diff --git a/useragent/lib/router.gr.dart b/useragent/lib/router.gr.dart index 3e303ab..dbab355 100644 --- a/useragent/lib/router.gr.dart +++ b/useragent/lib/router.gr.dart @@ -9,27 +9,29 @@ // coverage:ignore-file // ignore_for_file: no_leading_underscores_for_library_prefixes +import 'package:arbiter/proto/user_agent.pb.dart' as _i13; import 'package:arbiter/screens/bootstrap.dart' as _i2; -import 'package:arbiter/screens/dashboard.dart' as _i5; +import 'package:arbiter/screens/dashboard.dart' as _i6; import 'package:arbiter/screens/dashboard/about.dart' as _i1; -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; -import 'package:auto_route/auto_route.dart' as _i10; -import 'package:flutter/material.dart' as _i11; +import 'package:arbiter/screens/dashboard/clients/details.dart' as _i3; +import 'package:arbiter/screens/dashboard/clients/table.dart' as _i4; +import 'package:arbiter/screens/dashboard/evm/evm.dart' as _i7; +import 'package:arbiter/screens/dashboard/evm/grants/grant_create.dart' as _i5; +import 'package:arbiter/screens/server_connection.dart' as _i8; +import 'package:arbiter/screens/server_info_setup.dart' as _i9; +import 'package:arbiter/screens/vault_setup.dart' as _i10; +import 'package:auto_route/auto_route.dart' as _i11; +import 'package:flutter/material.dart' as _i12; /// generated route for /// [_i1.AboutScreen] -class AboutRoute extends _i10.PageRouteInfo { - const AboutRoute({List<_i10.PageRouteInfo>? children}) +class AboutRoute extends _i11.PageRouteInfo { + const AboutRoute({List<_i11.PageRouteInfo>? children}) : super(AboutRoute.name, initialChildren: children); static const String name = 'AboutRoute'; - static _i10.PageInfo page = _i10.PageInfo( + static _i11.PageInfo page = _i11.PageInfo( name, builder: (data) { return const _i1.AboutScreen(); @@ -39,13 +41,13 @@ class AboutRoute extends _i10.PageRouteInfo { /// generated route for /// [_i2.Bootstrap] -class Bootstrap extends _i10.PageRouteInfo { - const Bootstrap({List<_i10.PageRouteInfo>? children}) +class Bootstrap extends _i11.PageRouteInfo { + const Bootstrap({List<_i11.PageRouteInfo>? children}) : super(Bootstrap.name, initialChildren: children); static const String name = 'Bootstrap'; - static _i10.PageInfo page = _i10.PageInfo( + static _i11.PageInfo page = _i11.PageInfo( name, builder: (data) { return const _i2.Bootstrap(); @@ -54,77 +56,124 @@ class Bootstrap extends _i10.PageRouteInfo { } /// generated route for -/// [_i3.ClientsScreen] -class ClientsRoute extends _i10.PageRouteInfo { - const ClientsRoute({List<_i10.PageRouteInfo>? children}) +/// [_i3.ClientDetails] +class ClientDetails extends _i11.PageRouteInfo { + ClientDetails({ + _i12.Key? key, + required _i13.SdkClientEntry client, + List<_i11.PageRouteInfo>? children, + }) : super( + ClientDetails.name, + args: ClientDetailsArgs(key: key, client: client), + initialChildren: children, + ); + + static const String name = 'ClientDetails'; + + static _i11.PageInfo page = _i11.PageInfo( + name, + builder: (data) { + final args = data.argsAs(); + return _i3.ClientDetails(key: args.key, client: args.client); + }, + ); +} + +class ClientDetailsArgs { + const ClientDetailsArgs({this.key, required this.client}); + + final _i12.Key? key; + + final _i13.SdkClientEntry client; + + @override + String toString() { + return 'ClientDetailsArgs{key: $key, client: $client}'; + } + + @override + bool operator ==(Object other) { + if (identical(this, other)) return true; + if (other is! ClientDetailsArgs) return false; + return key == other.key && client == other.client; + } + + @override + int get hashCode => key.hashCode ^ client.hashCode; +} + +/// generated route for +/// [_i4.ClientsScreen] +class ClientsRoute extends _i11.PageRouteInfo { + const ClientsRoute({List<_i11.PageRouteInfo>? children}) : super(ClientsRoute.name, initialChildren: children); static const String name = 'ClientsRoute'; - static _i10.PageInfo page = _i10.PageInfo( + static _i11.PageInfo page = _i11.PageInfo( name, builder: (data) { - return const _i3.ClientsScreen(); + return const _i4.ClientsScreen(); }, ); } /// generated route for -/// [_i4.CreateEvmGrantScreen] -class CreateEvmGrantRoute extends _i10.PageRouteInfo { - const CreateEvmGrantRoute({List<_i10.PageRouteInfo>? children}) +/// [_i5.CreateEvmGrantScreen] +class CreateEvmGrantRoute extends _i11.PageRouteInfo { + const CreateEvmGrantRoute({List<_i11.PageRouteInfo>? children}) : super(CreateEvmGrantRoute.name, initialChildren: children); static const String name = 'CreateEvmGrantRoute'; - static _i10.PageInfo page = _i10.PageInfo( + static _i11.PageInfo page = _i11.PageInfo( name, builder: (data) { - return const _i4.CreateEvmGrantScreen(); + return const _i5.CreateEvmGrantScreen(); }, ); } /// generated route for -/// [_i5.DashboardRouter] -class DashboardRouter extends _i10.PageRouteInfo { - const DashboardRouter({List<_i10.PageRouteInfo>? children}) +/// [_i6.DashboardRouter] +class DashboardRouter extends _i11.PageRouteInfo { + const DashboardRouter({List<_i11.PageRouteInfo>? children}) : super(DashboardRouter.name, initialChildren: children); static const String name = 'DashboardRouter'; - static _i10.PageInfo page = _i10.PageInfo( + static _i11.PageInfo page = _i11.PageInfo( name, builder: (data) { - return const _i5.DashboardRouter(); + return const _i6.DashboardRouter(); }, ); } /// generated route for -/// [_i6.EvmScreen] -class EvmRoute extends _i10.PageRouteInfo { - const EvmRoute({List<_i10.PageRouteInfo>? children}) +/// [_i7.EvmScreen] +class EvmRoute extends _i11.PageRouteInfo { + const EvmRoute({List<_i11.PageRouteInfo>? children}) : super(EvmRoute.name, initialChildren: children); static const String name = 'EvmRoute'; - static _i10.PageInfo page = _i10.PageInfo( + static _i11.PageInfo page = _i11.PageInfo( name, builder: (data) { - return const _i6.EvmScreen(); + return const _i7.EvmScreen(); }, ); } /// generated route for -/// [_i7.ServerConnectionScreen] +/// [_i8.ServerConnectionScreen] class ServerConnectionRoute - extends _i10.PageRouteInfo { + extends _i11.PageRouteInfo { ServerConnectionRoute({ - _i11.Key? key, + _i12.Key? key, String? arbiterUrl, - List<_i10.PageRouteInfo>? children, + List<_i11.PageRouteInfo>? children, }) : super( ServerConnectionRoute.name, args: ServerConnectionRouteArgs(key: key, arbiterUrl: arbiterUrl), @@ -133,13 +182,13 @@ class ServerConnectionRoute static const String name = 'ServerConnectionRoute'; - static _i10.PageInfo page = _i10.PageInfo( + static _i11.PageInfo page = _i11.PageInfo( name, builder: (data) { final args = data.argsAs( orElse: () => const ServerConnectionRouteArgs(), ); - return _i7.ServerConnectionScreen( + return _i8.ServerConnectionScreen( key: args.key, arbiterUrl: args.arbiterUrl, ); @@ -150,7 +199,7 @@ class ServerConnectionRoute class ServerConnectionRouteArgs { const ServerConnectionRouteArgs({this.key, this.arbiterUrl}); - final _i11.Key? key; + final _i12.Key? key; final String? arbiterUrl; @@ -171,33 +220,33 @@ class ServerConnectionRouteArgs { } /// generated route for -/// [_i8.ServerInfoSetupScreen] -class ServerInfoSetupRoute extends _i10.PageRouteInfo { - const ServerInfoSetupRoute({List<_i10.PageRouteInfo>? children}) +/// [_i9.ServerInfoSetupScreen] +class ServerInfoSetupRoute extends _i11.PageRouteInfo { + const ServerInfoSetupRoute({List<_i11.PageRouteInfo>? children}) : super(ServerInfoSetupRoute.name, initialChildren: children); static const String name = 'ServerInfoSetupRoute'; - static _i10.PageInfo page = _i10.PageInfo( + static _i11.PageInfo page = _i11.PageInfo( name, builder: (data) { - return const _i8.ServerInfoSetupScreen(); + return const _i9.ServerInfoSetupScreen(); }, ); } /// generated route for -/// [_i9.VaultSetupScreen] -class VaultSetupRoute extends _i10.PageRouteInfo { - const VaultSetupRoute({List<_i10.PageRouteInfo>? children}) +/// [_i10.VaultSetupScreen] +class VaultSetupRoute extends _i11.PageRouteInfo { + const VaultSetupRoute({List<_i11.PageRouteInfo>? children}) : super(VaultSetupRoute.name, initialChildren: children); static const String name = 'VaultSetupRoute'; - static _i10.PageInfo page = _i10.PageInfo( + static _i11.PageInfo page = _i11.PageInfo( name, builder: (data) { - return const _i9.VaultSetupScreen(); + return const _i10.VaultSetupScreen(); }, ); } diff --git a/useragent/lib/screens/dashboard/clients/details.dart b/useragent/lib/screens/dashboard/clients/details.dart new file mode 100644 index 0000000..4825380 --- /dev/null +++ b/useragent/lib/screens/dashboard/clients/details.dart @@ -0,0 +1,17 @@ + +import 'package:arbiter/proto/user_agent.pb.dart'; +import 'package:auto_route/auto_route.dart'; +import 'package:flutter/material.dart'; +import 'package:hooks_riverpod/hooks_riverpod.dart'; + +@RoutePage() +class ClientDetails extends ConsumerWidget { + final SdkClientEntry client; + const ClientDetails({super.key, required this.client}); + + @override + Widget build(BuildContext context, WidgetRef ref) { + throw UnimplementedError(); + } + +} \ No newline at end of file