Skip to content
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
465 changes: 465 additions & 0 deletions docs/fdc/guides/fdc-by-hand.mdx

Large diffs are not rendered by default.

5 changes: 3 additions & 2 deletions examples/developer-hub-javascript/GaslessApp.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { useState } from "react";
import React, { useState } from "react";
import { ethers, Eip1193Provider } from "ethers";
import USD0Abi from "./USD0.json";
import Heading from "@theme/Heading";

// Environment variables
const USD0_ADDRESS = import.meta.env.VITE_USD0_ADDRESS!;
Expand Down Expand Up @@ -92,7 +93,7 @@ export default function App() {

return (
<div style={{ padding: 20, maxWidth: 400 }}>
<h1>Gasless USD₮0 Demo</h1>
<Heading as="h1">Gasless USD₮0 Demo</Heading>
<input
placeholder="Recipient address"
value={to}
Expand Down
1 change: 1 addition & 0 deletions sidebars.ts
Original file line number Diff line number Diff line change
Expand Up @@ -181,6 +181,7 @@ const sidebars: SidebarsConfig = {
},
],
},
"fdc/guides/fdc-by-hand",
],
},
{
Expand Down
48 changes: 48 additions & 0 deletions src/components/FDC/ToHexConverter.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
import React, { useState } from "react";
import "@site/src/css/custom.css";
import classes from "../HomepageFeatures/featureCard.module.css";
import Heading from "@theme/Heading";

export default function ToHexConverter() {
const [data, setData] = useState("");
const [encodedData, setEncodedData] = useState("");

function toHex(data) {
let result = "";
for (let i = 0; i < data.length; i++) {
result += data.charCodeAt(i).toString(16);
}
return "0x" + result.padEnd(64, "0");
}

async function handleClick() {
const result = await toHex(data);
setEncodedData(result);
}

return (
<div className={`${classes.card} input-card`}>
<Heading as="h3" className="input-card-title">
To Hex Converter
</Heading>
<input
type="text"
placeholder="Enter string to convert to hex"
value={data}
onChange={(e) => setData(e.target.value)}
className="input-card-input"
/>
<button
onClick={handleClick}
className="input-card-button"
aria-label="Encode to hex"
title="Encode to hex"
>
Encode
</button>
<p className="input-card-result">
Encoded string: <b>{encodedData}</b>
</p>
</div>
);
}
48 changes: 48 additions & 0 deletions src/components/FDC/VotingRoundIdCalculator.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
import React, { useState } from "react";
import "@site/src/css/custom.css";
import classes from "../HomepageFeatures/featureCard.module.css";
import Heading from "@theme/Heading";

export default function RoundCalculator() {
const [timestamp, setTimestamp] = useState("");
const [roundId, setRoundId] = useState("");

async function calculateRoundId(blockTimestamp) {
const firsVotingRoundStartTs = 1658430000;
const votingEpochDurationSeconds = 90;
return Math.floor(
(blockTimestamp - firsVotingRoundStartTs) / votingEpochDurationSeconds,
);
}

async function handleClick() {
const result = await calculateRoundId(parseInt(timestamp));
setRoundId(result.toString());
}

return (
<div className={`${classes.card} input-card`}>
<Heading as="h3" className="input-card-title">
Voting Round ID Calculator
</Heading>
<input
type="number"
placeholder="Enter block timestamp"
value={timestamp}
onChange={(e) => setTimestamp(e.target.value)}
className="input-card-input"
/>
<button
onClick={handleClick}
className="input-card-button"
aria-label="Calculate Round ID"
title="Calculate Round ID"
>
Calculate Round ID
</button>
<p className="input-card-result">
Round ID: <b>{roundId}</b>
</p>
</div>
);
}
Loading
Loading