diff --git a/flake.lock b/flake.lock index 326e96a..aa40279 100644 --- a/flake.lock +++ b/flake.lock @@ -549,17 +549,17 @@ "servant-purescript": "servant-purescript" }, "locked": { - "lastModified": 1657205366, - "narHash": "sha256-keMr7lQDRINsR7miVMtgw/K5OCkiaU4HUGkCwEXm04U=", + "lastModified": 1656619156, + "narHash": "sha256-lVagCm6DZTMYWkn4M8AFoqjspAXoVwiqFXYG8lmT/6k=", "owner": "Plutonomicon", "repo": "cardano-transaction-lib", - "rev": "b7614b4e11a57b5b366b65509b86eb4b086bb1ce", + "rev": "d1a9d61806e79adb73dcecb591e1bdd310cf4d69", "type": "github" }, "original": { "owner": "Plutonomicon", + "ref": "calum/metadata-invalid-char-fix", "repo": "cardano-transaction-lib", - "rev": "b7614b4e11a57b5b366b65509b86eb4b086bb1ce", "type": "github" } }, diff --git a/flake.nix b/flake.nix index eaf894f..954eaa8 100644 --- a/flake.nix +++ b/flake.nix @@ -11,8 +11,8 @@ owner = "Plutonomicon"; repo = "cardano-transaction-lib"; # should be same rev as in packages.dhall - # Oh update, do `spago2nix generate` - rev = "b7614b4e11a57b5b366b65509b86eb4b086bb1ce"; + # To update, do `spago2nix generate` + ref = "calum/metadata-invalid-char-fix"; }; nixpkgs.follows = "cardano-transaction-lib/nixpkgs"; }; diff --git a/packages.dhall b/packages.dhall index 5864755..faf8b24 100644 --- a/packages.dhall +++ b/packages.dhall @@ -330,7 +330,9 @@ let additions = -- 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" + -- Commit is from our branch calum/metadata-invalid-char-fix which is based off this PR and + -- includes a small fix to get the build working. + , version = "8ff7b75d2048a9ea9d625f97d27176f59b09fb6a" } } in upstream // additions diff --git a/spago-packages.nix b/spago-packages.nix index 1173ff5..9f1c096 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 = "8ff7b75d2048a9ea9d625f97d27176f59b09fb6a"; src = pkgs.fetchgit { url = "https://github.com/Plutonomicon/cardano-transaction-lib.git"; - rev = "b7614b4e11a57b5b366b65509b86eb4b086bb1ce"; - sha256 = "11fkwr2w00k9a03lws9254wbkwn3c35m98mr8xn86i03akp2pqwi"; + rev = "8ff7b75d2048a9ea9d625f97d27176f59b09fb6a"; + sha256 = "18hi8q8dpk2fjvb4hcyrizhbmrcajb43kz23bjwgsrqzgd3jb9gb"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; diff --git a/src/Seabug/CallContract.purs b/src/Seabug/CallContract.purs index 880b20a..96e0561 100644 --- a/src/Seabug/CallContract.purs +++ b/src/Seabug/CallContract.purs @@ -6,7 +6,6 @@ module Seabug.CallContract import Contract.Prelude -import Cardano.Types.Value as Cardano.Types.Value import Contract.Address (Slot(Slot)) import Contract.Monad ( ConfigParams(ConfigParams) @@ -16,10 +15,7 @@ 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) , TransactionOutput(TransactionOutput) @@ -38,19 +34,19 @@ 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.MarketPlaceBuy (marketplaceBuy) import Seabug.Contract.MarketPlaceListNft (ListNftResult, marketPlaceListNft) +import Seabug.Metadata.Share (unShare) +import Seabug.Metadata.Types (SeabugMetadata(SeabugMetadata)) import Seabug.Types ( NftCollection(NftCollection) , NftData(NftData) @@ -63,9 +59,9 @@ 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) @@ -228,8 +224,7 @@ buildNftList convertSeabugMetaData (SeabugMetadata m) = { policyId: scriptHashToBech32Unsafe "policy_vkh" $ unwrap m.policyId -- or the prefix should just be 'script' , mintPolicy: byteArrayToHex m.mintPolicy - , collectionNftCS: byteArrayToHex $ Cardano.Types.Value.getCurrencySymbol $ - m.collectionNftCS + , collectionNftCS: byteArrayToHex $ getCurrencySymbol m.collectionNftCS , collectionNftTN: byteArrayToHex $ getTokenName m.collectionNftTN , lockingScript: scriptHashToBech32Unsafe "script" $ unwrap m.lockingScript , authorPkh: byteArrayToHex $ unwrap $ ed25519KeyHashToBytes $ unwrap diff --git a/src/Seabug/Contract/MarketPlaceBuy.purs b/src/Seabug/Contract/MarketPlaceBuy.purs index 6ccaa7b..1944f6e 100644 --- a/src/Seabug/Contract/MarketPlaceBuy.purs +++ b/src/Seabug/Contract/MarketPlaceBuy.purs @@ -5,11 +5,16 @@ module Seabug.Contract.MarketPlaceBuy import Contract.Prelude -import Contract.Address - ( getNetworkId - , ownPaymentPubKeyHash +import Contract.Address (getNetworkId, ownPaymentPubKeyHash) +import Contract.AuxiliaryData (setTxMetadata) +import Contract.Monad (Contract, liftContractE, liftContractM, liftedE, liftedM) +import Contract.Numeric.Natural (toBigInt) +import Contract.PlutusData + ( Datum(Datum) + , Redeemer(Redeemer) + , toData + , unitRedeemer ) - import Contract.ScriptLookups (UnattachedUnbalancedTx, mkUnbalancedTx) import Contract.ScriptLookups ( mintingPolicy @@ -18,20 +23,6 @@ import Contract.ScriptLookups , typedValidatorLookups , unspentOutputs ) as ScriptLookups -import Contract.Monad - ( Contract - , liftContractM - , liftContractE - , liftedE - , liftedM - ) -import Contract.Numeric.Natural (toBigInt) -import Contract.PlutusData - ( Datum(Datum) - , Redeemer(Redeemer) - , toData - , unitRedeemer - ) import Contract.Scripts (applyArgs, typedValidatorEnterpriseAddress) import Contract.Transaction ( TransactionOutput(TransactionOutput) @@ -51,15 +42,18 @@ import Contract.Wallet (getWalletAddress) import Data.Array (find) as Array import Data.Bifunctor (lmap) import Data.BigInt (BigInt, fromInt) +import Data.BigInt as BigInt import Data.Map (insert, toUnfoldable) import Data.String.Common (joinWith) +import Seabug.Metadata.Types (SeabugMetadata(..)) +import Seabug.Metadata.Share (mkShare) import Seabug.MarketPlace (marketplaceValidator) import Seabug.MintingPolicy (mintingPolicy) import Seabug.Token (mkTokenName) import Seabug.Types ( MarketplaceDatum(MarketplaceDatum) , MintAct(ChangeOwner) - , NftData(NftData) + , NftData(..) , NftId(NftId) ) @@ -228,4 +222,36 @@ mkMarketplaceTx (NftData nftData) = do -- the datums and redeemers will be reattached using a server with redeemers -- reindexed also. txDatumsRedeemerTxIns <- liftedE $ mkUnbalancedTx lookup constraints - pure $ txDatumsRedeemerTxIns /\ curr /\ newName + txWithMetadata <- + setSeabugMetadata (wrap nftData { nftId = newNft }) txDatumsRedeemerTxIns + pure $ txWithMetadata /\ curr /\ newName + +-- | Set metadata on the transaction for the given NFT +setSeabugMetadata + :: forall (r :: Row Type) + . NftData + -> UnattachedUnbalancedTx + -> Contract r UnattachedUnbalancedTx +setSeabugMetadata (NftData nftData) tx = do + let + nftCollection = unwrap nftData.nftCollection + nftId = unwrap nftData.nftId + natToShare nat = liftContractM "Invalid share" + $ mkShare + =<< BigInt.toInt (toBigInt nat) + policyId = Value.currencyMPSHash nftCollection.collectionNftCs + authorShareValidated <- natToShare nftCollection.authorShare + marketplaceShareValidated <- natToShare nftCollection.daoShare + setTxMetadata tx $ SeabugMetadata + { policyId + , mintPolicy: mempty + , collectionNftCS: nftCollection.collectionNftCs + , lockingScript: nftCollection.lockingScript + , collectionNftTN: nftId.collectionNftTn + , authorPkh: unwrap nftCollection.author + , authorShare: authorShareValidated + , marketplaceScript: nftCollection.daoScript + , marketplaceShare: marketplaceShareValidated + , ownerPkh: unwrap nftId.owner + , ownerPrice: nftId.price + } diff --git a/src/Seabug/Metadata.purs b/src/Seabug/Metadata.purs index 36ed4a4..e9fc3c0 100644 --- a/src/Seabug/Metadata.purs +++ b/src/Seabug/Metadata.purs @@ -13,14 +13,13 @@ import Affjax (printError) import Affjax as Affjax import Affjax.RequestHeader as Affjax.RequestHeader import Affjax.ResponseFormat as Affjax.ResponseFormat -import Cardano.Types.Value as Cardano.Types.Value +import Contract.Monad (Contract) import Contract.Prim.ByteArray (byteArrayToHex) import Contract.Value ( CurrencySymbol , TokenName , getCurrencySymbol , getTokenName - , mkCurrencySymbol ) import Control.Alternative (guard) import Control.Monad.Error.Class (throwError) @@ -36,7 +35,6 @@ import Data.Newtype (unwrap) import Effect.Aff (delay) import Effect.Random (randomRange) import Seabug.Metadata.Types (SeabugMetadata(SeabugMetadata)) -import Partial.Unsafe (unsafePartial) type Hash = String @@ -100,11 +98,7 @@ getIpfsHash -> BlockfrostFetch Hash getIpfsHash (SeabugMetadata { collectionNftCS, collectionNftTN }) = do except <<< (decodeField "image" <=< decodeField "onchain_metadata") - =<< mkGetRequest ("assets/" <> mkAsset curr collectionNftTN) - where - curr :: CurrencySymbol - curr = unsafePartial $ fromJust $ mkCurrencySymbol $ - Cardano.Types.Value.getCurrencySymbol collectionNftCS + =<< mkGetRequest ("assets/" <> mkAsset collectionNftCS collectionNftTN) getMintingTxSeabugMetadata :: forall (r :: Row Type) diff --git a/src/Seabug/Metadata/Types.purs b/src/Seabug/Metadata/Types.purs index 6cc5f34..2bed9e9 100644 --- a/src/Seabug/Metadata/Types.purs +++ b/src/Seabug/Metadata/Types.purs @@ -40,7 +40,7 @@ import Types.Natural (Natural) import Types.PlutusData (PlutusData(Map)) import Types.PubKeyHash (PubKeyHash) import Types.Scripts (MintingPolicyHash, ValidatorHash) -import Cardano.Types.Value (CurrencySymbol, mkCurrencySymbol) +import Contract.Value (CurrencySymbol, mkCurrencySymbol) import Types.TokenName (TokenName, mkTokenName) import Types.TransactionMetadata (TransactionMetadatum(MetadataMap)) diff --git a/src/Seabug/Types.purs b/src/Seabug/Types.purs index bf2d02e..87c3414 100644 --- a/src/Seabug/Types.purs +++ b/src/Seabug/Types.purs @@ -11,13 +11,11 @@ module Seabug.Types import Contract.Prelude -import Cardano.Types.Value as Cardano.Types.Value import Contract.Value ( CurrencySymbol , TokenName , getCurrencySymbol , getTokenName - , mkCurrencySymbol ) import Contract.Monad (Contract) import Contract.Address (PaymentPubKeyHash, PubKeyHash) @@ -161,12 +159,7 @@ instance Aeson.DecodeAeson NftCollection where (Left $ Json.TypeMismatch "Expected Json Object") ( \o -> do - collectionNftCs <- do - nftCs <- Aeson.getField o "nftCollection'collectionNftCs" - note (Json.TypeMismatch "expected currency symbol") - $ mkCurrencySymbol - $ Cardano.Types.Value.getCurrencySymbol nftCs - + collectionNftCs <- Aeson.getField o "nftCollection'collectionNftCs" lockLockupEnd <- Aeson.getField o "nftCollection'lockLockupEnd" lockingScript <- Aeson.getField o "nftCollection'lockingScript" author <- Aeson.getField o "nftCollection'author" diff --git a/test/Fixtures.purs b/test/Fixtures.purs index c849110..0719dbc 100644 --- a/test/Fixtures.purs +++ b/test/Fixtures.purs @@ -21,14 +21,13 @@ import Contract.Numeric.Natural as Natural import Contract.Prelude (fromJust) import Contract.Prim.ByteArray (hexToByteArrayUnsafe) import Contract.Scripts (MintingPolicyHash(..), ScriptHash, ValidatorHash(..)) -import Contract.Value (TokenName, mkTokenName) +import Contract.Value (CurrencySymbol, mkCurrencySymbol, TokenName, mkTokenName) import Data.BigInt as BigInt -import Seabug.Metadata.Types (SeabugMetadata(..), SeabugMetadataDelta(..)) -import Seabug.Metadata.Share (Share, mkShare) import Partial.Unsafe (unsafePartial) +import Seabug.Metadata.Share (Share, mkShare) +import Seabug.Metadata.Types (SeabugMetadata(..), SeabugMetadataDelta(..)) import Serialization.Hash (ed25519KeyHashFromBytes, scriptHashFromBytes) import Types.RawBytes (hexToRawBytesUnsafe) -import Cardano.Types.Value (CurrencySymbol, mkCurrencySymbol) currencySymbol1 :: CurrencySymbol currencySymbol1 = unsafePartial $ fromJust $ mkCurrencySymbol $