diff --git a/apps/playground/src/pages/providers/fetchers/fetch-proposals.tsx b/apps/playground/src/pages/providers/fetchers/fetch-proposals.tsx new file mode 100644 index 000000000..9f9ff6ea3 --- /dev/null +++ b/apps/playground/src/pages/providers/fetchers/fetch-proposals.tsx @@ -0,0 +1,96 @@ +import { useState } from "react"; + +import Input from "~/components/form/input"; +import InputTable from "~/components/sections/input-table"; +import LiveCodeDemo from "~/components/sections/live-code-demo"; +import TwoColumnsScroll from "~/components/sections/two-columns-scroll"; +import Codeblock from "~/components/text/codeblock"; +import { SupportedFetchers } from "."; + +export default function FetcherProposalInfo({ + blockchainProvider, + provider, +}: { + blockchainProvider: SupportedFetchers; + provider: string; +}) { + const [userInput, setUserInput] = useState( + "372d688faa77e146798b581b322c0f2981a9023764736ade5d12e0e4e796af8c", + ); + const [userInput2, setUserInput2] = useState("0"); + + return ( + + ); +} + +function Left(userInput: string, userInput2: string) { + return ( + <> +

+ Get information for a given governance proposal, identified by the + txHash and proposal index +

+ + + ); +} + +function Right( + blockchainProvider: SupportedFetchers, + userInput: string, + setUserInput: (value: string) => void, + userInput2: string, + setUserInput2: (value: string) => void, + provider: string, +) { + async function runDemo() { + return await blockchainProvider.fetchGovernanceProposal( + userInput, + Number(userInput2), + ); + } + + return ( + + setUserInput(e.target.value)} + placeholder="TxHash" + label="TxHash" + key={0} + />, + setUserInput2(e.target.value)} + placeholder="e.g. 0" + label="CertIndex" + key={1} + />, + ]} + /> + + ); +} diff --git a/apps/playground/src/pages/providers/fetchers/index.tsx b/apps/playground/src/pages/providers/fetchers/index.tsx index 9c5846046..f177a5c51 100644 --- a/apps/playground/src/pages/providers/fetchers/index.tsx +++ b/apps/playground/src/pages/providers/fetchers/index.tsx @@ -2,9 +2,9 @@ import { BlockfrostProvider, KoiosProvider, MaestroProvider, + OfflineFetcher, U5CProvider, YaciProvider, - OfflineFetcher } from "@meshsdk/core"; import FetcherAccountInfo from "./fetch-account-info"; @@ -16,10 +16,11 @@ import FetcherBlockInfo from "./fetch-block-info"; import FetcherCollectionAssets from "./fetch-collection-assets"; import FetcherHandle from "./fetch-handle"; import FetcherHandleAddress from "./fetch-handle-address"; +import FetcherProposalInfo from "./fetch-proposals"; import FetcherProtocolParameters from "./fetch-protocol-parameters"; import FetcherTransactionInfo from "./fetch-transaction-info"; -import FetcherGet from "./get"; import FetcherUtxos from "./fetch-utxos"; +import FetcherGet from "./get"; export default function ProviderFetchers({ blockchainProvider, @@ -80,6 +81,10 @@ export default function ProviderFetchers({ blockchainProvider={blockchainProvider} provider={provider} /> + ); } diff --git a/package-lock.json b/package-lock.json index f9ebc54c2..dc9f4a5b7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18171,7 +18171,6 @@ "version": "3.9.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "dev": true, "funding": [ { "type": "github", diff --git a/packages/mesh-common/src/data/mesh/credentials.ts b/packages/mesh-common/src/data/mesh/credentials.ts index f61a2120f..75ecd43bc 100644 --- a/packages/mesh-common/src/data/mesh/credentials.ts +++ b/packages/mesh-common/src/data/mesh/credentials.ts @@ -53,7 +53,7 @@ export const mPubKeyAddress = ( bytes: string, stakeCredential?: string, isStakeScriptCredential = false, -): Data => +): MPubKeyAddress => mConStr0([ { alternative: 0, fields: [bytes] }, mMaybeStakingHash(stakeCredential || "", isStakeScriptCredential), @@ -70,7 +70,7 @@ export const mScriptAddress = ( bytes: string, stakeCredential?: string, isStakeScriptCredential = false, -): Data => +): MScriptAddress => mConStr0([ { alternative: 1, fields: [bytes] }, mMaybeStakingHash(stakeCredential || "", isStakeScriptCredential), diff --git a/packages/mesh-common/src/interfaces/fetcher.ts b/packages/mesh-common/src/interfaces/fetcher.ts index 26327c716..87e1a8660 100644 --- a/packages/mesh-common/src/interfaces/fetcher.ts +++ b/packages/mesh-common/src/interfaces/fetcher.ts @@ -7,6 +7,7 @@ import type { TransactionInfo, UTxO, } from "../types"; +import { GovernanceProposalInfo } from "../types/governance"; /** * Fetcher interface defines end points to query blockchain data. @@ -28,5 +29,9 @@ export interface IFetcher { fetchProtocolParameters(epoch: number): Promise; fetchTxInfo(hash: string): Promise; fetchUTxOs(hash: string, index?: number): Promise; + fetchGovernanceProposal( + txHash: string, + certIndex: number, + ): Promise; get(url: string): Promise; } diff --git a/packages/mesh-common/src/types/governance.ts b/packages/mesh-common/src/types/governance.ts new file mode 100644 index 000000000..73eb834aa --- /dev/null +++ b/packages/mesh-common/src/types/governance.ts @@ -0,0 +1,14 @@ +export type GovernanceProposalInfo = { + txHash: string; + certIndex: number; + governanceType: string; + deposit: number; + returnAddress: string; + governanceDescription: string; + ratifiedEpoch: number; + enactedEpoch: number; + droppedEpoch: number; + expiredEpoch: number; + expiration: number; + metadata: object; +}; diff --git a/packages/mesh-common/src/types/index.ts b/packages/mesh-common/src/types/index.ts index 046594d1c..d3ce1606d 100644 --- a/packages/mesh-common/src/types/index.ts +++ b/packages/mesh-common/src/types/index.ts @@ -23,3 +23,4 @@ export * from "./wallet"; export * from "./transaction-builder"; export * from "./deserialized"; export * from "./blueprint"; +export * from "./governance"; diff --git a/packages/mesh-provider/src/blockfrost.ts b/packages/mesh-provider/src/blockfrost.ts index 9c77b2c86..7971641cb 100644 --- a/packages/mesh-provider/src/blockfrost.ts +++ b/packages/mesh-provider/src/blockfrost.ts @@ -8,6 +8,7 @@ import { BlockInfo, castProtocol, fromUTF8, + GovernanceProposalInfo, IEvaluator, IFetcher, IListener, @@ -507,6 +508,39 @@ export class BlockfrostProvider } } + async fetchGovernanceProposal( + txHash: string, + certIndex: number, + ): Promise { + try { + const { data, status } = await this._axiosInstance.get( + `governance/proposals/${txHash}/${certIndex}`, + ); + if (status === 200 || status == 202) + return { + txHash: data.tx_hash, + certIndex: data.cert_index, + governanceType: data.governance_type, + deposit: data.deposit, + returnAddress: data.return_address, + governanceDescription: data.governance_description, + ratifiedEpoch: data.ratified_epoch, + enactedEpoch: data.enacted_epoch, + droppedEpoch: data.dropped_epoch, + expiredEpoch: data.expired_epoch, + expiration: data.expiration, + metadata: ( + await this._axiosInstance.get( + `governance/proposals/${txHash}/${certIndex}/metadata`, + ) + ).data, + }; + throw parseHttpError(data); + } catch (error) { + throw parseHttpError(error); + } + } + /** * A generic method to fetch data from a URL. * @param url - The URL to fetch data from diff --git a/packages/mesh-provider/src/koios.ts b/packages/mesh-provider/src/koios.ts index b89ef04b0..e3ef4bca2 100644 --- a/packages/mesh-provider/src/koios.ts +++ b/packages/mesh-provider/src/koios.ts @@ -7,6 +7,7 @@ import { BlockInfo, castProtocol, fromUTF8, + GovernanceProposalInfo, IFetcher, IListener, ISubmitter, @@ -385,6 +386,10 @@ export class KoiosProvider implements IFetcher, IListener, ISubmitter { } } + async fetchGovernanceProposal(txHash: string, certIndex: number): Promise { + throw new Error("Method not implemented"); + } + /** * A generic method to fetch data from a URL. * @param url - The URL to fetch data from diff --git a/packages/mesh-provider/src/maestro.ts b/packages/mesh-provider/src/maestro.ts index b8dd1dfe3..ff0baa5b4 100644 --- a/packages/mesh-provider/src/maestro.ts +++ b/packages/mesh-provider/src/maestro.ts @@ -8,6 +8,7 @@ import { BlockInfo, castProtocol, fromUTF8, + GovernanceProposalInfo, IEvaluator, IFetcher, IListener, @@ -442,6 +443,10 @@ export class MaestroProvider } } + async fetchGovernanceProposal(txHash: string, certIndex: number): Promise { + throw new Error("Method not implemented by Maestro"); + } + async get(url: string): Promise { try { const { data, status } = await this._axiosInstance.get(url); diff --git a/packages/mesh-provider/src/offline/offline-fetcher.ts b/packages/mesh-provider/src/offline/offline-fetcher.ts index 072a5ed26..35c257519 100644 --- a/packages/mesh-provider/src/offline/offline-fetcher.ts +++ b/packages/mesh-provider/src/offline/offline-fetcher.ts @@ -288,6 +288,10 @@ export class OfflineFetcher implements IFetcher { return utxos; } + async fetchGovernanceProposal(txHash: string, certIndex: number): Promise { + throw new Error("Method not implemented"); + } + /** * HTTP GET method required by IFetcher interface but not implemented in OfflineFetcher. * @param url - URL to fetch from diff --git a/packages/mesh-provider/src/utxo-rpc.ts b/packages/mesh-provider/src/utxo-rpc.ts index a6f782119..d04f68824 100644 --- a/packages/mesh-provider/src/utxo-rpc.ts +++ b/packages/mesh-provider/src/utxo-rpc.ts @@ -10,6 +10,7 @@ import { BlockInfo, bytesToHex, castProtocol, + GovernanceProposalInfo, hexToBytes, IEvaluator, IFetcher, @@ -317,6 +318,10 @@ export class U5CProvider throw new Error("Method not implemented."); } + async fetchGovernanceProposal(txHash: string, certIndex: number): Promise { + throw new Error("Method not implemented"); + } + get(url: string): Promise { throw new Error("Method not implemented."); } diff --git a/packages/mesh-provider/src/yaci.ts b/packages/mesh-provider/src/yaci.ts index 53022e9fd..ed8dad062 100644 --- a/packages/mesh-provider/src/yaci.ts +++ b/packages/mesh-provider/src/yaci.ts @@ -8,6 +8,7 @@ import { BlockInfo, castProtocol, fromUTF8, + GovernanceProposalInfo, IEvaluator, IFetcher, IListener, @@ -24,7 +25,7 @@ import { import { normalizePlutusScript, resolveRewardAddress, - toScriptRef + toScriptRef, } from "@meshsdk/core-cst"; import { utxosToAssets } from "./common/utxos-to-assets"; @@ -104,7 +105,7 @@ export class YaciProvider const normalized = normalizePlutusScript(plutusScript, "DoubleCBOR"); script = { version: data.type.replace("plutus", ""), - code: normalized + code: normalized, }; } else { script = await this.fetchNativeScriptJSON(scriptHash); @@ -384,6 +385,13 @@ export class YaciProvider } } + async fetchGovernanceProposal( + txHash: string, + certIndex: number, + ): Promise { + throw new Error("Method not implemented by Maestro"); + } + async get(url: string): Promise { try { const { data, status } = await this._axiosInstance.get(url); diff --git a/packages/mesh-transaction/src/mesh-tx-builder/tx-builder-core.ts b/packages/mesh-transaction/src/mesh-tx-builder/tx-builder-core.ts index 5f5cb2c34..3c24a61f7 100644 --- a/packages/mesh-transaction/src/mesh-tx-builder/tx-builder-core.ts +++ b/packages/mesh-transaction/src/mesh-tx-builder/tx-builder-core.ts @@ -1469,7 +1469,7 @@ export class MeshTxBuilderCore { return this; }; - /** + /** * Sets a specific fee for the transaction to use * @param fee The specified fee * @returns The MeshTxBuilder instance @@ -1477,7 +1477,7 @@ export class MeshTxBuilderCore { setFee = (fee: string) => { this.meshTxBuilderBody.fee = fee; return this; - } + }; /** * Sets the network to use, this is mainly to know the cost models to be used to calculate script integrity hash