feat(evm): add wallet access grant/revoke functionality
Some checks failed
ci/woodpecker/push/server-audit Pipeline was successful
ci/woodpecker/push/server-lint Pipeline failed
ci/woodpecker/push/server-vet Pipeline failed
ci/woodpecker/push/server-test Pipeline was successful
ci/woodpecker/push/useragent-analyze Pipeline failed

This commit is contained in:
hdbg
2026-03-25 15:26:00 +01:00
parent ac04495480
commit bbf8a8019c
20 changed files with 893 additions and 147 deletions

View File

@@ -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;
}
}

View File

@@ -130,7 +130,7 @@ impl EvmActor {
}
#[message]
pub async fn list_wallets(&self) -> Result<Vec<Address>, Error> {
pub async fn list_wallets(&self) -> Result<Vec<(i32, Address)>, Error> {
let mut conn = self.db.get().await?;
let rows: Vec<models::EvmWallet> = 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())
}
}

View File

@@ -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 {

View File

@@ -58,13 +58,7 @@ pub struct UserAgentSession {
pending_client_approvals: HashMap<VerifyingKey, PendingClientApproval>,
}
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<dyn Sender<OutOfBand>>) -> Self {

View File

@@ -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<Vec<Address>, Error> {
pub(crate) async fn handle_evm_wallet_list(&mut self) -> Result<Vec<(i32, Address)>, 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<EvmAccessEntry>,
) -> 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<EvmAccessEntry>,
) -> 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<Vec<EvmAccessEntry>, 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<Vec<(ProgramClient, ProgramClientMetadata)>, 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)
}
}
}

View File

@@ -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,

View File

@@ -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(..) => {

View File

@@ -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<SdkClientWalletAccess> {
type Output = Vec<EvmAccessEntry>;
type Error = Status;
fn try_convert(self) -> Result<Vec<EvmAccessEntry>, Status> {
Ok(self
.into_iter()
.map(|SdkClientWalletAccess { client_id, wallet_id }| EvmAccessEntry {
wallet_id,
sdk_client_id: client_id,
})
.collect())
}
}

View File

@@ -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,
}
}
}

View File

@@ -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 _},

View File

@@ -41,7 +41,7 @@ final class CalloutManagerProvider
}
}
String _$calloutManagerHash() => r'1d42ddcd9e5b8669a7ec08709b9dde9df6865bda';
String _$calloutManagerHash() => r'ff8c9a03a6bbbca822242eb497c503b18240a289';
abstract class _$CalloutManager extends $Notifier<Map<String, ActiveCallout>> {
Map<String, ActiveCallout> build();

View File

@@ -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 {

View File

@@ -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 = {

View File

@@ -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<SdkClientWalletAccess>(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<SdkClientWalletAccess>? 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<SdkClientWalletAccess>(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<SdkClientGrantWalletAccess>(create);
static SdkClientGrantWalletAccess? _defaultInstance;
@$pb.TagNumber(1)
$pb.PbList<SdkClientWalletAccess> get accesses => $_getList(0);
}
class SdkClientRevokeWalletAccess extends $pb.GeneratedMessage {
factory SdkClientRevokeWalletAccess({
$core.Iterable<SdkClientWalletAccess>? 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<SdkClientWalletAccess>(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<SdkClientRevokeWalletAccess>(create);
static SdkClientRevokeWalletAccess? _defaultInstance;
@$pb.TagNumber(1)
$pb.PbList<SdkClientWalletAccess> get accesses => $_getList(0);
}
class ListWalletAccessResponse extends $pb.GeneratedMessage {
factory ListWalletAccessResponse({
$core.Iterable<SdkClientWalletAccess>? 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<SdkClientWalletAccess>(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<ListWalletAccessResponse>(create);
static ListWalletAccessResponse? _defaultInstance;
@$pb.TagNumber(1)
$pb.PbList<SdkClientWalletAccess> 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<AuthChallengeRequest>(
1, _omitFieldNames ? '' : 'authChallengeRequest',
subBuilder: AuthChallengeRequest.create)
@@ -1190,14 +1427,22 @@ class UserAgentRequest extends $pb.GeneratedMessage {
..aOM<SdkClientConnectionResponse>(
11, _omitFieldNames ? '' : 'sdkClientConnectionResponse',
subBuilder: SdkClientConnectionResponse.create)
..aOM<SdkClientRevokeRequest>(13, _omitFieldNames ? '' : 'sdkClientRevoke',
..aOM<SdkClientRevokeRequest>(12, _omitFieldNames ? '' : 'sdkClientRevoke',
subBuilder: SdkClientRevokeRequest.create)
..aOM<$1.Empty>(14, _omitFieldNames ? '' : 'sdkClientList',
..aOM<$1.Empty>(13, _omitFieldNames ? '' : 'sdkClientList',
subBuilder: $1.Empty.create)
..aOM<BootstrapEncryptedKey>(
15, _omitFieldNames ? '' : 'bootstrapEncryptedKey',
14, _omitFieldNames ? '' : 'bootstrapEncryptedKey',
subBuilder: BootstrapEncryptedKey.create)
..aOM<SdkClientGrantWalletAccess>(
15, _omitFieldNames ? '' : 'grantWalletAccess',
subBuilder: SdkClientGrantWalletAccess.create)
..aI(16, _omitFieldNames ? '' : 'id')
..aOM<SdkClientRevokeWalletAccess>(
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<AuthChallenge>(1, _omitFieldNames ? '' : 'authChallenge',
subBuilder: AuthChallenge.create)
..aE<AuthResult>(2, _omitFieldNames ? '' : 'authResult',
@@ -1551,6 +1842,9 @@ class UserAgentResponse extends $pb.GeneratedMessage {
..aE<BootstrapResult>(15, _omitFieldNames ? '' : 'bootstrapResult',
enumValues: BootstrapResult.values)
..aI(16, _omitFieldNames ? '' : 'id')
..aOM<ListWalletAccessResponse>(
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 =

View File

@@ -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=');

View File

@@ -33,7 +33,7 @@ final class ConnectionManagerProvider
ConnectionManager create() => ConnectionManager();
}
String _$connectionManagerHash() => r'd01084e550f315bc6cadfe74413a7f959426a80e';
String _$connectionManagerHash() => r'f471afb49bdcde77238424942f5af1716634f084';
abstract class _$ConnectionManager extends $AsyncNotifier<Connection?> {
FutureOr<Connection?> build();

View File

@@ -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<List<SdkClientWalletAccess>?> 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;
}
}

View File

@@ -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<SdkClientWalletAccess>?>,
List<SdkClientWalletAccess>?,
FutureOr<List<SdkClientWalletAccess>?>
>
with
$FutureModifier<List<SdkClientWalletAccess>?>,
$FutureProvider<List<SdkClientWalletAccess>?> {
WalletAccessProvider._()
: super(
from: null,
argument: null,
retry: null,
name: r'walletAccessProvider',
isAutoDispose: true,
dependencies: null,
$allTransitiveDependencies: null,
);
@override
String debugGetCreateSourceHash() => _$walletAccessHash();
@$internal
@override
$FutureProviderElement<List<SdkClientWalletAccess>?> $createElement(
$ProviderPointer pointer,
) => $FutureProviderElement(pointer);
@override
FutureOr<List<SdkClientWalletAccess>?> create(Ref ref) {
return walletAccess(ref);
}
}
String _$walletAccessHash() => r'954aae12d2d18999efaa97d01be983bf849f2296';

View File

@@ -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<void> {
const AboutRoute({List<_i10.PageRouteInfo>? children})
class AboutRoute extends _i11.PageRouteInfo<void> {
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<void> {
/// generated route for
/// [_i2.Bootstrap]
class Bootstrap extends _i10.PageRouteInfo<void> {
const Bootstrap({List<_i10.PageRouteInfo>? children})
class Bootstrap extends _i11.PageRouteInfo<void> {
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<void> {
}
/// generated route for
/// [_i3.ClientsScreen]
class ClientsRoute extends _i10.PageRouteInfo<void> {
const ClientsRoute({List<_i10.PageRouteInfo>? children})
/// [_i3.ClientDetails]
class ClientDetails extends _i11.PageRouteInfo<ClientDetailsArgs> {
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<ClientDetailsArgs>();
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<void> {
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<void> {
const CreateEvmGrantRoute({List<_i10.PageRouteInfo>? children})
/// [_i5.CreateEvmGrantScreen]
class CreateEvmGrantRoute extends _i11.PageRouteInfo<void> {
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<void> {
const DashboardRouter({List<_i10.PageRouteInfo>? children})
/// [_i6.DashboardRouter]
class DashboardRouter extends _i11.PageRouteInfo<void> {
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<void> {
const EvmRoute({List<_i10.PageRouteInfo>? children})
/// [_i7.EvmScreen]
class EvmRoute extends _i11.PageRouteInfo<void> {
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<ServerConnectionRouteArgs> {
extends _i11.PageRouteInfo<ServerConnectionRouteArgs> {
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<ServerConnectionRouteArgs>(
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<void> {
const ServerInfoSetupRoute({List<_i10.PageRouteInfo>? children})
/// [_i9.ServerInfoSetupScreen]
class ServerInfoSetupRoute extends _i11.PageRouteInfo<void> {
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<void> {
const VaultSetupRoute({List<_i10.PageRouteInfo>? children})
/// [_i10.VaultSetupScreen]
class VaultSetupRoute extends _i11.PageRouteInfo<void> {
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();
},
);
}

View File

@@ -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();
}
}