Skip to content
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

Hydra tools #327

Merged
merged 10 commits into from
Oct 13, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 38 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,44 @@ Explore the features on [Mesh Playground](https://meshjs.dev/).

## What's inside?

This repo includes the following packages/apps:
```mermaid
graph TD
package-core[@meshsdk/core]
package-core-csl[@meshsdk/core-csl]
package-core-cst[@meshsdk/core-cst]
package-provider[@meshsdk/provider]
package-react[@meshsdk/react]
package-transaction[@meshsdk/transaction]
package-wallet[@meshsdk/wallet]
package-sidan-csl[@sidan-lab/*]
package-cardano-sdk[@cardano-sdk/*]
package-harmoniclabs[@harmoniclabs/*]
package-stricahq[@stricahq/*]
package-core --> package-core-csl
package-core --> package-core-cst
package-core --> package-provider
package-core --> package-react
package-core --> package-transaction
package-core --> package-wallet
package-provider --> package-core-cst

package-react --> package-transaction
package-react --> package-wallet
package-transaction --> package-core-csl
package-transaction --> package-core-cst
subgraph serializer
package-core-csl --> package-sidan-csl
package-core-cst --> package-cardano-sdk
package-core-cst --> package-harmoniclabs
package-core-cst --> package-stricahq
end
click package-core-csl "https://docs.meshjs.dev/core-csl" _parent
click package-core-cst "https://docs.meshjs.dev/core-cst" _parent
click package-provider "https://docs.meshjs.dev/providers" _parent
click package-react "https://meshjs.dev/react" _parent
click package-transaction "https://docs.meshjs.dev/transactions" _parent
click package-wallet "https://docs.meshjs.dev/wallets" _parent
```

### Packages

Expand Down
Binary file modified apps/playground/public/providers/blockfrost.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added apps/playground/public/providers/hydra.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions apps/playground/public/providers/hydra.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified apps/playground/public/providers/koios.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified apps/playground/public/providers/maestro.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified apps/playground/public/providers/ogmios.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@ export default function BlockchainProviderKey({
const setYaciUrl = useProviders((state) => state.setYaciUrl);
const ogmiosUrl = useProviders((state) => state.ogmiosUrl);
const setOgmiosUrl = useProviders((state) => state.setOgmiosUrl);
const hydraUrl = useProviders((state) => state.hydraUrl);
const setHydraUrl = useProviders((state) => state.setHydraUrl);

if (provider == "maestro") {
return (
Expand Down Expand Up @@ -123,6 +125,7 @@ export default function BlockchainProviderKey({
onChange={(e) => setYaciUrl(e.target.value)}
placeholder="Instance URL"
label="Instance URL"
type="password"
key={0}
/>,
]}
Expand All @@ -139,6 +142,24 @@ export default function BlockchainProviderKey({
onChange={(e) => setOgmiosUrl(e.target.value)}
placeholder="Instance URL"
label="Instance URL"
type="password"
key={0}
/>,
]}
/>
);
}

if (provider == "hydra") {
return (
<InputTable
listInputs={[
<Input
value={hydraUrl ?? ""}
onChange={(e) => setHydraUrl(e.target.value)}
placeholder="e.g. http://123.45.67.890:4001"
label="Hydra Head URL and Port"
type="password"
key={0}
/>,
]}
Expand Down
2 changes: 1 addition & 1 deletion apps/playground/src/components/layouts/sidebar/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ export default function Sidebar({
<div className="mb-6 mr-6 hidden lg:w-72 xl:block">
<div className="sticky top-24">
<aside>
<nav className="overflow-y-auto rounded-lg border border-gray-200 p-6 font-medium text-gray-500 dark:border-gray-700 dark:text-gray-400 max-h-96">
<nav className="overflow-y-auto rounded-lg border border-gray-200 p-6 font-medium text-gray-500 dark:border-gray-700 dark:text-gray-400 h-[calc(100vh-150px)]">
<ul className="space-y-4">
{sidebarItems.map((item, i) => {
return (
Expand Down
18 changes: 13 additions & 5 deletions apps/playground/src/data/links-providers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,44 +3,52 @@ import { CloudIcon } from "@heroicons/react/24/solid";
import { MenuItem } from "~/types/menu-item";

export const metaMaestro = {
title: "Maestro",
title: "Maestro Provider",
link: "/providers/maestro",
desc: "Advanced UTxO-indexing data layer to supercharge Defi on Bitcoin, Cardano & Dogecoin",
thumbnail: "/providers/maestro.png",
};

export const metaKoios = {
title: "Koios",
title: "Koios Provider",
link: "/providers/koios",
desc: "Distributed & open-source public API query layer for Cardano",
thumbnail: "/providers/koios.png",
};

export const metaBlockfrost = {
title: "Blockfrost",
title: "Blockfrost Provider",
link: "/providers/blockfrost",
desc: "Featuring over 100 APIs tailored for easy access to Cardano blockchain",
thumbnail: "/providers/blockfrost.png",
};

export const metaYaci = {
title: "Yaci DevKit",
title: "Yaci Provider",
link: "/providers/yaci",
desc: "Custom Cardano devnet to tailor your devnet needs with a builtin indexer and custom viewer for devnet",
thumbnail: "/providers/yaci.png",
};

export const metaOgmios = {
title: "Ogmios",
title: "Ogmios Provider",
link: "/providers/ogmios",
desc: "Lightweight bridge interface for cardano-node that offers WebSockets API that enables local clients to speak Ouroboros' mini-protocols",
thumbnail: "/providers/ogmios.png",
};

export const metaHydra = {
title: "Hydra Provider (alpha)",
link: "/providers/hydra",
desc: "Layer 2 scaling solution for Cardano that increases transaction throughput and ensures cost efficiency while maintaining security.",
thumbnail: "/providers/hydra.svg",
};

export const linksProviders: MenuItem[] = [
metaBlockfrost,
metaKoios,
metaMaestro,
// metaHydra,
metaOgmios,
metaYaci,
];
Expand Down
4 changes: 4 additions & 0 deletions apps/playground/src/hooks/useProviders.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ interface State {
setYaciUrl: (url: string) => void;
ogmiosUrl: string;
setOgmiosUrl: (url: string) => void;
hydraUrl: string;
setHydraUrl: (url: string) => void;
}

export const useProviders = create<State>(
Expand All @@ -35,6 +37,8 @@ export const useProviders = create<State>(
setYaciUrl: (url) => set({ yaciUrl: url }),
ogmiosUrl: "",
setOgmiosUrl: (url) => set({ ogmiosUrl: url }),
hydraUrl: "",
setHydraUrl: (url) => set({ hydraUrl: url }),
}),
{ name: "mesh-providers" },
),
Expand Down
25 changes: 25 additions & 0 deletions apps/playground/src/pages/providers/hydra-endpoints/index.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import { HydraProvider } from "@meshsdk/core";

import HydraInitializeHead from "./init-head";
import HydraOnMessage from "./on-message";

export default function ProviderHydra({
hydraProvider,
provider,
}: {
hydraProvider: HydraProvider;
provider: string;
}) {
return (
<>
<HydraInitializeHead
hydraProvider={hydraProvider}
provider={provider}
/>
<HydraOnMessage
hydraProvider={hydraProvider}
provider={provider}
/>
</>
);
}
55 changes: 55 additions & 0 deletions apps/playground/src/pages/providers/hydra-endpoints/init-head.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
import { HydraProvider } from "@meshsdk/core";

import LiveCodeDemo from "~/components/sections/live-code-demo";
import TwoColumnsScroll from "~/components/sections/two-columns-scroll";
import Codeblock from "~/components/text/codeblock";

export default function HydraInitializeHead({
hydraProvider,
provider,
}: {
hydraProvider: HydraProvider;
provider: string;
}) {
return (
<TwoColumnsScroll
sidebarTo="initHead"
title="Initializes a new Hydra Head"
leftSection={Left()}
rightSection={Right(hydraProvider, provider)}
/>
);
}

function Left() {
return (
<>
<p>
Initializes a new Head. This command is a no-op when a Head is already
open and the server will output an <code>CommandFailed</code> message
should this happen.
</p>
<Codeblock data={`await hydraProvider.initializesHead();`} />
</>
);
}

function Right(hydraProvider: HydraProvider, provider: string) {
async function runDemo() {
hydraProvider.onMessage((message) => {
console.log("HydraProvider received message", message);
});
await hydraProvider.connect();
return await hydraProvider.initializesHead();
}

return (
<LiveCodeDemo
title="Initializes Hydra Head"
subtitle="Initializes a new Head."
runCodeFunction={runDemo}
runDemoShowProviderInit={true}
runDemoProvider={provider}
></LiveCodeDemo>
);
}
57 changes: 57 additions & 0 deletions apps/playground/src/pages/providers/hydra-endpoints/on-message.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
import { use, useEffect } from "react";

import { HydraProvider } from "@meshsdk/core";

import Link from "~/components/link";
import TwoColumnsScroll from "~/components/sections/two-columns-scroll";
import Codeblock from "~/components/text/codeblock";

export default function HydraOnMessage({
hydraProvider,
provider,
}: {
hydraProvider: HydraProvider;
provider: string;
}) {
return (
<TwoColumnsScroll
sidebarTo="onMessage"
title="Listens for new messages from Hydra node"
leftSection={Left()}
rightSection={Right(hydraProvider, provider)}
/>
);
}

function Left() {
let code = ``;
code += `hydraProvider.onMessage((message) => {\n`;
code += ` console.log("HydraProvider received message", message);\n`;
code += ` // do something with the message\n`;
code += `});\n`;

return (
<>
<p>
Listens for new messages from Hydra node. The callback function will be
called with the message as the only argument. Check{" "}
<Link href="https://hydra.family/head-protocol/api-reference/#operation-subscribe-/">
all events emitted
</Link>
by the Hydra node.
</p>
<Codeblock data={code} />
</>
);
}

function Right(hydraProvider: HydraProvider, provider: string) {
useEffect(() => {
hydraProvider.onMessage((message) => {
console.log("HydraProvider received message", message);
// do something with the message
});
}, []);

return <></>;
}
66 changes: 66 additions & 0 deletions apps/playground/src/pages/providers/hydra.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
import type { NextPage } from "next";

import { HydraProvider } from "@meshsdk/core";

import ButtonFloatDocumentation from "~/components/button/button-float-documentation";
import SidebarFullwidth from "~/components/layouts/sidebar-fullwidth";
import Link from "~/components/link";
import TitleIconDescriptionBody from "~/components/sections/title-icon-description-body";
import Metatags from "~/components/site/metatags";
import Codeblock from "~/components/text/codeblock";
import { metaHydra } from "~/data/links-providers";
import { useProviders } from "~/hooks/useProviders";
import ProviderHydra from "./hydra-endpoints";

const ReactPage: NextPage = () => {
const sidebarItems = [
{ label: "Initializes Hydra Head", to: "initHead" },
{ label: "On Message", to: "onMessage" },
{ label: "Abort Hydra Head", to: "AA" },
{ label: "Submit Transaction", to: "AA" },
{ label: "Decommit UTxO", to: "AA" },
{ label: "Close Hydra Head", to: "AA" },
{ label: "Contest latest snapshot", to: "AA" },
{ label: "Fanout", to: "AA" },
{ label: "Get UTxO", to: "AA" },
{ label: "Commit Transaction", to: "AA" },
{ label: "Decommit Transaction", to: "AA" },
{ label: "Get protocol parameters", to: "AA" },
];

let code1 = `import { HydraProvider } from "@meshsdk/core";\n\n`;
code1 += `const hydraProvider = new HydraProvider('<URL>');`;
code1 += `\nawait hydraProvider.connect();`;

const hydraUrl = useProviders((state) => state.hydraUrl);
const hydraProvider = new HydraProvider(hydraUrl);

return (
<>
<Metatags title={metaHydra.title} description={metaHydra.desc} />
<SidebarFullwidth sidebarItems={sidebarItems}>
<TitleIconDescriptionBody
title={metaHydra.title}
description={metaHydra.desc}
>
<p>
The{" "}
<Link href="https://hydra.family/head-protocol/">
Hydra Head protocol
</Link>{" "}
is a layer 2 scaling solution for Cardano rooted in peer-reviewed
research that increases transaction throughput and ensures cost
efficiency while maintaining rigorous security.
</p>
<p>Get started:</p>
<Codeblock data={code1} />
</TitleIconDescriptionBody>
<ButtonFloatDocumentation href="https://docs.meshjs.dev/providers/classes/HydraProvider" />

<ProviderHydra hydraProvider={hydraProvider} provider="hydra" />
</SidebarFullwidth>
</>
);
};

export default ReactPage;
Loading