<?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: Sam</title>
    <description>The latest articles on DEV Community by Sam (@leiw5173).</description>
    <link>https://dev.to/leiw5173</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%2F822923%2F49df4078-49d6-40c3-bcf2-286fa2fe4588.png</url>
      <title>DEV Community: Sam</title>
      <link>https://dev.to/leiw5173</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/leiw5173"/>
    <language>en</language>
    <item>
      <title>Introducing the Neo Polaris Launchpad — Compete for $500,000 in prizes and incubation opportunities</title>
      <dc:creator>Sam</dc:creator>
      <pubDate>Tue, 08 Mar 2022 03:34:42 +0000</pubDate>
      <link>https://dev.to/leiw5173/introducing-the-neo-polaris-launchpad-compete-for-500000-in-prizes-and-incubation-opportunities-1ice</link>
      <guid>https://dev.to/leiw5173/introducing-the-neo-polaris-launchpad-compete-for-500000-in-prizes-and-incubation-opportunities-1ice</guid>
      <description>&lt;p&gt;In 2021 Neo launched N3, the newest and most powerful version of the Neo blockchain development platform. Alongside the release, the Frontier Launchpad was initiated, calling on trailblazers to be the first to take advantage of Neo’s powerful features. Over 700 developers answered the call, sharing in over US $100,000 in prizes and $200,000 in post-event funding.&lt;/p&gt;

&lt;p&gt;With foundations firmly established, developers can now look towards the &lt;a href="https://polaris.neo.org/"&gt;Polaris Launchpad&lt;/a&gt; for the next opportunity to join the growing Neo ecosystem. Just like the Northstar was a guide for travelers who would journey through the wilderness, the Polaris Launchpad can be seen as a guiding light for developers seeking a home on the Neo platform.&lt;br&gt;
Polaris features five development categories representing the next wave of applications we would like to see come to life on N3.&lt;/p&gt;

&lt;p&gt;These categories are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;DeFi&lt;/li&gt;
&lt;li&gt;Metaverse &amp;amp; NFT&lt;/li&gt;
&lt;li&gt;DAO&lt;/li&gt;
&lt;li&gt;Middleware Incorporating NeoFS/Oracle&lt;/li&gt;
&lt;li&gt;General&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Neo is upping the ante, with a $500,000 prize pool and opportunities to receive further funding through Neo’s $200 million EcoBoost program. We are also adding a bonus round, Polaris Plus, in which we will allow the community to vote for their favorite projects with their own tokens. Neo will match these votes through quadratic funding to the tune of a minimum US $57,500.&lt;/p&gt;

&lt;p&gt;As always, developers can expect to receive hands-on support from Neo’s global development community to help them bring their projects to life. Neo’s multi-language support provides a range of options, offering a choice between C#, Python, Go, or Java smart contacts. Developers can also take advantage of Neo N3’s full stack of native features, including the NeoFS distributed storage platform and oracles, along with best-in-class tooling.&lt;/p&gt;

&lt;p&gt;To register for the Neo Polaris Launchpad, please head over to our &lt;a href="https://neo-polaris.devpost.com/"&gt;DevPost event&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Competition details&lt;/strong&gt;
&lt;/h2&gt;

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

&lt;ul&gt;
&lt;li&gt;Three phases: Planathon (optional), Hackathon, Polaris Plus (invite only)&lt;/li&gt;
&lt;li&gt;$500,000 prize pool&lt;/li&gt;
&lt;li&gt;5 x major prizes of $35,000 each + prize multipliers&lt;/li&gt;
&lt;li&gt;15 x excellence awards of $8,000 each + prize multipliers&lt;/li&gt;
&lt;li&gt;Minimum of $57,500 to distribute in Polaris Plus through quadratic voting&lt;/li&gt;
&lt;li&gt;Incubation opportunities to the best teams&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;### Planathon&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;March 7th — April 5th&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Thomas Edison once said “Good fortune is what happens when opportunity meets with planning.” Building on the fantastic response from Frontier Launchpad we are once again kicking off our launchpad with a Planathon.&lt;/p&gt;

&lt;p&gt;Before you get stuck into development, we want you to take some time to really flesh out your Polaris project. This includes evaluating the suitability of your ideas for blockchain, organizing a team, drafting a business plan, identifying delivery milestones, and so forth. We understand that what you develop during Polaris may only be just the beginning of something fantastic.&lt;/p&gt;

&lt;p&gt;The teams with the best plans will win “multipliers” between 1.1x and 1.5x that will be applied to any prizes won at the conclusion of the Hackathon phase. For example, if your team wins a 1.5x multiplier and you win a grand prize of $35,000, you will actually receive $52,500.&lt;/p&gt;

&lt;p&gt;Not only does crafting a project plan put you way ahead of your competition, it also increases your opportunity to earn! The average prize money won during the Frontier Launchpad was increased by over 42% for Planathon participants!&lt;/p&gt;

&lt;p&gt;Further, Neo is actively looking for promising projects to incubate, so this is also a chance to put us on notice and show that you mean business. Short written feedback will be provided to all submissions.&lt;/p&gt;

&lt;p&gt;Participants are not required to compete in the Planathon to make a submission in the Hackathon. However, teams that take part in the Planathon will also have the advantage of having their final submission judged against the background of their original plan. This may help judges evaluate the quality of your submission within the bigger picture of your project, and not just the features you were able to deliver within the competition time frame.&lt;/p&gt;

&lt;p&gt;Finally, even if you do not win a multiplier in the Planathon, getting feedback on your ideas could be critical to adjusting your project concepts so you’re better positioned to win a Hackathon prize.&lt;/p&gt;

&lt;p&gt;Multipliers will be awarded to teams on &lt;strong&gt;April 11th&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;### Hackathon&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;April 12th — May 9th&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Submissions for the Hackathon phase of the Polaris Launchpad open after the results of the Planathon have been announced. This is when you put your skills to the test and start building your project.&lt;/p&gt;

&lt;p&gt;If you need help getting started, visit Neo’s Developers Portal to find documentation, tutorials, and tooling options. If you haven’t already, please join the Neo Discord, where the Neo community (who is responsible for many of the tools you will be using) will be ready and waiting to provide support, advice, and encouragement.&lt;/p&gt;

&lt;p&gt;Submissions for the development phase close on May 9th. Our esteemed Polaris Launchpad judges will review all entries and announce the winners on &lt;strong&gt;May 30th&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Polaris Plus&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;June 8th — June 21st&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Following the conclusion of the Hackathon, a bonus Polaris Plus round will be held, in which the Neo community gets to decide the winners.&lt;/p&gt;

&lt;p&gt;The best Hackathon submissions, regardless of whether they received awards or not, will be invited to join us on Dorahacks for a round community voting. In this special event, GAS token holders will be able to use their funds to vote for their favorite projects. Neo has set aside a minimum of $57,500 to match these votes through quadratic means.&lt;br&gt;
Further, due to the structure of the Polaris Launchpad, the maximum prize pool that can be distributed to Hackathon participants is $442,500 — depending on each team’s performance during the Planathon. Any leftover prize money will be allocated to Polaris Plus, meaning that the total amount to be distributed may rise.&lt;/p&gt;

&lt;p&gt;This is a chance for the Neo community to have its say on which projects it would like to see grow within the Neo ecosystem. Polaris Plus participants will have one week between the conclusion of the Hackathon and the beginning of Polaris Plus to make any final adjustments to their projects before the quadratic voting round starts.&lt;/p&gt;

&lt;p&gt;Voting will close on &lt;strong&gt;June 21st&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Prizes&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Planathon&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Multipliers of between 1.1x and 1.5x will be awarded to outstanding plans. Short written feedback will be provided for Planathon submissions.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Hackathon&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Grand Prizes&lt;/strong&gt; will be awarded to the best overall project in each of the following categories (five total):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;DeFi&lt;/li&gt;
&lt;li&gt;Metaverse &amp;amp; NFT&lt;/li&gt;
&lt;li&gt;DAO&lt;/li&gt;
&lt;li&gt;Middleware Incorporating NeoFS/Oracle&lt;/li&gt;
&lt;li&gt;General&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each Grand Prize winner will receive:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;US $35,000 in NEO tokens&lt;/li&gt;
&lt;li&gt;Entry into the Neo EcoBoost program for incubation support.&lt;/li&gt;
&lt;li&gt;Entry into the Polaris Plus community voting round for additional prizes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Excellence Awards&lt;/strong&gt; will be awarded to projects that have demonstrated excellent technical execution across any category and will receive (15 total):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;US $8,000 in NEO tokens&lt;/li&gt;
&lt;li&gt;A one-hour consultation with NGD EcoGrowth to discuss your project and its goals.&lt;/li&gt;
&lt;li&gt;Entry into Polaris Plus community voting round for additional token bonus.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Polaris Plus entry&lt;/strong&gt; may be awarded to projects that did not qualify for a Grand Prize or Excellence Award.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Polaris Plus&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Neo will match community voting via quadratic means up to a minimum of $57,500 in value. This figure may rise depending on the total prizes awarded during the Hackathon phase.&lt;/p&gt;

&lt;p&gt;We can’t wait to see what you all deliver during this exciting event. As always, the Neo development community will be on hand to guide you and assist you with any questions you might have. Please don’t forget to join the Neo Discord and head over to DevPost to register your participation in the Polaris Launchpad.&lt;/p&gt;

&lt;p&gt;For more information on the Neo Polaris Launchpad visit the following links:&lt;br&gt;
&lt;a href="https://polaris.neo.org/"&gt;polaris.neo.org&lt;/a&gt;&lt;br&gt;
&lt;a href="http://neo-polaris.devpost.com/"&gt;neo-polaris.devpost.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Learn more&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://neo.org"&gt;Neo official website&lt;/a&gt;&lt;br&gt;
Follow Neo on Twitter: &lt;a href="https://twitter.com/neo_blockchain%5B%5D(url)"&gt;@Neo_Blockchain&lt;/a&gt;&lt;br&gt;
Join the Neo community: &lt;a href="https://discord.gg/ZEe9ecgtAu"&gt;Discord&lt;/a&gt; / &lt;a href="https://t.me/NEO_EN"&gt;Telegram&lt;/a&gt;&lt;/p&gt;

</description>
      <category>blockchain</category>
      <category>programming</category>
      <category>news</category>
      <category>web3</category>
    </item>
    <item>
      <title>Writing a Smart Contract in Python</title>
      <dc:creator>Sam</dc:creator>
      <pubDate>Mon, 28 Feb 2022 10:39:29 +0000</pubDate>
      <link>https://dev.to/leiw5173/writing-a-smart-contract-in-python-3po1</link>
      <guid>https://dev.to/leiw5173/writing-a-smart-contract-in-python-3po1</guid>
      <description>&lt;p&gt;Smart contracts are certainly amongst the most vital and innovative components of the ongoing revolution surrounding blockchain technology. Following the path opened by Ethereum, as the next big step after Bitcoin, Neo excels as a platform optimized for decentralized trustless automated transactions powered by the code contained in these contracts.&lt;/p&gt;

&lt;p&gt;If the rhythmic generation of blocks is the pumping heart of the network, transactions the blood that carries information back and forth, then smart contracts play the role of veins and arteries, structuring the circulatory system for the next generation of the internet: decentralized autonomous applications.&lt;/p&gt;

&lt;h3&gt;
  
  
  Python Smart Contracts
&lt;/h3&gt;

&lt;p&gt;Writing smart contracts for the Neo Blockchain can be done in a number of different programming languages, using different tools to build the contract's logic and compile it into code executable by Neo Virtual Machine (NeoVM).&lt;/p&gt;

&lt;p&gt;This tutorial will cover the basics of contract development with boa, a full fledged Python compiler for Neo.&lt;/p&gt;

&lt;p&gt;To showcase Boa's general usage, syntax and some of its basic features, we'll be implementing a simple Token, compliant to the NEP-17 standard. In this sense, the present document might be of interest not only to Python enthusiasts, but to anyone trying to grasp blockchain basics, token design-patterns, and smart contract general structure in Neo.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Requirements
&lt;/h2&gt;

&lt;p&gt;Minimum Python3 knowledge to create the smart contract's logic;&lt;br&gt;
Python 3.7 or later;&lt;br&gt;
Having the latest version of &lt;a href="https://developers.neo.org/tutorials/2021/06/17/neo3/boa/getting-started.html"&gt;boa&lt;/a&gt; installed to build and compile the smart contract;&lt;/p&gt;
&lt;h3&gt;
  
  
  Our Environment
&lt;/h3&gt;

&lt;p&gt;At the time of writing:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/CityOfZion/neo3-boa/releases/tag/v0.8.2"&gt;boa v0.8.2&lt;/a&gt;&lt;br&gt;
&lt;a href="https://code.visualstudio.com/updates/v1_57"&gt;VSCode v1.57.0&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  2. Tokens in Neo
&lt;/h2&gt;

&lt;p&gt;With the N3 update, Neo is adopting an account model for all tokens in the network, including it's native tokens: &lt;strong&gt;NEO&lt;/strong&gt; and &lt;strong&gt;GAS&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Simply put, this means that every token is a deployed smart contract that keeps a ledger with the balance of each and every account that holds any amount of it. The smart contract also defines the characteristics of the token, like its symbol and total supply, and manages every transfer of that token between addresses.&lt;/p&gt;
&lt;h3&gt;
  
  
  NEP-17 Standard
&lt;/h3&gt;

&lt;p&gt;To ensure interoperability every token contract should support at least one of the token standards. These standards define a set of methods and behaviors that allow platforms (like exchanges, dApps, and other contracts) to easily interface with.&lt;/p&gt;

&lt;p&gt;In Neo, the common blueprint for Fungible Tokens is defined in the &lt;strong&gt;&lt;a href="https://docs.neo.org/docs/en-us/develop/write/nep17.html"&gt;NEP-17 Token Standard&lt;/a&gt;&lt;/strong&gt;, and this is what we'll be implementing.&lt;/p&gt;

&lt;p&gt;One can check the deployed contracts' methods for Neo's native assets, and verify that they too are NEP-17 compliant smart contracts:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dora.coz.io/contract/neo3/mainnet/0xef4073a0f2b305a38ec4050e4d3d28bc40ea63f5"&gt;NEO Contract&lt;/a&gt;&lt;br&gt;
&lt;a href="https://dora.coz.io/contract/neo3/mainnet/0xd2a4cff31913016155e38e474a2c06d08be276cf"&gt;GAS Contract&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;NEP stands for Neo Enhancement Proposal. Every proposal is submitted, debated, tinkered, voted and approved (or not) by Neo's development community.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  3. Creating our Token
&lt;/h2&gt;

&lt;p&gt;As can be seen in the native assets contracts linked in the previous section, fungible tokens MUST implement all of the methods established by the NEP-17, but can also implement any set of complimentary methods. It's even necessary to implement other methods, like the ones that will actually issue token amounts to some address.&lt;/p&gt;

&lt;p&gt;In this section, we'll give a brief overview of the methods we're going to implement later. Right after, we'll showcase the full code of our token. We'll then proceed to cover the code bit by bit throughout the rest of the tutorial.&lt;/p&gt;
&lt;h3&gt;
  
  
  Nep-17 Methods
&lt;/h3&gt;

&lt;p&gt;These are the mandatory methods for a Fungible Token in the Neo Blockchain. Please refer to the original &lt;a href="https://docs.neo.org/docs/en-us/develop/write/nep17.html"&gt;NEP-17&lt;/a&gt; page for the official implementation guidelines for each one of them.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;symbol() -&amp;gt; str&lt;/code&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Must return our token's symbol, which acts as it's name. This value must never change.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;code&gt;decimals() -&amp;gt; int&lt;/code&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Must return the number of decimal places that's used by our token. This value must never change.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;code&gt;totalSupply() -&amp;gt; int&lt;/code&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Must return the total amount of our token that currently exists in the network.&lt;br&gt;
&lt;code&gt;balanceOf(account) -&amp;gt; int&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Must return the balance of our token that's held by a specified account.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;code&gt;transfer(from_address, to_address, amount, data) -&amp;gt; bool&lt;/code&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Must transfer an amount of our token from one address to another, but only after checking whether or not the transfer is valid. If the transfer succeeds this function must return True, otherwise it should return False. Every transfer must also trigger the &lt;strong&gt;&lt;em&gt;&lt;code&gt;Transfer&lt;/code&gt;&lt;/em&gt; event&lt;/strong&gt;, and in case the recipient of the transfer is another deployed contract, it should also trigger the &lt;code&gt;onNEP17Payment()&lt;/code&gt; method of such contract.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;code&gt;Transfer&lt;/code&gt; event&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Events are a way to communicate changes in the state of a contract as notifications to the network. We'll see how we implement this event in the next section.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  Other Methods
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;_deploy(data, update) -&amp;gt; bool&lt;/code&gt;&lt;br&gt;
This is an optional method that is automatically executed &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;when a contract is deployed to the network. We're going to use it to create the total amount of tokens and issue them to our own address.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;code&gt;onNEP17Payment(from_address, amount, data) -&amp;gt; bool&lt;/code&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Also an optional method, this one is called when a transfer() from another NEP-17 token tries to send tokens to our contract. This step exists to give the other contract a chance to somehow respond to a transfer attempt. In our case we'll simply use it to state that our contract doesn't accept any transfers.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;code&gt;manifest_metadata() -&amp;gt; NeoMetadata&lt;/code&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Another optional method, that we'll use to compliment the manifest.json file generated after compilation with some metadata of our own. This method has no effect in the smart contract's logic&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  4. Token Contract
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Notes to the Python Developer:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Boa compiles our &lt;code&gt;.py&lt;/code&gt; into NeoVM byte code, and to do so it requires some adaptation in Python's standards and conventions, which might be worth highlighting:&lt;/p&gt;

&lt;p&gt;the need to declare types on each method's input and output parameters, in order to properly compile;&lt;br&gt;
the usage of camelCase in method naming, to keep consistency with Neo's C#-bred ecossystem;&lt;br&gt;
you'll notice the &lt;code&gt;@public&lt;/code&gt; and &lt;code&gt;@manifest&lt;/code&gt; decorators before some functions, these are specific to boa and are used during compilation. Their meaning and usage are detailed in section 5.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from typing import Any
from boa3.builtin import public, metadata, NeoMetadata
from boa3.builtin.type import UInt160
from boa3.builtin.contract import Nep17TransferEvent, abort
from boa3.builtin.interop import storage
from boa3.builtin.interop.runtime import calling_script_hash, check_witness
from boa3.builtin.interop.contract import call_contract
from boa3.builtin.interop.blockchain import get_contract

# -------------------------------------------
# CONSTANTS
# -------------------------------------------

OWNER = UInt160("CONTRACT_OWNER_S_ADDRESS".to_script_hash())
TOKEN_SYMBOL = 'TOKEN'
SUPPLY_KEY = 'totalSupply'
TOKEN_DECIMALS = 8
TOKEN_TOTAL_SUPPLY = 10_000_000 * 10 ** TOKEN_DECIMALS

# -------------------------------------------
# Events
# -------------------------------------------

on_transfer = Nep17TransferEvent

# -------------------------------------------
# NEP-17 Methods
# -------------------------------------------

@public
def symbol() -&amp;gt; str:
    return TOKEN_SYMBOL

@public
def decimals() -&amp;gt; int:
    return TOKEN_DECIMALS

@public
def totalSupply() -&amp;gt; int:
    return storage.get(SUPPLY_KEY).to_int()

@public
def balanceOf(account: UInt160) -&amp;gt; int:
    assert len(account) == 20, 'invalid address'

    return storage.get(account).to_int()

@public
def transfer(from_address: UInt160, to_address: UInt160, amount: int, data: Any) -&amp;gt; bool:
    assert len(from_address) == 20 and len(to_address) == 20, 'invalid address'
    assert amount &amp;gt;= 0, 'invalid amount'

    from_balance = storage.get(from_address).to_int()
    if from_balance &amp;lt; amount:
        return False

    if from_address != calling_script_hash:
        if not check_witness(from_address):
            return False

    if from_address != to_address and amount != 0:
        if from_balance == amount:
            storage.delete(from_address)
        else:
            storage.put(from_address, from_balance - amount)

        to_balance = storage.get(to_address).to_int()
        storage.put(to_address, to_balance + amount)

    on_transfer(from_address, to_address, amount)

    contract = get_contract(to_address)
    if not isinstance(contract, None):
        call_contract(to_address, 'onNEP17Payment', [from_address, amount, data])

    return True

# -------------------------------------------
# Other Methods
# -------------------------------------------

@public
def _deploy(data: Any, update: bool):
    if update:
        return

    if storage.get(SUPPLY_KEY).to_int() &amp;gt; 0:
        return

    storage.put(SUPPLY_KEY, TOKEN_TOTAL_SUPPLY)
    storage.put(OWNER, TOKEN_TOTAL_SUPPLY)

    on_transfer(None, OWNER, TOKEN_TOTAL_SUPPLY)

@public
def onNEP17Payment(from_address: UInt160, amount: int, data: Any):
    abort()

# -------------------------------------------
# Manifest method with Contract's metadata
# -------------------------------------------

@metadata
def manifest_metadata() -&amp;gt; NeoMetadata:
    meta = NeoMetadata()
    meta.author = "CoZ"
    meta.description = "NEP-17 Example"
    meta.email = "contact@coz.io"
    meta.version = "0.33"
    meta.extras = {'Date of creation': '08/03/2021',
                   'Last update': '12/03/2021'
                   }
    return meta
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  5. Contract Breakdown
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Imports
&lt;/h3&gt;

&lt;p&gt;For this example we are only importing a small subset of boa's packages, based on our contract's needs. We're also importing the type &lt;code&gt;Any&lt;/code&gt; directly from Python&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from typing import Any
from boa3.builtin import public, metadata, NeoMetadata
from boa3.builtin.type import UInt160
from boa3.builtin.contract import Nep17TransferEvent, abort
from boa3.builtin.interop import storage
from boa3.builtin.interop.runtime import calling_script_hash, check_witness
from boa3.builtin.interop.contract import call_contract
from boa3.builtin.interop.blockchain import get_contract
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For a complete reference of boa's supported features, please head to the &lt;a href="https://developers.neo.org/tutorials/2021/06/17/neo3/boa/package-reference.html"&gt;Package Reference&lt;/a&gt; section of the documentation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Constants
&lt;/h3&gt;

&lt;p&gt;We're declaring some constants in the beginning of our code. This is a design choice that keeps some key aspects of our Token at hand for quick configuration and reference. These constants are later used throughout our implemented methods.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;OWNER = UInt160("CONTRACT_OWNER_S_ADDRESS".to_script_hash())
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;OWNER&lt;/code&gt; stores the address of the Token Owner. It's usually stored in &lt;code&gt;UInt160&lt;/code&gt; format. The name stands for an Unsigned Integer with 160 bits (or 20 bytes), and it's Neo's native type for script hashes.&lt;/p&gt;

&lt;p&gt;Data type conversion is a tricky topic when first approaching blockchain development. So it's worth giving a brief overview of the translations happening here.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;UInt160()&lt;/code&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Boa's constructor method for &lt;code&gt;UInt160&lt;/code&gt; type. It accepts either &lt;code&gt;bytes&lt;/code&gt; or &lt;code&gt;int&lt;/code&gt; as parameters, and returns the correspondent &lt;code&gt;UInt160&lt;/code&gt; value.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;code&gt;"CONTRACT_OWNER_S_ADDRESS"&lt;/code&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The most user friendly and sharable type for blockchain addresses is usually a &lt;code&gt;string&lt;/code&gt;, so we'll need to convert it to &lt;code&gt;bytes&lt;/code&gt; format before we can feed it to our &lt;code&gt;UInt160()&lt;/code&gt; constructor.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;code&gt;"to_script_hash()"&lt;/code&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A simple method to convert our previous &lt;code&gt;string&lt;/code&gt; to &lt;code&gt;bytes&lt;/code&gt; format.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;By properly storing this address in our &lt;code&gt;OWNER&lt;/code&gt; constant we avoid having to deal with all these type conversions inside our methods.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;TOKEN_SYMBOL = 'TOKEN'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;TOKEN_SYMBOL&lt;/code&gt; is simply a constant that will store our Token's symbol. Following the NEP-17 guidelines, the symbol needs to be in uppercase, only letters from the latin alphabet are allowed, and it should be short (3-8 characters).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SUPPLY_KEY = 'totalSupply' 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;SUPPLY_KEY&lt;/code&gt; is a constant that we'll use as key to our storage, holding the value of the total supply of our tokens. It can have any value, the shorter the better, as it will save storage space in our smart contract, consequently making it a little cheaper to deploy and interact with.&lt;/p&gt;

&lt;p&gt;In our case we'll use the &lt;code&gt;SUPPLY_KEY&lt;/code&gt; constant first to store this information, and later to retrieve it whenever asked for it. In more complex scenarios, it would also be used to change the amount of tokens that exist in the network.&lt;/p&gt;

&lt;p&gt;More about the usage of the storage in the Methods section.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;TOKEN_DECIMALS = 8
TOKEN_TOTAL_SUPPLY = 10_000_000 * 10 ** TOKEN_DECIMALS
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;TOKEN_DECIMALS&lt;/code&gt; states the number of decimal places that we'll want our token to have, and &lt;code&gt;TOKEN_TOTAL_SUPPLY&lt;/code&gt; will hold the total amount of our tokens that exist in the network. In our case, since there will be no changes to it we can store it in a constant. Notice that the total supply is 10 million multiplied by the decimals we've configured just above.&lt;/p&gt;

&lt;h3&gt;
  
  
  Events
&lt;/h3&gt;

&lt;p&gt;Events are notifications sent to the network when something specific happens in a contract. They are a way for other actors to acknowledge and react to state changes in smart contracts without having to query or send transactions to the blockchain.&lt;/p&gt;

&lt;p&gt;The NEP-17 standard states that we must trigger the &lt;code&gt;Transfer&lt;/code&gt; event after every transfer. Boa has an native features to facilitate this, and we're assigning it to the constant &lt;code&gt;on_transfer&lt;/code&gt; so we can easily use it later in our &lt;code&gt;transfer()&lt;/code&gt; method.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;on_transfer = Nep17TransferEvent
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But events can also be constructed according to the different needs and use cases of different smart contracts. Bellow is a quick example of the very same &lt;code&gt;Transfer&lt;/code&gt; event implemented in a manual fashion.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from typing import Union
from boa3.builtin import CreateNewEvent
from boa3.builtin.type import UInt160

on_transfer = CreateNewEvent(
    [
        ('from_addr', Union[UInt160, None]),
        ('to_addr', Union[UInt160, None]),
        ('amount', int)
    ],
    'Transfer'
)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Future articles will further approach this topic.&lt;/p&gt;

&lt;h3&gt;
  
  
  Methods
&lt;/h3&gt;

&lt;p&gt;Before covering each method we implemented, a few general aspects common to them all are worth noticing:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;storage&lt;/code&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Our smart contract logic orbits around storage interactions. Every smart contract has it's own scoped storage, which uses a key-value model; a simple, yet powerful mechanism, paramount to the workings of decentralized applications. In our token we're using three storage methods: &lt;code&gt;storage.put&lt;/code&gt; assigns a value to a given key, &lt;code&gt;storage.get&lt;/code&gt; retrieves a value with a given key, and &lt;code&gt;storage.delete&lt;/code&gt; removes a key-value pair from the storage.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;code&gt;@public&lt;/code&gt; decorator&lt;br&gt;
As the name suggests, it's used to flag functions that can be accessed from outside the contract itself. Functions decorated with &lt;code&gt;@public&lt;/code&gt; will be included in the manifest's ABI during compilation, and after deployment can be called by external addresses. Functions not flagged with it are internal ones, and can only be called from within the contract itself.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;@metadata&lt;/code&gt; decorator&lt;br&gt;
Can only be used once, and the function flagged with it must have &lt;code&gt;NeoMetadata&lt;/code&gt; as output. The function flagged with this decorator won't affect the contract's logic, serving only to add different kinds of metadata to the contract's manifest during compilation.&lt;/p&gt;
&lt;h3&gt;
  
  
  NEP-17 Methods
&lt;/h3&gt;

&lt;p&gt;The first two methods will simply return values that we have previously assigned to our constants. Notice again the very unpythonic type declaration that's mandatory for our contracts to compile.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@public
def symbol() -&amp;gt; str:
    return TOKEN_SYMBOL

@public
def decimals() -&amp;gt; int:
    return TOKEN_DECIMALS
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then we have a few methods that deal with simple &lt;code&gt;storage&lt;/code&gt; interactions.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@public
def totalSupply() -&amp;gt; int:
    return storage.get(SUPPLY_KEY).to_int()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We're using our &lt;code&gt;SUPPLY_KEY&lt;/code&gt; to retrieve the total supply of tokens from the storage. This value will be put there using this same key by the &lt;code&gt;_deploy&lt;/code&gt; method that's automatically called on contract deployment. Notice the usage of &lt;code&gt;to_int()&lt;/code&gt;, necessary to convert &lt;code&gt;bytes&lt;/code&gt; values that are retrieved from the storage by default.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@public
def balanceOf(account: UInt160) -&amp;gt; int:
    assert len(account) == 20, 'invalid address'

    return storage.get(account).to_int()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This function checks the balance of an account. Accounts are added as keys to the storage whenever they receive tokens, and the amount of tokens that they own is added as values to the storage. This is done first by the aforementioned &lt;code&gt;_deploy&lt;/code&gt; method, and then by the &lt;code&gt;transfer&lt;/code&gt; method whenever tokens are transfered. In this case, we're also checking whether the passed parameter is a valid account format, before making the call to the storage. If it's not, we throw an exception.&lt;/p&gt;

&lt;p&gt;The transfer function is by far the most complex one of our Token's contract. It takes as parameters two addresses (a sender and a receiver) the amount of tokens to transfer, and also a fourth &lt;code&gt;data&lt;/code&gt; parameter. This last one can take data of any type, which can be used for more complex transfer-triggered interactions between smart contracts.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@public
def transfer(from_address: UInt160, to_address: UInt160, amount: int, data: Any) -&amp;gt; bool:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;First we make sure the parameters passed to the function are valid ones. If not, we throw exceptions.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;assert len(from_address) == 20 and len(to_address) == 20, 'invalid address'
    assert amount &amp;gt;= 0, 'invalid amount'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then we check if the sender has enough balance to make the transfer it intends to.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; from_balance = storage.get(from_address).to_int()
    if from_balance &amp;lt; amount:
        return False
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then we need to check if the one calling the function is actually authorized to do so.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    if from_address != calling_script_hash:
        if not check_witness(from_address):
            return False
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;calling_script_hash&lt;/code&gt; will return us the script hash that called the function. If it's not the same as the address passed down as the sender, we need to further check whether the sender signed the transaction. We do this using &lt;code&gt;check_witness&lt;/code&gt;, and if the sender's signature is also not in the transaction, then we must interrupt our transfer and return false.&lt;/p&gt;

&lt;p&gt;If all previous tests are successful, we proceed to transfer the funds. In here we're doing some further checks that might save needless storage computation, or save storage space.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    if from_address != to_address and amount != 0:
        if from_balance == amount:
            storage.delete(from_address)
        else:
            storage.put(from_address, from_balance - amount)

        to_balance = storage.get(to_address).to_int()
        storage.put(to_address, to_balance + amount)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;First we completely skip balance changes if sender and receiver are the same address, or if the amount being transferred equals 0. Then we check whether the sender is sending all of it's funds, and if he is, we delete his entry in the storage, instead of keeping an entry with value zero. This is done to save precious space in the blockchain, since every node in the network holds a complete copy of every single contract's storage. After all of this, we proceed to the balance changes that configure the actual transfer.&lt;/p&gt;

&lt;p&gt;At last, with our transfer done, we can call the &lt;code&gt;Transfer&lt;/code&gt; event.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    on_transfer(from_address, to_address, amount)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;NEP-17 also states that the transfer method must check whether the receiver of a transfer is a contract. If so, it must call the contract's &lt;code&gt;onNEP17Payment&lt;/code&gt; method before finishing the transfer.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    contract = get_contract(to_address)
    if not isinstance(contract, None):
        call_contract(to_address, 'onNEP17Payment', [from_address, amount, data])

    return True
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is done so the contract gets a chance to react to this payment, as we'll see in the next section.&lt;/p&gt;

&lt;h3&gt;
  
  
  Other Methods
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;_deploy&lt;/code&gt; method is executed automatically when the contract is deployed to the network. We'll use it to issue our tokens, putting our total supply to the storage using our &lt;code&gt;SUPPLY_KEY&lt;/code&gt; constant as key, and transferring all of the issued tokens to the contract's owner.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@public
def _deploy(data: Any, update: bool):
    if update:
        return

    if storage.get(SUPPLY_KEY).to_int() &amp;gt; 0:
        return

    storage.put(SUPPLY_KEY, TOKEN_TOTAL_SUPPLY)
    storage.put(OWNER, TOKEN_TOTAL_SUPPLY)

    on_transfer(None, OWNER, TOKEN_TOTAL_SUPPLY)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notice there are two checks before executing the deployment operations.&lt;/p&gt;

&lt;p&gt;First we check if this is an &lt;code&gt;update&lt;/code&gt; of the smart contract, by asking the second parameter of the function. If it is we do nothing.&lt;/p&gt;

&lt;p&gt;Next we check if the &lt;code&gt;SUPPLY_KEY&lt;/code&gt; is already used as key to the storage. If it is, it means that the contract was already deployed, and someone is trying to call it again. So we also do nothing, for our tokens are already issued.&lt;/p&gt;

&lt;p&gt;At last, we trigger the &lt;code&gt;Transfer&lt;/code&gt; event, since we are actually transferring tokens to the contract's owner. Notice the transfer event is triggered with &lt;code&gt;None&lt;/code&gt; being passed as the &lt;code&gt;from&lt;/code&gt; parameter. This means that these tokens are being &lt;code&gt;minted&lt;/code&gt;, or created, and therefore no one is actually sending them.&lt;/p&gt;

&lt;p&gt;Future tutorials will cover such topics as the &lt;code&gt;minting&lt;/code&gt; and &lt;code&gt;burning&lt;/code&gt; of tokens, as well as the update method, that can be used to make changes to an already deployed contract.&lt;/p&gt;

&lt;p&gt;Last but not least, we have the final method of our contract's logic.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@public
def onNEP17Payment(from_address: UInt160, amount: int, data: Any):
    abort()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As we've seen in the &lt;code&gt;transfer&lt;/code&gt; method, this method is called whenever another contract tries to send tokens to our contract. In our case, we'll simply refuse the transfer by calling &lt;code&gt;abort()&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;And as we've stated in the beginning of this section, we have our function flagged with the &lt;code&gt;@metadata&lt;/code&gt; decorator, which isn't part of the contract's logic. It serves the purpose of appending extra metadata to the compiled &lt;code&gt;manifest.json&lt;/code&gt; file. The most important thing here is the need for this function to return a &lt;code&gt;NeoMetadata&lt;/code&gt; object. Bellow is an example of how to create one such object, with custom metadata fields.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@metadata
def manifest_metadata() -&amp;gt; NeoMetadata:
    meta = NeoMetadata()
    meta.author = "CoZ"
    meta.description = "NEP-17 Example"
    meta.email = "contact@coz.io"
    meta.version = "0.33"
    meta.extras = {'Date of creation': '06/17/2021',
                   'Last update': '06/17/2021'
                   }
    return meta
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  6. Compiling the Contract
&lt;/h2&gt;

&lt;p&gt;Compiling our contract with boa is very straightforward. Copy the complete code to a blank &lt;code&gt;Token.py&lt;/code&gt; file and save it in a folder of your choice. We recommend creating a dedicated folder for this, since compiled files will be saved to the same location as our original &lt;code&gt;.py&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Then, on a terminal window, activate the Python Virtual Environment where you installed neo3-boa, and simply run the command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ neo3-boa path/to/your/file.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The code we provided should compile without errors, and three new files should be created on our chosen folder:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Token.nef&lt;/code&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The contract file to be deployed to the Neo Blockchain&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;code&gt;Token.manifest&lt;/code&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Also needed for deployment, contains the public interfacing data of our contract.&lt;br&gt;
&lt;code&gt;Token.nefdbgnfo&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;A file that's used by the debugger.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If for some reason you stumble upon compilation errors, with this contract or your next ones, it is recommended to resolve the first reported error and try to compile again. An error can have a cascading effect and throw more errors all caused by the first.&lt;/p&gt;

&lt;h3&gt;
  
  
  Testing our Token
&lt;/h3&gt;

&lt;p&gt;If you want to quickly test your newly compiled token, you can easily deploy it to a local blockchain using Neo Express.&lt;/p&gt;

&lt;p&gt;You can find the instructions to set it up in &lt;a href="https://developers.neo.org/tutorials/2021/06/17/hello_world_dapp"&gt;An Introduction to Contract Development on Neo&lt;/a&gt;.&lt;br&gt;
To test interface with your contract, refer to &lt;a href="https://developers.neo.org/tutorials/2021/06/17/contract_interfacing"&gt;Interfacing with smart contracts using Neon.js&lt;/a&gt;&lt;br&gt;
Be sure to update the Owner Address of the token with your testing wallet's address and recompile before deployment, so the tokens will be issued to the chosen address.&lt;/p&gt;

</description>
      <category>web3</category>
      <category>python</category>
      <category>blockchain</category>
    </item>
  </channel>
</rss>
