<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: crosschainer</title>
    <description>The latest articles on DEV Community by crosschainer (@crosschainer).</description>
    <link>https://dev.to/crosschainer</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2874791%2Fc03258e4-6ce6-47e1-8c91-6beacfce529d.png</url>
      <title>DEV Community: crosschainer</title>
      <link>https://dev.to/crosschainer</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/crosschainer"/>
    <language>en</language>
    <item>
      <title>Earn Up to 1M XIAN: Xian Blockchain’s Bounty Program is Live!</title>
      <dc:creator>crosschainer</dc:creator>
      <pubDate>Wed, 26 Feb 2025 18:17:15 +0000</pubDate>
      <link>https://dev.to/crosschainer/earn-up-to-1m-xian-xian-blockchains-bounty-program-is-live-390a</link>
      <guid>https://dev.to/crosschainer/earn-up-to-1m-xian-xian-blockchains-bounty-program-is-live-390a</guid>
      <description>&lt;p&gt;The &lt;strong&gt;Xian Bounty Program&lt;/strong&gt; is officially live! If you're a &lt;strong&gt;Python developer&lt;/strong&gt;, this is your chance to &lt;strong&gt;build essential blockchain infrastructure and get rewarded with up to 1M XIAN&lt;/strong&gt; for your contributions.  &lt;/p&gt;

&lt;p&gt;Unlike other blockchain bounties, &lt;strong&gt;Xian smart contracts are written in Python&lt;/strong&gt;, making it easier than ever to dive into Web3 development.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Matters
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;We’re funding &lt;strong&gt;key infrastructure&lt;/strong&gt; for Xian—&lt;strong&gt;lending, stablecoins, prediction markets, cross-chain bridging, and more&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Developers don’t just &lt;strong&gt;earn rewards&lt;/strong&gt;, they become &lt;strong&gt;major stakeholders&lt;/strong&gt; in Xian’s future.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  💰 Available Bounties
&lt;/h2&gt;

&lt;p&gt;Each bounty is &lt;strong&gt;paid upon successful deployment&lt;/strong&gt; of a fully functional, open-source project on Xian.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Category&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Max Bounty Reward&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cross-Chain Bridging&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1M XIAN&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Algorithmic Stablecoin&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;750K XIAN&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Prediction Markets&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;600K XIAN&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;RWA Tokenization&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;500K XIAN&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Lending/Borrowing Platform&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;400K XIAN&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;➡️ &lt;strong&gt;&lt;a href="https://docs.xian.org/bounty-program" rel="noopener noreferrer"&gt;Full details on the bounty program are in the official documentation.&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🛠️ How to Participate
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Create a GitHub repo&lt;/strong&gt; with your project.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Build &amp;amp; deploy your dApp on Xian&lt;/strong&gt; using Python smart contracts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Submit your repo &amp;amp; keep the community updated&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Earn XIAN with a 1-year linear vesting schedule&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  📢 Why Build on Xian?
&lt;/h2&gt;

&lt;p&gt;✅ &lt;strong&gt;Python-Native Smart Contracts&lt;/strong&gt; – No need for Solidity, just pure Python.&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Open Bounties for Real-World dApps&lt;/strong&gt; – Lending, stablecoins, cross-chain, and more.&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Earn &amp;amp; Scale&lt;/strong&gt; – Keep 70% of fees generated by your contracts.  &lt;/p&gt;

&lt;h2&gt;
  
  
  🚀 Get Started Now!
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Start building today and claim your bounty:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
🔗 &lt;a href="https://docs.xian.org/bounty-program" rel="noopener noreferrer"&gt;Full Bounty Program Details&lt;/a&gt;&lt;br&gt;&lt;br&gt;
💬 Join our community: &lt;a href="https://t.me/xian_network" rel="noopener noreferrer"&gt;Telegram&lt;/a&gt;  &lt;/p&gt;

</description>
      <category>blockchain</category>
      <category>python</category>
      <category>programming</category>
      <category>web3</category>
    </item>
    <item>
      <title>Evaluating ChatGPT-4o's Performance in Creating Python Smart Contracts for Xian Blockchain</title>
      <dc:creator>crosschainer</dc:creator>
      <pubDate>Fri, 21 Feb 2025 12:30:18 +0000</pubDate>
      <link>https://dev.to/crosschainer/evaluating-chatgpt-4os-performance-in-creating-python-smart-contracts-for-xian-blockchain-1eck</link>
      <guid>https://dev.to/crosschainer/evaluating-chatgpt-4os-performance-in-creating-python-smart-contracts-for-xian-blockchain-1eck</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;The intersection of artificial intelligence and blockchain technology is creating exciting opportunities for developers. With the introduction of &lt;strong&gt;ChatGPT-4o&lt;/strong&gt;, AI-driven coding assistance has reached new levels of sophistication. But how well does this cutting-edge AI perform when tasked with building &lt;strong&gt;Python smart contracts&lt;/strong&gt; for an innovative blockchain like &lt;strong&gt;Xian&lt;/strong&gt;?&lt;/p&gt;

&lt;p&gt;This article explores how effectively ChatGPT-4o can generate, debug, and optimize Python smart contracts on the &lt;a href="https://xian.org" rel="noopener noreferrer"&gt;Xian Blockchain&lt;/a&gt;. We’ll dive into the AI's strengths, areas for improvement, and provide real-world examples of contracts generated by ChatGPT-4o.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Methodology: How We Tested ChatGPT-4o
&lt;/h2&gt;

&lt;p&gt;To assess ChatGPT-4o’s effectiveness in creating Xian smart contracts, we conducted a series of tests:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Basic Smart Contract Creation:&lt;/strong&gt; Generating a simple contract with basic functionality.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Advanced Contract Logic:&lt;/strong&gt; Writing contracts with more complex logic, such as staking or voting mechanisms.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Error Detection and Debugging:&lt;/strong&gt; Testing ChatGPT-4o’s ability to identify and fix errors.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Optimization and Best Practices:&lt;/strong&gt; Evaluating how well the AI adheres to security and efficiency best practices specific to Xian.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  2. Basic Contract Creation: A First Look
&lt;/h2&gt;

&lt;p&gt;We began by asking ChatGPT-4o to write a simple greeting contract:&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Prompt:&lt;/strong&gt;
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Write a basic Xian Blockchain smart contract in Python that returns a personalized greeting."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Generated Code:&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nd"&gt;@export&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;greet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Hello, &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;! Welcome to Xian Blockchain.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;Result:&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;Correct Syntax:&lt;/strong&gt; The AI correctly used Xian’s &lt;code&gt;@export&lt;/code&gt; decorator.&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Accurate Functionality:&lt;/strong&gt; The contract worked as intended, returning a personalized greeting.&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Efficient Code:&lt;/strong&gt; The logic was concise and clear.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; ChatGPT-4o handled this basic task flawlessly, demonstrating its ability to generate simple contracts quickly and accurately.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Advanced Logic: Creating a Staking Contract
&lt;/h2&gt;

&lt;p&gt;Next, we challenged ChatGPT-4o to create a more complex &lt;strong&gt;staking contract&lt;/strong&gt;:&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Prompt:&lt;/strong&gt;
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Write a Python staking smart contract for Xian Blockchain that lets users deposit tokens and earn rewards."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Generated Code:&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;staked_balances&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Hash&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;default_value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;stake_timestamps&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Hash&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;default_value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;reward_rate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Variable&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="nd"&gt;@construct&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;initialize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;initial_reward_rate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;reward_rate&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;initial_reward_rate&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nd"&gt;@export&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;stake&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Amount must be greater than zero&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="n"&gt;staked_balances&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;caller&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt;
    &lt;span class="n"&gt;stake_timestamps&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;caller&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="nd"&gt;@export&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;withdraw&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;amount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;staked_balances&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;caller&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;No tokens to withdraw&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="n"&gt;duration&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;stake_timestamps&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;caller&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;reward&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;reward_rate&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;duration&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;86400&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Daily rewards
&lt;/span&gt;    &lt;span class="n"&gt;staked_balances&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;caller&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;reward&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;Result:&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;Accurate Logic:&lt;/strong&gt; Proper staking, withdrawal, and reward calculations.&lt;/li&gt;
&lt;li&gt;⚠️ &lt;strong&gt;Missing Knowledge about Tokens:&lt;/strong&gt; Ignored the actual transfer of tokens using either static import or importlib.&lt;/li&gt;
&lt;li&gt;⚠️ &lt;strong&gt;Missing Knowledge about Global Variables:&lt;/strong&gt; &lt;strong&gt;now&lt;/strong&gt; is not a function but a built-in variable containing a datetime.datetime type.&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Correct Syntax:&lt;/strong&gt; Followed Xian’s contract structure.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; While the staking logic was sound, ChatGPT-4o overlooked essential token logic, an area for improvement when dealing with complex logic.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Debugging and Optimization Performance
&lt;/h2&gt;

&lt;p&gt;We tested ChatGPT-4o’s debugging skills by intentionally introducing a bug:&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Buggy Contract Snippet:&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nd"&gt;@export&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;divide&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;Prompt:&lt;/strong&gt;
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Find and fix the issue with this contract."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;AI-Generated Fix:&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nd"&gt;@export&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;divide&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Cannot divide by zero&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;Result:&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;Error Detection:&lt;/strong&gt; Correctly identified the division by zero issue.&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Efficient Fix:&lt;/strong&gt; Added an assert statement for input validation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; ChatGPT-4o effectively handled basic debugging tasks, proving useful for catching common logic errors.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Security and Best Practices: How Well Does It Perform?
&lt;/h2&gt;

&lt;p&gt;We tested ChatGPT-4o’s ability to follow Xian-specific security practices, focusing on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;Access Control Implementation:&lt;/strong&gt; Accurately applied access controls using &lt;code&gt;ctx.caller&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;⚠️ &lt;strong&gt;Does not know about already deployed contracts&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Input Validation:&lt;/strong&gt; Consistently validated inputs using assertions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; While ChatGPT-4o performed well on basic security measures, it needs improvement when handling external contracts specific to blockchain environments.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. Overall Performance Analysis
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Test Category&lt;/th&gt;
&lt;th&gt;Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Basic Contract Creation&lt;/td&gt;
&lt;td&gt;✅ Excellent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Advanced Logic Handling&lt;/td&gt;
&lt;td&gt;⚠️ Good, but missed the existence of the currency contract&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Debugging and Error Detection&lt;/td&gt;
&lt;td&gt;✅ Effective&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Security Best Practices&lt;/td&gt;
&lt;td&gt;✅ Good&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Code Optimization&lt;/td&gt;
&lt;td&gt;✅ Efficient and concise&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Overall Verdict:&lt;/strong&gt; ChatGPT-4o is a powerful tool for rapidly developing Python smart contracts on the Xian Blockchain. It handles basic logic exceptionally well but requires human oversight for advanced security and optimization.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion: How Useful Is ChatGPT-4o for Xian Developers?
&lt;/h2&gt;

&lt;p&gt;ChatGPT-4o is an incredibly helpful assistant for developers building smart contracts on Xian:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;Speeds Up Development:&lt;/strong&gt; Quickly generates basic contract logic and functions.&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Great for Prototyping:&lt;/strong&gt; Ideal for generating quick prototypes and testing ideas.&lt;/li&gt;
&lt;li&gt;⚠️ &lt;strong&gt;Requires Human Oversight:&lt;/strong&gt; Developers should manually review advanced contracts for security and logic flaws.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Final Thought:&lt;/strong&gt; If you’re a Python developer working on Xian Blockchain, ChatGPT-4o can be your go-to tool for fast and efficient contract development—but it’s not a complete replacement for a thorough code review.&lt;/p&gt;

&lt;p&gt;🚀 Ready to see for yourself? Start building with &lt;a href="https://docs.xian.org" rel="noopener noreferrer"&gt;Xian Documentation&lt;/a&gt; and let ChatGPT-4o help you write your next smart contract today!&lt;/p&gt;

</description>
      <category>programming</category>
      <category>ai</category>
      <category>web3</category>
      <category>smartcontract</category>
    </item>
    <item>
      <title>Why Python Developers Should Dive Into Blockchain Now</title>
      <dc:creator>crosschainer</dc:creator>
      <pubDate>Fri, 21 Feb 2025 08:41:32 +0000</pubDate>
      <link>https://dev.to/crosschainer/why-python-developers-should-dive-into-blockchain-now-14cg</link>
      <guid>https://dev.to/crosschainer/why-python-developers-should-dive-into-blockchain-now-14cg</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;If you’re a Python developer, there’s never been a better time to dive into the world of blockchain. Until recently, blockchain development has largely been reserved for developers willing to learn specialized languages like Solidity or Rust. But now, platforms like &lt;strong&gt;Xian&lt;/strong&gt; are breaking down those barriers—letting you build smart contracts and decentralized applications (dApps) directly in Python (no code transpiling).&lt;/p&gt;

&lt;p&gt;The question isn’t &lt;em&gt;if&lt;/em&gt; Python developers should explore blockchain, but rather &lt;em&gt;why haven’t you started yet?&lt;/em&gt; This post will show you why Python developers are uniquely positioned to thrive in the blockchain space and how Xian makes it easier than ever.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Python’s Massive Ecosystem Meets Decentralization
&lt;/h2&gt;

&lt;p&gt;With over &lt;strong&gt;13 million developers worldwide&lt;/strong&gt;, Python is the most accessible and versatile programming language today. From AI and machine learning to web development and data analysis, Python is everywhere.&lt;/p&gt;

&lt;p&gt;Blockchain doesn’t just add another tool to your toolkit—it multiplies the possibilities for every project you work on.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Breaking Down Barriers: No New Languages, Just Python
&lt;/h2&gt;

&lt;p&gt;Traditionally, blockchain development meant learning new languages like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Solidity for Ethereum smart contracts.&lt;/li&gt;
&lt;li&gt;Rust for Solana development.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But with the &lt;strong&gt;Xian Blockchain&lt;/strong&gt;, you can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Write smart contracts &lt;strong&gt;natively in Python&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Avoid complicated cross-language conversions.&lt;/li&gt;
&lt;li&gt;Deploy dApps using the tools and syntax you’re already comfortable with.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;🎯 &lt;em&gt;“Why learn a new language when you can use the one you already know?”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;By removing the need to learn specialized languages, Xian lets you focus on building, not learning new syntax.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. A Seamless Developer Experience
&lt;/h2&gt;

&lt;p&gt;Xian doesn’t just let you write Python smart contracts—it offers a full development environment tailored to your workflow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🔗 &lt;strong&gt;Powerful API Access:&lt;/strong&gt; Easy-to-use APIs for seamless interaction with the blockchain.&lt;/li&gt;
&lt;li&gt;📊 &lt;strong&gt;Comprehensive Documentation:&lt;/strong&gt; Clear and developer-friendly resources to help you get started quickly.&lt;/li&gt;
&lt;li&gt;📦 &lt;strong&gt;Essential Libraries:&lt;/strong&gt; Supercharge your development with Xian’s tools: from &lt;a href="https://docs.xian.org/tools/xian-js" rel="noopener noreferrer"&gt;xian-js&lt;/a&gt; and &lt;a href="https://docs.xian.org/tools/xian-py" rel="noopener noreferrer"&gt;xian-py&lt;/a&gt; to &lt;a href="https://docs.xian.org/tools/xian-wallet-utils" rel="noopener noreferrer"&gt;wallet integration libraries&lt;/a&gt;, &lt;a href="https://chromewebstore.google.com/detail/xian-wallet/kcimjjhplbcgkcnanijkolfillgfanlc" rel="noopener noreferrer"&gt;wallets&lt;/a&gt;, and our &lt;a href="https://docs.xian.org/node/interfaces/graphql" rel="noopener noreferrer"&gt;GraphQL environment&lt;/a&gt; for seamless integrations.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With Python and Xian, smart contract development feels like any other Python project—no unnecessary friction.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Real-World Use Cases for Python on Blockchain
&lt;/h2&gt;

&lt;p&gt;Here are some exciting ways Python developers can leverage blockchain right now:&lt;/p&gt;

&lt;h3&gt;
  
  
  🔐 &lt;strong&gt;Decentralized Identity Verification&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Build systems where users control their personal data.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  💻 &lt;strong&gt;Decentralized Finance (DeFi) Tools&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Create lending platforms, decentralized exchanges, or stablecoins.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🔗 &lt;strong&gt;Automated Royalties for Creators&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Imagine an NFT marketplace where musicians and artists automatically receive royalties every time their content is resold—no intermediaries needed, all coded in Python.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  💸 &lt;strong&gt;Decentralized Crowdfunding Platforms&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Build a transparent crowdfunding platform where funds are only released when predefined conditions (smart contract milestones) are met. Perfect for open-source funding or startup incubation.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🎮 &lt;strong&gt;On-Chain Gaming Economy&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Develop play-to-earn games where players can own, trade, and earn real value from in-game assets—no middlemen, no asset loss when a game shuts down.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🔒 &lt;strong&gt;Secure Supply Chain Tracking&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Write Python contracts that track goods from origin to delivery. Each step is verified on the blockchain, preventing fraud and ensuring transparency.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  📊 &lt;strong&gt;Predictive Market Platforms&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Create decentralized platforms where users can stake tokens to predict real-world events.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ⚖️ &lt;strong&gt;Decentralized Autonomous Organizations (DAOs)&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Let communities govern themselves by building DAO voting systems—users can vote on proposals directly through the blockchain using Xian’s smart contract features.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  5. Xian Empowers Developers to Earn
&lt;/h2&gt;

&lt;p&gt;Beyond the technical advantages, Xian offers a financial incentive for developers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Earn 70% of all fees generated by your smart contracts.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This makes Xian not just a development platform—but an ecosystem where developers can earn by building impactful projects.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. How to Get Started with Xian Blockchain
&lt;/h2&gt;

&lt;p&gt;Ready to dive in? Here’s how you can start your blockchain journey today:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Set up your environment:&lt;/strong&gt; Install the &lt;a href="https://chromewebstore.google.com/detail/xian-wallet/kcimjjhplbcgkcnanijkolfillgfanlc/" rel="noopener noreferrer"&gt;Web3 Wallet&lt;/a&gt; and open up the IDE.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Write your first smart contract:&lt;/strong&gt; Use familiar Python syntax.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deploy and test:&lt;/strong&gt; Deploy your contract and monitor transactions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Join the community:&lt;/strong&gt; Connect with other developers on &lt;a href="https://t.me/xian_network" rel="noopener noreferrer"&gt;Telegram&lt;/a&gt; and contribute to open-source projects.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Here’s a simple example of a smart contract in Python:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nd"&gt;@export&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;greet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Hello, &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;! Welcome to the Xian Blockchain.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Conclusion: The Future of Blockchain Is Written in Python
&lt;/h2&gt;

&lt;p&gt;The blockchain space is evolving—and Python developers are at the forefront of this revolution. With Xian Blockchain, you can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Write smart contracts using the language you already know.&lt;/li&gt;
&lt;li&gt;Build powerful decentralized applications.&lt;/li&gt;
&lt;li&gt;Earn revenue from your contributions to the network.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So why wait? Start building, innovating, and shaping the future of blockchain with Python today.&lt;/p&gt;

&lt;p&gt;🚀 Ready to dive in? Check out the &lt;a href="https://docs.xian.org" rel="noopener noreferrer"&gt;Xian Documentation&lt;/a&gt; and start coding your first smart contract now!&lt;/p&gt;

</description>
      <category>blockchain</category>
      <category>programming</category>
      <category>web3</category>
      <category>python</category>
    </item>
    <item>
      <title>Building a Basic Python Staking Contract on Xian Blockchain</title>
      <dc:creator>crosschainer</dc:creator>
      <pubDate>Tue, 18 Feb 2025 11:46:45 +0000</pubDate>
      <link>https://dev.to/crosschainer/building-a-basic-python-staking-contract-on-xian-blockchain-5cgd</link>
      <guid>https://dev.to/crosschainer/building-a-basic-python-staking-contract-on-xian-blockchain-5cgd</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Staking is a core concept in blockchain applications that allows users to lock up tokens in a contract to earn rewards over time. Implementing a staking contract requires careful consideration of token compatibility, reward distribution, security, and withdrawal conditions.&lt;/p&gt;

&lt;p&gt;In this article, we’ll walk through the process of designing a &lt;strong&gt;staking smart contract&lt;/strong&gt; on &lt;strong&gt;&lt;a href="https://xian.org" rel="noopener noreferrer"&gt;Xian Blockchain&lt;/a&gt;&lt;/strong&gt; that can work with &lt;strong&gt;any token&lt;/strong&gt; using &lt;code&gt;importlib&lt;/code&gt;. We'll also enforce an &lt;strong&gt;interface&lt;/strong&gt; to ensure that only valid tokens with required functions can be used.&lt;/p&gt;




&lt;h2&gt;
  
  
  Thought Process Behind Staking Contract Logic
&lt;/h2&gt;

&lt;p&gt;Before writing any code, it’s important to understand the &lt;strong&gt;core functionalities&lt;/strong&gt; required for a staking contract:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Token Compatibility&lt;/strong&gt;: The contract should work with any token, enforcing an interface to ensure the token supports &lt;code&gt;transfer_from&lt;/code&gt; and &lt;code&gt;transfer&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Depositing Tokens (Staking)&lt;/strong&gt;: Users should be able to deposit their tokens into the contract.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reward Calculation&lt;/strong&gt;: Users earn rewards based on their staked amount and the duration of staking.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Withdrawal of Staked Tokens&lt;/strong&gt;: Users should be able to withdraw their tokens.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security Considerations&lt;/strong&gt;: Prevent reentrancy, ensure accurate balance updates, and enforce access control.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Designing the Staking Contract
&lt;/h2&gt;

&lt;p&gt;We will design the staking contract with the following key elements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Using&lt;/strong&gt; &lt;strong&gt;&lt;code&gt;importlib&lt;/code&gt;&lt;/strong&gt; to load the token contract dynamically.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Using&lt;/strong&gt; &lt;strong&gt;&lt;code&gt;now&lt;/code&gt;&lt;/strong&gt; to get the transaction datetime.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enforcing an interface&lt;/strong&gt; to ensure token compatibility.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tracking stakes and rewards&lt;/strong&gt; using state variables.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  1. Define the Staking Contract
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;staking_token&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Variable&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;staked_balances&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Hash&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;default_value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;stake_timestamps&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Hash&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;default_value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;reward_rate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Variable&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  &lt;span class="c1"&gt;# Rate at which rewards accumulate
&lt;/span&gt;
&lt;span class="n"&gt;token_interface&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;importlib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;transfer_from&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;amount&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;to&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;main_account&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt; &lt;span class="n"&gt;importlib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;transfer&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;amount&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;to&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
    &lt;span class="n"&gt;importlib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;balance_of&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;address&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,))]&lt;/span&gt;

&lt;span class="nd"&gt;@construct&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;seed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;token_contract&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;initial_reward_rate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Initialize the staking contract with a token and reward rate.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;token&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;importlib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;import_module&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;token_contract&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;importlib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;enforce_interface&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;token_interface&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;staking_token&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;token_contract&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;reward_rate&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;initial_reward_rate&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nd"&gt;@export&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;stake&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Allows users to stake tokens.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Stake amount must be greater than zero&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

    &lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;transfer_from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;caller&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;this&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;staked_balances&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;caller&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt;
    &lt;span class="n"&gt;stake_timestamps&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;caller&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;now&lt;/span&gt;

&lt;span class="nd"&gt;@export&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;withdraw&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Allows users to withdraw staked tokens and rewards.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;amount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;staked_balances&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;caller&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;No staked tokens to withdraw&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

    &lt;span class="n"&gt;token&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;importlib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;import_module&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;staking_token&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;

    &lt;span class="n"&gt;staking_duration&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;now&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;stake_timestamps&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;caller&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;reward&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;reward_rate&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;staking_duration&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;24&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Reward per day
&lt;/span&gt;
    &lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;transfer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;caller&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;reward&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;staked_balances&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;caller&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="n"&gt;stake_timestamps&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;caller&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Understanding the Logic
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;1. Token Compatibility&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;We use &lt;code&gt;importlib.import_module(staking_token.get())&lt;/code&gt; to dynamically load the token contract.&lt;/li&gt;
&lt;li&gt;The contract enforces an interface using &lt;code&gt;importlib.enforce_interface(token, token_interface)&lt;/code&gt; to ensure compatibility.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;2. Staking Tokens&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Users call &lt;code&gt;stake(amount)&lt;/code&gt;, which transfers tokens from their wallet to the staking contract.&lt;/li&gt;
&lt;li&gt;The contract updates the user's staked balance and timestamps the deposit.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;3. Reward Calculation&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;The contract calculates rewards based on the &lt;strong&gt;staking duration&lt;/strong&gt; and a &lt;strong&gt;reward rate&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Rewards accumulate in a time-based fashion, ensuring longer stakes get higher rewards.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;4. Withdrawing Staked Tokens&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Users call &lt;code&gt;withdraw()&lt;/code&gt; to retrieve their &lt;strong&gt;staked tokens + rewards&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;The contract calculates rewards and transfers the total amount back to the user.&lt;/li&gt;
&lt;li&gt;Staked balances and timestamps are reset to prevent double claims.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;By using &lt;code&gt;importlib&lt;/code&gt;, we can create a flexible &lt;strong&gt;staking contract&lt;/strong&gt; that works with any token while enforcing a &lt;strong&gt;standard interface&lt;/strong&gt;. This ensures security, compatibility, and flexibility for different token ecosystems.&lt;/p&gt;

&lt;p&gt;🚀 &lt;strong&gt;Next Steps:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Implement additional security checks such as cooldown periods before withdrawing.&lt;/li&gt;
&lt;li&gt;Allow reward customization based on different staking tiers.&lt;/li&gt;
&lt;li&gt;Introduce a &lt;strong&gt;penalty mechanism&lt;/strong&gt; for early withdrawals.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;💡 Got ideas for improving staking mechanisms? Drop a comment below! 🔐&lt;/p&gt;

</description>
      <category>blockchain</category>
      <category>smartcontract</category>
      <category>web3</category>
      <category>development</category>
    </item>
    <item>
      <title>Security Best Practices for Python Smart Contracts on Xian</title>
      <dc:creator>crosschainer</dc:creator>
      <pubDate>Tue, 18 Feb 2025 08:31:54 +0000</pubDate>
      <link>https://dev.to/crosschainer/security-best-practices-for-python-smart-contracts-on-xian-28g4</link>
      <guid>https://dev.to/crosschainer/security-best-practices-for-python-smart-contracts-on-xian-28g4</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Security is a fundamental aspect of smart contract development. Unlike traditional applications, blockchain-based contracts are immutable once deployed, making it crucial to write secure code from the outset.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://xian.org" rel="noopener noreferrer"&gt;Xian&lt;/a&gt; allows developers to write smart contracts in Python, but this ease of development also comes with potential security risks. In this guide, we’ll cover essential security best practices to help you write &lt;strong&gt;robust and attack-resistant&lt;/strong&gt; Xian smart contracts.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Input Validation &amp;amp; Sanitization
&lt;/h2&gt;

&lt;p&gt;User input is a major attack vector in smart contracts. Always &lt;strong&gt;validate inputs&lt;/strong&gt; to prevent unexpected behaviors and security vulnerabilities.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;balances&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Hash&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;default_value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nd"&gt;@export&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;transfer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;receiver&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Invalid amount&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;balances&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;caller&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Not enough coins to send!&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ensures only positive values are processed in financial transactions.&lt;/li&gt;
&lt;li&gt;Requires the user to have enough balance.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  2. Use Access Control &amp;amp; Permissions
&lt;/h2&gt;

&lt;p&gt;Unauthorized access to critical contract functions can lead to catastrophic failures. Implement access control mechanisms to restrict who can call sensitive functions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;owner&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Variable&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="nd"&gt;@construct&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;initialize&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;owner&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;caller&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nd"&gt;@export&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;privileged_function&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;caller&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;owner&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Unauthorized access&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="c1"&gt;# Perform sensitive action
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Prevents non-owners from calling privileged functions.&lt;/li&gt;
&lt;li&gt;Uses &lt;code&gt;ctx.caller&lt;/code&gt; to verify the identity of the function caller.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  3. Prevent Integer Overflows &amp;amp; Underflows
&lt;/h2&gt;

&lt;p&gt;In Python, integers are arbitrary-precision, but it’s still good practice to &lt;strong&gt;set explicit boundaries&lt;/strong&gt; to prevent unexpected behaviors.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;MAX_SUPPLY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1_000_000&lt;/span&gt;

&lt;span class="nd"&gt;@export&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;mint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Amount must be positive&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;supply&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;MAX_SUPPLY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Exceeds maximum supply&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;supply&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt;
    &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;balances&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Prevents minting more tokens than allowed.&lt;/li&gt;
&lt;li&gt;Ensures values remain within the intended range.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  4. Safe Handling of Decimal Operations in Xian Smart Contracts
&lt;/h2&gt;

&lt;p&gt;In the Contracting language, floating-point numbers are automatically converted to &lt;code&gt;ContractingDecimal&lt;/code&gt;. This ensures safe calculations within predefined precision limits, avoiding rounding errors and excessive values. The maximum limit for the decimal type is &lt;strong&gt;1e29&lt;/strong&gt;, and values exceeding this limit are truncated.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Avoid Reentrancy Attacks
&lt;/h2&gt;

&lt;p&gt;Reentrancy occurs when a contract makes an external call before updating its state, allowing an attacker to re-enter and manipulate the contract’s logic. This can lead to unintended execution and fund theft.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;reentrancy_lock&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Variable&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="nd"&gt;@construct&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;seed&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;reentrancy_lock&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nd"&gt;@export&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;withdraw&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;reentrancy_lock&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Reentrancy detected&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="n"&gt;reentrancy_lock&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Checks - Ensure user has enough balance
&lt;/span&gt;    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;balances&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;caller&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Insufficient balance&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

    &lt;span class="c1"&gt;# Effects - Deduct the amount first before making any external call
&lt;/span&gt;    &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;balances&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;caller&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;-=&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt;
    &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;balances&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt;

    &lt;span class="c1"&gt;# Interactions - External function call happens *last* to avoid reentrancy risk
&lt;/span&gt;    &lt;span class="n"&gt;external_contract&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call_some_function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="c1"&gt;# Reset the lock
&lt;/span&gt;    &lt;span class="n"&gt;reentrancy_lock&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Prevents an attacker from re-entering the function before the previous execution completes.&lt;/li&gt;
&lt;li&gt;Follows the Checks-Effects-Interactions pattern to update state before making external calls.&lt;/li&gt;
&lt;li&gt;Ensures safe execution even if an external contract attempts to re-enter.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  6. Regularly Audit Your Smart Contracts
&lt;/h2&gt;

&lt;p&gt;Before deploying a contract, conduct &lt;strong&gt;thorough testing and audits&lt;/strong&gt; to catch vulnerabilities early.&lt;/p&gt;

&lt;h3&gt;
  
  
  Steps to Audit:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Static Analysis:&lt;/strong&gt; Use linting tools to detect code issues.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automated Tests:&lt;/strong&gt; Write unit tests covering all possible contract behaviors.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Peer Reviews:&lt;/strong&gt; Have other developers review your contract code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bug Bounties:&lt;/strong&gt; Encourage security researchers to find vulnerabilities.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Writing secure smart contracts on &lt;a href="https://xian.org" rel="noopener noreferrer"&gt;Xian&lt;/a&gt; requires careful consideration of &lt;strong&gt;access controls, input validation, and attack prevention&lt;/strong&gt;. By following these best practices, you can protect your contracts from common vulnerabilities and ensure a safer blockchain ecosystem.&lt;/p&gt;

&lt;p&gt;🚀 &lt;strong&gt;Next Steps:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Implement these practices in your own smart contracts.&lt;/li&gt;
&lt;li&gt;Join the &lt;a href="https://t.me/xian_network" rel="noopener noreferrer"&gt;Xian Developer Community&lt;/a&gt; for security discussions.&lt;/li&gt;
&lt;li&gt;Read the &lt;a href="https://docs.xian.org/" rel="noopener noreferrer"&gt;Xian Docs&lt;/a&gt; for in-depth guidance.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;💡 Have security tips to share? Drop a comment below and help make the Xian blockchain even safer! 🔐&lt;/p&gt;

</description>
      <category>blockchain</category>
      <category>web3</category>
      <category>smartcontract</category>
      <category>python</category>
    </item>
    <item>
      <title>How to Write and Test a Smart Contract in Python on the Xian Blockchain</title>
      <dc:creator>crosschainer</dc:creator>
      <pubDate>Mon, 17 Feb 2025 12:17:55 +0000</pubDate>
      <link>https://dev.to/crosschainer/how-to-write-and-test-a-smart-contract-in-python-on-the-xian-blockchain-3756</link>
      <guid>https://dev.to/crosschainer/how-to-write-and-test-a-smart-contract-in-python-on-the-xian-blockchain-3756</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Xian is a pioneering blockchain platform that enables developers to write smart contracts using a subset of Python, making blockchain development more accessible and efficient. This guide will walk you through creating and testing a simple smart contract on the &lt;a href="https://xian.org" rel="noopener noreferrer"&gt;Xian network&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;Before you begin, ensure you have the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Python 3.11&lt;/strong&gt;: This version of Python installed on your system.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Step 1: Setting Up the Contracting Client
&lt;/h2&gt;

&lt;p&gt;The Contracting Client is essential for submitting and testing contracts on the Xian network. Here's how to set it up:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Install the Contracting Client&lt;/strong&gt;:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   git clone https://github.com/xian-network/xian-contracting
   &lt;span class="nb"&gt;cd &lt;/span&gt;xian-contracting
   pip3.11 &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Initialize the Client in Your Python Script&lt;/strong&gt;:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;   &lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;contracting.client&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ContractingClient&lt;/span&gt;

   &lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ContractingClient&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This client allows you to submit, interact with, and test your smart contracts.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 2: Writing a Smart Contract
&lt;/h2&gt;

&lt;p&gt;In Xian, smart contracts are written in a subset of Python. Below is an example of a simple contract that responds with different animal sounds based on the input value.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Filename&lt;/strong&gt;: &lt;code&gt;contract.py&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# contract.py
&lt;/span&gt;
&lt;span class="nd"&gt;@export&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;call_this&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;complex_function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;complex_function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Quack!&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
    &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Oink!&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
    &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Woof!&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Meow!&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Explanation&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;@export&lt;/code&gt;: Decorator that makes the function accessible externally.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;call_this&lt;/code&gt;: Calls the internal &lt;code&gt;complex_function&lt;/code&gt; with the provided argument.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;complex_function&lt;/code&gt;: Returns different strings based on the value of &lt;code&gt;a&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Step 3: Testing the Smart Contract
&lt;/h2&gt;

&lt;p&gt;Testing ensures your contract behaves as expected. We'll use Python's built-in &lt;code&gt;unittest&lt;/code&gt; framework alongside the Contracting Client.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Filename&lt;/strong&gt;: &lt;code&gt;test_contract.py&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# test_contract.py
&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;unittest&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;contracting.client&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ContractingClient&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TestContract&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;unittest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TestCase&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;setUp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ContractingClient&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;flush&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

        &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;contract.py&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;code&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;submit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;code&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;test_me&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;contract&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_contract&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;test_me&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_a_over_50_returns_quack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;contract&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call_this&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;51&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;assertEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Quack!&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_a_under_10_returns_oink&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;contract&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call_this&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;assertEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Oink!&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_a_equals_15_returns_woof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;contract&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call_this&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;assertEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Woof!&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_a_between_10_and_50_returns_meow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;contract&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call_this&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;assertEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Meow!&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;tearDown&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;flush&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;unittest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Explanation&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;setUp&lt;/code&gt;: Initializes the Contracting Client, submits the contract, and retrieves it for testing.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;tearDown&lt;/code&gt;: Flushes the client to reset the state after all tests.&lt;/li&gt;
&lt;li&gt;Individual test methods: Each tests a specific condition of the &lt;code&gt;complex_function&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Running the Tests&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;Execute the tests using:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python test_contract.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;By leveraging Xian's Contracting engine, developers can write and test smart contracts using familiar Python syntax. This approach simplifies blockchain development and accelerates the deployment of decentralized applications.&lt;/p&gt;

&lt;p&gt;For more detailed information, refer to the &lt;a href="https://docs.xian.org/contracts/" rel="noopener noreferrer"&gt;Xian Contracting Documentation&lt;/a&gt;.&lt;/p&gt;




</description>
      <category>programming</category>
      <category>smartcontract</category>
      <category>python</category>
      <category>web3</category>
    </item>
  </channel>
</rss>
