<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Liam Zebedee</title>
    <description>The latest articles on Forem by Liam Zebedee (@liamzebedee).</description>
    <link>https://forem.com/liamzebedee</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%2F75548%2F17715b1a-ea14-45c4-bb5e-c1610cf7b649.jpeg</url>
      <title>Forem: Liam Zebedee</title>
      <link>https://forem.com/liamzebedee</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/liamzebedee"/>
    <language>en</language>
    <item>
      <title>A Primer on Seth, Solidity's Swiss Army Knife</title>
      <dc:creator>Liam Zebedee</dc:creator>
      <pubDate>Sun, 16 Jun 2019 18:40:07 +0000</pubDate>
      <link>https://forem.com/liamzebedee/a-primer-on-seth-solidity-s-swiss-army-knife-mi3</link>
      <guid>https://forem.com/liamzebedee/a-primer-on-seth-solidity-s-swiss-army-knife-mi3</guid>
      <description>&lt;p&gt;Tired of writing &lt;code&gt;new Web3&lt;/code&gt; in a JS script just to check a balance? Annoyed about the friction of converting things to BigNumber, loading &lt;code&gt;Contract.json&lt;/code&gt;, dealing with promises just to do something simple? Well let me introduce you to &lt;code&gt;seth&lt;/code&gt;. Using &lt;code&gt;seth&lt;/code&gt;, you can easily interact with smart contracts with the speed and dexterity of the command line. It's part of a suite of tools developed by the MakerDAO team, of DAI acclaim. In this post, you're going to go from 0 to hero.&lt;/p&gt;

&lt;h2&gt;
  
  
  Introduction to seth
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://github.com/dapphub/dapptools/tree/master/src/seth"&gt;Seth reference guide&lt;/a&gt; on Github is great, but it misses some lessons that won't be obvious if you're not a power user of the CLI. I'm going to explain some really simple techniques from the perspective of these use cases:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;deploying a Truffle contract&lt;/li&gt;
&lt;li&gt;saving a contract's deployment address&lt;/li&gt;
&lt;li&gt;calling methods and passing arguments&lt;/li&gt;
&lt;li&gt;transacting from different accounts&lt;/li&gt;
&lt;li&gt;converting units (numbers, eth)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Installing seth
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;seth&lt;/code&gt; is part of the &lt;code&gt;dapptools&lt;/code&gt; suite, which is a super-minimal package of software (like 5kB). Taken from their &lt;a href="https://github.com/dapphub/dapptools"&gt;Github instructions&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl https://dapp.tools/install | sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Deploying a Truffle contract
&lt;/h3&gt;

&lt;p&gt;Seth is based on the unix philosophy, which puts files at its core. You've probably gotten used to some monolithic framework like Truffle, which puts you in the backseat while it takes care of business. Running &lt;code&gt;truffle compile&lt;/code&gt;, it will generate contract artifacts in the form of &lt;code&gt;build/contracts/ContractName.json&lt;/code&gt;. And running &lt;code&gt;truffle migrate&lt;/code&gt;, it will automatically take the bytecode of these contracts and deploy them.&lt;/p&gt;

&lt;p&gt;It might seem scary, but the details aren't actually that complex to do ourselves! &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--okDWUZei--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/784r3viwrckuhwkblkoz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--okDWUZei--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/784r3viwrckuhwkblkoz.png" alt=""&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--jne747f_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/4x41j7q1s4tpby6tbqcx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jne747f_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/4x41j7q1s4tpby6tbqcx.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But wait, what's the difference between &lt;code&gt;bytecode&lt;/code&gt; and &lt;code&gt;deployedBytecode&lt;/code&gt;? Well, when you deploy a contract in Ethereum, you're doing two things:&lt;/p&gt;

&lt;p&gt;1) you're creating a contract, which stores its runtime code on the chain&lt;br&gt;
 2) you're calling the constructor&lt;/p&gt;

&lt;p&gt;Simply put - the &lt;code&gt;deployedBytecode&lt;/code&gt; is just the runtime, whereas the &lt;code&gt;bytecode&lt;/code&gt; includes the code of the constructor. &lt;/p&gt;

&lt;p&gt;Let's see how easy it is to deploy a contract using seth. To begin with, we're going to install &lt;code&gt;jq&lt;/code&gt;, a CLI tool which can parse JSON. You can find &lt;a href="https://stedolan.github.io/jq/download/"&gt;installation instructions here&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Get the bytecode from the Truffle artifact&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;CODE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;cat &lt;/span&gt;build/contracts/ERC20.json | jq &lt;span class="nt"&gt;-r&lt;/span&gt; .bytecode&lt;span class="si"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Setting up seth's environment
&lt;/h4&gt;

&lt;p&gt;Run the below to setup the environment variables seth needs to know:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Connect to the local node&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ETH_RPC_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://127.0.0.1:8545

&lt;span class="c"&gt;# Disable below if not on Truffle&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ETH_GAS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;4712388

&lt;span class="c"&gt;# Use the unlocked RPC accounts&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ETH_RPC_ACCOUNTS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;yes&lt;/span&gt;

&lt;span class="c"&gt;# Get the 1st account and use it&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ETH_FROM&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;seth accounts | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-n1&lt;/span&gt; | &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'{ print $1 }'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Deploying the contract
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# We can write it simply&lt;/span&gt;
seth send &lt;span class="nt"&gt;--create&lt;/span&gt; &lt;span class="nv"&gt;$CODE&lt;/span&gt;

&lt;span class="c"&gt;# Passing variables to the constructor&lt;/span&gt;
&lt;span class="c"&gt;# In this example, the constructor is ERC20Detailed&lt;/span&gt;
&lt;span class="c"&gt;# constructor(string name, string symbol, uint decimals)&lt;/span&gt;
seth send &lt;span class="nt"&gt;--create&lt;/span&gt; &lt;span class="nv"&gt;$CODE&lt;/span&gt; TokenName TOK 18
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Running the above, you will get an output like so:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;seth-send: Published transaction with 3227 bytes of calldata.
seth-send: 0xb330d69093fd6b19d5afecffebf6734f77ef8d7cf47dabb87ad840a7d4b8e57f
seth-send: Waiting for transaction receipt....
seth-send: Transaction included in block 36.
0x243e72b69141f6af525a9a5fd939668ee9f2b354
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The last line is the contract address.&lt;/p&gt;

&lt;h3&gt;
  
  
  Saving a contract's deployment address
&lt;/h3&gt;

&lt;p&gt;I'm not that skilled in Bash - but I do know one thing: I'm not reinventing the wheel when I want to save the deployment address. Using Sourcegraph (which is grep+git on steroids), I just &lt;a href="https://sourcegraph.com/search?q=repo:%5Egithub%5C.com/dapphub+seth+send+"&gt;searched for &lt;code&gt;seth send&lt;/code&gt; across all of dapphub's repos&lt;/a&gt; and was able to grab the line below.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;ERC20_ADDR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;seth send &lt;span class="nt"&gt;--create&lt;/span&gt; &lt;span class="nv"&gt;$CODE&lt;/span&gt; &lt;span class="nt"&gt;--status&lt;/span&gt; 2&amp;gt;/dev/null&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;# or even terser&lt;/span&gt;
&lt;span class="nv"&gt;ERC20_ADDR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;seth send &lt;span class="nt"&gt;--create&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;cat &lt;/span&gt;build/contracts/ERC20.json | jq &lt;span class="nt"&gt;-r&lt;/span&gt; .bytecode&lt;span class="si"&gt;)&lt;/span&gt; &lt;span class="nt"&gt;--status&lt;/span&gt; 2&amp;gt;/dev/null&lt;span class="si"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;2&amp;gt;/dev/null&lt;/code&gt; basically redirects STDERR (see &lt;a href="https://en.wikipedia.org/wiki/Standard_streams"&gt;Standard streams&lt;/a&gt;) to null. All of the misc logging by seth is ignored and we are left with the contract address. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If the deployment fails&lt;/strong&gt;, there's no &lt;code&gt;.catch&lt;/code&gt; or burdensome Promises to deal with. The &lt;code&gt;$ERC20_ADDR&lt;/code&gt; variable will be empty. If we are automating this in a script, it's wise to make sure it exits early in case of failure. Check this out:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;-ex&lt;/span&gt;

&lt;span class="c"&gt;# Connect to the local node&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ETH_RPC_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://127.0.0.1:8545

&lt;span class="c"&gt;# Disable below if not on Truffle&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ETH_GAS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;4712388

&lt;span class="c"&gt;# Use the unlocked RPC accounts&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ETH_RPC_ACCOUNTS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;yes&lt;/span&gt;

&lt;span class="c"&gt;# Get the 1st account and use it&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ETH_FROM&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;seth accounts | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-n1&lt;/span&gt; | &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'{ print $1 }'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="nv"&gt;ERC20_ADDR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;seth send &lt;span class="nt"&gt;--create&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;cat &lt;/span&gt;build/contracts/ERC20.json | jq &lt;span class="nt"&gt;-r&lt;/span&gt; .bytecode&lt;span class="si"&gt;)&lt;/span&gt; &lt;span class="nt"&gt;--status&lt;/span&gt; 2&amp;gt;/dev/null&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="nv"&gt;$ERC20_ADDR&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; ERC20.deployment
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Boom! We've just saved the address to a file that we can load later!&lt;/p&gt;

&lt;h3&gt;
  
  
  Calling methods and passing arguments
&lt;/h3&gt;

&lt;p&gt;This is probably the best part of Seth. Calling methods on contracts couldn't be easier with this tool, because &lt;strong&gt;you don't have to load the JSON ABI"&lt;/strong&gt; to interact with contracts. &lt;/p&gt;

&lt;p&gt;For example, say we're testing this token contract and we want to mint ourselves some tokens. This is how simple it is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Get the contracts address&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ERC20_ADDR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;cat &lt;/span&gt;ERC20.deployment&lt;span class="si"&gt;)&lt;/span&gt;

seth send &lt;span class="nv"&gt;$ERC20_ADDR&lt;/span&gt; &lt;span class="s2"&gt;"mint(uint256)"&lt;/span&gt; 1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Likewise, if a method has a return value, you just have to show seth how to decode it. What we're passing is the method signature, but in a much simpler form than the full method - &lt;code&gt;method(&amp;lt;types&amp;gt;)(&amp;lt;return-types&amp;gt;)&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Get the balance of our address&lt;/span&gt;
seth send &lt;span class="nv"&gt;$ERC20_ADDR&lt;/span&gt; &lt;span class="s2"&gt;"balanceOf(address)(uint)"&lt;/span&gt; &lt;span class="nv"&gt;$ETH_FROM&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Transacting from different accounts
&lt;/h3&gt;

&lt;p&gt;Oftentimes, we're using &lt;code&gt;msg.sender&lt;/code&gt; in our contract logic. When it comes time to testing, then we probably want to use different accounts for interacting. Seth makes this super easy using the &lt;code&gt;ETH_FROM&lt;/code&gt; variable.&lt;/p&gt;

&lt;p&gt;We've already been using a global &lt;code&gt;ETH_FROM&lt;/code&gt; to begin with, but it's pretty simple to use per-call too.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;BUYER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;seth accounts | &lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; 2p | &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'{ print $1 }'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;

seth send &lt;span class="nt"&gt;--from&lt;/span&gt; &lt;span class="nv"&gt;$BUYER&lt;/span&gt; &lt;span class="nt"&gt;--value&lt;/span&gt; 402343423423423 &lt;span class="nv"&gt;$EXCHANGE&lt;/span&gt; &lt;span class="s2"&gt;"ethToTokenSwapInput(uint256,uint256)"&lt;/span&gt; 3 1000000000000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The above example calls &lt;code&gt;ethToTokenSwapInput&lt;/code&gt; on a Uniswap exchange, from a specific account I've allocated called the $BUYER. It also makes use of &lt;code&gt;--value&lt;/code&gt; to send some ether with the transaction.&lt;/p&gt;

&lt;h3&gt;
  
  
  Converting units (numbers, eth)
&lt;/h3&gt;

&lt;p&gt;This brings me to my last important teaching on Seth - converting units. In Ethereum, we deal with &lt;code&gt;uint256&lt;/code&gt; as our default, and ether and other tokens are &lt;em&gt;usually&lt;/em&gt; designed to be shown with 18 decimal places. Seth makes it easy to convert between these different formats.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;seth &lt;span class="nt"&gt;--to-dec&lt;/span&gt; 0000000000000cb803 eth
&lt;span class="c"&gt;# 833539&lt;/span&gt;

seth &lt;span class="nt"&gt;--from-wei&lt;/span&gt; &amp;lt;decimal-amount&amp;gt;
&lt;span class="c"&gt;# 0.123&lt;/span&gt;

seth &lt;span class="nt"&gt;--to-wei&lt;/span&gt; &amp;lt;decimal-value&amp;gt;
&lt;span class="c"&gt;# 123&lt;/span&gt;

seth &lt;span class="nt"&gt;--to-ascii&lt;/span&gt; 67646179206d617465
&lt;span class="c"&gt;# ... ;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;I think &lt;code&gt;seth&lt;/code&gt; is a fantastic investment as a developer in Ethereum's ecocsystem. Given the inherent complexity in a whole new platform of tooling, &lt;code&gt;seth&lt;/code&gt; is a pragmatic approach to inspecting, experimenting, and iterating on blockchain software.&lt;/p&gt;

&lt;p&gt;☕️ If you liked this guide, consider following &lt;a href="https://twitter.com/liamzebedee%5D"&gt;me on Twitter&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;😎 I enjoy learning and teaching, and do it regularly. Here's some links you might find interesting too:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;my &lt;a href="https://github.com/liamzebedee/awesome-solidity-patterns"&gt;awesome-solidity-patterns&lt;/a&gt; repo&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/liamzebedee/how-to-link-libraries-into-solidity-contracts-generated-by-sol-compiler-34b3"&gt;How to link libraries into Solidity contracts generated by sol-compiler&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;my blog, &lt;a href="https://liamz.co/blog/"&gt;Regular Fascination&lt;/a&gt;, with a bit more in-depth content&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://twitter.com/liamzebedee"&gt;@liamzebedee&lt;/a&gt; for interesting links/discussions in tech&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ethereum</category>
      <category>blockchain</category>
      <category>solidity</category>
      <category>web3</category>
    </item>
    <item>
      <title>How to link libraries into Solidity contracts generated by sol-compiler</title>
      <dc:creator>Liam Zebedee</dc:creator>
      <pubDate>Thu, 18 Apr 2019 11:43:17 +0000</pubDate>
      <link>https://forem.com/liamzebedee/how-to-link-libraries-into-solidity-contracts-generated-by-sol-compiler-34b3</link>
      <guid>https://forem.com/liamzebedee/how-to-link-libraries-into-solidity-contracts-generated-by-sol-compiler-34b3</guid>
      <description>

&lt;p&gt;Solidity smart contracts are generated from source into bytecode. However, much like the days of yore in C, &lt;strong&gt;linking&lt;/strong&gt; in other libraries that may already be deployed is sometimes a necessity. &lt;/p&gt;

&lt;p&gt;When a Solidity artifact is generated using Truffle or sol-compiler, there is a field called &lt;code&gt;bytecode&lt;/code&gt; or &lt;code&gt;deployedBytecode&lt;/code&gt;. If you have unlinked libraries and try to deploy this code, you will get an error along the lines of &lt;strong&gt;invalid contract bytecode&lt;/strong&gt;:&lt;/p&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{ Error: invalid contract bytecode (arg="bytecode", value="0x608060405260016004554360075543600__$e66798aa9224cd2742272d2e7f8089dbe6$__ffffffffffffffffffffffffffffffffffffffff1660601b81526014018281526020019350505050604051602081830303815290604052805190602001209050939250505056fea165627a7a72305820fdb2e9c02d3de9057e4d439bc377d8c8ae842b83649e495e3303688bfe6f7e930029", version=4.0.26)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;If you examine deeper, you can see there is a very non-hexadecimal looking character &lt;code&gt;$&lt;/code&gt; which is the beginning of a link reference. The link reference itself is a string &lt;code&gt;__$e66798aa9224cd2742272d2e7f8089dbe6$__&lt;/code&gt;. This used to have a more human-readable name, such as &lt;code&gt;____________________$Library$_&lt;/code&gt;, but it was changed to a more arcane algorithm. The &lt;a href="https://sourcegraph.com/github.com/ethereum/solc-js@40b8fc3e0b5f80b6629d6f9c4d7d19c190e6c388/-/blob/linker.js#L7"&gt;libraryHashPlaceholder&lt;/a&gt; method creates this format, but what is the input we are giving it? It is of the form, &lt;code&gt;libraryName:lib&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;For example, my &lt;code&gt;MerkleTreeVerifier&lt;/code&gt; library would have the name:&lt;/p&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;libraryHashPlaceholder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'/Users/liamz/Documents/open-source/0dex/packages/contracts/contracts/MerkleTreeVerifier.sol:MerkleTreeVerifier'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;// '$1eb98b648b444978ea3820de6fcdeb48d6$'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Integrating with sol-compiler
&lt;/h2&gt;

&lt;p&gt;Now for the 0x compiler, you will need to do two things. Note that I'm also using &lt;a href="https://www.npmjs.com/package/@0xproject/abi-gen"&gt;abi-gen&lt;/a&gt; to generate TypeScript wrappers of our contracts.&lt;/p&gt;

&lt;p&gt;1) Enable the &lt;code&gt;metadata&lt;/code&gt; option in &lt;code&gt;compiler.json&lt;/code&gt;. For example, here is mine:&lt;/p&gt;



&lt;div class="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="s2"&gt;"contractsDir"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"contracts"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"artifactsDir"&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/artifacts"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"contracts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&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;"compilerSettings"&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="s2"&gt;"optimizer"&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="s2"&gt;"enabled"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&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;"outputSelection"&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="s2"&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="s2"&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="s2"&gt;"metadata"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                    &lt;/span&gt;&lt;span class="s2"&gt;"abi"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                    &lt;/span&gt;&lt;span class="s2"&gt;"evm.bytecode.object"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                    &lt;/span&gt;&lt;span class="s2"&gt;"evm.bytecode.sourceMap"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                    &lt;/span&gt;&lt;span class="s2"&gt;"evm.deployedBytecode.object"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                    &lt;/span&gt;&lt;span class="s2"&gt;"evm.deployedBytecode.sourceMap"&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;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;2) Add your libraries and link them. &lt;/p&gt;



&lt;div class="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="nx"&gt;addLibrary&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&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="nx"&gt;string&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;artifact&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`@ohdex/contracts/lib/build/artifacts/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.json`&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;metadata&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;artifact&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;compilerOutput&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;k&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nx"&gt;v&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;entries&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;settings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;compilationTarget&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="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;k&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;v&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Registered library &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; to &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="nx"&gt;libraries&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;address&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Deployment of libraries&lt;/span&gt;
&lt;span class="c1"&gt;// Note that if the library already exists, we just add the address instead&lt;/span&gt;
&lt;span class="c1"&gt;// ....&lt;/span&gt;

&lt;span class="c1"&gt;// Your sol-compiler generated wrapper&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;MerkleTreeVerifierContract&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="s1"&gt;'@ohdex/contracts/lib/build/wrappers/merkle_tree_verifier'&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;merkleTreeVerifier&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kr"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;MerkleTreeVerifierContract&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;deployAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;getDeployArgs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'MerkleTreeVerifier'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;pe&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;account&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;addLibrary&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'MerkleTreeVerifier'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;merkleTreeVerifier&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="c1"&gt;// Linking libraries to your own contracts&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;json&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`@ohdex/contracts/lib/build/artifacts/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.json`&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;bytecode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;compilerOutput&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;evm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;bytecode&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;object&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;bytecode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;linker&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;linkBytecode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;bytecode&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;libraries&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;And tada! You've linked your libraries and deployed your contract!&lt;/p&gt;


</description>
      <category>ethereum</category>
      <category>solidity</category>
      <category>solcompiler</category>
      <category>typescript</category>
    </item>
  </channel>
</rss>
