07-08-2022, 12:14 PM
Layout of a Solidity Source File
<div><div class="kk-star-ratings kksr-valign-top kksr-align-left " data-payload="{"align":"left","id":"455693","slug":"default","valign":"top","reference":"auto","count":"1","readonly":"","score":"5","best":"5","gap":"5","greet":"Rate this post","legend":"5\/5 - (1 vote)","size":"24","width":"142.5","_legend":"{score}\/{best} - ({count} {votes})"}">
<div class="kksr-stars">
<div class="kksr-stars-inactive">
<div class="kksr-star" data-star="1" style="padding-right: 5px">
<div class="kksr-icon" style="width: 24px; height: 24px;"></div>
</p></div>
<div class="kksr-star" data-star="2" style="padding-right: 5px">
<div class="kksr-icon" style="width: 24px; height: 24px;"></div>
</p></div>
<div class="kksr-star" data-star="3" style="padding-right: 5px">
<div class="kksr-icon" style="width: 24px; height: 24px;"></div>
</p></div>
<div class="kksr-star" data-star="4" style="padding-right: 5px">
<div class="kksr-icon" style="width: 24px; height: 24px;"></div>
</p></div>
<div class="kksr-star" data-star="5" style="padding-right: 5px">
<div class="kksr-icon" style="width: 24px; height: 24px;"></div>
</p></div>
</p></div>
<div class="kksr-stars-active" style="width: 142.5px;">
<div class="kksr-star" style="padding-right: 5px">
<div class="kksr-icon" style="width: 24px; height: 24px;"></div>
</p></div>
<div class="kksr-star" style="padding-right: 5px">
<div class="kksr-icon" style="width: 24px; height: 24px;"></div>
</p></div>
<div class="kksr-star" style="padding-right: 5px">
<div class="kksr-icon" style="width: 24px; height: 24px;"></div>
</p></div>
<div class="kksr-star" style="padding-right: 5px">
<div class="kksr-icon" style="width: 24px; height: 24px;"></div>
</p></div>
<div class="kksr-star" style="padding-right: 5px">
<div class="kksr-icon" style="width: 24px; height: 24px;"></div>
</p></div>
</p></div>
</div>
<div class="kksr-legend"> 5/5 – (1 vote) </div>
</div>
<p>In this article, I am going to explain the fundamentals of a Solidity source file structure. In a way, a rookie (like me and you) can understand the basics of <a href="https://blog.finxter.com/smart-contracts-and-evm/" data-type="post" data-id="92507" target="_blank" rel="noreferrer noopener">Ethereum</a> programming.</p>
<p>First things first – the <a rel="noreferrer noopener" href="https://blog.finxter.com/solidity-crash-course/" data-type="URL" data-id="https://blog.finxter.com/solidity-crash-course/" target="_blank">Solidity</a> file that stores your code will have a <code>.sol</code> extension.</p>
<p>Take action.</p>
<ol>
<li>In your favorite browser go to <a href="https://remix.ethereum.org/" target="_blank" rel="noreferrer noopener">https://remix.ethereum.org/</a> </li>
<li>Using Create New File create a new <code>finxter.sol</code> file</li>
</ol>
<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" width="1024" height="475" src="https://blog.finxter.com/wp-content/uploads/2022/07/image-30-1024x475.png" alt="" class="wp-image-455702" srcset="https://blog.finxter.com/wp-content/uploads/2022/07/image-30-1024x475.png 1024w, https://blog.finxter.com/wp-content/uplo...00x139.png 300w, https://blog.finxter.com/wp-content/uplo...68x357.png 768w, https://blog.finxter.com/wp-content/uplo...age-30.png 1400w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
</div>
<p>Well done. Your file – empty so far – is ready for more actions!</p>
<p>In this article, we’ll add (i) license identifier, (ii) pragma, (iii) another file via import, and (iv) add some comments.</p>
<p>The actual <a href="https://blog.finxter.com/introduction-to-smart-contracts-and-solidity/" data-type="post" data-id="445145" target="_blank" rel="noreferrer noopener">smart contract code</a> is out of scope here but check out other <a href="https://blog.finxter.com/email-academy/" data-type="page" data-id="12278" target="_blank" rel="noreferrer noopener">Finxter tutorials</a> – there is plenty of that.</p>
<h2>License Identifier</h2>
<p>I know you are eager to get to the meat, but before you jump there, bear with me. The so-called SPDX license identifier is the first element you need to jot down.</p>
<p>What the heck is that? SPDX, or the Software Package Data Exchange, is an international, open standard for communicating software information including licenses or copyrights. </p>
<p>Being a standard means that many companies and organizations have agreed to do some things in a certain way. And Solidity has also adopted that standard.</p>
<p>Why bother, you ask? </p>
<p>Well, your code will be transparent in a blockchain and that transparency triggers copyright issues. The SPDX identifier hence allows you to specify what you allow others to do with your code. And vice versa, you learn what you can do with other people’s code too.</p>
<p>An example comment line with an identifier would be:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">// SPDX-License-Identifier: MIT</pre>
<p>What this means is:</p>
<p class="has-global-color-8-background-color has-background"><img src="https://s.w.org/images/core/emoji/14.0.0/72x72/1f469-200d-2696-fe0f.png" alt="?⚖️" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, [etc etc…]</p>
<p>SPDX license list has over 450 various license identifiers! </p>
<p>But don’t worry too much now, we are here to learn Solidity, not the legal twists. So for now, take my word and use MIT as your default one. Or if you do not want to specify a license or if the source code is not open-source, please use the special value UNLICENSED.</p>
<p class="has-base-background-color has-background"><img src="https://s.w.org/images/core/emoji/14.0.0/72x72/1f6d1.png" alt="?" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Caution here folks – UNLICENSE (without ‘d’ at the end) is a completely different license! Open door type of one. It offers free and unencumbered software released into the public domain.</p>
<p>By the way, a good rule of thumb is to use the OSI-approved ones when browsing <a rel="noreferrer noopener" href="https://spdx.org/licenses/" target="_blank">https://spdx.org/licenses/</a>. “Only” about 120+ options for consideration.</p>
<p>Does that identifier do anything technically to your code? No, it won’t break how it works. After all, it is a comment.</p>
<p>But from Solidity >=0.6.8 (so 0.6.8 and any higher), that comment <strong>must</strong> be part of your code. Otherwise expect a Warning in your compiler.</p>
<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" width="436" height="153" src="https://blog.finxter.com/wp-content/uploads/2022/07/image-29.png" alt="" class="wp-image-455701" srcset="https://blog.finxter.com/wp-content/uploads/2022/07/image-29.png 436w, https://blog.finxter.com/wp-content/uplo...00x105.png 300w" sizes="(max-width: 436px) 100vw, 436px" /></figure>
</div>
<p>The compiler checks the existence but does not know if your identifier is the right one (if it exists in the SPDX list). Starting in Solidity 0.8.8 it checks for multiple SPDX license identifiers next to each other and validates them. It still allows you to play with it though <img src="https://s.w.org/images/core/emoji/14.0.0/72x72/1f642.png" alt="?" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p>In 0.8.7 you could easily get away with some crazy identifier.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">// SPDX-License-Identifier: cheating_on_you pragma solidity 0.8.7;</pre>
<p>From 0.8.8 onwards it actually starts to pay attention and throws errors. Note the red error icon on the left in line 1.</p>
<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" width="840" height="214" src="https://blog.finxter.com/wp-content/uploads/2022/07/image-28.png" alt="" class="wp-image-455700" srcset="https://blog.finxter.com/wp-content/uploads/2022/07/image-28.png 840w, https://blog.finxter.com/wp-content/uplo...300x76.png 300w, https://blog.finxter.com/wp-content/uplo...68x196.png 768w" sizes="(max-width: 840px) 100vw, 840px" /></figure>
</div>
<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" width="570" height="310" src="https://blog.finxter.com/wp-content/uploads/2022/07/image-27.png" alt="" class="wp-image-455699" srcset="https://blog.finxter.com/wp-content/uploads/2022/07/image-27.png 570w, https://blog.finxter.com/wp-content/uplo...00x163.png 300w" sizes="(max-width: 570px) 100vw, 570px" /></figure>
</div>
<p>Same happens when you add multiple licenses inappropriately. </p>
<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" width="824" height="254" src="https://blog.finxter.com/wp-content/uploads/2022/07/image-26.png" alt="" class="wp-image-455698" srcset="https://blog.finxter.com/wp-content/uploads/2022/07/image-26.png 824w, https://blog.finxter.com/wp-content/uplo...300x92.png 300w, https://blog.finxter.com/wp-content/uplo...68x237.png 768w" sizes="(max-width: 824px) 100vw, 824px" /></figure>
</div>
<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" width="554" height="472" src="https://blog.finxter.com/wp-content/uploads/2022/07/image-25.png" alt="" class="wp-image-455697" srcset="https://blog.finxter.com/wp-content/uploads/2022/07/image-25.png 554w, https://blog.finxter.com/wp-content/uplo...00x256.png 300w" sizes="(max-width: 554px) 100vw, 554px" /></figure>
</div>
<p>This one below goes unnoticed though – compiler says OK.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">// SPDX-License-Identifier: cheatingonyou pragma solidity 0.8.15;</pre>
<p>Since SPDX info is a comment, it is recognized by the compiler anywhere in the file at the file level, but for clarity put it at the very top of the file.</p>
<p>Lastly, the identifier will become part of your metadata once it’s compiled. And that is machine-readable so others will find it easy to query.</p>
<p><strong>Take action.</strong></p>
<p>1. Add the license-related comment to your code (<code>finxter.sol</code>)</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">// SPDX-License-Identifier: MIT</pre>
<h2>Pragmas</h2>
<p>The second important keyword is <code>pragma</code>. It comes in several shapes and forms – as a version pragma, ABI Coder pragma or experimental pragma.</p>
<p class="has-global-color-8-background-color has-background"><img src="https://s.w.org/images/core/emoji/14.0.0/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Note</strong>: A pragma directive is always local to a source file. So you must add it to all your files if you want to enable it in your whole project.</p>
<p>Remember also that if you import another file, the pragma from that file does <strong>not</strong> automatically apply to the importing file.</p>
<p><strong>1. Version pragma defines for which versions of Solidity the code is written.</strong></p>
<p>In the example:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">pragma solidity >= 0.8.7;</pre>
<p>we can expect that no compiler on version 0.8.7 or higher will throw any pragma errors.</p>
<p>Other examples – for illustration and education – how to define pragma versions:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">pragma solidity 0.6.8; //single instance
pragma solidity >= 0.6.8; //0.6.8 and any above
pragma solidity ^0.6.8; //0.6.8 and any above but less than 0.7.0
pragma solidity 0.6.8 ^0.7.5; // single instance AND any above 0.7.5 but less than 0.8 -> this AND condition cannot be met here
pragma solidity 0.8.1 || ^0.8.10; // one instance OR any from 0.8.10 but less than 0.9.0</pre>
<p>For practical reasons, the version pragma is the only type you should really care about when you <a href="https://blog.finxter.com/top-10-solidity-tutorials/" data-type="post" data-id="262867" target="_blank" rel="noreferrer noopener">start your Solidity</a> journey.</p>
<p><strong>2. ABI Coder pragma</strong></p>
<p>As per Solidity documentation, you have two options to choose from:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">pragma abicoder v1;
pragma abicoder v2;</pre>
<p>However as of Solidity 0.8.0 the <code>ABIEncoder</code> is activated by default so for a rookie like you and me, there’s nothing to worry about anymore. </p>
<p>With version 0.8.0+ you can already enjoy the benefits of working more effectively with arrays and structs. These are just some of data types but explaining this goes way beyond this tutorial. </p>
<p>And no need to call this pragma additionally, as you had to do in the past, e.g.:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.4.16;
pragma experimental ABIEncoderV2;</pre>
<p><strong>3. Experimental pragma</strong></p>
<p>Getting here is a risky business so better do not try it yourself at home <img src="https://s.w.org/images/core/emoji/14.0.0/72x72/1f642.png" alt="?" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p>Solidity might be offering features that are – as labeled – experimental. </p>
<p>So if you have some technical appetite and skills and want to play, showcase to your potential clients or whatever the purpose, go ahead. But if again, you are still early in the game, just park for now. </p>
<p><strong>Take Action.</strong></p>
<p>1. Add a version pragma directive to your code</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">pragma solidity ^0.8.15;</pre>
<h2>Importing other Source Files</h2>
<p>You can import files in Solidity. That sounds obvious but let’s say this upfront. </p>
<p>Importing other files is important since you can break down your code into multiple files, which makes it more modular, easier to manage and control, and – best of all – re-usable.</p>
<p>The simplest way to import is using this line of code:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import "filename";</pre>
<p>In our quick <a href="https://blog.finxter.com/what-is-payable-in-solidity/" data-type="post" data-id="37282" target="_blank" rel="noreferrer noopener">Remix</a> exercise, imagine we have another file called “<code>helloWorld.sol</code>” located in the same directory. In order to import it to our <code>finxter.sol</code> file, one would use:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import "./helloWorld.sol";</pre>
<p><strong>Note</strong>: Pythonic <code>import "helloWorld.sol"</code> would not work here.</p>
<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" width="436" height="216" src="https://blog.finxter.com/wp-content/uploads/2022/07/image-24.png" alt="" class="wp-image-455696" srcset="https://blog.finxter.com/wp-content/uploads/2022/07/image-24.png 436w, https://blog.finxter.com/wp-content/uplo...00x149.png 300w" sizes="(max-width: 436px) 100vw, 436px" /></figure>
</div>
<p>For education purposes and in very simple implementations, this is the shortest way to import. Its disadvantage is that it pollutes the namespace by importing all global symbols from the imported file into the current global system.</p>
<p>That approach carries also a risk of importing symbols that are imported into the file we are importing. That file can contain symbols imported for yet another file and so on. Such subsequent importing may lead to confusion about where the symbols come from and where actually they are defined.</p>
<p>Solidity recommends using a variant, which may look more complex at first. But it only adds one new global symbol to the namespace, here <code>symbolName</code>, whose members are symbols from the imported file.</p>
<p>Makes sense?</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import * as symbolName from "filename";</pre>
<p>The best approach however would be to import relevant symbols explicitly. </p>
<p>So for instance, if the imported file “<code>helloWorld.sol</code>” would have a contract named “<code>sayHello</code>”, one could use only that. Rule of thumb here: import only the things you will use. </p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import {something} from "filename";</pre>
<p><strong>Take action:</strong></p>
<p>1. Add a new file named “<code>helloWorld.sol</code>” that contains this code</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract sayHello { // empty contract
}
</pre>
<p>2. In the “<code>finxter.sol</code>” file, add import </p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import {sayHello} from "./helloWorld.sol";</pre>
<h2>Comments</h2>
<p>Commenting the code is possible in the two following ways:</p>
<p>1. Regular comments</p>
<p>1.1 Single-line comment, e.g.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">// this is a single-line regular comment</pre>
<p>1.2 Multi-line comment, e.g.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">/*
This
comment
spans
many
lines
*/
</pre>
<p>2. NatSpec comments</p>
<p>NatSpec stands for Ethereum Natural Language Specification. It is a special form of comments to provide rich documentation for functions, return variables, and more. </p>
<p>The recommendation is that Solidity contracts are fully annotated using NatSpec for all public interfaces (everything in the ABI).</p>
<p>Use NatSpecs comments directly above function declarations or statements.e.g.</p>
<p>2.1 Single-line</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">/// single-line NatSpec comment</pre>
<p>2.2 Multi-line</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">/**
multi-line
NatSpec
comment
*/
</pre>
<p>CODE example</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.4.16 <0.9.0; /// @author The Solidity Team
/// @title A simple storage example
contract SimpleStorage { uint storedData; /// Store `x`. /// @param x the new value to store /// @dev stores the number in the state variable `storedData` function set(uint x) public { storedData = x; } /** Return the stored value. @dev retrieves the value of the state variable `storedData` @return the stored value */ function get() public view returns (uint) { return storedData; }
}
</pre>
<p><strong>Take action:</strong></p>
<p>1. Add a regular multi-line comment to your <code>finxter.sol</code> file</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">/*
This
tutorial
comes
from
finxter.com
*/
</pre>
<p><strong>Reference</strong>: This article is based on some contents from the <a href="https://docs.soliditylang.org/en/v0.8.15/layout-of-source-files.html" data-type="URL" data-id="https://docs.soliditylang.org/en/v0.8.15/layout-of-source-files.html" target="_blank" rel="noreferrer noopener">documentation</a>. Check out this awesome resource too!</p>
<hr class="wp-block-separator has-alpha-channel-opacity"/>
<h2><a href="https://academy.finxter.com/university/solidity-basics/" target="_blank" rel="noreferrer noopener" title="https://academy.finxter.com/university/solidity-basics/">Learn Solidity Course</a></h2>
<p>Solidity is the programming language of the future.</p>
<p>It gives you the rare and sought-after superpower to program against the “Internet Computer”, i.e., against decentralized Blockchains such as <em>Ethereum</em>, <em>Binance Smart Chain</em>, <em>Ethereum Classic</em>, <em>Tron</em>, and <em>Avalanche </em>– to mention just a few Blockchain infrastructures that support Solidity.</p>
<p>In particular, Solidity allows you to<em> create smart contracts</em>, i.e., pieces of code that automatically execute on specific conditions in a completely decentralized environment. For example, smart contracts empower you to create your own <em>decentralized autonomous organizations</em> (DAOs) that run on Blockchains without being subject to centralized control.</p>
<p>NFTs, DeFi, DAOs, and Blockchain-based games are all based on smart contracts.</p>
<p><a href="https://academy.finxter.com/university/solidity-basics/" target="_blank" rel="noreferrer noopener" title="https://academy.finxter.com/university/solidity-basics/">This course</a> is a simple, low-friction introduction to creating your first smart contract using the Remix IDE on the Ethereum testnet – without fluff, significant upfront costs to purchase ETH, or unnecessary complexity.</p>
<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><a href="https://academy.finxter.com/university/solidity-basics/" target="_blank" rel="noopener"><img loading="lazy" src="https://blog.finxter.com/wp-content/uploads/2021/10/image-121.png" alt="" class="wp-image-37299" width="491" height="287" srcset="https://blog.finxter.com/wp-content/uploads/2021/10/image-121.png 982w, https://blog.finxter.com/wp-content/uplo...00x175.png 300w, https://blog.finxter.com/wp-content/uplo...68x448.png 768w" sizes="(max-width: 491px) 100vw, 491px" /></a></figure>
</div>
</div>
https://www.sickgaming.net/blog/2022/07/...urce-file/
<div><div class="kk-star-ratings kksr-valign-top kksr-align-left " data-payload="{"align":"left","id":"455693","slug":"default","valign":"top","reference":"auto","count":"1","readonly":"","score":"5","best":"5","gap":"5","greet":"Rate this post","legend":"5\/5 - (1 vote)","size":"24","width":"142.5","_legend":"{score}\/{best} - ({count} {votes})"}">
<div class="kksr-stars">
<div class="kksr-stars-inactive">
<div class="kksr-star" data-star="1" style="padding-right: 5px">
<div class="kksr-icon" style="width: 24px; height: 24px;"></div>
</p></div>
<div class="kksr-star" data-star="2" style="padding-right: 5px">
<div class="kksr-icon" style="width: 24px; height: 24px;"></div>
</p></div>
<div class="kksr-star" data-star="3" style="padding-right: 5px">
<div class="kksr-icon" style="width: 24px; height: 24px;"></div>
</p></div>
<div class="kksr-star" data-star="4" style="padding-right: 5px">
<div class="kksr-icon" style="width: 24px; height: 24px;"></div>
</p></div>
<div class="kksr-star" data-star="5" style="padding-right: 5px">
<div class="kksr-icon" style="width: 24px; height: 24px;"></div>
</p></div>
</p></div>
<div class="kksr-stars-active" style="width: 142.5px;">
<div class="kksr-star" style="padding-right: 5px">
<div class="kksr-icon" style="width: 24px; height: 24px;"></div>
</p></div>
<div class="kksr-star" style="padding-right: 5px">
<div class="kksr-icon" style="width: 24px; height: 24px;"></div>
</p></div>
<div class="kksr-star" style="padding-right: 5px">
<div class="kksr-icon" style="width: 24px; height: 24px;"></div>
</p></div>
<div class="kksr-star" style="padding-right: 5px">
<div class="kksr-icon" style="width: 24px; height: 24px;"></div>
</p></div>
<div class="kksr-star" style="padding-right: 5px">
<div class="kksr-icon" style="width: 24px; height: 24px;"></div>
</p></div>
</p></div>
</div>
<div class="kksr-legend"> 5/5 – (1 vote) </div>
</div>
<p>In this article, I am going to explain the fundamentals of a Solidity source file structure. In a way, a rookie (like me and you) can understand the basics of <a href="https://blog.finxter.com/smart-contracts-and-evm/" data-type="post" data-id="92507" target="_blank" rel="noreferrer noopener">Ethereum</a> programming.</p>
<p>First things first – the <a rel="noreferrer noopener" href="https://blog.finxter.com/solidity-crash-course/" data-type="URL" data-id="https://blog.finxter.com/solidity-crash-course/" target="_blank">Solidity</a> file that stores your code will have a <code>.sol</code> extension.</p>
<p>Take action.</p>
<ol>
<li>In your favorite browser go to <a href="https://remix.ethereum.org/" target="_blank" rel="noreferrer noopener">https://remix.ethereum.org/</a> </li>
<li>Using Create New File create a new <code>finxter.sol</code> file</li>
</ol>
<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" width="1024" height="475" src="https://blog.finxter.com/wp-content/uploads/2022/07/image-30-1024x475.png" alt="" class="wp-image-455702" srcset="https://blog.finxter.com/wp-content/uploads/2022/07/image-30-1024x475.png 1024w, https://blog.finxter.com/wp-content/uplo...00x139.png 300w, https://blog.finxter.com/wp-content/uplo...68x357.png 768w, https://blog.finxter.com/wp-content/uplo...age-30.png 1400w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
</div>
<p>Well done. Your file – empty so far – is ready for more actions!</p>
<p>In this article, we’ll add (i) license identifier, (ii) pragma, (iii) another file via import, and (iv) add some comments.</p>
<p>The actual <a href="https://blog.finxter.com/introduction-to-smart-contracts-and-solidity/" data-type="post" data-id="445145" target="_blank" rel="noreferrer noopener">smart contract code</a> is out of scope here but check out other <a href="https://blog.finxter.com/email-academy/" data-type="page" data-id="12278" target="_blank" rel="noreferrer noopener">Finxter tutorials</a> – there is plenty of that.</p>
<h2>License Identifier</h2>
<p>I know you are eager to get to the meat, but before you jump there, bear with me. The so-called SPDX license identifier is the first element you need to jot down.</p>
<p>What the heck is that? SPDX, or the Software Package Data Exchange, is an international, open standard for communicating software information including licenses or copyrights. </p>
<p>Being a standard means that many companies and organizations have agreed to do some things in a certain way. And Solidity has also adopted that standard.</p>
<p>Why bother, you ask? </p>
<p>Well, your code will be transparent in a blockchain and that transparency triggers copyright issues. The SPDX identifier hence allows you to specify what you allow others to do with your code. And vice versa, you learn what you can do with other people’s code too.</p>
<p>An example comment line with an identifier would be:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">// SPDX-License-Identifier: MIT</pre>
<p>What this means is:</p>
<p class="has-global-color-8-background-color has-background"><img src="https://s.w.org/images/core/emoji/14.0.0/72x72/1f469-200d-2696-fe0f.png" alt="?⚖️" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, [etc etc…]</p>
<p>SPDX license list has over 450 various license identifiers! </p>
<p>But don’t worry too much now, we are here to learn Solidity, not the legal twists. So for now, take my word and use MIT as your default one. Or if you do not want to specify a license or if the source code is not open-source, please use the special value UNLICENSED.</p>
<p class="has-base-background-color has-background"><img src="https://s.w.org/images/core/emoji/14.0.0/72x72/1f6d1.png" alt="?" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Caution here folks – UNLICENSE (without ‘d’ at the end) is a completely different license! Open door type of one. It offers free and unencumbered software released into the public domain.</p>
<p>By the way, a good rule of thumb is to use the OSI-approved ones when browsing <a rel="noreferrer noopener" href="https://spdx.org/licenses/" target="_blank">https://spdx.org/licenses/</a>. “Only” about 120+ options for consideration.</p>
<p>Does that identifier do anything technically to your code? No, it won’t break how it works. After all, it is a comment.</p>
<p>But from Solidity >=0.6.8 (so 0.6.8 and any higher), that comment <strong>must</strong> be part of your code. Otherwise expect a Warning in your compiler.</p>
<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" width="436" height="153" src="https://blog.finxter.com/wp-content/uploads/2022/07/image-29.png" alt="" class="wp-image-455701" srcset="https://blog.finxter.com/wp-content/uploads/2022/07/image-29.png 436w, https://blog.finxter.com/wp-content/uplo...00x105.png 300w" sizes="(max-width: 436px) 100vw, 436px" /></figure>
</div>
<p>The compiler checks the existence but does not know if your identifier is the right one (if it exists in the SPDX list). Starting in Solidity 0.8.8 it checks for multiple SPDX license identifiers next to each other and validates them. It still allows you to play with it though <img src="https://s.w.org/images/core/emoji/14.0.0/72x72/1f642.png" alt="?" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p>In 0.8.7 you could easily get away with some crazy identifier.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">// SPDX-License-Identifier: cheating_on_you pragma solidity 0.8.7;</pre>
<p>From 0.8.8 onwards it actually starts to pay attention and throws errors. Note the red error icon on the left in line 1.</p>
<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" width="840" height="214" src="https://blog.finxter.com/wp-content/uploads/2022/07/image-28.png" alt="" class="wp-image-455700" srcset="https://blog.finxter.com/wp-content/uploads/2022/07/image-28.png 840w, https://blog.finxter.com/wp-content/uplo...300x76.png 300w, https://blog.finxter.com/wp-content/uplo...68x196.png 768w" sizes="(max-width: 840px) 100vw, 840px" /></figure>
</div>
<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" width="570" height="310" src="https://blog.finxter.com/wp-content/uploads/2022/07/image-27.png" alt="" class="wp-image-455699" srcset="https://blog.finxter.com/wp-content/uploads/2022/07/image-27.png 570w, https://blog.finxter.com/wp-content/uplo...00x163.png 300w" sizes="(max-width: 570px) 100vw, 570px" /></figure>
</div>
<p>Same happens when you add multiple licenses inappropriately. </p>
<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" width="824" height="254" src="https://blog.finxter.com/wp-content/uploads/2022/07/image-26.png" alt="" class="wp-image-455698" srcset="https://blog.finxter.com/wp-content/uploads/2022/07/image-26.png 824w, https://blog.finxter.com/wp-content/uplo...300x92.png 300w, https://blog.finxter.com/wp-content/uplo...68x237.png 768w" sizes="(max-width: 824px) 100vw, 824px" /></figure>
</div>
<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" width="554" height="472" src="https://blog.finxter.com/wp-content/uploads/2022/07/image-25.png" alt="" class="wp-image-455697" srcset="https://blog.finxter.com/wp-content/uploads/2022/07/image-25.png 554w, https://blog.finxter.com/wp-content/uplo...00x256.png 300w" sizes="(max-width: 554px) 100vw, 554px" /></figure>
</div>
<p>This one below goes unnoticed though – compiler says OK.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">// SPDX-License-Identifier: cheatingonyou pragma solidity 0.8.15;</pre>
<p>Since SPDX info is a comment, it is recognized by the compiler anywhere in the file at the file level, but for clarity put it at the very top of the file.</p>
<p>Lastly, the identifier will become part of your metadata once it’s compiled. And that is machine-readable so others will find it easy to query.</p>
<p><strong>Take action.</strong></p>
<p>1. Add the license-related comment to your code (<code>finxter.sol</code>)</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">// SPDX-License-Identifier: MIT</pre>
<h2>Pragmas</h2>
<p>The second important keyword is <code>pragma</code>. It comes in several shapes and forms – as a version pragma, ABI Coder pragma or experimental pragma.</p>
<p class="has-global-color-8-background-color has-background"><img src="https://s.w.org/images/core/emoji/14.0.0/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Note</strong>: A pragma directive is always local to a source file. So you must add it to all your files if you want to enable it in your whole project.</p>
<p>Remember also that if you import another file, the pragma from that file does <strong>not</strong> automatically apply to the importing file.</p>
<p><strong>1. Version pragma defines for which versions of Solidity the code is written.</strong></p>
<p>In the example:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">pragma solidity >= 0.8.7;</pre>
<p>we can expect that no compiler on version 0.8.7 or higher will throw any pragma errors.</p>
<p>Other examples – for illustration and education – how to define pragma versions:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">pragma solidity 0.6.8; //single instance
pragma solidity >= 0.6.8; //0.6.8 and any above
pragma solidity ^0.6.8; //0.6.8 and any above but less than 0.7.0
pragma solidity 0.6.8 ^0.7.5; // single instance AND any above 0.7.5 but less than 0.8 -> this AND condition cannot be met here
pragma solidity 0.8.1 || ^0.8.10; // one instance OR any from 0.8.10 but less than 0.9.0</pre>
<p>For practical reasons, the version pragma is the only type you should really care about when you <a href="https://blog.finxter.com/top-10-solidity-tutorials/" data-type="post" data-id="262867" target="_blank" rel="noreferrer noopener">start your Solidity</a> journey.</p>
<p><strong>2. ABI Coder pragma</strong></p>
<p>As per Solidity documentation, you have two options to choose from:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">pragma abicoder v1;
pragma abicoder v2;</pre>
<p>However as of Solidity 0.8.0 the <code>ABIEncoder</code> is activated by default so for a rookie like you and me, there’s nothing to worry about anymore. </p>
<p>With version 0.8.0+ you can already enjoy the benefits of working more effectively with arrays and structs. These are just some of data types but explaining this goes way beyond this tutorial. </p>
<p>And no need to call this pragma additionally, as you had to do in the past, e.g.:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.4.16;
pragma experimental ABIEncoderV2;</pre>
<p><strong>3. Experimental pragma</strong></p>
<p>Getting here is a risky business so better do not try it yourself at home <img src="https://s.w.org/images/core/emoji/14.0.0/72x72/1f642.png" alt="?" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p>Solidity might be offering features that are – as labeled – experimental. </p>
<p>So if you have some technical appetite and skills and want to play, showcase to your potential clients or whatever the purpose, go ahead. But if again, you are still early in the game, just park for now. </p>
<p><strong>Take Action.</strong></p>
<p>1. Add a version pragma directive to your code</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">pragma solidity ^0.8.15;</pre>
<h2>Importing other Source Files</h2>
<p>You can import files in Solidity. That sounds obvious but let’s say this upfront. </p>
<p>Importing other files is important since you can break down your code into multiple files, which makes it more modular, easier to manage and control, and – best of all – re-usable.</p>
<p>The simplest way to import is using this line of code:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import "filename";</pre>
<p>In our quick <a href="https://blog.finxter.com/what-is-payable-in-solidity/" data-type="post" data-id="37282" target="_blank" rel="noreferrer noopener">Remix</a> exercise, imagine we have another file called “<code>helloWorld.sol</code>” located in the same directory. In order to import it to our <code>finxter.sol</code> file, one would use:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import "./helloWorld.sol";</pre>
<p><strong>Note</strong>: Pythonic <code>import "helloWorld.sol"</code> would not work here.</p>
<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" width="436" height="216" src="https://blog.finxter.com/wp-content/uploads/2022/07/image-24.png" alt="" class="wp-image-455696" srcset="https://blog.finxter.com/wp-content/uploads/2022/07/image-24.png 436w, https://blog.finxter.com/wp-content/uplo...00x149.png 300w" sizes="(max-width: 436px) 100vw, 436px" /></figure>
</div>
<p>For education purposes and in very simple implementations, this is the shortest way to import. Its disadvantage is that it pollutes the namespace by importing all global symbols from the imported file into the current global system.</p>
<p>That approach carries also a risk of importing symbols that are imported into the file we are importing. That file can contain symbols imported for yet another file and so on. Such subsequent importing may lead to confusion about where the symbols come from and where actually they are defined.</p>
<p>Solidity recommends using a variant, which may look more complex at first. But it only adds one new global symbol to the namespace, here <code>symbolName</code>, whose members are symbols from the imported file.</p>
<p>Makes sense?</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import * as symbolName from "filename";</pre>
<p>The best approach however would be to import relevant symbols explicitly. </p>
<p>So for instance, if the imported file “<code>helloWorld.sol</code>” would have a contract named “<code>sayHello</code>”, one could use only that. Rule of thumb here: import only the things you will use. </p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import {something} from "filename";</pre>
<p><strong>Take action:</strong></p>
<p>1. Add a new file named “<code>helloWorld.sol</code>” that contains this code</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract sayHello { // empty contract
}
</pre>
<p>2. In the “<code>finxter.sol</code>” file, add import </p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import {sayHello} from "./helloWorld.sol";</pre>
<h2>Comments</h2>
<p>Commenting the code is possible in the two following ways:</p>
<p>1. Regular comments</p>
<p>1.1 Single-line comment, e.g.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">// this is a single-line regular comment</pre>
<p>1.2 Multi-line comment, e.g.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">/*
This
comment
spans
many
lines
*/
</pre>
<p>2. NatSpec comments</p>
<p>NatSpec stands for Ethereum Natural Language Specification. It is a special form of comments to provide rich documentation for functions, return variables, and more. </p>
<p>The recommendation is that Solidity contracts are fully annotated using NatSpec for all public interfaces (everything in the ABI).</p>
<p>Use NatSpecs comments directly above function declarations or statements.e.g.</p>
<p>2.1 Single-line</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">/// single-line NatSpec comment</pre>
<p>2.2 Multi-line</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">/**
multi-line
NatSpec
comment
*/
</pre>
<p>CODE example</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.4.16 <0.9.0; /// @author The Solidity Team
/// @title A simple storage example
contract SimpleStorage { uint storedData; /// Store `x`. /// @param x the new value to store /// @dev stores the number in the state variable `storedData` function set(uint x) public { storedData = x; } /** Return the stored value. @dev retrieves the value of the state variable `storedData` @return the stored value */ function get() public view returns (uint) { return storedData; }
}
</pre>
<p><strong>Take action:</strong></p>
<p>1. Add a regular multi-line comment to your <code>finxter.sol</code> file</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">/*
This
tutorial
comes
from
finxter.com
*/
</pre>
<p><strong>Reference</strong>: This article is based on some contents from the <a href="https://docs.soliditylang.org/en/v0.8.15/layout-of-source-files.html" data-type="URL" data-id="https://docs.soliditylang.org/en/v0.8.15/layout-of-source-files.html" target="_blank" rel="noreferrer noopener">documentation</a>. Check out this awesome resource too!</p>
<hr class="wp-block-separator has-alpha-channel-opacity"/>
<h2><a href="https://academy.finxter.com/university/solidity-basics/" target="_blank" rel="noreferrer noopener" title="https://academy.finxter.com/university/solidity-basics/">Learn Solidity Course</a></h2>
<p>Solidity is the programming language of the future.</p>
<p>It gives you the rare and sought-after superpower to program against the “Internet Computer”, i.e., against decentralized Blockchains such as <em>Ethereum</em>, <em>Binance Smart Chain</em>, <em>Ethereum Classic</em>, <em>Tron</em>, and <em>Avalanche </em>– to mention just a few Blockchain infrastructures that support Solidity.</p>
<p>In particular, Solidity allows you to<em> create smart contracts</em>, i.e., pieces of code that automatically execute on specific conditions in a completely decentralized environment. For example, smart contracts empower you to create your own <em>decentralized autonomous organizations</em> (DAOs) that run on Blockchains without being subject to centralized control.</p>
<p>NFTs, DeFi, DAOs, and Blockchain-based games are all based on smart contracts.</p>
<p><a href="https://academy.finxter.com/university/solidity-basics/" target="_blank" rel="noreferrer noopener" title="https://academy.finxter.com/university/solidity-basics/">This course</a> is a simple, low-friction introduction to creating your first smart contract using the Remix IDE on the Ethereum testnet – without fluff, significant upfront costs to purchase ETH, or unnecessary complexity.</p>
<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><a href="https://academy.finxter.com/university/solidity-basics/" target="_blank" rel="noopener"><img loading="lazy" src="https://blog.finxter.com/wp-content/uploads/2021/10/image-121.png" alt="" class="wp-image-37299" width="491" height="287" srcset="https://blog.finxter.com/wp-content/uploads/2021/10/image-121.png 982w, https://blog.finxter.com/wp-content/uplo...00x175.png 300w, https://blog.finxter.com/wp-content/uplo...68x448.png 768w" sizes="(max-width: 491px) 100vw, 491px" /></a></figure>
</div>
</div>
https://www.sickgaming.net/blog/2022/07/...urce-file/