<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: mujin</title>
    <description>The latest articles on DEV Community by mujin (@mujin).</description>
    <link>https://dev.to/mujin</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4222179%2Fc61ba1b5-653f-43f1-8b14-7a6656269fe4.jpg</url>
      <title>DEV Community: mujin</title>
      <link>https://dev.to/mujin</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mujin"/>
    <language>en</language>
    <item>
      <title>What one NFT actually costs to make, start to finish</title>
      <dc:creator>mujin</dc:creator>
      <pubDate>Mon, 02 Nov 2026 13:25:51 +0000</pubDate>
      <link>https://dev.to/mujin/what-one-nft-actually-costs-to-make-start-to-finish-1kea</link>
      <guid>https://dev.to/mujin/what-one-nft-actually-costs-to-make-start-to-finish-1kea</guid>
      <description>&lt;p&gt;I run a small pipeline: SD1.5 on a 4GB GTX 1650, my own ERC-721 contract, hand-built Seaport listings, a daemon that restocks, and a bot that checks everything. When people ask what a piece costs, they usually mean gas. Gas is the small part. Here's the real breakdown from the first run of 22 pieces.&lt;/p&gt;

&lt;h2&gt;
  
  
  The compute side
&lt;/h2&gt;

&lt;p&gt;Each image is 512x768 at fp32 with model offload. On the 1650 that's about 150 seconds per image. The first run was 22 pieces, so roughly 55 minutes of pure generation, spread over a couple of evenings because I wasn't leaving the card pinned.&lt;/p&gt;

&lt;p&gt;Electricity is where I'd rather not fake precision. I didn't meter the wall. Qualitatively: a 1650 under load draws a modest amount, and 55 minutes of it is cheap enough that I stopped thinking about it. If you want a number, measure your own draw. I won't invent one.&lt;/p&gt;

&lt;h2&gt;
  
  
  The on-chain side
&lt;/h2&gt;

&lt;p&gt;The preload is the part I track. Every piece carries about 0.0000008 ETH of on-chain preload on Base. That's not a typo. At 22 pieces the preload total is under 0.00002 ETH. Mint price is 0.00063 ETH per piece, so the preload is roughly a thousandth of the mint price per token.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Item&lt;/th&gt;
&lt;th&gt;Per piece&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Generation time&lt;/td&gt;
&lt;td&gt;~150 s&lt;/td&gt;
&lt;td&gt;512x768, fp32, offload&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;On-chain preload&lt;/td&gt;
&lt;td&gt;~0.0000008 ETH&lt;/td&gt;
&lt;td&gt;Base&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mint price&lt;/td&gt;
&lt;td&gt;0.00063 ETH&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Preload / mint price&lt;/td&gt;
&lt;td&gt;~0.13%&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The part nobody prices
&lt;/h2&gt;

&lt;p&gt;The contract, the Seaport listing builder, the restock daemon, and the self-checking bot are all mine. That work doesn't show up on a per-piece line item, but it dominates the timeline. The test suite has about 125 tests. Those tests exist because hand-built Seaport listings fail in ways that look fine until they don't, and because a daemon that restocks needs to be boringly correct.&lt;/p&gt;

&lt;p&gt;Here's the shape of the preload step, stripped down:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;PRELOAD_WEI&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;800_000_000_000&lt;/span&gt;  &lt;span class="c1"&gt;# ~0.0000008 ETH
&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;attach_preload&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;piece&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;account&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;tx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;contract&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;functions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;preload&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;piece&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;token_id&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;build_transaction&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;value&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;PRELOAD_WEI&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;nonce&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;account&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_transaction_count&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;account&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;address&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;account&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sign_transaction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nothing clever. That's the point. The expensive parts were the contract surface, the listing builder, and the tests that keep both honest.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it actually costs
&lt;/h2&gt;

&lt;p&gt;Per piece, the marginal cost is generation time plus a rounding-error amount of ETH on Base. The fixed cost is the pipeline itself: the contract, the daemon, the bot, the 125 tests. If you count your own hours at any sane rate, the fixed cost dwarfs the marginal cost by orders of magnitude. The 22 pieces made that obvious to me. The next 22 will be nearly free by comparison.&lt;/p&gt;

&lt;p&gt;So when someone asks "what does one NFT cost to make," the honest answer is: almost nothing per piece, and everything up front.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Takeaway:&lt;/strong&gt; measure your marginal cost (seconds of compute, wei of preload) separately from your fixed cost (contract, tooling, tests). Only one of them scales with collection size, and it's not the one that hurts.&lt;/p&gt;

&lt;p&gt;The collection this comes from is at &lt;a href="https://charming-llama-47b816.netlify.app" rel="noopener noreferrer"&gt;https://charming-llama-47b816.netlify.app&lt;/a&gt; if you want to see the output.&lt;/p&gt;

</description>
      <category>web3</category>
      <category>nft</category>
      <category>python</category>
      <category>ai</category>
    </item>
    <item>
      <title>I shipped 22 anime NFTs from a 4GB GPU — three things that cost me a full day</title>
      <dc:creator>mujin</dc:creator>
      <pubDate>Mon, 02 Nov 2026 11:07:35 +0000</pubDate>
      <link>https://dev.to/mujin/i-shipped-22-anime-nfts-from-a-4gb-gpu-three-things-that-cost-me-a-full-day-dnb</link>
      <guid>https://dev.to/mujin/i-shipped-22-anime-nfts-from-a-4gb-gpu-three-things-that-cost-me-a-full-day-dnb</guid>
      <description>&lt;p&gt;I generated 22 anime portraits on a &lt;strong&gt;GTX 1650 with 4GB of VRAM&lt;/strong&gt;, wrote my own ERC-721 and Seaport listing layer in Python, and put the whole thing on Base.&lt;/p&gt;

&lt;p&gt;This is not a "look at my NFT" post. It's the three bugs that ate a day, because none of them throw an error that points at the real cause.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. fp16 silently produces NaN on GTX 16-series cards
&lt;/h2&gt;

&lt;p&gt;First run: 20 images came out &lt;strong&gt;completely black&lt;/strong&gt;. Not dark — pixel mean &lt;code&gt;0.0&lt;/code&gt;, non-black pixel ratio &lt;code&gt;0%&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;pipe&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;StableDiffusionPipeline&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;from_single_file&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ckpt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;torch_dtype&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;float16&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;img&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;pipe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;num_inference_steps&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;images&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="c1"&gt;# np.asarray(img).mean() -&amp;gt; 0.0
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nothing in the pipeline warns. The diffusers call returns successfully, and only when you inspect the tensor do you see &lt;code&gt;invalid value encountered in cast&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; run fp32 on small/consumer cards and offload modules instead of quantizing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;pipe&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;StableDiffusionPipeline&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;from_single_file&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ckpt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;torch_dtype&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;float32&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;pipe&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;enable_model_cpu_offload&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;   &lt;span class="c1"&gt;# 4GB card, ~2.5 min per 512x768 image
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you keep fp16, at minimum &lt;code&gt;pipe.upcast_vae()&lt;/code&gt; — but on 4GB that still left me with NaN in the UNet. fp32 + offload was the only thing that worked.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Seaport's order typehash depends on EIP-712 type ordering
&lt;/h2&gt;

&lt;p&gt;I built Seaport &lt;code&gt;OrderComponents&lt;/code&gt; by hand. The signature was rejected by OpenSea with &lt;code&gt;Signature invalid&lt;/code&gt;, and my locally computed order hash didn't match &lt;code&gt;Seaport.getOrderHash()&lt;/code&gt; on-chain.&lt;/p&gt;

&lt;p&gt;The cause: EIP-712 &lt;code&gt;encodeType(primaryType)&lt;/code&gt; appends &lt;strong&gt;referenced types in alphabetical order&lt;/strong&gt;. My type string had &lt;code&gt;OfferItem&lt;/code&gt; before &lt;code&gt;ConsiderationItem&lt;/code&gt;. Alphabetically, &lt;code&gt;ConsiderationItem&lt;/code&gt; comes first.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;OrderComponents&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;address&lt;/span&gt; &lt;span class="n"&gt;offerer&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="n"&gt;address&lt;/span&gt; &lt;span class="n"&gt;zone&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="nc"&gt;OfferItem&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;offer&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="nc"&gt;ConsiderationItem&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;consideration&lt;/span&gt;&lt;span class="o"&gt;,...)&lt;/span&gt;
&lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nc"&gt;ConsiderationItem&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;uint8&lt;/span&gt; &lt;span class="n"&gt;itemType&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="n"&gt;address&lt;/span&gt; &lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="n"&gt;uint256&lt;/span&gt; &lt;span class="n"&gt;identifierOrCriteria&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="n"&gt;uint256&lt;/span&gt; &lt;span class="n"&gt;startAmount&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="n"&gt;uint256&lt;/span&gt; &lt;span class="n"&gt;endAmount&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="n"&gt;address&lt;/span&gt; &lt;span class="n"&gt;recipient&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nc"&gt;OfferItem&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;uint8&lt;/span&gt; &lt;span class="n"&gt;itemType&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="n"&gt;address&lt;/span&gt; &lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="n"&gt;uint256&lt;/span&gt; &lt;span class="n"&gt;identifierOrCriteria&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="n"&gt;uint256&lt;/span&gt; &lt;span class="n"&gt;startAmount&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="n"&gt;uint256&lt;/span&gt; &lt;span class="n"&gt;endAmount&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Get the order wrong and you get a different typehash — a valid-looking signature that the contract rejects.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How I found it:&lt;/strong&gt; I read the immutable &lt;code&gt;ORDER_TYPEHASH&lt;/code&gt; out of the deployed Seaport runtime bytecode and compared it against &lt;code&gt;keccak256&lt;/code&gt; of candidate strings until one matched. If you're debugging something similar, &lt;code&gt;Seaport.getOrderHash()&lt;/code&gt; is a free oracle — it takes the same components and costs nothing to call.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. If &lt;code&gt;conduitKey != 0&lt;/code&gt;, the Conduit transfers the NFT — not Seaport
&lt;/h2&gt;

&lt;p&gt;I approved Seaport and my listings still couldn't be filled. OpenSea's error was explicit once I read it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Seaport order validation failed: errors=[ERC721 not owner of token, ERC721 conduit not approved]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With OpenSea's default &lt;code&gt;conduitKey&lt;/code&gt;, the transfer is executed by the Conduit contract. &lt;code&gt;isApprovedForAll(owner, seaport)&lt;/code&gt; is irrelevant.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; resolve the conduit for the key and approve that too.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;conduit&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;exists&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;conduit_controller&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;functions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getConduit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;conduit_key&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="c1"&gt;# -&amp;gt; 0x1E0049783F008A0085193E00003D00cd54003c71 on Base
&lt;/span&gt;&lt;span class="n"&gt;nft&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;functions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setApprovalForAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;conduit&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Also worth knowing: &lt;code&gt;Seaport.validate()&lt;/code&gt; &lt;strong&gt;does not verify signatures&lt;/strong&gt;. I fed it 65 random bytes and it passed. Don't use it as a signature oracle.&lt;/p&gt;




&lt;h2&gt;
  
  
  What it actually costs
&lt;/h2&gt;

&lt;p&gt;Measured on Base at ~0.006 gwei:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Operation&lt;/th&gt;
&lt;th&gt;Gas&lt;/th&gt;
&lt;th&gt;Cost&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Deploy ERC-721 + ERC-2981&lt;/td&gt;
&lt;td&gt;1.5M&lt;/td&gt;
&lt;td&gt;0.0000093 ETH&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Write metadata URI (per piece)&lt;/td&gt;
&lt;td&gt;~120k&lt;/td&gt;
&lt;td&gt;0.0000008 ETH&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Buyer mint&lt;/td&gt;
&lt;td&gt;~190k&lt;/td&gt;
&lt;td&gt;paid by buyer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;List on Seaport&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;off-chain signature&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;22 pieces cost under &lt;strong&gt;0.0001 ETH&lt;/strong&gt; in total. The expensive part was my time, not the chain.&lt;/p&gt;




&lt;h2&gt;
  
  
  If you're doing this too
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Test &lt;code&gt;np.asarray(img).mean()&lt;/code&gt; right after your first generation — it catches the fp16 NaN immediately.&lt;/li&gt;
&lt;li&gt;Call &lt;code&gt;Seaport.getOrderHash()&lt;/code&gt; and compare with your local implementation before you sign anything.&lt;/li&gt;
&lt;li&gt;Before listing, check &lt;code&gt;conduitKey&lt;/code&gt; and approve the conduit, not just Seaport.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The collection is live at &lt;a href="https://charming-llama-47b816.netlify.app" rel="noopener noreferrer"&gt;charming-llama-47b816.netlify.app&lt;/a&gt; if you want to see what 4GB gets you.&lt;/p&gt;

&lt;p&gt;Happy to answer questions about any of the three.&lt;/p&gt;

</description>
      <category>web3</category>
      <category>nft</category>
      <category>python</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
