Files
pezkuwi-fellows/approved/0045-nft-deposits-asset-hub.html
T
2024-07-04 00:56:25 +00:00

476 lines
36 KiB
HTML

<!DOCTYPE HTML>
<html lang="en" class="polkadot" dir="ltr">
<head>
<!-- Book generated using mdBook -->
<meta charset="UTF-8">
<title>RFC-0045: Lowering NFT Deposits on Asset Hub - Polkadot Fellowship RFCs</title>
<!-- Custom HTML head -->
<meta name="description" content="An online book of RFCs approved or proposed within the Polkadot Fellowship.">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="theme-color" content="#ffffff">
<link rel="icon" href="../favicon.svg">
<link rel="shortcut icon" href="../favicon.png">
<link rel="stylesheet" href="../css/variables.css">
<link rel="stylesheet" href="../css/general.css">
<link rel="stylesheet" href="../css/chrome.css">
<link rel="stylesheet" href="../css/print.css" media="print">
<!-- Fonts -->
<link rel="stylesheet" href="../FontAwesome/css/font-awesome.css">
<link rel="stylesheet" href="../fonts/fonts.css">
<!-- Highlight.js Stylesheets -->
<link rel="stylesheet" href="../highlight.css">
<link rel="stylesheet" href="../tomorrow-night.css">
<link rel="stylesheet" href="../ayu-highlight.css">
<!-- Custom theme stylesheets -->
<link rel="stylesheet" href="../theme/polkadot.css">
</head>
<body class="sidebar-visible no-js">
<div id="body-container">
<!-- Provide site root to javascript -->
<script>
var path_to_root = "../";
var default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "polkadot" : "polkadot";
</script>
<!-- Work around some values being stored in localStorage wrapped in quotes -->
<script>
try {
var theme = localStorage.getItem('mdbook-theme');
var sidebar = localStorage.getItem('mdbook-sidebar');
if (theme.startsWith('"') && theme.endsWith('"')) {
localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
}
if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
}
} catch (e) { }
</script>
<!-- Set the theme before any content is loaded, prevents flash -->
<script>
var theme;
try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
if (theme === null || theme === undefined) { theme = default_theme; }
var html = document.querySelector('html');
html.classList.remove('polkadot')
html.classList.add(theme);
var body = document.querySelector('body');
body.classList.remove('no-js')
body.classList.add('js');
</script>
<input type="checkbox" id="sidebar-toggle-anchor" class="hidden">
<!-- Hide / unhide sidebar before it is displayed -->
<script>
var body = document.querySelector('body');
var sidebar = null;
var sidebar_toggle = document.getElementById("sidebar-toggle-anchor");
if (document.body.clientWidth >= 1080) {
try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
sidebar = sidebar || 'visible';
} else {
sidebar = 'hidden';
}
sidebar_toggle.checked = sidebar === 'visible';
body.classList.remove('sidebar-visible');
body.classList.add("sidebar-" + sidebar);
</script>
<nav id="sidebar" class="sidebar" aria-label="Table of contents">
<div class="sidebar-scrollbox">
<ol class="chapter"><li class="chapter-item expanded affix "><a href="../introduction.html">Introduction</a></li><li class="spacer"></li><li class="chapter-item expanded affix "><li class="part-title">Newly Proposed</li><li class="chapter-item expanded "><a href="../new/0099-transaction-extension-version.html">RFC-0099: Introduce a transaction extension version</a></li><li class="spacer"></li><li class="chapter-item expanded affix "><li class="part-title">Proposed</li><li class="chapter-item expanded "><a href="../proposed/0091-dht-record-creation-time.html">RFC-0091: DHT Authority discovery record creation time</a></li><li class="chapter-item expanded "><a href="../proposed/0092-unbonding_queue.html">RFC-0092: Unbonding Queue</a></li><li class="chapter-item expanded "><a href="../proposed/00xx-secondary-marketplace-for-regions.html">RFC-0001: Secondary Market for Regions</a></li><li class="chapter-item expanded "><a href="../proposed/00xx-smart-contracts-coretime-chain.html">RFC-0002: Smart Contracts on the Coretime Chain</a></li><li class="spacer"></li><li class="chapter-item expanded affix "><li class="part-title">Approved</li><li class="chapter-item expanded "><a href="../approved/0001-agile-coretime.html">RFC-1: Agile Coretime</a></li><li class="chapter-item expanded "><a href="../approved/0005-coretime-interface.html">RFC-5: Coretime Interface</a></li><li class="chapter-item expanded "><a href="../approved/0007-system-collator-selection.html">RFC-0007: System Collator Selection</a></li><li class="chapter-item expanded "><a href="../approved/0008-parachain-bootnodes-dht.html">RFC-0008: Store parachain bootnodes in relay chain DHT</a></li><li class="chapter-item expanded "><a href="../approved/0010-burn-coretime-revenue.html">RFC-0010: Burn Coretime Revenue</a></li><li class="chapter-item expanded "><a href="../approved/0012-process-for-adding-new-collectives.html">RFC-0012: Process for Adding New System Collectives</a></li><li class="chapter-item expanded "><a href="../approved/0013-prepare-blockbuilder-and-core-runtime-apis-for-mbms.html">RFC-0013: Prepare Core runtime API for MBMs</a></li><li class="chapter-item expanded "><a href="../approved/0014-improve-locking-mechanism-for-parachains.html">RFC-0014: Improve locking mechanism for parachains</a></li><li class="chapter-item expanded "><a href="../approved/0022-adopt-encointer-runtime.html">RFC-0022: Adopt Encointer Runtime</a></li><li class="chapter-item expanded "><a href="../approved/0026-sassafras-consensus.html">RFC-0026: Sassafras Consensus Protocol</a></li><li class="chapter-item expanded "><a href="../approved/0032-minimal-relay.html">RFC-0032: Minimal Relay</a></li><li class="chapter-item expanded "><a href="../approved/0042-extrinsics-state-version.html">RFC-0042: Add System version that replaces StateVersion on RuntimeVersion</a></li><li class="chapter-item expanded "><a href="../approved/0043-storage-proof-size-hostfunction.html">RFC-0043: Introduce storage_proof_size Host Function for Improved Parachain Block Utilization</a></li><li class="chapter-item expanded "><a href="../approved/0045-nft-deposits-asset-hub.html" class="active">RFC-0045: Lowering NFT Deposits on Asset Hub</a></li><li class="chapter-item expanded "><a href="../approved/0047-assignment-of-availability-chunks.html">RFC-0047: Assignment of availability chunks to validators</a></li><li class="chapter-item expanded "><a href="../approved/0048-session-keys-runtime-api.html">RFC-0048: Generate ownership proof for SessionKeys</a></li><li class="chapter-item expanded "><a href="../approved/0050-fellowship-salaries.html">RFC-0050: Fellowship Salaries</a></li><li class="chapter-item expanded "><a href="../approved/0056-one-transaction-per-notification.html">RFC-0056: Enforce only one transaction per notification</a></li><li class="chapter-item expanded "><a href="../approved/0059-nodes-capabilities-discovery.html">RFC-0059: Add a discovery mechanism for nodes based on their capabilities</a></li><li class="chapter-item expanded "><a href="../approved/0078-merkleized-metadata.html">RFC-0078: Merkleized Metadata</a></li><li class="chapter-item expanded "><a href="../approved/0084-general-transaction-extrinsic-format.html">RFC-0084: General transactions in extrinsic format</a></li><li class="spacer"></li><li class="chapter-item expanded affix "><li class="part-title">Stale</li><li class="chapter-item expanded "><a href="../stale/0004-remove-unnecessary-allocator-usage.html">RFC-0004: Remove the host-side runtime memory allocator</a></li><li class="chapter-item expanded "><a href="../stale/0006-dynamic-pricing-for-bulk-coretime-sales.html">RFC-0006: Dynamic Pricing for Bulk Coretime Sales</a></li><li class="chapter-item expanded "><a href="../stale/0009-improved-net-light-client-requests.html">RFC-0009: Improved light client requests networking protocol</a></li><li class="chapter-item expanded "><a href="../stale/0015-market-design-revisit.html">RFC-0015: Market Design Revisit</a></li><li class="chapter-item expanded "><a href="../stale/0020-treasurer-track-confirmation-period-duration-modification.html">RFC-0020: Treasurer Track Confirmation Period Duration Modification</a></li><li class="chapter-item expanded "><a href="../stale/0034-xcm-absolute-location-account-derivation.html">RFC-34: XCM Absolute Location Account Derivation</a></li><li class="chapter-item expanded "><a href="../stale/0035-conviction-voting-delegation-modifications.html"> RFC-0035: Conviction Voting Delegation Modifications</a></li><li class="chapter-item expanded "><a href="../stale/0044-rent-based-registration.html">RFC-0044: Rent based registration model</a></li><li class="chapter-item expanded "><a href="../stale/0054-remove-heap-pages.html">RFC-0054: Remove the concept of "heap pages" from the client</a></li><li class="chapter-item expanded "><a href="../stale/0070-x-track-kusamanetwork.html">RFC-0070: X Track for @kusamanetwork</a></li><li class="chapter-item expanded "><a href="../stale/0073-referedum-deposit-track.html">RFC-0073: Decision Deposit Referendum Track</a></li><li class="chapter-item expanded "><a href="../stale/0074-stateful-multisig-pallet.html">RFC-0074: Stateful Multisig Pallet</a></li><li class="chapter-item expanded "><a href="../stale/0077-increase-max-length-of-identity-pgp-fingerprint-value.html">RFC-0077: Increase maximum length of identity PGP fingerprint values from 20 bytes</a></li><li class="chapter-item expanded "><a href="../stale/0088-broker-pallet-slashable-deposit-purchaser-reputation-reserved-cores.html">RFC-0088: Add slashable locked deposit, purchaser reputation, and reserved cores for on-chain identities to broker pallet</a></li><li class="chapter-item expanded "><a href="../stale/0089-flexible-inflation.html">RFC-0089: Flexible Inflation</a></li></ol>
</div>
<div id="sidebar-resize-handle" class="sidebar-resize-handle"></div>
</nav>
<!-- Track and set sidebar scroll position -->
<script>
var sidebarScrollbox = document.querySelector('#sidebar .sidebar-scrollbox');
sidebarScrollbox.addEventListener('click', function(e) {
if (e.target.tagName === 'A') {
sessionStorage.setItem('sidebar-scroll', sidebarScrollbox.scrollTop);
}
}, { passive: true });
var sidebarScrollTop = sessionStorage.getItem('sidebar-scroll');
sessionStorage.removeItem('sidebar-scroll');
if (sidebarScrollTop) {
// preserve sidebar scroll position when navigating via links within sidebar
sidebarScrollbox.scrollTop = sidebarScrollTop;
} else {
// scroll sidebar to current active section when navigating via "next/previous chapter" buttons
var activeSection = document.querySelector('#sidebar .active');
if (activeSection) {
activeSection.scrollIntoView({ block: 'center' });
}
}
</script>
<div id="page-wrapper" class="page-wrapper">
<div class="page">
<div id="menu-bar-hover-placeholder"></div>
<div id="menu-bar" class="menu-bar sticky">
<div class="left-buttons">
<label id="sidebar-toggle" class="icon-button" for="sidebar-toggle-anchor" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="sidebar">
<i class="fa fa-bars"></i>
</label>
<button id="theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="theme-list">
<i class="fa fa-paint-brush"></i>
</button>
<ul id="theme-list" class="theme-popup" aria-label="Themes" role="menu">
<li role="none"><button role="menuitem" class="theme" id="polkadot">Polkadot</button></li>
<li role="none"><button role="menuitem" class="theme" id="light">Light</button></li>
<li role="none"><button role="menuitem" class="theme" id="rust">Rust</button></li>
<li role="none"><button role="menuitem" class="theme" id="coal">Coal</button></li>
<li role="none"><button role="menuitem" class="theme" id="navy">Navy</button></li>
<li role="none"><button role="menuitem" class="theme" id="ayu">Ayu</button></li>
</ul>
<button id="search-toggle" class="icon-button" type="button" title="Search. (Shortkey: s)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="S" aria-controls="searchbar">
<i class="fa fa-search"></i>
</button>
</div>
<h1 class="menu-title">Polkadot Fellowship RFCs</h1>
<div class="right-buttons">
<a href="../print.html" title="Print this book" aria-label="Print this book">
<i id="print-button" class="fa fa-print"></i>
</a>
</div>
</div>
<div id="search-wrapper" class="hidden">
<form id="searchbar-outer" class="searchbar-outer">
<input type="search" id="searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="searchresults-outer" aria-describedby="searchresults-header">
</form>
<div id="searchresults-outer" class="searchresults-outer hidden">
<div id="searchresults-header" class="searchresults-header"></div>
<ul id="searchresults">
</ul>
</div>
</div>
<!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
<script>
document.getElementById('sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
document.getElementById('sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
Array.from(document.querySelectorAll('#sidebar a')).forEach(function(link) {
link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
});
</script>
<div id="content" class="content">
<main>
<p><a href="https://github.com/polkadot-fellows/RFCs/blob/main/text/0045-nft-deposits-asset-hub.md">(source)</a></p>
<p><strong>Table of Contents</strong></p>
<ul>
<li><a href="#rfc-0045-lowering-nft-deposits-on-asset-hub">RFC-0045: Lowering NFT Deposits on Asset Hub</a>
<ul>
<li><a href="#summary">Summary</a></li>
<li><a href="#motivation">Motivation</a>
<ul>
<li><a href="#requirements">Requirements</a></li>
</ul>
</li>
<li><a href="#stakeholders">Stakeholders</a></li>
<li><a href="#explanation">Explanation</a>
<ul>
<li><a href="#enhanced-approach-to-further-lower-barriers-for-entry">Enhanced Approach to Further Lower Barriers for Entry</a></li>
<li><a href="#short--and-long-term-plans">Short- and Long-Term Plans</a></li>
</ul>
</li>
<li><a href="#drawbacks">Drawbacks</a></li>
<li><a href="#testing-security-and-privacy">Testing, Security, and Privacy</a>
<ul>
<li><a href="#security-concerns">Security concerns</a></li>
</ul>
</li>
<li><a href="#performance-ergonomics-and-compatibility">Performance, Ergonomics, and Compatibility</a>
<ul>
<li><a href="#performance">Performance</a></li>
<li><a href="#ergonomics">Ergonomics</a></li>
<li><a href="#compatibility">Compatibility</a></li>
</ul>
</li>
<li><a href="#unresolved-questions">Unresolved Questions</a></li>
<li><a href="#addendum">Addendum</a>
<ul>
<li><a href="#enhanced-weak-governance-origin-model">Enhanced Weak Governance Origin Model</a></li>
<li><a href="#function-based-pricing-model">Function-Based Pricing Model</a></li>
<li><a href="#linking-deposit-to-usdx-value">Linking Deposit to USD(x) Value</a></li>
</ul>
</li>
</ul>
</li>
</ul>
<h1 id="rfc-0045-lowering-nft-deposits-on-asset-hub"><a class="header" href="#rfc-0045-lowering-nft-deposits-on-asset-hub">RFC-0045: Lowering NFT Deposits on Asset Hub</a></h1>
<div class="table-wrapper"><table><thead><tr><th></th><th></th></tr></thead><tbody>
<tr><td><strong>Start Date</strong></td><td>2 November 2023</td></tr>
<tr><td><strong>Description</strong></td><td>A proposal to reduce the minimum deposit required for collection creation on the Polkadot and Kusama Asset Hubs.</td></tr>
<tr><td><strong>Authors</strong></td><td><a href="https://github.com/poppyseedDev">Aurora Poppyseed</a>, <a href="https://github.com/justLuuuu">Just_Luuuu</a>, <a href="https://github.com/vikiival">Viki Val</a>, <a href="https://github.com/joepetrowski">Joe Petrowski</a></td></tr>
</tbody></table>
</div>
<h2 id="summary"><a class="header" href="#summary">Summary</a></h2>
<p>This RFC proposes changing the current deposit requirements on the Polkadot and Kusama Asset Hub for
creating an NFT collection, minting an individual NFT, and lowering its corresponding metadata and
attribute deposits. The objective is to lower the barrier to entry for NFT creators, fostering a
more inclusive and vibrant ecosystem while maintaining network integrity and preventing spam.</p>
<h2 id="motivation"><a class="header" href="#motivation">Motivation</a></h2>
<p>The current deposit of 10 DOT for collection creation (along with 0.01 DOT for item deposit and 0.2
DOT for metadata and attribute deposits) on the Polkadot Asset Hub and 0.1 KSM on Kusama Asset Hub
presents a significant financial barrier for many NFT creators. By lowering the deposit
requirements, we aim to encourage more NFT creators to participate in the Polkadot NFT ecosystem,
thereby enriching the diversity and vibrancy of the community and its offerings.</p>
<p>The initial introduction of a 10 DOT deposit was an arbitrary starting point that does not consider
the actual storage footprint of an NFT collection. This proposal aims to adjust the deposit first to
a value based on the <code>deposit</code> function, which calculates a deposit based on the number of keys
introduced to storage and the size of corresponding values stored.</p>
<p>Further, it suggests a direction for a future of calculating deposits variably based on adoption
and/or market conditions. There is a discussion on tradeoffs of setting deposits too high or too
low.</p>
<h3 id="requirements"><a class="header" href="#requirements">Requirements</a></h3>
<ul>
<li>Deposits SHOULD be derived from <code>deposit</code> function, adjusted by correspoding pricing mechansim.</li>
</ul>
<h2 id="stakeholders"><a class="header" href="#stakeholders">Stakeholders</a></h2>
<ul>
<li><strong>NFT Creators</strong>: Primary beneficiaries of the proposed change, particularly those who found the
current deposit requirements prohibitive.</li>
<li><strong>NFT Platforms</strong>: As the facilitator of artists' relations, NFT marketplaces have a vested
interest in onboarding new users and making their platforms more accessible.</li>
<li><strong>dApp Developers</strong>: Making the blockspace more accessible will encourage developers to create and
build unique dApps in the Polkadot ecosystem.</li>
<li><strong>Polkadot Community</strong>: Stands to benefit from an influx of artists, creators, and diverse NFT
collections, enhancing the overall ecosystem.</li>
</ul>
<p>Previous discussions have been held within the <a href="https://forum.polkadot.network/t/polkadot-assethub-high-nft-collection-deposit/4262">Polkadot
Forum</a>, with
artists expressing their concerns about the deposit amounts.</p>
<h2 id="explanation"><a class="header" href="#explanation">Explanation</a></h2>
<p>This RFC proposes a revision of the deposit constants in the configuration of the NFTs pallet on the
Polkadot Asset Hub. The new deposit amounts would be determined by a standard deposit formula.</p>
<p>As of v1.1.1, the Collection Deposit is 10 DOT and the Item Deposit is 0.01 DOT (see
<a href="https://github.com/polkadot-fellows/runtimes/blob/v1.1.1/system-parachains/asset-hubs/asset-hub-polkadot/src/lib.rs#L687">here</a>).</p>
<p>Based on the storage footprint of these items, this RFC proposes changing them to:</p>
<pre><pre class="playground"><code class="language-rust"><span class="boring">#![allow(unused)]
</span><span class="boring">fn main() {
</span>pub const NftsCollectionDeposit: Balance = system_para_deposit(1, 130);
pub const NftsItemDeposit: Balance = system_para_deposit(1, 164);
<span class="boring">}</span></code></pre></pre>
<p>This results in the following deposits (calculted using <a href="https://github.com/vikiival/rfc-pricing">this
repository</a>):</p>
<p><strong>Polkadot</strong></p>
<div class="table-wrapper"><table><thead><tr><th><strong>Name</strong></th><th style="text-align: center"><strong>Current Rate (DOT)</strong></th><th style="text-align: center"><strong>Calculated with Function (DOT)</strong></th></tr></thead><tbody>
<tr><td><code>collectionDeposit</code></td><td style="text-align: center">10</td><td style="text-align: center">0.20064</td></tr>
<tr><td><code>itemDeposit</code></td><td style="text-align: center">0.01</td><td style="text-align: center">0.20081</td></tr>
<tr><td><code>metadataDepositBase</code></td><td style="text-align: center">0.20129</td><td style="text-align: center">0.20076</td></tr>
<tr><td><code>attributeDepositBase</code></td><td style="text-align: center">0.2</td><td style="text-align: center">0.2</td></tr>
</tbody></table>
</div>
<p>Similarly, the prices for Kusama were calculated as:</p>
<p><strong>Kusama:</strong></p>
<div class="table-wrapper"><table><thead><tr><th><strong>Name</strong></th><th style="text-align: center"><strong>Current Rate (KSM)</strong></th><th style="text-align: center"><strong>Calculated with Function (KSM)</strong></th></tr></thead><tbody>
<tr><td><code>collectionDeposit</code></td><td style="text-align: center">0.1</td><td style="text-align: center">0.006688</td></tr>
<tr><td><code>itemDeposit</code></td><td style="text-align: center">0.001</td><td style="text-align: center">0.000167</td></tr>
<tr><td><code>metadataDepositBase</code></td><td style="text-align: center">0.006709666617</td><td style="text-align: center">0.0006709666617</td></tr>
<tr><td><code>attributeDepositBase</code></td><td style="text-align: center">0.00666666666</td><td style="text-align: center">0.000666666666</td></tr>
</tbody></table>
</div>
<h3 id="enhanced-approach-to-further-lower-barriers-for-entry"><a class="header" href="#enhanced-approach-to-further-lower-barriers-for-entry">Enhanced Approach to Further Lower Barriers for Entry</a></h3>
<p>This RFC proposes further lowering these deposits below the rate normally charged for such a storage
footprint. This is based on the economic argument that sub-rate deposits are a subsididy for growth
and adoption of a specific technology. If the NFT functionality on Polkadot gains adoption, it makes
it more attractive for future entrants, who would be willing to pay the non-subsidized rate because
of the existing community.</p>
<p><strong>Proposed Rate Adjustments</strong></p>
<pre><pre class="playground"><code class="language-rust"><span class="boring">#![allow(unused)]
</span><span class="boring">fn main() {
</span>parameter_types! {
pub const NftsCollectionDeposit: Balance = system_para_deposit(1, 130);
pub const NftsItemDeposit: Balance = system_para_deposit(1, 164) / 40;
pub const NftsMetadataDepositBase: Balance = system_para_deposit(1, 129) / 10;
pub const NftsAttributeDepositBase: Balance = system_para_deposit(1, 0) / 10;
pub const NftsDepositPerByte: Balance = system_para_deposit(0, 1);
}
<span class="boring">}</span></code></pre></pre>
<p>This adjustment would result in the following DOT and KSM deposit values:</p>
<div class="table-wrapper"><table><thead><tr><th><strong>Name</strong></th><th style="text-align: center"><strong>Proposed Rate Polkadot</strong></th><th style="text-align: center"><strong>Proposed Rate Kusama</strong></th></tr></thead><tbody>
<tr><td><code>collectionDeposit</code></td><td style="text-align: center">0.20064 DOT</td><td style="text-align: center">0.006688 KSM</td></tr>
<tr><td><code>itemDeposit</code></td><td style="text-align: center">0.005 DOT</td><td style="text-align: center">0.000167 KSM</td></tr>
<tr><td><code>metadataDepositBase</code></td><td style="text-align: center">0.002 DOT</td><td style="text-align: center">0.0006709666617 KSM</td></tr>
<tr><td><code>attributeDepositBase</code></td><td style="text-align: center">0.002 DOT</td><td style="text-align: center">0.000666666666 KSM</td></tr>
</tbody></table>
</div>
<h3 id="short--and-long-term-plans"><a class="header" href="#short--and-long-term-plans">Short- and Long-Term Plans</a></h3>
<p>The plan presented above is recommended as an immediate step to make Polkadot a more attractive
place to launch NFTs, although one would note that a forty fold reduction in the Item Deposit is
just as arbitrary as the value it was replacing. As explained earlier, this is meant as a subsidy to
gain more momentum for NFTs on Polkadot.</p>
<p>In the long term, an implementation should account for what should happen to the deposit rates
assuming that the subsidy is successful and attracts a lot of deployments. Many options are
discussed in the <a href="#addendum">Addendum</a>.</p>
<p>The deposit should be calculated as a function of the number of existing collections with maximum
DOT and stablecoin values limiting the amount. With asset rates available via the Asset Conversion
pallet, the system could take the lower value required. A sigmoid curve would make sense for this
application to avoid sudden rate changes, as in:</p>
<p>$$ minDeposit + \frac{\mathrm{min(DotDeposit, StableDeposit) - minDeposit} }{\mathrm{1 + e^{a - b * x}} }$$</p>
<p>where the constant <code>a</code> moves the inflection to lower or higher <code>x</code> values, the constant <code>b</code> adjusts
the rate of the deposit increase, and the independent variable <code>x</code> is the number of collections or
items, depending on application.</p>
<h2 id="drawbacks"><a class="header" href="#drawbacks">Drawbacks</a></h2>
<p>Modifying deposit requirements necessitates a balanced assessment of the potential drawbacks.
Highlighted below are cogent points extracted from the discourse on the <a href="https://forum.polkadot.network/t/polkadot-assethub-high-nft-collection-deposit/4262">Polkadot Forum
conversation</a>,
which provide critical perspectives on the implications of such changes.</p>
<p>Adjusting NFT deposit requirements on Polkadot and Kusama Asset Hubs involves key challenges:</p>
<ol>
<li>
<p><strong>State Growth and Technical Concerns</strong>: Lowering deposit requirements can lead to increased
blockchain state size, potentially causing state bloat. This growth needs to be managed to
prevent strain on the network's resources and maintain operational efficiency. As stated earlier,
the deposit levels proposed here are intentionally low with the thesis that future participants
would pay the standard rate.</p>
</li>
<li>
<p><strong>Network Security and Market Response</strong>: Adapting to the cryptocurrency market's volatility is
crucial. The mechanism for setting deposit amounts must be responsive yet stable, avoiding undue
complexity for users.</p>
</li>
<li>
<p><strong>Economic Impact on Previous Stakeholders</strong>: The change could have varied economic effects on
previous (before the change) creators, platform operators, and investors. Balancing these
interests is essential to ensure the adjustment benefits the ecosystem without negatively
impacting its value dynamics. However in the particular case of Polkadot and Kusama Asset Hub
this does not pose a concern since there are very few collections currently and thus previous
stakeholders wouldn't be much affected. As of date 9th January 2024 there are 42 collections on
Polkadot Asset Hub and 191 on Kusama Asset Hub with a relatively low volume.</p>
</li>
</ol>
<h2 id="testing-security-and-privacy"><a class="header" href="#testing-security-and-privacy">Testing, Security, and Privacy</a></h2>
<h3 id="security-concerns"><a class="header" href="#security-concerns">Security concerns</a></h3>
<p>As noted above, state bloat is a security concern. In the case of abuse, governance could adapt by
increasing deposit rates and/or using <code>forceDestroy</code> on collections agreed to be spam.</p>
<h2 id="performance-ergonomics-and-compatibility"><a class="header" href="#performance-ergonomics-and-compatibility">Performance, Ergonomics, and Compatibility</a></h2>
<h3 id="performance"><a class="header" href="#performance">Performance</a></h3>
<p>The primary performance consideration stems from the potential for state bloat due to increased
activity from lower deposit requirements. It's vital to monitor and manage this to avoid any
negative impact on the chain's performance. Strategies for mitigating state bloat, including
efficient data management and periodic reviews of storage requirements, will be essential.</p>
<h3 id="ergonomics"><a class="header" href="#ergonomics">Ergonomics</a></h3>
<p>The proposed change aims to enhance the user experience for artists, traders, and utilizers of
Kusama and Polkadot Asset Hubs, making Polkadot and Kusama more accessible and user-friendly.</p>
<h3 id="compatibility"><a class="header" href="#compatibility">Compatibility</a></h3>
<p>The change does not impact compatibility as a <code>redeposit</code> function is already implemented.</p>
<h2 id="unresolved-questions"><a class="header" href="#unresolved-questions">Unresolved Questions</a></h2>
<p>If this RFC is accepted, there should not be any unresolved questions regarding how to adapt the
implementation of deposits for NFT collections.</p>
<h2 id="addendum"><a class="header" href="#addendum">Addendum</a></h2>
<p>Several innovative proposals have been considered to enhance the network's adaptability and manage
deposit requirements more effectively. The RFC recommends a mixture of the function-based model and
the stablecoin model, but some tradeoffs of each are maintained here for those interested.</p>
<h3 id="enhanced-weak-governance-origin-model"><a class="header" href="#enhanced-weak-governance-origin-model">Enhanced Weak Governance Origin Model</a></h3>
<p>The concept of a weak governance origin, controlled by a consortium like a system collective, has
been proposed. This model would allow for dynamic adjustments of NFT deposit requirements in
response to market conditions, adhering to storage deposit norms.</p>
<ul>
<li><strong>Responsiveness</strong>: To address concerns about delayed responses, the model could incorporate
automated triggers based on predefined market indicators, ensuring timely adjustments.</li>
<li><strong>Stability vs. Flexibility</strong>: Balancing stability with the need for flexibility is challenging.
To mitigate the issue of frequent changes in DOT-based deposits, a mechanism for gradual and
predictable adjustments could be introduced.</li>
<li><strong>Scalability</strong>: The model's scalability is a concern, given the numerous deposits across the
system. A more centralized approach to deposit management might be needed to avoid constant,
decentralized adjustments.</li>
</ul>
<h3 id="function-based-pricing-model"><a class="header" href="#function-based-pricing-model">Function-Based Pricing Model</a></h3>
<p>Another proposal is to use a mathematical function to regulate deposit prices, initially allowing
low prices to encourage participation, followed by a gradual increase to prevent network bloat.</p>
<ul>
<li><strong>Choice of Function</strong>: A logarithmic or sigmoid function is favored over an exponential one, as
these functions increase prices at a rate that encourages participation while preventing
prohibitive costs.</li>
<li><strong>Adjustment of Constants</strong>: To finely tune the pricing rise, one of the function's constants
could correlate with the total number of NFTs on Asset Hub. This would align the deposit
requirements with the actual usage and growth of the network.</li>
</ul>
<h3 id="linking-deposit-to-usdx-value"><a class="header" href="#linking-deposit-to-usdx-value">Linking Deposit to USD(x) Value</a></h3>
<p>This approach suggests pegging the deposit value to a stable currency like the USD, introducing
predictability and stability for network users.</p>
<ul>
<li><strong>Market Dynamics</strong>: One perspective is that fluctuations in native currency value naturally
balance user participation and pricing, deterring network spam while encouraging higher-value
collections. Conversely, there's an argument for allowing broader participation if the DOT/KSM
value increases.</li>
<li><strong>Complexity and Risks</strong>: Implementing a USD-based pricing system could add complexity and
potential risks. The implementation needs to be carefully designed to avoid unintended
consequences, such as excessive reliance on external financial systems or currencies.</li>
</ul>
<p>Each of these proposals offers unique advantages and challenges. The optimal approach may involve a
combination of these ideas, carefully adjusted to address the specific needs and dynamics of the
Polkadot and Kusama networks.</p>
</main>
<nav class="nav-wrapper" aria-label="Page navigation">
<!-- Mobile navigation buttons -->
<a rel="prev" href="../approved/0043-storage-proof-size-hostfunction.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
<i class="fa fa-angle-left"></i>
</a>
<a rel="next prefetch" href="../approved/0047-assignment-of-availability-chunks.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
<i class="fa fa-angle-right"></i>
</a>
<div style="clear: both"></div>
</nav>
</div>
</div>
<nav class="nav-wide-wrapper" aria-label="Page navigation">
<a rel="prev" href="../approved/0043-storage-proof-size-hostfunction.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
<i class="fa fa-angle-left"></i>
</a>
<a rel="next prefetch" href="../approved/0047-assignment-of-availability-chunks.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
<i class="fa fa-angle-right"></i>
</a>
</nav>
</div>
<script>
window.playground_copyable = true;
</script>
<script src="../elasticlunr.min.js"></script>
<script src="../mark.min.js"></script>
<script src="../searcher.js"></script>
<script src="../clipboard.min.js"></script>
<script src="../highlight.js"></script>
<script src="../book.js"></script>
<!-- Custom JS scripts -->
</div>
</body>
</html>