diff --git a/packages/namada/Namada.ts b/packages/namada/Namada.ts index a2642abb5e..0e5e43f448 100644 --- a/packages/namada/Namada.ts +++ b/packages/namada/Namada.ts @@ -29,4 +29,3 @@ export function mainnet (...args: never) { ) } export type { Validator } from './NamadaPoS' -export type Epoch = number|bigint|string diff --git a/packages/namada/NamadaChain.ts b/packages/namada/NamadaChain.ts index 148e875840..419d060ed4 100644 --- a/packages/namada/NamadaChain.ts +++ b/packages/namada/NamadaChain.ts @@ -148,6 +148,12 @@ export default class NamadaChain extends CW.Chain { fetchProposalInfo (id: number|bigint) { return this.getConnection().fetchProposalInfoImpl(id) } + fetchProposalVotes (id: number|bigint) { + return this.getConnection().fetchProposalVotesImpl(id) + } + fetchProposalResult (id: number|bigint) { + return this.getConnection().fetchProposalResultImpl(id) + } fetchProposalWasm (id: number|bigint) { return this.getConnection().fetchProposalWasmImpl(id) } diff --git a/packages/namada/NamadaConnection.ts b/packages/namada/NamadaConnection.ts index e77268a754..02b0491e4f 100644 --- a/packages/namada/NamadaConnection.ts +++ b/packages/namada/NamadaConnection.ts @@ -86,6 +86,12 @@ export default class NamadaConnection extends CW.Connection { fetchProposalInfoImpl (id: number|bigint) { return Gov.fetchProposalInfo(this, id) } + fetchProposalVotesImpl (id: number|bigint) { + return Gov.fetchProposalVotes(this, id) + } + fetchProposalResultImpl (id: number|bigint) { + return Gov.fetchProposalResult(this, id) + } fetchProposalWasmImpl (id: number|bigint) { return Gov.fetchProposalWasm(this, id) } @@ -100,7 +106,7 @@ export default class NamadaConnection extends CW.Connection { return PGF.fetchPGFFundings(this) } isPGFStewardImpl (address: string) { - return PGF.isPGFSteward(this) + return PGF.isPGFSteward(this, address) } fetchStakingParametersImpl () { @@ -109,11 +115,11 @@ export default class NamadaConnection extends CW.Connection { fetchValidatorAddressesImpl () { return PoS.fetchValidatorAddresses(this) } - fetchValidatorImpl (address: string, options?: { epoch?: Epoch }) { + fetchValidatorImpl (address: string, options?: { epoch?: Epoch.Epoch }) { return PoS.fetchValidator(this, address, options) } fetchValidatorsImpl (options?: { - epoch?: string|number|bigint, + epoch?: Epoch.Epoch, details?: boolean, pagination?: [number, number] allStates?: boolean, @@ -123,7 +129,10 @@ export default class NamadaConnection extends CW.Connection { }) { return PoS.fetchValidators(this, options) } - fetchValidatorsIterImpl (options?: { parallel?: boolean }) { + fetchValidatorsIterImpl (options?: { + epoch?: Epoch.Epoch, + parallel?: boolean + }) { return PoS.fetchValidatorsIter(this, options) } fetchValidatorsConsensusImpl () { diff --git a/packages/namada/NamadaEpoch.ts b/packages/namada/NamadaEpoch.ts index 36aba87258..e31621a07f 100644 --- a/packages/namada/NamadaEpoch.ts +++ b/packages/namada/NamadaEpoch.ts @@ -2,6 +2,8 @@ import { decode, u64 } from '@hackbg/borshest' import type { Decode } from './NamadaDecode' import type NamadaConnection from './NamadaConnection' +export type Epoch = number|bigint|string + export async function fetchEpoch ( connection: Pick, height?: number|bigint diff --git a/packages/namada/NamadaGov.ts b/packages/namada/NamadaGov.ts index 62f6bf14ee..0303138486 100644 --- a/packages/namada/NamadaGov.ts +++ b/packages/namada/NamadaGov.ts @@ -1,42 +1,59 @@ -import { assign } from '@hackbg/fadroma' -import type { Address } from '@hackbg/fadroma' import { decode, u64 } from '@hackbg/borshest' -import type Connection from './NamadaConnection' +import type NamadaConnection from './NamadaConnection' import type { NamadaDecoder } from './NamadaDecode' export type Params = Awaited> -export async function fetchGovernanceParameters (connection: Pick) { +type Connection = Pick + +export const INTERNAL_ADDRESS = "tnam1q5qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqrw33g6" + +export async function fetchGovernanceParameters ( + connection: Connection +) { const binary = await connection.abciQuery(`/vp/governance/parameters`) return connection.decode.gov_parameters(binary) } -export async function fetchProposalCount (connection: Pick) { +export async function fetchProposalCount ( + connection: Connection +) { const binary = await connection.abciQuery(`/shell/value/#${INTERNAL_ADDRESS}/counter`) return decode(u64, binary) as bigint } export async function fetchProposalInfo ( - connection: Pick, id: number|bigint -): Promise { - const proposalResponse = await connection.abciQuery(`/vp/governance/proposal/${id}`) - if (proposalResponse[0] === 0) return null - const [ votesResponse, resultResponse ] = await Promise.all([ - `/vp/governance/proposal/${id}/votes`, - `/vp/governance/stored_proposal_result/${id}`, - ].map(x=>connection.abciQuery(x))) - const proposal = connection.decode.gov_proposal(proposalResponse.slice(1)) as - ReturnType - const votes = connection.decode.gov_votes(votesResponse) as - ReturnType - const result = (resultResponse[0] === 0) ? null - : decodeResultResponse(connection.decode.gov_result(resultResponse.slice(1)) as - Required>) - return { id: BigInt(id), proposal, votes, result } + connection: Connection, id: number|bigint +): Promise|null> { + const query = `/vp/governance/proposal/${id}` + const response = await connection.abciQuery(query) + if (response[0] === 0) return null + const decoded = connection.decode.gov_proposal(response.slice(1)) + return decoded as ReturnType +} + +export async function fetchProposalVotes ( + connection: Connection, id: number|bigint +): Promise> { + const query = `/vp/governance/proposal/${id}/votes` + const response = await connection.abciQuery(query) + const decoded = connection.decode.gov_votes(response) + return decoded as ReturnType +} + +export async function fetchProposalResult ( + connection: Connection, id: number|bigint +): Promise { + const query = `/vp/governance/stored_proposal_result/${id}` + const response = await connection.abciQuery(query) + if (response[0] === 0) return null + const decoded = connection.decode.gov_result(response.slice(1)) + const results = decodeResultResponse(decoded as Required) + return results as NamadaGovernanceProposalResult } export async function fetchProposalWasm ( - connection: Pick, id: number|bigint + connection: Connection, id: number|bigint ): Promise { id = BigInt(id) const codeKey = connection.decode.gov_proposal_code_key(BigInt(id)) @@ -70,9 +87,6 @@ const decodeResultResponse = ( abstainPercent: (turnout > 0) ? percent(decoded.totalAbstainPower!, turnout) : '0', }) -export const INTERNAL_ADDRESS = - "tnam1q5qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqrw33g6" - interface NamadaGovernanceProposal { readonly id: bigint readonly proposal: ReturnType @@ -102,10 +116,12 @@ interface NamadaGovernanceProposalResult { const percent = (a: string|number|bigint, b: string|number|bigint) => ((Number(BigInt(a) * 1000000n / BigInt(b)) / 10000).toFixed(2) + '%') + const percent2 = (a: string|number|bigint, b: string|number|bigint) => ((Number(BigInt(a) * 1000000n / BigInt(b)) / 1000000).toFixed(2) + '%') -export { +export type { NamadaGovernanceProposal as Proposal, + NamadaGovernanceProposalWasm as ProposalWasm, NamadaGovernanceProposalResult as ProposalResult, } diff --git a/packages/namada/NamadaPGF.ts b/packages/namada/NamadaPGF.ts index 773344e890..56fb8a6995 100644 --- a/packages/namada/NamadaPGF.ts +++ b/packages/namada/NamadaPGF.ts @@ -1,21 +1,22 @@ -import { assign } from '@hackbg/fadroma' import type NamadaConnection from './NamadaConnection' export type Params = Awaited> -export async function fetchPGFParameters (connection: Pick) { +type Connection = Pick + +export async function fetchPGFParameters (connection: Connection) { const binary = await connection.abciQuery(`/vp/pgf/parameters`) return connection.decode.pgf_parameters(binary) } -export async function fetchPGFStewards (connection: Pick) { +export async function fetchPGFStewards (connection: Connection) { throw new Error("not implemented") } -export async function fetchPGFFundings (connection: Pick) { +export async function fetchPGFFundings (connection: Connection) { throw new Error("not implemented") } -export async function isPGFSteward (connection: Pick) { +export async function isPGFSteward (connection: Connection, address: string) { throw new Error("not implemented") }