From 33e2b044d8aac0ab905bf56bf36c66b8395a5c08 Mon Sep 17 00:00:00 2001 From: Ethan Tuttle Date: Wed, 30 Aug 2023 15:44:29 -0400 Subject: [PATCH] feat: audit api --- apps/guardian-ui/src/GuardianApi.ts | 7 +++++++ .../guardian-ui/src/admin/FederationAdmin.tsx | 7 +++++-- apps/guardian-ui/src/components/AdminMain.tsx | 20 +++++++++---------- apps/guardian-ui/src/types.tsx | 10 ++++++++++ docker-compose.yml | 6 ++++++ 5 files changed, 38 insertions(+), 12 deletions(-) diff --git a/apps/guardian-ui/src/GuardianApi.ts b/apps/guardian-ui/src/GuardianApi.ts index ac99e152..f2d93770 100644 --- a/apps/guardian-ui/src/GuardianApi.ts +++ b/apps/guardian-ui/src/GuardianApi.ts @@ -1,6 +1,7 @@ import { JsonRpcError, JsonRpcWebsocket } from 'jsonrpc-client-websocket'; import { ConfigGenParams, ConsensusState, PeerHashMap } from './setup/types'; import { + AuditSummary, ConfigResponse, FederationStatus, ServerStatus, @@ -208,6 +209,7 @@ enum AdminRpc { inviteCode = 'invite_code', config = 'config', module = 'module', + audit = 'audit', } export enum LightningModuleRpc { @@ -221,6 +223,7 @@ export interface AdminApiInterface extends SharedApiInterface { fetchEpochCount: () => Promise; inviteCode: () => Promise; config: (connection: string) => Promise; + audit: () => Promise; moduleApiCall: (moduleId: number, rpc: ModuleRpc) => Promise; } @@ -366,6 +369,10 @@ export class GuardianApi return this.base.call(AdminRpc.config, connection); }; + audit = (): Promise => { + return this.base.call(AdminRpc.audit); + }; + moduleApiCall = (moduleId: number, rpc: ModuleRpc): Promise => { const method = `${AdminRpc.module}_${moduleId}_${rpc}`; return this.base.call_any_method(method); diff --git a/apps/guardian-ui/src/admin/FederationAdmin.tsx b/apps/guardian-ui/src/admin/FederationAdmin.tsx index 4c11f5bd..823d62d9 100644 --- a/apps/guardian-ui/src/admin/FederationAdmin.tsx +++ b/apps/guardian-ui/src/admin/FederationAdmin.tsx @@ -18,6 +18,7 @@ import { CopyInput } from '@fedimint/ui'; import { useTranslation } from '@fedimint/utils'; import { useAdminContext } from '../hooks'; import { + AuditSummary, ConfigResponse, Gateway, PeerStatus, @@ -42,6 +43,7 @@ export const FederationAdmin: React.FC = () => { const [epochCount, setEpochCount] = useState(); const [status, setStatus] = useState(); const [inviteCode, setInviteCode] = useState(''); + const [auditSummary, setAuditSummary] = useState(); const [config, setConfig] = useState(); const [gateways, setGateways] = useState([]); const { t } = useTranslation(); @@ -49,9 +51,10 @@ export const FederationAdmin: React.FC = () => { useEffect(() => { api.version().then(setVersions).catch(console.error); api.fetchEpochCount().then(setEpochCount).catch(console.error); - // TODO: poll server status + // TODO: poll server status and audit api.status().then(setStatus).catch(console.error); api.inviteCode().then(setInviteCode).catch(console.error); + api.audit().then(setAuditSummary).catch(console.error); }, [api]); useEffect(() => { @@ -158,7 +161,7 @@ export const FederationAdmin: React.FC = () => { - + {t('federation-dashboard.fed-info.label')} diff --git a/apps/guardian-ui/src/components/AdminMain.tsx b/apps/guardian-ui/src/components/AdminMain.tsx index 68c518e8..dc481721 100644 --- a/apps/guardian-ui/src/components/AdminMain.tsx +++ b/apps/guardian-ui/src/components/AdminMain.tsx @@ -4,10 +4,11 @@ import { ReactComponent as BitcoinIcon } from '../assets/svgs/bitcoin-white.svg' import { ReactComponent as EcashIcon } from '../assets/svgs/ecash.svg'; import { ReactComponent as BankNotesIcon } from '../assets/svgs/banknotes.svg'; import { ReactComponent as InfoIcon } from '../assets/svgs/info.svg'; +import { AuditSummary } from '../types'; interface FederationBalanceProps { title: string; - amount: number; + amount: bigint; icon: React.ReactElement< React.SVGProps & { title?: string | undefined; @@ -56,7 +57,7 @@ const FederationBalance: FC = ({ {title} - {amount} + {amount.toString()} @@ -69,7 +70,11 @@ const FederationBalance: FC = ({ ); }; -export const AdminMain = () => { +interface AdminMainProps { + auditSummary?: AuditSummary; +} + +export const AdminMain: FC = ({ auditSummary }) => { const theme = useTheme(); return ( @@ -92,17 +97,12 @@ export const AdminMain = () => { > } /> - } - /> } /> diff --git a/apps/guardian-ui/src/types.tsx b/apps/guardian-ui/src/types.tsx index f66b647a..a75d6831 100644 --- a/apps/guardian-ui/src/types.tsx +++ b/apps/guardian-ui/src/types.tsx @@ -153,3 +153,13 @@ export interface InitializationState { needsAuth: boolean; serverStatus: ServerStatus; } + +export interface ModuleSummary { + net_assets: bigint; +} + +export interface AuditSummary { + // 9,007,199,254,740,991 milli sats is the upper limit, or ~9007 bitcoin. Should be good? + net_assets: bigint; + module_summaries: Record; +} diff --git a/docker-compose.yml b/docker-compose.yml index afec8d4a..c064ea2e 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -71,6 +71,8 @@ services: - '18184:18184' volumes: - ./fm_2/data:/data + depends_on: + - bitcoind # gatewayd_2: # image: fedimint/gatewayd:master @@ -92,6 +94,8 @@ services: - '18185:18185' volumes: - ./fm_3/data:/data + depends_on: + - bitcoind fedimintd_4: image: fedimint/fedimintd:v0.1.0-rc3 @@ -107,6 +111,8 @@ services: - '18186:18186' volumes: - ./fm_4/data:/data + depends_on: + - bitcoind bitcoind: image: btcpayserver/bitcoin:24.1