Pārlūkot izejas kodu

Update example to use APT pricefeed (#365)

* Update example

* Update address of example contract
guibescos 3 gadi atpakaļ
vecāks
revīzija
a19cd93cd3

+ 1 - 1
aptos/examples/mint_nft/Move.toml

@@ -11,7 +11,7 @@ Pyth = { git = "https://github.com/pyth-network/pyth-crosschain.git", subdir = "
 [addresses]
 # These are testnet addresses https://docs.pyth.network/consume-data/aptos#addresses
 aptos_framework = "0x1"
-mint_nft = "_"
+mint_nft = "0x19f8503273cdb5aa93ffe4539277684615242127aa2e65ef91424136a316c9c7"
 pyth = "0x7e783b349d3e89cf5931af376ebeadbfab855b3fa239b7ada8f5a92fbea6b387"
 deployer = "0xb31e712b26fd295357355f6845e77c888298636609e93bc9b05f0f604049f434"
 wormhole = "0x5bc11445584a763c1fa7ed39081f1b920954da14e04b32440cba863d03e19625"

+ 6 - 4
aptos/examples/mint_nft/README.md

@@ -1,6 +1,8 @@
-# Example Full-Stack App: 100$ USD Mint
+# Example Full-Stack App: 1$ Mint
 
-The goal of this contract is managing an NFT mint where the mint is paid in native currency but the cost of one NFT is always 100$.
+The example contract is deployed at : `0x19f8503273cdb5aa93ffe4539277684615242127aa2e65ef91424136a316c9c7`
+
+The goal of this contract is managing an NFT mint where the mint is paid in native currency but the cost of one NFT is always 1$.
 This example is intended to be run on Aptos testnet because it depends on Pyth and Wormhole existing onchain.
 
 ### Important files : 
@@ -12,13 +14,13 @@ Both combined contain the key pieces of code needed to make an Aptos fullstack a
 
 - Use `aptos init` with rest_url : `https://testnet.aptoslabs.com/` and faucet `https://faucet.testnet.aptoslabs.com`  to generate a new keypair.
 - Use a faucet to airdrop testnet APT to your newly created account by calling `aptos account fund-with-faucet --account default`. If this doesn't work, I have had success importing my private key from `.aptos/config.yaml` into Petra and clicking the airdrop button. Otherwise send APT from another account.
-- Get your account address from `.aptos/config.yaml` and replace `mint_nft="_"` by `mint_nft="<ADDRESS>"` in `Move.toml`
+- Get your account address from `.aptos/config.yaml` and replace `mint_nft="0x19f8503273cdb5aa93ffe4539277684615242127aa2e65ef91424136a316c9c7"` by `mint_nft="<ADDRESS>"` in `Move.toml`
 - `aptos move compile`
 - `aptos move publish` 
 
 ### How to run the webapp :
 
-- In `app/src/App.tsx` replace `const MINT_NFT_MODULE = "_"` by `const MINT_NFT_MODULE = "<ADDRESS>"` the address of your module from above.
+- In `app/src/App.tsx` replace `const MINT_NFT_MODULE = "0x19f8503273cdb5aa93ffe4539277684615242127aa2e65ef91424136a316c9c7"` by `const MINT_NFT_MODULE = "<ADDRESS>"` the address of your module from above.
 - `npm install`
 - `npm run start`
 - Go to `http://localhost:3000/` in your browser and use Petra wallet to transact with the app.

+ 7 - 8
aptos/examples/mint_nft/app/src/App.tsx

@@ -2,7 +2,6 @@ import React from "react";
 import logo from "./logo.svg";
 import "./App.css";
 import { Price, PriceFeed } from "@pythnetwork/pyth-common-js";
-import { AptosClient } from "aptos";
 import { AptosPriceServiceConnection } from "@pythnetwork/pyth-aptos-js";
 
 // Please read https://docs.pyth.network/consume-data before building on Pyth
@@ -16,11 +15,11 @@ const testnetConnection = new AptosPriceServiceConnection(
 ); // 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 ETH_USD_TESTNET_PRICE_ID =
-  "0xca80ba6dc32e08d06f1aa886011eed1d77c77be9eb761cc10d72b7d0a2fd57a6";
+const APT_USD_TESTNET_PRICE_ID =
+  "0x44a93dddd8effa54ea51076c4e851b6cbbfd938e82eb90197de38fe8876bb66e";
 
 // Aptos modules : These are testnet addresses https://docs.pyth.network/consume-data/aptos#addresses
-const MINT_NFT_MODULE = "_";
+const MINT_NFT_MODULE = "0x19f8503273cdb5aa93ffe4539277684615242127aa2e65ef91424136a316c9c7";
 
 /// React component that shows the offchain price and confidence interval
 function PriceText(props: { price: Price | undefined }) {
@@ -31,7 +30,7 @@ function PriceText(props: { price: Price | undefined }) {
         {" "}
         <p>
           {" "}
-          Current ETH/USD price:{" "}
+          Current APT/USD price:{" "}
           <span style={{ color: "green" }}>
             {" "}
             {price.getPriceAsNumberUnchecked().toFixed(3) +
@@ -44,7 +43,7 @@ function PriceText(props: { price: Price | undefined }) {
           Current NFT price:{" "}
           <span style={{ color: "green" }}>
             {" "}
-            {(100 / price.getPriceAsNumberUnchecked()).toFixed(5)} APT{" "}
+            {(1 / price.getPriceAsNumberUnchecked()).toFixed(5)} APT{" "}
           </span>{" "}
         </p>{" "}
       </div>
@@ -68,7 +67,7 @@ function App() {
 
   // Subscribe to offchain prices. These are the prices that a typical frontend will want to show.
   testnetConnection.subscribePriceFeedUpdates(
-    [ETH_USD_TESTNET_PRICE_ID],
+    [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);
@@ -120,7 +119,7 @@ function App() {
 
 async function sendMintTransaction() {
   const priceFeedUpdateData = await testnetConnection.getPriceFeedsUpdateData([
-    ETH_USD_TESTNET_PRICE_ID,
+    APT_USD_TESTNET_PRICE_ID,
   ]);
   const mintTransaction = {
     type: "entry_function_payload",

+ 3 - 5
aptos/examples/mint_nft/sources/minting.move

@@ -16,10 +16,8 @@ module mint_nft::minting {
     use aptos_std::math64::pow;
     use aptos_token::token::{Self, TokenDataId};
 
-    // WARNING This is actually the ETH/USD while APT is not listed
     // For the entire list of price_ids head to https://pyth.network/developers/price-feed-ids/#pyth-cross-chain-testnet
-    // TODO : Update to the real APT/USD when it's out
-    const APTOS_USD_PRICE_FEED_IDENTIFIER : vector<u8> = x"ca80ba6dc32e08d06f1aa886011eed1d77c77be9eb761cc10d72b7d0a2fd57a6"; 
+    const APTOS_USD_PRICE_FEED_IDENTIFIER : vector<u8> = x"44a93dddd8effa54ea51076c4e851b6cbbfd938e82eb90197de38fe8876bb66e"; 
 
     // This event stores the receiver of the NFT and the TokenDataId of the NFT
     struct TokenMintingEvent has drop, store {
@@ -81,7 +79,7 @@ module mint_nft::minting {
         });
     }
 
-    /// Mint an edition of the Pythian NFT pay 100 USD in native APT
+    /// Mint an edition of the Pythian NFT pay 1 USD in native APT
     public entry fun mint_nft(receiver : &signer, vaas : vector<vector<u8>>) acquires CollectionTokenMinter{
         // Fetch the signer capability to mint the NFT
         let collection_token_minter = borrow_global_mut<CollectionTokenMinter>(@mint_nft); 
@@ -94,7 +92,7 @@ module mint_nft::minting {
         let price_positive = i64::get_magnitude_if_positive(&price::get_price(&price)); // This will fail if the price is negative
         let expo_magnitude = i64::get_magnitude_if_negative(&price::get_expo(&price)); // This will fail if the exponent is positive
 
-        let price_in_aptos_coin =  (100 * OCTAS_PER_APTOS * pow(10, expo_magnitude)) / price_positive; // 100 USD in AptosCoin
+        let price_in_aptos_coin =  (OCTAS_PER_APTOS * pow(10, expo_magnitude)) / price_positive; // 1 USD in APT
 
         coin::transfer<aptos_coin::AptosCoin>(receiver, @mint_nft, price_in_aptos_coin); // Pay for the NFT
     }