From 86a9e56ee448eab402415407fc42b5cc8328cc7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Sza=C5=82owski?= Date: Thu, 23 Jan 2025 16:16:08 +0100 Subject: [PATCH 1/2] hotfix: 500 on ada-holder/stake key voting power --- .../sql/get-stake-key-voting-power.sql | 49 ++++++++++++++++--- 1 file changed, 41 insertions(+), 8 deletions(-) diff --git a/govtool/backend/sql/get-stake-key-voting-power.sql b/govtool/backend/sql/get-stake-key-voting-power.sql index 5e178b245..a6cdbfe43 100644 --- a/govtool/backend/sql/get-stake-key-voting-power.sql +++ b/govtool/backend/sql/get-stake-key-voting-power.sql @@ -1,13 +1,46 @@ +WITH RewardRest AS ( + SELECT + SUM(amount) AS amount, + addr_id + FROM + reward_rest + GROUP BY + addr_id +), +Reward AS ( + SELECT + SUM(amount) AS amount, + addr_id + FROM + reward + GROUP BY + addr_id +), +Balance AS ( + SELECT + COALESCE(SUM(uv.value), 0) AS amount, + sa.id AS addr_id, + encode(sa.hash_raw, 'hex') AS addr_raw + FROM + stake_address sa + JOIN utxo_view uv ON uv.stake_address_id = sa.id + GROUP BY + addr_id, + addr_raw +) SELECT - COALESCE(SUM(tx_out.value), 0) AS voting_power, - stake_address.id as addr_id + (COALESCE(rr.amount, 0) + COALESCE(r.amount, 0) + COALESCE(b.amount, 0)) AS total_balance, + b.addr_raw FROM - stake_address -JOIN - tx_out on tx_out.stake_address_id = stake_address.id + Balance b LEFT JOIN - tx_in ON tx_in.tx_out_id = tx_out.id AND tx_in.tx_out_index = tx_out.index + RewardRest rr ON rr.addr_id = b.addr_id +LEFT JOIN + Reward r ON r.addr_id = rr.addr_id WHERE - stake_address.hash_raw = decode(?, 'hex') AND tx_in.id IS NULL + b.addr_id = (SELECT id FROM stake_address WHERE hash_raw = decode(?, 'hex')) GROUP BY - stake_address.id; \ No newline at end of file + b.addr_raw, + rr.amount, + r.amount, + b.amount \ No newline at end of file From b62ca9f7f9eb74936fd26f8cff936f29ce0dff40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Sza=C5=82owski?= Date: Thu, 23 Jan 2025 21:18:58 +0100 Subject: [PATCH 2/2] hotfix: handle type mismatch between haskell and sql result --- CHANGELOG.md | 1 + govtool/backend/app/Main.hs | 15 ++++++++------- .../backend/sql/get-stake-key-voting-power.sql | 2 +- govtool/backend/src/VVA/AdaHolder.hs | 2 +- 4 files changed, 11 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9a1ff8810..33361cc39 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -38,6 +38,7 @@ changes. - Fix usage of trim on missing label - Fix blank screen when registering as a DRep [Issue 2408](https://github.com/IntersectMBO/govtool/issues/2408) +- Fix type mismatch between sql and haskell code for stake key address ### Changed diff --git a/govtool/backend/app/Main.hs b/govtool/backend/app/Main.hs index 9accf102d..3222798d1 100644 --- a/govtool/backend/app/Main.hs +++ b/govtool/backend/app/Main.hs @@ -144,10 +144,6 @@ startApp vvaConfig sentryService = do exceptionHandler :: VVAConfig -> SentryService -> Maybe Request -> SomeException -> IO () exceptionHandler vvaConfig sentryService mRequest exception = do - print exception - -- These are not considered application errors - -- They represent the client closing the connection prematurely - -- or the timeout thread being killed by WARP let isNotTimeoutThread x = case fromException x of Just TimeoutThread -> False _ -> True @@ -160,13 +156,18 @@ exceptionHandler vvaConfig sentryService mRequest exception = do Nothing -> True isNotThreadKilledByTimeoutManager x = "Thread killed by timeout manager" `notElem` lines (show x) - shouldSkipError = + isNotUserErrorMzero x = case fromException x of + Just ioe -> not ("user error (mzero)" `isInfixOf` show (ioe :: IOException)) + _ -> True + + isGuardException = isNotTimeoutThread exception && isNotConnectionClosedByPeer exception && isNotClientClosedConnection exception && - isNotThreadKilledByTimeoutManager exception + isNotThreadKilledByTimeoutManager exception && + isNotUserErrorMzero exception - guard shouldSkipError + guard isGuardException let env = sentryEnv vvaConfig case mRequest of diff --git a/govtool/backend/sql/get-stake-key-voting-power.sql b/govtool/backend/sql/get-stake-key-voting-power.sql index a6cdbfe43..0e604ccf6 100644 --- a/govtool/backend/sql/get-stake-key-voting-power.sql +++ b/govtool/backend/sql/get-stake-key-voting-power.sql @@ -30,7 +30,7 @@ Balance AS ( ) SELECT (COALESCE(rr.amount, 0) + COALESCE(r.amount, 0) + COALESCE(b.amount, 0)) AS total_balance, - b.addr_raw + b.addr_raw::text AS stake_address FROM Balance b LEFT JOIN diff --git a/govtool/backend/src/VVA/AdaHolder.hs b/govtool/backend/src/VVA/AdaHolder.hs index 6a2ac3c33..0e49176c7 100644 --- a/govtool/backend/src/VVA/AdaHolder.hs +++ b/govtool/backend/src/VVA/AdaHolder.hs @@ -51,7 +51,7 @@ getStakeKeyVotingPower :: Text -> m Integer getStakeKeyVotingPower stakeKey = withPool $ \conn -> do - result <- liftIO $ SQL.query @_ @(Scientific, Text) conn getVotingPowerSql (SQL.Only stakeKey) + result <- liftIO $ SQL.query @_ @(Scientific, ByteString) conn getVotingPowerSql (SQL.Only stakeKey) case result of [(votingPower,_)] -> return $ floor votingPower _ -> do