<?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>Forem: Altuğ Bakan</title>
    <description>The latest articles on Forem by Altuğ Bakan (@altug).</description>
    <link>https://forem.com/altug</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%2F851655%2F0a2b5b58-7ad4-4b8d-91bb-d6031a90b7fb.jpeg</url>
      <title>Forem: Altuğ Bakan</title>
      <link>https://forem.com/altug</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/altug"/>
    <language>en</language>
    <item>
      <title>Soroban Quest - Asset Interop</title>
      <dc:creator>Altuğ Bakan</dc:creator>
      <pubDate>Sun, 04 Dec 2022 06:00:00 +0000</pubDate>
      <link>https://forem.com/altug/soroban-quest-asset-interop-2jo4</link>
      <guid>https://forem.com/altug/soroban-quest-asset-interop-2jo4</guid>
      <description>&lt;p&gt;So, we have tackled Custom Types on the &lt;a href="https://dev.to/altug/soroban-quest-custom-types-5d54"&gt;last post&lt;/a&gt; on Soroban and learned a lot. Now, on this last quest, we will use our knowledge from all of the previous quests to dive into Asset Interop!&lt;/p&gt;

&lt;h2&gt;
  
  
  Understanding &lt;code&gt;README.md&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;For the last time, let's check out the &lt;code&gt;README.md&lt;/code&gt; file.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxfd14mbnfp80814y1pol.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxfd14mbnfp80814y1pol.png" alt="README"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It is quite the quest! We will use Stellar's "Classic" Assets, Soroban Tokens, and even import some Lumens from Stellar network to Soroban network!&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting Up Our Quest Account
&lt;/h2&gt;

&lt;p&gt;At this point, you should be able to start playing pretty easy! If you need a reminder, we should use &lt;code&gt;sq play 6&lt;/code&gt;, and fund our account to start playing the 6&lt;sup&gt;th&lt;/sup&gt; and last quest.&lt;/p&gt;

&lt;h2&gt;
  
  
  Token Interface
&lt;/h2&gt;

&lt;p&gt;On Soroban, tokens should implement the Token Interface if they want to interoperate between other contracts and protocols. Having a common interface for contracts help developers to support all types of tokens implementing the same interface without knowing their implementations. &lt;/p&gt;

&lt;p&gt;The Token Interface is defined as&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="c1"&gt;// The metadata used to initialize token (doesn't apply to contracts representing &lt;/span&gt;
&lt;span class="c1"&gt;// 'classic' Stellar assets).&lt;/span&gt;
&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;TokenMetadata&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Bytes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;symbol&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Bytes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;decimals&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;u32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Initializes a 'smart-only' token by setting its admin and metadata.&lt;/span&gt;
&lt;span class="c1"&gt;// Tokens that represent 'classic' Stellar assets don't need to call this, as&lt;/span&gt;
&lt;span class="c1"&gt;// their metadata is inherited from the existing assets.&lt;/span&gt;
&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;init&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;admin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Identifier&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;TokenMetadata&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Functions that apply on for tokens representing classic assets.&lt;/span&gt;

&lt;span class="c1"&gt;// Moves the `amount` from classic asset balance to the token balance of `id`&lt;/span&gt;
&lt;span class="c1"&gt;// user.&lt;/span&gt;
&lt;span class="c1"&gt;// `id` must be a classic Stellar account (i.e. an account invoker or signature &lt;/span&gt;
&lt;span class="c1"&gt;// signed by an account).&lt;/span&gt;
&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;import&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Signature&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nonce&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;BigInt&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;i64&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Moves the `amount` from token balance to the classic asset balance of `id`&lt;/span&gt;
&lt;span class="c1"&gt;// user.&lt;/span&gt;
&lt;span class="c1"&gt;// `id` must be a classic Stellar account (i.e. an account invoker or signature &lt;/span&gt;
&lt;span class="c1"&gt;// signed by an account).&lt;/span&gt;
&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;export&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Signature&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nonce&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;BigInt&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;i64&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Admin interface -- these functions are privileged&lt;/span&gt;

&lt;span class="c1"&gt;// If "admin" is the administrator, burn "amount" from "from"&lt;/span&gt;
&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;burn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;admin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Signature&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nonce&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;BigInt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;from&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Identifier&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;BigInt&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// If "admin" is the administrator, mint "amount" to "to"&lt;/span&gt;
&lt;span class="k"&gt;fn&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;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;admin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Signature&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nonce&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;BigInt&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="n"&gt;Identifier&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;BigInt&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// If "admin" is the administrator, set the administrator to "id"&lt;/span&gt;
&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;set_admin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;admin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Signature&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nonce&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;BigInt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;new_admin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Identifier&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// If "admin" is the administrator, freeze "id"&lt;/span&gt;
&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;freeze&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;admin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Signature&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nonce&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;BigInt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Identifier&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// If "admin" is the administrator, unfreeze "id"&lt;/span&gt;
&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;unfreeze&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;admin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Signature&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nonce&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;BigInt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Identifier&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Token Interface&lt;/span&gt;

&lt;span class="c1"&gt;// Get the allowance for "spender" to transfer from "from"&lt;/span&gt;
&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;allowance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;from&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Identifier&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;spender&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Identifier&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;BigInt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Set the allowance to "amount" for "spender" to transfer from "from"&lt;/span&gt;
&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;approve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;from&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Signature&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nonce&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;BigInt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;spender&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Identifier&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;BigInt&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Get the balance of "id"&lt;/span&gt;
&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;balance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Identifier&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;BigInt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Transfer "amount" from "from" to "to"&lt;/span&gt;
&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;xfer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;from&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Signature&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nonce&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;BigInt&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="n"&gt;Identifier&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;BigInt&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Transfer "amount" from "from" to "to", consuming the allowance of "spender"&lt;/span&gt;
&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;xfer_from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;spender&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Signature&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;nonce&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;BigInt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;from&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Identifier&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="n"&gt;Identifier&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;BigInt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Returns true if "id" is frozen&lt;/span&gt;
&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;is_frozen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Identifier&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Returns the current nonce for "id"&lt;/span&gt;
&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;nonce&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Identifier&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;BigInt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Descriptive Interface&lt;/span&gt;

&lt;span class="c1"&gt;// Get the number of decimals used to represent amounts of this token&lt;/span&gt;
&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;decimals&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Env&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;u32&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Get the name for this token&lt;/span&gt;
&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;name&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Env&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Bytes&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Get the symbol for this token&lt;/span&gt;
&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;symbol&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Env&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Bytes&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;on the &lt;a href="https://github.com/stellar/rs-soroban-sdk/blob/main/soroban-token-spec/src/lib.rs" rel="noopener noreferrer"&gt;Soroban SDK&lt;/a&gt;. It uses some cryptographic tools and some helpful interfaces from the &lt;code&gt;soroban-auth&lt;/code&gt; crate, which is a crate that contain libraries for user authentication on the Soroban network.&lt;/p&gt;

&lt;p&gt;The token interface is quite large but it is not hard to understand, so I urge you to check it out yourself and see if you can make sense of it. We will inspect the parts we will use on the token interface in quite the detail when we need them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Examining the Contract
&lt;/h2&gt;

&lt;p&gt;Once again, let's check out the &lt;code&gt;lib.rs&lt;/code&gt; file. The source code for this contract is quite large, and pretty complex. Let's check out some important parts of the source file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;soroban_auth&lt;/span&gt;&lt;span class="p"&gt;::{&lt;/span&gt;&lt;span class="n"&gt;Identifier&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Signature&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On this contract, we are dealing with user authentication, so we need the &lt;code&gt;soroban_auth&lt;/code&gt; crate to add this functionality to our contract. This crate helps us get more details about the input arguments of some functions that the Token Interface use.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;mod&lt;/span&gt; &lt;span class="n"&gt;token&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nn"&gt;soroban_sdk&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nd"&gt;contractimport!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"./soroban_token_spec.wasm"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This &lt;code&gt;mod&lt;/code&gt; statement imports the &lt;code&gt;soroban_token_spec.wasm&lt;/code&gt; file to make the compiler infer the types and structs from the Token Interface. This is useful as we did not have to copy and paste the source code of the token interface of the contract to a new file and import it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Allowance Trait
&lt;/h3&gt;

&lt;p&gt;We have a &lt;code&gt;trait&lt;/code&gt; in our code, which defines the &lt;code&gt;AllowanceTrait&lt;/code&gt; interface. The contracts implementing the &lt;code&gt;AllowanceTrait&lt;/code&gt; should implement two functions, &lt;code&gt;init&lt;/code&gt; and &lt;code&gt;withdraw&lt;/code&gt;, to successfully compile.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;trait&lt;/span&gt; &lt;span class="n"&gt;AllowanceTrait&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;init&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;child&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;AccountId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;token_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;BytesN&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&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;BigInt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;step&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;u64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;Result&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;Error&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;fn&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;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Env&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;Result&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;Error&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;init&lt;/code&gt; function has four external arguments. The &lt;code&gt;child&lt;/code&gt; argument sets the "Child" account that can withdraw some money from the "Parent" account. &lt;code&gt;token_id&lt;/code&gt; arguments is the ID of the token that the Child account can withdraw, &lt;code&gt;amount&lt;/code&gt; is how much of the said token that Child account withdraw for a year, and &lt;code&gt;step&lt;/code&gt; is how frequent the child account can withdraw, in seconds.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;withdraw&lt;/code&gt; function does not have an external argument and returns success or a custom &lt;code&gt;Error&lt;/code&gt; if the the withdrawal fails.&lt;/p&gt;

&lt;p&gt;We can see that our &lt;code&gt;AllowanceContract&lt;/code&gt; implements the &lt;code&gt;AllowanceTrait&lt;/code&gt; trait, so it should implement those two functions in addition to whatever it might implement. Let's check out the implementations of the &lt;code&gt;init&lt;/code&gt; and &lt;code&gt;withdraw&lt;/code&gt; functions so that we have a good understanding about what each of them do.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;init&lt;/code&gt; Function
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;init&lt;/code&gt; function is defined as&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;init&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;child&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;AccountId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;token_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;BytesN&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&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;BigInt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;step&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;u64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;Result&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;Error&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;token_key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;DataKey&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;TokenId&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;e&lt;/span&gt;&lt;span class="nf"&gt;.data&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="nf"&gt;.has&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;token_key&lt;/span&gt;&lt;span class="nf"&gt;.clone&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;Err&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nn"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;ContractAlreadyInitialized&lt;/span&gt;&lt;span class="p"&gt;);&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;step&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="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;Err&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nn"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;InvalidArguments&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&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;step&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;SECONDS_IN_YEAR&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="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;Err&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nn"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;InvalidArguments&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="nf"&gt;.data&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_key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;token_id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="nf"&gt;.data&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="nn"&gt;DataKey&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Parent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;to_account&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="nf"&gt;.invoker&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="nf"&gt;.unwrap&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
        &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="nf"&gt;.data&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="nn"&gt;DataKey&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Child&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;child&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="nf"&gt;.data&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="nn"&gt;DataKey&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;amount&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="nf"&gt;.data&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="nn"&gt;DataKey&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Step&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;step&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="nf"&gt;Ok&lt;/span&gt;&lt;span class="p"&gt;(())&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The contract has to be initialized only once. The first thing that the &lt;code&gt;init&lt;/code&gt; function does is checking this case. If the environment already has a &lt;code&gt;TokenId&lt;/code&gt; defined, which can be only done on the &lt;code&gt;init&lt;/code&gt; function, it means that the contract has already been initialized, and the &lt;code&gt;init&lt;/code&gt; function returns an &lt;code&gt;Error&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;After a sanity check, the contract validates the numerical arguments. It first checks if the &lt;code&gt;step&lt;/code&gt; value is not 0, as division by 0 on calculations would give an error, and you can't &lt;em&gt;really&lt;/em&gt; withdraw every 0 seconds. After that, it checks if &lt;code&gt;(&amp;amp;amount * step) / SECONDS_IN_YEAR&lt;/code&gt; is not zero. Since we are supplying an amount that is for a whole year, we can calculate how much the child account can withdraw at a time using the calculation given.&lt;/p&gt;

&lt;p&gt;Then, the function sets up some data on the environment for later use. Lastly, the contract sets up the time of the initial withdraw to a value in the past, so that the Child can withdraw at any time starting now.&lt;/p&gt;

&lt;blockquote&gt;
&lt;h4&gt;
  
  
  Ledger Data
&lt;/h4&gt;

&lt;p&gt;We have utilized the contract data quite much, but how about some network-wide values that do not depend on any contract? We can read the values from the Stellar Ledger using the &lt;code&gt;ledger&lt;/code&gt; method of the environment.&lt;/p&gt;

&lt;p&gt;The Ledger has information about the &lt;code&gt;protocol_version&lt;/code&gt;, &lt;code&gt;sequence&lt;/code&gt;, &lt;code&gt;timestamp&lt;/code&gt; of the closing time, and the &lt;code&gt;network_passphrase&lt;/code&gt; available for all contracts to read. This information is useful as we can create a contract that &lt;em&gt;unlocks&lt;/em&gt; at a future time, which is implemented using the &lt;code&gt;timestamp&lt;/code&gt; value of the Ledger. Check out the &lt;a href="https://docs.rs/soroban-sdk/latest/soroban_sdk/ledger/struct.Ledger.html" rel="noopener noreferrer"&gt;docs on soroban_sdk&lt;/a&gt; for more information.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;withdraw&lt;/code&gt; Function
&lt;/h3&gt;

&lt;p&gt;The withdraw function is implemented as&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&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;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Env&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;Result&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;Error&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;DataKey&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;TokenId&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="nf"&gt;.data&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="nf"&gt;.has&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="nf"&gt;.clone&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;Err&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nn"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;ContractNotInitialized&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;token_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;BytesN&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="nf"&gt;.data&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;key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nf"&gt;.unwrap&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="nf"&gt;.unwrap&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;token&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;token_id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="k"&gt;match&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="nf"&gt;.invoker&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nn"&gt;Address&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;Account&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="k"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;Err&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nn"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;InvalidInvoker&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="p"&gt;};&lt;/span&gt;

        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;step&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;u64&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="nf"&gt;.data&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="nn"&gt;DataKey&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Step&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nf"&gt;.unwrap&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="nf"&gt;.unwrap&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;iterations&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;SECONDS_IN_YEAR&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;step&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;let&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;BigInt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="nf"&gt;.data&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="nn"&gt;DataKey&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="nf"&gt;.unwrap&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="nf"&gt;.unwrap&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;withdraw_amount&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;iterations&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;latest&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;u64&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="nf"&gt;.data&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="nn"&gt;DataKey&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Latest&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nf"&gt;.unwrap&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="nf"&gt;.unwrap&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;latest&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;step&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="nf"&gt;.ledger&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="nf"&gt;.timestamp&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;Err&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nn"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;ChildAlreadyWithdrawn&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="nf"&gt;.xfer_from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nn"&gt;Signature&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Invoker&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nn"&gt;BigInt&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;zero&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nn"&gt;Identifier&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;Account&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="nf"&gt;.data&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="nn"&gt;DataKey&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Parent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nf"&gt;.unwrap&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="nf"&gt;.unwrap&lt;/span&gt;&lt;span class="p"&gt;()),&lt;/span&gt;
            &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nn"&gt;Identifier&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;Account&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;child&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;withdraw_amount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;new_latest&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;latest&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;step&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="nf"&gt;.data&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="nn"&gt;DataKey&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Latest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;new_latest&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="nf"&gt;Ok&lt;/span&gt;&lt;span class="p"&gt;(())&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;withdraw&lt;/code&gt; function also starts with a sanity check, this time it requires the contract to be initialized, as it needs to know the parameters on what will it work on.&lt;/p&gt;

&lt;p&gt;After the check, it creates a &lt;code&gt;client&lt;/code&gt; which, if you remember, is an interface for the function to interact with another contract. This time, the interface is any contract that implements the Token Interface.&lt;/p&gt;

&lt;p&gt;After that, it checks the caller is an EOA and not another contract. This is not required, but used for our purposes.&lt;/p&gt;

&lt;p&gt;Next, it does some calculations like how much to withdraw at a time, who is the Child account, and such using the stored data on the environment. It also checks if the latest withdraw is before the allowed interval, and returns an error otherwise.&lt;/p&gt;

&lt;p&gt;Finally, it sends the required amount to the Child account using the &lt;code&gt;xfer_from&lt;/code&gt; function of the token contract. This function transfers tokens from the Parent account to the Child account. To accomplish this task, the Parent account should allow the use of its tokens by this contract. We will accomplish that task later on the quest.&lt;/p&gt;

&lt;h2&gt;
  
  
  Examining the Test
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;test.rs&lt;/code&gt; file has a test using the USD Coin contract to create an allowance for the Child account, approving the contract and so on. Please inspect the test functions to see if you can make sense of them. One thing to note here is the use of&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="nf"&gt;.ledger&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;LedgerInfo&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1669726145&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;protocol_version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;sequence_number&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;network_passphrase&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nn"&gt;Default&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;default&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
        &lt;span class="n"&gt;base_reserve&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;function to set the state of the Soroban Ledger for testing purposes. Since the functions depend on the timestamps of the Ledger, we need a way of testing instead of waiting the required amount of time!&lt;/p&gt;

&lt;p&gt;Again, we can use &lt;code&gt;cargo test&lt;/code&gt; to test the validity of the tests.&lt;/p&gt;

&lt;h2&gt;
  
  
  Python Scripts
&lt;/h2&gt;

&lt;p&gt;You will see a folder named &lt;code&gt;py-scripts&lt;/code&gt; on the quest folder that contains some Python scripts. These scripts are supplied by &lt;a href="https://github.com/overcat" rel="noopener noreferrer"&gt;overcat&lt;/a&gt;, and are ways to interact with the Soroban network using the Stellar Python SDK. We won't be using these scripts, but feel free to check them out if you are interested with interacting with Soroban using Python.&lt;/p&gt;

&lt;h2&gt;
  
  
  Solving the Quest
&lt;/h2&gt;

&lt;p&gt;So, our tasks for the quest are&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Deploy the &lt;code&gt;AllowanceContract&lt;/code&gt; as the &lt;code&gt;Parent_Account&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Invoke the &lt;code&gt;init&lt;/code&gt; function of the &lt;code&gt;AllowanceContract&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;import&lt;/code&gt; some XLM into the &lt;code&gt;Parent_Account&lt;/code&gt; from their "Classic" Stellar account&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;approve&lt;/code&gt; the &lt;code&gt;AllowanceContract&lt;/code&gt; to make proxy transfers from the &lt;code&gt;Parent_Account&lt;/code&gt; to the &lt;code&gt;Child_Account&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Invoke the &lt;code&gt;withdraw&lt;/code&gt; function of the &lt;code&gt;AllowanceContract&lt;/code&gt; with either the &lt;code&gt;Child_Account&lt;/code&gt; or &lt;code&gt;Parent_Account&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;export&lt;/code&gt; some XLM from the &lt;code&gt;Child_Account&lt;/code&gt; to their "Classic" Stellar account&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let's start with them.&lt;/p&gt;

&lt;h3&gt;
  
  
  Deploying the Contract
&lt;/h3&gt;

&lt;p&gt;As usual, we can build and deploy the contract using&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cargo build &lt;span class="nt"&gt;--target&lt;/span&gt; wasm32-unknown-unknown &lt;span class="nt"&gt;--release&lt;/span&gt;
soroban deploy &lt;span class="nt"&gt;--wasm&lt;/span&gt; target/wasm32-unknown-unknown/release/soroban_asset_interop_contract.wasm
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1angs0wvxpznxq9yk0ut.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1angs0wvxpznxq9yk0ut.png" alt="Contract Deployment"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Note your contract ID somewhere, as we will need it for the next steps of the quest.&lt;/p&gt;

&lt;h2&gt;
  
  
  Invoking the &lt;code&gt;init&lt;/code&gt; Function
&lt;/h2&gt;

&lt;p&gt;At this point, we are used to the custom types that we have to supply to the &lt;code&gt;soroban&lt;/code&gt; CLI, so invoking the &lt;code&gt;init&lt;/code&gt; function shouldn't be that hard. The &lt;code&gt;init&lt;/code&gt; function has the arguments of type &lt;code&gt;AccountId&lt;/code&gt;, &lt;code&gt;BytesN&amp;lt;32&amp;gt;&lt;/code&gt;, &lt;code&gt;BigInt&lt;/code&gt;, and &lt;code&gt;u64&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;We have worked with the all those types except &lt;code&gt;BigInt&lt;/code&gt;, which is not any different than supplying a &lt;code&gt;u64&lt;/code&gt; variable. The only difference is that the &lt;code&gt;BigInt&lt;/code&gt; type can be a quite large number, even larger than the &lt;code&gt;u64&lt;/code&gt; variable.&lt;/p&gt;

&lt;p&gt;We need to create a Child account before invoking the &lt;code&gt;init&lt;/code&gt; function, as we need to supply the value as an argument.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;stellar_sdk&lt;/code&gt; on Python has all the functionality we need to create an account and view its public key in hexadecimal. Note that for this Quest, we need some additional Soroban compatibility on &lt;code&gt;stellar_sdk&lt;/code&gt;, so we need to install a specific version of the &lt;code&gt;stellar_sdk&lt;/code&gt;. We might already have a version of &lt;code&gt;stellar_sdk&lt;/code&gt;, so use the following command to change your version of the &lt;code&gt;stellar_sdk&lt;/code&gt; to a Soroban enabled one.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;git+https://github.com/StellarCN/py-stellar-base.git@soroban &lt;span class="nt"&gt;--upgrade&lt;/span&gt; &lt;span class="nt"&gt;--force-reinstall&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To create the Child account and get its public key in hexadecimal, we will use&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="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;stellar_sdk&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Keypair&lt;/span&gt;

&lt;span class="n"&gt;child&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Keypair&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;random&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&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;Public Key: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;child&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;public_key&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&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;Private Key: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;child&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;secret&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&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;Public Key in Hex: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;child&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;raw_public_key&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;hex&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note these values somewhere to not forget them as we will need those later.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqdkx0crj354hi1ne4xhg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqdkx0crj354hi1ne4xhg.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We also need to find the contract ID of the native Stellar token on Soroban network. Since the contract IDs of imported tokens are &lt;em&gt;deterministic&lt;/em&gt;, we can use the same calculation to determine the address. We will use&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="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;hashlib&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;stellar_sdk&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Asset&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;xdr&lt;/span&gt;

&lt;span class="n"&gt;asset&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Asset&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;native&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;xdr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;HashIDPreimage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;xdr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;EnvelopeType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ENVELOPE_TYPE_CONTRACT_ID_FROM_ASSET&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;from_asset&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;asset&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_xdr_object&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&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;Native Token ID: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;hashlib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sha256&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_xdr_bytes&lt;/span&gt;&lt;span class="p"&gt;()).&lt;/span&gt;&lt;span class="nf"&gt;hexdigest&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note the XLM token's contract ID, which should be &lt;code&gt;71c670db8b9d9dd3fa17d83bd98e4a9814f926121972774bd419fa402fe01dc7&lt;/code&gt;, somewhere since we will use it later.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5jzodnb5hdukygdgu9a7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5jzodnb5hdukygdgu9a7.png" alt="XLM Contract ID"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now that we have all the information we need, Let's invoke the &lt;code&gt;init&lt;/code&gt; function of our contract.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;soroban invoke &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--id&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;your contract &lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--fn&lt;/span&gt; init &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--arg&lt;/span&gt; &lt;span class="s1"&gt;'{"object":{"accountId":{"publicKeyTypeEd25519":"[public key of your child account in hexadecimal]"}}}'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--arg&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;the XLM token contract address] &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--arg&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;the allowance that you would like to give &lt;span class="k"&gt;in &lt;/span&gt;stroops] &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--arg&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;the withdrawal rate &lt;span class="k"&gt;in &lt;/span&gt;seconds]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We should get a success reply if our arguments are correct. Note that the allowance is in &lt;code&gt;stroop&lt;/code&gt;s, and a &lt;code&gt;stroop&lt;/code&gt; is a 10 millionth of a Lumen.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fynqpki0007f8wyhqd2bf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fynqpki0007f8wyhqd2bf.png" alt="Invoking Init Function"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I allowed the Child account to withdraw 500 Lumens yearly, once every week (60 * 60 * 24 * 7 = 604800).&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;import&lt;/code&gt;ing XLM to Parent Account
&lt;/h3&gt;

&lt;p&gt;Now, we have to import some "Classic" Lumens from the Stellar network to Soroban network, so that the Child account can withdraw them. We will use the &lt;code&gt;import&lt;/code&gt; function of the token contract, as it implements the Token Interface that we discussed above. As a reminder, the definition of the &lt;code&gt;import&lt;/code&gt; function is&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;import&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Signature&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nonce&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;BigInt&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;i64&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We have a new &lt;code&gt;Signature&lt;/code&gt; type that we need to construct as an argument. The &lt;code&gt;Signature&lt;/code&gt; type is a &lt;em&gt;proof&lt;/em&gt; indicating the signer is giving permission to the function invoker the required permissions. Since we will import for ourselves, we can use the "Invoker" argument to tell the contract that we are doing it for ourselves. Since we are the invoker of this function, the contract knows that we possess the control of the account's secret key, and allows us to accomplish whatever we would like to do.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;nonce&lt;/code&gt; parameter is used for signature validation. Since we are not supplying a signature, we can just pass 0.&lt;/p&gt;

&lt;blockquote&gt;
&lt;h4&gt;
  
  
  Signature &lt;code&gt;nonce&lt;/code&gt;s
&lt;/h4&gt;

&lt;p&gt;Let's say we have approved a third party to take 100 tokens from us by giving them a signature indicating the approval. What keeps them from just using the signature again and again to take 100s of tokens from us? This is called a "Signature Replay Attack", and should be migitated with making signatures "one use only".&lt;/p&gt;

&lt;p&gt;Adding a &lt;code&gt;nonce&lt;/code&gt; parameter to the message we are signing, assuming the contract has the correct implementation, will prevent Signature Replay Attacks, as now the contract will check if the supplied nonce is one higher than the previous.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So, we can call the &lt;code&gt;import&lt;/code&gt; function on the XLM Token Contract using&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;soroban invoke &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--id&lt;/span&gt; 71c670db8b9d9dd3fa17d83bd98e4a9814f926121972774bd419fa402fe01dc7 &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--fn&lt;/span&gt; import &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--arg&lt;/span&gt; &lt;span class="s1"&gt;'{"object":{"vec":[{"symbol":"Invoker"}]}}'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--arg&lt;/span&gt; 0 &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--arg&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;amount &lt;span class="k"&gt;in &lt;/span&gt;stroops]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note that the amount is again in &lt;code&gt;stroop&lt;/code&gt;s, meaning that we have to add seven 0s to convert them to Lumens.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2pkd08iglycx6i07rv1e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2pkd08iglycx6i07rv1e.png" alt="Importing Lumens"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We can go a step further and check out the amount of Lumens we have using the &lt;code&gt;balance&lt;/code&gt; function on the XLM Token Contract. The definition of the &lt;code&gt;balance&lt;/code&gt; function is&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;balance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Identifier&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;BigInt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;Identifier&lt;/code&gt; type is a type that indicates if the ID argument is from an EOA or a Contract. Since we are an EOA with a Public and Private key pair, we should use the &lt;code&gt;Account&lt;/code&gt; identifier on our argument. If you forgot how to calculate your account ID in hexadecimal using Python, here's a reminder:&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="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;stellar_sdk&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Keypair&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Keypair&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;from_public_key&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;[your public key]&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;raw_public_key&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;hex&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let's invoke the &lt;code&gt;balance&lt;/code&gt; function of the XLM Token Contract using&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;soroban invoke &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--id&lt;/span&gt; 71c670db8b9d9dd3fa17d83bd98e4a9814f926121972774bd419fa402fe01dc7 &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--fn&lt;/span&gt; balance &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--arg&lt;/span&gt; &lt;span class="s1"&gt;'{"object":{"vec":[{"symbol":"Account"},{"object":{"accountId":{"publicKeyTypeEd25519":"[your public key in hexadecimal]"}}}]}}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We will get a reply indicating our balance in &lt;code&gt;stroop&lt;/code&gt;s.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frm8xkeirqbukyqb6z921.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frm8xkeirqbukyqb6z921.png" alt="Parent Account's Balance"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;approve&lt;/code&gt;ing the &lt;code&gt;AllowanceContract&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;We now should permit the &lt;code&gt;AllowanceContract&lt;/code&gt; to use our Lumens. Note that we should not permit the Child account instead, as they should only be able to &lt;code&gt;withdraw&lt;/code&gt; using our contract.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;approve&lt;/code&gt; function's definition is&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;approve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;from&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Signature&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nonce&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;BigInt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;spender&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Identifier&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;BigInt&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This time the &lt;code&gt;Identifier&lt;/code&gt; will be of type contract, which will have the contract ID of our deployed contract as an input. Since we already know how to construct the other arguments, we can call the &lt;code&gt;approve&lt;/code&gt; function using&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;soroban invoke &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--id&lt;/span&gt; 71c670db8b9d9dd3fa17d83bd98e4a9814f926121972774bd419fa402fe01dc7 &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--fn&lt;/span&gt; approve &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--arg&lt;/span&gt; &lt;span class="s1"&gt;'{"object":{"vec":[{"symbol":"Invoker"}]}}'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--arg&lt;/span&gt; 0 &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--arg&lt;/span&gt; &lt;span class="s1"&gt;'{"object":{"vec":[{"symbol":"Contract"},{"object":{"bytes":"[your contract id]"}}]}}'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--arg&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;amount to approve]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you approve less than a &lt;code&gt;withdraw&lt;/code&gt; function would take at a time, it will fail. We can &lt;code&gt;approve&lt;/code&gt; the same amount of tokens we have allowed.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F89oakxw40p8uu5v2dw9n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F89oakxw40p8uu5v2dw9n.png" alt="Approval"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;withdraw&lt;/code&gt;ing to the Child Account
&lt;/h3&gt;

&lt;p&gt;After setting up the contract and giving out permissions, we now can invoke the &lt;code&gt;withdraw&lt;/code&gt; function in our contract using either the child account or our account. Note that anyone can call the &lt;code&gt;withdraw&lt;/code&gt; function, but the funds will only go to the Child account. For a difference, let's invoke the contract from the Child account. We just need to supply the Child account's Secret Key to &lt;code&gt;soroban&lt;/code&gt; CLI to invoke it from the Child account.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;soroban invoke &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--id&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;your contract &lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--fn&lt;/span&gt; withdraw &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--secret-key&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;child account&lt;span class="s1"&gt;'s secret key]
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We should see a success denoting the withdrawal has succeeded.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F78j4dvzbj8szkyoshqwk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F78j4dvzbj8szkyoshqwk.png" alt="Withdraw Function"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, let's check out the balance of the child account to see if the withdrawal actually worked.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;soroban invoke &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--id&lt;/span&gt; 71c670db8b9d9dd3fa17d83bd98e4a9814f926121972774bd419fa402fe01dc7 &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--fn&lt;/span&gt; balance &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--arg&lt;/span&gt; &lt;span class="s1"&gt;'{"object":{"vec":[{"symbol":"Account"},{"object":{"accountId":{"publicKeyTypeEd25519":"[child account'&lt;/span&gt;s public key &lt;span class="k"&gt;in &lt;/span&gt;hexadecimal]&lt;span class="s2"&gt;"}}}]}}'
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We should see a non-zero value for the Child account's balance! This value is also in &lt;code&gt;stroop&lt;/code&gt;s and will change with the arguments you have supplied to the &lt;code&gt;init&lt;/code&gt; function.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0gne8pv5vaoui8hscw4x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0gne8pv5vaoui8hscw4x.png" alt="Child Account's Balance"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;export&lt;/code&gt;ing Lumens Back
&lt;/h3&gt;

&lt;p&gt;Since the Child account has some Lumens now, we can &lt;code&gt;export&lt;/code&gt; them back to the Stellar network using the &lt;code&gt;export&lt;/code&gt; command of the XLM Token Contract. The &lt;code&gt;export&lt;/code&gt; function is defined as&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;export&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Signature&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nonce&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;BigInt&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;i64&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Similar to the &lt;code&gt;import&lt;/code&gt; function, we will build these arguments as JSON objects, and invoke the &lt;code&gt;export&lt;/code&gt; function from the Child account.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;soroban invoke &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--id&lt;/span&gt; 71c670db8b9d9dd3fa17d83bd98e4a9814f926121972774bd419fa402fe01dc7 &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--fn&lt;/span&gt; &lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--arg&lt;/span&gt; &lt;span class="s1"&gt;'{"object":{"vec":[{"symbol":"Invoker"}]}}'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--arg&lt;/span&gt; 0 &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--arg&lt;/span&gt; 100000 &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--secret-key&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;child account&lt;span class="s1"&gt;'s secret key]
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note that we can only export a maximum of the amount of Lumens that we have.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmwzzvlzpep0xnnclglor.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmwzzvlzpep0xnnclglor.png" alt="Exporting Lumens"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Success! Use &lt;code&gt;sq check 6&lt;/code&gt; to claim your reward 🎉!&lt;/p&gt;

&lt;h2&gt;
  
  
  Finishing Up
&lt;/h2&gt;

&lt;p&gt;This was the last quest of this series, and definitely was the hardest one to finish. You should be proud of yourself! We have accomplished many feats using the Soroban network, and learned a lot about blockchain design, cryptography primitives, and programming in general.&lt;/p&gt;

&lt;p&gt;I hope that you have enjoyed these posts, and learned some new information. The Stellar Quest series is always an incredible place to learn, so keep going on! Solve the Learn Quests, the Side Quests, and read the documentation.&lt;/p&gt;

&lt;p&gt;I hope to see you again for the next quest. See you around!&lt;/p&gt;

</description>
      <category>soroban</category>
      <category>stellar</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Soroban Quest - Custom Types</title>
      <dc:creator>Altuğ Bakan</dc:creator>
      <pubDate>Thu, 01 Dec 2022 06:00:00 +0000</pubDate>
      <link>https://forem.com/altug/soroban-quest-custom-types-5d54</link>
      <guid>https://forem.com/altug/soroban-quest-custom-types-5d54</guid>
      <description>&lt;p&gt;After successfully completing the complicated Cross Contract quest on &lt;a href="https://dev.to/altug/soroban-quest-cross-contract-kfg"&gt;last post&lt;/a&gt;, we are ready for the Custom Types quest. Beware though, this quest is quite long and challenging, just what we like!&lt;/p&gt;

&lt;p&gt;If you haven’t checked out the discussion on custom Soroban types, please take a look at the Using &lt;code&gt;get&lt;/code&gt; to Retrieve Data section on the &lt;a href="https://dev.to/altug/soroban-quest-auth-store-1aea"&gt;Auth Store&lt;/a&gt; tutorial.&lt;/p&gt;

&lt;h2&gt;
  
  
  Understanding &lt;code&gt;README.md&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Let's once again check out the &lt;code&gt;README.md&lt;/code&gt; file for this quest.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu17awbpz1m6vc1wiwti5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu17awbpz1m6vc1wiwti5.png" alt="README" width="800" height="130"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting Up Our Quest Account
&lt;/h2&gt;

&lt;p&gt;Use the usual commands, &lt;code&gt;sq login&lt;/code&gt; if required, and &lt;code&gt;sq play 5&lt;/code&gt; to start your adventure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Examining the Contract
&lt;/h2&gt;

&lt;p&gt;Let's start with checking out the &lt;code&gt;lib.rs&lt;/code&gt; file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;types&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="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;TypesContract&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nd"&gt;#[contractimpl]&lt;/span&gt;
&lt;span class="k"&gt;impl&lt;/span&gt; &lt;span class="n"&gt;TypesContract&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;c_rect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_rect&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Rectangle&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
    &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;c_animal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_animal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Animal&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
    &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;c_user&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
    &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;c_rgb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_rgb&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;RGB&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
    &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;c_color&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_val&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Color&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
    &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;c_part&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_participant&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Participant&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
    &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;c_card&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_card&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;RoyalCard&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It has some empty functions! The arguments of the functions are different types, which are seemingly imported from the &lt;code&gt;types.rs&lt;/code&gt; file, as there is the &lt;code&gt;use types::*;&lt;/code&gt; import up top.&lt;/p&gt;

&lt;p&gt;We won't add any functionality to this file, so let's check out the &lt;code&gt;types.rs&lt;/code&gt; file.&lt;/p&gt;

&lt;h2&gt;
  
  
  Filling Out &lt;code&gt;types.rs&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;types.rs&lt;/code&gt; file already has two examples: a &lt;code&gt;struct&lt;/code&gt; and an &lt;code&gt;enum&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="nd"&gt;#[contracttype]&lt;/span&gt;
&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;Cylinder&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;u32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;u32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;


&lt;span class="nd"&gt;#[contracttype]&lt;/span&gt;
&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;enum&lt;/span&gt; &lt;span class="n"&gt;Car&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Chevrolet&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;Ford&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;Mercedes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;Porsche&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;Honda&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;Toyota&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;h4&gt;
  
  
  Using Custom Types
&lt;/h4&gt;

&lt;p&gt;The &lt;code&gt;struct&lt;/code&gt;s are used for creating objects that have multiple different values. These values can consist of basic types like &lt;code&gt;u32&lt;/code&gt; and &lt;code&gt;Bytes&lt;/code&gt;, another &lt;code&gt;struct&lt;/code&gt;s, &lt;code&gt;enum&lt;/code&gt;s, &lt;code&gt;array&lt;/code&gt;s, and so on. The &lt;code&gt;struct&lt;/code&gt;s allow us to carry all properties of an object together on a single variable. Well, it is useful to pass a &lt;code&gt;Car&lt;/code&gt; struct to a &lt;code&gt;insert_to_garage&lt;/code&gt; function instead of &lt;code&gt;tires&lt;/code&gt;, &lt;code&gt;engine&lt;/code&gt;, &lt;code&gt;color&lt;/code&gt;, &lt;code&gt;fuel_type&lt;/code&gt;, &lt;code&gt;license_plate&lt;/code&gt;, &lt;code&gt;total_kilometers&lt;/code&gt;...&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;enum&lt;/code&gt;s are used for creating numeric types with names for a limited list. It is mostly useful for programmers, as trying to remember the ID of a student in a classroom might not be helpful, but you would know who &lt;code&gt;Bob&lt;/code&gt; is. The compiler is not interested in those names, and will happily use their numeric values in your code.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;We have a lot of empty &lt;code&gt;struct&lt;/code&gt;s and &lt;code&gt;enum&lt;/code&gt;s, waiting for us to implement them. Before starting out, please check out the &lt;a href="https://soroban.stellar.org/docs/learn/custom-types" rel="noopener noreferrer"&gt;Custom Types&lt;/a&gt; section from the &lt;a href="https://soroban.stellar.org/docs" rel="noopener noreferrer"&gt;Soroban Docs&lt;/a&gt; to learn more about the type system of Soroban.&lt;/p&gt;

&lt;h3&gt;
  
  
  Implementing &lt;code&gt;Rectangle&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Let's start with implementing the &lt;code&gt;Rectangle&lt;/code&gt; &lt;code&gt;struct&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="nd"&gt;#[contracttype]&lt;/span&gt;
&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;Rectangle&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// TODO: create your fields here for your `Rectangle` type&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;From &lt;code&gt;README.md&lt;/code&gt;, we can see that &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The &lt;code&gt;Rectangle&lt;/code&gt; type must be a &lt;code&gt;struct&lt;/code&gt;, with two fields: &lt;code&gt;width&lt;/code&gt; and &lt;code&gt;height&lt;/code&gt; which both must be a &lt;code&gt;u32&lt;/code&gt; value.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So, we can implement &lt;code&gt;Rectangle&lt;/code&gt; as follows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;Rectangle&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;u32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;u32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Implementing &lt;code&gt;Animal&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Next, let's check out the &lt;code&gt;Animal&lt;/code&gt; &lt;code&gt;enum&lt;/code&gt;. From &lt;code&gt;README.md&lt;/code&gt;, we can see that&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The &lt;code&gt;Animal&lt;/code&gt; type must be an &lt;code&gt;enum&lt;/code&gt;, with at least two variations: &lt;code&gt;Cat&lt;/code&gt; and &lt;code&gt;Dog&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So, we can implement &lt;code&gt;Animal&lt;/code&gt; as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;enum&lt;/span&gt; &lt;span class="n"&gt;Animal&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Dog&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;Cat&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;Bear&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;Wolf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;Gorilla&lt;/span&gt; &lt;span class="cm"&gt;/* and many more */&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Implementing &lt;code&gt;User&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Let's move on to the &lt;code&gt;User&lt;/code&gt; struct. Again, from &lt;code&gt;README.md&lt;/code&gt;, we see that&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The &lt;code&gt;User&lt;/code&gt; type must be a &lt;code&gt;struct&lt;/code&gt; with &lt;code&gt;name&lt;/code&gt;, &lt;code&gt;age&lt;/code&gt;, and &lt;code&gt;pet&lt;/code&gt; fields, corresponding to &lt;code&gt;Bytes&lt;/code&gt;, &lt;code&gt;u32&lt;/code&gt;, and &lt;code&gt;Animal&lt;/code&gt; values, respectively.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Let's implement the &lt;code&gt;User&lt;/code&gt; type. It consists of another &lt;code&gt;struct&lt;/code&gt;, but that's nothing hard to implement.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;User&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Bytes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;u32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;pet&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Animal&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Implementing &lt;code&gt;RGB&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;We are almost halfway done! Let's now implement the &lt;code&gt;RGB&lt;/code&gt; &lt;code&gt;struct&lt;/code&gt;. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The &lt;code&gt;RGB&lt;/code&gt; type must be a tuple &lt;code&gt;struct&lt;/code&gt; type made with a tuple of 3 &lt;code&gt;u32&lt;/code&gt; values.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Since it should be defined using &lt;em&gt;unnamed&lt;/em&gt; &lt;code&gt;u32&lt;/code&gt; types, we can define it as a &lt;code&gt;tuple&lt;/code&gt; using the following definition.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="nd"&gt;#[contracttype]&lt;/span&gt;
&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="nf"&gt;RGB&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="nb"&gt;u32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="nb"&gt;u32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="nb"&gt;u32&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Implementing &lt;code&gt;Color&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;More than halfway done! Now, we must implement the &lt;code&gt;Color&lt;/code&gt; &lt;code&gt;enum&lt;/code&gt;, using the following definiton.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The &lt;code&gt;Color&lt;/code&gt; type will combine the &lt;code&gt;RGB&lt;/code&gt; custom type nested within a tuple &lt;code&gt;enum&lt;/code&gt; type. Construct your &lt;code&gt;RGB&lt;/code&gt; struct type as described bove, Then, your &lt;code&gt;Color&lt;/code&gt; enum type must be defined as a variant with a name of "RGB" and an instance of your &lt;code&gt;RGB&lt;/code&gt; type.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;An &lt;code&gt;enum&lt;/code&gt;s type definitions can be of any type, including custom &lt;code&gt;struct&lt;/code&gt;s.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;enum&lt;/span&gt; &lt;span class="n"&gt;Color&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;RGB&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;RGB&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Implementing &lt;code&gt;Participant&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Almost done! We now need to implement the &lt;code&gt;Participant&lt;/code&gt; &lt;code&gt;enum&lt;/code&gt; type. The definition is&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The &lt;code&gt;Participant&lt;/code&gt; type must be an &lt;code&gt;enum&lt;/code&gt; with single-value tuple variants as follows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;An "Account" variant with an &lt;code&gt;AccountId&lt;/code&gt; type&lt;/li&gt;
&lt;li&gt;A "Contract" variant with a &lt;code&gt;BytesN&amp;lt;32&amp;gt;&lt;/code&gt; type&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;So, &lt;code&gt;Participant&lt;/code&gt; should be composed from two different Soroban types: &lt;code&gt;AccountId&lt;/code&gt;, and &lt;code&gt;BytesN&amp;lt;32&amp;gt;&lt;/code&gt;. Since we know how to implement custom types on &lt;code&gt;enum&lt;/code&gt;s, let's go ahead and define the &lt;code&gt;Participant&lt;/code&gt; &lt;code&gt;enum&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;enum&lt;/span&gt; &lt;span class="n"&gt;Participant&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;Contract&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BytesN&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nf"&gt;Account&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;AccountId&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Implementing &lt;code&gt;RoyalCard&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Only one left! We now just need to implement the &lt;code&gt;RoyalCard&lt;/code&gt; &lt;code&gt;enum&lt;/code&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The &lt;code&gt;RoyalCard&lt;/code&gt; type must be an &lt;code&gt;enum&lt;/code&gt; containing three &lt;code&gt;u32&lt;/code&gt; integer variations as follows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A "Jack" variant, with a value of 11&lt;/li&gt;
&lt;li&gt;A "Queen" variant, with a value of 12&lt;/li&gt;
&lt;li&gt;A "King" variant, with a value of 13&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;It is quite simple to define an &lt;code&gt;enum&lt;/code&gt; with given values, so we can implement it as follows.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="nd"&gt;#[repr(u32)]&lt;/span&gt;
&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;enum&lt;/span&gt; &lt;span class="n"&gt;RoyalCard&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Jack&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;Queen&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;King&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;13&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;#[repr(u32)]&lt;/code&gt; attribute tells the compiler to pack each &lt;code&gt;enum&lt;/code&gt; element into an 32 bit memory slot, which is the size of an &lt;code&gt;u32&lt;/code&gt; variable.&lt;/p&gt;

&lt;p&gt;We have accomplished quite much! But the quest isn't over, since we still have to invoke the "empty" functions successfully using &lt;code&gt;soroban&lt;/code&gt; CLI. To learn more about how we can invoke those functions, let's check out the &lt;code&gt;test.rs&lt;/code&gt; file.&lt;/p&gt;

&lt;h2&gt;
  
  
  Examining the Test
&lt;/h2&gt;

&lt;p&gt;The test has only one function, &lt;code&gt;test_types&lt;/code&gt;, which tests the types of all of the custom &lt;code&gt;struct&lt;/code&gt;s and &lt;code&gt;enum&lt;/code&gt;s we have created by constructing the corresponding type, and calling the corresponding function. Let's check if our implementations of the custom types are correct using&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cargo &lt;span class="nb"&gt;test&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; soroban-custom-types-contract
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fej74b7td8gyugx3pb5js.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fej74b7td8gyugx3pb5js.png" alt="Custom Types Test" width="724" height="113"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Success!&lt;/p&gt;

&lt;h2&gt;
  
  
  Solving the Quest
&lt;/h2&gt;

&lt;p&gt;Now, we can try to solve the quest by creating the arguments to invoke each function on the implementation of our Soroban contract. &lt;/p&gt;

&lt;h3&gt;
  
  
  Deploying the Contract
&lt;/h3&gt;

&lt;p&gt;Before we start invoking, let's deploy our contract using&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cargo build &lt;span class="nt"&gt;--target&lt;/span&gt; wasm32-unknown-unknown &lt;span class="nt"&gt;--release&lt;/span&gt;
soroban deploy &lt;span class="nt"&gt;--wasm&lt;/span&gt; target/wasm32-unknown-unknown/release/soroban_custom_types_contract.wasm
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3ypg8t515gxpuras2sh3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3ypg8t515gxpuras2sh3.png" alt="Contract Deployment" width="800" height="44"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Invoking &lt;code&gt;c_rect&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;First, we have to call the &lt;code&gt;c_rect&lt;/code&gt; function, which has the argument &lt;code&gt;_rect&lt;/code&gt; of type &lt;code&gt;Rectangle&lt;/code&gt;. If we check out the &lt;code&gt;README.md&lt;/code&gt; file, we see that we can&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Invoke the &lt;code&gt;c_rect&lt;/code&gt; function to create a &lt;code&gt;Rectangle&lt;/code&gt; using something like:&lt;/p&gt;


&lt;pre class="highlight shell"&gt;&lt;code&gt;soroban invoke &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--id&lt;/span&gt; &amp;lt;contract-id&amp;gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--fn&lt;/span&gt; c_rect &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--arg&lt;/span&gt; &lt;span class="s1"&gt;'{"object":{"map":[{"key":{"symbol":"width"},"val":{"u32":&amp;lt;a-u32-integer&amp;gt;}},{"key":{"symbol":"height"},"val":{"u32":&amp;lt;a-u32-integer&amp;gt;}}]}}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/blockquote&gt;

&lt;p&gt;We can see that we should change the values for the sections marked with &lt;code&gt;&amp;lt;a-u32-integer&amp;gt;&lt;/code&gt; to an actual &lt;code&gt;u32&lt;/code&gt; integer, and &lt;code&gt;&amp;lt;contract-id&amp;gt;&lt;/code&gt; to our contract ID. You can choose any &lt;code&gt;height&lt;/code&gt; or &lt;code&gt;width&lt;/code&gt; for your &lt;code&gt;rectangle&lt;/code&gt;. After you are happy with your choices, invoke the contract.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;soroban invoke &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--id&lt;/span&gt; &amp;lt;contract-id&amp;gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--fn&lt;/span&gt; c_rect &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--arg&lt;/span&gt; &lt;span class="s1"&gt;'{"object":{"map":[{"key":{"symbol":"width"},"val":{"u32":&amp;lt;a-u32-integer&amp;gt;}},{"key":{"symbol":"height"},"val":{"u32":&amp;lt;a-u32-integer&amp;gt;}}]}}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvbsmh8575go4g2tjogyj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvbsmh8575go4g2tjogyj.png" alt="Invoke c_rect" width="800" height="96"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Invoking &lt;code&gt;c_animal&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;After successfully invoking the &lt;code&gt;c_rect&lt;/code&gt; function, we now will move on to the &lt;code&gt;c_animal&lt;/code&gt; function. From &lt;code&gt;README.md&lt;/code&gt;, we can&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Invoke the &lt;code&gt;c_animal&lt;/code&gt; function to create an &lt;code&gt;Animal&lt;/code&gt; using something like:&lt;/p&gt;


&lt;pre class="highlight shell"&gt;&lt;code&gt;soroban invoke &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--id&lt;/span&gt; &amp;lt;contract-id&amp;gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--fn&lt;/span&gt; c_animal &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--arg&lt;/span&gt; &lt;span class="s1"&gt;'{"object":{"vec":[{"symbol":"&amp;lt;a-relevant-animal-symbol&amp;gt;"}]}}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/blockquote&gt;

&lt;p&gt;Again, we should change the &lt;code&gt;&amp;lt;contract-id&amp;gt;&lt;/code&gt; to our contract ID, and &lt;code&gt;&amp;lt;a-relevant-animal-symbol&amp;gt;&lt;/code&gt; to an animal &lt;code&gt;enum&lt;/code&gt; we have created. Since the &lt;code&gt;Animal&lt;/code&gt; struct is a custom type we have created, we should create the corresponding object as a JSON.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw0j3jyr3skj9crfqjcfm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw0j3jyr3skj9crfqjcfm.png" alt="Invoke c_animal" width="525" height="102"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Invoking &lt;code&gt;c_user&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Now, it's &lt;code&gt;c_user&lt;/code&gt; function's turn. Again, checking out &lt;code&gt;README.md&lt;/code&gt;, we see that we could&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Invoke the &lt;code&gt;c_user&lt;/code&gt; function to create a &lt;code&gt;User&lt;/code&gt; using something like:&lt;/p&gt;


&lt;pre class="highlight shell"&gt;&lt;code&gt;soroban invoke &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--id&lt;/span&gt; &amp;lt;contract-id&amp;gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--fn&lt;/span&gt; c_user &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--arg&lt;/span&gt; &lt;span class="s1"&gt;'{"object":{"map":[{"key":{"symbol":"name"},"val":{"object":{"bytes":"&amp;lt;a-hex-encoded-string&amp;gt;"}}},{"key":{"symbol":"age"},"val":{"u32":&amp;lt;a-u32-integer&amp;gt;}},{"key":&amp;gt; {"symbol":"pet"},"val":&amp;lt;an-animal-object&amp;gt;}]}}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/blockquote&gt;

&lt;p&gt;That's quite the prompt! We should find the hexadecimal encoded &lt;code&gt;string&lt;/code&gt; of a name, change the &lt;code&gt;&amp;lt;a-u32-integer&amp;gt;&lt;/code&gt; to an age, and &lt;code&gt;&amp;lt;an-animal-object&amp;gt;&lt;/code&gt; to the JSON representation of an animal object.&lt;/p&gt;

&lt;p&gt;Remember that we could use the same &lt;code&gt;Dog&lt;/code&gt; object that we used for the &lt;code&gt;c_animal&lt;/code&gt; invocation, but feel free to use any animal you'd like.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz5d7bbmerumov9v4ncdo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz5d7bbmerumov9v4ncdo.png" alt="Invoke c_user" width="800" height="93"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Invoking &lt;code&gt;c_rgb&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;That one was the hardest! Now, we can invoke the &lt;code&gt;c_rgb&lt;/code&gt; function. Again, if we check out &lt;code&gt;README.md&lt;/code&gt;, we will see that we can&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Invoke the &lt;code&gt;c_rgb&lt;/code&gt; function to create a &lt;code&gt;RGB&lt;/code&gt; value using something like:&lt;/p&gt;


&lt;pre class="highlight shell"&gt;&lt;code&gt;soroban invoke &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--id&lt;/span&gt; &amp;lt;contract-id&amp;gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--fn&lt;/span&gt; c_rgb &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--arg&lt;/span&gt; &lt;span class="s1"&gt;'{"object":{"vec":[{"u32":&amp;lt;a-u32-integer&amp;gt;},{"u32":&amp;lt;a-u32-integer&amp;gt;},{"u32":&amp;lt;a-u32-integer&amp;gt;}]}}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/blockquote&gt;

&lt;p&gt;We again have to change the &lt;code&gt;&amp;lt;a-u32-integer&amp;gt;&lt;/code&gt; values to any integer values that we'd like.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxbnbeo52gq6v4qf88wkn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxbnbeo52gq6v4qf88wkn.png" alt="Invoke c_rgb" width="524" height="101"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Invoking &lt;code&gt;c_color&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Keep going! Now, we can try invoking the &lt;code&gt;c_color&lt;/code&gt; function. The &lt;code&gt;README.md&lt;/code&gt; file states that we should&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Invoke the &lt;code&gt;c_color&lt;/code&gt; function to create a &lt;code&gt;Color&lt;/code&gt; using something like:&lt;/p&gt;


&lt;pre class="highlight shell"&gt;&lt;code&gt;soroban invoke &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--id&lt;/span&gt; &amp;lt;contract-id&amp;gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--fn&lt;/span&gt; c_color &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--arg&lt;/span&gt; &lt;span class="s1"&gt;'{"object":{"vec":[{"symbol":"RGB"},&amp;lt;a-rgb-object&amp;gt;]}}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/blockquote&gt;

&lt;p&gt;where &lt;code&gt;&amp;lt;a-rgb-object&amp;gt;&lt;/code&gt; should be a JSON object representation of the &lt;code&gt;RGB&lt;/code&gt; struct. Try to construct the object without looking below!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4udei8tozyh1jeek87c0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4udei8tozyh1jeek87c0.png" alt="Invoke c_color" width="725" height="102"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Invoking &lt;code&gt;c_part&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;You are close! Now it's time to call the &lt;code&gt;c_part&lt;/code&gt; function. Let's check out the &lt;code&gt;README.md&lt;/code&gt; file once more.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Invoke the &lt;code&gt;c_part&lt;/code&gt; function to create an account &lt;code&gt;Participant&lt;/code&gt; using something like:&lt;/p&gt;


&lt;pre class="highlight shell"&gt;&lt;code&gt;soroban invoke &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--id&lt;/span&gt; &amp;lt;contract-id&amp;gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--fn&lt;/span&gt; c_part &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--arg&lt;/span&gt; &lt;span class="s1"&gt;'{"object":{"vec":[{"symbol":"Account"},{"object":{"accountId":{"publicKeyTypeEd25519":"&amp;lt;hex-encoded-account-id&amp;gt;"}}}]}}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;Also invoke the &lt;code&gt;c_part&lt;/code&gt; function to create a contract &lt;code&gt;Participant&lt;/code&gt; using something like:&lt;/p&gt;


&lt;pre class="highlight shell"&gt;&lt;code&gt;soroban invoke &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--id&lt;/span&gt; &amp;lt;contract-id&amp;gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--fn&lt;/span&gt; c_part &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--arg&lt;/span&gt; &lt;span class="s1"&gt;'{"object":{"vec":[{"symbol":"Contract"},{"object":{"bytes":"&amp;lt;contract-id&amp;gt;"}}]}}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/blockquote&gt;

&lt;p&gt;Do you remember how to obtain your hexadecimal encoded public key? (Hint: using Python!). Try to find out what to put into &lt;code&gt;&amp;lt;hex-encoded-account-id&amp;gt;&lt;/code&gt;. The &lt;code&gt;&amp;lt;contract-id&amp;gt;&lt;/code&gt; parameter is pretty simple, as we have been using that one for all function invocations that we have done.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcspqfsyj676wr027m3en.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcspqfsyj676wr027m3en.png" alt="Invoke c_part" width="800" height="241"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Invoking &lt;code&gt;c_card&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Last one! You should be pretty tired at this point, but bear with me. Luckily, the last invocation is quite simple, as we only have to&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Invoke the &lt;code&gt;c_card&lt;/code&gt; function using something like:&lt;/p&gt;


&lt;pre class="highlight shell"&gt;&lt;code&gt;soroban invoke &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--id&lt;/span&gt; &amp;lt;contract-id&amp;gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--fn&lt;/span&gt; c_foo &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--arg&lt;/span&gt; &lt;span class="s1"&gt;'{"u32":&amp;lt;a-u32-integer&amp;gt;}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/blockquote&gt;

&lt;p&gt;Remember that the &lt;code&gt;u32&lt;/code&gt; argument should be one of 11, 12, or 13, as we only defined those values. And &lt;code&gt;c_foo&lt;/code&gt; should be &lt;code&gt;c_card&lt;/code&gt;, if that wasn't clear.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjn4ngf8ydlms13vg15fc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjn4ngf8ydlms13vg15fc.png" alt="Invoke c_card" width="524" height="103"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;verify&lt;/code&gt;ing Our Implementation
&lt;/h3&gt;

&lt;p&gt;That was a lot of invocations! Finally, we must invoke the &lt;code&gt;verify&lt;/code&gt; function of the verification contract &lt;code&gt;40d12b03a08f5dde4e0068aa752fa65eddf905e82a18f522efe350e0cd268b8a&lt;/code&gt; to make the verification contract verify the correctness of our deployed contract. Can you guess which argument we should supply? If you guessed the contract ID of the contract we have deployed, you are right! We can use&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;soroban invoke &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--id&lt;/span&gt; 40d12b03a08f5dde4e0068aa752fa65eddf905e82a18f522efe350e0cd268b8a &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--fn&lt;/span&gt; verify &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--arg&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;your-contract-id]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We should get a reply indicating that all of our custom implementations have succeeded, and none of them have failed.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff9czm7hvz5pcaww2p7y5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff9czm7hvz5pcaww2p7y5.png" alt="Invoke Verify" width="800" height="84"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nicely done! You have definitely earned your reward! Use &lt;code&gt;sq check 5&lt;/code&gt; to claim your reward 🎉!&lt;/p&gt;

</description>
      <category>watercooler</category>
    </item>
    <item>
      <title>Soroban Quest - Cross Contract</title>
      <dc:creator>Altuğ Bakan</dc:creator>
      <pubDate>Sat, 26 Nov 2022 16:41:21 +0000</pubDate>
      <link>https://forem.com/altug/soroban-quest-cross-contract-kfg</link>
      <guid>https://forem.com/altug/soroban-quest-cross-contract-kfg</guid>
      <description>&lt;p&gt;We have tackled the Reverse Engineer quest on the &lt;a href="https://dev.to/altug/soroban-quest-reverse-engineer-a95"&gt;last post&lt;/a&gt;, and are ready for the next quest, Cross Contract.&lt;/p&gt;

&lt;h2&gt;
  
  
  Understanding &lt;code&gt;README.md&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;As always, let's check out the &lt;code&gt;README.md&lt;/code&gt; file on the quest folder.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fui0pq2qk7fab4ub2a1uc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fui0pq2qk7fab4ub2a1uc.png" alt="README" width="800" height="102"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On this quest, we are tasked with deploying the &lt;code&gt;CrossContractCall&lt;/code&gt; contract, and use it to interact with the &lt;code&gt;DataStore&lt;/code&gt; contract we worked on the Auth Store quest.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting Up Our Quest Account
&lt;/h2&gt;

&lt;p&gt;You should be pretty familiar with this concept by now. Use &lt;code&gt;sq login&lt;/code&gt; if you haven't, and &lt;code&gt;sq play 4&lt;/code&gt; to start this quest.&lt;/p&gt;

&lt;h2&gt;
  
  
  Examining the Contract
&lt;/h2&gt;

&lt;p&gt;Let's check out the contract's source code on &lt;code&gt;lib.rs&lt;/code&gt; to learn more about this quest.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;mod&lt;/span&gt; &lt;span class="n"&gt;storage_contract&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nn"&gt;soroban_sdk&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nd"&gt;contractimport!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"../../target/wasm32-unknown-unknown/release/soroban_auth_store_contract.wasm"&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;trait&lt;/span&gt; &lt;span class="n"&gt;StorageCallTrait&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;inv_get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;store_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;BytesN&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&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="n"&gt;AccountId&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Bytes&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;CrossContractCallContract&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nd"&gt;#[contractimpl]&lt;/span&gt;
&lt;span class="k"&gt;impl&lt;/span&gt; &lt;span class="n"&gt;StorageCallTrait&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;CrossContractCallContract&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;inv_get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;store_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;BytesN&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&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="n"&gt;AccountId&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Bytes&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;storage_client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;storage_contract&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;store_id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;storage_client&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;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;owner&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There are some new concepts on the source code. Let's examine them one by one.&lt;/p&gt;

&lt;h3&gt;
  
  
  Contract Import
&lt;/h3&gt;

&lt;p&gt;Previously, we used the &lt;code&gt;mod&lt;/code&gt; keyword to include the &lt;code&gt;test.rs&lt;/code&gt; file, or the &lt;code&gt;error.rs&lt;/code&gt; contract into our code. These files had their source code ready for importing, and we used them for developing our contract.&lt;/p&gt;

&lt;p&gt;Using &lt;code&gt;soroban_sdk::contractimport!&lt;/code&gt; macro is quite different, as we are now importing a precompiled contract. The &lt;code&gt;soroban_sdk&lt;/code&gt; can use the imported contract's types, interface, and the client in the imported source code this way.&lt;/p&gt;

&lt;h3&gt;
  
  
  Contract Traits
&lt;/h3&gt;

&lt;p&gt;We can define traits for contracts using the &lt;code&gt;trait&lt;/code&gt; keyword. This can be thought as an &lt;em&gt;abstract&lt;/em&gt; class, meaning that it has the interface but not the source code of its subclasses. On the source code of the &lt;code&gt;CrossContractCallContract&lt;/code&gt;, we have&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;trait&lt;/span&gt; &lt;span class="n"&gt;StorageCallTrait&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;inv_get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;store_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;BytesN&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&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="n"&gt;AccountId&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Bytes&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;which means that every contract that implements the &lt;code&gt;StorageCallTrait&lt;/code&gt; should implement a function, &lt;code&gt;inv_get&lt;/code&gt;, which has the parameters &lt;code&gt;env&lt;/code&gt;, &lt;code&gt;store_id&lt;/code&gt;, &lt;code&gt;owner&lt;/code&gt;, and returns a &lt;code&gt;Bytes&lt;/code&gt; result.&lt;/p&gt;

&lt;blockquote&gt;
&lt;h4&gt;
  
  
  Why Do We Need Traits?
&lt;/h4&gt;

&lt;p&gt;Since interoperability is a basic feature of smart contract blockchains, there are some standards that people use for easier interoperability. Let's say we have a token trait, which implements the &lt;code&gt;send&lt;/code&gt;, &lt;code&gt;recv_from&lt;/code&gt;, and &lt;code&gt;balance_of&lt;/code&gt; traits. If we have such a standard, we can develop a token marketplace for all tokens that use this standard. Actually, most of the tokens you see everywhere implements the &lt;a href="https://ethereum.org/en/developers/docs/standards/tokens/erc-20/" rel="noopener noreferrer"&gt;ERC-20 Token Standard&lt;/a&gt; created by Ethereum developers!&lt;/p&gt;

&lt;p&gt;If we didn't have such standards exist, the exchange developers would have to support every implementation that exist on a smart contract blockchain, which would be harmful for anyone's time, and would raise various security concerns.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;After creating a &lt;code&gt;trait&lt;/code&gt;, we can import it to our contract using&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;impl&lt;/span&gt; &lt;span class="n"&gt;StorageCallTrait&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;CrossContractCallContract&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// code implementing inv_get here&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If we fail to implement the &lt;code&gt;inv_get&lt;/code&gt; function, the Rust compiler would give an error such as&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvyun74tvswoh38g13kl4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvyun74tvswoh38g13kl4.png" alt="Trait Error" width="725" height="149"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Very handy for developing contracts!&lt;/p&gt;

&lt;h3&gt;
  
  
  Overall View
&lt;/h3&gt;

&lt;p&gt;After getting to know about the new concepts on the contract, we can start checking out what the contract does.&lt;/p&gt;

&lt;p&gt;There is only one function on the contract implementation, which is &lt;code&gt;inv_get&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;inv_get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;store_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;BytesN&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&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="n"&gt;AccountId&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Bytes&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;storage_client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;storage_contract&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;store_id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;storage_client&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;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;owner&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It simply uses the imported &lt;code&gt;StorageContract&lt;/code&gt;'s &lt;code&gt;get&lt;/code&gt; function to return the data that exists on that contract for an address.&lt;/p&gt;

&lt;h2&gt;
  
  
  Examining the Test
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;test.rs&lt;/code&gt; file has one test function, &lt;code&gt;get_cross_call&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="k"&gt;crate&lt;/span&gt;&lt;span class="p"&gt;::{&lt;/span&gt;&lt;span class="n"&gt;storage_contract&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;CrossContractCallContract&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;CrossContractCallContractClient&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="nd"&gt;#[test]&lt;/span&gt;
&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;get_cross_call&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Env&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;default&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;storage_contract_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="nf"&gt;.register_contract_wasm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nn"&gt;storage_contract&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;WASM&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;storage_contract_client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;storage_contract&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;storage_contract_id&lt;/span&gt;&lt;span class="nf"&gt;.clone&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;

    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;cross_call_contract_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="nf"&gt;.register_contract&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;CrossContractCallContract&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;cross_call_contract_client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
        &lt;span class="nn"&gt;CrossContractCallContractClient&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cross_call_contract_id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;u1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="nf"&gt;.accounts&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="nf"&gt;.generate&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="nf"&gt;.set_source_account&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;u1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;storage_contract_client&lt;/span&gt;&lt;span class="nf"&gt;.put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nd"&gt;bytes!&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0x48656c6c6f20536f726f62616e21&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;

    &lt;span class="nd"&gt;assert_eq!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;cross_call_contract_client&lt;/span&gt;&lt;span class="nf"&gt;.inv_get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;storage_contract_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;u1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="nd"&gt;bytes!&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0x48656c6c6f20536f726f62616e21&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We have an interesting line here, &lt;code&gt;use crate::{storage_contract, CrossContractCallContract, CrossContractCallContractClient};&lt;/code&gt;, which imports the types from the &lt;code&gt;lib.rs&lt;/code&gt; file. Since Rust modules are called &lt;code&gt;crate&lt;/code&gt;s, we import the &lt;code&gt;crate&lt;/code&gt;s from the contract implementation to use them in tests. Or, we could just use &lt;code&gt;use super::*&lt;/code&gt; as previous tests did.&lt;/p&gt;

&lt;blockquote&gt;
&lt;h4&gt;
  
  
  Using Specific Classes vs All Classes
&lt;/h4&gt;

&lt;p&gt;Using &lt;code&gt;use super::*&lt;/code&gt; instead of importing the &lt;code&gt;crate&lt;/code&gt;s used one by one might look easier, but later could cause some serious headache when the code grows in complexity. If we import &lt;strong&gt;everything&lt;/strong&gt; from the parent implementation, we would have to use the names, types, and anything implemented on &lt;em&gt;that&lt;/em&gt; contract only. For example, we could have problems if we tried to import another implementation of the &lt;code&gt;storage_contract&lt;/code&gt; with additional functionality for testing. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Since we have examined lots of tests until now, I think you now understand what this test does. It first deploys the &lt;code&gt;storage_contract&lt;/code&gt; and the &lt;code&gt;cross_call_contract&lt;/code&gt; into the testing sandbox we use, then, creates a test user to &lt;code&gt;put&lt;/code&gt; a value into the &lt;code&gt;storage_contract&lt;/code&gt;. After &lt;code&gt;put&lt;/code&gt;ting a value, we can now assert that our &lt;code&gt;cross_call_contract&lt;/code&gt; returns the same result that was &lt;code&gt;put&lt;/code&gt; into the &lt;code&gt;storage_contract&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Solving the Quest
&lt;/h2&gt;

&lt;p&gt;Since we are tasked with deploying the &lt;code&gt;DataStoreContract&lt;/code&gt; again, let's use the commands we used on the Auth Store quest to deploy them using current quest's account.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cargo build &lt;span class="nt"&gt;--target&lt;/span&gt; wasm32-unknown-unknown &lt;span class="nt"&gt;--release&lt;/span&gt;
soroban deploy &lt;span class="nt"&gt;--wasm&lt;/span&gt; target/wasm32-unknown-unknown/release/soroban_auth_store_contract.wasm
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After we deploy the &lt;code&gt;DataStoreContract&lt;/code&gt;, let's invoke the &lt;code&gt;put&lt;/code&gt; function to put some data into the contract.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;soroban invoke &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--id&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;the ID of your DataStoreContract] &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--fn&lt;/span&gt; put &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--arg&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;hexadecimal value longer than 10 bytes]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpeh4mgwbwgk8scwgtwqo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpeh4mgwbwgk8scwgtwqo.png" alt="Deploy Data Store and Put Data" width="800" height="158"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The first part of the quest is done! For the second part, we should first deploy the &lt;code&gt;CrossContractCallContract&lt;/code&gt; to Soroban Futurenet.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;soroban deploy &lt;span class="nt"&gt;--wasm&lt;/span&gt; target/wasm32-unknown-unknown/release/soroban_cross_contract_call_contract.wasm
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0z5xoj1y263r5c52tqke.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0z5xoj1y263r5c52tqke.png" alt="Cross Contract Call Contract Deployment" width="800" height="41"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then, we need to find what the required function arguments are. The first argument we need to supply is &lt;code&gt;store_id&lt;/code&gt;, which is of type &lt;code&gt;BytesN&amp;lt;32&amp;gt;&lt;/code&gt;. This corresponds to the &lt;code&gt;DataStoreContract&lt;/code&gt;'s ID, which consists of 32 bytes, represented in hexadecimal values. The second argument is &lt;code&gt;owner&lt;/code&gt;, of type &lt;code&gt;AccountId&lt;/code&gt;. Recall that we used the &lt;code&gt;AccountId&lt;/code&gt; type when solving the second quest using the &lt;code&gt;get&lt;/code&gt; function. The idea is the same, we should create the JSON representation of the complex type &lt;code&gt;AccountId&lt;/code&gt;. We can use the same Python script to find out our raw public key in hexadecimal format.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;soroban invoke &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--id&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;the ID of your CrossContractCallContract] &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--fn&lt;/span&gt; inv_get &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--arg&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;the ID of your DataStoreContract] &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--arg&lt;/span&gt; &lt;span class="s1"&gt;'{"object": { "accountId": { "publicKeyTypeEd25519": "[your raw public key in hexadecimal format]" } } }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fub6zne7sd880bdocxm3y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fub6zne7sd880bdocxm3y.png" alt="Successful Inv Get Call" width="800" height="227"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Success! That was quite hard, and you should be proud of yourself. This quest combined almost all of the concepts of previous quests, so your success is well deserved! Use &lt;code&gt;sq check 4&lt;/code&gt; to claim your reward 🎉!&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>learning</category>
    </item>
    <item>
      <title>Soroban Quest - Reverse Engineer</title>
      <dc:creator>Altuğ Bakan</dc:creator>
      <pubDate>Sat, 26 Nov 2022 12:31:02 +0000</pubDate>
      <link>https://forem.com/altug/soroban-quest-reverse-engineer-a95</link>
      <guid>https://forem.com/altug/soroban-quest-reverse-engineer-a95</guid>
      <description>&lt;p&gt;The Auth Store Quest we solved on the &lt;a href="https://dev.to/altug/soroban-quest-auth-store-1aea"&gt;last post&lt;/a&gt; was quite the feat! We will now tackle the next quest: Reverse Engineer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Understanding &lt;code&gt;README.md&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;As always, let's open the &lt;code&gt;README.md&lt;/code&gt; file in the &lt;code&gt;3-reverse-engineer&lt;/code&gt; folder and take a look.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F27j6i4tv01fff6ch1qbi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F27j6i4tv01fff6ch1qbi.png" alt="README" width="800" height="98"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This quest is quite different! We are tasked with finding the contract ID of the already deployed contract. We have an important tip though, we are given the deployer account's public key, which is &lt;code&gt;GAC7HE4PQWI7H34JQN6QLQ7Y7NTAUZDWJZ4SJ6GXVC4K2DN7N65K5NLI&lt;/code&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;h4&gt;
  
  
  The Concept of Public Ledgers
&lt;/h4&gt;

&lt;p&gt;Since we are transacting on a blockchain, all of our transactions are fully inspectable by anyone! Aside from privacy chains (Monero, Zcash, etc.), all of the transactions, meaning contract deployments, coin transfers, account creations are all easily inspectable! This is the case, as the validators should check the integrity of all the data that the blockchain has processed to achieve consensus between all nodes. Of course, there are some other ways such as &lt;a href="https://en.wikipedia.org/wiki/Zero-knowledge_proof" rel="noopener noreferrer"&gt;zk-proofs&lt;/a&gt;, which hide the details of the transactions while making them still verifiable!&lt;/p&gt;

&lt;p&gt;The so called "privacy" components of the blockchains comes from the idea that we do not know who the public key's owner is. This can be quite handy for privacy, but is also not the exact solution to the privacy problem as the transactions of a user can be mapped to a person with enough information, such as IP addresses, their social media sharings and so on.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Setting Up Our Stellar Quest Account
&lt;/h2&gt;

&lt;p&gt;As always, use &lt;code&gt;sq login&lt;/code&gt; if you haven't, and use &lt;code&gt;sq play 2&lt;/code&gt; to start questing. Don't forget to fund your account!&lt;/p&gt;

&lt;h2&gt;
  
  
  Examining the Contract
&lt;/h2&gt;

&lt;p&gt;Let's check out the &lt;code&gt;lib.rs&lt;/code&gt; file in the &lt;code&gt;src&lt;/code&gt; folder. The contract is quite short, but has some different concepts than previous contracts. Let's check it out.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;ReverseEngineerContract&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;SECRET&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Symbol&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nd"&gt;symbol!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"dancinRaph"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nd"&gt;#[contractimpl]&lt;/span&gt;
&lt;span class="k"&gt;impl&lt;/span&gt; &lt;span class="n"&gt;ReverseEngineerContract&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;fn&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;_&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;secret&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Symbol&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;secret&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;SECRET&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We see that there is only one function, &lt;code&gt;submit&lt;/code&gt;, which takes the argument &lt;code&gt;secret&lt;/code&gt; of type &lt;code&gt;Symbol&lt;/code&gt;. If you remember, the &lt;code&gt;Symbol&lt;/code&gt; type can be thought as a &lt;code&gt;string&lt;/code&gt; with a maximum length of 10.&lt;/p&gt;

&lt;p&gt;Focus on the following line:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;SECRET&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Symbol&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nd"&gt;symbol!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"dancinRaph"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We can see that a constant value is defined here, which is not modifiable by any means using any functions in the contract, or elsewhere. The &lt;code&gt;SECRET&lt;/code&gt; constant is also of type &lt;code&gt;Symbol&lt;/code&gt;, and has the value of &lt;code&gt;"dancinRaph"&lt;/code&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;h4&gt;
  
  
  Constants and Secrets in Blockchains
&lt;/h4&gt;

&lt;p&gt;Since the blockchain ledgers are actually public, we can't have secret values by just naming them "SECRET" and not telling anyone. Having the source code of course makes guessing the value trivial, but anyone can &lt;em&gt;reverse engineer&lt;/em&gt; any contract's source code, and with some simple bytecode translations, view all of your values.&lt;/p&gt;

&lt;p&gt;There are some ways of putting actual secret data on blockchains, such as hashing the values off-chain, and then submitting them. We can also check if another supplied value is correct, we can hash them on-chain, and compare the results. The wonders of cryptography!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Examining the Test
&lt;/h2&gt;

&lt;p&gt;We only have one test function for this quest.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="nd"&gt;#[test]&lt;/span&gt;
&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;test_q3&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Env&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;default&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;contract_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="nf"&gt;.register_contract&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ReverseEngineerContract&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;ReverseEngineerContractClient&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;contract_id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nd"&gt;assert_eq!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="nf"&gt;.submit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nd"&gt;symbol!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"wrong"&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nd"&gt;assert_eq!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="nf"&gt;.submit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;SECRET&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What this test does is quite simple. It checks the output value by giving it a false input, and checks it again by giving it the correct input. We did not expect the contract to panic when we supply an invalid value, as it just simply returns the false value.&lt;/p&gt;

&lt;h2&gt;
  
  
  Solving the Quest
&lt;/h2&gt;

&lt;p&gt;To even attempt solving the quest, we should first find the contract ID of the quest contract. After finding the contract ID, we should supply the &lt;em&gt;secret&lt;/em&gt; keyword that we found as the &lt;code&gt;secret&lt;/code&gt; argument of the submit function, and solve the quest.&lt;/p&gt;

&lt;blockquote&gt;
&lt;h4&gt;
  
  
  Stellar Laboratory
&lt;/h4&gt;

&lt;p&gt;The &lt;a href="https://laboratory.stellar.org/" rel="noopener noreferrer"&gt;Stellar Laboratory&lt;/a&gt; is a place for everything Stellar! You can check out all the endpoints of any Stellar network, even custom ones, and Build, Sign, and Decode transactions!&lt;/p&gt;

&lt;p&gt;The Laboratory is definitely a very helpful place, but since we are programmers, and programmers are lazy, we don't want to leave our cozy terminal to solve the quests! Jokes aside, do check out the &lt;a href="https://laboratory.stellar.org/" rel="noopener noreferrer"&gt;Stellar Laboratory&lt;/a&gt; to learn more about the Horizon API and other Stellar concepts.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Finding the Contract ID
&lt;/h3&gt;

&lt;p&gt;Since the only information we have about the contract is the deployer account, let's check what the deployer account has done on the Futurenet. Let's communicate with the Horizon API from our terminal. Use&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl https://horizon-futurenet.stellar.org/accounts/GAC7HE4PQWI7H34JQN6QLQ7Y7NTAUZDWJZ4SJ6GXVC4K2DN7N65K5NLI/operations
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To get some information about the deployer account. The output is quite large, but the interesting part of the JSON response is as follows.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="err"&gt;--snip--&lt;/span&gt;&lt;span class="w"&gt;

  &lt;/span&gt;&lt;span class="nl"&gt;"transaction_successful"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"source_account"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"GAC7HE4PQWI7H34JQN6QLQ7Y7NTAUZDWJZ4SJ6GXVC4K2DN7N65K5NLI"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;

  &lt;/span&gt;&lt;span class="err"&gt;--snip--&lt;/span&gt;&lt;span class="w"&gt;

  &lt;/span&gt;&lt;span class="nl"&gt;"transaction_hash"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"b4ead070088ad86a32c341907d9944a4f3def6c7f1e42cd6e1789d10ca344c38"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;

  &lt;/span&gt;&lt;span class="err"&gt;--snip--&lt;/span&gt;&lt;span class="w"&gt;

  &lt;/span&gt;&lt;span class="nl"&gt;"function"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"HostFunctionHostFnCreateContractWithSourceAccount"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"footprint"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"AAAAAAAAAAEAAAAGTNbD4mfKK1nhwm9oUMF+GpFYPmEFgv/ujOvINx6UVzoAAAADAAAAAw=="&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We see that the account &lt;code&gt;GAC7HE4PQWI7H34JQN6QLQ7Y7NTAUZDWJZ4SJ6GXVC4K2DN7N65K5NLI&lt;/code&gt; has used the function &lt;code&gt;HostFunctionHostFnCreateContractWithSourceAccount&lt;/code&gt;, which means that they successfully deployed a contract on the Soroban network. If we inspect the footprint using the &lt;code&gt;soroban&lt;/code&gt; CLI, we can get more information about the transaction.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;soroban xdr dec &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--type&lt;/span&gt; LedgerFootprint &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--xdr&lt;/span&gt; AAAAAAAAAAEAAAAGTNbD4mfKK1nhwm9oUMF+GpFYPmEFgv/ujOvINx6UVzoAAAADAAAAAw&lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--output&lt;/span&gt; json | &lt;span class="nb"&gt;grep &lt;/span&gt;contractId
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We got the contract ID!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzpgigceslnh10qax7dbl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzpgigceslnh10qax7dbl.png" alt="Contract ID" width="647" height="86"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;h4&gt;
  
  
  XDR Types
&lt;/h4&gt;

&lt;p&gt;eXternal Data Representation (XDR) is a format that is quite compact, reliable, and rich. Stellar ledger uses XDR formatted data to communicate with clients and store all kinds of data. They are shown base64 encoded, which compresses the data even more when communicating with clients. Check out &lt;a href="https://developers.stellar.org/docs/encyclopedia/xdr" rel="noopener noreferrer"&gt;Stellar Docs on XDR&lt;/a&gt; for more information.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Invoking the &lt;code&gt;submit&lt;/code&gt; Function
&lt;/h3&gt;

&lt;p&gt;Now that we have found the contract ID, we can call the &lt;code&gt;submit&lt;/code&gt; function on the &lt;code&gt;ReverseEngineerContract&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;soroban invoke &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--id&lt;/span&gt; 4cd6c3e267ca2b59e1c26f6850c17e1a91583e610582ffee8cebc8371e94573a &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--fn&lt;/span&gt; submit &lt;span class="nt"&gt;--arg&lt;/span&gt; dancinRaph
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg6fgjwukjistv8b83tlc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg6fgjwukjistv8b83tlc.png" alt="Submit Function Call" width="526" height="86"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Success! Since we got true as the response, we know that we supplied the correct parameter as an argument. Use &lt;code&gt;sq check 3&lt;/code&gt; to claim your reward 🎉!&lt;/p&gt;

</description>
      <category>emptystring</category>
    </item>
    <item>
      <title>Soroban Quest - Auth Store</title>
      <dc:creator>Altuğ Bakan</dc:creator>
      <pubDate>Fri, 25 Nov 2022 11:29:54 +0000</pubDate>
      <link>https://forem.com/altug/soroban-quest-auth-store-1aea</link>
      <guid>https://forem.com/altug/soroban-quest-auth-store-1aea</guid>
      <description>&lt;p&gt;After completing the Hello World quest on the &lt;a href="https://dev.to/altug/soroban-quest-hello-world-1n3l"&gt;last post&lt;/a&gt;, you should feel more comfortable about solving a more advanced quest.&lt;/p&gt;

&lt;h2&gt;
  
  
  Understanding &lt;code&gt;README.md&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;As before, let's open our &lt;code&gt;quests&lt;/code&gt; folder, then, open the &lt;code&gt;2-auth-store&lt;/code&gt; folder to start tackling the second quest.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--CWMn7HlW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/isqyymbduwa9baqi2mrz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--CWMn7HlW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/isqyymbduwa9baqi2mrz.png" alt="Folder View" width="880" height="106"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On the &lt;code&gt;README.md&lt;/code&gt; file, we can see that we are tasked with using the &lt;code&gt;put&lt;/code&gt; function of the Soroban contract to save some data onto the Stellar ledger. Then, we should use &lt;code&gt;get&lt;/code&gt; or &lt;code&gt;get_self&lt;/code&gt; functions to retrieve the data we saved.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting Up Our Stellar Quest Account
&lt;/h2&gt;

&lt;p&gt;As usual, use &lt;code&gt;sq login&lt;/code&gt; to login to your Stellar Quest account if you haven't, and use &lt;code&gt;sq play 2&lt;/code&gt; to start solving the second quest. Don't forget to fund your account with &lt;code&gt;sq fund&lt;/code&gt; to succesfully transact on the Futurenet.&lt;/p&gt;

&lt;h2&gt;
  
  
  Examining the Contract
&lt;/h2&gt;

&lt;p&gt;As usual, open up the &lt;code&gt;src/lib.rs&lt;/code&gt; file to view the contract's source code. In addition to &lt;code&gt;test.rs&lt;/code&gt;, you will also see &lt;code&gt;error.rs&lt;/code&gt; for this quest. Let's start by checking out the functions of the &lt;code&gt;DataStoreContract&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;put&lt;/code&gt; Function
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;put&lt;/code&gt; function allows us to store arbitrary data mapped to our account address.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Bytes&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;Result&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;ContractError&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;match&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="nf"&gt;.invoker&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nn"&gt;Address&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;Account&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;account_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;account_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="nn"&gt;Address&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;Contract&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="nd"&gt;panic_with_error!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nn"&gt;ContractError&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;CrossContractCallProhibited&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;}&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;value&lt;/span&gt;&lt;span class="nf"&gt;.len&lt;/span&gt;&lt;span class="p"&gt;()&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="nd"&gt;panic_with_error!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nn"&gt;ContractError&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;InputValueTooShort&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="nf"&gt;.data&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;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="nf"&gt;Ok&lt;/span&gt;&lt;span class="p"&gt;(())&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;put&lt;/code&gt; function has two arguments, one of them being the environment variable &lt;code&gt;env&lt;/code&gt;, and the other one is the &lt;code&gt;value&lt;/code&gt; argument of type &lt;code&gt;Bytes&lt;/code&gt;. The &lt;code&gt;Bytes&lt;/code&gt; type can be thought as a &lt;code&gt;string&lt;/code&gt;, as each character of a &lt;code&gt;string&lt;/code&gt; consists of one &lt;code&gt;byte&lt;/code&gt;. The difference between the &lt;code&gt;Symbol&lt;/code&gt; and the &lt;code&gt;Bytes&lt;/code&gt; type is that the &lt;code&gt;Symbol&lt;/code&gt; type can only have a maximum of 10 characters. The function returns either the &lt;code&gt;Ok&lt;/code&gt; value or a &lt;code&gt;ContractError&lt;/code&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;h4&gt;
  
  
  Understanding Contract Errors
&lt;/h4&gt;

&lt;p&gt;Custom errors are &lt;code&gt;enum&lt;/code&gt;s, which is a number type that is mapped to labels. The use of numbers are efficient for computers, and labels are helpful for programmers to understand what they mean.&lt;/p&gt;

&lt;p&gt;Using custom contract errors is useful when negative testing the contract. Negative tests make sure that the implementations support unexpected input, while positive tests ensures that the implementations are working as expected. Since our Soroban contracts will be immutable, testing against harmful behavior helps with preventing some attack patterns.&lt;/p&gt;

&lt;p&gt;Using custom contract errors are also useful for User Experience, as the users usually get these errors before calling a contract function. Giving helpful names to errors help users fix their input arguments easily.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;First, the &lt;code&gt;put&lt;/code&gt; function finds the &lt;code&gt;key&lt;/code&gt; of the contract invoker. The invoker can be one of two things: an Externally Owned Account (EOA), which will be us, an user with a private and public key pair, or another contract using cross-contract calls. This implementation blocks the use of cross-contract calls, which we can see by inspecting the &lt;code&gt;match&lt;/code&gt; statement. if &lt;code&gt;env.invoker()&lt;/code&gt; matches a contract address, the program &lt;code&gt;panic&lt;/code&gt;s and exits with the custom contract error, &lt;code&gt;CrossContractCallProhibited&lt;/code&gt;. The implementation of these errors can be found in the &lt;code&gt;error.rs&lt;/code&gt; file.&lt;/p&gt;

&lt;p&gt;Next, the &lt;code&gt;put&lt;/code&gt; function checks if the length of the supplied &lt;code&gt;value&lt;/code&gt; is shorter or equal to 10 &lt;code&gt;byte&lt;/code&gt;s, and &lt;code&gt;panic&lt;/code&gt;s with the custom &lt;code&gt;InputValueTooShort&lt;/code&gt; error if it is the case. This is to highlight the difference between a &lt;code&gt;Symbol&lt;/code&gt; variable and a &lt;code&gt;Bytes&lt;/code&gt; variable, and is not required when implementing a function.&lt;/p&gt;

&lt;p&gt;If all the checks are correct, the contract stores the supplied &lt;code&gt;value&lt;/code&gt; variable mapped to the invoker's address to &lt;em&gt;persist&lt;/em&gt; between function invocations.&lt;/p&gt;

&lt;blockquote&gt;
&lt;h4&gt;
  
  
  Persisting Data vs Temporary Data
&lt;/h4&gt;

&lt;p&gt;If you are familiar with any programming language, you would remember that there are &lt;em&gt;global&lt;/em&gt; variables, which are accessible anywhere from the code, and &lt;em&gt;local&lt;/em&gt; variables, that are scoped to their blocks.&lt;/p&gt;

&lt;p&gt;Variables declared in the functions are lost after the execution has ended, and not stored permanently onto the chain. By storing the variables into the environment however, we make permanent records on the Soroban network. Due to this, storage is usually very expensive compared to the other methods on smart contract chains.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;get&lt;/code&gt; Function
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;get&lt;/code&gt; function allows us to retrieve data set by a given account.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;fn&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;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Env&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="n"&gt;AccountId&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Bytes&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="nf"&gt;.data&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;owner&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="nf"&gt;.unwrap_or_else&lt;/span&gt;&lt;span class="p"&gt;(||&lt;/span&gt; &lt;span class="nf"&gt;Ok&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nd"&gt;bytes!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
            &lt;span class="nf"&gt;.unwrap&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;get&lt;/code&gt; function looks pretty simple, but has some hidden functionality behind it. Excluding the &lt;code&gt;env&lt;/code&gt; argument, the &lt;code&gt;get&lt;/code&gt; function has the &lt;code&gt;owner&lt;/code&gt; parameter of type &lt;code&gt;AccountId&lt;/code&gt;, which can be tricky to supply from the &lt;code&gt;soroban&lt;/code&gt; CLI as an argument. First, the function uses &lt;code&gt;env.data.get(owner)&lt;/code&gt; to get the value set by the given account. If this value does not exist, the function returns &lt;code&gt;Ok&lt;/code&gt; with env converted to &lt;code&gt;bytes&lt;/code&gt; using the &lt;code&gt;bytes!&lt;/code&gt; macro. If this value &lt;em&gt;does&lt;/em&gt; exist, it returns the value set by the account.&lt;/p&gt;

&lt;p&gt;Note that the cross-contract calls are allowed for this function, meaning that we can use another contract to call this function to get any user's set data from our contract. Pretty handy!&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;get_self&lt;/code&gt; Function
&lt;/h3&gt;

&lt;p&gt;If you check out the &lt;code&gt;get_self&lt;/code&gt; function at first, it looks a little off.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;get_self&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="cm"&gt;/* env: Env */&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;Result&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Bytes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ContractError&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nd"&gt;unimplemented!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"not implemented"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="c1"&gt;// let key = match env.invoker() {&lt;/span&gt;
        &lt;span class="c1"&gt;//     Address::Account(account_id) =&amp;gt; account_id,&lt;/span&gt;
        &lt;span class="c1"&gt;//     Address::Contract(_) =&amp;gt; {&lt;/span&gt;
        &lt;span class="c1"&gt;//         panic_with_error!(&amp;amp;env, ContractError::CrossContractCallProhibited)&lt;/span&gt;
        &lt;span class="c1"&gt;//     }&lt;/span&gt;
        &lt;span class="c1"&gt;// };&lt;/span&gt;
        &lt;span class="c1"&gt;// Ok(env&lt;/span&gt;
        &lt;span class="c1"&gt;//     .data()&lt;/span&gt;
        &lt;span class="c1"&gt;//     .get(key)&lt;/span&gt;
        &lt;span class="c1"&gt;//     .unwrap_or_else(|| Ok(bytes!(&amp;amp;env)))&lt;/span&gt;
        &lt;span class="c1"&gt;//     .unwrap())&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The implementation of the contract is &lt;em&gt;commented out&lt;/em&gt;, meaning the compiler ignores those lines. Comments are shown with the double forward slashes, &lt;code&gt;//&lt;/code&gt;, or can be done inline using &lt;code&gt;/* */&lt;/code&gt; in Rust. To "unlock" the functionality of the &lt;code&gt;get_self&lt;/code&gt; function, remove or comment the line starting with the &lt;code&gt;unimplemented!&lt;/code&gt; macro, and uncomment the other lines, including the input parameter, &lt;code&gt;env&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;get_self&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Env&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;Result&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Bytes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ContractError&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// unimplemented!("not implemented")&lt;/span&gt;
        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;match&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="nf"&gt;.invoker&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nn"&gt;Address&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;Account&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;account_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;account_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="nn"&gt;Address&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;Contract&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="nd"&gt;panic_with_error!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nn"&gt;ContractError&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;CrossContractCallProhibited&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;};&lt;/span&gt;
        &lt;span class="nf"&gt;Ok&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;
            &lt;span class="nf"&gt;.data&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;key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="nf"&gt;.unwrap_or_else&lt;/span&gt;&lt;span class="p"&gt;(||&lt;/span&gt; &lt;span class="nf"&gt;Ok&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nd"&gt;bytes!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
            &lt;span class="nf"&gt;.unwrap&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;h4&gt;
  
  
  Comments on Codes
&lt;/h4&gt;

&lt;p&gt;On any code file, you will usually see some comments, explaining the code, disabling some lines, or drawing some awesome &lt;a href="https://www.asciiart.eu/animals/cats"&gt;ASCII art&lt;/a&gt;. The comments are an important part of programming, and they are not even for computers (mostly)!&lt;/p&gt;

&lt;p&gt;The comments are a helpful way for programmers, who generally work on a codebase on a different time than each other, to give out details, explain the cryptic parts, and even leave themselves some reminders. The Doom inverse square root code is a great example on comments:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--sEwLtXC---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kcd6xkegnqhdfdbrkgsp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--sEwLtXC---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kcd6xkegnqhdfdbrkgsp.png" alt="Doom Inverse Square Root" width="880" height="378"&gt;&lt;/a&gt;&lt;br&gt;
Well maybe not. The code is still cryptic, but the programmer also thinks that it is, which we can understand from the comment that they left for us. They also commented out the 2&lt;sup&gt;nd&lt;/sup&gt; iteration as they think that it is not required. Be kind to other programmers and try to explain your code if you think commenting is required!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The &lt;code&gt;get_self&lt;/code&gt; function allows us to retrieve data that &lt;em&gt;we&lt;/em&gt; set ourselves. It first checks if the caller is an EOA and not an external contract as before, and returns the data set by the caller, as before. This function is easier to use for our quest, as we don't need to supply an account to retrieve a data. We will use both solutions to solve this quest.&lt;/p&gt;

&lt;h2&gt;
  
  
  Examining the Tests
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;test.rs&lt;/code&gt; file containing the tests is pretty hefty! Usually, tests take more time to write than the contract to ensure the safety of the contract. Since the tests are extremely well commented, I encourage you to understand them yourselves! I will explain some key features of these tests that do not exists on the &lt;code&gt;HelloContract&lt;/code&gt; tests.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;#[ignore]&lt;/code&gt; Modifier
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;#[ignore]&lt;/code&gt; modifier is used on tests which should be, well, ignored. The main reason for this can be unimplemented source code, or unfinished tests. Since we have removed the comments on the &lt;code&gt;get_self&lt;/code&gt; file, we can remove the &lt;code&gt;#[ignore]&lt;/code&gt; modifier for its test.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="nd"&gt;#[test]&lt;/span&gt;
&lt;span class="nd"&gt;#[should_panic(expected&lt;/span&gt; &lt;span class="nd"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Status(ContractError(1))"&lt;/span&gt;&lt;span class="nd"&gt;)]&lt;/span&gt;
&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;test_contract_get_self&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="cm"&gt;/* the test code as usual */&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, we can also test the functionality of the &lt;code&gt;get_self&lt;/code&gt; function when we use &lt;code&gt;cargo test&lt;/code&gt; to test our contract.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;should_panic&lt;/code&gt; Keyword
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="nd"&gt;#[test]&lt;/span&gt;
&lt;span class="nd"&gt;#[should_panic(expected&lt;/span&gt; &lt;span class="nd"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Status(ContractError(2))"&lt;/span&gt;&lt;span class="nd"&gt;)]&lt;/span&gt;
&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;test_store_value_too_short&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Env&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;default&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;contract_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="nf"&gt;.register_contract&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;DataStoreContract&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;DataStoreContractClient&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;contract_id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;u1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="nf"&gt;.accounts&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="nf"&gt;.generate&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="nf"&gt;.with_source_account&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;u1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;.put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nd"&gt;bytes!&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0x007&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;should_panic&lt;/code&gt; keyword, supplied with a custom contract error makes sure that the contract returns the expected error when supplied with an invalid input argument. On this test, we are calling the &lt;code&gt;put&lt;/code&gt; function with a value that is two &lt;code&gt;byte&lt;/code&gt;s long, and expecting it to fail with the &lt;code&gt;InputValueTooShort&lt;/code&gt; error, which has the value 2.&lt;/p&gt;

&lt;h3&gt;
  
  
  Contract Implementation in &lt;code&gt;test.rs&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;We can implement contracts just for testing on the &lt;code&gt;test.rs&lt;/code&gt; file. this is helpful to test the cross contract calls, and many other methods that require another contract.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;CallerContract&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nd"&gt;#[contractimpl]&lt;/span&gt;
&lt;span class="k"&gt;impl&lt;/span&gt; &lt;span class="n"&gt;CallerContract&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;try_put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;contract_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;BytesN&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Bytes&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;cli&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;DataStoreContractClient&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;contract_id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;cli&lt;/span&gt;&lt;span class="nf"&gt;.put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;try_get_s&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;contract_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;BytesN&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Bytes&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;cli&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;DataStoreContractClient&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;contract_id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;cli&lt;/span&gt;&lt;span class="nf"&gt;.get_self&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;try_get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;contract_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;BytesN&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&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="n"&gt;AccountId&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Bytes&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;cli&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;DataStoreContractClient&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;contract_id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;cli&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;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;owner&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;CallerContract&lt;/code&gt; implements three functions. The first one is the &lt;code&gt;try_put&lt;/code&gt; function, which tries to use the &lt;code&gt;put&lt;/code&gt; function on the &lt;code&gt;DataStoreContract&lt;/code&gt; using a cross-contract call. This invocation is expected to fail, but it is important to test the failing cases too! Next, it has the &lt;code&gt;try_get_s&lt;/code&gt; function, which is used for trying to invoke the &lt;code&gt;get_self&lt;/code&gt; function via a cross-contract call. This is also expected to fail with the custom &lt;code&gt;CrossContractCallProhibited&lt;/code&gt; error. Lastly, it has the &lt;code&gt;try_get&lt;/code&gt; function, which should successfully call the &lt;code&gt;get&lt;/code&gt; function of the &lt;code&gt;DataStoreContract&lt;/code&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;h4&gt;
  
  
  Why are Function Names Too Short?
&lt;/h4&gt;

&lt;p&gt;The functions are implemented as &lt;code&gt;Symbol&lt;/code&gt;s, which are at most 10 characters long. Storing function names as &lt;code&gt;Symbol&lt;/code&gt;s is helpful due to execution efficiency and storage cost. Since the efficiency is important on blockchains, and this issue does not really cause a bad user experience, this implementation is chosen.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Generating a Test Account and Using Test Contracts
&lt;/h3&gt;

&lt;p&gt;We can generate accounts for testing our contracts using &lt;code&gt;env.accounts().generate()&lt;/code&gt;. This is helpful for testing the implementation using multiple accounts.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;test_contract_get&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Env&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;default&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;contract_id_data_store&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="nf"&gt;.register_contract&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;DataStoreContract&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;client_data_store&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;DataStoreContractClient&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;contract_id_data_store&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;contract_id_caller&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="nf"&gt;.register_contract&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;CallerContract&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;caller_client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;CallerContractClient&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;contract_id_caller&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;u1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="nf"&gt;.accounts&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="nf"&gt;.generate&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="n"&gt;client_data_store&lt;/span&gt;
        &lt;span class="nf"&gt;.with_source_account&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;u1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;.put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nd"&gt;bytes!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0x48656c6c6f20536f726f62616e21&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;caller_client&lt;/span&gt;&lt;span class="nf"&gt;.try_get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;contract_id_data_store&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;u1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nd"&gt;assert_eq!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nd"&gt;bytes!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0x48656c6c6f20536f726f62616e21&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This test uses a test account to invoke the &lt;code&gt;put&lt;/code&gt; function on the &lt;code&gt;DataStoreContract&lt;/code&gt;, in order to test the &lt;code&gt;get&lt;/code&gt; function using a cross-contract call, as it is not possible to put data to the contract environment using a contract.&lt;/p&gt;

&lt;p&gt;We can use &lt;code&gt;let u1 = env.accounts().generate()&lt;/code&gt; to create an EOA, then, use &lt;code&gt;client_data_store.with_source_account(&amp;amp;u1).put(&amp;amp;bytes!(&amp;amp;env, 0x48656c6c6f20536f726f62616e21));&lt;/code&gt; to test invoking the &lt;code&gt;put&lt;/code&gt; function using the generated account. &lt;code&gt;with_source_account&lt;/code&gt; method is what accomplishes our task.&lt;/p&gt;

&lt;p&gt;We can use &lt;code&gt;let contract_id_caller = env.register_contract(None, CallerContract);&lt;/code&gt; to register the contract implementation into our testing environment, and use &lt;code&gt;let caller_client = CallerContractClient::new(&amp;amp;env, contract_id_caller);&lt;/code&gt; to create the client used for testing cross-contract calls.&lt;/p&gt;

&lt;h2&gt;
  
  
  Solving the Quest
&lt;/h2&gt;

&lt;p&gt;Now that we fully understand the Quest, we can attempt solving it. We will use both &lt;code&gt;get&lt;/code&gt; and &lt;code&gt;get_self&lt;/code&gt; to solve this Quest.&lt;/p&gt;

&lt;h3&gt;
  
  
  Deploying the Soroban Contract
&lt;/h3&gt;

&lt;p&gt;As usual, we will use &lt;code&gt;cargo build --target wasm32-unknown-unknown --release&lt;/code&gt; to build the contract, and &lt;code&gt;cargo test&lt;/code&gt; to see if everything works before publishing our contract. &lt;code&gt;cargo build&lt;/code&gt; will create the &lt;code&gt;target/wasm32-unknown-unknown/release/soroban_auth_store_contract.wasm&lt;/code&gt; file, which we will deploy to the Soroban network.&lt;/p&gt;

&lt;p&gt;We will use&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;soroban deploy &lt;span class="nt"&gt;--wasm&lt;/span&gt; target/wasm32-unknown-unknown/release/soroban_auth_store_contract.wasm
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;to deploy our contract. If it succeeds, we will see a success message, followed by the contract id of our contract.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--tEY5l3ge--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kg0k1ix7qge907oxadih.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--tEY5l3ge--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kg0k1ix7qge907oxadih.png" alt="Contract Deployment" width="873" height="46"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If your local RPC does not work, use &lt;code&gt;sq rpc -c&lt;/code&gt; to change your RPC endpoint to an official one.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Why Use My Own RPC Endpoint?&lt;/p&gt;

&lt;p&gt;The Remote Procedural Call (RPC) endpoint is a server that can execute custom RPC commands on the server. The Soroban blockchain is interacted using the RPC procedure to deploy contracts, invoke functions, and check data on-chain. The &lt;code&gt;soroban&lt;/code&gt; CLI acts as the middleware which uses the RPC calls underneath to interact with the Soroban network.&lt;/p&gt;

&lt;p&gt;Using your own RPC endpoint helps with privacy, as other RPC servers might collect your IP address, log your calls, and so on to identify who you are. Running a local Soroban node helps with hiding this information from third-party actors, and helps with the decentralization of the Soroban network.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;put&lt;/code&gt;ting Data to Our Contract
&lt;/h3&gt;

&lt;p&gt;After deploying the contract, if everything works well, we can use&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;soroban invoke &lt;span class="nt"&gt;--id&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;your contract &lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="nt"&gt;--fn&lt;/span&gt; put &lt;span class="nt"&gt;--arg&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;value]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;to save data to your contract environment. If we recall that the type of &lt;code&gt;value&lt;/code&gt; was &lt;code&gt;Bytes&lt;/code&gt;, we know that we need to supply the hexadecimal value of the "string" we are looking to save. We can convert the string value we need to hexadecimal without even leaving our terminal! Type&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Hello Soroban!"&lt;/span&gt; | xxd &lt;span class="nt"&gt;-p&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;to convert the &lt;code&gt;string&lt;/code&gt; "Hello Soroban!" to its hexadecimal representation. Note that you should select a value that is longer than 10 characters.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Bho2d43G--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cg0wc6jwbaythxxr354m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Bho2d43G--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cg0wc6jwbaythxxr354m.png" alt='Hexadecimal Representation of "Hello Soroban!"' width="544" height="35"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;h4&gt;
  
  
  What Does &lt;code&gt;xxd&lt;/code&gt; Do?
&lt;/h4&gt;

&lt;p&gt;The &lt;code&gt;xxd&lt;/code&gt; program creates a hexdump of the input given. A hexdump is the hexadecimal representation of a given file, string, or anything digital, which is actually how the computer stores given data. The &lt;code&gt;x&lt;/code&gt; character represents the heXadecimal word, and the &lt;code&gt;d&lt;/code&gt; character represents the dumping process.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;-p&lt;/code&gt; option prints the output plainly into the standard output, which is without grouping and without the &lt;code&gt;string&lt;/code&gt; representation. Remove the &lt;code&gt;-p&lt;/code&gt; flag to test it!&lt;/p&gt;

&lt;p&gt;As with almost all Linux commands, you can use &lt;code&gt;man xxd&lt;/code&gt; to learn more about the &lt;code&gt;xxd&lt;/code&gt; command by reading the &lt;strong&gt;man&lt;/strong&gt;ual page. Getting to know more about Linux commands makes you a more efficient programmer!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;After we obtain the hexadecimal value of our message, let's &lt;code&gt;put&lt;/code&gt; the value into our contract data.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_0rYO2N6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6lxf77tz4njlxmt8hqr1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_0rYO2N6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6lxf77tz4njlxmt8hqr1.png" alt="Put Call" width="523" height="87"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Using &lt;code&gt;get_self&lt;/code&gt; to Retrieve Data
&lt;/h3&gt;

&lt;p&gt;Using &lt;code&gt;get_self&lt;/code&gt; to retrieve data is simple, as we don't need to supply any arguments. Simply call&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;soroban invoke &lt;span class="nt"&gt;--id&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;your contract &lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="nt"&gt;--fn&lt;/span&gt; get_self
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;to retrieve the data you saved using the &lt;code&gt;put&lt;/code&gt; function. You should receive a success message, followed by an array of bytes in decimal representation.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--s6Nrt6jC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cd3vmzubcpuwq6gx4hur.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--s6Nrt6jC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cd3vmzubcpuwq6gx4hur.png" alt="Get Self Call" width="523" height="87"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;h4&gt;
  
  
  How to Check if the Returned Value is Correct
&lt;/h4&gt;

&lt;p&gt;The returned value consists of some decimal values, which makes it hard to check if the received value is the same with the supplied value. Luckily, we can use Python to easily check if that is the case.&lt;/p&gt;


&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;re&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;findall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"[0-9]+"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"[72,101,108,108,111,32,83,111,114,111,98,97,110,33]"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;chr&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;i&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt; &lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;That is one cryptic code, but what it does is replacing all the decimals in the returned array, that is &lt;code&gt;[72,101,108,108,111,32,83,111,114,111,98,97,110,33]&lt;/code&gt;, with their ASCII representations. We should see the original &lt;code&gt;string&lt;/code&gt; we converted into its hexadecimal representation.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5DKq_5r5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zzd6fh63wpz5malzxgps.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5DKq_5r5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zzd6fh63wpz5malzxgps.png" alt="Python Result" width="635" height="174"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Success!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Using &lt;code&gt;get&lt;/code&gt; to Retrieve Data
&lt;/h3&gt;

&lt;p&gt;Using &lt;code&gt;get&lt;/code&gt; to retrieve the data we supplied with our account is harder than the first method, but nothing impossible. We will use&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;soroban invoke &lt;span class="nt"&gt;--id&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;your contract &lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="nt"&gt;--fn&lt;/span&gt; get &lt;span class="nt"&gt;--arg&lt;/span&gt; &lt;span class="s1"&gt;'{"object": { "accountId": { "publicKeyTypeEd25519": "[your raw public key in hexadecimal format]" } } }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As you see, the hard part is constructing the &lt;code&gt;AccountId&lt;/code&gt; type from the CLI, and finding the hexadecimal format of our public key. Since Soroban uses the JSON-RPC spec to communicate with clients, the complex types derive from the &lt;code&gt;object&lt;/code&gt; class. Please check out the &lt;a href="https://gist.github.com/Smephite/09b40e842ef454effe4693e0d18246d7"&gt;wonderful guide from Smephite&lt;/a&gt; for more information about Soroban types.&lt;/p&gt;

&lt;blockquote&gt;
&lt;h4&gt;
  
  
  JSON-RPC Types
&lt;/h4&gt;

&lt;p&gt;JSON stands for JavaScript Object Notation, which is a data interchange format which is derived from the JavaScript types. The reason complex types derive from the "object" class is due to JSON supporting only a handful types, which are &lt;code&gt;string&lt;/code&gt;s, &lt;code&gt;number&lt;/code&gt;s, &lt;code&gt;boolean&lt;/code&gt;s, &lt;code&gt;null&lt;/code&gt;, &lt;code&gt;object&lt;/code&gt;, and &lt;code&gt;array&lt;/code&gt;. All other classes are composed using these 6 classes.&lt;/p&gt;

&lt;p&gt;Soroban has 8 default JSON-RPC classes, where &lt;code&gt;u63&lt;/code&gt; and &lt;code&gt;u32&lt;/code&gt; are unsigned integer types, &lt;code&gt;i32&lt;/code&gt; is the signed integer type, &lt;code&gt;static&lt;/code&gt; is an enum type that can take the values &lt;code&gt;void&lt;/code&gt;, &lt;code&gt;true&lt;/code&gt;, &lt;code&gt;false&lt;/code&gt;, and &lt;code&gt;ledgerKeyContractCode&lt;/code&gt;, &lt;code&gt;object&lt;/code&gt; is the same &lt;code&gt;object&lt;/code&gt; type from JSON, &lt;code&gt;symbol&lt;/code&gt; is a value that is limited by 10 bytes of length, &lt;code&gt;bitset&lt;/code&gt; is a type that consists of at most &lt;code&gt;60&lt;/code&gt; bits, and &lt;code&gt;status&lt;/code&gt; is also an &lt;code&gt;enum&lt;/code&gt; type that denotes errors.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Since we have access to Python on our workspace, we can use the &lt;code&gt;stellar_sdk&lt;/code&gt; Python package, which has some great utility tools we can use. Since it is not preinstalled, we can use&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;stellar_sdk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;to install it to our workspace. Note that the package will cease to exist after your workspace becomes inactive. After installing &lt;code&gt;stellar_sdk&lt;/code&gt;, we can enter Python and find our public key's hexadecimal representation using&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="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;stellar_sdk&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Keypair&lt;/span&gt;

&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Keypair&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;from_public_key&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"[your public key]"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;raw_public_key&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nb"&gt;hex&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--9aa29-JV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/up00nwhhmugixyzb75i0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9aa29-JV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/up00nwhhmugixyzb75i0.png" alt="Raw Public Key" width="827" height="137"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Great! After calling the &lt;code&gt;get&lt;/code&gt; function, we should get a success message, followed by the data we saved using the &lt;code&gt;put&lt;/code&gt; function into the contract.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--bVOOdmGe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6vg8fem2su2kcz1qfn69.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bVOOdmGe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6vg8fem2su2kcz1qfn69.png" alt="Get Invocation" width="880" height="96"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Success! Use &lt;code&gt;sq check 2&lt;/code&gt; to claim your reward 🎉!&lt;/p&gt;

</description>
      <category>soroban</category>
      <category>stellar</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Soroban Quest - Hello World</title>
      <dc:creator>Altuğ Bakan</dc:creator>
      <pubDate>Thu, 24 Nov 2022 19:13:05 +0000</pubDate>
      <link>https://forem.com/altug/soroban-quest-hello-world-1n3l</link>
      <guid>https://forem.com/altug/soroban-quest-hello-world-1n3l</guid>
      <description>&lt;p&gt;On the &lt;a href="https://dev.to/altug/soroban-quest-getting-familiar-with-the-workspace-17h9"&gt;last post&lt;/a&gt;, we booted up our GitPod environment and now are ready to tackle the first Soroban Quest: Hello World!&lt;/p&gt;

&lt;h2&gt;
  
  
  Understanding &lt;code&gt;README.md&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Let's begin questing by opening the &lt;code&gt;quests&lt;/code&gt; folder in our Explorer. We can see multiple quests existing here. Since we will tackle the first quest right now, let's open the &lt;code&gt;1-hello-world&lt;/code&gt; folder by clicking on it. Then, select &lt;code&gt;README.md&lt;/code&gt; for more information about what to do on this quest.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5jc6g2kugn0g2n0f6qw7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5jc6g2kugn0g2n0f6qw7.png" alt="Hello World README" width="800" height="150"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We can see that we have to use our Stellar Quest account to deploy and invoke the 1 Hello World contract on the Stellar Futurenet. What does any of these words mean? Let's check them out.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting Up Our Stellar Quest Account
&lt;/h2&gt;

&lt;p&gt;If we missed it, or are using another workspace, we should use &lt;code&gt;sq login&lt;/code&gt; to login to our Stellar Quest account. This way, our progress can be saved to our account, and we can get sweet NFTs to our connected wallet. If the &lt;code&gt;1-hello-world&lt;/code&gt; folder is missing, we can use &lt;code&gt;sq pull&lt;/code&gt; to get the newest copy of the repository from GitHub.&lt;/p&gt;

&lt;blockquote&gt;
&lt;h4&gt;
  
  
  Pull? From where?
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;sq pull&lt;/code&gt; uses &lt;code&gt;git&lt;/code&gt; underneath to "pull" the newest changes from the &lt;a href="https://github.com/tyvdh/soroban-quest" rel="noopener noreferrer"&gt;soroban quest repository&lt;/a&gt; to our local workspace. &lt;a href="https://git-scm.com/" rel="noopener noreferrer"&gt;git&lt;/a&gt; is a version control program with excellent remote and local repository synchronization support, so that's what is happening here. &lt;code&gt;sq pull&lt;/code&gt; accomplishes it in three steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Uses &lt;code&gt;git stash&lt;/code&gt; to save our changes into a stash, so that collisions between the remote repository and our repository do not occur.&lt;/li&gt;
&lt;li&gt;Uses &lt;code&gt;git pull&lt;/code&gt; to pull the changes from the &lt;a href="https://github.com/tyvdh/soroban-quest" rel="noopener noreferrer"&gt;soroban quest repository&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Uses &lt;code&gt;git stash pop&lt;/code&gt; to reapply the saved changes to our workspace.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;It is pretty useful for saving our work on the workspace, while having the ability to add new stuff!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;After setting up our account and everything, we can use &lt;code&gt;sq play 1&lt;/code&gt; to start questing! We should accept the funding by the prompt, as we will need some Futurenet Lumens for transacting. If you accidentally pressed no, you can use &lt;code&gt;sq fund [account]&lt;/code&gt;, with account being the public key given to you for the quest. Don't forget to remove the brackets!&lt;/p&gt;

&lt;h2&gt;
  
  
  Examining the Contract
&lt;/h2&gt;

&lt;p&gt;On the &lt;code&gt;src&lt;/code&gt; folder, we can see two files: &lt;code&gt;lib.rs&lt;/code&gt; and &lt;code&gt;test.rs&lt;/code&gt;. &lt;code&gt;lib.rs&lt;/code&gt; contains the source code of the Soroban contract given on this quest. Let's begin checking out the code.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="c1"&gt;// We don't include the standard library to minimize compiled&lt;/span&gt;
&lt;span class="c1"&gt;// size. We also import a few macros and types we need from the&lt;/span&gt;
&lt;span class="c1"&gt;// `soroban_sdk`.&lt;/span&gt;
&lt;span class="nd"&gt;#![no_std]&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;soroban_sdk&lt;/span&gt;&lt;span class="p"&gt;::{&lt;/span&gt;&lt;span class="n"&gt;contractimpl&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;symbol&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;vec&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Symbol&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;Vec&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;HelloContract&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Our `HelloContract` implementation contains only one function,&lt;/span&gt;
&lt;span class="c1"&gt;// `hello()`. This function will receive a `to` argument, and&lt;/span&gt;
&lt;span class="c1"&gt;// return a Vec made up of "Hello" and the supplied `to` value.&lt;/span&gt;
&lt;span class="nd"&gt;#[contractimpl]&lt;/span&gt;
&lt;span class="k"&gt;impl&lt;/span&gt; &lt;span class="n"&gt;HelloContract&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;hello&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Env&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="n"&gt;Symbol&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;Vec&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Symbol&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nd"&gt;vec!&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nd"&gt;symbol!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello"&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="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// This `mod` declaration inserts the contents of `test.rs` into&lt;/span&gt;
&lt;span class="c1"&gt;// this file.&lt;/span&gt;
&lt;span class="k"&gt;mod&lt;/span&gt; &lt;span class="n"&gt;test&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Soroban contracts are written in &lt;a href="https://www.rust-lang.org/" rel="noopener noreferrer"&gt;Rust&lt;/a&gt;, which is the hottest programming language at the moment. If you are not familiar with Rust, no worries! The contracts are extremely well commented, and it is quite understandable if you are experienced with another programming language. Let's dive deeper into the contract's code.&lt;/p&gt;

&lt;blockquote&gt;
&lt;h4&gt;
  
  
  What is Rust and Why is it Everywhere?
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://www.rust-lang.org/" rel="noopener noreferrer"&gt;Rust&lt;/a&gt; is a systems programming language, which is known by it's memory safety. In addition to being memory safe, it is also &lt;em&gt;blazingly fast&lt;/em&gt;, which makes it a popular programming language amongst programmers. The memory safety aspect is important, since &lt;a href="https://msrc-blog.microsoft.com/2019/07/16/a-proactive-approach-to-more-secure-code/" rel="noopener noreferrer"&gt;70% of the CVEs are caused by memory safety issues&lt;/a&gt;. So, to write a fast and secure code, a different approach than C and C++, must be employed. That's why Rust is everywhere!&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="nd"&gt;#![no_std]&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;soroban_sdk&lt;/span&gt;&lt;span class="p"&gt;::{&lt;/span&gt;&lt;span class="n"&gt;contractimpl&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;symbol&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;vec&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Symbol&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;Vec&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;HelloContract&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;#![no_std]&lt;/code&gt; line tells the Rust compiler to not include the standard library, as it is quite large and is not fully supported by the Soroban environment. The useful components are already implemented in the &lt;code&gt;soroban_sdk&lt;/code&gt;, so we don't need to include the standard library! The second line tells the compiler to use the implementations of &lt;code&gt;contractimpl&lt;/code&gt;, &lt;code&gt;symbol&lt;/code&gt;, &lt;code&gt;vec&lt;/code&gt;, &lt;code&gt;Env&lt;/code&gt;, &lt;code&gt;Symbol&lt;/code&gt;, and &lt;code&gt;Vec&lt;/code&gt; from the &lt;code&gt;soroban_sdk&lt;/code&gt; library. We will use these lines almost every time when we are developing a Soroban contract. The next line tells the Soroban Runtime that our contract's name is &lt;code&gt;HelloContract&lt;/code&gt;. After these definitions, we can check the implementation of the contract.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="nd"&gt;#[contractimpl]&lt;/span&gt;
&lt;span class="k"&gt;impl&lt;/span&gt; &lt;span class="n"&gt;HelloContract&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;hello&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Env&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="n"&gt;Symbol&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;Vec&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Symbol&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nd"&gt;vec!&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nd"&gt;symbol!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello"&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="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The implementations of Soroban contracts are marked with &lt;code&gt;#[contractimpl]&lt;/code&gt; to tell the compiler to do the right thing. In our contract implementation of the &lt;code&gt;HelloContract&lt;/code&gt;, we can see that we have a &lt;em&gt;public&lt;/em&gt; function, denoted with &lt;code&gt;pub fn&lt;/code&gt;. Public functions are functions on a contract which are invokable by everyone using the Soroban network. The &lt;code&gt;hello&lt;/code&gt; function has two arguments, and returns a &lt;code&gt;Vector&lt;/code&gt; of &lt;code&gt;Symbol&lt;/code&gt;s. A &lt;code&gt;Symbol&lt;/code&gt; is a string-like value, which consists of at most 10 characters. A &lt;code&gt;Vector&lt;/code&gt; can be defined as an array with the capacity to grow indefinitely.&lt;/p&gt;

&lt;p&gt;The first input argument is &lt;code&gt;env&lt;/code&gt; of type &lt;code&gt;Env&lt;/code&gt;. This parameter can be found on every functiion that deals with the state of the Soroban network. It is generally used in each function, as it supplies some additional functionality. The &lt;code&gt;env&lt;/code&gt; argument is not supplied by the invoker of the function, and is added automatically on function invocation. &lt;/p&gt;

&lt;p&gt;The second input argument is &lt;code&gt;to&lt;/code&gt; of type &lt;code&gt;Symbol&lt;/code&gt;. Symbols can be assumed as strings of a maximum length of 10. They provide cost and space efficiency, and are widely used for small data.&lt;/p&gt;

&lt;p&gt;The function returns a &lt;code&gt;Vector&lt;/code&gt;, using the macro &lt;code&gt;vec!&lt;/code&gt;. It returns a vector with three elements, which are &lt;code&gt;&amp;amp;env&lt;/code&gt;, the &lt;code&gt;symbol&lt;/code&gt; "Hello", and the &lt;code&gt;symbol&lt;/code&gt; &lt;code&gt;to&lt;/code&gt;, which is supplied by the invoker of the function. The &lt;code&gt;&amp;amp;env&lt;/code&gt; parameter is the reference of the Soroban environment, and is not explicitly returned to the user.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;mod&lt;/span&gt; &lt;span class="n"&gt;test&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The last line inserts the code content of the &lt;code&gt;test.rs&lt;/code&gt; file to the &lt;code&gt;lib.rs&lt;/code&gt; file.&lt;/p&gt;

&lt;h2&gt;
  
  
  Examining the Test
&lt;/h2&gt;

&lt;p&gt;Now, let's examine the &lt;code&gt;test.rs&lt;/code&gt; file. Examining the tests are important to see how the contract operates. A well tested contract is more secure than a non-tested contract, and security is one of the most important concerns when dealing with contracts on a blockchain.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="nd"&gt;#![cfg(test)]&lt;/span&gt;

&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="k"&gt;super&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="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;soroban_sdk&lt;/span&gt;&lt;span class="p"&gt;::{&lt;/span&gt;&lt;span class="n"&gt;symbol&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;vec&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Env&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="c1"&gt;// The purpose of this file is to run automated tests on the &lt;/span&gt;
&lt;span class="c1"&gt;// contract code we've written in `lib.rs`. Writing tests can be&lt;/span&gt;
&lt;span class="c1"&gt;// quite a big topic, and we'll dive in further in a future quest. &lt;/span&gt;
&lt;span class="c1"&gt;// Just you wait!&lt;/span&gt;
&lt;span class="nd"&gt;#[test]&lt;/span&gt;
&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// we register the contract in a Soroban environment, and&lt;/span&gt;
    &lt;span class="c1"&gt;// build a client we can use to invoke the contract&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Env&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;default&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;contract_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="nf"&gt;.register_contract&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;HelloContract&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;HelloContractClient&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;contract_id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// Next, we call `client.hello()`, supplying "Dev" as our `to`&lt;/span&gt;
    &lt;span class="c1"&gt;// argument.&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;words&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="nf"&gt;.hello&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nd"&gt;symbol!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Dev"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

    &lt;span class="c1"&gt;// We assert the contract must return a Vec that matches what &lt;/span&gt;
    &lt;span class="c1"&gt;// we would expect to receive from our contract: &lt;/span&gt;
    &lt;span class="c1"&gt;// [Symbol("Hello"), Symbol("Dev")]&lt;/span&gt;
    &lt;span class="nd"&gt;assert_eq!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;words&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nd"&gt;vec!&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nd"&gt;symbol!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nd"&gt;symbol!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Dev"&lt;/span&gt;&lt;span class="p"&gt;),]);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The test is also written in Rust, and is used to test the functionality of the &lt;code&gt;HelloContract&lt;/code&gt; on a local environment.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="nd"&gt;#![cfg(test)]&lt;/span&gt;

&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="k"&gt;super&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="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;soroban_sdk&lt;/span&gt;&lt;span class="p"&gt;::{&lt;/span&gt;&lt;span class="n"&gt;symbol&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;vec&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Env&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The first line configures the file as a test environment. The second line, &lt;code&gt;use super::*;&lt;/code&gt;, imports everything from the parent module, which is the &lt;code&gt;HelloContract&lt;/code&gt; file here. As before, the third line imports some implementations from the &lt;code&gt;soroban_sdk&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="nd"&gt;#[test]&lt;/span&gt;
&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Env&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;default&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;contract_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="nf"&gt;.register_contract&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;HelloContract&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;HelloContractClient&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;contract_id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;words&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="nf"&gt;.hello&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nd"&gt;symbol!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Dev"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

    &lt;span class="nd"&gt;assert_eq!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;words&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nd"&gt;vec!&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nd"&gt;symbol!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nd"&gt;symbol!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Dev"&lt;/span&gt;&lt;span class="p"&gt;),]);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The test implementations are marked with &lt;code&gt;#[test]&lt;/code&gt;, and allows the Rust compiler to understand that these are testing functions. We start with creating a constant, &lt;code&gt;env&lt;/code&gt;, and initializing with the default value. Next, we are registering our &lt;code&gt;HelloContract&lt;/code&gt; to the environment. Now, we have a local Soroban sandbox with only &lt;code&gt;HelloContract&lt;/code&gt; existing. We then create a client to interact with the contract of ours for testing.&lt;/p&gt;

&lt;p&gt;We invoke the function &lt;code&gt;hello&lt;/code&gt; on our &lt;code&gt;HelloContract&lt;/code&gt; by using the &lt;code&gt;hello&lt;/code&gt; method of our client using the "Dev" argument. See that we are not supplying the &lt;code&gt;env&lt;/code&gt; parameter, as it is implicitly included already. We then set the reply of the function to the &lt;code&gt;words&lt;/code&gt; constant.&lt;/p&gt;

&lt;p&gt;After doing our invocation, we assert the contract must return a &lt;code&gt;Vec&lt;/code&gt;, which consists of the elements &lt;code&gt;&amp;amp;env&lt;/code&gt;, "Hello", and our input argument, "Dev". If that is the case, the test ends without an error, which means that our implementation is correct.&lt;/p&gt;

&lt;blockquote&gt;
&lt;h4&gt;
  
  
  Testing Tips
&lt;/h4&gt;

&lt;p&gt;When testing software, we use the AAA (Arrange, Act, and Assert) principle. First, we "Arrange" the environment, which we did here using the first three lines. Then, we "Act" on our source code, which corresponds to invoking our &lt;code&gt;hello&lt;/code&gt; function on our contract. Finally, we "Assert" that everything is correct by comparing the actual result to the expected result. This way, testing software can be done systematically.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Compiling, Testing, Deploying
&lt;/h2&gt;

&lt;p&gt;We can compile our code using &lt;code&gt;cargo build&lt;/code&gt; to compile our rust codes into &lt;code&gt;.wasm&lt;/code&gt; files. If we want to build only a specific quest's contract, the usage is&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cargo build &lt;span class="nt"&gt;--package&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;package-name] &lt;span class="nt"&gt;--target&lt;/span&gt; wasm32-unknown-unknown &lt;span class="nt"&gt;--release&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;where the package name of a quest can be found in the &lt;code&gt;Cargo.toml&lt;/code&gt; file on the quest's folder. For example, the Hello World quest's package name is &lt;code&gt;soroban-hello-world-contract&lt;/code&gt;, so we can build it using&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cargo build &lt;span class="nt"&gt;--package&lt;/span&gt; soroban-hello-world-contract &lt;span class="nt"&gt;--target&lt;/span&gt; wasm32-unknown-unknown &lt;span class="nt"&gt;--release&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The created object can be found in &lt;code&gt;target/wasm32-unknown-unknown/release/soroban_hello_world_contract.wasm&lt;/code&gt; file. We can also use &lt;code&gt;cargo test&lt;/code&gt;, to see if our implementations contains any error.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fapjrsbt3o8mrjye263pe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fapjrsbt3o8mrjye263pe.png" alt="Testing Hello World" width="709" height="120"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Everything looks great! We now can deploy our Soroban contract to the Futurenet using &lt;code&gt;soroban deploy&lt;/code&gt; command. Please be careful that you are using the &lt;code&gt;CLI - Futurenet: bash&lt;/code&gt; terminal to successfully accomplish this task. The full command is&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;soroban deploy &lt;span class="nt"&gt;--wasm&lt;/span&gt; target/wasm32-unknown-unknown/release/soroban_hello_world_contract.wasm
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We should see a success message with the contract's ID. If you are getting errors when deploying, wait for the Soroban client to synchronize to the Futurenet, which can take some time. If you are still getting errors, try using the handy command &lt;code&gt;sq rpc -c&lt;/code&gt; to change the default RPC endpoint to an official one.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuzx3j9b9iff9i19ovzzr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuzx3j9b9iff9i19ovzzr.png" alt="Deploying Soroban Contract" width="800" height="49"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Great! We will need to supply this ID to interact with our deployed contract. We can use a different contract ID to interact with another contract. The possibilities are endless!&lt;/p&gt;

&lt;p&gt;We can now invoke the &lt;code&gt;hello&lt;/code&gt; function using &lt;code&gt;soroban invoke&lt;/code&gt; to get a reply from our contract. We should again use the Futurenet CLI for this purpose.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;soroban invoke &lt;span class="nt"&gt;--id&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;your contract &lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="nt"&gt;--fn&lt;/span&gt; hello &lt;span class="nt"&gt;--arg&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;any string argument shorter than 10 characters]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The invocation should return a success and the &lt;code&gt;Vector&lt;/code&gt; that contains the "Hello" word followed by the argument we supplied.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjibykq7clblot0uc58rt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjibykq7clblot0uc58rt.png" alt="Soroban Contract Invocation" width="800" height="40"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Everything works perfectly, and we have completed the first quest! Well done! Use &lt;code&gt;sq check 1&lt;/code&gt; to claim your reward 🎉.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;How Long Will My Contract Live?&lt;/p&gt;

&lt;p&gt;Forever! That's the beauty of the blockchains. The immutability and the censorship resistance are what makes blockchains great. This power is a double edged sword though, if we make any mistakes, or have any vulnerabilities in our contract, there's nothing we can do! That's why testing and auditing smart contracts are an important business.&lt;/p&gt;

&lt;p&gt;Note that this is the Futurenet, which is a test server for Soroban contracts. It often gets reset, so your Soroban contract will cease to exist. This will not happen when Soroban hits the mainnet!&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>github</category>
    </item>
    <item>
      <title>Soroban Quest - Getting Familiar with the Workspace</title>
      <dc:creator>Altuğ Bakan</dc:creator>
      <pubDate>Wed, 23 Nov 2022 17:23:32 +0000</pubDate>
      <link>https://forem.com/altug/soroban-quest-getting-familiar-with-the-workspace-17h9</link>
      <guid>https://forem.com/altug/soroban-quest-getting-familiar-with-the-workspace-17h9</guid>
      <description>&lt;p&gt;So, you have found yourself in the new paradigm that is the blockchain, and would like to jump into the newest hot topic on Stellar ecosystem: Smart Contracts with Soroban.&lt;/p&gt;

&lt;p&gt;The Stellar Quest has been an ongoing system which awards developers knowledge about the Stellar ecosystem. The first four Stellar Quests have been about the Horizon, Stellar's API for interacting with the network. Horizon allows you to accomplish most of the stuff on the Stellar ecosystem such as Path Payments, Trade Offers, and Asset Creation.&lt;/p&gt;

&lt;p&gt;Enter Soroban, a new smart contract framework on Stellar, which allows developers to accomplish everything Horizon can and much more. The new Stellar Quest is about getting familiar with Soroban's development environment, which is what we will jump right into.&lt;/p&gt;

&lt;h2&gt;
  
  
  GitPod Environment
&lt;/h2&gt;

&lt;p&gt;GitPod is a development environment which supports Docker, Node.js, and much more to generate a previously configured development environment, ready to go. The GitPod is a virtual Linux machine, and is presented with a much loved VSCode environment. To get started, go to &lt;a href="https://github.com/tyvdh/soroban-quest"&gt;&lt;code&gt;soroban-quest&lt;/code&gt; repository&lt;/a&gt; and press the "Open in GitPod" button.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1NluKa2j--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dkh9zyqce53qcu1oy4wl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1NluKa2j--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dkh9zyqce53qcu1oy4wl.png" alt="Open in GitPod Button" width="874" height="432"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The environment will open within a VSCode web context.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6sNI_WD4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lcr294z34h6i7c8hk2iy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6sNI_WD4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lcr294z34h6i7c8hk2iy.png" alt="Soroban Quest Environment" width="880" height="505"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This might look overwhelming at first, but let's check out the parts of the environment. At left, we see the explorer, which includes the quests and some configuration files. The most interesting part here is the "quests" directory.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--MAOha--Y--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lgh1wnhh9wb3h556faua.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--MAOha--Y--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lgh1wnhh9wb3h556faua.png" alt="Explorer" width="297" height="443"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We see the currently available quests, and new quests in the future. Next, we have our main panel, in which we can see the README.md file open by default.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--P34ASNLb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xtyc2iejnzpn8v9g50dy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--P34ASNLb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xtyc2iejnzpn8v9g50dy.png" alt="Main Panel" width="826" height="324"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next, our favorite place: the terminal. At right, we can see that there are actually four different terminal pages open. Starting from the top, we see:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Futurenet: docker - Allows us to interact with the Soroban network on Futurenet.&lt;/li&gt;
&lt;li&gt;Albedo Signer: npm run start - Allows us to earn the rewards from the quests!&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CLI - Futurenet: bash&lt;/strong&gt; - Allows us to send transactions and deploy contracts to the Futurenet Soroban network. This is where we will mostly work.&lt;/li&gt;
&lt;li&gt;CLI - Sandbox: bash - Allows us to work on a local Soroban network for testing. No one else is allowed here!&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Cp5z8bKK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xmv2k8rc1cxxepsv7w3z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Cp5z8bKK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xmv2k8rc1cxxepsv7w3z.png" alt="Terminals" width="842" height="291"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now that we are kind of familiar with the environment, let's start questing!&lt;/p&gt;

&lt;h2&gt;
  
  
  Squirtle CLI
&lt;/h2&gt;

&lt;p&gt;There are two main programs we will use. The first one is &lt;code&gt;sq&lt;/code&gt;, which stands for Squirtle (yes, actually!). &lt;code&gt;sq&lt;/code&gt; is a CLI program created just for Stellar Quest. How handy!&lt;/p&gt;

&lt;p&gt;Type&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sq &lt;span class="nb"&gt;help&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;to your terminal to get to know more about the commands.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;sq login&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;We should first use &lt;code&gt;sq login&lt;/code&gt; to login to our Stellar Quest account. We should see four ✅s on our terminal to know that we're good to go!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--HReaRGxW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fb34fx56zb3gypdiwnl4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HReaRGxW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fb34fx56zb3gypdiwnl4.png" alt="sq login" width="363" height="138"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After logging in, we don't need to login again if we continue to use the same GitPod workspace.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;sq pull&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;sq pull&lt;/code&gt; is one of the main commands we will use before every quest. It "pulls" the new code from the &lt;code&gt;soroban-quest&lt;/code&gt; repository so we can jump into solving quests.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;sq play [index]&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;sq play [index]&lt;/code&gt; is another main command we will use on every quest. It creates an account on Futurenet, which we will use to solve the quests. Index is 1 for the first quest, 2 for the second and so on. After creating a new account, it asks if we would like to fund the account. The answer is almost always yes as creating Soroban contracts and invoking them require some Lumens.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;sq fund [key]&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;sq fund [key]&lt;/code&gt; is useful when we forget to fund our account on the &lt;code&gt;sq play&lt;/code&gt; command. The &lt;code&gt;key&lt;/code&gt; parameter is our quest public key, which is in the form of something like &lt;code&gt;GACS6G2UW226A5VJECJLJB5O772ZF47G6AOJVZ33VWHYTSJLUA6TUYQI&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;sq check [index]&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;sq check [index]&lt;/code&gt; is used for checking if our solution is correct. If it is, we might get some rewards!&lt;/p&gt;

&lt;h2&gt;
  
  
  Soroban CLI
&lt;/h2&gt;

&lt;p&gt;Soroban CLI is the heart of the Soroban Quest, and does everything required for developing Soroban smart contracts.&lt;/p&gt;

&lt;p&gt;Type&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;soroban &lt;span class="nt"&gt;--help&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;to your terminal to get to know more about the commands.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;soroban deploy&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Allows us to deploy a Soroban contract to the Futurenet. The usage is&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;soroban deploy &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--wasm&lt;/span&gt; &amp;lt;WASM&amp;gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--secret-key&lt;/span&gt; &amp;lt;SECRET_KEY&amp;gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--network-passphrase&lt;/span&gt; &amp;lt;NETWORK_PASSPHRASE&amp;gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--rpc-url&lt;/span&gt; &amp;lt;RPC_URL&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;but since this development environment is automatically created, we only need to supply the WASM path using &lt;code&gt;--wasm &amp;lt;WASM&amp;gt;&lt;/code&gt;. Doesn't make any sense? No worries, as it will soon enough!&lt;/p&gt;

&lt;blockquote&gt;
&lt;h4&gt;
  
  
  Tips for interested peeps
&lt;/h4&gt;

&lt;p&gt;I will try to include tidbits of information for advanced or curious developers to make use of. These stuff are definitely not required to know, but makes it easy to understand the whole concept.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;SECRET_KEY&lt;/code&gt;, &lt;code&gt;NETWORK_PASSPHRASE&lt;/code&gt;, and &lt;code&gt;RPC_URL&lt;/code&gt; parameters are already set! Try using &lt;code&gt;echo $SOROBAN_SECRET_KEY&lt;/code&gt;, &lt;code&gt;echo $SOROBAN_RPC_URL&lt;/code&gt;, and &lt;code&gt;$SOROBAN_NETWORK_PASSPHRASE&lt;/code&gt; to see their values!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;soroban invoke&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Allows us to interact with contracts deployed on the Soroban network. The usage is&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;soroban invoke &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--id&lt;/span&gt; &amp;lt;CONTRACT_ID&amp;gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--fn&lt;/span&gt; &amp;lt;FUNCTION&amp;gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--secret-key&lt;/span&gt; &amp;lt;SECRET_KEY&amp;gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--network-passphrase&lt;/span&gt; &amp;lt;NETWORK_PASSPHRASE&amp;gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--rpc-url&lt;/span&gt; &amp;lt;RPC_URL&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As before, we don't need to supply the &lt;code&gt;--secret-key &amp;lt;SECRET_KEY&amp;gt;&lt;/code&gt;, &lt;code&gt;--network-passphrase &amp;lt;NETWORK_PASSPHRASE&amp;gt;&lt;/code&gt;, and the &lt;code&gt;--rpc-url &amp;lt;RPC_URL&amp;gt;&lt;/code&gt; arguments as they already exist. The &lt;code&gt;id&lt;/code&gt; parameter is the address of a Soroban contract, &lt;code&gt;fn&lt;/code&gt; is the function we would like to invoke on the Soroban contract, and &lt;code&gt;arg&lt;/code&gt; is the arguments required for the function. We can use multiple arguments with multiple &lt;code&gt;arg&lt;/code&gt; flags.&lt;/p&gt;

&lt;h2&gt;
  
  
  Other Useful Programs
&lt;/h2&gt;

&lt;p&gt;We also have &lt;code&gt;cargo&lt;/code&gt; available on the workspace, which is used for compiling the Soroban contracts. &lt;code&gt;Python&lt;/code&gt; is also present, so we can make use of some helpful scripts for calculations and conversions.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;cargo&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;cargo&lt;/code&gt; is the package manager of the Rust, like &lt;code&gt;npm&lt;/code&gt;, and is also used for development as it has the ability to compile the contracts. We will use &lt;code&gt;cargo&lt;/code&gt; to compile the contract codes, so that we can deploy them on Soroban.&lt;/p&gt;

&lt;p&gt;We will use&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cargo build &lt;span class="nt"&gt;--target&lt;/span&gt; wasm32-unknown-unknown &lt;span class="nt"&gt;--release&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;to compile our contracts and create the .wasm files required so that we can deploy them to the Soroban network.&lt;/p&gt;

&lt;h3&gt;
  
  
  Python
&lt;/h3&gt;

&lt;p&gt;Since our workspace is a Linux environment, we will have access to Python and &lt;code&gt;pip&lt;/code&gt; to install some packages. Using Python will be crucial to achieve success fast in a quest, as some conversions and tests can easily be done using Python. You can access it 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
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;from your terminal.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--y-l_nSln--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/f1tc45ux3xeubkiz578m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--y-l_nSln--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/f1tc45ux3xeubkiz578m.png" alt="Python" width="503" height="101"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After finishing your work with Python, you can use&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;to return to your Bash terminal.&lt;/p&gt;

&lt;h2&gt;
  
  
  Explorer
&lt;/h2&gt;

&lt;p&gt;The main folder on the explorer will be the quests folder. Inside we can see all the quest files, which include &lt;code&gt;README.md&lt;/code&gt; for the quest's purpose, &lt;code&gt;STORY.md&lt;/code&gt; for the story of the quest, and the quest contract's source files on &lt;code&gt;src&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;lib.rs&lt;/code&gt; includes the source code of our Soroban contracts, and &lt;code&gt;test.rs&lt;/code&gt; includes the tests for the said contract. The contracts are always correct as they are already built, but test files might contain some &lt;em&gt;hints&lt;/em&gt; for the quests! Checking out test files is always helpful for checking out how the contract is used, so do check them out!&lt;/p&gt;

&lt;h2&gt;
  
  
  Finishing Thoughts
&lt;/h2&gt;

&lt;p&gt;Now that we are pretty familiar with our development workspace, we can start working on some quests! Do check out my next post on how to understand and get to the solution of the "Hello World" quest, and understand even more about working with Soroban!&lt;/p&gt;

</description>
      <category>soroban</category>
      <category>stellar</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
