<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>ink blots</title>
        <link>https://paragraph.com/@jonbray</link>
        <description>ramblings of a terminally onchain man</description>
        <lastBuildDate>Tue, 15 Sep 2026 19:01:02 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <image>
            <title>ink blots</title>
            <url>https://storage.googleapis.com/papyrus_images/bc99dfbad5dee2db2b61ea56d335bf1f.png</url>
            <link>https://paragraph.com/@jonbray</link>
        </image>
        <copyright>All rights reserved</copyright>
        <item>
            <title><![CDATA[Introducing Seer]]></title>
            <link>https://paragraph.com/@jonbray/introducing-seer</link>
            <guid>kaJAntdO82grse96JbAH</guid>
            <pubDate>Wed, 19 Nov 2025 17:00:00 GMT</pubDate>
            <description><![CDATA[Prediction markets were one of the earliest proposed use-cases for smart contract blockchains, promising a way for participants to have skin in the game, hedge against real-world events, and predict outcomes in a way that is more accurate than other methodology. It wasn't until the 2024 election cycle that prediction markets really went mainstream, with Polymarket alone taking in $2.7 billion in volume since their launch in early 2024. As the prediction market meta grows and more protocols la...]]></description>
            <content:encoded><![CDATA[<p>Prediction markets were one of the earliest proposed use-cases for smart contract blockchains, promising a way for participants to have skin in the game, hedge against real-world events, and predict outcomes in a way that is more accurate than other methodology. It wasn't until the 2024 election cycle that prediction markets really went mainstream, with Polymarket alone taking in <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://tokenterminal.com/explorer/projects/polymarket/metrics/trading-volume">$2.7 billion in volume</a> since their launch in early 2024.</p><p>As the prediction market meta grows and more protocols launch, this will inevitably lead to fragmentation across markets.</p><p>Enter <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://seer.space">Seer</a>.</p><p>Seer is a prediction market aggregator and arbitrage protocol, building a social-first approach with Farcaster integration that lets you discover and buy positions from any supported market and create an avenue for cross-market arbitrage with matched-pair mintable positions.</p><p>One interface, many protocols, best price.</p><p>In addition to aggregating third-party protocols, Seer will host it's own native markets that utilize a matched-pair system for minting positions, a prediction market primitive that allows for advanced arbitrage and shorting opportunities. The router allows for positions to be opened across Seer, Polymarket, and other integrated protocols to deliver the absolute best execution price. </p><h2 id="h-why-aggregation-arbitrage" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Why aggregation + arbitrage?</h2><p>Prediction markets are unique in that one side of each market guarantees a profit. What if you could always be on the winning side of that?</p><p>When a spread opens up across markets, an opportunity opens up to take both sides of a trade and mathematically guarantee profit. The Seer router tracks these opportunities and lets users take advantage of them quickly.</p><p>Even when these opportunities aren't present, aggregated routing across integrated markets provides users a way to fill at the best odds available.</p><p>Continuous arbitrage and routing should also help nudge fragmented markets toward a shared, more accurate probability surface—which improves liquidity, reduces mispricing, and yields better forecasts.</p><h2 id="h-social-first" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Social-first</h2><p>Prediction markets are social by nature, participants beliefs are traded on the open market. The initial launch of the Seer app and Farcaster mini-app will allow users to:</p><ul><li><p>Browse trending markets across Seer, Polymarket, and other integrated protocols.</p></li><li><p>See unified odds, depth, and fees.</p></li><li><p>Buy/sell through their Farcaster wallet on Base, regardless of the venue's underlying network.</p></li><li><p>Share casts with live odds, PnL, and outcome previews.</p></li></ul><h2 id="h-router-v1" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Router v1</h2><p>The initial launch of Seer (January 2026) will feature Seer Router v1, providing:</p><ul><li><p>Best-price execution across Seer-native markets and Polymarket</p></li><li><p>Unified portfolio view across all markets</p></li><li><p>A shared schema for categories, oracles, and metadata so identical markets across chains/protocols can be recognized and routed</p></li><li><p>Public price/route API for cross-market quotes</p></li></ul><h3 id="h-market-normalization" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Market Normalization</h3><p>Seer ingests markets from Seer-native, Polymarket, and other venues into a canonical schema which maps identical markets across venues (event, outcomes, oracle/resolution, fees, network, etc.) and normalizes quotes to the same basis (probability/price, fee-inclusive).</p><h3 id="h-best-execution" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Best-execution</h3><p>For buy/sell requests, the router simulates fills across venues using orderbook depth, fees, and bridge costs (for cross-chain venues), selecting the route (or split-route) that yields the best net price and submits transactions accordingly.</p><h3 id="h-1-click-arbitrage" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">1-click Arbitrage</h3><p>Box arbitrage is a market-neutral trade that buys opposite payoffs on the same event across two venues when their prices sum to less than 1 after all fees. You can purchase the cheaper "YES" on Venue A and the cheaper "NO" on Venue B for the identical market and resolution. One of these payoffs will settle to 1 and the other to 0; therefore, if:</p><p>$$total_entry_cost_C = price_yes_A + price_no_B + fees &lt; 1$$</p><p>Your payout is exactly 1 and guaranteed profit is locked at entry as 1 - C, independent of the event's outcome.</p><p>Users can purchase these opportunities with one-click and hold until resolution for a guaranteed profit. Alternatively, users can monitor the current PnL of the position and cash out at any time.</p><p>As the protocol grows, Seer will utilize protocol-held revenue to execute these trades via arbitrage bots, allowing staked $SEER to capture the profit directly.</p><h2 id="h-matched-pair-tokens" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Matched-pair tokens</h2><p>Seer-native markets are built from the ground-up to make capturing arbitrage across markets easier. Before a result is known, participants can:</p><ul><li><p>Buy either side of the market at it's current price, or</p></li><li><p>Mint a "matched-pair" by depositing $1 of collateral and receiving 1 YES and 1 NO</p></li></ul><p>Once the event resolves, the winning token redeems for $1 and the losing token for $0. A pair always maps back to $1, but any half of a pair can be sold at market value.</p><h3 id="h-why-would-you-mint-both-sides" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Why would you mint both sides?</h3><p>To sell one!</p><p>Minting creates a fresh inventory of YES/NO so you can sell the side the market currently overvalues. For example, let's say in a given market, NO is trading at $0.55. You can deposit $1, get YES+NO, immediately sell NO for $0.55, and you still hold a YES worth ~$0.45. You just manufactured and sold the expensive side instead of waiting for someone to lend it to you.</p><p>This is the equivalent of shorting an outcome.</p><p>It also helps keep prices fair. If NO drifts too high, minters sell NO until prices revert, because they can always turn one pair into cash equal to YES price + NO price (which should be ≈ $1 minus fees).</p><h3 id="h-cross-venue-arbitrage" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Cross-Venue Arbitrage</h3><p>Let's use an actual example to showcase how you can perform cross-venue arbitrage on Seer using a "Will ETH hit an all-time high in 2025?" market that exists on both Seer and Polymarket, with identical resolution text and cutoff.</p><p>On Polymarket, a YES costs $0.46 and on Seer a NO costs $0.48</p><ol><li><p>You chose 1,000 "pairs", for $1000</p></li><li><p>Seer Router computes the effective sum = 0.46 + 0.48 = 0.94 (&lt; 1, a valid arbitrage)</p></li><li><p>Router executes:</p><ol><li><p>Buy 1,000 YES at 0.46 on Polymarket for 460 USDC</p></li><li><p>Mint 1,000 YES + 1,000 NO by depositing 1,000 USDC on Seer, then immediately selling 1,000 NO into Seer's liquidity at 0.48, receiving 480 USDC</p></li></ol></li></ol><p>Regardless of the outcome, exactly one of the two claims pays 1,000 USDC, either on Polymarket or Seer. </p><h2 id="h-dollarseer-token" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">$SEER token</h2><p>Seer is being kicked off with the launch of $SEER token on Clanker, which will over time be integrated as a full-fledged protocol and revenue-sharing token. The use-case of $SEER is to:</p><ul><li><p>Share protocol and arbitrage revenue with stakers</p></li><li><p>Incentivize liquidity and alignment across protocols by weighted routing toward high-quality markets, rewarding participation and spread reduction </p></li></ul><p>Once the Seer Router v1 is launched, $SEER holders will be able to stake their tokens in order to split protocol revenue from native markets and captured arbitrage opportunities.</p><h3 id="h-tokenomics" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Tokenomics</h3><p>$SEER token was launched via Clanker on November 19th 2025.</p><p>Contract Address: 0x45336c84101C6fceDE30c6316Ea72FDBbd753B07</p><ul><li><p><strong>Liquidity: </strong>60%</p></li><li><p><strong>Dev Allocation: </strong>5% — to be staked in protocol</p></li><li><p><strong>Early-adopter reservations: </strong>5% — to be distributed through mini-app</p></li><li><p><strong>Treasury: </strong>30% for long-term growth allocations, market incentives, and ecosystem grants. Vaulted tokens vest linearly over 180 days.</p></li></ul><div data-type="callout" type="info"><link rel="preload" as="image" href="https://paragraph.com/editor/callout/information-icon.png"><div class="callout-base callout-info" data-node-view-wrapper="" style="white-space:normal"><img src="https://paragraph.com/editor/callout/information-icon.png" class="callout-button"><div class="callout-content"><div><p>Trading fees from Clanker are kept as both $ETH and $SEER to prevent ongoing drawdown on price due to fee-collection.</p></div></div></div></div><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.clanker.world/clanker/0x45336c84101C6fceDE30c6316Ea72FDBbd753B07"><strong>Trade $SEER on Clanker</strong></a></p><h2 id="h-roadmap" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Roadmap</h2><h3 id="h-stage-1-router-v1-jan-2026" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Stage 1 - Router v1 - Jan 2026</h3><ul><li><p>Farcaster mini-app to browse, quote and buy across external venues</p></li><li><p>Best-execution routing: fee-inclusive quotes, slippage limits, split routes</p></li><li><p>Box-Arb MVP - `Yes A + No B &lt; 1`with 1-click spread lock</p></li><li><p>Unified portfolio across venues</p></li></ul><h3 id="h-stage-2-seer-native-mintable-markets-q2-2026" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Stage 2 - Seer-Native Mintable Markets (Q2 2026)</h3><ul><li><p>Launch Seer markets with mintable matched-pairs, AMM, RFQ</p></li><li><p>Mirror top external markets 1:1 with mapped resolutions</p></li><li><p>Router v2 choses cheapest leg via:</p><ul><li><p>Direct buy on Seer</p></li><li><p>Mint-and-sell complement on Seer</p></li><li><p>external venue</p></li></ul></li><li><p>$SEER staking with protocol fee-sharing</p></li></ul><h3 id="h-stage-3-ecosystem-alignment" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Stage 3 - Ecosystem Alignment</h3><ul><li><p>Open APIs for quotes, routes, third-party bots</p></li><li><p>Protocol-level arbitrage bots</p></li><li><p>Pooled arbitrage vaults: users stake capital to a managed vault that executes micro-arbs with pro-rate PnL sharing</p></li><li><p>Governance: $SEER holders tune fees, incentives, grants</p></li></ul><hr><h3 id="h-follow-seer" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Follow Seer</h3><p>Follow <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://farcaster.xyz/seerspace">@seerspace</a> and <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://farcaster.xyz/jonbray.eth">@jonbray.eth</a> on Farcaster for updates.</p><h2 id="h-end" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">-- End --</h2><br>]]></content:encoded>
            <author>jonbray@newsletter.paragraph.com (Jon Bray)</author>
            <enclosure url="https://storage.googleapis.com/papyrus_images/ad549bccabcce18c904cc73bc7251842d752c63d359efc66e59a2785c8b76c4e.jpg" length="0" type="image/jpg"/>
        </item>
        <item>
            <title><![CDATA[Pin.sol Whitepaper v1]]></title>
            <link>https://paragraph.com/@jonbray/pinsol-v1</link>
            <guid>qZVjvOyZuOwmJl1BqfIn</guid>
            <pubDate>Sat, 22 Mar 2025 18:00:01 GMT</pubDate>
            <description><![CDATA[AbstractPin.sol is a decentralized protocol designed to incentivize persistent file storage on the InterPlanetary File System (IPFS) through direct ETH payments on EVM networks.]]></description>
            <content:encoded><![CDATA[<div class="relative header-and-anchor"><h2 id="h-abstract">Abstract</h2></div><p>Pin.sol is a decentralized protocol designed to incentivize persistent file storage on the InterPlanetary File System (IPFS) through direct ETH payments on EVM networks. By leveraging a decentralized network of storage providers, a fair node rotation queue system, and a reputation-based reward mechanism, Pin.sol ensures reliable file availability and contract-level access to IPFS nodes for increased composability.</p><div class="relative header-and-anchor"><h2 id="h-introduction">Introduction</h2></div><p>IPFS has emerged as a powerful distributed file system, but it lacks native economic incentives to ensure long-term file persistence. When a file is uploaded to IPFS, there's no guarantee it will remain accessible unless someone actively "pins" it to their node. While solutions to IPFS file availability do exist, none of them are directly composable with the Ethereum ecosystem or smart contracts.</p><p>Current solutions fall into three categories:</p><ol><li><p>Centralized pinning services that create single points of failure and go against the ethos of decentralization</p></li><li><p>Custom blockchain networks like Filecoin and Arweave, which require migration to separate ecosystems</p></li><li><p>Self-hosted infrastructure that is resource-intensive and technically complex</p></li></ol><p>Pin.sol introduces a simple, Ethereum-native solution where IPFS node operators are directly rewarded in ETH for providing reliable pinning services, while users can prioritize their content through market-based mechanisms, all without requiring a separate token economy.</p><div class="relative header-and-anchor"><h2 id="h-core-mechanisms">Core Mechanisms <span data-name="hammer_and_wrench" class="emoji" data-type="emoji"><img src="https://cdn.jsdelivr.net/npm/emoji-datasource-apple/img/apple/64/1f6e0-fe0f.png" draggable="false" loading="lazy" align="absmiddle"></span></h2></div><div class="relative header-and-anchor"><h3 id="h-wallet-linked-ipfs-nodes">Wallet-Linked IPFS Nodes</h3></div><p>Each participating IPFS node connects an Ethereum wallet and stake ETH as collateral to participate in the protocol. Nodes receive ETH payments for pinning files from users, with smart contracts tracking node participation, staking, and ensuring service delivery through community verification of pinned files.</p><div class="relative header-and-anchor"><h3 id="h-fair-queue-system">Fair Queue System</h3></div><p>Participating nodes are placed in a rotation queue to receive pinning assignments. After completing a job, the node moves to the back of the queue to ensure all participating nodes have fair access to earning opportunities. The base ETH cost per file is calculated based on file size and requested duration.</p><div class="relative header-and-anchor"><h3 id="h-reputation-based-reward-distribution">Reputation-Based Reward Distribution</h3></div><p>Nodes build reputation based on reliability and service quality which determines the percentage of payment received from pin requests:</p><ul><li><p>Highest reputation nodes receive 99% of payment</p></li><li><p>Lower reputation nodes receive proportionally less (down to 50%)</p></li></ul><p>Remaining percentage goes to the DAO treasury, with the DAO taking a base 1% of protocol revenue.</p><div class="relative header-and-anchor"><h3 id="h-dual-pricing-models">Dual Pricing Models</h3></div><p>Pin.sol supports two complementary pricing models:</p><div class="relative header-and-anchor"><h4 id="h-1-standard-queue-based-system">1. Standard Queue-Based System</h4></div><p>Users submit pinning requests with required ETH payment based on file size and duration. The protocol automatically assigns files to the next node(s) in the queue based on the specified replication factor.</p><div class="relative header-and-anchor"><h4 id="h-2-direct-node-payments">2. Direct Node Payments</h4></div><p>Users can bypass the queue and pay nodes directly in ETH for long-term pinning, creating a decentralized marketplace where users and nodes negotiate terms. In direct agreements, node reputation does not affect payment percentage.</p><div class="relative header-and-anchor"><h3 id="h-escrow-and-protection-mechanism">Escrow &amp; Protection Mechanism</h3></div><p>Funds are held in escrow and are vested linearly for the duration that pinning service is provided for. If a node unpins content prematurely, the remaining escrowed ETH is returned to the payer with 5% of returned funds being awarded to users who report violations, creating community incentives to report bad actors.</p><div class="relative header-and-anchor"><h3 id="h-node-banning-mechanism">Node Banning Mechanism</h3></div><p>Nodes that consistently fail to meet protocol requirements face progressive penalties to reputation and earnings:</p><p><span data-name="yellow_circle" class="emoji" data-type="emoji"><img src="https://cdn.jsdelivr.net/npm/emoji-datasource-apple/img/apple/64/1f7e1.png" draggable="false" loading="lazy" align="absmiddle"></span> <strong>First offense:</strong> Short-term ban. First offenses do not incur a reputation strike.</p><p><span data-name="orange_circle" class="emoji" data-type="emoji"><img src="https://cdn.jsdelivr.net/npm/emoji-datasource-apple/img/apple/64/1f7e0.png" draggable="false" loading="lazy" align="absmiddle"></span> <strong>Repeated offenses:</strong> Increasingly longer ban and reputation hit. The more a node misbehaves, the lower it's reputation gets (down to 50%).</p><p><span data-name="red_circle" class="emoji" data-type="emoji"><img src="https://cdn.jsdelivr.net/npm/emoji-datasource-apple/img/apple/64/1f534.png" draggable="false" loading="lazy" align="absmiddle"></span> <strong>Severe violations:</strong> Perma-ban and slashing of staked ETH.</p><p>Bans are enforced transparently onchain, and appeals can be made through a decentralized governance process.</p><p><span data-name="scissors" class="emoji" data-type="emoji"><img src="https://cdn.jsdelivr.net/npm/emoji-datasource-apple/img/apple/64/2702-fe0f.png" draggable="false" loading="lazy" align="absmiddle"></span> Slashed ETH goes to the DAO treasury</p><div class="relative header-and-anchor"><h2 id="h-verifier-services">Verifier Services <span data-name="woman_detective" class="emoji" data-type="emoji"><img src="https://cdn.jsdelivr.net/npm/emoji-datasource-apple/img/apple/64/1f575-fe0f-200d-2640-fe0f.png" draggable="false" loading="lazy" align="absmiddle"></span></h2></div><p>Pin.sol creates economic opportunities for <strong>Verifiers</strong> who maintain network integrity by checking IPFS for content availability promised by nodes and verifying that pinning commitments are being honored.</p><p><strong>Verifiers:</strong> <span data-name="rotating_light" class="emoji" data-type="emoji"><img src="https://cdn.jsdelivr.net/npm/emoji-datasource-apple/img/apple/64/1f6a8.png" draggable="false" loading="lazy" align="absmiddle"></span> Reporting nodes that fail to meet obligations <span data-name="trophy" class="emoji" data-type="emoji"><img src="https://cdn.jsdelivr.net/npm/emoji-datasource-apple/img/apple/64/1f3c6.png" draggable="false" loading="lazy" align="absmiddle"></span> Earning ETH rewards (5% of remaining escrow) for maintaining network health</p><div class="relative header-and-anchor"><h3 id="h-how-verifier-services-work">How Verifier Services Work</h3></div><ol><li><p><strong>Automated Monitoring</strong>: Verifiers scan the network, checking actual availability of pinned content</p></li><li><p><strong>Reputation Enforcement</strong>: Trigger the protocol's reputation mechanisms for failing nodes</p></li><li><p><strong>Economic Incentives</strong>: Earn a percentage of returned funds when reporting violations</p></li></ol><p>This creates a market for developers to build services around Pin.sol, such as IPFS availability monitors, node reputation tracking dashboards, and analytics tools,.</p><div class="relative header-and-anchor"><h2 id="h-dao-treasury-and-fees">DAO Treasury and Fees</h2></div><p>Pin.sol collects fees that go directly to the DAO treasury:</p><ol><li><p><strong>Queue-Based Assignments</strong>: A percentage of each payment based on node reputation:</p><ul><li><p>1% from highest reputation nodes (99% to node)</p></li><li><p>Up to 50% from lowest reputation nodes (50% to node)</p></li></ul></li><li><p><strong>Direct Payments</strong>: Flat 1% fee on all direct agreements between users and nodes</p></li></ol><div class="relative header-and-anchor"><h2 id="h-comparison-with-other-storage-solutions">Comparison with Other Storage Solutions</h2></div><table style="min-width: 125px"><colgroup><col><col><col><col><col></colgroup><tbody><tr><th colspan="1" rowspan="1"><p>Feature</p></th><th colspan="1" rowspan="1"><p>Pin.sol</p></th><th colspan="1" rowspan="1"><p>Filecoin</p></th><th colspan="1" rowspan="1"><p>Arweave</p></th><th colspan="1" rowspan="1"><p>Centralized Pinning</p></th></tr><tr><td colspan="1" rowspan="1"><p><strong>Native Currency</strong></p></td><td colspan="1" rowspan="1"><p>ETH</p></td><td colspan="1" rowspan="1"><p>FIL</p></td><td colspan="1" rowspan="1"><p>AR</p></td><td colspan="1" rowspan="1"><p>Various</p></td></tr><tr><td colspan="1" rowspan="1"><p><strong>Smart Contract Integration</strong></p></td><td colspan="1" rowspan="1"><p>Direct</p></td><td colspan="1" rowspan="1"><p>Limited</p></td><td colspan="1" rowspan="1"><p>Limited</p></td><td colspan="1" rowspan="1"><p>None</p></td></tr><tr><td colspan="1" rowspan="1"><p><strong>Barrier to Entry</strong></p></td><td colspan="1" rowspan="1"><p>Low (standard IPFS node)</p></td><td colspan="1" rowspan="1"><p>High (specialized hardware)</p></td><td colspan="1" rowspan="1"><p>Medium</p></td><td colspan="1" rowspan="1"><p>N/A</p></td></tr><tr><td colspan="1" rowspan="1"><p><strong>Payment Model</strong></p></td><td colspan="1" rowspan="1"><p>Queue-based + direct payment</p></td><td colspan="1" rowspan="1"><p>Long-term contracts</p></td><td colspan="1" rowspan="1"><p>One-time perpetual</p></td><td colspan="1" rowspan="1"><p>Subscription</p></td></tr><tr><td colspan="1" rowspan="1"><p><strong>Node Selection</strong></p></td><td colspan="1" rowspan="1"><p>Fair queue rotation</p></td><td colspan="1" rowspan="1"><p>Auction/manual deals</p></td><td colspan="1" rowspan="1"><p>Miners compete</p></td><td colspan="1" rowspan="1"><p>Centralized</p></td></tr><tr><td colspan="1" rowspan="1"><p><strong>Storage Verification</strong></p></td><td colspan="1" rowspan="1"><p>Community-driven</p></td><td colspan="1" rowspan="1"><p>Proof-of-Spacetime</p></td><td colspan="1" rowspan="1"><p>Proof-of-Access</p></td><td colspan="1" rowspan="1"><p>Centralized</p></td></tr><tr><td colspan="1" rowspan="1"><p><strong>Content Addressing</strong></p></td><td colspan="1" rowspan="1"><p>IPFS CIDs</p></td><td colspan="1" rowspan="1"><p>IPFS CIDs</p></td><td colspan="1" rowspan="1"><p>Transaction-based</p></td><td colspan="1" rowspan="1"><p>Proprietary</p></td></tr><tr><td colspan="1" rowspan="1"><p><strong>Node Economics</strong></p></td><td colspan="1" rowspan="1"><p>Reputation-based rewards</p></td><td colspan="1" rowspan="1"><p>Complex deal structure</p></td><td colspan="1" rowspan="1"><p>Endowment-based</p></td><td colspan="1" rowspan="1"><p>Fixed pricing</p></td></tr><tr><td colspan="1" rowspan="1"><p><strong>Censorship Resistance</strong></p></td><td colspan="1" rowspan="1"><p>High</p></td><td colspan="1" rowspan="1"><p>High</p></td><td colspan="1" rowspan="1"><p>Very High</p></td><td colspan="1" rowspan="1"><p>Low</p></td></tr></tbody></table><div class="relative header-and-anchor"><h3 id="h-why-choose-pinsol">Why Choose Pin.sol?</h3></div><ol><li><p><strong>Ethereum Native</strong>: Uses ETH directly, no need for token swaps or bridges</p></li><li><p><strong>Fair Distribution</strong>: Queue-based system ensures all nodes get opportunities</p></li><li><p><strong>Incentive Alignment</strong>: Reputation affects rewards, not job access</p></li><li><p><strong>Low Barrier</strong>: Anyone with an IPFS node can participate and earn</p></li><li><p><strong>Transparent</strong>: All commitments and payments are visible on-chain</p></li><li><p><strong>Sustainable</strong>: DAO treasury ensures long-term protocol development</p></li></ol><div class="relative header-and-anchor"><h2 id="h-security-and-sustainability">Security &amp; Sustainability</h2></div><ul><li><p><strong>Stake-Based Participation</strong>: Required ETH staking ensures nodes have skin in the game</p></li><li><p><strong>Linear Vesting Model</strong>: Payments release over time, aligning incentives for long-term storage</p></li><li><p><strong>Community Policing</strong>: The 5% bounty for reporting violations creates distributed oversight</p></li><li><p><strong>Transparent Queue</strong>: Fair job distribution prevents centralization</p></li><li><p><strong>Reputation Economics</strong>: Better performance leads to higher earnings percentage</p></li><li><p><strong>Progressive Banning</strong>: Repeat offenders face escalating penalties</p></li><li><p><strong>Sustainable Treasury</strong>: Protocol fees fund ongoing development and maintenance</p></li></ul><hr><div class="relative header-and-anchor"><h2 id="h-smart-contract-design">Smart Contract Design</h2></div><p>Below is an outline of proposed smart contract design for Pin.sol. This code is not tested and should not be used in a production environment.</p><div class="relative header-and-anchor"><h3 id="h-node-registration-and-queue-management">Node Registration &amp; Queue Management</h3></div><p>Structure of an onchain IPFS node</p><pre data-type="codeBlock" text="struct Node {
    address payable wallet;   // Wallet address of node operator
    string ipfsPeerId;        // Unique identifier for IPFS node
    uint256 reputation;       // Score representing node reliability (0-100)
    uint256 stakedAmount;     // Total ETH locked as collateral
    uint256 lastActive;       // Timestamp of most recent activity
    bool isActive;            // Whether node is currently eligible for assignments
    uint256 bannedUntil;      // Timestamp when temporary ban expires (0 if not banned)
    uint256 banCount;         // Number of times node has been banned
    uint256 totalEarned;      // Total ETH earned through the protocol
    mapping(bytes32 => bool) activePins;  // Currently pinned content
}
"><code><span class="hljs-keyword">struct</span> <span class="hljs-title">Node</span> {
    <span class="hljs-keyword">address</span> <span class="hljs-keyword">payable</span> wallet;   <span class="hljs-comment">// Wallet address of node operator</span>
    <span class="hljs-keyword">string</span> ipfsPeerId;        <span class="hljs-comment">// Unique identifier for IPFS node</span>
    <span class="hljs-keyword">uint256</span> reputation;       <span class="hljs-comment">// Score representing node reliability (0-100)</span>
    <span class="hljs-keyword">uint256</span> stakedAmount;     <span class="hljs-comment">// Total ETH locked as collateral</span>
    <span class="hljs-keyword">uint256</span> lastActive;       <span class="hljs-comment">// Timestamp of most recent activity</span>
    <span class="hljs-keyword">bool</span> isActive;            <span class="hljs-comment">// Whether node is currently eligible for assignments</span>
    <span class="hljs-keyword">uint256</span> bannedUntil;      <span class="hljs-comment">// Timestamp when temporary ban expires (0 if not banned)</span>
    <span class="hljs-keyword">uint256</span> banCount;         <span class="hljs-comment">// Number of times node has been banned</span>
    <span class="hljs-keyword">uint256</span> totalEarned;      <span class="hljs-comment">// Total ETH earned through the protocol</span>
    <span class="hljs-keyword">mapping</span>(<span class="hljs-keyword">bytes32</span> <span class="hljs-operator">=</span><span class="hljs-operator">&gt;</span> <span class="hljs-keyword">bool</span>) activePins;  <span class="hljs-comment">// Currently pinned content</span>
}
</code></pre><p>Implementation of the node queue system.</p><pre data-type="codeBlock" text="address[] private nodeQueue;
mapping(address => uint256) private nodeQueuePosition;
"><code><span class="hljs-keyword">address</span>[] <span class="hljs-keyword">private</span> nodeQueue;
<span class="hljs-keyword">mapping</span>(<span class="hljs-keyword">address</span> <span class="hljs-operator">=</span><span class="hljs-operator">&gt;</span> <span class="hljs-keyword">uint256</span>) <span class="hljs-keyword">private</span> nodeQueuePosition;
</code></pre><p>New nodes register with their <code>peerId</code> by staking ETH and are placed at the end of the queue.</p><pre data-type="codeBlock" text="function registerNode(string calldata ipfsPeerId) external payable {
    require(msg.value >= MINIMUM_STAKE, &quot;Insufficient stake&quot;);
    require(nodeQueuePosition[msg.sender] == 0, &quot;Already registered&quot;);

    nodes[msg.sender] = Node({
        wallet: payable(msg.sender),
        ipfsPeerId: ipfsPeerId,
        reputation: INITIAL_REPUTATION,
        stakedAmount: msg.value,
        lastActive: block.timestamp,
        isActive: true,
        bannedUntil: 0,
        banCount: 0,
        totalEarned: 0
    });

    // Add node to the end of the queue
    nodeQueue.push(msg.sender);
    nodeQueuePosition[msg.sender] = nodeQueue.length;

    emit NodeRegistered(msg.sender, ipfsPeerId, msg.value);
}
"><code><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">registerNode</span>(<span class="hljs-params"><span class="hljs-keyword">string</span> <span class="hljs-keyword">calldata</span> ipfsPeerId</span>) <span class="hljs-title"><span class="hljs-keyword">external</span></span> <span class="hljs-title"><span class="hljs-keyword">payable</span></span> </span>{
    <span class="hljs-built_in">require</span>(<span class="hljs-built_in">msg</span>.<span class="hljs-built_in">value</span> <span class="hljs-operator">&gt;</span><span class="hljs-operator">=</span> MINIMUM_STAKE, <span class="hljs-string">"Insufficient stake"</span>);
    <span class="hljs-built_in">require</span>(nodeQueuePosition[<span class="hljs-built_in">msg</span>.<span class="hljs-built_in">sender</span>] <span class="hljs-operator">=</span><span class="hljs-operator">=</span> <span class="hljs-number">0</span>, <span class="hljs-string">"Already registered"</span>);

    nodes[<span class="hljs-built_in">msg</span>.<span class="hljs-built_in">sender</span>] <span class="hljs-operator">=</span> Node({
        wallet: <span class="hljs-keyword">payable</span>(<span class="hljs-built_in">msg</span>.<span class="hljs-built_in">sender</span>),
        ipfsPeerId: ipfsPeerId,
        reputation: INITIAL_REPUTATION,
        stakedAmount: <span class="hljs-built_in">msg</span>.<span class="hljs-built_in">value</span>,
        lastActive: <span class="hljs-built_in">block</span>.<span class="hljs-built_in">timestamp</span>,
        isActive: <span class="hljs-literal">true</span>,
        bannedUntil: <span class="hljs-number">0</span>,
        banCount: <span class="hljs-number">0</span>,
        totalEarned: <span class="hljs-number">0</span>
    });

    <span class="hljs-comment">// Add node to the end of the queue</span>
    nodeQueue.<span class="hljs-built_in">push</span>(<span class="hljs-built_in">msg</span>.<span class="hljs-built_in">sender</span>);
    nodeQueuePosition[<span class="hljs-built_in">msg</span>.<span class="hljs-built_in">sender</span>] <span class="hljs-operator">=</span> nodeQueue.<span class="hljs-built_in">length</span>;

    <span class="hljs-keyword">emit</span> NodeRegistered(<span class="hljs-built_in">msg</span>.<span class="hljs-built_in">sender</span>, ipfsPeerId, <span class="hljs-built_in">msg</span>.<span class="hljs-built_in">value</span>);
}
</code></pre><p>Nodes are rotated to the back of the queue after being assigned a pin request.</p><pre data-type="codeBlock" text="function _rotateNodeInQueue(address node) internal {
    uint256 pos = nodeQueuePosition[node];
    require(pos > 0, &quot;Node not in queue&quot;);

    // Remove node from current position
    for (uint i = pos; i < nodeQueue.length; i++) {
        nodeQueue[i-1] = nodeQueue[i];
        nodeQueuePosition[nodeQueue[i]] = i;
    }

    // Put node at end of queue
    nodeQueue[nodeQueue.length - 1] = node;
    nodeQueuePosition[node] = nodeQueue.length;
}
"><code><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">_rotateNodeInQueue</span>(<span class="hljs-params"><span class="hljs-keyword">address</span> node</span>) <span class="hljs-title"><span class="hljs-keyword">internal</span></span> </span>{
    <span class="hljs-keyword">uint256</span> pos <span class="hljs-operator">=</span> nodeQueuePosition[node];
    <span class="hljs-built_in">require</span>(pos <span class="hljs-operator">&gt;</span> <span class="hljs-number">0</span>, <span class="hljs-string">"Node not in queue"</span>);

    <span class="hljs-comment">// Remove node from current position</span>
    <span class="hljs-keyword">for</span> (<span class="hljs-keyword">uint</span> i <span class="hljs-operator">=</span> pos; i <span class="hljs-operator">&lt;</span> nodeQueue.<span class="hljs-built_in">length</span>; i<span class="hljs-operator">+</span><span class="hljs-operator">+</span>) {
        nodeQueue[i<span class="hljs-number">-1</span>] <span class="hljs-operator">=</span> nodeQueue[i];
        nodeQueuePosition[nodeQueue[i]] <span class="hljs-operator">=</span> i;
    }

    <span class="hljs-comment">// Put node at end of queue</span>
    nodeQueue[nodeQueue.<span class="hljs-built_in">length</span> <span class="hljs-operator">-</span> <span class="hljs-number">1</span>] <span class="hljs-operator">=</span> node;
    nodeQueuePosition[node] <span class="hljs-operator">=</span> nodeQueue.<span class="hljs-built_in">length</span>;
}
</code></pre><p>Contract gets the next available nodes from the queue</p><pre data-type="codeBlock" text="function _getNextAvailableNodes(uint8 count) internal view returns (address[] memory) {
    address[] memory availableNodes = new address[](count);
    uint256 found = 0;

    for (uint i = 0; i < nodeQueue.length &amp;&amp; found < count; i++) {
        address nodeAddr = nodeQueue[i];
        if (nodes[nodeAddr].isActive &amp;&amp; nodes[nodeAddr].bannedUntil < block.timestamp) {
            availableNodes[found] = nodeAddr;
            found++;
        }
    }

    require(found == count, &quot;Not enough available nodes&quot;);
    return availableNodes;
}
"><code><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">_getNextAvailableNodes</span>(<span class="hljs-params"><span class="hljs-keyword">uint8</span> count</span>) <span class="hljs-title"><span class="hljs-keyword">internal</span></span> <span class="hljs-title"><span class="hljs-keyword">view</span></span> <span class="hljs-title"><span class="hljs-keyword">returns</span></span> (<span class="hljs-params"><span class="hljs-keyword">address</span>[] <span class="hljs-keyword">memory</span></span>) </span>{
    <span class="hljs-keyword">address</span>[] <span class="hljs-keyword">memory</span> availableNodes <span class="hljs-operator">=</span> <span class="hljs-keyword">new</span> <span class="hljs-keyword">address</span>[](count);
    <span class="hljs-keyword">uint256</span> found <span class="hljs-operator">=</span> <span class="hljs-number">0</span>;

    <span class="hljs-keyword">for</span> (<span class="hljs-keyword">uint</span> i <span class="hljs-operator">=</span> <span class="hljs-number">0</span>; i <span class="hljs-operator">&lt;</span> nodeQueue.<span class="hljs-built_in">length</span> <span class="hljs-operator">&amp;</span><span class="hljs-operator">&amp;</span> found <span class="hljs-operator">&lt;</span> count; i<span class="hljs-operator">+</span><span class="hljs-operator">+</span>) {
        <span class="hljs-keyword">address</span> nodeAddr <span class="hljs-operator">=</span> nodeQueue[i];
        <span class="hljs-keyword">if</span> (nodes[nodeAddr].isActive <span class="hljs-operator">&amp;</span><span class="hljs-operator">&amp;</span> nodes[nodeAddr].bannedUntil <span class="hljs-operator">&lt;</span> <span class="hljs-built_in">block</span>.<span class="hljs-built_in">timestamp</span>) {
            availableNodes[found] <span class="hljs-operator">=</span> nodeAddr;
            found<span class="hljs-operator">+</span><span class="hljs-operator">+</span>;
        }
    }

    <span class="hljs-built_in">require</span>(found <span class="hljs-operator">=</span><span class="hljs-operator">=</span> count, <span class="hljs-string">"Not enough available nodes"</span>);
    <span class="hljs-keyword">return</span> availableNodes;
}
</code></pre><div class="relative header-and-anchor"><h3 id="h-file-pinning-requests-and-pricing">File Pinning Requests &amp; Pricing</h3></div><p>Structure of an onchain pin request</p><pre data-type="codeBlock" text="struct PinRequest {
    bytes32 cid;                 // Content Identifier (CID) of file
    address payable user;        // Address of requestor
    uint256 duration;            // Time period (in seconds) for pinning
    uint256 fileSize;            // Size of file in bytes
    uint256 payment;             // Total ETH payment
    uint256 createdAt;           // Timestamp when request was submitted
    bool fulfilled;              // Whether request has been assigned to nodes
    uint8 replicationFactor;     // Number of nodes to pin the content
}
"><code><span class="hljs-keyword">struct</span> <span class="hljs-title">PinRequest</span> {
    <span class="hljs-keyword">bytes32</span> cid;                 <span class="hljs-comment">// Content Identifier (CID) of file</span>
    <span class="hljs-keyword">address</span> <span class="hljs-keyword">payable</span> user;        <span class="hljs-comment">// Address of requestor</span>
    <span class="hljs-keyword">uint256</span> duration;            <span class="hljs-comment">// Time period (in seconds) for pinning</span>
    <span class="hljs-keyword">uint256</span> fileSize;            <span class="hljs-comment">// Size of file in bytes</span>
    <span class="hljs-keyword">uint256</span> payment;             <span class="hljs-comment">// Total ETH payment</span>
    <span class="hljs-keyword">uint256</span> createdAt;           <span class="hljs-comment">// Timestamp when request was submitted</span>
    <span class="hljs-keyword">bool</span> fulfilled;              <span class="hljs-comment">// Whether request has been assigned to nodes</span>
    <span class="hljs-keyword">uint8</span> replicationFactor;     <span class="hljs-comment">// Number of nodes to pin the content</span>
}
</code></pre><p>The price of a pin request is determined based on file size and duration the pin is requested for. DAO fees can be updated by governance proposals but is initialized at 1%.</p><pre data-type="codeBlock" text="function calculateBasePrice(uint256 fileSize, uint256 duration) public pure returns (uint256) {
    // Example pricing formula
    // Base price = (fileSize in MB * 0.0001 ETH) * (duration in days / 30)
    uint256 fileSizeInMB = fileSize / (1024 * 1024);
    uint256 durationInDays = duration / 86400;

    return (fileSizeInMB * 1e14 * durationInDays) / 30;
}
"><code><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">calculateBasePrice</span>(<span class="hljs-params"><span class="hljs-keyword">uint256</span> fileSize, <span class="hljs-keyword">uint256</span> duration</span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> <span class="hljs-title"><span class="hljs-keyword">pure</span></span> <span class="hljs-title"><span class="hljs-keyword">returns</span></span> (<span class="hljs-params"><span class="hljs-keyword">uint256</span></span>) </span>{
    <span class="hljs-comment">// Example pricing formula</span>
    <span class="hljs-comment">// Base price = (fileSize in MB * 0.0001 ETH) * (duration in days / 30)</span>
    <span class="hljs-keyword">uint256</span> fileSizeInMB <span class="hljs-operator">=</span> fileSize <span class="hljs-operator">/</span> (<span class="hljs-number">1024</span> <span class="hljs-operator">*</span> <span class="hljs-number">1024</span>);
    <span class="hljs-keyword">uint256</span> durationInDays <span class="hljs-operator">=</span> duration <span class="hljs-operator">/</span> <span class="hljs-number">86400</span>;

    <span class="hljs-keyword">return</span> (fileSizeInMB <span class="hljs-operator">*</span> <span class="hljs-number">1e14</span> <span class="hljs-operator">*</span> durationInDays) <span class="hljs-operator">/</span> <span class="hljs-number">30</span>;
}
</code></pre><p>Pin requests are submitted with a <code>replicationFactor</code> that determines how many nodes should pin the file. Payment cost is <code>(fileSize * duration) * replicationFactor</code> and paid at the time of submission, after which the payment is split between the number of participating nodes and their respective fees (modified by reputation) are vested to them.</p><pre data-type="codeBlock" text="function submitPinRequest(
    bytes32 cid,
    uint256 fileSize,
    uint256 duration,
    uint8 replicationFactor
) external payable {
    // Calculate minimum required payment
    uint256 basePrice = calculateBasePrice(fileSize, duration);
    uint256 totalPrice = basePrice * replicationFactor;

    require(msg.value >= totalPrice, &quot;Insufficient payment&quot;);
    require(duration >= MIN_DURATION, &quot;Duration too short&quot;);
    require(replicationFactor > 0, &quot;Must request at least one node&quot;);

    uint256 requestId = _nextRequestId++;

    pinRequests[requestId] = PinRequest({
        cid: cid,
        user: payable(msg.sender),
        duration: duration,
        fileSize: fileSize,
        payment: msg.value,
        createdAt: block.timestamp,
        fulfilled: false,
        replicationFactor: replicationFactor
    });

    // Process the request immediately
    _processRequest(requestId);

    emit PinRequestSubmitted(requestId, cid, msg.sender, msg.value, duration);
}
"><code><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">submitPinRequest</span>(<span class="hljs-params">
    <span class="hljs-keyword">bytes32</span> cid,
    <span class="hljs-keyword">uint256</span> fileSize,
    <span class="hljs-keyword">uint256</span> duration,
    <span class="hljs-keyword">uint8</span> replicationFactor
</span>) <span class="hljs-title"><span class="hljs-keyword">external</span></span> <span class="hljs-title"><span class="hljs-keyword">payable</span></span> </span>{
    <span class="hljs-comment">// Calculate minimum required payment</span>
    <span class="hljs-keyword">uint256</span> basePrice <span class="hljs-operator">=</span> calculateBasePrice(fileSize, duration);
    <span class="hljs-keyword">uint256</span> totalPrice <span class="hljs-operator">=</span> basePrice <span class="hljs-operator">*</span> replicationFactor;

    <span class="hljs-built_in">require</span>(<span class="hljs-built_in">msg</span>.<span class="hljs-built_in">value</span> <span class="hljs-operator">&gt;</span><span class="hljs-operator">=</span> totalPrice, <span class="hljs-string">"Insufficient payment"</span>);
    <span class="hljs-built_in">require</span>(duration <span class="hljs-operator">&gt;</span><span class="hljs-operator">=</span> MIN_DURATION, <span class="hljs-string">"Duration too short"</span>);
    <span class="hljs-built_in">require</span>(replicationFactor <span class="hljs-operator">&gt;</span> <span class="hljs-number">0</span>, <span class="hljs-string">"Must request at least one node"</span>);

    <span class="hljs-keyword">uint256</span> requestId <span class="hljs-operator">=</span> _nextRequestId<span class="hljs-operator">+</span><span class="hljs-operator">+</span>;

    pinRequests[requestId] <span class="hljs-operator">=</span> PinRequest({
        cid: cid,
        user: <span class="hljs-keyword">payable</span>(<span class="hljs-built_in">msg</span>.<span class="hljs-built_in">sender</span>),
        duration: duration,
        fileSize: fileSize,
        payment: <span class="hljs-built_in">msg</span>.<span class="hljs-built_in">value</span>,
        createdAt: <span class="hljs-built_in">block</span>.<span class="hljs-built_in">timestamp</span>,
        fulfilled: <span class="hljs-literal">false</span>,
        replicationFactor: replicationFactor
    });

    <span class="hljs-comment">// Process the request immediately</span>
    _processRequest(requestId);

    <span class="hljs-keyword">emit</span> PinRequestSubmitted(requestId, cid, <span class="hljs-built_in">msg</span>.<span class="hljs-built_in">sender</span>, <span class="hljs-built_in">msg</span>.<span class="hljs-built_in">value</span>, duration);
}
</code></pre><div class="relative header-and-anchor"><h3 id="h-node-assignments-and-reputation-based-payments">Node Assignments &amp; Reputation-Based Payments</h3></div><p>Structure of successful pin assignment to a node.</p><pre data-type="codeBlock" text="struct PinAssignment {
    bytes32 cid;            // CID of pinned file
    address node;           // Address of assigned node
    address payable user;   // User who requested the pinning
    uint256 startTime;      // When pinning began
    uint256 endTime;        // When pinning should end
    uint256 totalPayment;   // Total ETH allocated for this assignment
    uint256 claimedAmount;  // ETH already claimed through vesting
    bool active;            // Whether assignment is currently active
}
"><code><span class="hljs-keyword">struct</span> <span class="hljs-title">PinAssignment</span> {
    <span class="hljs-keyword">bytes32</span> cid;            <span class="hljs-comment">// CID of pinned file</span>
    <span class="hljs-keyword">address</span> node;           <span class="hljs-comment">// Address of assigned node</span>
    <span class="hljs-keyword">address</span> <span class="hljs-keyword">payable</span> user;   <span class="hljs-comment">// User who requested the pinning</span>
    <span class="hljs-keyword">uint256</span> startTime;      <span class="hljs-comment">// When pinning began</span>
    <span class="hljs-keyword">uint256</span> endTime;        <span class="hljs-comment">// When pinning should end</span>
    <span class="hljs-keyword">uint256</span> totalPayment;   <span class="hljs-comment">// Total ETH allocated for this assignment</span>
    <span class="hljs-keyword">uint256</span> claimedAmount;  <span class="hljs-comment">// ETH already claimed through vesting</span>
    <span class="hljs-keyword">bool</span> active;            <span class="hljs-comment">// Whether assignment is currently active</span>
}
</code></pre><p>Payment percentage is calculated based on node reputation. At max reputation (100) a node receives 99% of fees. At 0 reputation, a node gets 50% of the fees, with a linear scale between. Nodes with 0 reputation who receive another strike are banned from participation.</p><pre data-type="codeBlock" text="function _calculatePaymentPercentage(uint256 reputation) internal pure returns (uint256) {
    uint256 basePercentage = 50;
    // Multiply reputation (0-100) by 49 (difference between min &amp; max payment received) to get the variable portion
    uint256 variablePercentage = (reputation * 49) / 100;

    return basePercentage + variablePercentage;
}
"><code><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">_calculatePaymentPercentage</span>(<span class="hljs-params"><span class="hljs-keyword">uint256</span> reputation</span>) <span class="hljs-title"><span class="hljs-keyword">internal</span></span> <span class="hljs-title"><span class="hljs-keyword">pure</span></span> <span class="hljs-title"><span class="hljs-keyword">returns</span></span> (<span class="hljs-params"><span class="hljs-keyword">uint256</span></span>) </span>{
    <span class="hljs-keyword">uint256</span> basePercentage <span class="hljs-operator">=</span> <span class="hljs-number">50</span>;
    <span class="hljs-comment">// Multiply reputation (0-100) by 49 (difference between min &amp; max payment received) to get the variable portion</span>
    <span class="hljs-keyword">uint256</span> variablePercentage <span class="hljs-operator">=</span> (reputation <span class="hljs-operator">*</span> <span class="hljs-number">49</span>) <span class="hljs-operator">/</span> <span class="hljs-number">100</span>;

    <span class="hljs-keyword">return</span> basePercentage <span class="hljs-operator">+</span> variablePercentage;
}
</code></pre><p>Requests are processed from the queue, selecting next available nodes and processing their reputation-based payment into a linear vesting schedule.</p><pre data-type="codeBlock" text="function _processRequest(uint256 requestId) internal {
    PinRequest storage request = pinRequests[requestId];
    require(!request.fulfilled, &quot;Request already fulfilled&quot;);

    // Get the next available nodes
    address[] memory selectedNodes = _getNextAvailableNodes(request.replicationFactor);

    uint256 paymentPerNode = request.payment / request.replicationFactor;
    uint256 daoFee = 0;

    for (uint i = 0; i < selectedNodes.length; i++) {
        address node = selectedNodes[i];

        // Calculate node's payment based on reputation
        uint256 paymentPercentage = _calculatePaymentPercentage(nodes[node].reputation);
        uint256 nodePayment = (paymentPerNode * paymentPercentage) / 100;

        // Track DAO fee (remainder)
        daoFee += paymentPerNode - nodePayment;

        // Create assignment with vesting schedule
        uint256 assignmentId = _nextAssignmentId++;

        pinAssignments[assignmentId] = PinAssignment({
            cid: request.cid,
            node: node,
            user: request.user,
            startTime: block.timestamp,
            endTime: block.timestamp + request.duration,
            totalPayment: nodePayment,
            claimedAmount: 0,
            active: true
        });

        // Update node's active pins
        nodes[node].activePins[request.cid] = true;

        // Rotate node to back of queue
        _rotateNodeInQueue(node);

        emit PinAssigned(assignmentId, request.cid, node, nodePayment, request.duration);
    }

    // Send DAO fee to treasury
    if (daoFee > 0) {
        (bool success, ) = daoTreasury.call{value: daoFee}(&quot;&quot;);
        require(success, &quot;DAO fee transfer failed&quot;);
        emit DAOFeeCollected(requestId, daoFee);
    }

    request.fulfilled = true;
}
"><code><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">_processRequest</span>(<span class="hljs-params"><span class="hljs-keyword">uint256</span> requestId</span>) <span class="hljs-title"><span class="hljs-keyword">internal</span></span> </span>{
    PinRequest <span class="hljs-keyword">storage</span> request <span class="hljs-operator">=</span> pinRequests[requestId];
    <span class="hljs-built_in">require</span>(<span class="hljs-operator">!</span>request.fulfilled, <span class="hljs-string">"Request already fulfilled"</span>);

    <span class="hljs-comment">// Get the next available nodes</span>
    <span class="hljs-keyword">address</span>[] <span class="hljs-keyword">memory</span> selectedNodes <span class="hljs-operator">=</span> _getNextAvailableNodes(request.replicationFactor);

    <span class="hljs-keyword">uint256</span> paymentPerNode <span class="hljs-operator">=</span> request.payment <span class="hljs-operator">/</span> request.replicationFactor;
    <span class="hljs-keyword">uint256</span> daoFee <span class="hljs-operator">=</span> <span class="hljs-number">0</span>;

    <span class="hljs-keyword">for</span> (<span class="hljs-keyword">uint</span> i <span class="hljs-operator">=</span> <span class="hljs-number">0</span>; i <span class="hljs-operator">&lt;</span> selectedNodes.<span class="hljs-built_in">length</span>; i<span class="hljs-operator">+</span><span class="hljs-operator">+</span>) {
        <span class="hljs-keyword">address</span> node <span class="hljs-operator">=</span> selectedNodes[i];

        <span class="hljs-comment">// Calculate node's payment based on reputation</span>
        <span class="hljs-keyword">uint256</span> paymentPercentage <span class="hljs-operator">=</span> _calculatePaymentPercentage(nodes[node].reputation);
        <span class="hljs-keyword">uint256</span> nodePayment <span class="hljs-operator">=</span> (paymentPerNode <span class="hljs-operator">*</span> paymentPercentage) <span class="hljs-operator">/</span> <span class="hljs-number">100</span>;

        <span class="hljs-comment">// Track DAO fee (remainder)</span>
        daoFee <span class="hljs-operator">+</span><span class="hljs-operator">=</span> paymentPerNode <span class="hljs-operator">-</span> nodePayment;

        <span class="hljs-comment">// Create assignment with vesting schedule</span>
        <span class="hljs-keyword">uint256</span> assignmentId <span class="hljs-operator">=</span> _nextAssignmentId<span class="hljs-operator">+</span><span class="hljs-operator">+</span>;

        pinAssignments[assignmentId] <span class="hljs-operator">=</span> PinAssignment({
            cid: request.cid,
            node: node,
            user: request.user,
            startTime: <span class="hljs-built_in">block</span>.<span class="hljs-built_in">timestamp</span>,
            endTime: <span class="hljs-built_in">block</span>.<span class="hljs-built_in">timestamp</span> <span class="hljs-operator">+</span> request.duration,
            totalPayment: nodePayment,
            claimedAmount: <span class="hljs-number">0</span>,
            active: <span class="hljs-literal">true</span>
        });

        <span class="hljs-comment">// Update node's active pins</span>
        nodes[node].activePins[request.cid] <span class="hljs-operator">=</span> <span class="hljs-literal">true</span>;

        <span class="hljs-comment">// Rotate node to back of queue</span>
        _rotateNodeInQueue(node);

        <span class="hljs-keyword">emit</span> PinAssigned(assignmentId, request.cid, node, nodePayment, request.duration);
    }

    <span class="hljs-comment">// Send DAO fee to treasury</span>
    <span class="hljs-keyword">if</span> (daoFee <span class="hljs-operator">&gt;</span> <span class="hljs-number">0</span>) {
        (<span class="hljs-keyword">bool</span> success, ) <span class="hljs-operator">=</span> daoTreasury.<span class="hljs-built_in">call</span>{<span class="hljs-built_in">value</span>: daoFee}(<span class="hljs-string">""</span>);
        <span class="hljs-built_in">require</span>(success, <span class="hljs-string">"DAO fee transfer failed"</span>);
        <span class="hljs-keyword">emit</span> DAOFeeCollected(requestId, daoFee);
    }

    request.fulfilled <span class="hljs-operator">=</span> <span class="hljs-literal">true</span>;
}
</code></pre><div class="relative header-and-anchor"><h3 id="h-direct-payments">Direct Payments</h3></div><p>In addition to the queue system, users can select and pay a node directly.</p><pre data-type="codeBlock" text="struct DirectPayment {
    bytes32 cid;                // Content Identifier
    address payable node;       // Node providing service
    address payable user;       // User paying for service
    uint256 amount;             // Total ETH paid to node
    // DAO fee initialized at 1% but can be modified by governance proposals
    uint256 daoFee;             // Fee collected by DAO
    uint256 startTime;          // When agreement began
    uint256 endTime;            // When service should end
    uint256 claimedAmount;      // ETH already claimed
    bool active;                // Current status
}
"><code><span class="hljs-keyword">struct</span> <span class="hljs-title">DirectPayment</span> {
    <span class="hljs-keyword">bytes32</span> cid;                <span class="hljs-comment">// Content Identifier</span>
    <span class="hljs-keyword">address</span> <span class="hljs-keyword">payable</span> node;       <span class="hljs-comment">// Node providing service</span>
    <span class="hljs-keyword">address</span> <span class="hljs-keyword">payable</span> user;       <span class="hljs-comment">// User paying for service</span>
    <span class="hljs-keyword">uint256</span> amount;             <span class="hljs-comment">// Total ETH paid to node</span>
    <span class="hljs-comment">// DAO fee initialized at 1% but can be modified by governance proposals</span>
    <span class="hljs-keyword">uint256</span> daoFee;             <span class="hljs-comment">// Fee collected by DAO</span>
    <span class="hljs-keyword">uint256</span> startTime;          <span class="hljs-comment">// When agreement began</span>
    <span class="hljs-keyword">uint256</span> endTime;            <span class="hljs-comment">// When service should end</span>
    <span class="hljs-keyword">uint256</span> claimedAmount;      <span class="hljs-comment">// ETH already claimed</span>
    <span class="hljs-keyword">bool</span> active;                <span class="hljs-comment">// Current status</span>
}
</code></pre><p>Direct payments are negotiated between both parties and bypasses reputation, meaning that nodes paid directly receive the full fee (minus DAO percentage).</p><pre data-type="codeBlock" text="function payNodeDirectly(
    address payable node,
    bytes32 cid,
    uint256 duration
) external payable {
    require(msg.value > 0, &quot;Payment required&quot;);
    require(nodes[node].isActive, &quot;Node not active&quot;);
    require(nodes[node].bannedUntil < block.timestamp, &quot;Node is banned&quot;);

    // Calculate basis points for DAO fee (100 = 1%)
    uint256 daoFee = (msg.value * daoFeePercentage) / 10000;
    uint256 nodePayment = msg.value - daoFee;

    uint256 paymentId = _nextDirectPaymentId++;

    directPayments[paymentId] = DirectPayment({
        cid: cid,
        node: node,
        user: payable(msg.sender),
        amount: nodePayment,
        daoFee: daoFee,
        startTime: block.timestamp,
        endTime: block.timestamp + duration,
        claimedAmount: 0,
        active: true
    });

    // Update node's active pins
    nodes[node].activePins[cid] = true;

    // Send DAO fee
    (bool success, ) = daoTreasury.call{value: daoFee}(&quot;&quot;);
    require(success, &quot;DAO fee transfer failed&quot;);

    emit DirectPaymentCreated(paymentId, cid, node, msg.sender, nodePayment, daoFee, duration);
}
"><code><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">payNodeDirectly</span>(<span class="hljs-params">
    <span class="hljs-keyword">address</span> <span class="hljs-keyword">payable</span> node,
    <span class="hljs-keyword">bytes32</span> cid,
    <span class="hljs-keyword">uint256</span> duration
</span>) <span class="hljs-title"><span class="hljs-keyword">external</span></span> <span class="hljs-title"><span class="hljs-keyword">payable</span></span> </span>{
    <span class="hljs-built_in">require</span>(<span class="hljs-built_in">msg</span>.<span class="hljs-built_in">value</span> <span class="hljs-operator">&gt;</span> <span class="hljs-number">0</span>, <span class="hljs-string">"Payment required"</span>);
    <span class="hljs-built_in">require</span>(nodes[node].isActive, <span class="hljs-string">"Node not active"</span>);
    <span class="hljs-built_in">require</span>(nodes[node].bannedUntil <span class="hljs-operator">&lt;</span> <span class="hljs-built_in">block</span>.<span class="hljs-built_in">timestamp</span>, <span class="hljs-string">"Node is banned"</span>);

    <span class="hljs-comment">// Calculate basis points for DAO fee (100 = 1%)</span>
    <span class="hljs-keyword">uint256</span> daoFee <span class="hljs-operator">=</span> (<span class="hljs-built_in">msg</span>.<span class="hljs-built_in">value</span> <span class="hljs-operator">*</span> daoFeePercentage) <span class="hljs-operator">/</span> <span class="hljs-number">10000</span>;
    <span class="hljs-keyword">uint256</span> nodePayment <span class="hljs-operator">=</span> <span class="hljs-built_in">msg</span>.<span class="hljs-built_in">value</span> <span class="hljs-operator">-</span> daoFee;

    <span class="hljs-keyword">uint256</span> paymentId <span class="hljs-operator">=</span> _nextDirectPaymentId<span class="hljs-operator">+</span><span class="hljs-operator">+</span>;

    directPayments[paymentId] <span class="hljs-operator">=</span> DirectPayment({
        cid: cid,
        node: node,
        user: <span class="hljs-keyword">payable</span>(<span class="hljs-built_in">msg</span>.<span class="hljs-built_in">sender</span>),
        amount: nodePayment,
        daoFee: daoFee,
        startTime: <span class="hljs-built_in">block</span>.<span class="hljs-built_in">timestamp</span>,
        endTime: <span class="hljs-built_in">block</span>.<span class="hljs-built_in">timestamp</span> <span class="hljs-operator">+</span> duration,
        claimedAmount: <span class="hljs-number">0</span>,
        active: <span class="hljs-literal">true</span>
    });

    <span class="hljs-comment">// Update node's active pins</span>
    nodes[node].activePins[cid] <span class="hljs-operator">=</span> <span class="hljs-literal">true</span>;

    <span class="hljs-comment">// Send DAO fee</span>
    (<span class="hljs-keyword">bool</span> success, ) <span class="hljs-operator">=</span> daoTreasury.<span class="hljs-built_in">call</span>{<span class="hljs-built_in">value</span>: daoFee}(<span class="hljs-string">""</span>);
    <span class="hljs-built_in">require</span>(success, <span class="hljs-string">"DAO fee transfer failed"</span>);

    <span class="hljs-keyword">emit</span> DirectPaymentCreated(paymentId, cid, node, <span class="hljs-built_in">msg</span>.<span class="hljs-built_in">sender</span>, nodePayment, daoFee, duration);
}
</code></pre><div class="relative header-and-anchor"><h3 id="h-claiming-vested-payments">Claiming Vested Payments</h3></div><p>At any time during an active assignment, a node can claim the ETH currently being vested to them.</p><pre data-type="codeBlock" text="function claimVestedPayment(uint256 assignmentId) external {
    PinAssignment storage assignment = pinAssignments[assignmentId];

    require(msg.sender == assignment.node, &quot;Not authorized&quot;);
    require(assignment.active, &quot;Assignment not active&quot;);

    // Calculate vested amount
    uint256 totalDuration = assignment.endTime - assignment.startTime;
    uint256 elapsed = block.timestamp - assignment.startTime;

    uint256 vestedAmount;
    if (block.timestamp >= assignment.endTime) {
        vestedAmount = assignment.totalPayment;
    } else {
        vestedAmount = (assignment.totalPayment * elapsed) / totalDuration;
    }

    uint256 claimableAmount = vestedAmount - assignment.claimedAmount;
    require(claimableAmount > 0, &quot;No funds to claim&quot;);

    // Update claimed amount
    assignment.claimedAmount += claimableAmount;

    // Transfer ETH to node
    (bool success, ) = assignment.node.call{value: claimableAmount}(&quot;&quot;);
    require(success, &quot;Transfer failed&quot;);

    // Update node's total earned
    nodes[assignment.node].totalEarned += claimableAmount;

    emit PaymentClaimed(assignmentId, assignment.node, claimableAmount);
}
"><code><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">claimVestedPayment</span>(<span class="hljs-params"><span class="hljs-keyword">uint256</span> assignmentId</span>) <span class="hljs-title"><span class="hljs-keyword">external</span></span> </span>{
    PinAssignment <span class="hljs-keyword">storage</span> assignment <span class="hljs-operator">=</span> pinAssignments[assignmentId];

    <span class="hljs-built_in">require</span>(<span class="hljs-built_in">msg</span>.<span class="hljs-built_in">sender</span> <span class="hljs-operator">=</span><span class="hljs-operator">=</span> assignment.node, <span class="hljs-string">"Not authorized"</span>);
    <span class="hljs-built_in">require</span>(assignment.active, <span class="hljs-string">"Assignment not active"</span>);

    <span class="hljs-comment">// Calculate vested amount</span>
    <span class="hljs-keyword">uint256</span> totalDuration <span class="hljs-operator">=</span> assignment.endTime <span class="hljs-operator">-</span> assignment.startTime;
    <span class="hljs-keyword">uint256</span> elapsed <span class="hljs-operator">=</span> <span class="hljs-built_in">block</span>.<span class="hljs-built_in">timestamp</span> <span class="hljs-operator">-</span> assignment.startTime;

    <span class="hljs-keyword">uint256</span> vestedAmount;
    <span class="hljs-keyword">if</span> (<span class="hljs-built_in">block</span>.<span class="hljs-built_in">timestamp</span> <span class="hljs-operator">&gt;</span><span class="hljs-operator">=</span> assignment.endTime) {
        vestedAmount <span class="hljs-operator">=</span> assignment.totalPayment;
    } <span class="hljs-keyword">else</span> {
        vestedAmount <span class="hljs-operator">=</span> (assignment.totalPayment <span class="hljs-operator">*</span> elapsed) <span class="hljs-operator">/</span> totalDuration;
    }

    <span class="hljs-keyword">uint256</span> claimableAmount <span class="hljs-operator">=</span> vestedAmount <span class="hljs-operator">-</span> assignment.claimedAmount;
    <span class="hljs-built_in">require</span>(claimableAmount <span class="hljs-operator">&gt;</span> <span class="hljs-number">0</span>, <span class="hljs-string">"No funds to claim"</span>);

    <span class="hljs-comment">// Update claimed amount</span>
    assignment.claimedAmount <span class="hljs-operator">+</span><span class="hljs-operator">=</span> claimableAmount;

    <span class="hljs-comment">// Transfer ETH to node</span>
    (<span class="hljs-keyword">bool</span> success, ) <span class="hljs-operator">=</span> assignment.node.<span class="hljs-built_in">call</span>{<span class="hljs-built_in">value</span>: claimableAmount}(<span class="hljs-string">""</span>);
    <span class="hljs-built_in">require</span>(success, <span class="hljs-string">"Transfer failed"</span>);

    <span class="hljs-comment">// Update node's total earned</span>
    nodes[assignment.node].totalEarned <span class="hljs-operator">+</span><span class="hljs-operator">=</span> claimableAmount;

    <span class="hljs-keyword">emit</span> PaymentClaimed(assignmentId, assignment.node, claimableAmount);
}
</code></pre><div class="relative header-and-anchor"><h3 id="h-verification-and-slashing">Verification &amp; Slashing</h3></div><p>If a node is found to have prematurely unpinned an item, or is offline long enough for IPFS garbage collection to remove the pin, <strong>verifiers</strong> can report them to the protocol.</p><blockquote><p><span data-name="warning" class="emoji" data-type="emoji"><img src="https://cdn.jsdelivr.net/npm/emoji-datasource-apple/img/apple/64/26a0-fe0f.png" draggable="false" loading="lazy" align="absmiddle"></span> <strong>NOTE:</strong> The verification procedure needs a lot of work to ensure that it's reliable and doesn't maliciously target nodes who are behaving.</p></blockquote><pre data-type="codeBlock" text="function reportUnpinnedContent(bytes32 cid, address node, uint256 assignmentId) external {
    PinAssignment storage assignment = pinAssignments[assignmentId];

    require(assignment.cid == cid, &quot;CID mismatch&quot;);
    require(assignment.node == node, &quot;Node mismatch&quot;);
    require(assignment.active, &quot;Assignment not active&quot;);

    // Verification logic to confirm content is indeed not pinned
    bool contentUnpinned = _verifyContentIsUnpinned(cid, node);
    require(contentUnpinned, &quot;Content is still pinned&quot;);

    // Calculate remaining payment
    uint256 remainingFunds = assignment.totalPayment - assignment.claimedAmount;

    if (remainingFunds > 0) {
        // Return 95% to user
        uint256 userRefund = (remainingFunds * 95) / 100;
        (bool successUser, ) = assignment.user.call{value: userRefund}(&quot;&quot;);
        require(successUser, &quot;User refund failed&quot;);

        // Award 5% to reporter
        uint256 reporterReward = remainingFunds - userRefund;
        (bool successReporter, ) = payable(msg.sender).call{value: reporterReward}(&quot;&quot;);
        require(successReporter, &quot;Reporter reward failed&quot;);

        emit SlashingExecuted(assignmentId, node, userRefund, msg.sender, reporterReward);
    }

    // Mark assignment as inactive
    assignment.active = false;

    // Remove from node's active pins
    nodes[node].activePins[cid] = false;

    // Decrease node reputation
    _decreaseReputation(node, SLASHING_REPUTATION_PENALTY);

    // Check if ban is warranted
    _evaluateBanning(node);
}
"><code><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">reportUnpinnedContent</span>(<span class="hljs-params"><span class="hljs-keyword">bytes32</span> cid, <span class="hljs-keyword">address</span> node, <span class="hljs-keyword">uint256</span> assignmentId</span>) <span class="hljs-title"><span class="hljs-keyword">external</span></span> </span>{
    PinAssignment <span class="hljs-keyword">storage</span> assignment <span class="hljs-operator">=</span> pinAssignments[assignmentId];

    <span class="hljs-built_in">require</span>(assignment.cid <span class="hljs-operator">=</span><span class="hljs-operator">=</span> cid, <span class="hljs-string">"CID mismatch"</span>);
    <span class="hljs-built_in">require</span>(assignment.node <span class="hljs-operator">=</span><span class="hljs-operator">=</span> node, <span class="hljs-string">"Node mismatch"</span>);
    <span class="hljs-built_in">require</span>(assignment.active, <span class="hljs-string">"Assignment not active"</span>);

    <span class="hljs-comment">// Verification logic to confirm content is indeed not pinned</span>
    <span class="hljs-keyword">bool</span> contentUnpinned <span class="hljs-operator">=</span> _verifyContentIsUnpinned(cid, node);
    <span class="hljs-built_in">require</span>(contentUnpinned, <span class="hljs-string">"Content is still pinned"</span>);

    <span class="hljs-comment">// Calculate remaining payment</span>
    <span class="hljs-keyword">uint256</span> remainingFunds <span class="hljs-operator">=</span> assignment.totalPayment <span class="hljs-operator">-</span> assignment.claimedAmount;

    <span class="hljs-keyword">if</span> (remainingFunds <span class="hljs-operator">&gt;</span> <span class="hljs-number">0</span>) {
        <span class="hljs-comment">// Return 95% to user</span>
        <span class="hljs-keyword">uint256</span> userRefund <span class="hljs-operator">=</span> (remainingFunds <span class="hljs-operator">*</span> <span class="hljs-number">95</span>) <span class="hljs-operator">/</span> <span class="hljs-number">100</span>;
        (<span class="hljs-keyword">bool</span> successUser, ) <span class="hljs-operator">=</span> assignment.user.<span class="hljs-built_in">call</span>{<span class="hljs-built_in">value</span>: userRefund}(<span class="hljs-string">""</span>);
        <span class="hljs-built_in">require</span>(successUser, <span class="hljs-string">"User refund failed"</span>);

        <span class="hljs-comment">// Award 5% to reporter</span>
        <span class="hljs-keyword">uint256</span> reporterReward <span class="hljs-operator">=</span> remainingFunds <span class="hljs-operator">-</span> userRefund;
        (<span class="hljs-keyword">bool</span> successReporter, ) <span class="hljs-operator">=</span> <span class="hljs-keyword">payable</span>(<span class="hljs-built_in">msg</span>.<span class="hljs-built_in">sender</span>).<span class="hljs-built_in">call</span>{<span class="hljs-built_in">value</span>: reporterReward}(<span class="hljs-string">""</span>);
        <span class="hljs-built_in">require</span>(successReporter, <span class="hljs-string">"Reporter reward failed"</span>);

        <span class="hljs-keyword">emit</span> SlashingExecuted(assignmentId, node, userRefund, <span class="hljs-built_in">msg</span>.<span class="hljs-built_in">sender</span>, reporterReward);
    }

    <span class="hljs-comment">// Mark assignment as inactive</span>
    assignment.active <span class="hljs-operator">=</span> <span class="hljs-literal">false</span>;

    <span class="hljs-comment">// Remove from node's active pins</span>
    nodes[node].activePins[cid] <span class="hljs-operator">=</span> <span class="hljs-literal">false</span>;

    <span class="hljs-comment">// Decrease node reputation</span>
    _decreaseReputation(node, SLASHING_REPUTATION_PENALTY);

    <span class="hljs-comment">// Check if ban is warranted</span>
    _evaluateBanning(node);
}
</code></pre><p>Ideally, <strong>verifiers</strong> would interact with reputation-altering functions through an oracle or other interface that can atomically check IPFS pin status against contract storage. For the actual implementation, this would check IPFS network.</p><pre data-type="codeBlock" text="function _verifyContentIsUnpinned(bytes32 cid, address node) internal returns (bool) {
    //
    // Returns true if content is confirmed to be unpinned
    //
    return true;
}
"><code><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">_verifyContentIsUnpinned</span>(<span class="hljs-params"><span class="hljs-keyword">bytes32</span> cid, <span class="hljs-keyword">address</span> node</span>) <span class="hljs-title"><span class="hljs-keyword">internal</span></span> <span class="hljs-title"><span class="hljs-keyword">returns</span></span> (<span class="hljs-params"><span class="hljs-keyword">bool</span></span>) </span>{
    <span class="hljs-comment">//</span>
    <span class="hljs-comment">// Returns true if content is confirmed to be unpinned</span>
    <span class="hljs-comment">//</span>
    <span class="hljs-keyword">return</span> <span class="hljs-literal">true</span>;
}
</code></pre><div class="relative header-and-anchor"><h2 id="h-challenges-and-considerations">Challenges &amp; Considerations</h2></div><p>As with any novel application there are a number of challenges and additional considerations that will need to be worked on as Pin.sol is developed. Some of these will have to be addressed before a mainnet launch, while others can be addressed later through community proposals.</p><p>You can find a non-exhaustive list of development challenges and considerations <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="CHALLENGES.md">here</a>.</p><div class="relative header-and-anchor"><h2 id="h-conclusion">Conclusion</h2></div><p>This document outlines the vision for Pin.sol, an ETH-based decentralized storage incentivization layer for IPFS. The protocol leverages Ethereum's security, liquidity, and composability to create reliable distributed storage with fair access for all participating nodes.</p><p>By providing direct economic incentives for IPFS pinning through a balanced queue system, Pin.sol helps bridge the gap between decentralized storage technology and practical applications that require persistence guarantees.</p><hr><div class="relative header-and-anchor"><h3 id="h-contact">Contact</h3></div><p>If you have any questions, open an issue or discussio thread, or reach out on <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://warpcast.com/jonbray.eth">Warpcast</a>.</p><p></p>]]></content:encoded>
            <author>jonbray@newsletter.paragraph.com (Jon Bray)</author>
            <category>ipfs</category>
            <category>ethereum</category>
            <category>storage</category>
            <category>decentralization</category>
            <category>dao</category>
            <enclosure url="https://storage.googleapis.com/papyrus_images/0d6ecc87e0be2319fe37cc2fd27552b2.jpg" length="0" type="image/jpg"/>
        </item>
        <item>
            <title><![CDATA[On Ethereum and DeFi]]></title>
            <link>https://paragraph.com/@jonbray/eth-defi</link>
            <guid>4VYBwmkfiONcxfVeUUsd</guid>
            <pubDate>Wed, 28 Aug 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Over the last few days, a debate has been brewing on Crypto Twitter over the current state of DeFi...]]></description>
            <content:encoded><![CDATA[<div class="relative header-and-anchor"><h2 id="h-the-people-v-vitalik">The People v. Vitalik</h2></div><p>Over the last few days, a debate has been brewing on Crypto Twitter (CT) between supporters of Vitalik and The Ethereum Foundation (EF) and supporters of DeFi products and founders. The former suggesting that Vitalik and EF harbor anti-DeFi sentiments and are actively holding back the growth of the sector. One outspoken critic is Kain—founder of Synthetix and a pioneer in yield farming—who has expressed concern with a lack of initiative and discouragement from Vitalik. People are either accusing Vitalik of being a DeFi bear or blindly agreeing with his every word.</p><p>As with most things on CT, the real facts are probably somewhere in the middle and both parties can have the best interest of DeFi in mind even though they don't agree.</p><p>Let's break it down.</p><div class="relative header-and-anchor"><h2 id="h-vitalik-on-defi">Vitalik on DeFi</h2></div><p>Vitalik has been generally bullish on the DeFi space, especially in the early days when new contract designs were being introduced that allowed liquidity to be supported onchain. You can check out some of his videos discussions <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.youtube.com/watch?v=6Eb2sgM29yo">here</a>. Despite showing support for many of the advances and experiments over the years, he's taken some flak in the recent weeks for his stance on way that DeFi has been growing (or not growing).</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/8b5e7b40634f0264d8af4e7c82e17332.png" blurdataurl="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB8AAAAgCAIAAABl4DQWAAAACXBIWXMAAAsTAAALEwEAmpwYAAAEdklEQVR4nKWWUUgiXRTHDwQ+SYSEihFEUBHE7EeBhNFCxKBEEqKMDCJKSMzQ6kMPE4OMiBgiEiMhIUZEFBjRUz1IG0VED0Ev9RARvQSGRISCG8bguvORd5r16yu3zf/LMOfe87tnzr1z7gGxriovetNe31cURajPFV+Uz+cPDw85jguFQuvr6zc3N6Iolqv6O7rMrVQq2Wz24OAgHo9HIpGVlRW73W4wGCiKCgQCiF7/O17T5akXFxfxeHxubm5xcXGWmaWqcrlcGo2mpaUFwzCn07m4uLi/v//4+CivVI+OuD+KP1KpFMuyoVCIJMnW1lYAQLhwOMxxXIAL2O12nU4HAAMDAxRFHR0dye5v09HY7e1tOBzmed7j8QBAX19fMpm8v7//f1yCICSTSZVKBQAEQaytrZXL5VcLSHRkfXh4mJ2d5Xl+eHi4qakpk8nIQ7WbUS6XBUFAr6VSaXx8HAAsFsvCwoIgCG/Tf4m/GIZJJBJ6vf4L9qVUKqEAXzm8Ch+l2+v1AoDD4eACXG2KQH7Z3NwMhUIYhvX09Iii+LPys/5pk8N6enoSRdFO2Nva2giC2NrakpmAHtfX1yzL0jQNACjqygd+FlkoDoPBMDg4aLfbHx4eEEGi8zzPMIxSqUyn0+8drzpC8w8ODgAAx/FEIoGMz5nJ5/MMw5jN5r6+vk+gkdD2/FPVzMxMoVCQ8p7JZBiG6e7ujsVin6aXq17Ly8sajWZsbGxvb0+iLy0tORyO5uZmVD3+KuOykFc2m1WpVEajkeM4iR4Oh202W1dXl9iAKi8xYRim1+vHx8cleiAQcLvdOI5/OvDa5JhMpvb2dr1eL9EpiiIIwul0NkgXqhtrtVq1Wm13d7dEt1gsOI43Tq9Ufd1u9+DgIPoln+lOpxPHcZPJhP66RtD5fJ4kSQzDDAaDROc4rr+/f3R09PLyssEzc35+ThBES0sLTdMS/fvud4VCQdHUyspKg+d9Y2NjcnISAHZ2dn7XyI6ODpvN5vV661TEP6pQKHi9Xoqi1Gq1VMXQmhzHabVai8Wyurr66TqTWlry+/2dnZ0+n0+qM2iRp6cntVptNBrNZjPKfvnDC6CZJycnFEVNTU0pFIpisSjVSHk4nU4DAE3THo8nm80ie/0dRveUKIpXV1fBYHBhYQEAar9eyjt6mZ6eBoD5+Xmfz3d2dib7v1oG3YKy8fj42O12+/1+tVpNkmTtd/++tZGJJEkACAQCNE2nUqm7u7s3zyiy5HK5RCLh9/t5nlcqlWNjY69S+p+OAw34fD50C3NVJZPJ/f39XC5XLBYLhUI+n8/lcicnJ9Fo1OVyxWIxq9UKAPJO1utn0Inc3d3VVUWSJOruWJaNRCIsy/r9fpZlg8Hgt+lvX4e/AoBSqdze3pbrzLt0JDRJEIREItHb29vc3NzR0WEwGCYmJsxmM47j/f39Op1OoVB0dnbGYjEU7597sdoUybOfWz4+7nK5jEbj0NDQyMiIw+GIRqOnp6e1Hc6bnHd74I+0uHW4iP4v3ayff2KuPIMAAAAASUVORK5CYII=" nextheight="360" nextwidth="351" class="image-node embed"><figcaption htmlattributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>His most recent take is that DeFi has been stagnant and has fallen victim to the same type of get rich quick mentality that has plagued much of crypto this cycle. He has actively advocated for building <strong>simple yet robust DeFi products</strong> rather than products who's only selling point are crazy APYs and rely on extractive or dilutive mechanics like emissions to achieve these high purported returns.</p><p>His suggestion is that for DeFi to thrive, we need to switch our focus to utility-based products like stablecoins, fractionalized RWAs, and commodities exchanges. He believes that things like fractional ownership can help retail investors enter the real estate market without being overly leveraged in one asset type, making DeFi globally accessible to everyone.</p><div class="relative header-and-anchor"><h2 id="h-ct-on-vitalik-and-the-ef">CT on Vitalik and The EF</h2></div><p>In August, Kain wrote a tweet hinting that EF and Vitalik were not being supportive of DeFi. He elaborated on his stance on the "Steady Lads" podcast (link <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://youtu.be/GPd3uWEVnSg">here</a>), where he stated that while he respects Vitalik, he disagrees with his stance on DeFi.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/0df518141e1e7c0738f47295d9946c8f.png" blurdataurl="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAZCAIAAADfbbvGAAAACXBIWXMAAAsTAAALEwEAmpwYAAAGiklEQVR4nJ1V22/i6BX/MiQTwjAOJo65+IJtDMYGTMDG5mIDxjHXYAMJhBBSMplktJnpjna22qoXrVSpfehT+171dZ8q9a2v1b7uS/+CbdWn1T60f8OsDGy2W+1Uo0o/fbK/2znnd37fOQBAhBeh7hv5i5II9mNgNwJ2wiBA7IVYABEAJv8PeBAqUdCDsQwIEAD4iT89t95+9snbP77+3axtnd/Onr+8+/Cnn/35L3wkTEYJAOEAwkAAf//bwU74o5//evHiDQCH4DBC/f03F5//7R//+urrL35xSR3pvGJwUr3Rn8IoAYXjO1h6jxQfR7htNP7+QdBihVcaqwgg/CPH/OuX//z327c98zjEFqh8DUuXETZPZKoQk48NXyVvfsUtP0VKJ8Af9aCM6+ODs/8xPuAREgO+qMs2TALXyG40VKgDTnWnINxdg8nNhy8K/Bjwr8dv4YuueMPd7/U2P+5iN7JZXW+DVqzuIrSgNMiklEirBzEhFM/TYhllcrRYSRQ0XCgGYxmUEXFeDifyIfaITKu4UISIVJDOHjAiRKRwXkaZXJDOcpKOxnNkWsWEYlLSYDLtGngSSVRajmz0Lm5fq6atd057k2V7fKV1xu3RonO2HC1e9CfL9ujybHk/v33dOJle378x7Zk1nBuD81p30p9em/ZFUtY746v2eHFy/kyqdwezm2z52I1mG6UVo7d2llcaiYKeLR+rpo0J8gEjJiVdNe2U3MA4mZcbendcsRxBNXChmCkd5/WOag6OtDYhKILa5GX3eJg9IgQlnMhvEu4NsWtHsqVjZ35b604Etal3TkumXbGc0eKFNZyLZSuvtXnFaPQnpj2L8nJaba4356qt9umCVw29e+bMb0umozYHJ9Nrc3DuDbFugj0IhQuKXO+i8ZygNjlJz1VbWnuUKOiZUpOVtKLRF1RXuJmSG5ls9MSqVTJtMq0KqqE2B5lSs2TaJdNmchohKKppr3K7khBMuhTJ9a5pX2CcJNV6Wnusd07NwXmioAuqIde7jf5k+uyVac8qLWe6fDmY3dS6k9OrD/J6Rzbc/dX2yBrOS6ZjDs619lisWnvhBPBh3xnIlJqK0cfTSq5qVSybFiuK0a91JwW90xpdds6u5Ho3zB4Zg3NKrGRKx9XWsGI5TE6rtJy83pHq3dboMi5qcr27uHtt2jO1afen1xuK9sIJqdZTjJOUVJeNXl7rcHK9ZNqC2owk8nmtUzT6mFDcJwSxauG8LFYtqe6yxEqam+TmgMlpqmknJT0lNyrWMFs+lo2eoDYfo/GNgcbJtGw5g9lNe7yotoaCaijNwXBx1zyZdidLxTgZLu6KRr+gdy6ef1ixnNbo8mT6bDi/bfQnanMwmN08//Enx85MrFrZ8nH3bKl3x9sovXloe2FWrLaSkp6UdNploCmoBplWXY+URlLScV7mJD0l1deruaqVlDReMVJyI1dtheL51cFyptSstsdRTkrJdSpTdt1/kGmjPxnMbnqTpTWcv/zJLyuW059ep+RGf3rtzG/Plveds6vW6FJrj6fXL1f5tIeLu2p7bNozZ347Xd5fvXhTNPrG4ByOCa5+fJhLTmBV7b0hFudlmEwfMpl9QgjGMtsIBWGcP5oMxY9osUII8j4h+CNckM6G2COISMExIUhng3QWZXIoI2KcJFYtiEhBRCpA8i45MPkYjW9y4EEoX4Q7ZAshthAV1KigPokkw5xyGC9AZBoi01haReL571W3dYdY/7rVDXN71GZ+0zZ41WIKNbesehDKH+EOyIx7HZEOMjlvOBHm5DAnQ2Q6yIhoogDTogehtlH6XdhB49so/VCuAUyGuKLrFkyCRzAJEAwcRN1wVnXYgzIbB6FVBd4JA9+qDaw6wRZCPVTjzeQP4bvmAw6ifwAXvwen2xSfrXQPEzIAT0HnY+a3X0JMgVcMVm5iaRVAuD/KMfmaN8Rmqm0iXcGF0nt1N3CA2T6t5y15sCQtaoFYBvjCgDNA6+O9CBcv1DLlDpnTAExCZJpyDSSofC0uNagj/aG1/S+4FIVIEIrtIjQIEB6Eehxid2B8y4dso5TLmx8D3jDwR7dg4lEA34IJ4EFd7IR2EXqtlh/EWk4rFaHsVuB7ZrdgagthVnRHn3IqO/9ZzLmPtpfE4IODihMbvkr86FOyf7cb5R9k898IEDto3A1xrdl3KgShvBFuP1OHC9bTpPKELT6JF4JyG84ZgWzdG05uv1td68f8DYT1h3iunlqoAAAAAElFTkSuQmCC" nextheight="570" nextwidth="726" class="image-node embed"><figcaption htmlattributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>Kain mentioned that Vitalik and his "inner cabal" at EF have openly discouraged founders from building DeFi products during meetings, and that established and important protocols like Aave are not part of this "cabal" and therefore don't receive the type of support that Maker and Uniswap receive.</p><p>Despite this, Kain and others in the discussion believes that Ethereum is still an ideal ecosystem compared to other chains and remains bullish on the network.</p><div class="relative header-and-anchor"><h2 id="h-my-thoughts">My Thoughts</h2></div><p>Personally I'm all for experimenting and trying new things in DeFi, but if the entire world is going to come onchain DeFi needs to have better infrastructure that can not only bring finance onchain but <strong>provide a better option than legacy systems</strong>.</p><p>Simply having a means to swap tokens (traditional LPs) and provide collateral for highly-liquid pairs (Aave, lending pools) is not enough. Likewise, putting yield farms that use token emissions and rely mostly on trading revenue and ponzinomics isn't a good look for the space either. As usual, the right path is somewhere in the middle.</p><p>It's impossible to say what concepts will eventually make an impact on the average user. We've already seen yield farming concepts bleed over into other spaces on Farcaster where apps like Alfafrens have social networks on top of yield-farming paradigms.</p><p>I understand completely the frustration from both Kain and Vitalik/EF. Simply dismissing the current state of DeFi or not providing backing for products that have propped up your network simply because they don't fit the average person's risk model is bad for business. Ignoring the fact that the current state of DeFi looks more like a casino or a carnival to outside observers is also foolish.</p><p>If we don't align DeFi with the needs of the broader financial ecosystem, someone else will, and I guarantee they won't care about decentralization and permissionless systems.</p><p>The discussion between CT and Vitalik has brought up several elephants in the room:</p><ul><li><p><strong>Who is really paying for insanely high yields?</strong></p><p>This has been a longstanding concern in DeFi, as the APY numbers you see on yield platforms are generally a derivative with respect to a very specific set of circumstances (i.e. the current function remaining unchanged over a year) or padded with emissions in some native protocol token. Instead of creating novel sources of <strong>real yield</strong>, many tokens are only valuable as a yield-bearing instrument when they are actively traded, which has (as Vitalik put it) created an ouroboros effect downstreaming the ETH market.</p></li><li><p><strong>The role of centralized entities in DeFi</strong></p><p>For better or worse, centralized entities play a significant role in the current landscape. Whether it's oracles for price calculations or multi-sig wallets as contract owners, most successful protocols have a some centralized aspect while truly decentralized protocols have struggled to maintain the same level of market dominance. While fully decentralized and permissionless systems are ideal for many things, having a period of time where a centralized entity slowly cedes control to decentralized consensus can be beneficial.</p></li><li><p><strong>Lack of innovation in DeFi</strong></p><p>Groundbreaking innovation has been relatively stagnant in DeFi recently. With a lot of newcomers to the space who weren't here in previous cycles, why build something novel that takes time when you can recycle the same tricks from previous cycles on a new audience?</p><p>While that is not entirely true, many protocols are just outright forks or slight variations on existing concepts, making little difference in the overall growth of DeFi.</p></li></ul><div class="relative header-and-anchor"><h2 id="h-why-do-i-care">Why do I care?</h2></div><p>As a builder in the DeFi space, these are things I'm thinking about all the time. So to see discussion popping up on CT specific to DeFi after so many years of building quietly in the background is exciting, even if it's causing debate. I've been building onchain for a decade now, an while I don't completely agree with either side, I do think that DeFi is still one of the most important use-cases for crypto.</p><p>Being able to have your assets on a permissionless network, available any time, anywhere, is powerful. That's freedom.</p><p>But DeFi needs direction if we're going to make an impact on billions of people.</p><p>This is a huge part of the motivation behind what we're building at Xeon Protocol, which aims to address some of these big questions. We need more primitives that protocols can build on top of. Risk-management should be engrained in DeFi and utilized as needed for any app or asset.</p><div class="relative header-and-anchor"><h3 id="h-token-agnostic">Token Agnostic</h3></div><p>As I said previously, it's impossible to predict what specific advancement is going to take hold, which is why Xeon takes a token-agnostic approach to our products. Whether it's a stablecoin, NFT, yield-bearing token, or RWA you should be able to unlock it's underlying liquidity and make it composable in the broader DeFi space. Hedging allows you to mitigate risk without immediately realizing gains or losses, and make ad-hoc deals with other users to spread out your exposure.</p><p>You shouldn't need permission to do this, they are your assets. As DeFi builders, we should prioritize giving people as much freedom to interact with the broader ecosystem as possible.</p><p>Having contracts that facilitate OTC transactions between users, allowing them to adjust terms based on their personal risk tolerance with little restriction is important for new asset classes coming onchain.</p><div class="relative header-and-anchor"><h3 id="h-centralization">Centralization</h3></div><p>We're trying to minimize the role of centralized entities by having as much as possible done on the protocol level. While we've written a framework for P2P DeFi deals, users are fully empowered to set trade conditions. Our options are self-contained tokens themselves, containing all of the terms, tokens, collateral, and settlement data required for users to adjust as they please.</p><p>Protocol revenue is handled through a multi-chain staking pool and returned to stakers as ETH, with as little liquidity left unused as possible. Participants can choose what networks and assets they want exposure to.</p><p>Our price oracle is another place we've tried to eliminate centralized points of failure. This has posed some challenges, but we've settled on a mix of centralized and decentralized solutions to create what I feel is the most robust onchain price oracle out there.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/4b53bb8532184ccad6a1b7e4416d6691.png" blurdataurl="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAWCAIAAAAuOwkTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAc+nRFWHRteGZpbGUAJTNDbXhmaWxlJTIwaG9zdCUzRCUyMmFwcC5kaWFncmFtcy5uZXQlMjIlMjBhZ2VudCUzRCUyMk1vemlsbGElMkY1LjAlMjAoV2luZG93cyUyME5UJTIwMTAuMCUzQiUyMFdpbjY0JTNCJTIweDY0KSUyMEFwcGxlV2ViS2l0JTJGNTM3LjM2JTIwKEtIVE1MJTJDJTIwbGlrZSUyMEdlY2tvKSUyMENocm9tZSUyRjEyNy4wLjAuMCUyMFNhZmFyaSUyRjUzNy4zNiUyMiUyMHZlcnNpb24lM0QlMjIyNC43LjglMjIlMjBzY2FsZSUzRCUyMjElMjIlMjBib3JkZXIlM0QlMjIwJTIyJTNFJTBBJTIwJTIwJTNDZGlhZ3JhbSUyMG5hbWUlM0QlMjJQYWdlLTElMjIlMjBpZCUzRCUyMnA1dVpIaEhCQnQ2TEFTZDVnTlRBJTIyJTNFJTBBJTIwJTIwJTIwJTIwJTNDbXhHcmFwaE1vZGVsJTIwZHglM0QlMjIxNzA5JTIyJTIwZHklM0QlMjI5MzMlMjIlMjBncmlkJTNEJTIyMSUyMiUyMGdyaWRTaXplJTNEJTIyMTAlMjIlMjBndWlkZXMlM0QlMjIxJTIyJTIwdG9vbHRpcHMlM0QlMjIxJTIyJTIwY29ubmVjdCUzRCUyMjElMjIlMjBhcnJvd3MlM0QlMjIxJTIyJTIwZm9sZCUzRCUyMjElMjIlMjBwYWdlJTNEJTIyMSUyMiUyMHBhZ2VTY2FsZSUzRCUyMjElMjIlMjBwYWdlV2lkdGglM0QlMjI4NTAlMjIlMjBwYWdlSGVpZ2h0JTNEJTIyMTEwMCUyMiUyMG1hdGglM0QlMjIwJTIyJTIwc2hhZG93JTNEJTIyMCUyMiUzRSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUzQ3Jvb3QlM0UlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlM0NteENlbGwlMjBpZCUzRCUyMjAlMjIlMjAlMkYlM0UlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlM0NteENlbGwlMjBpZCUzRCUyMjElMjIlMjBwYXJlbnQlM0QlMjIwJTIyJTIwJTJGJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDbXhDZWxsJTIwaWQlM0QlMjJRaTR1ZmJfcFdSM0Z0N3FDam44Ty02JTIyJTIwdmFsdWUlM0QlMjJQcmljZSUyMFF1b3RlJTIyJTIwc3R5bGUlM0QlMjJzd2ltbGFuZSUzQmZvbnRTdHlsZSUzRDAlM0JjaGlsZExheW91dCUzRHN0YWNrTGF5b3V0JTNCaG9yaXpvbnRhbCUzRDElM0JzdGFydFNpemUlM0QzMCUzQmhvcml6b250YWxTdGFjayUzRDAlM0JyZXNpemVQYXJlbnQlM0QxJTNCcmVzaXplUGFyZW50TWF4JTNEMCUzQnJlc2l6ZUxhc3QlM0QwJTNCY29sbGFwc2libGUlM0QxJTNCbWFyZ2luQm90dG9tJTNEMCUzQndoaXRlU3BhY2UlM0R3cmFwJTNCaHRtbCUzRDElM0IlMjIlMjB2ZXJ0ZXglM0QlMjIxJTIyJTIwcGFyZW50JTNEJTIyMSUyMiUzRSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUzQ214R2VvbWV0cnklMjB4JTNEJTIyNDYwJTIyJTIweSUzRCUyMjcwJTIyJTIwd2lkdGglM0QlMjIxNDAlMjIlMjBoZWlnaHQlM0QlMjI5MCUyMiUyMGFzJTNEJTIyZ2VvbWV0cnklMjIlMjAlMkYlM0UlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlM0MlMkZteENlbGwlM0UlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlM0NteENlbGwlMjBpZCUzRCUyMlFpNHVmYl9wV1IzRnQ3cUNqbjhPLTclMjIlMjB2YWx1ZSUzRCUyMlF1b3RlQ3VycmVuY3klMjIlMjBzdHlsZSUzRCUyMnRleHQlM0JzdHJva2VDb2xvciUzRG5vbmUlM0JmaWxsQ29sb3IlM0Rub25lJTNCYWxpZ24lM0RsZWZ0JTNCdmVydGljYWxBbGlnbiUzRG1pZGRsZSUzQnNwYWNpbmdMZWZ0JTNENCUzQnNwYWNpbmdSaWdodCUzRDQlM0JvdmVyZmxvdyUzRGhpZGRlbiUzQnBvaW50cyUzRCU1QiU1QjAlMkMwLjUlNUQlMkMlNUIxJTJDMC41JTVEJTVEJTNCcG9ydENvbnN0cmFpbnQlM0RlYXN0d2VzdCUzQnJvdGF0YWJsZSUzRDAlM0J3aGl0ZVNwYWNlJTNEd3JhcCUzQmh0bWwlM0QxJTNCJTIyJTIwdmVydGV4JTNEJTIyMSUyMiUyMHBhcmVudCUzRCUyMlFpNHVmYl9wV1IzRnQ3cUNqbjhPLTYlMjIlM0UlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlM0NteEdlb21ldHJ5JTIweSUzRCUyMjMwJTIyJTIwd2lkdGglM0QlMjIxNDAlMjIlMjBoZWlnaHQlM0QlMjIzMCUyMiUyMGFzJTNEJTIyZ2VvbWV0cnklMjIlMjAlMkYlM0UlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlM0MlMkZteENlbGwlM0UlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlM0NteENlbGwlMjBpZCUzRCUyMlFpNHVmYl9wV1IzRnQ3cUNqbjhPLTglMjIlMjB2YWx1ZSUzRCUyMlBhaXJlZEN1cnJlbmN5JTIyJTIwc3R5bGUlM0QlMjJ0ZXh0JTNCc3Ryb2tlQ29sb3IlM0Rub25lJTNCZmlsbENvbG9yJTNEbm9uZSUzQmFsaWduJTNEbGVmdCUzQnZlcnRpY2FsQWxpZ24lM0RtaWRkbGUlM0JzcGFjaW5nTGVmdCUzRDQlM0JzcGFjaW5nUmlnaHQlM0Q0JTNCb3ZlcmZsb3clM0RoaWRkZW4lM0Jwb2ludHMlM0QlNUIlNUIwJTJDMC41JTVEJTJDJTVCMSUyQzAuNSU1RCU1RCUzQnBvcnRDb25zdHJhaW50JTNEZWFzdHdlc3QlM0Jyb3RhdGFibGUlM0QwJTNCd2hpdGVTcGFjZSUzRHdyYXAlM0JodG1sJTNEMSUzQiUyMiUyMHZlcnRleCUzRCUyMjElMjIlMjBwYXJlbnQlM0QlMjJRaTR1ZmJfcFdSM0Z0N3FDam44Ty02JTIyJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDbXhHZW9tZXRyeSUyMHklM0QlMjI2MCUyMiUyMHdpZHRoJTNEJTIyMTQwJTIyJTIwaGVpZ2h0JTNEJTIyMzAlMjIlMjBhcyUzRCUyMmdlb21ldHJ5JTIyJTIwJTJGJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTJGbXhDZWxsJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDbXhDZWxsJTIwaWQlM0QlMjJRaTR1ZmJfcFdSM0Z0N3FDam44Ty0xMiUyMiUyMHZhbHVlJTNEJTIyWGVvbiUyMFByaWNlJTIwT3JhY2xlJTIyJTIwc3R5bGUlM0QlMjJzd2ltbGFuZSUzQndoaXRlU3BhY2UlM0R3cmFwJTNCaHRtbCUzRDElM0IlMjIlMjB2ZXJ0ZXglM0QlMjIxJTIyJTIwcGFyZW50JTNEJTIyMSUyMiUzRSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUzQ214R2VvbWV0cnklMjB4JTNEJTIyMjUwJTIyJTIweSUzRCUyMjI0MCUyMiUyMHdpZHRoJTNEJTIyNTcwJTIyJTIwaGVpZ2h0JTNEJTIyMjIwJTIyJTIwYXMlM0QlMjJnZW9tZXRyeSUyMiUyMCUyRiUzRSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUzQyUyRm14Q2VsbCUzRSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUzQ214Q2VsbCUyMGlkJTNEJTIyUWk0dWZiX3BXUjNGdDdxQ2puOE8tMiUyMiUyMHZhbHVlJTNEJTIyQ2hhaW5MaW5rJTIyJTIwc3R5bGUlM0QlMjJyb3VuZGVkJTNEMSUzQndoaXRlU3BhY2UlM0R3cmFwJTNCaHRtbCUzRDElM0IlMjIlMjB2ZXJ0ZXglM0QlMjIxJTIyJTIwcGFyZW50JTNEJTIyUWk0dWZiX3BXUjNGdDdxQ2puOE8tMTIlMjIlM0UlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlM0NteEdlb21ldHJ5JTIweCUzRCUyMjMwJTIyJTIweSUzRCUyMjM1JTIyJTIwd2lkdGglM0QlMjIxMjAlMjIlMjBoZWlnaHQlM0QlMjI2MCUyMiUyMGFzJTNEJTIyZ2VvbWV0cnklMjIlMjAlMkYlM0UlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlM0MlMkZteENlbGwlM0UlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlM0NteENlbGwlMjBpZCUzRCUyMlFpNHVmYl9wV1IzRnQ3cUNqbjhPLTQlMjIlMjB2YWx1ZSUzRCUyMlVuaXN3YXAtdjIlMjIlMjBzdHlsZSUzRCUyMnJvdW5kZWQlM0QxJTNCd2hpdGVTcGFjZSUzRHdyYXAlM0JodG1sJTNEMSUzQiUyMiUyMHZlcnRleCUzRCUyMjElMjIlMjBwYXJlbnQlM0QlMjJRaTR1ZmJfcFdSM0Z0N3FDam44Ty0xMiUyMiUzRSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUzQ214R2VvbWV0cnklMjB4JTNEJTIyMTcwJTIyJTIweSUzRCUyMjM1JTIyJTIwd2lkdGglM0QlMjIxMjAlMjIlMjBoZWlnaHQlM0QlMjI2MCUyMiUyMGFzJTNEJTIyZ2VvbWV0cnklMjIlMjAlMkYlM0UlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlM0MlMkZteENlbGwlM0UlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlM0NteENlbGwlMjBpZCUzRCUyMlFpNHVmYl9wV1IzRnQ3cUNqbjhPLTUlMjIlMjB2YWx1ZSUzRCUyMlVuaXN3YXAtdjMlMjIlMjBzdHlsZSUzRCUyMnJvdW5kZWQlM0QxJTNCd2hpdGVTcGFjZSUzRHdyYXAlM0JodG1sJTNEMSUzQiUyMiUyMHZlcnRleCUzRCUyMjElMjIlMjBwYXJlbnQlM0QlMjJRaTR1ZmJfcFdSM0Z0N3FDam44Ty0xMiUyMiUzRSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUzQ214R2VvbWV0cnklMjB4JTNEJTIyMTcwJTIyJTIweSUzRCUyMjk1JTIyJTIwd2lkdGglM0QlMjIxMjAlMjIlMjBoZWlnaHQlM0QlMjI2MCUyMiUyMGFzJTNEJTIyZ2VvbWV0cnklMjIlMjAlMkYlM0UlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlM0MlMkZteENlbGwlM0UlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlM0NteENlbGwlMjBpZCUzRCUyMlFpNHVmYl9wV1IzRnQ3cUNqbjhPLTE4JTIyJTIwdmFsdWUlM0QlMjJWYWx1ZSUyMG9mJTIwYm90aCUyMHRva2VucyUyMGZyb20lMjBtb3N0JTIwbGlxdWlkJTIwcG9vbCUyMiUyMHN0eWxlJTNEJTIydGV4dCUzQmh0bWwlM0QxJTNCYWxpZ24lM0RjZW50ZXIlM0J2ZXJ0aWNhbEFsaWduJTNEbWlkZGxlJTNCd2hpdGVTcGFjZSUzRHdyYXAlM0Jyb3VuZGVkJTNEMCUzQiUyMiUyMHZlcnRleCUzRCUyMjElMjIlMjBwYXJlbnQlM0QlMjJRaTR1ZmJfcFdSM0Z0N3FDam44Ty0xMiUyMiUzRSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUzQ214R2VvbWV0cnklMjB4JTNEJTIyMjIwJTIyJTIweSUzRCUyMjE3MCUyMiUyMHdpZHRoJTNEJTIyMTYwJTIyJTIwaGVpZ2h0JTNEJTIyMzAlMjIlMjBhcyUzRCUyMmdlb21ldHJ5JTIyJTIwJTJGJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTJGbXhDZWxsJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDbXhDZWxsJTIwaWQlM0QlMjJRaTR1ZmJfcFdSM0Z0N3FDam44Ty0yMCUyMiUyMHN0eWxlJTNEJTIyZWRnZVN0eWxlJTNEb3J0aG9nb25hbEVkZ2VTdHlsZSUzQnJvdW5kZWQlM0QwJTNCb3J0aG9nb25hbExvb3AlM0QxJTNCamV0dHlTaXplJTNEYXV0byUzQmh0bWwlM0QxJTNCZXhpdFglM0QwJTNCZXhpdFklM0QwLjUlM0JleGl0RHglM0QwJTNCZXhpdER5JTNEMCUzQmVudHJ5WCUzRDAuMDI1JTNCZW50cnlZJTNELTAuMDM5JTNCZW50cnlEeCUzRDAlM0JlbnRyeUR5JTNEMCUzQmVudHJ5UGVyaW1ldGVyJTNEMCUzQiUyMiUyMGVkZ2UlM0QlMjIxJTIyJTIwcGFyZW50JTNEJTIyMSUyMiUyMHNvdXJjZSUzRCUyMlFpNHVmYl9wV1IzRnQ3cUNqbjhPLTclMjIlMjB0YXJnZXQlM0QlMjJRaTR1ZmJfcFdSM0Z0N3FDam44Ty0xMiUyMiUzRSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUzQ214R2VvbWV0cnklMjByZWxhdGl2ZSUzRCUyMjElMjIlMjBhcyUzRCUyMmdlb21ldHJ5JTIyJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDQXJyYXklMjBhcyUzRCUyMnBvaW50cyUyMiUzRSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUzQ214UG9pbnQlMjB4JTNEJTIyMjY0JTIyJTIweSUzRCUyMjExNSUyMiUyMCUyRiUzRSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUzQyUyRkFycmF5JTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTJGbXhHZW9tZXRyeSUzRSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUzQyUyRm14Q2VsbCUzRSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUzQ214Q2VsbCUyMGlkJTNEJTIyUWk0dWZiX3BXUjNGdDdxQ2puOE8tMjElMjIlMjB2YWx1ZSUzRCUyMlJlcXVlc3QlMjBwcmljZSUyMG9mJTIwYm90aCUyMGFzc2V0cyUyMiUyMHN0eWxlJTNEJTIydGV4dCUzQmh0bWwlM0QxJTNCYWxpZ24lM0RjZW50ZXIlM0J2ZXJ0aWNhbEFsaWduJTNEbWlkZGxlJTNCd2hpdGVTcGFjZSUzRHdyYXAlM0Jyb3VuZGVkJTNEMCUzQiUyMiUyMHZlcnRleCUzRCUyMjElMjIlMjBwYXJlbnQlM0QlMjIxJTIyJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDbXhHZW9tZXRyeSUyMHglM0QlMjIyNzUlMjIlMjB5JTNEJTIyMTQwJTIyJTIwd2lkdGglM0QlMjIxNTAlMjIlMjBoZWlnaHQlM0QlMjIzMCUyMiUyMGFzJTNEJTIyZ2VvbWV0cnklMjIlMjAlMkYlM0UlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlM0MlMkZteENlbGwlM0UlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlM0NteENlbGwlMjBpZCUzRCUyMlFpNHVmYl9wV1IzRnQ3cUNqbjhPLTI1JTIyJTIwc3R5bGUlM0QlMjJlZGdlU3R5bGUlM0RvcnRob2dvbmFsRWRnZVN0eWxlJTNCcm91bmRlZCUzRDAlM0JvcnRob2dvbmFsTG9vcCUzRDElM0JqZXR0eVNpemUlM0RhdXRvJTNCaHRtbCUzRDElM0JleGl0WCUzRDAuNSUzQmV4aXRZJTNEMCUzQmV4aXREeCUzRDAlM0JleGl0RHklM0QwJTNCZW50cnlYJTNEMSUzQmVudHJ5WSUzRDAuMjUlM0JlbnRyeUR4JTNEMCUzQmVudHJ5RHklM0QwJTNCJTIyJTIwZWRnZSUzRCUyMjElMjIlMjBwYXJlbnQlM0QlMjIxJTIyJTIwc291cmNlJTNEJTIyUWk0dWZiX3BXUjNGdDdxQ2puOE8tMjIlMjIlMjB0YXJnZXQlM0QlMjJRaTR1ZmJfcFdSM0Z0N3FDam44Ty02JTIyJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDbXhHZW9tZXRyeSUyMHJlbGF0aXZlJTNEJTIyMSUyMiUyMGFzJTNEJTIyZ2VvbWV0cnklMjIlMjAlMkYlM0UlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlM0MlMkZteENlbGwlM0UlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlM0NteENlbGwlMjBpZCUzRCUyMlFpNHVmYl9wV1IzRnQ3cUNqbjhPLTIyJTIyJTIwdmFsdWUlM0QlMjJWYWx1ZSUyMG9mJTI2bHQlM0JiciUyNmd0JTNCUXVvdGVDdXJyZW5jeSUyNmx0JTNCZGl2JTI2Z3QlM0JpbiUyMHRlcm1zJTIwb2YlMjZsdCUzQiUyRmRpdiUyNmd0JTNCJTI2bHQlM0JkaXYlMjZndCUzQlBhaXJlZEN1cnJlbmN5JTI2bHQlM0IlMkZkaXYlMjZndCUzQiUyMiUyMHN0eWxlJTNEJTIyc2hhcGUlM0RoZXhhZ29uJTNCcGVyaW1ldGVyJTNEaGV4YWdvblBlcmltZXRlcjIlM0J3aGl0ZVNwYWNlJTNEd3JhcCUzQmh0bWwlM0QxJTNCZml4ZWRTaXplJTNEMSUzQiUyMiUyMHZlcnRleCUzRCUyMjElMjIlMjBwYXJlbnQlM0QlMjIxJTIyJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDbXhHZW9tZXRyeSUyMHglM0QlMjI1OTAlMjIlMjB5JTNEJTIyMjgwJTIyJTIwd2lkdGglM0QlMjIyMDAlMjIlMjBoZWlnaHQlM0QlMjI5MCUyMiUyMGFzJTNEJTIyZ2VvbWV0cnklMjIlMjAlMkYlM0UlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlM0MlMkZteENlbGwlM0UlMEElMjAlMjAlMjAlMjAlMjAlMjAlM0MlMkZyb290JTNFJTBBJTIwJTIwJTIwJTIwJTNDJTJGbXhHcmFwaE1vZGVsJTNFJTBBJTIwJTIwJTNDJTJGZGlhZ3JhbSUzRSUwQSUzQyUyRm14ZmlsZSUzRSUwQU/CwYYAAAOhSURBVHicjZUhq/M8FMczMbhQKIVSSimDQigEIgoRE4WIiIhARUwhoqJioqKiYmLiiomJiYqJiYmKioqZuWsmrtiXuPL5IjMv63nfMe7ds/v+REjDaf7nJOecoPglURQppeI4Vko1TaO1ruu6qqogCIqiEEIwxuYjSZJgjH/ugJ6ufhMgI0VRaK2rqlosFmEYtm27XC6llFmWKaWMMU81kBAiz3Ot9X38NmmaZhiGvu83m816vd5ut3VdM8aMMbPZLBoJw1BKmabpEwGtNeccYkyShI5A1IwxiGC5XGZZZowBZ6WUURRprb8F+lwgy7KyLE+n0zAMXdd9fHx0Xff+/t73/Wq1CsMwy7LTyDAMh8PhdDrtdrs0Tcuy/F8CeZ4TQuI4xhjXdX0+n7fb7d0OY8wYUw/AoWutpZR3s18Evl3ONyOMcRRFMD7yaPbLEUEELyB/4VcBQghar9dCiCiKXghEUTQbCcMQ5hDEawFCSBRFqCgKxljydyilkAhFUVRVdZ8rpSilYEMIyfNcSnlfYYzFcVyWJUrT1HGc8Af+yGw28zyvbdvr9Xo4HL6+vk6n0+Vy+fPnz3q9tm3b933P81zXhR1d1/VGgiCYTCZt26KmacAp/UBRFFBoxhit9T1/lFJaa6gSIURRFMYYiKaqqrIs8zwvRvI8j+P48/PzVmjz+RwhZFnW238ghNgIQujt7W06nU5GEEKcc8gozrnv+2iEc66USpLE8zz4RQjhOM7hcEDGmDRNEUJJkoAvUkqEENS2bdvg1GKxYIxZlgUClFL4y7KsJEmaplmtVsYYpZTjOAghyOOu6251MJ/Pfd+3bduyLBh930/TVAjhuu50BCLzPE8pBe5jjBFCk8mEc26MKcsSChAEHMehlP4rgDGWI4/lSgiRUvq+7ziOPeI4ThAESimMMSFECAERCCGqqqrrGg7Atm2EEOToTeCxKT4SxzFjzLZtpRS4Rim1bZtzDuXNOaeUYozhnoUQWuvFYsE5hw7mum7f97cIoih6Wsycc8uyPM+DxHVd17IsKeXdADouVDW0YUJIkiRwf78IYIzn83mappBOMIHGDlV671F3exgBQojneTcBYwx8v2g1lNLz+Xw8HjebTd/3x+Ox67rL5bJarSCjfv6bJInv+8Mw3F40OITgB3AyQRBgjPf7/XK53I60bbvb7eBpg6L9yWw2m06nu90Onc9neAhfAzvuRg4j+/0eFp/Stm1d19fr9R+KyO/rnqcFnQAAAABJRU5ErkJggg==" nextheight="391" nextwidth="571" class="image-node embed"><figcaption htmlattributes="[object Object]" class="">Obtaining price quotes from XeonPriceOracle contract.</figcaption></figure><p>For large and well-known pairs, our oracle queries ChainLink's onchain price feeds, providing a quick reference for well-known, highly liquid pairs. This is important for assets that have a substantial amount of liquidity in exchanges.</p><p>All other pair data can be found through their onchain LPs, where our oracle searches first to find the most liquid pool between any two tokens across v2 and all v3 fee-tiers, and then returns both price data and the value of one token in terms of any other token.</p><p>This will allow Xeon users to more accurately price tokens in OTC deals, and provide a robust oracle for any other protocol that needs onchain access to price data.</p><div class="relative header-and-anchor"><h2 id="h-in-conclusion">In Conclusion</h2></div><p>I'm extremely bullish on DeFi, especially in the Ethereum and L2 ecosystem. The promise of Ethereum as a decentralized and permissionless network for the world is as powerful a narrative as ever.</p><p>Regardless of the current sentiment, we need to innovate while still addressing current concerns in the space to make DeFi more accessible to everyone. The only way forward is to listen to constructive criticism from people with skin in the game, use that feedback to improve, and keep building!</p><p>No matter who enters the DeFi space, or what type of assets everyone is talking about, Xeon is going to be there with solutions for both retail and institutional investors to plug any type of token they want into DeFi.</p><p>We appreciate the support from the community and encourage users to try our products. We're in the final month of testnet, so your feedback on our <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://app.xeon-protocol.io">app</a> and <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/xeon-protocol/xeon-dapp">codebase</a> is very likely to make a difference in what we're building as we pave the road to mainnet deployment on Ethereum and beyond.</p><p>Cheers,</p><p>Jon</p>]]></content:encoded>
            <author>jonbray@newsletter.paragraph.com (Jon Bray)</author>
            <enclosure url="https://storage.googleapis.com/papyrus_images/6864eb55af16b7c28fcc2ebd83635084.jpg" length="0" type="image/jpg"/>
        </item>
        <item>
            <title><![CDATA[On the Tokenomics of Xeon Protocol]]></title>
            <link>https://paragraph.com/@jonbray/xeon-tokenomics</link>
            <guid>EOgJfBVvRINI33hvwF2o</guid>
            <pubDate>Wed, 26 Jun 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[XEON is the utility token behind Xeon Protocol. Learn about the tokenomics and distribution.]]></description>
            <content:encoded><![CDATA[<div class="relative header-and-anchor"><h2 id="h-introduction"><strong>Introduction</strong></h2></div><p>The crypto space is rapidly evolving, and for most of the cycle so far, decentralized finance (DeFi) has taken a backseat to memecoins and other non-utility projects. Projects like these that generally feature fly-by-night devs require different trust assumptions than more robust projects building in the space, many of which are manifest in the tokenomics.</p><p>In the current market, certain things have become synonymous with a "safe" project such as burning the liquidity pool (LP), renouncing the contract, and teams holding a negligible portion of tokens. The reality is much more complicated. While these things may be fine for memecoins, for a project like Xeon Protocol that is building long-term utility, these things simply do not work.</p><p>Since many new entrants to the space have only been exposed to non-utility tokens, this post will serve not only to breakdown the Xeon Protocol tokenomics and vesting schedule, but to educate people on why we've made these decisions. It is our duty as a DeFi project focused on risk-management to be upfront and transparent so all stakeholders can make informed decisions.</p><div class="relative header-and-anchor"><h2 id="h-xeon-tokenomics"><strong>XEON Tokenomics</strong></h2></div><p>As a protocol utility token, XEON plays an important role in the <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://xeon-protocol.io/ecosystem">Xeon ecosystem</a>. It will initially be used to bootstrap our incentivized testnet, and will be utilized in our advanced staking pools that help secure the protocol and distribute yield to participants. These protocol-level requirements played an important role in our distribution of tokens, specifically our linear vesting schedule which was designed to complete prior to the mainnet launch of Xeon Staking so that tokens could be used for their ultimate purpose: being put to work inside the protocol!</p><div class="relative header-and-anchor"><h3 id="h-initial-distribution">Initial Distribution</h3></div><p>The XEON token generation event (TGE) took place on June 24th, 2024 at <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://etherscan.io/tx/0x6b63efc4a66518e6f65099cb2f8fcd6c6dfcd7a1c34022bdf9ca43f6989199f1">block 20161704</a> on the Ethereum network. The full supply of XEON tokens was minted with a total supply of <strong>100 million </strong>and 5 ETH was supplied to the LP . The token was launched through our incubator—<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://proofplatform.io/">PROOF Platform</a>, which is the reason certain functions like whitelist are present in the contract.</p><p>The supply of XEON was initially distributed as follows:</p><ul><li><p><strong>Liquidity: </strong>70% (70m tokens) locked in a <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.team.finance/">Team Finance</a> token locker for 60 days by PROOF Platform.</p></li><li><p><strong>Ecosystem Growth: </strong>18.5% (18.5m tokens) vested linearly for 60 days through <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://app.sablier.com/">Sablier</a> to a <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://ecosystem.xeon-protocol.eth">2/3 multi-sig wallet</a> controlled by core team members.</p></li><li><p><strong>Team Tokens: </strong>5% (5m tokens) vested linearly for 60 days through Sablier in individual streams to core team members.</p></li><li><p><strong>Marketing: </strong>5.5% (5m tokens) with 3m tokens paid to our marketing manager, 2.5m to KOLs. Of the KOL allocation, 0.2m was paid upfront, and 0.3m tokens vested linearly for 60 days through Sablier.</p></li><li><p><strong>Incubator Fees: </strong>1% (1m tokens) paid out to PROOF Platform.</p></li></ul><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/bc1c3c92563ff30105ab24c17b365231.png" blurdataurl="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAASCAIAAAC1qksFAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFjElEQVR4nG2VfWgbZRzHb21yudzlnnvunrvn3pO73F3TJE2bNotp2jRt17RZ13ZpN1fdLMvsdBadOjcV33UylM0/dCiCDhEV2f4pVZENX8ApjsGYQ0Fh6kDFN5gMXxD8Q/AkidbXLz+efw5+H77P/X7fhzCZXitcdOhhl1rnUWNueNwNr3PoshXpN9msxiZULo6BGVwDAm1MW1sbQRBtTQUCAQAAhLB1/kurnwiT6bPpokOPuNSYR1VdquqFK2542GaKUa5PZzs1EJ+qzm2bv2py/fTk5NT09EylMj4zPVMqlRBCq93Bn/ovIGsxLQdjLjXhhced0IhFDphkXgt2qeEOTJrZZP9Uda5cGhos5dZVBrN9mfJIqVDolyTMsuxqawD+wqzCCBP0WJF8nB506GEnPBoPD/fgDQNOrehuGEhUHaXPQB7mtDUEwRAG1T4KAuNRLgvbVaKNYADJQ/5/L2dVhMGmTCYbixRsZsBhSjGq2O/URnsuzztjazvWZeL9ruUlnFxcfUEjf5BDv6TbztaN5+b1I6PKjQbyGEDC/zD+AdDYDoNNm2yvEe41Qn0G1WeDfJTLqqEOhXIkUpUCPUz7Zybtm7SPgpfSa967Tj5ex6/skJcvV59wUJ4FLIISDxEPRQhRk/cXklBZW4t4GuV2xQZLmcl8ouJIWROmoqhT510dmVuWR8pXfmDSvkT+BAJf9bR/eIvw/hJ/ehGdqMsrc9rjupCAQECcjDiZ5zDPYQFiHop8E0YoMKoCSwnFbJyKKz0a16Fxnso5OoqLhFHaad/vT+7wy8WlF1HwEtl2Ptf+0T3o4h5wYTc8uyid2K4tDylLPCthYIhAQ5yGOKUFE2CDREicLgFDhbGMt7Yv2Z/x8iqwVBjTxCgk9MqbIwv++Ga/vMUfth56mCDO5AKfHFT9O9D3e8GnS/zpHcrLDRNcAoOoAmIKiCowijlD4vQWhkBQFjgF86oXT6lyo68s6oqgY0EzFeOlo3e8eurgI6/fuufkzm0XxtKHFwbhqUd1/z78623w6+vBuavx8Xn1GY8fUsKWGvHUiKOELYkycSSGgYE5jRAghkDEkpZOZhGUEZRlSVOwLgmaY0b9Jzf6x9b7R7r8wyl/b/XNxbsPej8e0vz98m+38d/uBud2Kie2mc9lxPUGl7Jgt8Gl01Z/rnNIA57C2AqIEq2fjpCYTKZt27GitoSwICAkYIbBF4/W/LeuOPfAzc9MHN2vf75f9Q9p/gHVv1f6ZR/84np05lrr+BXmkRRfsbl8nCtYXC4hF3LuiAlTLUNEa5gQQt3d3a7rxONxRVEwxoqsQyhuLtdu6H1hU+DkTvr8Xu7LO4Xv7hJ/vkv86Xb+m5siH+4S3qoryxuUA1a4aNMDVrgYCxdMaq1B9phM1mDTGpNoOgAChJD+Uy1iY+AgkgKJmvjEorp8HX5jNzy7hz2/B1y4BXx8I/vBEv9OHa9sM57Pc9vt8JDTiMgRhy7H6SGLKcbotSbTa9BpgoEkwxPNEPn7AjYAzZnDXeL4VuPZuryyKJ3YJZ7cxb+7JLx9jfRaHa8s6C+OotsbCUZVmzXRCLQmyaYHY5FClOklLCFthGYEiCUJCcIf6dhYS04WOU0BUSlidvGTs+pjC+rRura8Q1mpqysL6rF59elhYV8HOZkkpztDMwlyJkFOecGqFxx3yFE7VI5RxSidJ7aIjz8V9XPJscrESLIzybJsA8A1NrMFUIGn0q4NLivw9Qq+e1J+sIofGBb29dBbO4IbOslaKljrJJtF1bJwUy8/2y1s7EZTGXHcAYOEzGYK0hyC0t8ji4cIQVkEOgYxNeLqbJfBZE06Z1HFxrsUmnCD1Q5yOhWcTQbnUsHZRgVmM6G5QaM+oC0UlPm8vilv1jww9DuewkFYZvX0qwAAAABJRU5ErkJggg==" nextheight="405" nextwidth="720" class="image-node embed"><figcaption htmlattributes="[object Object]" class="hide-figcaption"></figcaption></figure><div class="relative header-and-anchor"><h2 id="h-contract-ownership">Contract Ownership</h2></div><p>Both the XEON token and all Xeon operations (token administrative functions, protocol contracts, and treasury management) are owned and controlled by a Safe multi-sig wallet which is managed by the three core team members. All transactions must be approved by 2/3 of the team, which ensures that no single person can alter any part of the token or protocol, either accidentally or maliciously.</p><p>We have taken great care to ensure that our wallet security is impeccable. The three wallets that control the Safe account are all managed securely to ensure that access to our multi-sig cannot be compromised. Each one belongs to an individual team member and private keys are securely stored in hardware wallets or accessed through sandboxed environments. These wallets are strictly for Xeon Protocol management and are only connected to dApps that fall within company procedures (ex: <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://app.safe.global">Safe</a>, <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://app.sablier.com/">Sablier</a>, or <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://app.ens.domains">ENS</a>).</p><p>Even in the unlikely event that a single team member's wallet is compromised, requiring 2-of-3 signatures allows us to quickly replace the affected wallet without compromising the security of the entire protocol. At the time of writing we are exploring procedures for <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://help.safe.global/en/articles/110656-account-recovery-with-safe-recoveryhub">Self Custodial Recovery</a> to safeguard against a worst-case scenario.</p><div data-type="callout" type="info"><div class="callout-base callout-info" data-node-view-wrapper="" style="white-space:normal"><img src="https://paragraph.xyz/editor/callout/information-icon.png" class="callout-button"><div class="callout-content"><div><p>Using a multi-sig wallet prevents a single point-of-failure and ensures the entire team has a say in all onchain transactions.</p></div></div></div></div><div class="relative header-and-anchor"><h3 id="h-contract-functions">Contract Functions</h3></div><p>The XEON token has a number of administrative functions that require active management and make it so we cannot simply renounce the contract:</p><ul><li><p><strong>Tax Revenue: </strong>Xeon Protocol is funded by a 5% tax on both buys and sells through LP. This is standard for the industry and allows us to continuously fund protocol growth without requiring us to dump our XEON holdings. Revenue is dispersed through a <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://app.splits.org/accounts/0x5dCD43eFaab6963A5b382ceBC7759DF3055d2a4B/?chainId=1">Splits contract</a> where it's divided between ecosystem and marketing.</p></li><li><p><strong>Max Transaction Amount: </strong>In order to prevent large sums of tokens from being moved at once we have a limit on the amount of tokens that can be included in a single transaction which is currently set to 500k XEON (0.5% of the total supply).</p></li><li><p><strong>Max Wallet Amount: </strong>To prevent whale activity in the early growth stage of XEON, there is also a limit on the amount of tokens a single wallet can hold, which is currently set to 1m XEON (1% of the supply).</p></li></ul><p>Certain addresses that are necessary for protocol operation are excluded, including protocol multi-sig wallets, our <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://etherscan.io/address/0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D">Uniswap Pool</a>, <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://etherscan.io/address/0xE2fE530C047f2d85298b07D9333C05737f1435fB">LP Lock</a>, and <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://etherscan.io/address/0x7CC7e125d83A581ff438608490Cc0f7bDff79127">vesting contract</a>. None of the token administrative functions have or will ever be used to give anyone an unfair advantage. Even as the CTO of Xeon Protocol, I pay the tax and am restricted by the transaction limit like everyone else.</p><div data-type="callout" type="info"><div class="callout-base callout-info" data-node-view-wrapper="" style="white-space:normal"><img src="https://paragraph.xyz/editor/callout/information-icon.png" class="callout-button"><div class="callout-content"><div><p>By retaining ownership of the XEON token contract we can adjust parameters as needed to best fit the needs of the protocol and community.</p></div></div></div></div><div class="relative header-and-anchor"><h3 id="h-liquidity">Liquidity</h3></div><p>When we launched XEON, our LP was <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://etherscan.io/tx/0x47e5395f65bfbdbd92dcf425d2df76149c9670ed9e111155afd26dd0bb53cd09">locked</a> for 60-days, a timeframe that was part of our launch through PROOF Platform. After the lock period finishes, the LP will be released to our team multi-sig wallet, at which point we will determine the most secure way to protect our LP in a manner that still allows it to create the most value for all stakeholders. When that time comes we will keep the community informed on our decision-making process and reasoning.</p><blockquote><p>"Dev, why isn't the LP burned?"</p></blockquote><p>This is a question that comes up a lot. At some point in the last year, with the rise of memecoins, <em>burning</em> the LP (sending the token or ownership to the zero address) became synonymous with "safe" but the reality is much more complicated.</p><p>There are many ways to secure liquidity without burning it, and new advances in LP management are coming out all the time. Our LP is not burned as this removes any possibility that the supplied tokens and ETH can be used in potentially innovative ways in the future. Burning renders all the value in that LP useless for anything aside from swapping between two specific tokens.</p><p>Soon we will see new types of primitives in the LP space (like v4 hooks and yield instruments) which will require liquidity controlled by new contracts. Projects who currently have their LP burned will be unable to fully utilize these things.</p><p>We have positioned Xeon to always be at the cutting edge of new developments in the DeFi space, and we will communicate any decisions regarding potential future liquidity updates with the community. In the meantime, we will continue to utilize best-practices and established, audited contracts to secure our LP.</p><div data-type="callout" type="info"><div class="callout-base callout-info" data-node-view-wrapper="" style="white-space:normal"><img src="https://paragraph.xyz/editor/callout/information-icon.png" class="callout-button"><div class="callout-content"><div><p>Burning the LP prevents us from taking advantage of future advances in liquidity management and makes it so we cannot adjust important functions to adapt to changing market conditions.</p></div></div></div></div><div class="relative header-and-anchor"><h3 id="h-vesting">Vesting</h3></div><p>Out of the 100m supply of XEON tokens, 23.8% (23.8m) are currently vesting over a 60-day period through a linear stream on <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://app.sablier.com/?t=search&amp;c=1&amp;a=0x8d65a2eabde4b31cbd7e43f27e47559d1ccec86c">Sablier</a>. The following tokens are currently vesting:</p><ul><li><p>18.5m tokens to Xeon ecosystem wallet</p></li><li><p>5m to individual core team member wallets</p></li><li><p>300k to pre-launch marketing partner's wallet</p></li></ul><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/22b43b956a310ea238c6ea501d598617.png" blurdataurl="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAPCAIAAAAK4lpAAAAACXBIWXMAABnWAAAZ1gEY0crtAAAFJklEQVR4nF2Uf0zSeRjHv3SN4M6EMfsOJYXyS8mXPPwFnn7BQgOREgICFUnU/IopmIKGUuqhpSlNSdTiKPVS1x30wzPOi1xZLbPadP20rrTt2tU/utut7f7odhs3/O682/35vPfsed6v53k+H6Dn7J1nS8E+z0yl2W3vuvZ0MTh1d6XLNVXbMFzTMGw0exyum/Mvg20Of80/yvmRuaUPQe+1RZPlHCZOTL3/ZTk4/zLY5Zoymj19ntlnS8GRSy+MZg+AVjmtLWNolbOw+ARa5axtGKqsPaMpatuX16RHHXrUYTS7axuGlPnN+frjmKIvP/V1+2W0yqnMb17LsbaMWVvG9OWnlAUth62eNseE0ezWow4gVVDQe2bSZh9Uao5EMzMcp8dHvY++H3886n20FRbh8FBcfE6fO3DB+5AGCQgkVjjIKSg+Njg60+cOaIubCSQWkQzn6Y/2Dkw4nL562wCysxCkI3GJuUIJSqFxgQSeYmj0doWpk0BiRW1BWk+O9rsnu09f6R2YiIWziBHxAEBpaDzb0e2lRKWEgxwCiVVd5+zs8R3v/E6ta8BacngqqbxSJDWIpAaILQbpaVthUVxiLiUqBYCTZDK1Raa2qHU2KgPRFjeXVnQYLS6jxUVlIEQyDCfJUJOj4nA3FoatljNaXAcPnYSTZJiSKihQaSy5imqh+GDMNiFIR2LZEnaSPESQLjwQmF6stw0QI+KjmRmdPb5x/5OznsDw2F2ILV4lCD/RPjLinaUy0jGCY/bBi5ce9rsnSyuOYyMqqWgfHrvb755sah1KFx4A6cgOnnJndlmoAcSWqLRWudoilJRTGchexWGV1ipTW1RaK2YZYkvWwjCQEwZyElP3F5baZWpLYur+NabsPRUiqSFVUBDNzKDQuDHbhBBbEmqwO6fs6cIfpwf8VEZ6NDPj27F7D+ZXXrz5ZLMPEkgsEjUBADZdHX88PfMrGPMVRtDZ43s0v3Jr5l1Nvetfggu3z3xzvaPrIj+ziAYJkvn52bIqkJ4GbGbuQjKLElP3CyVozDYhklkklKCrXgopNC6RDEczM4QSVJBVQopMxgggtkQoQflZeogtIZLh0CYBBgCAAADi8FA4yCFFJlNoXAqNS4pMBiSyQ3PPP3Z0e1VaawJPcdX//Oelv+7PLS8sfoLY4pDBsO3+yYWVj8HdOWUEEotAYjW1Ds09//3+3LKprpdAYq3fuL29+/KH5eCrpT99P8xJ5ZWbmbvShHqVtjFEQGUg2bIqpaYOAOgUGlckNezZZxJJDUpNHZWR/vmmL8NADj9LL1dbtsIijCBVUIDlJPAUmEKhcakMhMpAMOP/DYFd2aX+G6/PjdwJBzlbWJn97uv+G69v33/f3n2ZEpXyRcSOCBrXe2XeH3i1dkU19a7A9FvfxBPsitaHxzV8ff7ZwseZB+8v+mb/TwCxxbqSJmRnYWiaqwQKjTlP1wgn7iWSYXJovpvFUlQqr8TMEsmwSGrQFB5RaMw8vmZNXLeBuW4DEzsqCo0L0tMwFEAkNVz96aWprheHhyC2uM89FZh+e/Peu8lbSxBbjMNDO5JyfRNPZud/S+ApsHdbXN7249SbwPRbXWlLaEkR8XK15Zh9sN420NQ6tDunDKQjyfx8oaQ8RBALZx21n1NozDg8RIlK0ZUcra5zVpg6620DlKgUAokFAJ/JFKbWk6OxcBYOD+HwUL7OWl3nLDG0iqUoDg+t37idy8/P0zWqNBapvDKamUGKTN7CEmNfxd8DXPusCdxYIAAAAABJRU5ErkJggg==" nextheight="1039" nextwidth="2226" class="image-node embed"><figcaption htmlattributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>Sablier is a respected name in DeFi with a track record that dates back to 2019, much longer than most token management solutions currently being used. They have processed over $1.5b USD in volume, are trusted by many DAOs and onchain organizations, and their contracts are fully audited by six leading security firms. Sablier is completely permissionless, they do not use upgradeable proxies for their vesting streams, and their team has zero ability to interfere with the token locks or vesting schedules.</p><p>As a DeFi protocol focused on risk-management, Sablier was the obvious choice for distributing our tokens.</p><blockquote><p>"Dev, why vest and not lock?"</p></blockquote><p>To begin with, vesting prevents a large amount of tokens from becoming immediately liquid since the tokens are streamed in real-time to the recipients. For our ecosystem token allocation, this allows us to have access to a steady stream of XEON that can be used to reward participants in our incentivized testnet campaign which is starting soon.</p><p>Secondly, vesting can help assuage investor concern over market dumping or price volatility that usually accompanies a large portion of tokens unlocking at once. If, as an investor, you are concerned about a paper-handed team, insuring that no one receives a lump sum of tokens that could potentially be dumped on the market is preferable.</p><blockquote><p>"Dev, why 60-days?"</p></blockquote><p>The vesting schedule is heavily influenced by our roadmap and the release of our testnet campaign and Xeon Staking pools. By having team tokens unlock slowly over the next 60 days, we as the core team can utilize our tokens in protocol staking as soon as it is released. As stated before, XEON is a utility token who's ultimate purpose is to be put to work within the protocol. We are extremely proud of what we are building, and having our tokens ready for the launch of staking means we get to bet on the protocol long-term from the start.</p><div data-type="callout" type="info"><div class="callout-base callout-info" data-node-view-wrapper="" style="white-space:normal"><img src="https://paragraph.xyz/editor/callout/information-icon.png" class="callout-button"><div class="callout-content"><div><p>XEON is meant to be staked and put to work inside of the protocol!</p></div></div></div></div><div class="relative header-and-anchor"><h3 id="h-organization-and-transparency">Organization &amp; Transparency</h3></div><p>Xeon Protocol is all about risk-management, and that extends beyond our protocol services to the way we do everything. Because of the trust assumptions that investors have to place on us, our team is fully KYC'd through <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://assuredefi.com/projects/xeon-protocol/">Assure DeFi</a>. We are active members of our community and people know how to reach us. We believe the best way to build is to build in public, both so the community is up-to-date with development progress and to hold ourselves accountable to the high standard we set for Xeon Protocol.</p><blockquote><p>I've personally been involved with the crypto community since 2014 and know that the most valuable asset in this space is your reputation. That's why I want every part of the Xeon stack to be as open and transparent as possible.</p></blockquote><p>We have our entire organization tree onchain through <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://app.hatsprotocol.xyz/trees/10/101">Hats Protocol</a> which includes our team, pointers to all deployed contracts and wallets, and allows us to set up secure, programmable roles for things like publishing code or casting on behalf of Xeon Protocol on <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://warpcast.com/xeonprotocol">Farcaster</a>.</p><p>By using onchain management for credentials, we can eliminate certain risks to the community like our social media account being compromised.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/89e56ad45b7f50dd4e5e4b7771dfe63b.png" blurdataurl="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAPCAIAAAAK4lpAAAAACXBIWXMAAAsTAAALEwEAmpwYAAAD6ElEQVR4nH1US2gdVRg+0OJCaRVcCCK4dCFuxZ2LqCC4VEsWoVopphifBQul0IWuFJW+RBqx1VBSYx8urBppY7y5eXhvrEkv95GZOWfOzJnzmjNzZubOfcWYVuZOk6a1Cmfx/+f88z++7/sHYBb810HUF7pVmP/j4UceffGlXRASCF3GFWbqf7664wCbKizC3HFYYFOFqJ+7kEg/7vw8VQAADDw7IJXyGA21dkVg06z81kROv6Hbs4eYKYCov/ngitDtF9tiaMzU+clLl4pThodI6lcJhJ4g2X2WdCMmz36XyQDXqdApVQmiAfR8SGReElEfkmwaSKTNAk8llissIg2HQ8+3iITerTAiNVUxkZErdF4v7zIr8PLg0H07dk5OTq2YmHHlMZXXgCQzIFGmw4N09bXhkZ0PPHj6m3EbU8oVFRmAiPqmw/24u//9gwCAr8fGscsZV1xpi8ibEzz3/AsAgEKh4PtBu9X2dYyIn8+ej4+on/T+3jU4BACYmDgfBjqJk1DH9gZPUWdt+I23AQBnz34bRUkcRXEzNR2RTwMqNfO34pwFcavdoUJCTP+Noyt0tYEKM/OGiZqtNhe+iZytAQ0TTxdmDRMlzZYKNHIZJDf5AK4IicyY3EBG3lWvVCVUxa7QkEjT4XlYDjoPm/2YoGYR0xGmw/MnLEJEfXBurHzk8JVSqbpi2h6VDlPQu01tkMgw/evVvfvu3XH/2JkJGzOtUyoCP+m+vu8tsO2er06dsaAr/bDZWXvvwCEAwBcnT1VrFuOK+RqMj85+MHwRNiDzXMUpZeIOOUMidXttcGj39m3gwoXvkjhKU02FCJLe7j17AQBHPjter1u9Xnf9xo2Rd/YDsP3E518ulpfCMAx1DK5V6vPFYrXyZ6yF5MiCqL8gWepsB1lmEBHVTePy1I+mVW11FBfIRKYrtAFxcW7BQk7ayvhDLm8gMruwUDesZqudkYEpwEzZLGs5B3eTVU9miGMWWERanjQcgVnYQJ5hM8PmZuYGWGhXRjBfjj4rTh/9nMv8BpwbWzx2+NdSqWq7rNtb85jiujU+cXHkzXeXK43lSiOKm2HSPXb8xJ5Xhq5MF2s1i/ths7366cmxhx574ofLRY/KZrvr6zhXTo6w0+8yk+n4aPHDke/rtUak1fX1nscYC9OfJn85dPDA0tWl0sLva6vtZrv70cefDDzzdKk0zzwv0qrT7R0dPf34k09Nz5Z6neb19Z7W2nD45hrf+lXUVoxSec6wriUpd4nRMA3MQhPCa8vlem2ZU5t5FsK4UluZmZlaXioziiRFFrRMaC+W52rVqw42JLURgtaG9rfq+x+Dp6sfeA0SrQAAAABJRU5ErkJggg==" nextheight="533" nextwidth="1102" class="image-node embed"><figcaption htmlattributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>To make it easier for the community to audit what we as the core team do, and to prevent phishing attempts on our community we are using <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://app.ens.domains">Ethereum Name Service</a> (ENS) to resolve all of our onchain addresses so users can be 100% sure they are interacting with official Xeon assets.</p><p><strong>Multi-Sig Addresses</strong></p><table style="minWidth: 50px"><colgroup><col><col></colgroup><tbody><tr><td colspan="1" rowspan="1"><p>Team + Ecosystem Wallet</p></td><td colspan="1" rowspan="1"><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://etherscan.io/address/ecosystem.xeon-protocol.eth">ecosystem.xeon-protocol.eth</a></p></td></tr><tr><td colspan="1" rowspan="1"><p>Marketing Wallet</p></td><td colspan="1" rowspan="1"><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://etherscan.io/address/marketing.xeon-protocol.eth">marketing.xeon-protocol.eth</a></p></td></tr></tbody></table><p><strong>Core Team (Multi-Sig Signers)</strong></p><table style="minWidth: 50px"><colgroup><col><col></colgroup><tbody><tr><td colspan="1" rowspan="1"><p>ByteZero (CEO + Co-Founder)</p></td><td colspan="1" rowspan="1"><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://etherscan.io/address/byte.xeon-protocol.eth">byte.xeon-protocol.eth</a></p></td></tr><tr><td colspan="1" rowspan="1"><p>Wellington (Dev Director + Co-Founder)</p></td><td colspan="1" rowspan="1"><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://etherscan.io/address/welly.xeon-protocol.eth">welly.xeon-protocol.eth</a></p></td></tr><tr><td colspan="1" rowspan="1"><p>Jon (CTO)</p></td><td colspan="1" rowspan="1"><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://etherscan.io/address/jon.xeon-protocol.eth">jon.xeon-protocol.eth</a></p></td></tr></tbody></table><p><strong>Deployed Contracts</strong></p><table style="minWidth: 50px"><colgroup><col><col></colgroup><tbody><tr><td colspan="1" rowspan="1"><p>XEON Token</p></td><td colspan="1" rowspan="1"><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://etherscan.io/address/token.xeon-protocol.eth">token.xeon-protocol.eth</a></p></td></tr></tbody></table><p>By having human-readable names for all of our onchain assets, community members can simply type any of our ENS into Etherscan and immediately find the associated contract. You can also verify our socials and contact info through our <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://app.ens.domains/xeon-protocol.eth">ENS profile</a>.</p><p>Using ENS also provides an extra layer of protection for us doing internal transactions, removing any uncertainty that comes with entering a hex address when we're moving funds or assigning admin roles.</p><div data-type="callout" type="info"><div class="callout-base callout-info" data-node-view-wrapper="" style="white-space:normal"><img src="https://paragraph.xyz/editor/callout/information-icon.png" class="callout-button"><div class="callout-content"><div><p>ENS can be used to verify contracts and addresses you're interacting with.</p></div></div></div></div><div class="relative header-and-anchor"><h3 id="h-community">Community</h3></div><p>We have such an incredible community that has formed around Xeon Protocol, and are excited to see it grow as we release innovative new DeFi products. Thank you all for your trust as we go on this journey, we would not be here without you.</p><p>As we get closer to our testnet and mainnet protocol launch, we will make a public Trello board available to the community so they can follow along with progress and give us feedback along the way. You can find an up-to-date list of all official Xeon links on our <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://linktr.ee/XeonProtocol">Linktree</a>.</p><p>We are looking forward to a bright future for Xeon and DeFi.</p><p>Jon<br>CTO - Xeon Protocol</p><hr><div data-type="customButton" href="https://app.uniswap.org/explore/tokens/ethereum/0x8d65a2eabde4b31cbd7e43f27e47559d1ccec86c?chain=mainnet" class="center-contents"><a class="email-subscribe-button" href="https://app.uniswap.org/explore/tokens/ethereum/0x8d65a2eabde4b31cbd7e43f27e47559d1ccec86c?chain=mainnet">Buy XEON on Uniswap</a></div><p><strong>Website: </strong><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://xeon-protocol.io/"><strong>https://xeon-protocol.io/</strong></a><br><strong>GitBook: </strong><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.xeon-protocol.io/documentation"><strong>https://docs.xeon-protocol.io/documentation</strong></a><br><strong>Warpcast: </strong><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://warpcast.com/xeonprotocol"><strong>https://warpcast.com/xeonprotocol</strong></a><br><strong>Twitter: </strong><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://x.com/XeonProtocol"><strong>https://x.com/XeonProtocol</strong></a><br><strong>Telegram: </strong><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://t.me/XeonProtocolPortal"><strong>https://t.me/XeonProtocolPortal</strong></a><br><strong>Medium: </strong><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://medium.com/@xeonprotocol"><strong>https://medium.com/@xeonprotocol</strong></a></p>]]></content:encoded>
            <author>jonbray@newsletter.paragraph.com (Jon Bray)</author>
            <category>defi</category>
            <category>xeon</category>
            <category>tokenomics</category>
            <category>cryptocurrency</category>
            <category>web3</category>
            <enclosure url="https://storage.googleapis.com/papyrus_images/d5741661b420892ad27c1bc67d98b6c7.jpg" length="0" type="image/jpg"/>
        </item>
        <item>
            <title><![CDATA[An Argument For Monetizing Social Graphs]]></title>
            <link>https://paragraph.com/@jonbray/monetizing-social-graphs</link>
            <guid>PRw19vP4VjSkZL40g1of</guid>
            <pubDate>Fri, 12 Apr 2024 17:10:11 GMT</pubDate>
            <description><![CDATA[My thoughts on the commodification of social graphs on platforms like Friend.Tech.]]></description>
            <content:encoded><![CDATA[<p>This is inspired by Joan Westenberg's essay, <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://paragraph.xyz/@idle/why-im-not-on-friendtech">"Why I'm Not on Friend.tech"</a>, an opinion piece where she presents a critical stance on commodified social platforms like Friend.Tech. I'd like to present an alternative perspective, one that highlights the possibilities this new era brings for creators. I am on Friend.Tech, but not an active user. I had to see what all the fuss was about though. Farcaster is much more my speed.<br><br>This is an exciting time to be a creator. For the first time we're able to truly own our social graphs, transport them across platforms, and monetize them without relinquishing control to corporations that would monetize them regardless.</p><p>It's self-custody all the way, baby.</p><p>Understandably, people have some concerns. Privacy, the potential for exploitation, and the ethics surrounding commodifying our social interactions to begin with. These concerns will always be present on any platform where you put yourself out there to the world and it's something that we need to vigilantly discuss and improve as we build new social platforms.</p><p>While I can understand the view that commodification of the social graph is a reduction of human value to market metrics, I think these platforms represent the logical extension of the value creators provide to their communities.<br><br>Friend.Tech—and any other market where shares of your time are traded—do not inherently devalue an individual's worth; rather, they offer a marketplace where demand for a creator's time can be quantified, and their intrinsic value can be reflected in that market. The value is initially provided by the creator, which in turn drives demand. To call it predatory takes agency away from the people who engage by choice. The fact is, if you aren't offering something of value, you shouldn't expect to monetize successfully. While not necessarily optimal, Friend.Tech provides one way to do this.</p><p>Arguing that putting a price on your social graph harms the creator-audience relationship overlooks the foundations of the pre-existing relationship. These platforms presuppose an existing market for a creator's time, built upon the relationship cultivated through other free-to-access platforms like Twitter or Farcaster. Emerging markets for our social graphs aren't distracting from these relationships. They are adding a new dimension.</p><p>Creators can monetize their time without taking anything away from the value of free interactions elsewhere. If a creator decided to exclusively interact on a monetized platform, it's then up to the audience to determine if they wish to follow.</p><p>The emergence of a market around individuals who brings significant value to the table is not just compelling and logical, it's fair. It's part meritocracy, and part free-market. Those who excel should rightfully be able to earn from their contributions. </p><p>You can argue that a transactional relationship between creators and their audiences is damaging, I think it's an oversimplification. Monetization platforms create a consensual market around a social graph, potentially benefiting all parties involved. New entrants can access time with creators, who in turn receive compensation, alongside speculative market participants who are trading shares of the graph like any other commodity.</p><p>That last part is a brand new phenomenon, and I can understand why traders arbitraging a person's time sits wrong with some people.</p><p>Is it morally right? I have no idea.</p><p>The fact that arbitrageurs exist in these markets has little bearing on the morality of the platform as a whole. It allows traders to speculate on the future value of the creator's graph while providing additional value to creators through trading fees. How the creator chooses to give this added value back to their audience, if at all, is up to the creator. The morality of this decision is up to the specific audience.</p><p>While this trading can raise entry costs for new demand, that only holds a mirror to the inherent risk-return present in any scenario. New entrants will always have to weigh the value that a creator is providing on a platform with the cost of entry. Everything has an opportunity cost.</p><p>Certainly I would have done things differently if I created Friend.Tech. Trading fees from key-sellers would be split amongst key-holders as well as the creator. Creators would have more control over the bonding curve and types of connections they offer. There are a lot of ways to improve the platform, but you have to start somewhere. This is a complex topic that we're only just beginning to discuss. It brings up issues of value, demand, and equity.</p><p>Some people will argue that you simply cannot put a price on human connection.</p><p>I say: the market is always right.</p>]]></content:encoded>
            <author>jonbray@newsletter.paragraph.com (Jon Bray)</author>
        </item>
    </channel>
</rss>