From ed2d42d96bdc92f367d5a87923efdff0f2858256 Mon Sep 17 00:00:00 2001 From: Calum Sieppert Date: Sat, 9 Jul 2022 15:50:00 -0600 Subject: [PATCH 1/4] Fetch NFT initial implementation --- flake.nix | 3 +- index.d.ts | 4 ++ index.js | 10 +++++ packages.dhall | 4 +- spago-packages.nix | 6 +-- src/Seabug/CallContract.purs | 45 ++++++++++++++------ src/Seabug/Contract/Common.purs | 13 ++++++ src/Seabug/Contract/MarketPlaceFetchNft.purs | 33 ++++++++++++++ src/Seabug/Contract/MarketPlaceListNft.purs | 19 +++------ src/Seabug/Seabug.purs | 1 + 10 files changed, 104 insertions(+), 34 deletions(-) create mode 100644 src/Seabug/Contract/Common.purs create mode 100644 src/Seabug/Contract/MarketPlaceFetchNft.purs diff --git a/flake.nix b/flake.nix index eaf894f..bf15a1c 100644 --- a/flake.nix +++ b/flake.nix @@ -12,7 +12,8 @@ repo = "cardano-transaction-lib"; # should be same rev as in packages.dhall # Oh update, do `spago2nix generate` - rev = "b7614b4e11a57b5b366b65509b86eb4b086bb1ce"; + # https://github.com/Plutonomicon/cardano-transaction-lib/pull/702/commits/6592f4188850ca4b2adab0c593c6a971087a54ba + rev = "6592f4188850ca4b2adab0c593c6a971087a54ba"; }; nixpkgs.follows = "cardano-transaction-lib/nixpkgs"; }; diff --git a/index.d.ts b/index.d.ts index 5a40880..9960636 100644 --- a/index.d.ts +++ b/index.d.ts @@ -2,6 +2,8 @@ export function callMarketPlaceBuy(config: Config, args: BuyNftArgs): Promise export function callMarketPlaceListNft(config: Config): Promise> +export function callMarketPlaceFetchNft(config: Config, args: FetchNftArgs): + Promise export function connectWallet(): Promise export function getWalletBalance(): Promise @@ -36,6 +38,8 @@ export type BuyNftArgs = { } +export type FetchNftArgs = Input + export type NftCollectionArgs = { // CurrencySymbol of nft collection collectionNftCs: string, diff --git a/index.js b/index.js index f40b29d..326c96a 100644 --- a/index.js +++ b/index.js @@ -27,6 +27,16 @@ exports.callMarketPlaceListNft = async (config) => { return sb.callMarketPlaceListNft(config)(); }; +/** + * Calls Seabug Contract 'marketPlaceFetchNft'. + * Returns a promise holding the up to date data for the given utxo + * reference. + */ +exports.callMarketPlaceFetchNft = async (config, args) => { + const sb = await seabug; + return sb.callMarketPlaceFetchNft(config)(args)(); +}; + /** * Returns a promise containing the connected wallet's balance. diff --git a/packages.dhall b/packages.dhall index 5864755..36f0a64 100644 --- a/packages.dhall +++ b/packages.dhall @@ -328,9 +328,7 @@ let additions = ] , repo = "https://github.com/Plutonomicon/cardano-transaction-lib.git" -- should be same rev as in flake.nix - -- https://github.com/Plutonomicon/cardano-transaction-lib/pull/696 - -- PR: Return error if no utxo is specified for a tx input & Fix transaction inputs locking - , version = "b7614b4e11a57b5b366b65509b86eb4b086bb1ce" + , version = "6592f4188850ca4b2adab0c593c6a971087a54ba" } } in upstream // additions diff --git a/spago-packages.nix b/spago-packages.nix index 1173ff5..10b1e82 100644 --- a/spago-packages.nix +++ b/spago-packages.nix @@ -199,11 +199,11 @@ let "cardano-transaction-lib" = pkgs.stdenv.mkDerivation { name = "cardano-transaction-lib"; - version = "b7614b4e11a57b5b366b65509b86eb4b086bb1ce"; + version = "6592f4188850ca4b2adab0c593c6a971087a54ba"; src = pkgs.fetchgit { url = "https://github.com/Plutonomicon/cardano-transaction-lib.git"; - rev = "b7614b4e11a57b5b366b65509b86eb4b086bb1ce"; - sha256 = "11fkwr2w00k9a03lws9254wbkwn3c35m98mr8xn86i03akp2pqwi"; + rev = "6592f4188850ca4b2adab0c593c6a971087a54ba"; + sha256 = "000hgdq5l8kmy5z10vh49072c6cygcci43i5ysk23ncd1gk22dk1"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; diff --git a/src/Seabug/CallContract.purs b/src/Seabug/CallContract.purs index 880b20a..a3acab1 100644 --- a/src/Seabug/CallContract.purs +++ b/src/Seabug/CallContract.purs @@ -1,7 +1,8 @@ module Seabug.CallContract ( callMarketPlaceBuy - , callMarketPlaceListNft , callMarketPlaceBuyTest + , callMarketPlaceFetchNft + , callMarketPlaceListNft ) where import Contract.Prelude @@ -16,12 +17,9 @@ import Contract.Monad , runContract_ ) import Contract.Numeric.Natural (toBigInt) -import Contract.Prim.ByteArray - ( byteArrayToHex - , hexToByteArray - ) +import Contract.Prim.ByteArray (byteArrayToHex, hexToByteArray) import Contract.Transaction - ( TransactionInput(TransactionInput) + ( TransactionInput(..) , TransactionOutput(TransactionOutput) ) import Contract.Value @@ -38,19 +36,21 @@ import Control.Promise (Promise) import Control.Promise as Promise import Data.BigInt (BigInt) import Data.BigInt as BigInt +import Data.Log.Level (LogLevel(..)) import Data.Tuple.Nested ((/\)) import Data.UInt as UInt import Effect (Effect) import Effect.Aff (error) import Effect.Class (liftEffect) -import Data.Log.Level (LogLevel(..)) import Effect.Exception (Error) -import Seabug.Metadata.Types (SeabugMetadata(SeabugMetadata)) -import Seabug.Metadata.Share (unShare) import Partial.Unsafe (unsafePartial) import Plutus.Conversion (fromPlutusAddress) +import Seabug.Contract.Common (NftResult) import Seabug.Contract.MarketPlaceBuy (marketplaceBuy) -import Seabug.Contract.MarketPlaceListNft (ListNftResult, marketPlaceListNft) +import Seabug.Contract.MarketPlaceFetchNft (marketPlaceFetchNft) +import Seabug.Contract.MarketPlaceListNft (marketPlaceListNft) +import Seabug.Metadata.Share (unShare) +import Seabug.Metadata.Types (SeabugMetadata(SeabugMetadata)) import Seabug.Types ( NftCollection(NftCollection) , NftData(NftData) @@ -63,14 +63,21 @@ import Serialization.Hash , scriptHashFromBech32 , scriptHashToBech32Unsafe ) +import Types.BigNum as BigNum import Types.Natural as Nat import Wallet (mkNamiWalletAff) -import Types.BigNum as BigNum -- | Exists temporarily for testing purposes callMarketPlaceBuyTest :: String -> Effect (Promise String) callMarketPlaceBuyTest = Promise.fromAff <<< pure +callMarketPlaceFetchNft + :: ContractConfiguration -> TransactionInputOut -> Effect (Promise Unit) +callMarketPlaceFetchNft cfg args = Promise.fromAff do + contractConfig <- buildContractConfig cfg + txInput <- liftEffect $ liftEither $ buildTransactionInput args + runContract_ contractConfig (marketPlaceFetchNft txInput) + -- | Calls Seabugs marketplaceBuy and takes care of converting data types. -- Returns a JS promise holding no data. callMarketPlaceBuy @@ -123,12 +130,14 @@ type BuyNftArgs = } } +type TransactionInputOut = { transactionId :: String, inputIndex :: Int } + -- Placeholder for types I'm not sure how should we represent on frontend. type ValueOut = Array { currencySymbol :: String, tokenName :: String, amount :: BigInt } type ListNftResultOut = - { input :: { transactionId :: String, inputIndex :: Int } + { input :: TransactionInputOut , output :: { address :: String, value :: ValueOut, dataHash :: String } , metadata :: { seabugMetadata :: @@ -193,7 +202,7 @@ stringToLogLevel "Warn" = Just Warn stringToLogLevel "Error" = Just Error stringToLogLevel _ = Nothing -buildNftList :: NetworkId -> ListNftResult -> ListNftResultOut +buildNftList :: NetworkId -> NftResult -> ListNftResultOut buildNftList network { input: TransactionInput input, output: TransactionOutput output, metadata } = @@ -298,3 +307,13 @@ buildNftData { nftCollectionArgs, nftIdArgs } = do , daoScript , daoShare } + +buildTransactionInput :: TransactionInputOut -> Either Error TransactionInput +buildTransactionInput input = do + transactionId <- + note (error $ "Invalid transaction id: " <> input.transactionId) + $ wrap + <$> hexToByteArray input.transactionId + index <- note (error $ "Invalid input index: " <> show input.inputIndex) $ + UInt.fromInt' input.inputIndex + pure $ wrap { transactionId, index } diff --git a/src/Seabug/Contract/Common.purs b/src/Seabug/Contract/Common.purs new file mode 100644 index 0000000..e574d8a --- /dev/null +++ b/src/Seabug/Contract/Common.purs @@ -0,0 +1,13 @@ +-- | +module Seabug.Contract.Common + ( NftResult + ) where + +import Contract.Transaction (TransactionInput, TransactionOutput) +import Seabug.Metadata (FullSeabugMetadata) + +type NftResult = + { input :: TransactionInput + , output :: TransactionOutput + , metadata :: FullSeabugMetadata + } diff --git a/src/Seabug/Contract/MarketPlaceFetchNft.purs b/src/Seabug/Contract/MarketPlaceFetchNft.purs new file mode 100644 index 0000000..bc24709 --- /dev/null +++ b/src/Seabug/Contract/MarketPlaceFetchNft.purs @@ -0,0 +1,33 @@ +-- | Contract to fetch a single NFT +module Seabug.Contract.MarketPlaceFetchNft + ( marketPlaceFetchNft + ) where + +import Contract.Prelude + +import Contract.Monad (Contract, liftContractM, liftedE, liftedM) +import Contract.PlutusData (fromData, getDatumByHash) +import Contract.Transaction (TransactionInput, TransactionOutput(..)) +import Contract.Utxos (getUtxo) +import Control.Monad.Reader (asks) +import Seabug.Contract.Common (NftResult) +import Seabug.Metadata (getFullSeabugMetadataWithBackoff) +import Seabug.Types (MarketplaceDatum(..)) + +marketPlaceFetchNft + :: forall (r :: Row Type) + . TransactionInput + -> Contract (projectId :: String | r) NftResult +marketPlaceFetchNft ref = do + output@(TransactionOutput nftTxOut) <- liftedM "Could not find NFT utxo" $ + getUtxo + ref + datumHash <- liftContractM "Datum hash not available for NFT" + nftTxOut.dataHash + MarketplaceDatum { getMarketplaceDatum: datum } <- + liftedM "Could not get datum for NFT" $ getDatumByHash datumHash <#> + (_ >>= unwrap >>> fromData) + projectId <- asks $ unwrap >>> _.projectId + metadata <- liftedE $ liftAff $ + getFullSeabugMetadataWithBackoff datum projectId + pure { input: ref, output, metadata } diff --git a/src/Seabug/Contract/MarketPlaceListNft.purs b/src/Seabug/Contract/MarketPlaceListNft.purs index 362c8e7..dfe98bc 100644 --- a/src/Seabug/Contract/MarketPlaceListNft.purs +++ b/src/Seabug/Contract/MarketPlaceListNft.purs @@ -1,7 +1,6 @@ -- | Helper to list the utxo with relevant NFT at the market validator script module Seabug.Contract.MarketPlaceListNft - ( ListNftResult - , marketPlaceListNft + ( marketPlaceListNft ) where import Contract.Prelude @@ -9,10 +8,7 @@ import Contract.Prelude import Contract.Address (getNetworkId, typedValidatorEnterpriseAddress) import Contract.Monad (Contract, liftContractE, liftedM) import Contract.PlutusData (fromData, getDatumsByHashes) -import Contract.Transaction - ( TransactionInput - , TransactionOutput(TransactionOutput) - ) +import Contract.Transaction (TransactionOutput(TransactionOutput)) import Contract.Utxos (utxosAt) import Contract.Value (valueOf) import Control.Alternative (guard) @@ -21,22 +17,17 @@ import Control.Monad.Reader (asks) import Control.Parallel (parTraverse) import Data.Array (catMaybes, mapMaybe) import Data.Map as Map +import Seabug.Contract.Common (NftResult) import Seabug.MarketPlace (marketplaceValidator) -import Seabug.Metadata (FullSeabugMetadata, getFullSeabugMetadataWithBackoff) +import Seabug.Metadata (getFullSeabugMetadataWithBackoff) import Seabug.Types (MarketplaceDatum(MarketplaceDatum)) -type ListNftResult = - { input :: TransactionInput - , output :: TransactionOutput - , metadata :: FullSeabugMetadata - } - -- | Lists the utxos at the script address that contain a datum of type -- | `MarketplaceDatum` with unit value. It currently doesn't have any logic -- | on matching `CurrencySymbol` and `TokenName`. marketPlaceListNft :: forall (r :: Row Type) - . Contract (projectId :: String | r) (Array ListNftResult) + . Contract (projectId :: String | r) (Array NftResult) marketPlaceListNft = do marketplaceValidator' <- unwrap <$> liftContractE marketplaceValidator networkId <- getNetworkId diff --git a/src/Seabug/Seabug.purs b/src/Seabug/Seabug.purs index 40d9546..6edb6c6 100644 --- a/src/Seabug/Seabug.purs +++ b/src/Seabug/Seabug.purs @@ -7,5 +7,6 @@ import Seabug.CallContract ( callMarketPlaceBuy , callMarketPlaceBuyTest , callMarketPlaceListNft + , callMarketPlaceFetchNft ) import QueryM.Utxos (getWalletBalance) From 6476154e4ecb14ae9a91a7b2ec2cfde7237e927e Mon Sep 17 00:00:00 2001 From: Calum Sieppert Date: Fri, 22 Jul 2022 17:37:46 -0600 Subject: [PATCH 2/4] Return the NFT to the frontend and fix typescript api for input --- flake.lock | 16 ++++++++-------- index.d.ts | 4 ++-- src/Seabug/CallContract.purs | 7 +++++-- 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/flake.lock b/flake.lock index 326e96a..1f35f02 100644 --- a/flake.lock +++ b/flake.lock @@ -549,17 +549,17 @@ "servant-purescript": "servant-purescript" }, "locked": { - "lastModified": 1657205366, - "narHash": "sha256-keMr7lQDRINsR7miVMtgw/K5OCkiaU4HUGkCwEXm04U=", + "lastModified": 1657293268, + "narHash": "sha256-YTYh5guN2SGm9iUOEhl7nhkmDkgEbhB+8XUiWnB7EAA=", "owner": "Plutonomicon", "repo": "cardano-transaction-lib", - "rev": "b7614b4e11a57b5b366b65509b86eb4b086bb1ce", + "rev": "6592f4188850ca4b2adab0c593c6a971087a54ba", "type": "github" }, "original": { "owner": "Plutonomicon", "repo": "cardano-transaction-lib", - "rev": "b7614b4e11a57b5b366b65509b86eb4b086bb1ce", + "rev": "6592f4188850ca4b2adab0c593c6a971087a54ba", "type": "github" } }, @@ -1784,17 +1784,17 @@ "unstable_nixpkgs": "unstable_nixpkgs" }, "locked": { - "lastModified": 1656090737, - "narHash": "sha256-zan1OMF5/O7lfYAA9y4JgveEVKK2Pw9tWBVYbMcPUto=", + "lastModified": 1656671352, + "narHash": "sha256-EO3WrQnCXK+Lg8PNG2TK8iQxn5Zo+x7pmYFf1qWs0fk=", "owner": "mlabs-haskell", "repo": "ogmios-datum-cache", - "rev": "98b1c4f2badc7ab1efe4be188ee9f9f5e4e54bb0", + "rev": "1c7a4af3f18bd3fa94a59e5a52e0ad6d974233e8", "type": "github" }, "original": { "owner": "mlabs-haskell", "repo": "ogmios-datum-cache", - "rev": "98b1c4f2badc7ab1efe4be188ee9f9f5e4e54bb0", + "rev": "1c7a4af3f18bd3fa94a59e5a52e0ad6d974233e8", "type": "github" } }, diff --git a/index.d.ts b/index.d.ts index 9960636..9316afc 100644 --- a/index.d.ts +++ b/index.d.ts @@ -70,8 +70,8 @@ export type NftListing = { } export type Input = { - transaction_id: String, - input_index: number + transactionId: String, + inputIndex: number } export type Output = { diff --git a/src/Seabug/CallContract.purs b/src/Seabug/CallContract.purs index a3acab1..6666292 100644 --- a/src/Seabug/CallContract.purs +++ b/src/Seabug/CallContract.purs @@ -72,11 +72,14 @@ callMarketPlaceBuyTest :: String -> Effect (Promise String) callMarketPlaceBuyTest = Promise.fromAff <<< pure callMarketPlaceFetchNft - :: ContractConfiguration -> TransactionInputOut -> Effect (Promise Unit) + :: ContractConfiguration + -> TransactionInputOut + -> Effect (Promise ListNftResultOut) callMarketPlaceFetchNft cfg args = Promise.fromAff do contractConfig <- buildContractConfig cfg txInput <- liftEffect $ liftEither $ buildTransactionInput args - runContract_ contractConfig (marketPlaceFetchNft txInput) + nftResult <- runContract contractConfig (marketPlaceFetchNft txInput) + pure $ buildNftList (unwrap contractConfig).networkId nftResult -- | Calls Seabugs marketplaceBuy and takes care of converting data types. -- Returns a JS promise holding no data. From 85b3755dc583a64144c484e669c0680c836dd74b Mon Sep 17 00:00:00 2001 From: Calum Sieppert Date: Fri, 22 Jul 2022 18:04:50 -0600 Subject: [PATCH 3/4] Make fetchNft return null for spent txos --- index.d.ts | 2 +- spago.dhall | 1 + src/Seabug/CallContract.purs | 9 ++++--- src/Seabug/Contract/MarketPlaceFetchNft.purs | 28 +++++++++++--------- 4 files changed, 23 insertions(+), 17 deletions(-) diff --git a/index.d.ts b/index.d.ts index 9316afc..3ae1d3a 100644 --- a/index.d.ts +++ b/index.d.ts @@ -3,7 +3,7 @@ export function callMarketPlaceBuy(config: Config, args: BuyNftArgs): export function callMarketPlaceListNft(config: Config): Promise> export function callMarketPlaceFetchNft(config: Config, args: FetchNftArgs): - Promise + Promise export function connectWallet(): Promise export function getWalletBalance(): Promise diff --git a/spago.dhall b/spago.dhall index 4b12130..b6a2dd9 100644 --- a/spago.dhall +++ b/spago.dhall @@ -27,6 +27,7 @@ You can edit this file as you like. , "monad-logger" , "mote" , "newtype" + , "nullable" , "ordered-collections" , "parallel" , "partial" diff --git a/src/Seabug/CallContract.purs b/src/Seabug/CallContract.purs index 6666292..b308ff4 100644 --- a/src/Seabug/CallContract.purs +++ b/src/Seabug/CallContract.purs @@ -37,6 +37,7 @@ import Control.Promise as Promise import Data.BigInt (BigInt) import Data.BigInt as BigInt import Data.Log.Level (LogLevel(..)) +import Data.Nullable (Nullable, notNull, null) import Data.Tuple.Nested ((/\)) import Data.UInt as UInt import Effect (Effect) @@ -74,12 +75,14 @@ callMarketPlaceBuyTest = Promise.fromAff <<< pure callMarketPlaceFetchNft :: ContractConfiguration -> TransactionInputOut - -> Effect (Promise ListNftResultOut) + -> Effect (Promise (Nullable ListNftResultOut)) callMarketPlaceFetchNft cfg args = Promise.fromAff do contractConfig <- buildContractConfig cfg txInput <- liftEffect $ liftEither $ buildTransactionInput args - nftResult <- runContract contractConfig (marketPlaceFetchNft txInput) - pure $ buildNftList (unwrap contractConfig).networkId nftResult + runContract contractConfig (marketPlaceFetchNft txInput) >>= case _ of + Nothing -> pure null + Just nftResult -> pure $ notNull $ + buildNftList (unwrap contractConfig).networkId nftResult -- | Calls Seabugs marketplaceBuy and takes care of converting data types. -- Returns a JS promise holding no data. diff --git a/src/Seabug/Contract/MarketPlaceFetchNft.purs b/src/Seabug/Contract/MarketPlaceFetchNft.purs index bc24709..8f5e442 100644 --- a/src/Seabug/Contract/MarketPlaceFetchNft.purs +++ b/src/Seabug/Contract/MarketPlaceFetchNft.purs @@ -17,17 +17,19 @@ import Seabug.Types (MarketplaceDatum(..)) marketPlaceFetchNft :: forall (r :: Row Type) . TransactionInput - -> Contract (projectId :: String | r) NftResult + -> Contract (projectId :: String | r) (Maybe NftResult) marketPlaceFetchNft ref = do - output@(TransactionOutput nftTxOut) <- liftedM "Could not find NFT utxo" $ - getUtxo - ref - datumHash <- liftContractM "Datum hash not available for NFT" - nftTxOut.dataHash - MarketplaceDatum { getMarketplaceDatum: datum } <- - liftedM "Could not get datum for NFT" $ getDatumByHash datumHash <#> - (_ >>= unwrap >>> fromData) - projectId <- asks $ unwrap >>> _.projectId - metadata <- liftedE $ liftAff $ - getFullSeabugMetadataWithBackoff datum projectId - pure { input: ref, output, metadata } + getUtxo ref >>= case _ of + Nothing -> do + log "Could not find NFT utxo, it may have been spent" + pure Nothing + Just output@(TransactionOutput nftTxOut) -> do + datumHash <- liftContractM "Datum hash not available for NFT" + nftTxOut.dataHash + MarketplaceDatum { getMarketplaceDatum: datum } <- + liftedM "Could not get datum for NFT" $ getDatumByHash datumHash <#> + (_ >>= unwrap >>> fromData) + projectId <- asks $ unwrap >>> _.projectId + metadata <- liftedE $ liftAff $ + getFullSeabugMetadataWithBackoff datum projectId + pure $ Just { input: ref, output, metadata } From bfcf8a679f23b8b4c6d76a39ce886af9fca4bf87 Mon Sep 17 00:00:00 2001 From: Calum Sieppert Date: Sat, 23 Jul 2022 10:52:55 -0600 Subject: [PATCH 4/4] Documentation updates --- index.d.ts | 5 +++++ index.js | 5 ----- src/Seabug/Contract/Common.purs | 1 - src/Seabug/Contract/MarketPlaceFetchNft.purs | 7 +++++-- 4 files changed, 10 insertions(+), 8 deletions(-) diff --git a/index.d.ts b/index.d.ts index 3ae1d3a..a239ae6 100644 --- a/index.d.ts +++ b/index.d.ts @@ -2,6 +2,11 @@ export function callMarketPlaceBuy(config: Config, args: BuyNftArgs): Promise export function callMarketPlaceListNft(config: Config): Promise> +/** + * Fetch the info for a single NFT. Returns null if the given + * transaction input has been spent (for example if the NFT has been + * bought). + */ export function callMarketPlaceFetchNft(config: Config, args: FetchNftArgs): Promise export function connectWallet(): Promise diff --git a/index.js b/index.js index 326c96a..38e5251 100644 --- a/index.js +++ b/index.js @@ -27,11 +27,6 @@ exports.callMarketPlaceListNft = async (config) => { return sb.callMarketPlaceListNft(config)(); }; -/** - * Calls Seabug Contract 'marketPlaceFetchNft'. - * Returns a promise holding the up to date data for the given utxo - * reference. - */ exports.callMarketPlaceFetchNft = async (config, args) => { const sb = await seabug; return sb.callMarketPlaceFetchNft(config)(args)(); diff --git a/src/Seabug/Contract/Common.purs b/src/Seabug/Contract/Common.purs index e574d8a..fc032c0 100644 --- a/src/Seabug/Contract/Common.purs +++ b/src/Seabug/Contract/Common.purs @@ -1,4 +1,3 @@ --- | module Seabug.Contract.Common ( NftResult ) where diff --git a/src/Seabug/Contract/MarketPlaceFetchNft.purs b/src/Seabug/Contract/MarketPlaceFetchNft.purs index 8f5e442..493035b 100644 --- a/src/Seabug/Contract/MarketPlaceFetchNft.purs +++ b/src/Seabug/Contract/MarketPlaceFetchNft.purs @@ -5,7 +5,7 @@ module Seabug.Contract.MarketPlaceFetchNft import Contract.Prelude -import Contract.Monad (Contract, liftContractM, liftedE, liftedM) +import Contract.Monad (Contract, liftContractM, liftedE, liftedM, logWarn') import Contract.PlutusData (fromData, getDatumByHash) import Contract.Transaction (TransactionInput, TransactionOutput(..)) import Contract.Utxos (getUtxo) @@ -14,6 +14,9 @@ import Seabug.Contract.Common (NftResult) import Seabug.Metadata (getFullSeabugMetadataWithBackoff) import Seabug.Types (MarketplaceDatum(..)) +-- | Fetch the info for a single NFT identified by a utxo +-- | (`TransactionInput`). Returns `Nothing` if the given transaction +-- | input has been spent (for example if the NFT has been bought). marketPlaceFetchNft :: forall (r :: Row Type) . TransactionInput @@ -21,7 +24,7 @@ marketPlaceFetchNft marketPlaceFetchNft ref = do getUtxo ref >>= case _ of Nothing -> do - log "Could not find NFT utxo, it may have been spent" + logWarn' "Could not find NFT utxo, it may have been spent" pure Nothing Just output@(TransactionOutput nftTxOut) -> do datumHash <- liftContractM "Datum hash not available for NFT"