Skip to content
Closed
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
8 changes: 4 additions & 4 deletions flake.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions flake.nix
Original file line number Diff line number Diff line change
Expand Up @@ -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";
};
Expand Down
4 changes: 3 additions & 1 deletion packages.dhall
Original file line number Diff line number Diff line change
Expand Up @@ -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
6 changes: 3 additions & 3 deletions spago-packages.nix

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

17 changes: 6 additions & 11 deletions src/Seabug/CallContract.purs
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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)
Expand All @@ -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)
Expand All @@ -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)
Expand Down Expand Up @@ -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
Expand Down
66 changes: 46 additions & 20 deletions src/Seabug/Contract/MarketPlaceBuy.purs
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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)
Expand All @@ -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)
)

Expand Down Expand Up @@ -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
}
10 changes: 2 additions & 8 deletions src/Seabug/Metadata.purs
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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

Expand Down Expand Up @@ -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)
Expand Down
2 changes: 1 addition & 1 deletion src/Seabug/Metadata/Types.purs
Original file line number Diff line number Diff line change
Expand Up @@ -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))

Expand Down
9 changes: 1 addition & 8 deletions src/Seabug/Types.purs
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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"
Expand Down
7 changes: 3 additions & 4 deletions test/Fixtures.purs
Original file line number Diff line number Diff line change
Expand Up @@ -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 $
Expand Down