import { AptosPriceServiceConnection } from "@pythnetwork/pyth-aptos-js";
import { Price, PriceFeed } from "@pythnetwork/pyth-common-js";
import React from "react";
import "./App.css";
import logo from "./logo.svg";
// Please read https://docs.pyth.network/documentation/pythnet-price-feeds before building on Pyth
// Rpc endpoint
const TESTNET_HERMES_ENDPOINT = "https://hermes-beta.pyth.network";
// Connection
const testnetConnection = new AptosPriceServiceConnection(
TESTNET_HERMES_ENDPOINT
); // Price service client used to retrieve the offchain VAAs to update the onchain price
// Price id : this is not an aptos account but instead an opaque identifier for each price https://pyth.network/developers/price-feed-ids/#pyth-cross-chain-testnet
const APT_USD_TESTNET_PRICE_ID =
"0x44a93dddd8effa54ea51076c4e851b6cbbfd938e82eb90197de38fe8876bb66e";
// Aptos modules : These are testnet addresses https://docs.pyth.network/documentation/pythnet-price-feeds/aptos
const MINT_NFT_MODULE =
"0x19f8503273cdb5aa93ffe4539277684615242127aa2e65ef91424136a316c9c7";
/// React component that shows the offchain price and confidence interval
function PriceText(props: { price: Price | undefined }) {
let price = props.price;
if (price) {
return (
);
} else {
return Failed to fetch price ;
}
}
function App() {
const [isConnected, setIsConnected] = React.useState(false);
// Disconnect right at the beginning to clear previous wallet connections
React.useEffect(() => {
window.aptos.disconnect();
}, []);
const [pythOffChainPrice, setPythOffChainPrice] = React.useState<
Price | undefined
>(undefined);
// Subscribe to offchain prices. These are the prices that a typical frontend will want to show.
testnetConnection.subscribePriceFeedUpdates(
[APT_USD_TESTNET_PRICE_ID],
(priceFeed: PriceFeed) => {
const price = priceFeed.getPriceUnchecked(); // Fine to use unchecked (not checking for staleness) because this must be a recent price given that it comes from a websocket subscription.
setPythOffChainPrice(price);
}
);
return (
Mint your Pythian NFT
{" "}
);
}
async function sendMintTransaction() {
const priceFeedUpdateData = await testnetConnection.getPriceFeedsUpdateData([
APT_USD_TESTNET_PRICE_ID,
]);
const mintTransaction = {
type: "entry_function_payload",
function: MINT_NFT_MODULE + `::minting::mint_nft`,
arguments: [priceFeedUpdateData], // Minting requires updating the price first, so we are passing the VAA containing the verifiable price as an argument. The `mint_nft` module use the VAA to update the Pyth price before the caller pays for the mint.
type_arguments: [],
};
await window.aptos.signAndSubmitTransaction(mintTransaction);
}
export default App;