<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: darkvallen</title>
    <description>The latest articles on DEV Community by darkvallen (@darkvallen).</description>
    <link>https://dev.to/darkvallen</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%2F1020229%2Fac9360e6-7fda-4b5c-8b77-4fcbc2e88f65.png</url>
      <title>DEV Community: darkvallen</title>
      <link>https://dev.to/darkvallen</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/darkvallen"/>
    <language>en</language>
    <item>
      <title>Cross Contract Calls using AssemblyScript SDK</title>
      <dc:creator>darkvallen</dc:creator>
      <pubDate>Fri, 31 Mar 2023 01:40:18 +0000</pubDate>
      <link>https://dev.to/darkvallen/cross-contract-calls-using-assemblyscript-sdk-4mma</link>
      <guid>https://dev.to/darkvallen/cross-contract-calls-using-assemblyscript-sdk-4mma</guid>
      <description>&lt;p&gt;Hi! In this post, we will explore an example of a cross-contract call using the AssemblyScript SDK in the Soroban Smart Contract Platform.&lt;/p&gt;

&lt;p&gt;A cross-contract call occurs when one contract calls a function on another contract. In this example, we will use two contracts: Contract A and Contract B. Contract A will contain the function that will be called, and Contract B will be the contract that calls the function from Contract A.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Contract Code
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Contract A Code&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;val&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;as-soroban-sdk/lib/value&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;double&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;num&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;val&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;RawVal&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nx"&gt;val&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;RawVal&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;numi32&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;val&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toI32&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;num&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;val&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fromI32&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;numi32&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;2&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;A quick explanation, this contract contain &lt;code&gt;double()&lt;/code&gt; function that takes a single parameter, &lt;code&gt;num&lt;/code&gt;, of type &lt;code&gt;val.RawVal&lt;/code&gt; and will double the input value. The function returns a &lt;code&gt;val.RawVal&lt;/code&gt;.&lt;br&gt;
Next, create &lt;code&gt;contract.json&lt;/code&gt; file in your project directory, this file contains metadata for the contract.&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="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Contract A"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0.1.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Example"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"host_functions_version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;29&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"functions"&lt;/span&gt;&lt;span class="p"&gt;:&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;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"name"&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;span class="s2"&gt;"double"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"arguments"&lt;/span&gt;&lt;span class="p"&gt;:&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;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"num"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"i32"&lt;/span&gt;&lt;span class="p"&gt;}&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;span class="nl"&gt;"returns"&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;span class="s2"&gt;"i32"&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;span class="p"&gt;]&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;Before compiling the contract, we need to edit the &lt;code&gt;asconfig.json&lt;/code&gt; file of your project. Replace its content with the following:&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="nl"&gt;"extends"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"as-soroban-sdk/sdkasconfig"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"targets"&lt;/span&gt;&lt;span class="p"&gt;:&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;span class="nl"&gt;"release"&lt;/span&gt;&lt;span class="p"&gt;:&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;span class="nl"&gt;"outFile"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"build/release.wasm"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"textFile"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"build/release.wat"&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;span class="nl"&gt;"debug"&lt;/span&gt;&lt;span class="p"&gt;:&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;span class="nl"&gt;"outFile"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"build/debug.wasm"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"textFile"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"build/debug.wat"&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;span class="p"&gt;}&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;The &lt;code&gt;asconfig.json&lt;/code&gt; file is used by the AssemblyScript compiler (asc) to define the configuration for your project.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Contract B Code&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;val&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;as-soroban-sdk/lib/value&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Vec&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;as-soroban-sdk/lib/vec&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;contract&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;as-soroban-sdk/lib/contract&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;callc&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="nx"&gt;val&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;RawVal&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;contractId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;80863e58acf6d02f12bb0c5ecd0a046f66a171c22070bd31242d9cff7c027b84&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;func&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;double&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;args&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Vec&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pushBack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;val&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fromI32&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;contract&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;callContractById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;contractId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;func&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getHostObject&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;callc&lt;/code&gt; function imports the &lt;code&gt;val&lt;/code&gt; and &lt;code&gt;Vec&lt;/code&gt; modules from the Soroban SDK, as well as the &lt;code&gt;contract&lt;/code&gt; module. It also defines a function called &lt;code&gt;callc&lt;/code&gt; that takes no parameters and returns a &lt;code&gt;val.RawVal&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The purpose of this function is to call a function called double in another contract using its contract ID. The &lt;code&gt;contractId&lt;/code&gt; variable stores the ID of the contract that we want to call, and the &lt;code&gt;func&lt;/code&gt; variable stores the name of the function that we want to call in the other contract.&lt;/p&gt;

&lt;p&gt;In the next line, we create a new &lt;code&gt;Vec&lt;/code&gt; called &lt;code&gt;args&lt;/code&gt; and add an argument to it using &lt;code&gt;args.pushBack(val.fromI32(3))&lt;/code&gt;. This creates a vector of arguments that we will pass to the double function in the other contract when we make the cross-contract call.&lt;/p&gt;

&lt;p&gt;Finally, we make the cross-contract call using the &lt;code&gt;contract.callContractById&lt;/code&gt; function. This function takes the contract ID, the name of the function we want to call, and the arguments vector as parameters. The &lt;code&gt;getHostObject&lt;/code&gt; function is used to convert the &lt;code&gt;args&lt;/code&gt; vector to an object that can be passed as a parameter to the &lt;code&gt;callContractById&lt;/code&gt; function.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;callc&lt;/code&gt; function returns the result of the cross-contract call as a &lt;code&gt;val.RawVal&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Next you know the drill, create &lt;code&gt;contract.json&lt;/code&gt; file:&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="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"CrossContract"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0.1.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cross contract example"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"host_functions_version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;29&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"functions"&lt;/span&gt;&lt;span class="p"&gt;:&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;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"name"&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;span class="s2"&gt;"callc"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"arguments"&lt;/span&gt;&lt;span class="p"&gt;:&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;span class="nl"&gt;"returns"&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;span class="s2"&gt;"i32"&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;span class="p"&gt;]&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;Edit &lt;code&gt;asconfig.json&lt;/code&gt; same as Contract A.&lt;/p&gt;

&lt;h2&gt;
  
  
  Compiling The Contract
&lt;/h2&gt;

&lt;p&gt;You need to compile both contracts from each contract directory using this command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx asc assembly/index.ts &lt;span class="nt"&gt;--target&lt;/span&gt; release
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now you should see two new files in each contract &lt;code&gt;build/&lt;/code&gt; directory: &lt;code&gt;release.wasm&lt;/code&gt; and &lt;code&gt;release.wat&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Run The Contract
&lt;/h2&gt;

&lt;p&gt;First, we will deploy &lt;strong&gt;Contract A wasm file&lt;/strong&gt;, using this command :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;soroban contract deploy &lt;span class="nt"&gt;--wasm&lt;/span&gt; build/release.wasm
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You will get contract ID from your deployed contract, similar to this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;80863e58acf6d02f12bb0c5ecd0a046f66a171c22070bd31242d9cff7c027b84
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This contract ID should be put in &lt;strong&gt;Contract B &lt;code&gt;contractID&lt;/code&gt; value&lt;/strong&gt;, after you put it there, compile the contract again.&lt;/p&gt;

&lt;p&gt;Next, we will invoke &lt;strong&gt;Contract B wasm file&lt;/strong&gt; from contract b directory, using this command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;soroban contract invoke &lt;span class="nt"&gt;--wasm&lt;/span&gt; build/release.wasm &lt;span class="nt"&gt;--id&lt;/span&gt; 1 &lt;span class="nt"&gt;--fn&lt;/span&gt; callc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should get this output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;6
&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%2Fb2n765a1sp7gxgsp3n64.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%2Fb2n765a1sp7gxgsp3n64.png" alt="Cross Contract"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Closing
&lt;/h2&gt;

&lt;p&gt;Overall, this code provides a simple example of how Cross Contract Calls works using the AssemblyScript SDK. By using the &lt;code&gt;contract.callContractById&lt;/code&gt; function. Happy Sorobaning!&lt;/p&gt;

</description>
      <category>soroban</category>
      <category>stellar</category>
      <category>smartcontract</category>
      <category>assemblyscript</category>
    </item>
    <item>
      <title>Account Authorization using Soroban AssemblyScript SDK</title>
      <dc:creator>darkvallen</dc:creator>
      <pubDate>Thu, 30 Mar 2023 21:17:18 +0000</pubDate>
      <link>https://dev.to/darkvallen/account-authorization-using-soroban-assemblyscript-sdk-5d8e</link>
      <guid>https://dev.to/darkvallen/account-authorization-using-soroban-assemblyscript-sdk-5d8e</guid>
      <description>&lt;p&gt;Hi! In my previous posts, i already covered many things such as storing data, logging contract, and defining error code. In this post I will take it to the next level, authorization. Authorization is one of security measure used in smart contracts, it can be used to various things such as allowing specific verified users to call a function, allowing specific users access stored data, and many more.&lt;/p&gt;

&lt;p&gt;In this post i will explain Account authorization smart contract example that implements authorization control and updating account values stored in chain state.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Contract Code
&lt;/h2&gt;

&lt;p&gt;The contract code will be similar to my previous post with additional code to do account authorization. Let's dive into the code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;AddressObject&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;MapObject&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;RawVal&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;fromU32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;toU32&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;as-soroban-sdk/lib/value&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nb"&gt;Map&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;as-soroban-sdk/lib/map&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;ledger&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;as-soroban-sdk/lib/ledger&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;address&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;as-soroban-sdk/lib/address&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this section, we import the necessary modules from the as-&lt;code&gt;soroban-sdk&lt;/code&gt; library. The ledger module provides functions for interacting with the blockchain's storage. The &lt;code&gt;RawVal&lt;/code&gt;, &lt;code&gt;toU32&lt;/code&gt;, &lt;code&gt;fromU32&lt;/code&gt;, &lt;code&gt;AddressObject&lt;/code&gt;, and &lt;code&gt;MapObject&lt;/code&gt; type is imported from the value module. &lt;code&gt;Map&lt;/code&gt; imported from map module to act as stored data format. ledger and address module imported for any operation regarding ledger dan address operations.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;increment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;AddressObject&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;RawVal&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nx"&gt;MapObject&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

  &lt;span class="nx"&gt;address&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;requireAuth&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;counter&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;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ledger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hasData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;dataValue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;ledger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;toU32&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;dataValue&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nx"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nf"&gt;toU32&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;counterVal&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;fromU32&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;ledger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;putData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;counterVal&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;map&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Map&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="nx"&gt;map&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="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;counterVal&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;map&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getHostObject&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 purpose of this function is to increment a counter associated with a given user's address in the Soroban ledger. The &lt;code&gt;address.requireAuth(user)&lt;/code&gt; call at the beginning of the function ensures that the user has authorized the transaction before it can proceed.&lt;/p&gt;

&lt;p&gt;The next block of code checks whether the user already has data associated with their address in the ledger using the &lt;code&gt;ledger.hasData(user)&lt;/code&gt; function. If the user has data, it retrieves the current value of the counter using &lt;code&gt;ledger.getData(user)&lt;/code&gt; and converts it to a 32-bit unsigned integer using the &lt;code&gt;toU32&lt;/code&gt; function. If the user does not have data, the counter is initialized to zero.&lt;/p&gt;

&lt;p&gt;The counter variable is then incremented by the value of value, which is also converted to a 32-bit unsigned integer using &lt;code&gt;toU32&lt;/code&gt;. The updated value of counter is then converted back to a RawVal value using &lt;code&gt;fromU32&lt;/code&gt; and stored in the ledger using the &lt;code&gt;ledger.putData(user, counterVal)&lt;/code&gt; function.&lt;/p&gt;

&lt;p&gt;Finally, a new &lt;code&gt;Map&lt;/code&gt; is created and the updated counter value is added to it using &lt;code&gt;map.put(user, counterVal)&lt;/code&gt;. The Map is then returned as a &lt;code&gt;MapObject&lt;/code&gt;using &lt;code&gt;map.getHostObject()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Next, create &lt;code&gt;contract.json&lt;/code&gt; file in your project directory, this file contains metadata for the contract.&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="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Store and Retrieve Data Contract (Account Auth)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0.1.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"example"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"host_functions_version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;29&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"functions"&lt;/span&gt;&lt;span class="p"&gt;:&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;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"name"&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;span class="s2"&gt;"increment"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"arguments"&lt;/span&gt;&lt;span class="p"&gt;:&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;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"user"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"address"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"u32"&lt;/span&gt;&lt;span class="p"&gt;}&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;span class="nl"&gt;"returns"&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;span class="s2"&gt;"map[address, u32]"&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;span class="p"&gt;]&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;Before compiling the contract, we need to edit the &lt;code&gt;asconfig.json&lt;/code&gt; file of your project. Replace its content with the following:&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="nl"&gt;"extends"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"as-soroban-sdk/sdkasconfig"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"targets"&lt;/span&gt;&lt;span class="p"&gt;:&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;span class="nl"&gt;"release"&lt;/span&gt;&lt;span class="p"&gt;:&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;span class="nl"&gt;"outFile"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"build/release.wasm"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"textFile"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"build/release.wat"&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;span class="nl"&gt;"debug"&lt;/span&gt;&lt;span class="p"&gt;:&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;span class="nl"&gt;"outFile"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"build/debug.wasm"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"textFile"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"build/debug.wat"&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;span class="p"&gt;}&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;The &lt;code&gt;asconfig.json&lt;/code&gt; file is used by the AssemblyScript compiler (asc) to define the configuration for your project.&lt;/p&gt;

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

&lt;p&gt;You need to compile it into WebAssembly first. To do this, you'll use the following command :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx asc assembly/index.ts --target release
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now you should see two new files in the build/ directory: &lt;code&gt;release.wasm&lt;/code&gt; and &lt;code&gt;release.wat&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;We will use 2 different account to invoke this contract.Let's run the contract to see if it's works, we're gonna run the contract using &lt;code&gt;soroban-cli&lt;/code&gt; on sandbox using the following command :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;soroban contract invoke &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--account&lt;/span&gt; GABGWMODVCF3VQS5BYCJBWMJUIS466Q3WT3AKGZZAKLBW2NYHIWOEYQT &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--id&lt;/span&gt; 1 &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--wasm&lt;/span&gt; build/release.wasm &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--fn&lt;/span&gt; increment &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--user&lt;/span&gt; GABGWMODVCF3VQS5BYCJBWMJUIS466Q3WT3AKGZZAKLBW2NYHIWOEYQT &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--value&lt;/span&gt; 10
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can run it a couple of times with any desired &lt;code&gt;--value&lt;/code&gt;. And invoke the function using another 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 contract invoke &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--account&lt;/span&gt; GBYXXOAIKZJHZKGR4W7ERYWLAJDEYIPQJNETH6FGFIJUUB4PBVPISTNL &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--id&lt;/span&gt; 1 &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--wasm&lt;/span&gt; build/release.wasm &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--fn&lt;/span&gt; increment &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--user&lt;/span&gt; GBYXXOAIKZJHZKGR4W7ERYWLAJDEYIPQJNETH6FGFIJUUB4PBVPISTNL &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--value&lt;/span&gt; 5
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And after couple of times invoking the function with 2 different accounts, you can check all stored data on that contract using this command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;soroban contract &lt;span class="nb"&gt;read&lt;/span&gt; &lt;span class="nt"&gt;--id&lt;/span&gt; 1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should get similar output to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"""GABGWMODVCF3VQS5BYCJBWMJUIS466Q3WT3AKGZZAKLBW2NYHIWOEYQT""",15
"""GBYXXOAIKZJHZKGR4W7ERYWLAJDEYIPQJNETH6FGFIJUUB4PBVPISTNL""",25
&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%2Fcxxczd5edwxvjkmwvxbt.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%2Fcxxczd5edwxvjkmwvxbt.png" alt="Contract Storage"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Closing
&lt;/h2&gt;

&lt;p&gt;Overall, this code provides a simple example of how Account Authorization works using the AssemblyScript SDK. By using the &lt;code&gt;address.requireAuth&lt;/code&gt; and &lt;code&gt;address.requireAuthForArgs&lt;/code&gt; functions, this code ensures that only authorized users can modify the counter associated with their address. Happy Sorobaning!&lt;/p&gt;

</description>
      <category>soroban</category>
      <category>stellar</category>
      <category>assemblyscript</category>
      <category>smartcontract</category>
    </item>
    <item>
      <title>Defining Contract Error using Soroban Assembly Script SDK</title>
      <dc:creator>darkvallen</dc:creator>
      <pubDate>Thu, 30 Mar 2023 10:39:52 +0000</pubDate>
      <link>https://dev.to/darkvallen/error-handling-using-soroban-assembly-script-sdk-519m</link>
      <guid>https://dev.to/darkvallen/error-handling-using-soroban-assembly-script-sdk-519m</guid>
      <description>&lt;p&gt;Hi! in my &lt;a href="https://dev.to/darkvallen/storing-and-retrieving-data-using-soroban-assembly-script-sdk-5e9j/"&gt;previous post&lt;/a&gt;, i already illustrates how to use the Soroban AssemblyScript SDK to store and retrieve data in a simple smart contract, and now we will add error handler in that contract using Soroban Assembly Script SDK.&lt;/p&gt;

&lt;p&gt;We will explore how to define and generate error for Soroban smart contract using AssemblyScript SDK, that allows contract caller to understand and handle the error. This example will showcase &lt;code&gt;failWithErrorCode()&lt;/code&gt; function from &lt;code&gt;context&lt;/code&gt; module provided by the &lt;code&gt;as-soroban-sdk&lt;/code&gt; library.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Contract Code
&lt;/h2&gt;

&lt;p&gt;The contract code will be similar to my previous post with additional code to do error handling. Let's dive into the code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;RawVal&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;toU32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;fromU32&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;as-soroban-sdk/lib/value&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;ledger&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;as-soroban-sdk/lib/ledger&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;context&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;as-soroban-sdk/lib/context&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this section, an additional modules added &lt;code&gt;context&lt;/code&gt; module. These modules will give us functionality to define and handle error.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kr"&gt;enum&lt;/span&gt; &lt;span class="nx"&gt;ERR_CODES&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;MAX_REACHED&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;increment&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="nx"&gt;RawVal&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;COUNTER&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;counter&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="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;max&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ledger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hasDataFor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;dataObj&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;ledger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getDataFor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;toU32&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;dataObj&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nx"&gt;counter&lt;/span&gt; &lt;span class="o"&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="nx"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;max&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;failWithErrorCode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ERR_CODES&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;MAX_REACHED&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nx"&gt;ledger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;putDataFor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;fromU32&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;ledger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getDataFor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&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 code defines an &lt;code&gt;ERR_CODES&lt;/code&gt; enum to represent possible error codes. It has a single error code: &lt;code&gt;MAX_REACHED&lt;/code&gt;, indicating the counter has reached its maximum allowed value, and &lt;code&gt;max&lt;/code&gt; variable is the maximum allowed value. &lt;code&gt;increment&lt;/code&gt; function work similarly like the previous contract, check counter data in storage, increment it, and it checks if the new count is greater than the maximum allowed (set to 5). If so, it fails the transaction and returns an error code using the &lt;code&gt;context.failWithErrorCode&lt;/code&gt; function. Otherwise, it updates the &lt;code&gt;COUNTER&lt;/code&gt; data in the ledger with the new count value converted back to a &lt;code&gt;RawVal&lt;/code&gt; with &lt;code&gt;fromU32&lt;/code&gt;. It returns the final count value from the ledger.&lt;/p&gt;

&lt;p&gt;Next, create &lt;code&gt;contract.json&lt;/code&gt; file in your project directory, this file contains metadata for the contract.&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="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Store and Retrieve Data Contract (Error Handling)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0.1.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"example"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"host_functions_version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;29&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"functions"&lt;/span&gt;&lt;span class="p"&gt;:&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;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"name"&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;span class="s2"&gt;"increment"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"arguments"&lt;/span&gt;&lt;span class="p"&gt;:&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;span class="nl"&gt;"returns"&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;span class="s2"&gt;"u32"&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;span class="p"&gt;]&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;Before compiling the contract, we need to edit the &lt;code&gt;asconfig.json&lt;/code&gt; file of your project. Replace its content with the following:&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="nl"&gt;"extends"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"as-soroban-sdk/sdkasconfig"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"targets"&lt;/span&gt;&lt;span class="p"&gt;:&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;span class="nl"&gt;"release"&lt;/span&gt;&lt;span class="p"&gt;:&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;span class="nl"&gt;"outFile"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"build/release.wasm"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"textFile"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"build/release.wat"&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;span class="nl"&gt;"debug"&lt;/span&gt;&lt;span class="p"&gt;:&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;span class="nl"&gt;"outFile"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"build/debug.wasm"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"textFile"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"build/debug.wat"&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;span class="p"&gt;}&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;The &lt;code&gt;asconfig.json&lt;/code&gt; file is used by the AssemblyScript compiler (asc) to define the configuration for your project.&lt;/p&gt;

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

&lt;p&gt;You need to compile it into WebAssembly first. To do this, you'll use the following command :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx asc assembly/index.ts --target release
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now you should see two new files in the build/ directory: &lt;code&gt;release.wasm&lt;/code&gt; and &lt;code&gt;release.wat&lt;/code&gt;. &lt;/p&gt;

&lt;h2&gt;
  
  
  Running The Contract on Sandbox
&lt;/h2&gt;

&lt;p&gt;Let's run the contract to see if it's works, we're gonna run the contract using &lt;code&gt;soroban-cli&lt;/code&gt; on sandbox using the following command :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;soroban contract invoke &lt;span class="nt"&gt;--wasm&lt;/span&gt; build/release.wasm &lt;span class="nt"&gt;--id&lt;/span&gt; 1 &lt;span class="nt"&gt;--fn&lt;/span&gt; increment
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should get the output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run it a couple of times, and in 6th run you will get this output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;error: HostError
Value: Status&lt;span class="o"&gt;(&lt;/span&gt;ContractError&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;))&lt;/span&gt;
&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%2Fqe4e9xx7nekspul56b76.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%2Fqe4e9xx7nekspul56b76.png" alt="Error"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Closing
&lt;/h2&gt;

&lt;p&gt;This example demonstrates how to define and handle error on soroban smart contract using the Soroban AssemblyScript SDK. By knowing the exact error code, contract caller will know what's wrong with the contract or the invocation. With this foundation, you can move on to build more advanced and feature-rich smart contracts on the Soroban platform. Happy Sorobaning!&lt;/p&gt;

</description>
      <category>stellar</category>
      <category>soroban</category>
      <category>smartcontract</category>
      <category>assemblyscript</category>
    </item>
    <item>
      <title>Logging Contract using Soroban AssemblyScript SDK</title>
      <dc:creator>darkvallen</dc:creator>
      <pubDate>Thu, 30 Mar 2023 01:47:57 +0000</pubDate>
      <link>https://dev.to/darkvallen/logging-contract-using-soroban-assemblyscript-sdk-1p5k</link>
      <guid>https://dev.to/darkvallen/logging-contract-using-soroban-assemblyscript-sdk-1p5k</guid>
      <description>&lt;p&gt;Hi! in my &lt;a href="https://dev.to/darkvallen/storing-and-retrieving-data-using-soroban-assembly-script-sdk-5e9j/"&gt;previous post&lt;/a&gt;, i already illustrates how to use the Soroban AssemblyScript SDK to store and retrieve data in a simple smart contract, and now we will dive into the realm of contract logging in a Soroban smart contract using Soroban Assembly Script SDK.&lt;/p&gt;

&lt;p&gt;We will explore how to log a Soroban smart contract using AssemblyScript SDK. This example will showcase &lt;code&gt;logFtm&lt;/code&gt; function from &lt;code&gt;context&lt;/code&gt; module provided by the &lt;code&gt;as-soroban-sdk&lt;/code&gt; library.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Contract Code
&lt;/h2&gt;

&lt;p&gt;The contract code will be similar to my previous post with additional code to do logging  each time it is called. Let's dive into the code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;RawVal&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;fromU32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;fromSymbolStr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;toU32&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;as-soroban-sdk/lib/value&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;ledger&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;as-soroban-sdk/lib/ledger&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;Vec&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;as-soroban-sdk/lib/vec&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;context&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;as-soroban-sdk/lib/context&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this section, two additional modules added &lt;code&gt;vec&lt;/code&gt; and &lt;code&gt;context&lt;/code&gt; module. These modules will give us functionality to do logging.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;increment&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="nx"&gt;RawVal&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;COUNTER&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;counter&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="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;args&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Vec&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="nx"&gt;ledger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hasDataFor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;dataObj&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;ledger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getDataFor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;toU32&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;dataObj&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pushBack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;fromU32&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="nx"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nx"&gt;ledger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;putDataFor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;fromU32&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pushBack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;fromU32&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;logFtm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Before Increment = {} and After increment = {}&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;ledger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getDataFor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&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;increment&lt;/code&gt; function works exactly like the code before with additional &lt;code&gt;args.pushBack()&lt;/code&gt; function to add logged arguments, and &lt;code&gt;context.logFtm()&lt;/code&gt; to create the logs.  A new &lt;code&gt;Vec&lt;/code&gt; instance to store the log's arguments. Two arguments are added to to the &lt;code&gt;Vec&lt;/code&gt;: counter value before increment and counter value after increment. Both are converted to their &lt;code&gt;RawVal&lt;/code&gt; representation using the &lt;code&gt;fromU32&lt;/code&gt; function. The &lt;code&gt;context.logFtm&lt;/code&gt; function called to print the before and after value log. Finally, the updated counter value is retrieved from the ledger and returned as the function's output.&lt;/p&gt;

&lt;p&gt;Next, create &lt;code&gt;contract.json&lt;/code&gt; file in your project directory, this file contains metadata for the contract.&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="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Store and Retrieve Data Contract (Logging)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0.1.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"example"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"host_functions_version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;29&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"functions"&lt;/span&gt;&lt;span class="p"&gt;:&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;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"name"&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;span class="s2"&gt;"increment"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"arguments"&lt;/span&gt;&lt;span class="p"&gt;:&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;span class="nl"&gt;"returns"&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;span class="s2"&gt;"u32"&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;span class="p"&gt;]&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;Before compiling the contract, we need to edit the &lt;code&gt;asconfig.json&lt;/code&gt; file of your project. Replace its content with the following:&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="nl"&gt;"extends"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"as-soroban-sdk/sdkasconfig"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"targets"&lt;/span&gt;&lt;span class="p"&gt;:&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;span class="nl"&gt;"release"&lt;/span&gt;&lt;span class="p"&gt;:&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;span class="nl"&gt;"outFile"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"build/release.wasm"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"textFile"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"build/release.wat"&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;span class="nl"&gt;"debug"&lt;/span&gt;&lt;span class="p"&gt;:&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;span class="nl"&gt;"outFile"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"build/debug.wasm"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"textFile"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"build/debug.wat"&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;span class="p"&gt;}&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;The &lt;code&gt;asconfig.json&lt;/code&gt; file is used by the AssemblyScript compiler (asc) to define the configuration for your project.&lt;/p&gt;

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

&lt;p&gt;You need to compile it into WebAssembly first. To do this, you'll use the following command :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx asc assembly/index.ts --target release
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now you should see two new files in the build/ directory: &lt;code&gt;release.wasm&lt;/code&gt; and &lt;code&gt;release.wat&lt;/code&gt;. &lt;/p&gt;

&lt;h2&gt;
  
  
  Running The Contract on Sandbox
&lt;/h2&gt;

&lt;p&gt;Let's run the contract to see if it's works, we're gonna run the contract using &lt;code&gt;soroban-cli&lt;/code&gt; on sandbox using the following command :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;soroban contract invoke &lt;span class="nt"&gt;--wasm&lt;/span&gt; build/release.wasm &lt;span class="nt"&gt;--id&lt;/span&gt; 1 &lt;span class="nt"&gt;--fn&lt;/span&gt; increment
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should get the output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;1
&lt;span class="c"&gt;#0: debug: Before Increment = U32(0) and After increment = U32(1)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run it once more, you should get output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;2
&lt;span class="c"&gt;#0: debug: Before Increment = U32(1) and After increment = U32(2)&lt;/span&gt;
&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%2Fk5k7qo970hhyhzgbjk7b.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%2Fk5k7qo970hhyhzgbjk7b.png" alt="1st"&gt;&lt;/a&gt;&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%2Fl3kg8f8ln8oybenfjwph.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%2Fl3kg8f8ln8oybenfjwph.png" alt="2nd"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Closing
&lt;/h2&gt;

&lt;p&gt;This example demonstrates how to log a soroban smart contract using the Soroban AssemblyScript SDK. By leveraging the ledger, context, value, and vec modules, we can easily interact with the blockchain storage, manage data, and do logging. With this foundation, you can move on to build more advanced and feature-rich smart contracts on the Soroban platform. Happy Sorobaning!&lt;/p&gt;

</description>
      <category>soroban</category>
      <category>stellar</category>
      <category>assemblyscript</category>
      <category>smartcontract</category>
    </item>
    <item>
      <title>Event-Driven Smart Contract using Soroban AssemblyScript SDK</title>
      <dc:creator>darkvallen</dc:creator>
      <pubDate>Thu, 30 Mar 2023 00:48:42 +0000</pubDate>
      <link>https://dev.to/darkvallen/event-driven-smart-contract-using-soroban-assemblyscript-sdk-3n39</link>
      <guid>https://dev.to/darkvallen/event-driven-smart-contract-using-soroban-assemblyscript-sdk-3n39</guid>
      <description>&lt;p&gt;Hi! in my &lt;a href="https://dev.to/darkvallen/storing-and-retrieving-data-using-soroban-assembly-script-sdk-5e9j/"&gt;previous post&lt;/a&gt;, i already illustrates how to use the Soroban AssemblyScript SDK to store and retrieve data in a simple smart contract, and now we will dive into the realm of contract events in a Soroban smart contract using Soroban Assembly Script SDK.&lt;/p&gt;

&lt;p&gt;We will explore how to create an event-driven smart contract on the Soroban smart contract platform using AssemblyScript SDK. This example will showcase &lt;code&gt;publishEvent&lt;/code&gt; function provided by the &lt;code&gt;as-soroban-sdk&lt;/code&gt; library.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Contract Code
&lt;/h2&gt;

&lt;p&gt;The contract code will be similar to my previous post with additional code to emits an event each time it is called.Let's dive into the code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;RawVal&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;fromU32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;fromSymbolStr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;toU32&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;as-soroban-sdk/lib/value&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;ledger&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;as-soroban-sdk/lib/ledger&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;Vec&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;as-soroban-sdk/lib/vec&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;publishEvent&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;as-soroban-sdk/lib/context&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this section, two additional modules added vec and context module. These modules will give us functionality to emits event.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;increment&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="nx"&gt;RawVal&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;COUNTER&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;counter&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;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ledger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hasDataFor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;dataObj&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;ledger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getDataFor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;toU32&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;dataObj&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nx"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nx"&gt;ledger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;putDataFor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;fromU32&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;topics&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Vec&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="nx"&gt;topics&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pushBack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;fromSymbolStr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="nx"&gt;topics&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pushBack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;fromSymbolStr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;increment&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="nf"&gt;publishEvent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;topics&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;fromU32&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;ledger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getDataFor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&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;increment&lt;/code&gt; function works exactly like the code before with additional &lt;code&gt;topics.pushBack()&lt;/code&gt; function to add topics to the events, and &lt;code&gt;publishEvent()&lt;/code&gt; function to publish the event. A new &lt;code&gt;Vec&lt;/code&gt; instance to store the event's topics. Two topics are added to the &lt;code&gt;Vec&lt;/code&gt;: the COUNTER &lt;code&gt;data&lt;/code&gt; and an "increment" label. Both are converted to their &lt;code&gt;RawVal&lt;/code&gt; representation using the &lt;code&gt;fromSymbolStr&lt;/code&gt; function. The &lt;code&gt;publishEvent&lt;/code&gt; function is then called with the topics and the updated counter value as arguments. Finally, the updated counter value is retrieved from the ledger and returned as the function's output.&lt;/p&gt;

&lt;p&gt;Next, create &lt;code&gt;contract.json&lt;/code&gt; file in your project directory, this file contains metadata for the contract.&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="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Store and Retrieve Data Contract (With Events)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0.1.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"example"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"host_functions_version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;29&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"functions"&lt;/span&gt;&lt;span class="p"&gt;:&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;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"name"&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;span class="s2"&gt;"increment"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"arguments"&lt;/span&gt;&lt;span class="p"&gt;:&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;span class="nl"&gt;"returns"&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;span class="s2"&gt;"u32"&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;span class="p"&gt;]&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;Before compiling the contract, we need to edit the &lt;code&gt;asconfig.json&lt;/code&gt; file of your project. Replace its content with the following:&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="nl"&gt;"extends"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"as-soroban-sdk/sdkasconfig"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"targets"&lt;/span&gt;&lt;span class="p"&gt;:&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;span class="nl"&gt;"release"&lt;/span&gt;&lt;span class="p"&gt;:&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;span class="nl"&gt;"outFile"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"build/release.wasm"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"textFile"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"build/release.wat"&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;span class="nl"&gt;"debug"&lt;/span&gt;&lt;span class="p"&gt;:&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;span class="nl"&gt;"outFile"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"build/debug.wasm"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"textFile"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"build/debug.wat"&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;span class="p"&gt;}&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;The &lt;code&gt;asconfig.json&lt;/code&gt; file is used by the AssemblyScript compiler (asc) to define the configuration for your project.&lt;/p&gt;

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

&lt;p&gt;You need to compile it into WebAssembly first. To do this, you'll use the following command :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx asc assembly/index.ts --target release
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now you should see two new files in the build/ directory: &lt;code&gt;release.wasm&lt;/code&gt; and &lt;code&gt;release.wat&lt;/code&gt;. &lt;/p&gt;

&lt;h2&gt;
  
  
  Running The Contract on Sandbox
&lt;/h2&gt;

&lt;p&gt;Let's run the contract to see if it's works, we're gonna run the contract using &lt;code&gt;soroban-cli&lt;/code&gt; on sandbox using the following command :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;soroban contract invoke &lt;span class="nt"&gt;--wasm&lt;/span&gt; build/release.wasm &lt;span class="nt"&gt;--id&lt;/span&gt; 1 &lt;span class="nt"&gt;--fn&lt;/span&gt; increment
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should get the output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;1
&lt;span class="c"&gt;#0: event: {"ext":"v0","contract_id":"0000000000000000000000000000000000000000000000000000000000000009","type_":"contract","body":{"v0":{"topics":[{"symbol":"COUNTER"},{"symbol":"increment"}],"data":{"u32":1}}}}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run it once more, you should get output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;2
&lt;span class="c"&gt;#0: event: {"ext":"v0","contract_id":"0000000000000000000000000000000000000000000000000000000000000009","type_":"contract","body":{"v0":{"topics":[{"symbol":"COUNTER"},{"symbol":"increment"}],"data":{"u32":2}}}}&lt;/span&gt;
&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%2Fqluq5s9wb8aj04zgjk40.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%2Fqluq5s9wb8aj04zgjk40.png" alt="event"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Closing
&lt;/h2&gt;

&lt;p&gt;This example demonstrates how to create an event-driven smart contract using the Soroban AssemblyScript SDK. By leveraging the ledger, context, value, and vec modules, we can easily interact with the blockchain storage, manage data, and publish events. With this foundation, you can move on to build more advanced and feature-rich smart contracts on the Soroban platform. Happy coding!&lt;/p&gt;

</description>
      <category>assemblyscript</category>
      <category>soroban</category>
      <category>stellar</category>
      <category>smartcontract</category>
    </item>
    <item>
      <title>Storing and Retrieving Data using Soroban Assembly Script SDK</title>
      <dc:creator>darkvallen</dc:creator>
      <pubDate>Wed, 29 Mar 2023 23:08:00 +0000</pubDate>
      <link>https://dev.to/darkvallen/storing-and-retrieving-data-using-soroban-assembly-script-sdk-5e9j</link>
      <guid>https://dev.to/darkvallen/storing-and-retrieving-data-using-soroban-assembly-script-sdk-5e9j</guid>
      <description>&lt;p&gt;Hi! in my &lt;a href="https://dev.to/darkvallen/writing-hello-world-soroban-smart-contract-using-assemblyscript-sdk-4hg3"&gt;previous post&lt;/a&gt;, i already covered how to initialize an assembly script directory, install soroban assembly script SDK and write simple "Hello World" contract, and now we will dive into the realm of storing data in a Soroban smart contract using Soroban Assembly Script SDK.&lt;/p&gt;

&lt;p&gt;We will explore a simple example that demonstrates how to store in a Soroban smart contract. This example will showcase key functions provided by the &lt;code&gt;as-soroban-sdk&lt;/code&gt; library, such as &lt;code&gt;getDataFor&lt;/code&gt;, &lt;code&gt;hasDataFor&lt;/code&gt;, and &lt;code&gt;putDataFor&lt;/code&gt;. &lt;/p&gt;

&lt;h2&gt;
  
  
  The Contract Code
&lt;/h2&gt;

&lt;p&gt;Let's begin by examining the code block:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;RawVal&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;toU32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;fromU32&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;as-soroban-sdk/lib/value&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;ledger&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;as-soroban-sdk/lib/ledger&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this section, we import the necessary modules from the as-&lt;code&gt;soroban-sdk&lt;/code&gt; library. The ledger module provides functions for interacting with the blockchain's storage. The &lt;code&gt;RawVal&lt;/code&gt;, &lt;code&gt;toU32&lt;/code&gt;, and &lt;code&gt;fromU32&lt;/code&gt; type is imported from the value module.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;increment&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="nx"&gt;RawVal&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;COUNTER&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;counter&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;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ledger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hasDataFor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;dataObj&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;ledger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getDataFor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;toU32&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;dataObj&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nx"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nx"&gt;ledger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;putDataFor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;fromU32&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;ledger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getDataFor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&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;Next, &lt;code&gt;increment()&lt;/code&gt;function will be our smart contract entry point. Inside, it will check if there is already data stored under the key "COUNTER" using &lt;code&gt;ledger.hasDataFor()&lt;/code&gt;. If so, retrieve it using &lt;code&gt;ledger.getDataFor()&lt;/code&gt; and convert it to a number using &lt;code&gt;toU32()&lt;/code&gt;. Otherwise, initialize the counter to 0.&lt;/p&gt;

&lt;p&gt;Then increment the counter and store the new value using &lt;code&gt;ledger.putDataFor()&lt;/code&gt;, converting the number to a &lt;code&gt;RawVal&lt;/code&gt; using &lt;code&gt;fromU32()&lt;/code&gt;. Finally, return the updated counter value.&lt;/p&gt;

&lt;p&gt;Next, create &lt;code&gt;contract.json&lt;/code&gt; file in your project directory, this file contains metadata for the contract.&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="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Store and Retrieve Data Contract"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0.1.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"example"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"host_functions_version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;29&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"functions"&lt;/span&gt;&lt;span class="p"&gt;:&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;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"name"&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;span class="s2"&gt;"increment"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"arguments"&lt;/span&gt;&lt;span class="p"&gt;:&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;span class="nl"&gt;"returns"&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;span class="s2"&gt;"u32"&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;span class="p"&gt;]&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;Before compiling the contract, we need to edit the &lt;code&gt;asconfig.json&lt;/code&gt; file of your project. Replace its content with the following:&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="nl"&gt;"extends"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"as-soroban-sdk/sdkasconfig"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"targets"&lt;/span&gt;&lt;span class="p"&gt;:&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;span class="nl"&gt;"release"&lt;/span&gt;&lt;span class="p"&gt;:&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;span class="nl"&gt;"outFile"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"build/release.wasm"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"textFile"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"build/release.wat"&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;span class="nl"&gt;"debug"&lt;/span&gt;&lt;span class="p"&gt;:&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;span class="nl"&gt;"outFile"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"build/debug.wasm"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"textFile"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"build/debug.wat"&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;span class="p"&gt;}&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;The &lt;code&gt;asconfig.json&lt;/code&gt; file is used by the AssemblyScript compiler (asc) to define the configuration for your project.&lt;/p&gt;

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

&lt;p&gt;You need to compile it into WebAssembly first. To do this, you'll use the following command :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx asc assembly/index.ts --target release
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now you should see two new files in the build/ directory: &lt;code&gt;release.wasm&lt;/code&gt; and &lt;code&gt;release.wat&lt;/code&gt;. &lt;/p&gt;

&lt;h2&gt;
  
  
  Running The Contract on Sandbox
&lt;/h2&gt;

&lt;p&gt;Let's run the contract to see if it's works, we're gonna run the contract using &lt;code&gt;soroban-cli&lt;/code&gt; on sandbox using the following command :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;soroban contract invoke &lt;span class="nt"&gt;--wasm&lt;/span&gt; build/release.wasm &lt;span class="nt"&gt;--id&lt;/span&gt; 1 &lt;span class="nt"&gt;--fn&lt;/span&gt; increment
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should get the output:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Run it once more, you should get output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;2
&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%2Fn4bu60pkimhkhrr37i13.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%2Fn4bu60pkimhkhrr37i13.png" alt="Running The Contract"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Closing
&lt;/h2&gt;

&lt;p&gt;This example illustrates how to use the Soroban AssemblyScript SDK to store and retrieve data in a simple smart contract. By utilizing the &lt;code&gt;ledger&lt;/code&gt; and &lt;code&gt;value&lt;/code&gt; modules, we can easily interact with the blockchain storage and retrieve data. With this foundation, you can move on to build more complex and feature-rich smart contracts on the Soroban platform. Happy coding!&lt;/p&gt;

</description>
      <category>soroban</category>
      <category>assemblyscript</category>
      <category>stellar</category>
      <category>smartcontract</category>
    </item>
    <item>
      <title>Performing Atomic Swap using Soroban Python SDK</title>
      <dc:creator>darkvallen</dc:creator>
      <pubDate>Tue, 28 Mar 2023 16:26:58 +0000</pubDate>
      <link>https://dev.to/darkvallen/performing-atomic-swap-using-soroban-python-sdk-3d10</link>
      <guid>https://dev.to/darkvallen/performing-atomic-swap-using-soroban-python-sdk-3d10</guid>
      <description>&lt;p&gt;In my &lt;a href="https://dev.to/darkvallen/checking-token-balance-using-soroban-python-sdk-2lek"&gt;previous post&lt;/a&gt;, I showed you how to check token balance using the Soroban Python SDK. In this post, we'll use Soroban Python SDK to invoke atomic swap example contract. To know more about soroban atomic swap example contract, you can check &lt;a href="https://dev.to/yuzurush/soroban-contracts-101-atomic-swaps-27oc"&gt;this post&lt;/a&gt; written by &lt;a href="https://dev.to/yuzurush/"&gt;yuzurush&lt;/a&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Preparation
&lt;/h1&gt;

&lt;p&gt;The python script that we're going to use is &lt;a href="https://github.com/StellarCN/py-stellar-base/blob/soroban/examples/soroban_auth_atomic_swap.py"&gt;&lt;code&gt;soroban_auth_atomic_swap.py&lt;/code&gt;&lt;/a&gt; from &lt;a href="https://github.com/StellarCN/py-stellar-base/blob/soroban/examples"&gt;Soroban Python SDK Examples Github Repository&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We need 3 accounts: &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;An account to act as the transaction submitter&lt;/li&gt;
&lt;li&gt;An account that wants to swap native tokens for CAT tokens (Alice)&lt;/li&gt;
&lt;li&gt;An account that wants to swap CAT tokens for native tokens (Bob)&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Transaction Submitter
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Public Key  GAERW3OYAVYMZMPMVKHSCDS4ORFPLT5Z3YXA4VM3BVYEA2W7CG3V6YYB
Secret Key  SBPTTA3D3QYQ6E2GSACAZDUFH2UILBNG3EBJCK3NNP7BE4O757KGZUGA
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Alice
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Public Key  GDAT5HWTGIU4TSSZ4752OUC4SABDLTLZFRPZUJ3D6LKBNEPA7V2CIG54
Secret Key  SAAPYAPTTRZMCUZFPG3G66V4ZMHTK4TWA6NS7U4F7Z3IMUD52EK4DDEV
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Bob
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Public Key  GBMLPRFCZDZJPKUPHUSHCKA737GOZL7ERZLGGMJ6YGHBFJZ6ZKMKCZTM
Secret Key  SAEZSI6DY7AXJFIYA4PM6SIBNEYYXIEM2MSOTHFGKHDW32MBQ7KVO6EN
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Checking Tokens Balance Before Swap
&lt;/h2&gt;

&lt;p&gt;First, we will check both tokens (native &amp;amp; CAT) balance on both accounts (Alice &amp;amp; Bob). To check the balances you can read my post &lt;a href="https://dev.to/darkvallen/checking-token-balance-using-soroban-python-sdk-2lek/edit"&gt;here&lt;/a&gt;. Here's both tokens balance on both accounts before swap:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Alice
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Native Token (Lumen in `stroop`): 97999955005
CAT Token: 100000117450
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Bob
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GBMLPRFCZDZJPKUPHUSHCKA737GOZL7ERZLGGMJ6YGHBFJZ6ZKMKCZTM
Native Token (Lumen in `stroop`): 102000023295
CAT Token: 199999882550
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Swapping The Tokens
&lt;/h2&gt;

&lt;p&gt;To swap the tokens, open the &lt;code&gt;soroban_auth_atomic_swap.py&lt;/code&gt; file and you can adjust some of following parameters:&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;submitter_kp&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="n"&gt;from_secret&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"SBPTTA3D3QYQ6E2GSACAZDUFH2UILBNG3EBJCK3NNP7BE4O757KGZUGA"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# GAERW3OYAVYMZMPMVKHSCDS4ORFPLT5Z3YXA4VM3BVYEA2W7CG3V6YYB
&lt;/span&gt;&lt;span class="n"&gt;alice_kp&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="n"&gt;from_secret&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"SAAPYAPTTRZMCUZFPG3G66V4ZMHTK4TWA6NS7U4F7Z3IMUD52EK4DDEV"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# GDAT5HWTGIU4TSSZ4752OUC4SABDLTLZFRPZUJ3D6LKBNEPA7V2CIG54
&lt;/span&gt;&lt;span class="n"&gt;bob_kp&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="n"&gt;from_secret&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"SAEZSI6DY7AXJFIYA4PM6SIBNEYYXIEM2MSOTHFGKHDW32MBQ7KVO6EN"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# GBMLPRFCZDZJPKUPHUSHCKA737GOZL7ERZLGGMJ6YGHBFJZ6ZKMKCZTM
&lt;/span&gt;&lt;span class="n"&gt;atomic_swap_contract_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"828e7031194ec4fb9461d8283b448d3eaf5e36357cf465d8db6021ded6eff05c"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;native_token_contract_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"d93f5c7bb0ebc4a9c8f727c5cebc4e41194d38257e1d0d910356b43bfc528813"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;cat_token_contract_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"8dc97b166bd98c755b0e881ee9bd6d0b45e797ec73671f30e026f14a0f1cce67"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;submitter_kp&lt;/code&gt; - Transaction Submitter Secret Key&lt;br&gt;
&lt;code&gt;alice_kp&lt;/code&gt; - Alice Secret Key&lt;br&gt;
&lt;code&gt;bob_kp&lt;/code&gt; - Bob Secret Key&lt;br&gt;
&lt;code&gt;atomic_swap_contract_id&lt;/code&gt; - Contract ID of Atomic Swap Contract&lt;br&gt;
&lt;code&gt;native_token_contract_id&lt;/code&gt; - Native Token's Contract ID&lt;br&gt;
&lt;code&gt;cat_token_contract_id&lt;/code&gt; - CAT Token's Contract ID&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Note: You can use any accounts as long as they hold both tokens, you can deploy your own atomic swap contract and you can use any token pair (even your own deployed token).&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;Int128&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;  &lt;span class="c1"&gt;# amount_a
&lt;/span&gt;    &lt;span class="n"&gt;Int128&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4500&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;  &lt;span class="c1"&gt;# min_b_for_a
&lt;/span&gt;    &lt;span class="n"&gt;Int128&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5000&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;  &lt;span class="c1"&gt;# amount_b
&lt;/span&gt;    &lt;span class="n"&gt;Int128&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;950&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;  &lt;span class="c1"&gt;# min_a_for_b
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can adjust amount and minimal amount swapped for the tokens, by adjusting these lines of code.&lt;/p&gt;

&lt;p&gt;Save &lt;code&gt;soroban_auth_atomic_swap.py&lt;/code&gt; file with your changes and then run the script in a command prompt using this command :&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;If the transaction resulted successful, then the next step is to check balance of both token on both accounts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Checking Tokens Balance After Swap
&lt;/h2&gt;

&lt;p&gt;After checking balance both tokens on both accounts using the same way when we check before the swap, Here's both tokens balance on both accounts after swap:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Alice
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Native Token (Lumen in `stroop`): 97999953855
CAT Token: 100000121950
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After the Swap Alice's Native Token decreased by 1150 (950 from the swap, 200 for checking both token balances) and her CAT Token increased by 4500.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bob
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GBMLPRFCZDZJPKUPHUSHCKA737GOZL7ERZLGGMJ6YGHBFJZ6ZKMKCZTM
Native Token (Lumen in `stroop`): 102000024045
CAT Token: 199999878050
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After the Swap Bob's Native Token increased by 750 (950 from the swap, decreased by 200 for checking both token balances) and his CAT Token decreased by 4500.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: The fee for checking token balances is 100 Lumens for one time.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So, the swap performed using minimum tokens amount.&lt;/p&gt;

&lt;h2&gt;
  
  
  Closing
&lt;/h2&gt;

&lt;p&gt;In this blog post, we have gone over the steps to perform an atomic swap using the Soroban Python SDK. Cheers!&lt;/p&gt;

</description>
      <category>soroban</category>
      <category>stellar</category>
      <category>python</category>
      <category>sdk</category>
    </item>
    <item>
      <title>Checking Token Balance using Soroban Python SDK</title>
      <dc:creator>darkvallen</dc:creator>
      <pubDate>Fri, 24 Mar 2023 22:12:14 +0000</pubDate>
      <link>https://dev.to/darkvallen/checking-token-balance-using-soroban-python-sdk-2lek</link>
      <guid>https://dev.to/darkvallen/checking-token-balance-using-soroban-python-sdk-2lek</guid>
      <description>&lt;p&gt;In my &lt;a href="https://dev.to/darkvallen/sending-payment-using-soroban-python-sdk-34mk"&gt;Sending Payment using Soroban Python SDK&lt;/a&gt; blog post, I wrote how to check token balance using Soroban-CLI, after few hours i'm start to thinking "&lt;em&gt;How to check token balance using Soroban SDK?&lt;/em&gt;" so after that i tried to write the script. So in this post, we'll use Soroban Python SDK to check token balance. &lt;/p&gt;

&lt;h1&gt;
  
  
  Preparation
&lt;/h1&gt;

&lt;p&gt;First, create a Futurenet account, this account will be used to invoke &lt;code&gt;balance&lt;/code&gt; function from the token contract using Soroban Python SDK. Create account at &lt;a href="https://laboratory.stellar.org/#account-creator?network=futurenet"&gt;Stellar Laboratory&lt;/a&gt; and make sure to fund them. The account that i will be using :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Public Key  GATQFKA7BV7LYYE6UJ2LRL56W3BZRRSWTINA6TG2EM5CCDORFIERAKWV
Secret Key  SCHKLGAGY7QGWUKUFDGHEQMSCPFZNMLEHQE6Y6WPGYGHQIM23T3NJE3C
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The file that we're gonna use : &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://github.com/darkvallen/soroban-python/blob/main/check_token_balance.py"&gt;&lt;code&gt;check_token_balance.py&lt;/code&gt;&lt;/a&gt; - The python script to check the token balance.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Checking the Token Balance
&lt;/h2&gt;

&lt;p&gt;To check the token balance, open the &lt;code&gt;check_token_balance.py&lt;/code&gt; file and adjust the following parameters:&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;contract_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"d93f5c7bb0ebc4a9c8f727c5cebc4e41194d38257e1d0d910356b43bfc528813"&lt;/span&gt;
&lt;span class="n"&gt;tx_submitter_kp&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="n"&gt;from_secret&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"SCHKLGAGY7QGWUKUFDGHEQMSCPFZNMLEHQE6Y6WPGYGHQIM23T3NJE3C"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;tx_submitter_kp&lt;/code&gt;: The secret key of the account whose balance you want to check. &lt;strong&gt;The contract ID that i'm using is native token contract(XLM Lumens)&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;contract_id&lt;/code&gt;: Token Contract ID of the token that you want to check. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Save the &lt;code&gt;check_token_balance&lt;/code&gt; file with your changes.&lt;/p&gt;

&lt;p&gt;Before running the script, i want to explain this specific codes :&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;func_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"balance"&lt;/span&gt;
&lt;span class="n"&gt;args&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Address&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tx_submitter_kp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;public_key&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;

&lt;span class="n"&gt;invocation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;AuthorizedInvocation&lt;/span&gt;&lt;span class="p"&gt;(&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;contract_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;function_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;func_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;sub_invocations&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;contract_auth&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ContractAuth&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;address&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;nonce&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;root_invocation&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;invocation&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;source&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;soroban_server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;load_account&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tx_submitter_kp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;public_key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;tx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;TransactionBuilder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;source&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="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_time_bounds&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append_invoke_contract_function_op&lt;/span&gt;&lt;span class="p"&gt;(&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;contract_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;function_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;func_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;parameters&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;contract_auth&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="n"&gt;build&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;From the script above the function of the token contract that we're going to invoke is &lt;code&gt;balance&lt;/code&gt; function, for more info about Token contract functions check &lt;a href="https://soroban.stellar.org/docs/reference/interfaces/token-interface"&gt;here&lt;/a&gt;. &lt;strong&gt;This script utilizing transaction invoker authorization to invoke the function.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now we will run the script using this command :&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;We will get result:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Your token Balance: 99999999400
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To cross-check it, we can use &lt;a href="https://laboratory.stellar.org/#explorer?resource=accounts&amp;amp;endpoint=single&amp;amp;network=futurenet"&gt;Stellar Laboratory`s&lt;/a&gt; explore endpoints tools.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--AqGOzrTl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5lhdnnwcpbjs6hz2p55b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--AqGOzrTl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5lhdnnwcpbjs6hz2p55b.png" alt="Stellar Laboratory" width="303" height="150"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Closing
&lt;/h2&gt;

&lt;p&gt;In this blog post, we have gone over the steps to Check Token Balance using Soroban Python SDK. From the script you will get an insight how to check token balance using Soroban Python SDK.&lt;/p&gt;

</description>
      <category>soroban</category>
      <category>sorobanathon</category>
      <category>python</category>
      <category>stellar</category>
    </item>
    <item>
      <title>Invoking An Auth Contract with Transaction Invoker Authorization using Soroban Python SDK</title>
      <dc:creator>darkvallen</dc:creator>
      <pubDate>Fri, 24 Mar 2023 13:40:18 +0000</pubDate>
      <link>https://dev.to/darkvallen/invoking-an-auth-contract-with-transaction-invoker-authorization-using-soroban-python-sdk-4em6</link>
      <guid>https://dev.to/darkvallen/invoking-an-auth-contract-with-transaction-invoker-authorization-using-soroban-python-sdk-4em6</guid>
      <description>&lt;p&gt;In my &lt;a href="https://dev.to/darkvallen/deploying-a-wrapped-token-contract-using-soroban-python-sdk-1me2"&gt;previous post&lt;/a&gt;, I showed you how to deploy and invoke an auth contract with stellar account authorization using Soroban Python SDK. In this post, we'll use Soroban Python SDK to invoke an auth contract with transaction invoker authorization. I will use auth contract that already deployed in previous post, so i dont need to deploy it again.&lt;/p&gt;

&lt;h1&gt;
  
  
  Preparation
&lt;/h1&gt;

&lt;p&gt;First, create a Futurenet account, this account will be used to deploy the auth contract and invoke the contract using Soroban Python SDK. Create account at &lt;a href="https://laboratory.stellar.org/#account-creator?network=futurenet"&gt;Stellar Laboratory&lt;/a&gt; and make sure to fund them. The account that i will be using :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Public Key  GATQFKA7BV7LYYE6UJ2LRL56W3BZRRSWTINA6TG2EM5CCDORFIERAKWV
Secret Key  SCHKLGAGY7QGWUKUFDGHEQMSCPFZNMLEHQE6Y6WPGYGHQIM23T3NJE3C
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The files that we're gonna use : &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://github.com/StellarCN/py-stellar-base/blob/soroban/examples/soroban_auth_with_transaction_invoke.py"&gt;&lt;code&gt;soroban_auth_with_transaction_invoke.py&lt;/code&gt;&lt;/a&gt; - The python script to invoke the auth contract with transaction invoker authorization.&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;To invoke the auth contract, open the &lt;code&gt;soroban_auth_with_transaction_invoke.py&lt;/code&gt; file and adjust the following parameters:&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;contract_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"af0aadafacc6bcb73b6ec9aeee03350ca0c6a3430e099d4b5dd371c6e07cc214"&lt;/span&gt;
&lt;span class="n"&gt;tx_submitter_kp&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="n"&gt;from_secret&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"SCHKLGAGY7QGWUKUFDGHEQMSCPFZNMLEHQE6Y6WPGYGHQIM23T3NJE3C"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;tx_submitter_kp&lt;/code&gt;: the secret key of the account you'll use to submit the transaction and invoke the function. &lt;br&gt;
&lt;code&gt;contract_id&lt;/code&gt;: the contract ID of the  auth contract you want to invoke. &lt;strong&gt;Replace the value with the contract ID you received from deploying contract before.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Save the &lt;code&gt;soroban_auth_with_transaction_invoke.py&lt;/code&gt; file with your changes.&lt;/p&gt;

&lt;p&gt;Before running the script, i want to explain this specific codes :&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;func_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"increment"&lt;/span&gt;
&lt;span class="n"&gt;args&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Address&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tx_submitter_kp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;public_key&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;Uint32&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;invocation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;AuthorizedInvocation&lt;/span&gt;&lt;span class="p"&gt;(&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;contract_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;function_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;func_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;sub_invocations&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;contract_auth&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ContractAuth&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;address&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;nonce&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;root_invocation&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;invocation&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;source&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;soroban_server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;load_account&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tx_submitter_kp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;public_key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;tx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;TransactionBuilder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;source&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="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_time_bounds&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append_invoke_contract_function_op&lt;/span&gt;&lt;span class="p"&gt;(&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;contract_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;function_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;func_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;parameters&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;contract_auth&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="n"&gt;build&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;From the script above the function of the contract that we're going to invoke is &lt;code&gt;increment&lt;/code&gt; function and It sets address and &lt;code&gt;nonce&lt;/code&gt; to &lt;code&gt;None&lt;/code&gt; in the &lt;code&gt;ContractAuth&lt;/code&gt;. &lt;strong&gt;This is for transaction invoker authorization, where the transaction sender is the authorizer.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now we will run the script using this command :&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;We will get result:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;transaction result: &amp;lt;SCVal [type=1, u32=&amp;lt;Uint32 [uint32=10]&amp;gt;]&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Closing
&lt;/h2&gt;

&lt;p&gt;In this blog post, we have gone over the steps to Deploy and Invoke Auth Contract with Transaction Invoker Authorization using Soroban Python SDK. From the script you will get an insight how basic Transaction Invoker Authorization implemented in Soroban Python SDK.&lt;/p&gt;

</description>
      <category>soroban</category>
      <category>sorobanathon</category>
      <category>stellar</category>
      <category>python</category>
    </item>
    <item>
      <title>Deploying and Invoking An Auth Contract with Stellar Account Authorization using Soroban Python SDK</title>
      <dc:creator>darkvallen</dc:creator>
      <pubDate>Fri, 24 Mar 2023 08:43:42 +0000</pubDate>
      <link>https://dev.to/darkvallen/deploying-and-invoking-an-auth-contract-with-stellar-account-authorization-using-soroban-python-sdk-4ag7</link>
      <guid>https://dev.to/darkvallen/deploying-and-invoking-an-auth-contract-with-stellar-account-authorization-using-soroban-python-sdk-4ag7</guid>
      <description>&lt;p&gt;In my &lt;a href="https://dev.to/darkvallen/deploying-a-wrapped-token-contract-using-soroban-python-sdk-1me2"&gt;previous post&lt;/a&gt;, I showed you how to deploy a wrapped token contract using Soroban Python SDK. In this post, we'll use Soroban Python SDK to deploy and invoke an auth contract with stellar account authorization.&lt;/p&gt;

&lt;h1&gt;
  
  
  Preparation
&lt;/h1&gt;

&lt;p&gt;First, create a Futurenet account, this account will be used to deploy the auth contract and invoke the contract using Soroban Python SDK. Create account at &lt;a href="https://laboratory.stellar.org/#account-creator?network=futurenet"&gt;Stellar Laboratory&lt;/a&gt; and make sure to fund them. The account that i will be using :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Public Key  GATQFKA7BV7LYYE6UJ2LRL56W3BZRRSWTINA6TG2EM5CCDORFIERAKWV
Secret Key  SCHKLGAGY7QGWUKUFDGHEQMSCPFZNMLEHQE6Y6WPGYGHQIM23T3NJE3C
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The files that we're gonna use : &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://github.com/darkvallen/soroban-python/blob/main/soroban_auth_contract.wasm"&gt;&lt;code&gt;soroban_auth_contract.wasm&lt;/code&gt;&lt;/a&gt; - The Auth Contract&lt;br&gt;
&lt;a href="https://github.com/StellarCN/py-stellar-base/blob/soroban/examples/soroban_deploy_contract.py"&gt;&lt;code&gt;soroban_deploy_contract.py&lt;/code&gt;&lt;/a&gt; - Python Script to Deploy the contract.&lt;br&gt;
&lt;a href="https://github.com/StellarCN/py-stellar-base/blob/soroban/examples/soroban_auth_with_stellar_account.py"&gt;&lt;code&gt;soroban_auth_with_stellar_account&lt;/code&gt;&lt;/a&gt; - Python script to invoke the auth contract with Stellar Account authorization.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Deploying The Contract
&lt;/h2&gt;

&lt;p&gt;To deploy a contract, open the &lt;code&gt;soroban_deploy_contract.py&lt;/code&gt; file and adjust the following parameters:&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;secret&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"SCHKLGAGY7QGWUKUFDGHEQMSCPFZNMLEHQE6Y6WPGYGHQIM23T3NJE3C"&lt;/span&gt; &lt;span class="c1"&gt;#Put your Account Secret Key here
&lt;/span&gt;&lt;span class="n"&gt;rpc_server_url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"https://horizon-futurenet.stellar.cash:443/soroban/rpc"&lt;/span&gt;
&lt;span class="n"&gt;network_passphrase&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Network&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FUTURENET_NETWORK_PASSPHRASE&lt;/span&gt;
&lt;span class="n"&gt;contract_file_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"./soroban_auth_contract.wasm"&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;secret&lt;/code&gt;: the Secret Key of the Account that we're gonna use to deploy the auth contract. &lt;strong&gt;Replace the value with your own account secret key.&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;rpc_server_url&lt;/code&gt;: the URL of the RPC server you'll use to interact with the Soroban Futurenet network.&lt;br&gt;
&lt;code&gt;network_passphrase&lt;/code&gt;: the passphrase you'll use to select the network. This can be changed depending on the network you're interacting with; in this case, we'll use Futurenet.&lt;br&gt;
&lt;code&gt;contract_file_path&lt;/code&gt;:  the path to the auth contract file.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Save the soroban_deploy_contract.py file with your changes and then run the script in a command prompt using this command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;python `soroban_deploy_contract.py`
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once the script has finished running, you'll receive a contract ID. Be sure to save this for later.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;contract id: af0aadafacc6bcb73b6ec9aeee03350ca0c6a3430e099d4b5dd371c6e07cc214
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;To invoke the auth contract, open the &lt;code&gt;soroban_auth_with_stellar_account.py&lt;/code&gt; file and adjust the following parameters:&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;contract_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"af0aadafacc6bcb73b6ec9aeee03350ca0c6a3430e099d4b5dd371c6e07cc214"&lt;/span&gt;
&lt;span class="n"&gt;tx_submitter_kp&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="n"&gt;from_secret&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"SAAPYAPTTRZMCUZFPG3G66V4ZMHTK4TWA6NS7U4F7Z3IMUD52EK4DDEV"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# If tx_submitter_kp and op_invoker_kp use the same account, the submission will fail, a bug?
&lt;/span&gt;&lt;span class="n"&gt;op_invoker_kp&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="n"&gt;from_secret&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"SCHKLGAGY7QGWUKUFDGHEQMSCPFZNMLEHQE6Y6WPGYGHQIM23T3NJE3C"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;tx_submitter_kp&lt;/code&gt;: the secret key of the account you'll use to submit the transaction. &lt;br&gt;
&lt;code&gt;op_invoker_kp&lt;/code&gt;: the secret key of the account you'll use to invoke the contract function. &lt;strong&gt;Replace the value with your own account secret key.&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;contract_id&lt;/code&gt;: the contract ID of the  auth contract you want to invoke. &lt;strong&gt;Replace the value with the contract ID you received from deploying contract before.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Save the &lt;code&gt;soroban_auth_with_account&lt;/code&gt; file with your changes. Note : somehow using the same keypair for &lt;code&gt;tx_submitter_kp&lt;/code&gt; and &lt;code&gt;op_invoker_kp&lt;/code&gt; makes the transaction failed to be sumbited, maybe this is a bug. If it is a bug, this is expected since Soroban is still in development.&lt;/p&gt;

&lt;p&gt;Before running the script, i want to explain this specific codes :&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;nonce&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;soroban_server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_nonce&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;op_invoker_kp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;public_key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;func_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"increment"&lt;/span&gt;
&lt;span class="n"&gt;args&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Address&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;op_invoker_kp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;public_key&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;Uint32&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;invocation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;AuthorizedInvocation&lt;/span&gt;&lt;span class="p"&gt;(&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;contract_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;function_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;func_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;sub_invocations&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;contract_auth&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ContractAuth&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;address&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;Address&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;op_invoker_kp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;public_key&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;nonce&lt;/span&gt;&lt;span class="o"&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;root_invocation&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;invocation&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;contract_auth&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sign&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;op_invoker_kp&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;From the script above the function of the contract that we're going to invoke is &lt;code&gt;increment&lt;/code&gt; function with Stellar Account keypair as the argument, and uses it to get a &lt;code&gt;nonce&lt;/code&gt; and set the address and sign the &lt;code&gt;ContractAuth&lt;/code&gt;. &lt;strong&gt;This is for account authorization, where a specific account address authorizes the invocation.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now we will run the script using this command :&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;We will get result:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;transaction result: &amp;lt;SCVal [type=1, u32=&amp;lt;Uint32 [uint32=10]&amp;gt;]&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;run the script once more, we will get result :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;transaction result: &amp;lt;SCVal [type=1, u32=&amp;lt;Uint32 [uint32=20]&amp;gt;]&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;increment&lt;/code&gt; function that we called worked as intended.&lt;/p&gt;

&lt;h2&gt;
  
  
  Closing
&lt;/h2&gt;

&lt;p&gt;In this blog post, we have gone over the steps to Deploy and Invoke Auth Contract with Account Authorization using Soroban Python SDK. From the script you will get an insight how basic Soroban Account Authorization implemented in Soroban Python SDK.&lt;/p&gt;

</description>
      <category>soroban</category>
      <category>sorobanathon</category>
      <category>stellar</category>
      <category>python</category>
    </item>
    <item>
      <title>Deploying a Wrapped Token Contract using Soroban Python SDK</title>
      <dc:creator>darkvallen</dc:creator>
      <pubDate>Thu, 23 Mar 2023 15:53:04 +0000</pubDate>
      <link>https://dev.to/darkvallen/deploying-a-wrapped-token-contract-using-soroban-python-sdk-1me2</link>
      <guid>https://dev.to/darkvallen/deploying-a-wrapped-token-contract-using-soroban-python-sdk-1me2</guid>
      <description>&lt;p&gt;In my &lt;a href="https://dev.to/darkvallen/sending-payment-using-soroban-python-sdk-34mk/"&gt;previous post&lt;/a&gt;, I showed you how to send payment using Soroban Python SDK. In this post, we'll use Soroban Python SDK to deploy a wrapped token contract.&lt;/p&gt;

&lt;h1&gt;
  
  
  Preparation
&lt;/h1&gt;

&lt;p&gt;First, create a Futurenet account, this account will be used to deploy and act as an admin of the token contract. Create account at &lt;a href="https://laboratory.stellar.org/#account-creator?network=futurenet"&gt;Stellar Laboratory&lt;/a&gt; and make sure to fund them. The account that i will be using :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Public Key  GATQFKA7BV7LYYE6UJ2LRL56W3BZRRSWTINA6TG2EM5CCDORFIERAKWV
Secret Key  SCHKLGAGY7QGWUKUFDGHEQMSCPFZNMLEHQE6Y6WPGYGHQIM23T3NJE3C
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, the python script that we're going to use is &lt;a href="https://github.com/StellarCN/py-stellar-base/blob/soroban/examples/soroban_deploy_create_wrapped_token_contract.py"&gt;&lt;code&gt;soroban_deploy_create_wrapped_token_contract.py&lt;/code&gt;&lt;/a&gt; from &lt;a href="https://github.com/StellarCN/py-stellar-base/blob/soroban/examples"&gt;Soroban Python SDK Examples Github Repository&lt;/a&gt;. These examples written by &lt;a href="https://github.com/overcat"&gt;overcat&lt;/a&gt;, the maintainer of Soroban Python SDK.&lt;/p&gt;

&lt;h2&gt;
  
  
  Deploying the Wrapped Token Contract
&lt;/h2&gt;

&lt;p&gt;To deploy the contract, open the &lt;code&gt;soroban_deploy_create_wrapped_token_contract.py&lt;/code&gt; file and you can adjust some of following parameters:&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;secret&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"SCHKLGAGY7QGWUKUFDGHEQMSCPFZNMLEHQE6Y6WPGYGHQIM23T3NJE3C"&lt;/span&gt;
&lt;span class="n"&gt;rpc_server_url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"https://horizon-futurenet.stellar.cash:443/soroban/rpc"&lt;/span&gt;
&lt;span class="n"&gt;network_passphrase&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Network&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FUTURENET_NETWORK_PASSPHRASE&lt;/span&gt;
&lt;span class="n"&gt;hello_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="s"&gt;"HELLO"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"GATQFKA7BV7LYYE6UJ2LRL56W3BZRRSWTINA6TG2EM5CCDORFIERAKWV"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;secret&lt;/code&gt; - Secret key for deploying contract&lt;br&gt;
&lt;code&gt;rpc_server_url&lt;/code&gt; - RPC Server URL used to deploy the contract&lt;br&gt;
&lt;code&gt;network_passphrase&lt;/code&gt; - Futurenet Network Passphrase&lt;br&gt;
&lt;code&gt;hello_asset&lt;/code&gt; - Symbol of the asset and Account Public Key for Asset Issuer(admin)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Save the &lt;code&gt;soroban_deploy_create_wrapped_token_contract.py&lt;/code&gt; file with your changes and then run the script in a command prompt using this command :&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Result :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ python soroban_deploy_create_wrapped_token_contract.py
simulated transaction: error=None results=[SimulateTransactionResult(auth=None, footprint='AAAAAAAAAAMAAAAGrAPyVAexHS7Lfq1Dh8TlMLNLMSrdfI/FPXD9Brh90u8AAAADAAAAAwAAAAasA/JUB7EdLst+rUOHxOUws0sxKt18j8U9cP0GuH3S7wAAAAQAAAABAAAAAAAAAAEAAAAFAAAABUFkbWluAAAAAAAABqwD8lQHsR0uy36tQ4fE5TCzSzEq3XyPxT1w/Qa4fdLvAAAABAAAAAEAAAAAAAAAAQAAAAUAAAAITWV0YWRhdGE=', xdr='AAAABAAAAAEAAAAGAAAAIKwD8lQHsR0uy36tQ4fE5TCzSzEq3XyPxT1w/Qa4fdLv')] cost=SimulateTransactionCost(cpu_insns=110198, mem_bytes=6463) latest_ledger=572498
setting footprint and signing transaction...
sent transaction: id='eaf6b55ae79ae6202aaff6eecbd9f69b017608ff73a719c89e8929def19ddddd' status=&amp;lt;TransactionStatus.PENDING: 'pending'&amp;gt; error=None
waiting for transaction to be confirmed...
waiting for transaction to be confirmed...
waiting for transaction to be confirmed...
transaction status: id='eaf6b55ae79ae6202aaff6eecbd9f69b017608ff73a719c89e8929def19ddddd' status=&amp;lt;TransactionStatus.SUCCESS: 'success'&amp;gt; envelope_xdr='AAAAAgAAAABtb05lTpeOTUrHyRo/keRPQ+/Rp4LYwgi2VXWHWl4XYAAAAGQACLppAAAABQAAAAEAAAAAAAAAAAAAAABkHHKJAAAAAAAAAAEAAAABAAAAAG1vTmVOl45NSsfJGj+R5E9D79GngtjCCLZVdYdaXhdgAAAAGAAAAAEAAAACAAAAAkhFTExPAAAAAAAAAAAAAABtb05lTpeOTUrHyRo/keRPQ+/Rp4LYwgi2VXWHWl4XYAAAAAEAAAAAAAAAAwAAAAasA/JUB7EdLst+rUOHxOUws0sxKt18j8U9cP0GuH3S7wAAAAMAAAADAAAABqwD8lQHsR0uy36tQ4fE5TCzSzEq3XyPxT1w/Qa4fdLvAAAABAAAAAEAAAAAAAAAAQAAAAUAAAAFQWRtaW4AAAAAAAAGrAPyVAexHS7Lfq1Dh8TlMLNLMSrdfI/FPXD9Brh90u8AAAAEAAAAAQAAAAAAAAABAAAABQAAAAhNZXRhZGF0YQAAAAAAAAAAAAAAAVpeF2AAAABAdx8pRxv6iGWD0ma0uuFV3oKebeDuaC7j80frOO7vKDwP49aWa2sFKVJ2fjph3Xj52lgSs/mNycYXJeSI8OSAAQ==' result_xdr='AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAYAAAAAAAAAAQAAAABAAAABgAAACCsA/JUB7EdLst+rUOHxOUws0sxKt18j8U9cP0GuH3S7wAAAAA=' result_meta_xdr='AAAAAwAAAAIAAAADAAi8UwAAAAAAAAAAbW9OZU6Xjk1Kx8kaP5HkT0Pv0aeC2MIItlV1h1peF2AAAAAXSHbmDAAIumkAAAAEAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAwAAAAAACLxPAAAAAGQccUwAAAAAAAAAAQAIvFMAAAAAAAAAAG1vTmVOl45NSsfJGj+R5E9D79GngtjCCLZVdYdaXhdgAAAAF0h25gwACLppAAAABQAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAMAAAAAAAi8UwAAAABkHHFhAAAAAAAAAAEAAAADAAAAAAAIvFMAAAAGrAPyVAexHS7Lfq1Dh8TlMLNLMSrdfI/FPXD9Brh90u8AAAADAAAAAwAAAAQAAAABAAAABwAAAAEAAAAAAAAAAAAIvFMAAAAGrAPyVAexHS7Lfq1Dh8TlMLNLMSrdfI/FPXD9Brh90u8AAAAEAAAAAQAAAAAAAAABAAAABQAAAAVBZG1pbgAAAAAAAAQAAAABAAAACAAAAAAAAAAAbW9OZU6Xjk1Kx8kaP5HkT0Pv0aeC2MIItlV1h1peF2AAAAAAAAAAAAAIvFMAAAAGrAPyVAexHS7Lfq1Dh8TlMLNLMSrdfI/FPXD9Brh90u8AAAAEAAAAAQAAAAAAAAABAAAABQAAAAhNZXRhZGF0YQAAAAQAAAABAAAAAAAAAAIAAAAFAAAACkFscGhhTnVtMTIAAAAAAAQAAAABAAAAAQAAAAIAAAAFAAAACmFzc2V0X2NvZGUAAAAAAAQAAAABAAAABgAAAAxIRUxMTwAAAAAAAAAAAAAFAAAABmlzc3VlcgAAAAAABAAAAAEAAAAGAAAAIG1vTmVOl45NSsfJGj+R5E9D79GngtjCCLZVdYdaXhdgAAAAAAAAAAAAAAABAAAAAAAAAAAAAABkAAAAAAAAAAEAAAAAAAAAGAAAAAAAAAAEAAAAAQAAAAYAAAAgrAPyVAexHS7Lfq1Dh8TlMLNLMSrdfI/FPXD9Brh90u8AAAAA02fs2dDFBdR8GlynM9VeTwbQ7ckYHpu6eEGF9i75+6LLvEh1Deu4U1CTs96viKx/TP+HQlV2pY3iusdUrNtGFiH5L17VhmgoiSxLNEvY5WWYvlN1y13OW61N4hIpVn6q' results=[SCVal(xdr='AAAABAAAAAEAAAAGAAAAIKwD8lQHsR0uy36tQ4fE5TCzSzEq3XyPxT1w/Qa4fdLv')] error=None
contract id: ac03f25407b11d2ecb7ead4387c4e530b34b312add7c8fc53d70fd06b87dd2ef
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;From the result above we get a contract id of our deployed token contract which is &lt;code&gt;ac03f25407b11d2ecb7ead4387c4e530b34b312add7c8fc53d70fd06b87dd2ef&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;From the contract id, admin can do various token operation such as mint, burn, set admin, and more. For more information of token operations, you can check &lt;a href="https://soroban.stellar.org/docs/reference/interfaces/token-interface"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Now, we will check &lt;code&gt;symbol&lt;/code&gt; of our token-wrapped contract  using the Soroban CLI. We will use this command :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ soroban contract invoke --id ac03f25407b11d2ecb7ead4387c4e530b34b312add7c8fc53d70fd06b87dd2ef --secret-key SAM7O4V6QBSBQPM64IWSTCUOGN34QK6VI4RGWZERNE2OBXHVRCH2VU2V --fn symbol
success
"48454c4c4f"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;From the returned value, we get &lt;code&gt;48454c4c4f&lt;/code&gt;, is in hex. When converted to a string, it becomes "HELLO".&lt;/p&gt;

&lt;h2&gt;
  
  
  Closing
&lt;/h2&gt;

&lt;p&gt;In this blog post, we have gone over the steps to Deploy a Wrapped Token Contract using Soroban Python SDK. You can try to deploy your own token, and try other token operation such as mint, burn, and more using Soroban-CLI.&lt;/p&gt;

</description>
      <category>soroban</category>
      <category>sorobanathon</category>
      <category>stellar</category>
      <category>python</category>
    </item>
    <item>
      <title>Sending Payment using Soroban Python SDK</title>
      <dc:creator>darkvallen</dc:creator>
      <pubDate>Thu, 23 Mar 2023 07:03:51 +0000</pubDate>
      <link>https://dev.to/darkvallen/sending-payment-using-soroban-python-sdk-34mk</link>
      <guid>https://dev.to/darkvallen/sending-payment-using-soroban-python-sdk-34mk</guid>
      <description>&lt;p&gt;In my &lt;a href="https://dev.to/darkvallen/deploy-and-invoke-soroban-smart-contract-using-soroban-python-sdk-i8g"&gt;previous post&lt;/a&gt;, I showed you how to Deploying and Invoking Soroban Smart Contract using Soroban Python SDK. In this post, we'll use Soroban Python SDK to send payment from an account to another account.&lt;/p&gt;

&lt;h1&gt;
  
  
  Preparation
&lt;/h1&gt;

&lt;p&gt;First, create 2 Futurenet account, one act as the sender, and the other one acts as the receipient. Create accounts at &lt;a href="https://laboratory.stellar.org/#account-creator?network=futurenet"&gt;Stellar Laboratory&lt;/a&gt; and make sure to fund them. &lt;/p&gt;

&lt;p&gt;The accounts that i will be using in this guide:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sender Account :
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Public Key: GDVHH3WBEXOBQMK3FLIWTCRQTC3RQFG7JJXI65IVIJYCU6LXFHPB4MHN
Secret Key: SD45JGK4S6NCORR6GK66BBRDWNDU322ZT5RQK6RT6D2T7HNFYK3M63DS
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Receipient Account :
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Public Key: GAZK3F5U26FIRD6RHMH34LT7N6I4BYCV4K3LBMVPFCMIYSAHLHCPV3EL
Secret Key: SANHLH2IOJMJIHE7XA6VG64GOIQRWDVXD4A77LDW2JAAWHOAZMRVBM3S
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, the python script that we're going to use is &lt;a href="https://github.com/StellarCN/py-stellar-base/blob/soroban/examples/soroban_payment.py"&gt;&lt;code&gt;soroban_payment.py&lt;/code&gt;&lt;/a&gt; from &lt;a href="https://github.com/StellarCN/py-stellar-base/blob/soroban/examples"&gt;Soroban Python SDK Examples Github Repository&lt;/a&gt;. These examples written by &lt;a href="https://github.com/overcat"&gt;overcat&lt;/a&gt;, the maintainer of Soroban Python SDK.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sending Payment
&lt;/h2&gt;

&lt;p&gt;To send a contract, open the &lt;code&gt;soroban_payment.py&lt;/code&gt; file and you can adjust the following parameters:&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;alice_kp&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="n"&gt;from_secret&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"SD45JGK4S6NCORR6GK66BBRDWNDU322ZT5RQK6RT6D2T7HNFYK3M63DS"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# GDVHH3WBEXOBQMK3FLIWTCRQTC3RQFG7JJXI65IVIJYCU6LXFHPB4MHN
&lt;/span&gt;&lt;span class="n"&gt;bob_kp&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="n"&gt;from_secret&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"SANHLH2IOJMJIHE7XA6VG64GOIQRWDVXD4A77LDW2JAAWHOAZMRVBM3S"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# GAZK3F5U26FIRD6RHMH34LT7N6I4BYCV4K3LBMVPFCMIYSAHLHCPV3EL
&lt;/span&gt;&lt;span class="n"&gt;native_token_contract_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"d93f5c7bb0ebc4a9c8f727c5cebc4e41194d38257e1d0d910356b43bfc528813"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;alice_kp&lt;/code&gt;- Sender Secret Key&lt;br&gt;
&lt;code&gt;bob_kp&lt;/code&gt; - Receipient Secret Key&lt;br&gt;
&lt;code&gt;native_token_contract_id&lt;/code&gt; - Native token contract id. You can adjust this depends on what asset that you want to send.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;    &lt;span class="n"&gt;Int128&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;  &lt;span class="c1"&gt;# amount, 1000 XLM
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can adjust this line to adjust amount of the asset that you want to send. Note that the amount is in &lt;code&gt;stroops&lt;/code&gt;, and a &lt;code&gt;stroop&lt;/code&gt; is a 10 millionth of a Lumen.&lt;/p&gt;

&lt;p&gt;Quick brief for the changes that i made before :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sender Account : GDVHH3WBEXOBQMK3FLIWTCRQTC3RQFG7JJXI65IVIJYCU6LXFHPB4MHN&lt;/li&gt;
&lt;li&gt;Receipient Account : GAZK3F5U26FIRD6RHMH34LT7N6I4BYCV4K3LBMVPFCMIYSAHLHCPV3EL&lt;/li&gt;
&lt;li&gt;Native Token amount : 1000 XLM (1000.0000000 in &lt;code&gt;stroop&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Save the &lt;code&gt;soroban_payment.py&lt;/code&gt; file with your changes.&lt;/p&gt;

&lt;p&gt;Before running the script, we will check native token balance of each account using Soroban-CLI .&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Account 1:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ soroban contract invoke --id d93f5c7bb0ebc4a9c8f727c5cebc4e41194d38257e1d0d910356b43bfc528813 --secret-key SD45JGK4S6NCORR6GK66BBRDWNDU322ZT5RQK6RT6D2T7HNFYK3M63DS --fn balance -- --id GDVHH3WBEXOBQMK3FLIWTCRQTC3RQFG7JJXI65IVIJYCU6LXFHPB4MHN
success
"99999999900"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Account 2:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;soroban contract invoke --id d93f5c7bb0ebc4a9c8f727c5cebc4e41194d38257e1d0d910356b43bfc528813 --secret-key SANHLH2IOJMJIHE7XA6VG64GOIQRWDVXD4A77LDW2JAAWHOAZMRVBM3S --fn balance -- --id GAZK3F5U26FIRD6RHMH34LT7N6I4BYCV4K3LBMVPFCMIYSAHLHCPV3EL
success
"99999999900"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So both account native token balance now is "99999999900" in &lt;code&gt;stroop&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Then we will send the payment, to send the payment run the script using this command :&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Output :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ python soroban_payment.py 
simulated transaction: error=None results=[SimulateTransactionResult(auth=['AAAAANk/XHuw68SpyPcnxc68TkEZTTglfh0NkQNWtDv8UogTAAAABHhmZXIAAAADAAAABAAAAAEAAAAIAAAAAAAAAADqc+7BJdwYMVsq0WmKMJi3GBTfSm6PdRVCcCp5dyneHgAAAAQAAAABAAAACAAAAAAAAAAAMq2XtNeKiI/ROw++Ln9vkcDgVeK2sLKvKJiMSAdZxPoAAAAEAAAAAQAAAAUAAAACVAvkAAAAAAAAAAAAAAAAAAAAAAA='], footprint='AAAAAgAAAAbZP1x7sOvEqcj3J8XOvE5BGU04JX4dDZEDVrQ7/FKIEwAAAAMAAAADAAAABtk/XHuw68SpyPcnxc68TkEZTTglfh0NkQNWtDv8UogTAAAABAAAAAEAAAAAAAAAAQAAAAUAAAAITWV0YWRhdGEAAAACAAAAAAAAAAAyrZe014qIj9E7D74uf2+RwOBV4rawsq8omIxIB1nE+gAAAAAAAAAA6nPuwSXcGDFbKtFpijCYtxgU30puj3UVQnAqeXcp3h4=', xdr='AAAAAwAAAAA=')] cost=SimulateTransactionCost(cpu_insns=145027, mem_bytes=7805) latest_ledger=566548
setting footprint and signing transaction...
Signed XDR:
AAAAAgAAAADqc+7BJdwYMVsq0WmKMJi3GBTfSm6PdRVCcCp5dyneHgAAAGQACKKAAAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAGAAAAAAAAAAFAAAABAAAAAEAAAAGAAAAINk/XHuw68SpyPcnxc68TkEZTTglfh0NkQNWtDv8UogTAAAABQAAAAR4ZmVyAAAABAAAAAEAAAAIAAAAAAAAAADqc+7BJdwYMVsq0WmKMJi3GBTfSm6PdRVCcCp5dyneHgAAAAQAAAABAAAACAAAAAAAAAAAMq2XtNeKiI/ROw++Ln9vkcDgVeK2sLKvKJiMSAdZxPoAAAAEAAAAAQAAAAUAAAACVAvkAAAAAAAAAAAAAAAAAgAAAAbZP1x7sOvEqcj3J8XOvE5BGU04JX4dDZEDVrQ7/FKIEwAAAAMAAAADAAAABtk/XHuw68SpyPcnxc68TkEZTTglfh0NkQNWtDv8UogTAAAABAAAAAEAAAAAAAAAAQAAAAUAAAAITWV0YWRhdGEAAAACAAAAAAAAAAAyrZe014qIj9E7D74uf2+RwOBV4rawsq8omIxIB1nE+gAAAAAAAAAA6nPuwSXcGDFbKtFpijCYtxgU30puj3UVQnAqeXcp3h4AAAABAAAAANk/XHuw68SpyPcnxc68TkEZTTglfh0NkQNWtDv8UogTAAAABHhmZXIAAAADAAAABAAAAAEAAAAIAAAAAAAAAADqc+7BJdwYMVsq0WmKMJi3GBTfSm6PdRVCcCp5dyneHgAAAAQAAAABAAAACAAAAAAAAAAAMq2XtNeKiI/ROw++Ln9vkcDgVeK2sLKvKJiMSAdZxPoAAAAEAAAAAQAAAAUAAAACVAvkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXcp3h4AAABAimiMyJxLhDdPb25fNl+bKfkkI8RD0ychZkUgVgPwheLVkCE6bw71To868CLD4KJr8ebUE1ZNOut03MLZ6jPFAg==
sent transaction: id='57dd82dc6e43c8d7b311520786e36166db0ab4a5527501293ce29d4dd012d1b4' status=&amp;lt;TransactionStatus.PENDING: 'pending'&amp;gt; error=None
waiting for transaction to be confirmed...
waiting for transaction to be confirmed...
waiting for transaction to be confirmed...
transaction status: id='57dd82dc6e43c8d7b311520786e36166db0ab4a5527501293ce29d4dd012d1b4' status=&amp;lt;TransactionStatus.SUCCESS: 'success'&amp;gt; envelope_xdr='AAAAAgAAAADqc+7BJdwYMVsq0WmKMJi3GBTfSm6PdRVCcCp5dyneHgAAAGQACKKAAAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAGAAAAAAAAAAFAAAABAAAAAEAAAAGAAAAINk/XHuw68SpyPcnxc68TkEZTTglfh0NkQNWtDv8UogTAAAABQAAAAR4ZmVyAAAABAAAAAEAAAAIAAAAAAAAAADqc+7BJdwYMVsq0WmKMJi3GBTfSm6PdRVCcCp5dyneHgAAAAQAAAABAAAACAAAAAAAAAAAMq2XtNeKiI/ROw++Ln9vkcDgVeK2sLKvKJiMSAdZxPoAAAAEAAAAAQAAAAUAAAACVAvkAAAAAAAAAAAAAAAAAgAAAAbZP1x7sOvEqcj3J8XOvE5BGU04JX4dDZEDVrQ7/FKIEwAAAAMAAAADAAAABtk/XHuw68SpyPcnxc68TkEZTTglfh0NkQNWtDv8UogTAAAABAAAAAEAAAAAAAAAAQAAAAUAAAAITWV0YWRhdGEAAAACAAAAAAAAAAAyrZe014qIj9E7D74uf2+RwOBV4rawsq8omIxIB1nE+gAAAAAAAAAA6nPuwSXcGDFbKtFpijCYtxgU30puj3UVQnAqeXcp3h4AAAABAAAAANk/XHuw68SpyPcnxc68TkEZTTglfh0NkQNWtDv8UogTAAAABHhmZXIAAAADAAAABAAAAAEAAAAIAAAAAAAAAADqc+7BJdwYMVsq0WmKMJi3GBTfSm6PdRVCcCp5dyneHgAAAAQAAAABAAAACAAAAAAAAAAAMq2XtNeKiI/ROw++Ln9vkcDgVeK2sLKvKJiMSAdZxPoAAAAEAAAAAQAAAAUAAAACVAvkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXcp3h4AAABAimiMyJxLhDdPb25fNl+bKfkkI8RD0ychZkUgVgPwheLVkCE6bw71To868CLD4KJr8ebUE1ZNOut03MLZ6jPFAg==' result_xdr='AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAYAAAAAAAAAAMAAAAAAAAAAA==' result_meta_xdr='AAAAAwAAAAIAAAADAAilFQAAAAAAAAAA6nPuwSXcGDFbKtFpijCYtxgU30puj3UVQnAqeXcp3h4AAAAXSHbnOAAIooAAAAABAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAwAAAAAACKR9AAAAAGQb8/wAAAAAAAAAAQAIpRUAAAAAAAAAAOpz7sEl3BgxWyrRaYowmLcYFN9Kbo91FUJwKnl3Kd4eAAAAF0h25zgACKKAAAAAAgAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAMAAAAAAAilFQAAAABkG/cfAAAAAAAAAAEAAAAEAAAAAwAIpH8AAAAAAAAAADKtl7TXioiP0TsPvi5/b5HA4FXitrCyryiYjEgHWcT6AAAAF0h255wACKKzAAAAAQAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAMAAAAAAAikfwAAAABkG/QHAAAAAAAAAAEACKUVAAAAAAAAAAAyrZe014qIj9E7D74uf2+RwOBV4rawsq8omIxIB1nE+gAAABmcgsucAAiiswAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAADAAAAAAAIpH8AAAAAZBv0BwAAAAAAAAADAAilFQAAAAAAAAAA6nPuwSXcGDFbKtFpijCYtxgU30puj3UVQnAqeXcp3h4AAAAXSHbnOAAIooAAAAACAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAwAAAAAACKUVAAAAAGQb9x8AAAAAAAAAAQAIpRUAAAAAAAAAAOpz7sEl3BgxWyrRaYowmLcYFN9Kbo91FUJwKnl3Kd4eAAAAFPRrAzgACKKAAAAAAgAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAMAAAAAAAilFQAAAABkG/cfAAAAAAAAAAAAAAABAAAAAQAAAAAAAAAB2T9ce7DrxKnI9yfFzrxOQRlNOCV+HQ2RA1a0O/xSiBMAAAABAAAAAAAAAAMAAAAFAAAACHRyYW5zZmVyAAAABAAAAAEAAAAIAAAAAAAAAADqc+7BJdwYMVsq0WmKMJi3GBTfSm6PdRVCcCp5dyneHgAAAAQAAAABAAAACAAAAAAAAAAAMq2XtNeKiI/ROw++Ln9vkcDgVeK2sLKvKJiMSAdZxPoAAAAEAAAAAQAAAAUAAAACVAvkAAAAAAAAAAAAAAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAYAAAAAAAAAAMAAAAAAAAAAPejOvigTHFs10VgYF7dqNoGlLeGkdjW4rEN4y5/XBZ7G5FOWbTC6I0AebcVUsKYFFB6ixX9jAQ6NqpHwVSltsMzhhDHHyug9wgX+sGGnfU5/niQQOWCkHZShBN5TwmwBA==' results=[SCVal(xdr='AAAAAwAAAAA=')] error=None
transaction result: &amp;lt;SCVal [type=3, ic=0]&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;From above we can see that transaction is success. Let's check the balance of both account again using the same command before.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sender Account:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ soroban contract invoke --id d93f5c7bb0ebc4a9c8f727c5cebc4e41194d38257e1d0d910356b43bfc528813 --secret-key SD45JGK4S6NCORR6GK66BBRDWNDU322ZT5RQK6RT6D2T7HNFYK3M63DS --fn balance -- --id GDVHH3WBEXOBQMK3FLIWTCRQTC3RQFG7JJXI65IVIJYCU6LXFHPB4MHN

success
"89999999700"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Receipient:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ soroban contract invoke --id d93f5c7bb0ebc4a9c8f727c5cebc4e41194d38257e1d0d910356b43bfc528813 --secret-key SANHLH2IOJMJIHE7XA6VG64GOIQRWDVXD4A77LDW2JAAWHOAZMRVBM3S --fn balance -- --id GAZK3F5U26FIRD6RHMH34LT7N6I4BYCV4K3LBMVPFCMIYSAHLHCPV3EL

success
"109999999800"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;From the results above we can see 1000XLM(10000000000 in &lt;code&gt;stroop&lt;/code&gt;) from Sender Account has been sent to Receipient Account.&lt;/p&gt;

&lt;h2&gt;
  
  
  Closing
&lt;/h2&gt;

&lt;p&gt;In this blog post, we have gone over the steps to Send Payment using Soroban Python SDK. You can send your own payments modifying the scripts.&lt;/p&gt;

</description>
      <category>soroban</category>
      <category>sorobanathon</category>
      <category>stellar</category>
      <category>python</category>
    </item>
  </channel>
</rss>
