Skip to Content

The Payable Modifier

In this lab I’m going to show you the payable modifier.

In the previous code example we had a simple smart contract that stores a string. We’re going to expand this functionality now and charge for every string change 1 Eth šŸ¤‘.

View the Full Course Now 

Sample Smart Contract

This is the Smart Contract we’re getting started with:

//SPDX-License-Identifier: MIT pragma solidity 0.8.15; contract SampleContract { string public myString = "Hello World"; function updateString(string memory _newString) public { myString = _newString; } }

In order for it to receive Eth, you need to add two things here:

  1. you need to add the payable modifier. That is the keyword ā€œpayableā€ right next to the visibility specifier ā€œpublicā€
  2. you need to understand the global msg-objects property called value. msg.value.

But before that, try to send 1 eth to the smart contracts ā€œupdateStringā€ function. You will see it ends in an error.

ethereum-blockchain-developer-image

The first thing we need to change is the ā€œpayableā€ modifier.

What is the payable modifier

The payable modifier tells solidity that the function is expecting eth to receive. That’s it! Let’s expand our smart contract so it can receive eth:

//SPDX-License-Identifier: MIT pragma solidity 0.8.15; contract SampleContract { string public myString = "Hello World"; function updateString(string memory _newString) public payable { myString = _newString; } }

What is msg.value

You’re probably wondering what exactly is the msg-object. The msg-object contains information about the current message with the smart contract. It’s a global variable that can be accessed in every function.

Let’s extend the smart contract to charge 1 eth for each string update:

//SPDX-License-Identifier: MIT pragma solidity 0.8.15; contract SampleContract { string public myString = "Hello World"; function updateString(string memory _newString) public payable { if(msg.value == 1 ether) { myString = _newString; } else { payable(msg.sender).transfer(msg.value); } } }

Run it again, and you’ll see that every time you send 1 eth, you can update the string. But if you send less or more, you just get refunded.

In the next lab I’ll show how you can send ether to a smart contract without actually sending it to a specific function!

Last updated on