# Smart Contract Basics


By [meteosrds](https://paragraph.com/@cryptovuive) · 2023-01-10

---

### Solidity Syntax

![](https://storage.googleapis.com/papyrus_images/d8894b7a8cc6e398c667e459f5ffad8b7882593067365376a6621c5ff3991744.png)

![](https://storage.googleapis.com/papyrus_images/d4dee8000d258d4b2cdc49447f04b5f3031595f34cae372c4a15d608d4d94479.png)

    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.4;
    
    contract Contract {
        bool public a = true;
        bool public b = false;
    }
    

![](https://storage.googleapis.com/papyrus_images/ee6bb4ba3b34e3d07847a2ddb3d310566a9280f4c6f4279ee2966f3308e716a7.png)

    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.4;
    
    contract Contract {
        uint8 public a = 3;
        uint16 public b = 268;
        uint256 public sum = a + b;
    }
    

![](https://storage.googleapis.com/papyrus_images/99bcfc88b630c86453b253c3cc83ff3d75fc53305f28da655bc83c6739ba9abb.png)

    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.4;
    
    contract Contract {
        int8 public a = 10;
        int8 public b = -15;
        int16 public difference = a - b;
    }
    

![](https://storage.googleapis.com/papyrus_images/d6846441c948d9376db6c8e3ca81dc931cc49918971875ca47bae129cd28e246.png)

    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.4;
    
    contract Contract {
        bytes32 public msg1 = "Hello World";
        string public msg2 = "ccccccccccccccccccccccccccccccccabcd";
    }
    

![](https://storage.googleapis.com/papyrus_images/b6909aa5497bd09a7202a90a27fa520e51bd802a7e11071a2fa62eb3d1434e4d.png)

    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.4;
    
    contract Contract {
        enum Foods { Apple, Pizza, Bagel, Banana }
    
        Foods public food1 = Foods.Apple;
        Foods public food2 = Foods.Pizza;
        Foods public food3 = Foods.Bagel;
        Foods public food4 = Foods.Banana;
    }
    

### Functions

![](https://storage.googleapis.com/papyrus_images/983dd6faa980cbefcee7b89b2da054d3bf66c9302aa6b4effd98bf1410681998.png)

![](https://storage.googleapis.com/papyrus_images/c43a4e82636e8b2f55e890f8d93901e8e1b49b56c4fb31612278adfb611dc9d6.png)

    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.4;
    
    contract Contract {
        uint public x;
    
        constructor(uint _x) {
            x = _x;
        }
    }
    

![](https://storage.googleapis.com/papyrus_images/824009872263303a5002effd6aea24e339d8bf31992a2ca7e87db3e5b22d51c9.png)

    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.4;
    
    contract Contract {
        uint public x;
    
        constructor(uint _x) {
            x = _x;
        }
    
        function increment() external {
            x = x + 1;
        }
    }
    

![](https://storage.googleapis.com/papyrus_images/6507fe19bf37555092fa1fbe6fe873915e5b2057425fc8f729a4bdaf9e8e3aaf.png)

    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.4;
    
    contract Contract {
        uint public x;
    
        constructor(uint _x) {
            x = _x;
        }
    
        function increment() external {
            x = x + 1;
        }
    
        function add(uint _x) external view returns(uint) {
            uint sum = x + _x;
            return sum;
        }
    }
    

![](https://storage.googleapis.com/papyrus_images/c77fbda908fd48d0948b7620e56d5926a865afd43194f178c64917035d7cac86.png)

    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.4;
    
    contract Contract {
        function double(uint x) external pure returns(uint d) {
            d = x * 2;
        }
    }
    

![](https://storage.googleapis.com/papyrus_images/abfc40221d603998fb70535914f71d8d0ccf270660ec82bac9e0d479ff8f4036.png)

    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.4;
    
    contract Contract {
        function double(uint x) external pure returns(uint d) {
            d = x * 2;
        }
    
        function double(uint x, uint y) public pure returns(uint, uint) {         
                return (x*2, y*2);
        }
    }
    

### Smart Contract Communication

![](https://storage.googleapis.com/papyrus_images/3a0da6cd9c06a169891c2202614792fca1b18aa9172a4114617686662b6e50d5.png)

![](https://storage.googleapis.com/papyrus_images/3415e7ed241929e167813e703ec77641e85f1a239c945e7e1413ef9b666b1fa4.png)

    /**
     * Find the `value` stored in the contract
     *
     * @param {ethers.Contract} contract - ethers.js contract instance
     * @return {promise} a promise which resolves with the `value`
     */
    function getValue(contract) {
        let value = contract.value();
        return value;
    }
    
    module.exports = getValue;
    

![](https://storage.googleapis.com/papyrus_images/c84839ec369a63a409560cca74efa8aff087519f7aa1b9380f68bd21c8b0f39a.png)

    /**
     * Modify the `value` stored in the contract
     *
     * @param {ethers.Contract} contract - ethers.js contract instance
     * @return {promise} a promise of transaction
     */
    function setValue(contract) {
        return contract.modify(6);
    }
    
    module.exports = setValue;
    

![](https://storage.googleapis.com/papyrus_images/579b2ccd89ffb32191ba157be824a3de5667a318e2fdd6d8b4712b080ee16a18.png)

    /**
     * Transfer funds on the contract from the current signer 
     * to the friends address
     *
     * @param {ethers.Contract} contract - ethers.js contract instance
     * @param {string} friend - a string containing a hexadecimal ethereum address
     * @return {promise} a promise of the transfer transaction
     */
    function transfer(contract, friend) {
        return contract.transfer(friend, 1000);
    }
    
    module.exports = transfer;
    

![](https://storage.googleapis.com/papyrus_images/95c930930de662db273e13e1872eaf641fef3142c43e8e6ea6e3b7bc83b6cedb.png)

    /**
     * Set the message on the contract using the signer passed in
     *
     * @param {ethers.Contract} contract - ethers.js contract instance
     * @param {ethers.types.Signer} signer - ethers.js signer instance
     * @return {promise} a promise of transaction modifying the `message`
     */
    function setMessage(contract, signer) {
        return contract.connect(signer).modify("abc");
    }
    
    module.exports = setMessage;
    

![](https://storage.googleapis.com/papyrus_images/131fcd514565ec13f6e6d960e2f8c3a8224192049967cae5975430faf5a917c4.png)

    const ethers = require('ethers');
    
    /**
     * Deposit at least 1 ether into the contract 
     *
     * @param {ethers.Contract} contract - ethers.js contract instance
     * @return {promise} a promise of the deposit transaction 
     */
    function deposit(contract) {
        return contract.deposit({ value: ethers.utils.parseEther("3") });
    }
    
    module.exports = deposit;
    

### Address Interactions

![](https://storage.googleapis.com/papyrus_images/6cdfa2d7762ff7fa51ebb8589ddf0089458235382d83835c711347ca8ec07ff6.png)

![](https://storage.googleapis.com/papyrus_images/2bda8f96e339f69e08505c327e2bc1ddfd347182a2335d8d07bd3c974251d672.png)

    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.4;
    
    contract Contract {
        address public owner;
    
        constructor() {
            owner = msg.sender;
        }
    }
    

![](https://storage.googleapis.com/papyrus_images/031e18a8a2b3735c97ed7253497c54542536e77a47bb34d98ebf30dc2849aa71.png)

    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.4;
    
    contract Contract {
        address public owner;
    
        constructor() {
            owner = msg.sender;
        }
    
        receive() external payable {
        }
    }
    

![](https://storage.googleapis.com/papyrus_images/e0ea5bfc6beefa03ff8f9ace85cc7bc166138b332b56621690943e6e000ef787.png)

    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.4;
    
    contract Contract {
        address public owner;
    
        constructor() {
            owner = msg.sender;
        }
    
        receive() external payable {
        }
    
        function tip() public payable {
            (bool ret, ) = owner.call{ value: msg.value }("");
            require(ret);
        }
    }
    

![](https://storage.googleapis.com/papyrus_images/ef342bf0517e362c98da237f7b792bf72aeb7fe9136920fead35ea5afb20ce6b.png)

    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.4;
    
    contract Contract {
        address public owner;
        address public charity;
    
        constructor(address _charity) {
            owner = msg.sender;
            charity = _charity;
        }
    
        receive() external payable {
        }
    
        function tip() public payable {
            (bool ret, ) = owner.call{ value: msg.value }("");
            require(ret);
        }
    
        function donate() public {
            (bool ret, ) = charity.call{ value: address(this).balance }("");
            require(ret);
            selfdestruct(payable(msg.sender));
        }
    }
    

![](https://storage.googleapis.com/papyrus_images/0c2a6a7e097a02143512c4801dde251c01f798c504883bd3a9e4ad6da27eb54d.png)

    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.4;
    
    contract Contract {
        address public owner;
        address public charity;
    
        constructor(address _charity) {
            owner = msg.sender;
            charity = _charity;
        }
    
        receive() external payable {
        }
    
        function tip() public payable {
            (bool ret, ) = owner.call{ value: msg.value }("");
            require(ret);
        }
    
        function donate() public {
            (bool ret, ) = charity.call{ value: address(this).balance }("");
            require(ret);
            selfdestruct(payable(msg.sender));
        }
    }
    

![](https://storage.googleapis.com/papyrus_images/44a2744aa1a9ffec6d2274f904ef9ebd126aab5e797d3cbf87bb2ea153c34ca5.png)

![](https://storage.googleapis.com/papyrus_images/3ff1d79e72ec2e7fa69ddcab35a63182f452cfc7d9f44df11c439c9cc300e7bc.png)

    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.4;
    
    contract Contract  {
        address deployer;
    
        constructor() payable {
            require(msg.value >= 1000000000000000000);
            deployer = msg.sender;
        }
    
        function withdraw() public {
            (bool ret, ) = deployer.call{ value: address(this).balance }("");
            require(ret);
        }
    }
    

![](https://storage.googleapis.com/papyrus_images/db7f513e53e97918335076d40759402e8d6db35df689e4b5d6bd0aefb832c188.png)

    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.4;
    
    contract Contract  {
        address deployer;
    
        constructor() payable {
            require(msg.value >= 1000000000000000000);
            deployer = msg.sender;
        }
    
        function withdraw() public {
            require(deployer == msg.sender);
            (bool ret, ) = deployer.call{ value: address(this).balance }("");
            require(ret);
        }
    }
    

![](https://storage.googleapis.com/papyrus_images/3f05e25d984f0e185232d7f4a98716654e044f9ba96165038c1f50d51502560d.png)

    // SPDX-License-Identifier: MIT
    pragma solidity ^0.7.5;
    
    contract Contract {
        address owner;
        uint configA;
        uint configB;
        uint configC;
    
        constructor() {
            owner = msg.sender;
        }
    
        function setA(uint _configA) public onlyOwner {
            configA = _configA;
        }
    
        function setB(uint _configB) public onlyOwner {
            configB = _configB;
        }
    
        function setC(uint _configC) public onlyOwner {
            configC = _configC;
        }
    
        modifier onlyOwner {
            require(owner == msg.sender);
            _;
        }
    }
    

![](https://storage.googleapis.com/papyrus_images/10336a96c07cc22ae1299bebd296c51c106bb473e842a27dd60f4f842f803648.png)

![](https://storage.googleapis.com/papyrus_images/e038b8b1a724cb8d5cc563d97492288b3cbf8b2f86e576b0079ce8568c99bb5a.png)

    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.4;
    
    interface IHero {
        function alert() external;
    }
    
    contract Sidekick {
        function sendAlert(address hero) external {
            IHero(hero).alert();
        }
    }
    

![](https://storage.googleapis.com/papyrus_images/c9cbd5ad0bf05ca3d109e34a4cb03ee7f8e8851ff88559cc86c6cbb8a293a9bc.png)

    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.4;
    
    contract Sidekick {
        function sendAlert(address hero) external {
            bytes4 signature = bytes4(keccak256("alert()"));
    
            (bool ret, ) = hero.call(abi.encodePacked(signature));
    
            require(ret);
        }
    }
    

![](https://storage.googleapis.com/papyrus_images/b75c84e167b8f131b24598da6a19ced4196e209f30322fd7e0b96e162ba065be.png)

    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.4;
    
    contract Sidekick {
        function sendAlert(address hero, uint enemies, bool armed) external {
            (bool ret, ) = hero.call(
                abi.encodeWithSignature("alert(uint256,bool)", enemies, armed)
            );
    
            require(ret);
        }
    }
    

![](https://storage.googleapis.com/papyrus_images/8bac2cf8383d763b14281756d740d3ac105e570c47970681671110ec644b2bed.png)

    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.4;
    
    contract Sidekick {
        function relay(address hero, bytes memory data) external {
            (bool ret, ) = hero.call(data);
            require(ret);
        }
    }
    

![](https://storage.googleapis.com/papyrus_images/08a907bb404e65806c52ba43795bdd965fade6f9f4486a0db422208590cac815.png)

    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.4;
    
    contract Sidekick {
        function makeContact(address hero) external {
            (bool ret, ) = hero.call(abi.encodeWithSignature("fallback()"));
            require(ret);
        }
    }
    

![](https://storage.googleapis.com/papyrus_images/442b6f35ada8947d160a148a67d5f5fe9e063c7c48d3df07ae794db3dd3301d3.png)

    pragma solidity ^0.8.4;
    
    contract Contract {
        function sumAndAverage(uint a, uint b, uint c, uint d) external pure returns(uint,uint) {
            uint sum = a + b + c + d;
            uint average = sum / 4;
    
            return (sum, average);
        }
    }
    

![](https://storage.googleapis.com/papyrus_images/8de34c47a6a8340a3e07ecfbbc97a14f8daa96b60a36457f123a4736063cba57.png)

    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.4;
    
    contract Contract {
        uint countdown = 10;
    
        function tick() external {
            countdown--;
            if (0 == countdown) {
                selfdestruct(payable(msg.sender));
            }
        }
    }

---

*Originally published on [meteosrds](https://paragraph.com/@cryptovuive/smart-contract-basics)*
