-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
APIs for GovAction in Dbsync #78
Comments
|
Return type for type VoteRecord = {
voter: {
role: string
credential: string
hasScript: boolean
votingPower?: string
}
vote: string
createdAt: {
time: string
block: number
blockHash: string
epoch: number
slot: number
tx: string
index: number
}
} |
Sample response for {
"drep": {
"yes": 6,
"no": 2,
"abstain": 2
},
"pool": {
"yes": 0,
"no": 1,
"abstain": 0
},
"cc": {
"yes": 0,
"no": 0,
"abstain": 0
}
} |
TODO:
|
WITH govAction AS (
SELECT g.id, b.epoch_no AS submittedEpoch, g.expiration AS expirationEpoch
FROM gov_action_proposal g
JOIN tx ON tx.id = g.tx_id
JOIN block b ON b.id = tx.block_id
WHERE tx.hash = DECODE('f72fb9e4438d7075d3ccd15d6c2ef743016125fef25a46ce63e48ac8bc29172c', 'hex')
AND g.index = 0
),
rankedVotes AS (
SELECT DISTINCT ON (COALESCE(vp.drep_voter, vp.pool_voter, vp.committee_voter))
vp.id, vp.vote, vp.voter_role, vp.drep_voter, vp.pool_voter, vp.committee_voter, vp.gov_action_proposal_id
FROM voting_procedure vp
JOIN govAction ON vp.gov_action_proposal_id = govAction.id
ORDER BY COALESCE(vp.drep_voter, vp.pool_voter, vp.committee_voter), vp.id DESC
),
latestOrGovActionExpiration AS (
SELECT LEAST (
(SELECT e.no FROM epoch e ORDER BY e.id DESC LIMIT 1),
(SELECT g.expirationEpoch FROM govAction g)
) AS epoch
),
possibleDrepVoters AS (
WITH drepIds AS (
SELECT DISTINCT dr.hash_id AS drepHash
FROM drep_distr dr
WHERE dr.epoch_no BETWEEN (SELECT submittedEpoch FROM govAction)
AND (SELECT expirationEpoch FROM govAction)
)
SELECT dr.hash_id AS drepHash, dr.amount AS votingPower
FROM drep_distr dr
JOIN drepIds dids ON dr.hash_id = dids.drepHash
WHERE dr.epoch_no = (select epoch from latestOrGovActionExpiration)
),
abstainAndNoConfidenceDreps AS (
SELECT DISTINCT dr.hash_id,
dh.view AS drepType,
COALESCE(
(SELECT dr_inner.amount
FROM drep_distr dr_inner
WHERE dr_inner.hash_id = dr.hash_id
AND dr_inner.epoch_no = (SELECT epoch FROM latestOrGovActionExpiration)
), 0) AS latestVotingPower
FROM drep_distr dr
JOIN drep_hash dh ON dh.id = dr.hash_id
WHERE dr.epoch_no BETWEEN (SELECT submittedEpoch FROM govAction)
AND (SELECT expirationEpoch FROM govAction)
AND dh.view IN ('drep_always_abstain', 'drep_always_no_confidence')
),
drepVoteRecord AS (
SELECT
'Yes' AS vote_type,
COALESCE(SUM(pdv.votingPower) FILTER (WHERE rv.vote::TEXT = 'Yes'), 0) AS totalVotingPower,
COUNT(rv.vote) FILTER (WHERE rv.vote::TEXT = 'Yes') AS voteCount
FROM rankedVotes rv
LEFT JOIN possibleDrepVoters pdv ON rv.drep_voter = pdv.drepHash
WHERE rv.voter_role = 'DRep'
UNION ALL
SELECT
'No' AS vote_type,
COALESCE(SUM(pdv.votingPower) FILTER (WHERE rv.vote::TEXT = 'No'), 0) AS totalVotingPower,
COUNT(rv.vote) FILTER (WHERE rv.vote::TEXT = 'No') AS voteCount
FROM rankedVotes rv
LEFT JOIN possibleDrepVoters pdv ON rv.drep_voter = pdv.drepHash
WHERE rv.voter_role = 'DRep'
UNION ALL
SELECT
'Abstain' AS vote_type,
COALESCE(SUM(pdv.votingPower) FILTER (WHERE rv.vote::TEXT = 'Abstain'), 0) +
COALESCE((SELECT SUM(latestVotingPower) FROM abstainAndNoConfidenceDreps WHERE drepType = 'drep_always_abstain'), 0) AS totalVotingPower,
COUNT(rv.vote) FILTER (WHERE rv.vote::TEXT = 'Abstain') +
COUNT(DISTINCT (SELECT hash_id from abstainAndNoConfidenceDreps WHERE drepType='drep_always_abstain')) AS voteCount
FROM rankedVotes rv
LEFT JOIN possibleDrepVoters pdv ON rv.drep_voter = pdv.drepHash
WHERE rv.voter_role = 'DRep'
UNION ALL
SELECT
'NoConfidence' AS vote_type,
COALESCE((SELECT SUM(latestVotingPower) FROM abstainAndNoConfidenceDreps WHERE drepType = 'drep_always_no_confidence'), 0) AS totalVotingPower,
COUNT(DISTINCT (SELECT hash_id from abstainAndNoConfidenceDreps WHERE drepType='drep_always_no_confidence')) AS voteCount
FROM rankedVotes rv
LEFT JOIN possibleDrepVoters pdv ON rv.drep_voter = pdv.drepHash
WHERE rv.voter_role = 'DRep'
)
SELECT * FROM drepVoteRecord; |
Current progress is this WITH ga AS (
SELECT g.id, b.epoch_no AS submittedEpoch, g.expiration AS expirationEpoch
FROM gov_action_proposal g
JOIN tx ON tx.id = g.tx_id
JOIN block b ON b.id = tx.block_id
WHERE tx.hash = DECODE('8c653ee5c9800e6d31e79b5a7f7d4400c81d44717ad4db633dc18d4c07e4a4fd', 'hex')
AND g.index = 0
),
govActionVotes AS (select rv.voter_role,rv.vote,rv.drep_voter,rv.committee_voter,rv.pool_voter from (
SELECT
vp.*,
t.hash as tx_hash,
b.block_no as block_no,
ROW_NUMBER() OVER (PARTITION BY vp.voter_role, COALESCE(vp.drep_voter, vp.pool_voter, vp.committee_voter) ORDER BY t.block_id DESC) AS rn
FROM voting_procedure vp
JOIN ga on vp.gov_action_proposal_id = ga.id
JOIN public.tx t ON t.id = vp.tx_id
JOIN public.block b ON b.id = t.block_id
and vp.invalid is null
) rv where rn=1),
latestOrGovActionExpiration AS (
SELECT LEAST (
(SELECT e.no FROM epoch e ORDER BY e.id DESC LIMIT 1),
(SELECT g.expirationEpoch FROM ga g)
) AS epoch
),
epochDreps AS (
select * from drep_distr ddr
WHERE ddr.epoch_no = (select epoch from latestOrGovActionExpiration)
),
abstainAndNoConfidenceDreps AS (
SELECT DISTINCT dr.hash_id,
dh.view AS drepType,
COALESCE(
(SELECT dr_inner.amount
FROM drep_distr dr_inner
WHERE dr_inner.hash_id = dr.hash_id
AND dr_inner.epoch_no = (SELECT epoch FROM latestOrGovActionExpiration)
), 0) AS latestVotingPower
FROM drep_distr dr
JOIN drep_hash dh ON dh.id = dr.hash_id
WHERE dr.epoch_no BETWEEN (SELECT submittedEpoch FROM ga)
AND (SELECT expirationEpoch FROM ga)
AND dh.view IN ('drep_always_abstain', 'drep_always_no_confidence')
),
inactiveDreps as (select sum(amount) amnt from epochDreps
left join govActionVotes on govActionVotes.drep_voter = epochDreps.hash_id
where active_until > (select expirationEpoch from ga)
and govActionVotes.voter_role is null
),
votePowers as (select govActionVotes.vote,sum(epochDreps.amount) power
from govActionVotes
join epochDreps on epochDreps.hash_id = govActionVotes.drep_voter
group by govActionVotes.vote)
(select text(votePowers.vote),votePowers.power from votePowers
union
select drep_hash.view,epochDreps.amount
from drep_hash
join epochDreps on drep_hash.id = epochDreps.hash_id
where drep_hash.view in ('drep_always_abstain', 'drep_always_no_confidence')
union (select 'total_distribution' ,(select sum(amount) from epochDreps))
union (select 'inactive_votes', (select amnt from inactiveDreps))
); |
WITH ga AS (
SELECT
g.id,
b.epoch_no AS submittedEpoch,
g.expiration AS expirationEpoch
FROM gov_action_proposal g
JOIN tx ON tx.id = g.tx_id
JOIN block b ON b.id = tx.block_id
WHERE tx.hash = DECODE(
'f72fb9e4438d7075d3ccd15d6c2ef743016125fef25a46ce63e48ac8bc29172c', 'hex'
)
AND g.index = 0
),
govActionVotes AS (
SELECT
rv.voter_role,
rv.vote,
rv.drep_voter,
rv.committee_voter,
rv.pool_voter
FROM (
SELECT
vp.*,
t.hash AS tx_hash,
b.block_no AS block_no,
ROW_NUMBER() OVER (
PARTITION BY vp.voter_role,
COALESCE(vp.drep_voter, vp.pool_voter, vp.committee_voter)
ORDER BY t.block_id DESC
) AS rn
FROM voting_procedure vp
JOIN ga ON vp.gov_action_proposal_id = ga.id
JOIN public.tx t ON t.id = vp.tx_id
JOIN public.block b ON b.id = t.block_id
WHERE vp.invalid IS NULL
) rv
WHERE rn = 1
),
latestOrGovActionExpiration AS (
SELECT LEAST(
(SELECT e.no FROM epoch e ORDER BY e.id DESC LIMIT 1),
(SELECT g.expirationEpoch FROM ga g)
) AS epoch
),
poolVoteRecord AS (
WITH RankedPoolVotes AS (
SELECT
*,
ROW_NUMBER() OVER (PARTITION BY vp.pool_voter ORDER BY vp.tx_id DESC) AS rn
FROM
voting_procedure vp
),
PoolVotes AS (
SELECT
rpv.gov_action_proposal_id,
ps.epoch_no,
COUNT(DISTINCT CASE WHEN vote = 'Yes' THEN rpv.pool_voter ELSE 0 END) AS total_unique_yes_votes,
COUNT(DISTINCT CASE WHEN vote = 'No' THEN rpv.pool_voter ELSE 0 END) AS total_unique_no_votes,
COUNT(DISTINCT CASE WHEN vote = 'Abstain' THEN rpv.pool_voter ELSE 0 END) AS total_unique_abstain_votes,
SUM(CASE WHEN rpv.vote = 'Yes' THEN ps.voting_power ELSE 0 END) AS poolYesVotingPower,
SUM(CASE WHEN rpv.vote = 'No' THEN ps.voting_power ELSE 0 END) AS poolNoVotingPower,
SUM(CASE WHEN rpv.vote = 'Abstain' THEN ps.voting_power ELSE 0 END) AS poolAbstainVotingPower
FROM
RankedPoolVotes rpv
JOIN
pool_stat ps
ON rpv.pool_voter = ps.pool_hash_id
JOIN ga
ON ga.id = rpv.gov_action_proposal_id
WHERE
rpv.rn = 1 AND ps.epoch_no = (SELECT MAX(no) FROM epoch)
GROUP BY
rpv.gov_action_proposal_id, ps.epoch_no
) select * from poolVotes
),
committeeVoteRecord AS (
WITH CommitteeVotes AS (
SELECT
gov_action_proposal_id,
SUM(CASE WHEN vote = 'Yes' THEN 1 ELSE 0 END) AS ccYesVotes,
SUM(CASE WHEN vote = 'No' THEN 1 ELSE 0 END) AS ccNoVotes,
SUM(CASE WHEN vote = 'Abstain' THEN 1 ELSE 0 END) AS ccAbstainVotes
FROM
voting_procedure AS vp
JOIN ga on ga.id = vp.gov_action_proposal_id
WHERE
vp.committee_voter IS NOT NULL
AND (vp.tx_id, vp.committee_voter, vp.gov_action_proposal_id) IN (
SELECT MAX(tx_id), committee_voter, gov_action_proposal_id
FROM voting_procedure
WHERE committee_voter IS NOT NULL
GROUP BY committee_voter, gov_action_proposal_id
)
GROUP BY
gov_action_proposal_id
) select * from CommitteeVotes
),
dRepVoteRecord AS(
WITH epochDreps AS (
SELECT *
FROM drep_distr ddr
WHERE ddr.epoch_no = (SELECT epoch FROM latestOrGovActionExpiration)
),
abstainAndNoConfidenceDreps AS (
SELECT DISTINCT
dr.hash_id,
dh.view AS drepType,
COALESCE(
(SELECT dr_inner.amount
FROM drep_distr dr_inner
WHERE dr_inner.hash_id = dr.hash_id
AND dr_inner.epoch_no = (SELECT epoch FROM latestOrGovActionExpiration)
), 0
) AS latestVotingPower
FROM drep_distr dr
JOIN drep_hash dh ON dh.id = dr.hash_id
WHERE dr.epoch_no BETWEEN (SELECT submittedEpoch FROM ga)
AND (SELECT expirationEpoch FROM ga)
AND dh.view IN ('drep_always_abstain', 'drep_always_no_confidence')
),
inactiveDreps AS (
SELECT SUM(amount) AS amnt,
epochDreps.hash_id as dreps
FROM epochDreps
LEFT JOIN govActionVotes ON govActionVotes.drep_voter = epochDreps.hash_id
WHERE active_until > (SELECT expirationEpoch FROM ga)
AND govActionVotes.voter_role IS NULL
GROUP BY epochDreps.hash_id
),
votePowers AS (
SELECT
govActionVotes.vote,
SUM(epochDreps.amount) AS power,
COUNT(DISTINCT epochDreps.hash_id) AS count
FROM govActionVotes
JOIN epochDreps ON epochDreps.hash_id = govActionVotes.drep_voter
GROUP BY govActionVotes.vote
)
SELECT
text(votePowers.vote),
votePowers.power,
votePowers.count
FROM votePowers
UNION
SELECT
drep_hash.view,
SUM(epochDreps.amount),
COUNT (DISTINCT drep_hash.id)
FROM drep_hash
JOIN epochDreps ON drep_hash.id = epochDreps.hash_id
WHERE drep_hash.view IN ('drep_always_abstain')
GROUP BY drep_hash.view
UNION
SELECT
drep_hash.view,
SUM(epochDreps.amount),
COUNT (DISTINCT drep_hash.id)
FROM drep_hash
JOIN epochDreps ON drep_hash.id = epochDreps.hash_id
WHERE drep_hash.view IN ('drep_always_no_confidence')
GROUP BY drep_hash.view
UNION
SELECT
'total_distribution',
(SELECT SUM(amount) FROM epochDreps),
(SELECT COUNT(DISTINCT hash_id) from epochDreps)
UNION
SELECT
'inactive_votes',
(SELECT SUM(amnt) FROM inactiveDreps),
(SELECT COUNT(DISTINCT dreps) from inactiveDreps)
)
SELECT jsonb_build_object(
'drepVoteRecord', (SELECT jsonb_agg(dRepVoteRecord) FROM dRepVoteRecord),
'spoVoteRecord', (SELECT jsonb_agg(poolVoteRecord) FROM poolVoteRecord),
'ccVoteRecord', (SELECT jsonb_agg(committeeVoteRecord) FROM committeeVoteRecord)
) AS result; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
/api/proposals?include-vote-count=false/true (default false)
/api/proposals/${id}?include-vote-count=false/true (default false)
/api/propopsals/${id}/vote-count
/api/proposals/${id}/votes
in response include a field
Indexer Service:
Add a module
govActionIndexer
. It will listen to all the proposals.Add a module
govActionVotes
. It will listen and index all govActionVotes.Reference query
The text was updated successfully, but these errors were encountered: