@@ -868,3 +868,43 @@ async def m025_add_amounts_to_keysets(db: Database):
868868 await conn .execute (
869869 f"UPDATE { db .table_with_schema ('keysets' )} SET amounts = '[]'"
870870 )
871+
872+
873+ async def m026_keyset_specific_balance_views (db : Database ):
874+ async with db .connect () as conn :
875+ await drop_balance_views (db , conn )
876+ await conn .execute (
877+ f"""
878+ CREATE VIEW { db .table_with_schema ('balance_issued' )} AS
879+ SELECT id AS keyset, COALESCE(s, 0) AS balance FROM (
880+ SELECT id, SUM(amount) AS s
881+ FROM { db .table_with_schema ('promises' )}
882+ WHERE amount > 0
883+ GROUP BY id
884+ );
885+ """
886+ )
887+ await conn .execute (
888+ f"""
889+ CREATE VIEW { db .table_with_schema ('balance_redeemed' )} AS
890+ SELECT id AS keyset, COALESCE(s, 0) AS balance FROM (
891+ SELECT id, SUM(amount) AS s
892+ FROM { db .table_with_schema ('proofs_used' )}
893+ WHERE amount > 0
894+ GROUP BY id
895+ );
896+ """
897+ )
898+ await conn .execute (
899+ f"""
900+ CREATE VIEW { db .table_with_schema ('balance' )} AS
901+ SELECT keyset, s_issued - s_used AS balance FROM (
902+ SELECT bi.keyset AS keyset,
903+ bi.balance AS s_issued,
904+ COALESCE(bu.balance, 0) AS s_used
905+ FROM { db .table_with_schema ('balance_issued' )} bi
906+ LEFT OUTER JOIN { db .table_with_schema ('balance_redeemed' )} bu
907+ ON bi.keyset = bu.keyset
908+ );
909+ """
910+ )
0 commit comments