Wolfram Research

Function Repository Resource:

MintNFT

Source Notebook

Mint a non-fungible token (NFT) on a blockchain

Contributed by: Piero Sanchez and Christian Pasquel

ResourceFunction["MintNFT"][nftSpec, transactionSpec]

mints a non-fungible token (NFT) specified by nftSpec, using the transaction specifications given by transactionSpec.

Details and Options

nftSpec is an association with the following keys:
"Name" name of the NFT
"Thumbnail" thumbnail image of the NFT
"Source" source data of the NFT
"Description" description of the NFT
"Expression" Wolfram Language expression associated with the NFT
"Notebook" Wolfram notebook associated with the NFT
"NFTID" whether to create an autogenerated ID for the NFT
"NFTQuantity" number of NFTs to mint
The maximum string length of "Name" is 32 characters.
The maximum string length of "Description" is 64 characters.
The maximum string length of "Expression" is 64 characters.
"Thumbnail" can be a File containing the path to an image file, or an expression such as Image, Graphics or Graphics3D. Ideally, the image size should be less than 1 MB.
"Source" can be a File containing the path to the source file associated with the NFT, or an expression such as Image, Graphics or Graphics3D.
"Notebook" is a File containing the path to a notebook associated with the NFT.
With "NFTID"True, an ID will be autogenerated using the current UnixTime and a random integer. Note that this is an accessory metadata ID used for readability when sharing the NFT details. This ID does not identify the NFT on the blockchain.
"NFTQuantity" has a default value of 1. With "NFTQuantity"n, n copies of the NFT will be minted under the same transaction.
Files associated with the NFT such as the ones specified by "Thumbnail", "Source" and "Notebook" will be automatically uploaded to IPFS and their Content Identifiers (CIDs) will be added to the NFT's on-chain metadata.
transactionSpec is an association with the following keys:
"OwnerAddress" recipient address that will own the NFT
"PrivateKey" private key used to sign the minting transaction
"Fee" transaction fee
"OutputAmount" amount of cryptocurrency to include in the new transaction output
"OwnerAddress" can be any valid address, including the address associated to "PrivateKey".
"PrivateKey" should be a PrivateKey associated to the address with enough balance to mint the NFT.
If "Fee" is not included, it will be automatically computed.
If "OutputAmount" is not included, it will be automatically computed.
If the "OwnerAddress" is the same address associated with "PrivateKey", "OutputAmount" will not be used.
ResourceFunction["MintNFT"] has the following options:
"Preview" True whether to preview a transaction instead of submitting to the blockchain
BlockchainBase {"Cardano","Testnet"} blockchain to use
The BlockchainBase option for this function currently supports only "Cardano" (Cardano mainnet) and {"Cardano","Testnet"} (Cardano testnet) as values. $BlockchainBase can also be used to set the default BlockchainBase value.

Examples

Basic Examples (13) 

Set the default blockchain to the Cardano testnet:

In[1]:=
$BlockchainBase = {"Cardano", "Testnet"}
Out[1]=

Create an image:

In[2]:=
image = \!\(\*
GraphicsBox[RasterBox[CompressedData["
1:eJzt2e3NI7kRReEBHIkjcQx2CAb82zE5Q4fgXRj6sYNeTrPF6jqXPA+wgHH9
qkWV+FWav/7z3//4119+/Pjx99/++89v//3+v6/9929/+n/d+rvZ/On7rPr7
KtZnzPqslTruj7fmQzXquKp8e15UjyNl/qSMp6ueb+3/6SiflzZ/qqWP/6Pq
vrTLfLA+Y+n1+fl1tDrbN41Zn7H0+uxyz6TMhw/6vp2er5I+b7593ern71LP
b59/Wv4r7udrnjuL9n3R9v+nrM+Y9bm2ejyUfWaW586Y9Rmj7QMp98yn7/Pt
39O+r1NR1kHKeknbT6jj0h+5n6+Vsp90O2U+PGV9rnWdR9S62Tc9e59Vf1/F
+oyln+OzqPvPXbT5mTKe3ftEipR7e8r+v8t4qtDW76xT9xP6/t/N+oxR7ttp
9aTNE8r3OMv6jJ1WH+o5TpkPH5R7Jm3fpo3nLZR1Q11fqd8zbT6njKfqdVXo
+3n3+9Du29Wsz1h6fd6uK/X33irU75FSJ+szRq0P5fld+0n3/kOZnx+U8dD2
h/T5Rh3/Kf8e+kEbl/v5WpTzl1qfWfT9vJv1ubbLfrJK6rmZfg+pZn3GqPsA
pT5vofdZ3d8v/R6eYtfxd39f9Htm2npPR/9+u9HXSzfrc23X/Ye2n6efm9Wo
56b1Wfv3FLR9YJf9h4K6XqpV/+5K//emqtdVOeWeWY22r7qf32NfNmZ9xij3
Vdo+QP2+VqHNc8o8nGV9xtLrQ6njLvx+x2jnXVe/6vjX5l1c73tL+X5T1suH
9RlLrw+1rk/Rzrv0eU6dh5Q6WZ8x2vyn1Z82nlXj6N7fKPWhSf+c6eN/ijKf
T1vvtP055Xekbul9WTXrc43W96XXsxtlX51lXzlmfcZOuydQ50M12rlMu/dS
fk9y/Gv/njqfq9Hqc1fKeLqlr5dq1ufaLvvb22h9+i6/D+zWN3XfK6zP2r/v
fu5TKeOh5V1o40+vv+PvRVvXKfXpkn7fS58PH9ZnjH7fOy3XPbR1SllHs6zP
GLU+Vc+njGPV61JRvq9ZtPHMcvxrud7voax36vdFu+9Vs28dS68Pta5UtD49
Je9CXUeUOlmfsfT1kvLvWen5KtRzvLovcPxrnu96fydfZdfvq1t6X1bN+lyj
7TMpuWpQzv1Z9pVj1met9Hvaabz3jjn+Z/kqrve1/L7usS8bsz7XqL9bno7W
p++ar5baN9lXjqXXJ/0etUs9KfOfsq6ecvy90s9T2vql7p/Vz7cvG7M+Y/Tz
1HxtLgbaPkPZB2ZZnzHavrHr82n17J7/Vc93/DVOH//u6/euXZ+fdk+2bx1L
rw+1rqei9enmvaj7AKVO1mds13tUl5TxpOyHjv9Zvkr6+GedNp705z+V3pdV
sz7XaH2HuZJV/55fxb5y7LT6vFV3yn2NMo5Vr6NIHX/quH+W/jlcvz3Pp+7/
p/RlH9bnGnU9qhatTzd/lq9G6ZtmndZXzqLWp+r56etx13+/667/2/fAVVI+
b3q+yq7r91codaXNh6fo67cb5T5G28fMn+U6A22fpOxjs6zPmPvYGOW+eCra
fEvpm/R/6fOh2qn7v33rWHp9qHVVDVqfbv5O3oW6j1HqZH3WSq/PW3V/+96y
+nW0+Xla/+T8efe5375Pdf1p0vuyatbnGu3ebv5OLl1JPTftK8fS67PLv69R
+ibaOUKt/9v1PO3zrkKtZ9XzU+q/+nWp9XnK+lyjrl9lo/Xp5sx8NfvKZ++z
6u+r0OYbpS4fu6zfu1LGk1LPWemfN2U8rt+1z0+pz4d96xjlPkO7V5szc2kF
2j5P2YdnWZ8xah9Nqc9T367ft8ex6nVVqut52uddPY5Vr6NIr381+9ax9PpQ
66pMtD7dfI+8C3UfptTptPqk/HsHLV/F+q9F+1zOH2a+ylvnVnpfVs36XKOt
O/M9cqkD5fftWaf1lbOo9aE9P5V1X8vPm/X8XVC+h13usfat16jnuzRC69PN
z8xXs6989j6r/r4KdX6+fS9a/bqq7zd9vVPvdbTxO3/WPPfp697us7rP91n0
enajr3dz8zdzKQHtnKKcI7Osz1q0fZj6/VY9f9f6p4//6fuscvr8SWPfOpZe
H2pdpSu0Pt3c/E7ehXqOUOqUXh9KHT9SxrPrev+gjusuyvhPmz+7jCe9L6tm
fa7R7o3m5ndyaUe79UEpfWU12r5H/f08df4/Rb+X0vJfSd0fZrl+nz0/7Z5J
3x+6UOe/1Il2XpubV+Srpd4bvVePpdwzd/8d4JR7KU36/uD6HaPOf/eHMcp5
SrvXmZtX5JJ45yzlHJx1Wn0odX8qpY/oRuvjKPN/Fm0+UOryVPrvwLT58FR6
fah1lTrQ+nRzc0LehXoOUupErU/V89PH/5b0e+ld1PmfPh+qnp++fmnz/6lT
9odZtHuXuTkhlzSv+l5UxXv1WPo+TB2/99JrKeM5bT64ft9Fnw9dqL+rSDuj
9enm5on5aqf3lU/fZ9XfU6SO+4O6vu6i3kv9XS5D+vg/7FvHKOcR7V5kbp6Y
S6pHuydQzvFZ6fWh9Evfvo4yHz4o49/lHKfU8ynX75q/p87PWen1odZV2hGt
Tzc3PyHvQj3HKXWifb9dz0+ZD9Tx06TXkzb+u3ZZv9VOmQ+zaPcWc/MTckk8
lH+/mJV+r66Wfg+flX5O0c5r69nrtPX7Yd967dTf2aSd0c5rc3Pzerv1lbv2
3dR7OGU+fKT+jkTjfOgZx9vvc0rf+kHfz83NzTm5pHy0ew7lHjKLWh/K82nn
1659x+rXOR/Woqxfan1mpff11LpKmkc7v8zNzb/Pu1DvIZQ6UecDpT5vod2r
73I+1Hh7PqTs5x/pfWsV2rlvbm7+fS7pPN/eW7pQ+wJane6inUennYMp4zkt
T2Pfes3fhSTNop1H5ubm7+erpfaV6X03pY67oN6rnQ89UtZ79/4/i3Je0M5l
c3Pz93NJ+hXaPY1yj5pF27dp9aeNZ9U40s7xU77frvXV/f3OSu/rqXWVxEPr
083Nzfl5F+o9ilKn0+751PlAQ+tT7koZT7f0vrUK7dw0Nzfn55K0GuXfa2ZR
+6yqOqXUvwvtvE4/908dj33rtVN/p5LERTuvzc3N98tXo/SVs6h9d9XzKeNY
9bpT+P2ueT51/5xF2W9p55q5ufl+uSR1o90zKffAWennSNfzzcf5Krt+v92q
9ivqfitJVWjnr7m5uXkX6j2QVqe70vssjfn93pPet1ahnTvm5ubmkpTm23tj
l/S+O70P2qWetPGsHsfbz7dvvfZWPSWJgtanm5ubm3ffG6vuydVo9dz1+bR6
0saT/vzu/WcWZb+inQvm5ubmafu5JFWj/fsO5R47a9c+qMtp40l//lNV6526
X0lSKlqfbm5ubr7r74HUe+zb/36U9j7f9ilvj2PV67qfT50/tL61Cm3fNjc3
N9/1fihJVJQ+aBa17656fvq52fX87vpQ6kqbD7Oo9ZekVLQ+3dzc3JyWrzb7
PpR77C71r0Lp96hOnT+U9U7bV83Nzc1puSTpO3f317f2bco9vFp6fdJ/h0md
Nz97uz7d612SdI3Wp5ubm5un512o93BKn0WtT9XzafM5Zb6dtt7Nzc3NzSVJ
HSh94izaubNrfVLO8V1+x6hC/V1FknSN1qebm5ubn5avNvs+lHs4tY+m1Ocp
yu8w1DpS1gttXzI3Nzc/LZcksX3b16w+F+h9RPXz0/NV0n/noa4XSVIP2nlt
bm5ubj7Ou+zSR9DqSkOpv+vF3Nzc3PzNXJK0l2/7ji7Uc3D2ddX1f3s83fWv
Qv3dRpLUg9anm5ubm5uvzVer6stoaPWnjectlPlGW9fm5ubm5mtzSdLZ7p4P
b507VX0Q7RzcZTxvf1/d802StCdan25ubm5u3pt3oY2f2mdRfgegfV+zaOvO
3Nzc3Lw3lyRpBqUvm5XSJ6b9DlCF+ruEJGlPtD7d3Nzc3DwrX232farGld5f
+X2Zm5ubm5vfzyVJqnT3/HnrXKs+D7/9vFWvW/38Xb4vSZJ+R+vTzc3Nzc33
zrukf9708c+izVtzc3Nz871zSZJI7p5X6efaqeNP/9ySpD3R+nRzc3Nzc/NK
s+9D6dPf6kOrPgdtXpmbm5ubm0uStItv+9auc7Pr+as/r/cLSdIOaH26ubm5
ubn5N3mX9D56Fu17Nzc3Nzc3/yaXJOkkd8/D9D736fO9L0iSTkTr083Nzc3N
zd/MV6P2u0+fa25ubm5ufkIuSZL+3N3zk3qOe/5LkvRrtD7d3Nzc3NycnKeg
1c3c3Nzc3JycS5Kkde6et0/PZc9zSZLWo/Xp5ubm5ubmO+Wr0D6Xubm5ubn5
TrkkSXqP57EkSQT/A3ntk+c=
"], {{0, 0}, {161, 81}}, {0, 1}],
Frame->False,
FrameLabel->{None, None},
FrameTicks->{{None, None}, {None, None}},
GridLinesStyle->Directive[
GrayLevel[0.5, 0.4]],
ImageSize->250,
Method->{"DefaultBoundaryStyle" -> Automatic, "DefaultGraphicsInteraction" -> {
        "Version" -> 1.2, "TrackMousePosition" -> {True, False}, "Effects" -> {
          "Highlight" -> {"ratio" -> 2}, "HighlightPoint" -> {"ratio" -> 2}, "Droplines" -> {
            "freeformCursorMode" -> True, "placement" -> {"x" -> "All", "y" -> "None"}}}}, "DefaultPlotStyle" -> Automatic},
PlotRangePadding->0]\);

Get your keys and address:

In[3]:=
myKeys = GenerateAsymmetricKeyPair[
  Method -> <|"Type" -> "EdwardsCurve", "CurveName" -> "ed25519"|>]
Out[3]=
In[4]:=
myAddress = BlockchainKeyEncode[myKeys["PublicKey"], "Address"]
Out[4]=

You need some tADA (the Cardano cryptocurrency) in your address to send transactions. To achieve this, you will use a Cardano Testnet Faucet. This is a website that will send some amount of tADA to your address.

To use it, copy your address to the clipboard and visit the Cardano Testnet Faucet:

In[5]:=
CopyToClipboard[myAddress]
In[6]:=
SystemOpen["https://developers.cardano.org/en/testnets/cardano/tools/faucet/"]

Paste your address in the Address field (double check that your address is complete and doesn't have extra characters as double quotes). Make sure tAda is selected in the dropdown menu. Click the "I'm not a robot" captcha and then the Request funds button:

Once you request funds, it may take about a minute for the transaction to be added to the blockchain.

Once the transaction has been added to the blockchain, check your address balance (and other details) with the BlockchainAddressData function by running this line:

In[7]:=
BlockchainAddressData[myAddress] // Dataset
Out[7]=

If this line returns an error, that means the transaction hasn't been added to the blockchain yet. Wait a moment and try again running the line of code. You will see here the details of your address, including your balance (given in Lovelace units). If you just want to extract your balance, you can evaluate the following:

In[8]:=
BlockchainAddressData[myAddress, "Balance"]
Out[8]=

Mint the NFT:

In[9]:=
myNFT = ResourceFunction["MintNFT"][<|
    "Name" -> "My First NFT",
    "Thumbnail" -> ImageResize[image, 100],
    "Source" -> image,
    "Description" -> "Minting my first NFT"
    |>,
   <|"OwnerAddress" -> myAddress ,
    "PrivateKey" -> myKeys["PrivateKey"]
    |>, "Preview" -> False];

See the details of the minted NFT:

In[10]:=
Dataset[myNFT]
Out[10]=

Get the data of the transaction that minted the NFT:

In[11]:=
txData = BlockchainTransactionData[myNFT["TransactionID"]];
txData // Dataset
Out[11]=

Get the NFT metadata:

In[12]:=
txData["Metadata"] // Dataset
Out[12]=

Download the NFT image that was uploaded to IPFS by extracting its content identifier and using ExternalStorageDownload:

In[13]:=
cid = StringDrop[
  First[Lookup[Flatten[Nest[Values, txData["Metadata"], 3]], "src"]], 7]
Out[13]=
In[14]:=
myNFTFile = ExternalStorageDownload[cid, ExternalStorageBase -> "IPFS"];
In[15]:=
Import[myNFTFile]
Out[15]=

Reset the blockchain settings:

In[16]:=
$BlockchainBase = Automatic;

Scope (6) 

Set the default blockchain to the Cardano testnet:

In[17]:=
$BlockchainBase = {"Cardano", "Testnet"}
Out[17]=

Use a File as the NFT source or thumbnail.

You can specify a Wolfram Language expression to be included in the NFT metadata by using the "Expression" element:

In[18]:=
myAddress = BlockchainKeyEncode[myKeys["PublicKey"], "Address"]
Out[18]=

Export an image and JSON file to use them in the NFT:

In[19]:=
certificateThumbnail = \!\(\*
GraphicsBox[
TagBox[RasterBox[CompressedData["
1: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
RckyUJ78He/SQiPIQQCAbKxbY3bI1slzUD44x7vUsCXkIABANq7/bboMlMfs
GT9LhepADgIApOfN18wOTJmBNede6l16qIccBABIz2UjsmWgPHQbs3ff8a4B
1CAHAQDS8cpzZgdkzMCasyd41wJqkIMAUCXWvu1dguZM+UVrGSgHR779undN
GrNmldn6dd6lKA9yEACqxA3RfdKYb5nNn1bN/fueezju11rNQXnFcd612Ry9
85x+cvzec91b3qUpD3IQAKrEfddtyomDtor3tF3xgnepNjH2+/lkoNSz1RUv
etcoXgf8ilFmg3rKNSiwfpscBIAq8fwjH8wL9SPjf2L2yG1m72/0K9tj3fll
YM2pQ/3qo98vLjly077BNY/c1a9MHpCDAFAl1rzRd24M39lszqTy360pf0d9
Of8cVB+55LFy67J8sdl5B5v176VMp+xTbnm8IQcBoGoMTZAfuof5/UFmzz5Y
Tpnuvjr/DKx5+g/LqYP2CT7nwA/uFbylkwaUU56qQA4CQNUY/bV0OaKfv/My
s/VriymPxuscvmNxOSgX3llM2YXG9mi/i6Tjey4fWVxZqgg5aKtWrbKZM2fa
2WefbePHj0dsW3UN61rWNd3WTB6YLUuGRF55fPzcL09umlJsBv7/LP9qvI9h
nmh/izP+T/qyhDa3MfAcXLlypU2ePNm9/0LMU13TurbbluljWssU9Tt61qg1
rTduaK0s76xO9pw2D++ZkU/7PTHP7LR9s5dj3hX5lKNdCDwH9buzd5+FWIS6
ttuWOy7JL1sO38Fs1nizN1dkK0urmZzGI3Yxe299tnLqXvLhW8xO2rv1cmhc
bEgEnoM8C8VOddKkSd5/vbKj+5m8M0Zz9bQOzNP3JC/HypfMBpaUgTVvPTdd
W2kc64JZZqP+Kb8yvPB4ujK0O4HnoHdfhVikbYvmlheZNcd9yaz74uZrplzw
q3IzUB7012Zr32zeRnre++drzEbslX8Zst47tyvkIGLH2raoj291Heskao3P
S481W/bkB8uwbFHz+QVFee1pvbeNnptqbKzmuhdxbs0pzHu8TtUhBxE71ram
qH6+keqnxn7P7P6ZZht69sg982c+GSi1rtnqVzZvD617fdv5ZodtX+y5D/1E
+d+1N+QgYsfa1pz+I58M0t6AWmvMKwNrXjQ8bod1a8xummx2yNblnFdzMUOD
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
/wyqgmqHJHP61K5FlmPWmS1fWoVDDgJAq+Q1P6Ivda/ZDD0DvGkyz0ZVf7VD
kmeiRd7D18qifbaqDDkIAK2gcfllzNsbGrnypeblWbbI7Lgv+meRp6q/2qEZ
as+hJZRnUFc8hriqkIMAkJW850c0M8mz0ffezWcNm3ZW9Vc7NKPoZ6L1Hr5D
sn1DPAg8Bzds2GDd3d02ZcoUGz9+PGLbq2tZ17Su7ULR2sp5z49oZpJno0J7
IBy9u38eeah6J90Douhnolt68neifF6f/ZorisBzUP2Fd7+FWITz5s0r7i+O
xl+c8PXy+/ikz0Z1LzT9ZP9M8lD1TnIvWNYz0S09/5DWr7+8CTwHuQ/ETlXX
diEUPT+imUn2TxBL/2I25lv+uVSmqq/qnQS1o1c5byro2swKOejeXyEWYWE5
mNeazFnV/uqrX2lezg3vmd16Xjhrjqqequ+GBGNE1X5qR6+yalxVknVPyyLw
HOS5KHaqc+fOzf8vTBnzI5KY9J5w3Vtm5/3Sv7xlqHqqvknwvBesqfFVy57M
fi3mSeA5yDgZ7DQLGyejOWBV2dco6T2hePbBzt+rXvVTPZPgfS9Y75GfM3t7
ZfZrMi8Cz0EASIDmR1RtvbIJ+ycru+aS3z09HrfvXeYiVL1UvyRz5oXazbvM
9Y79XvKyFwU5CAB94TE/IonDtkq+p4H2XLhhQjyf27vcear6qF5J9pQQai+1
m3e5t/TiI7Jfn3lADgJAb7y/0eykb/v3k72ZdD6hWLcmXgO1XwXKnYeqh+qj
eiXFc5xvM/Xu2QtyEAD6QvMkljxqduu5ZpMHmh26jX+fWe8NE5PXZe3b8XjX
ds9ClV/1UH2SonbyLndfag9Er7XXyEEASMurS8zuvtrsosPNRnzBN1eSzq2v
oey48vj8954tMy9U/jQZ6DVnvi81XvT0H5n98T/MHr8jXX3yhhwEgFbRmL+H
bzGbNsbslH3MDii5T9UeQ2nQ/IKZp5sd/FH/PEijyqtyJ50fUaMKe1EdtavZ
7w8y677YbOkT8TP3qkAOAkDeaF2vp++Nx3DonVQZ9yI6Vxo0tuSuK82O+5J/
RiRR5VR5k46JqaF2KbusumfV70P6vUjzbaq6vnYNchAAikZ7kmsfIN0LnBvd
EwzfuZj+98az05dL+7FXbS7Blqp8Kmfavd3VHmWUT++MJw0wu/mceI3vJGva
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
uHfu1Ph/HhTWbA==
"], {{0, 450.}, {450., 0}}, {0, 255},
ColorFunction->RGBColor,
ImageResolution->{72, 72}],
BoxForm`ImageTag[
      "Byte", ColorSpace -> ColorProfileData[CompressedData["
1:eJx9kT9IHEEUhz9P5USUSHKICSlWMFYKwUiwjJeACAaOVUETC/ffrQe3e8fs
igiWgbRCCpM0uSRFmtRJa2ErCIImENKlS6VoI7K+2Tu4QzwHZuab37zfY96b
YbtiFjNA1COLaW1MK2Vtzg/IYTGMSn7oubNh7PmemrI7RKzpWDK1shNEXY8h
CGNlzuSNpeVXRvYfWQbJcZf7lhNVpwuFOdqO8yN0Qg7Hda72cTeOfteLHOgw
hJ85VRULrwo/3Yirmt8L55w1yxX+Ljym5IHCv7Ru1/m/Zj/ltKicWjCfC+eE
Db+F7RZ21lQgPCk84gah5M8s1dnVvKU5KK87jXfqCvu8cHFe6zIfMsMsLylg
YLNOiTIx47KHokSYcp9v43+Q+gvissVVwhHHCyoEWKkf/QfXexsVn0zUM/Xl
oftvkpw+guw7uNxOkovPSXL5BTr/wG7Y9FdqMHUm+nZTG/kEd97Aj72mZu/A
z7cw9LtqKSuVOmVmikU4+SbftAz3DqD3db1vjXu+HsOC9GpuHz58hFFfcq+0
qbuntW+3xjT6dwW8NX+V
"], "RGB", "XYZ"], Interleaving -> True, MetaInformation -> Association[
        "Exif" -> Association[
          "ImageWidth" -> 256, "ImageLength" -> 256, "BitsPerSample" -> {8, 8, 8}, "Compression" -> "JPEG (old-style)", "PhotometricInterpretation" -> "YCbCr", "Orientation" -> Association[
            "CameraTopOrientation" -> Top, "Mirrored" -> False], "SamplesPerPixel" -> 3, "XResolution" -> 72, "YResolution" -> 72, "ResolutionUnit" -> "Inch", "Software" -> "GIMP 2.10.24", "DateTime" -> DateObject[{2021, 7, 22, 16, 39, 49.}, "Instant", "Gregorian", None], "JPEGInterchangeFormat" -> 316, "JPEGInterchangeFormatLength" -> 8699, "ExifTag" -> 190, "ColorSpace" -> "RGBColor"], "XMP" -> Association[
          "XMPMediaManagementSchema" -> Association[
            "DocumentID" -> "gimp:docid:gimp:4057f25f-598e-4de6-bf29-b8ffad04f0e2", "InstanceID" -> "xmp.iid:07eb4e97-fe57-40d2-b506-5101718e363b", "OriginalDocumentID" -> "xmp.did:2e85196f-2700-4f9e-90c7-cf3a07557a2c", "History[1]" -> Association[
              "Event" -> Association[
                "Action" -> "saved", "Changed" -> "/", "InstanceID" -> "xmp.iid:3a750f2b-2356-450b-8e90-71207fff4894", "SoftwareAgent" -> "Gimp 2.10 (Linux)", "When" -> DateObject[{2021, 7, 22, 16, 39, 50.}, "Instant", "Gregorian", -5.]]]], "DublinCoreSchema" -> Association["Format" -> "image/png"],
            "GIMP" -> Association[
            "API" -> 2., "Platform" -> "Linux", "TimeStamp" -> 1626989990937103, "Version" -> "2..10.24"], "XMPBasicSchema" -> Association[
            "CreatorTool" -> "GIMP 2.10"]]]],
Selectable->False],
DefaultBaseStyle->"ImageGraphics",
ImageSizeRaw->{450., 450.},
PlotRange->{{0, 450.}, {0, 450.}}]\);
In[20]:=
certificateData = <|"Name" -> "NFT Certificate", "Creator" -> "Dr. Wily", "PublicKey" -> "e00fb4986fb175a65f1c9c45f016f70fac1a38ced93541eca6aa44568d7cf0b4", "Country" -> "Peru"|>;
In[21]:=
Export[FileNameJoin[{$TemporaryDirectory, "CertificateThumbnail.png"}], certificateThumbnail, "PNG"];
In[22]:=
Export[FileNameJoin[{$TemporaryDirectory, "NFTCertificate2.json"}], certificateData, "JSON"];

Mint the NFT:

In[23]:=
myNFTCertificate = ResourceFunction["MintNFT"][<|
    "Name" -> "My NFT Certificate",
    "Thumbnail" -> File[FileNameJoin[{$TemporaryDirectory, "CertificateThumbnail.png"}]],
    "Source" -> File[FileNameJoin[{$TemporaryDirectory, "NFTCertificate.json"}]],
    "Description" -> "Minting my first NFT Certificate"
    |>,
   <|"OwnerAddress" -> myAddress ,
    "PrivateKey" -> myKeys["PrivateKey"]
    |>, "Preview" -> False];

Download the files linked to the NFT:

In[24]:=
certificateTXID = myNFTCertificate["TransactionID"]
Out[24]=
In[25]:=
certificateTXData = BlockchainTransactionData[certificateTXID];
In[26]:=
jsonCID = StringDrop[
  First[Lookup[
    Flatten[Nest[Values, certificateTXData["Metadata"], 3]], "src"]], 7]
Out[26]=
In[27]:=
thumbnailCID = StringDrop[
  First[Lookup[
    Flatten[Nest[Values, certificateTXData["Metadata"], 3]], "image"]], 7]
Out[27]=
In[28]:=
jsonFile = ExternalStorageDownload[jsonCID, ExternalStorageBase -> "IPFS"]
Out[28]=
In[29]:=
Dataset[Import[jsonFile, "RawJSON"]]
Out[29]=
In[30]:=
thumbnailFile = ExternalStorageDownload[thumbnailCID, ExternalStorageBase -> "IPFS"]
Out[30]=
In[31]:=
Import[thumbnailFile]
Out[31]=

Reset the blockchain settings:

In[32]:=
$BlockchainBase = Automatic;

Options (5) 

BlockchainBase (2) 

Mint an NFT on the Cardano testnet by using the BlockchainBase option:

In[33]:=
tempKeys = \!\(\*
TagBox[
FrameBox["\<\"Private and Public Keys Association\"\>"],
"Placeholder"]\);
In[34]:=
tempAddress = BlockchainKeyEncode[tempKeys["PublicKey"], "Address"];
In[35]:=
(* Evaluate this cell to get the example input *) CloudGet["https://www.wolframcloud.com/obj/3b2568ae-347c-40b6-b2a3-910daaad83e0"]
In[36]:=
thumbnailImage = ImageCrop[
   ImageResize[finalImage, {Automatic, 400}, Resampling -> "Nearest"], {400, 400}];
In[37]:=
nftAlphaTest2 = ResourceFunction["MintNFT"][<|
   "Name" -> "Alpha-Test-1",
   "Thumbnail" -> thumbnailImage,
   "Source" -> finalImage,
   "Description" -> "Alpha-Test Minting 3",
   "NFTQuantity" -> 10
   |>,
  <|"OwnerAddress" -> tempAddress ,
   "PrivateKey" -> tempKeys["PrivateKey"]
   |>, "Preview" -> False, BlockchainBase -> {"Cardano", "Testnet"}]
Out[38]=

Get the NFT metadata from the Cardano blockchain:

In[39]:=
nftMetadata = BlockchainTransactionData[nftAlphaTest2["TransactionID"], "Metadata", BlockchainBase -> {"Cardano", "Testnet"}];
In[40]:=
Flatten[Nest[Values, nftMetadata, 3]]
Out[40]=
In[41]:=
Dataset[Flatten[Nest[Values, nftMetadata, 3]]]
Out[41]=

Preview (3) 

Set the default blockchain:

In[42]:=
$BlockchainBase = {"Cardano", "Testnet"}
Out[42]=

Get an image to use for the NFT, and your keys and address:

In[43]:=
image = \!\(\*
GraphicsBox[RasterBox[CompressedData["
1:eJzt2e3NI7kRReEBHIkjcQx2CAb82zE5Q4fgXRj6sYNeTrPF6jqXPA+wgHH9
qkWV+FWav/7z3//4119+/Pjx99/++89v//3+v6/9929/+n/d+rvZ/On7rPr7
KtZnzPqslTruj7fmQzXquKp8e15UjyNl/qSMp6ueb+3/6SiflzZ/qqWP/6Pq
vrTLfLA+Y+n1+fl1tDrbN41Zn7H0+uxyz6TMhw/6vp2er5I+b7593ern71LP
b59/Wv4r7udrnjuL9n3R9v+nrM+Y9bm2ejyUfWaW586Y9Rmj7QMp98yn7/Pt
39O+r1NR1kHKeknbT6jj0h+5n6+Vsp90O2U+PGV9rnWdR9S62Tc9e59Vf1/F
+oyln+OzqPvPXbT5mTKe3ftEipR7e8r+v8t4qtDW76xT9xP6/t/N+oxR7ttp
9aTNE8r3OMv6jJ1WH+o5TpkPH5R7Jm3fpo3nLZR1Q11fqd8zbT6njKfqdVXo
+3n3+9Du29Wsz1h6fd6uK/X33irU75FSJ+szRq0P5fld+0n3/kOZnx+U8dD2
h/T5Rh3/Kf8e+kEbl/v5WpTzl1qfWfT9vJv1ubbLfrJK6rmZfg+pZn3GqPsA
pT5vofdZ3d8v/R6eYtfxd39f9Htm2npPR/9+u9HXSzfrc23X/Ye2n6efm9Wo
56b1Wfv3FLR9YJf9h4K6XqpV/+5K//emqtdVOeWeWY22r7qf32NfNmZ9xij3
Vdo+QP2+VqHNc8o8nGV9xtLrQ6njLvx+x2jnXVe/6vjX5l1c73tL+X5T1suH
9RlLrw+1rk/Rzrv0eU6dh5Q6WZ8x2vyn1Z82nlXj6N7fKPWhSf+c6eN/ijKf
T1vvtP055Xekbul9WTXrc43W96XXsxtlX51lXzlmfcZOuydQ50M12rlMu/dS
fk9y/Gv/njqfq9Hqc1fKeLqlr5dq1ufaLvvb22h9+i6/D+zWN3XfK6zP2r/v
fu5TKeOh5V1o40+vv+PvRVvXKfXpkn7fS58PH9ZnjH7fOy3XPbR1SllHs6zP
GLU+Vc+njGPV61JRvq9ZtPHMcvxrud7voax36vdFu+9Vs28dS68Pta5UtD49
Je9CXUeUOlmfsfT1kvLvWen5KtRzvLovcPxrnu96fydfZdfvq1t6X1bN+lyj
7TMpuWpQzv1Z9pVj1met9Hvaabz3jjn+Z/kqrve1/L7usS8bsz7XqL9bno7W
p++ar5baN9lXjqXXJ/0etUs9KfOfsq6ecvy90s9T2vql7p/Vz7cvG7M+Y/Tz
1HxtLgbaPkPZB2ZZnzHavrHr82n17J7/Vc93/DVOH//u6/euXZ+fdk+2bx1L
rw+1rqei9enmvaj7AKVO1mds13tUl5TxpOyHjv9Zvkr6+GedNp705z+V3pdV
sz7XaH2HuZJV/55fxb5y7LT6vFV3yn2NMo5Vr6NIHX/quH+W/jlcvz3Pp+7/
p/RlH9bnGnU9qhatTzd/lq9G6ZtmndZXzqLWp+r56etx13+/667/2/fAVVI+
b3q+yq7r91codaXNh6fo67cb5T5G28fMn+U6A22fpOxjs6zPmPvYGOW+eCra
fEvpm/R/6fOh2qn7v33rWHp9qHVVDVqfbv5O3oW6j1HqZH3WSq/PW3V/+96y
+nW0+Xla/+T8efe5375Pdf1p0vuyatbnGu3ebv5OLl1JPTftK8fS67PLv69R
+ibaOUKt/9v1PO3zrkKtZ9XzU+q/+nWp9XnK+lyjrl9lo/Xp5sx8NfvKZ++z
6u+r0OYbpS4fu6zfu1LGk1LPWemfN2U8rt+1z0+pz4d96xjlPkO7V5szc2kF
2j5P2YdnWZ8xah9Nqc9T367ft8ex6nVVqut52uddPY5Vr6NIr381+9ax9PpQ
66pMtD7dfI+8C3UfptTptPqk/HsHLV/F+q9F+1zOH2a+ylvnVnpfVs36XKOt
O/M9cqkD5fftWaf1lbOo9aE9P5V1X8vPm/X8XVC+h13usfat16jnuzRC69PN
z8xXs6989j6r/r4KdX6+fS9a/bqq7zd9vVPvdbTxO3/WPPfp697us7rP91n0
enajr3dz8zdzKQHtnKKcI7Osz1q0fZj6/VY9f9f6p4//6fuscvr8SWPfOpZe
H2pdpSu0Pt3c/E7ehXqOUOqUXh9KHT9SxrPrev+gjusuyvhPmz+7jCe9L6tm
fa7R7o3m5ndyaUe79UEpfWU12r5H/f08df4/Rb+X0vJfSd0fZrl+nz0/7Z5J
3x+6UOe/1Il2XpubV+Srpd4bvVePpdwzd/8d4JR7KU36/uD6HaPOf/eHMcp5
SrvXmZtX5JJ45yzlHJx1Wn0odX8qpY/oRuvjKPN/Fm0+UOryVPrvwLT58FR6
fah1lTrQ+nRzc0LehXoOUupErU/V89PH/5b0e+ld1PmfPh+qnp++fmnz/6lT
9odZtHuXuTkhlzSv+l5UxXv1WPo+TB2/99JrKeM5bT64ft9Fnw9dqL+rSDuj
9enm5on5aqf3lU/fZ9XfU6SO+4O6vu6i3kv9XS5D+vg/7FvHKOcR7V5kbp6Y
S6pHuydQzvFZ6fWh9Evfvo4yHz4o49/lHKfU8ynX75q/p87PWen1odZV2hGt
Tzc3PyHvQj3HKXWifb9dz0+ZD9Tx06TXkzb+u3ZZv9VOmQ+zaPcWc/MTckk8
lH+/mJV+r66Wfg+flX5O0c5r69nrtPX7Yd967dTf2aSd0c5rc3Pzerv1lbv2
3dR7OGU+fKT+jkTjfOgZx9vvc0rf+kHfz83NzTm5pHy0ew7lHjKLWh/K82nn
1659x+rXOR/Woqxfan1mpff11LpKmkc7v8zNzb/Pu1DvIZQ6UecDpT5vod2r
73I+1Hh7PqTs5x/pfWsV2rlvbm7+fS7pPN/eW7pQ+wJane6inUennYMp4zkt
T2Pfes3fhSTNop1H5ubm7+erpfaV6X03pY67oN6rnQ89UtZ79/4/i3Je0M5l
c3Pz93NJ+hXaPY1yj5pF27dp9aeNZ9U40s7xU77frvXV/f3OSu/rqXWVxEPr
083Nzfl5F+o9ilKn0+751PlAQ+tT7koZT7f0vrUK7dw0Nzfn55K0GuXfa2ZR
+6yqOqXUvwvtvE4/908dj33rtVN/p5LERTuvzc3N98tXo/SVs6h9d9XzKeNY
9bpT+P2ueT51/5xF2W9p55q5ufl+uSR1o90zKffAWennSNfzzcf5Krt+v92q
9ivqfitJVWjnr7m5uXkX6j2QVqe70vssjfn93pPet1ahnTvm5ubmkpTm23tj
l/S+O70P2qWetPGsHsfbz7dvvfZWPSWJgtanm5ubm3ffG6vuydVo9dz1+bR6
0saT/vzu/WcWZb+inQvm5ubmafu5JFWj/fsO5R47a9c+qMtp40l//lNV6526
X0lSKlqfbm5ubr7r74HUe+zb/36U9j7f9ilvj2PV67qfT50/tL61Cm3fNjc3
N9/1fihJVJQ+aBa17656fvq52fX87vpQ6kqbD7Oo9ZekVLQ+3dzc3JyWrzb7
PpR77C71r0Lp96hOnT+U9U7bV83Nzc1puSTpO3f317f2bco9vFp6fdJ/h0md
Nz97uz7d612SdI3Wp5ubm5un512o93BKn0WtT9XzafM5Zb6dtt7Nzc3NzSVJ
HSh94izaubNrfVLO8V1+x6hC/V1FknSN1qebm5ubn5avNvs+lHs4tY+m1Ocp
yu8w1DpS1gttXzI3Nzc/LZcksX3b16w+F+h9RPXz0/NV0n/noa4XSVIP2nlt
bm5ubj7Ou+zSR9DqSkOpv+vF3Nzc3PzNXJK0l2/7ji7Uc3D2ddX1f3s83fWv
Qv3dRpLUg9anm5ubm5uvzVer6stoaPWnjectlPlGW9fm5ubm5mtzSdLZ7p4P
b507VX0Q7RzcZTxvf1/d802StCdan25ubm5u3pt3oY2f2mdRfgegfV+zaOvO
3Nzc3Lw3lyRpBqUvm5XSJ6b9DlCF+ruEJGlPtD7d3Nzc3DwrX232farGld5f
+X2Zm5ubm5vfzyVJqnT3/HnrXKs+D7/9vFWvW/38Xb4vSZJ+R+vTzc3Nzc33
zrukf9708c+izVtzc3Nz871zSZJI7p5X6efaqeNP/9ySpD3R+nRzc3Nzc/NK
s+9D6dPf6kOrPgdtXpmbm5ubm0uStItv+9auc7Pr+as/r/cLSdIOaH26ubm5
ubn5N3mX9D56Fu17Nzc3Nzc3/yaXJOkkd8/D9D736fO9L0iSTkTr083Nzc3N
zd/MV6P2u0+fa25ubm5ufkIuSZL+3N3zk3qOe/5LkvRrtD7d3Nzc3NycnKeg
1c3c3Nzc3JycS5Kkde6et0/PZc9zSZLWo/Xp5ubm5ubmO+Wr0D6Xubm5ubn5
TrkkSXqP57EkSQT/A3ntk+c=
"], {{0, 0}, {161, 81}}, {0, 1}],
Frame->False,
FrameLabel->{None, None},
FrameTicks->{{None, None}, {None, None}},
GridLinesStyle->Directive[
GrayLevel[0.5, 0.4]],
ImageSize->250,
Method->{"DefaultBoundaryStyle" -> Automatic, "DefaultGraphicsInteraction" -> {
        "Version" -> 1.2, "TrackMousePosition" -> {True, False}, "Effects" -> {
          "Highlight" -> {"ratio" -> 2}, "HighlightPoint" -> {"ratio" -> 2}, "Droplines" -> {
            "freeformCursorMode" -> True, "placement" -> {"x" -> "All", "y" -> "None"}}}}, "DefaultPlotStyle" -> Automatic},
PlotRangePadding->0]\);
In[44]:=
myKeys = \!\(\*
TagBox[
FrameBox["\<\"Private and Public Keys Association\"\>"],
"Placeholder"]\);
In[45]:=
myAddress = BlockchainKeyEncode[myKeys["PublicKey"], "Address"];

To get a preview of the NFT without submitting the transaction to the blockchain, use the "Preview" option:

In[46]:=
ResourceFunction["MintNFT"][<|
   "Name" -> "My First NFT",
   "Thumbnail" -> ImageResize[image, 100],
   "Source" -> image,
   "Description" -> "Minting my first NFT"
   |>,
  <|"OwnerAddress" -> myAddress ,
   "PrivateKey" -> myKeys["PrivateKey"]
   |>, "Preview" -> True] // Dataset
Out[46]=
In[47]:=
%["BlockchainTransaction"]
Out[48]=

Resource History

Related Resources

Author Notes

The current implementation of MintNFT only works with the Cardano blockchain. Future versions will support other blockchains.

License Information