SPDX license and pragma version help make your smart contract clear and safe. SPDX shows the license type, and pragma tells the compiler which Solidity version to use.
SPDX license and pragma version in Blockchain / Solidity
// SPDX-License-Identifier: <license> pragma solidity ^<version>;
The SPDX license line must be the very first line in your Solidity file.
The pragma line tells the compiler which Solidity version(s) your code supports.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;// SPDX-License-Identifier: GPL-3.0 pragma solidity 0.7.6;
// SPDX-License-Identifier: UNLICENSED pragma solidity >=0.6.0 <0.9.0;
This simple contract uses the MIT license and Solidity version 0.8.0 or higher. It stores a greeting message.
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract HelloWorld { string public greet = "Hello, blockchain!"; }
Always put the SPDX license identifier as the very first line to avoid compiler warnings.
Use the caret (^) in pragma to allow compatible newer versions but avoid breaking changes.
Choosing the right license helps others know how they can use your code.
SPDX license line states the code license clearly.
Pragma version controls which Solidity compiler versions can compile your code.
Both help keep your smart contract safe, clear, and compatible.
Practice
What is the purpose of the SPDX-License-Identifier line in a Solidity smart contract?
Solution
Step 1: Understand SPDX-License-Identifier usage
The SPDX-License-Identifier line is a comment that clearly states the license under which the source code is released.Step 2: Differentiate from pragma version
Unlike pragma which sets compiler version, SPDX is about legal licensing information.Final Answer:
To specify the license type of the contract's source code -> Option AQuick Check:
SPDX-License-Identifier = License type [OK]
- Confusing SPDX line with pragma version
- Thinking SPDX sets compiler behavior
- Ignoring SPDX line as just a comment
Which of the following is the correct way to specify the Solidity compiler version to accept any version from 0.8.0 up to but not including 0.9.0?
pragma solidity ?;Solution
Step 1: Understand version range syntax
The syntax>=0.8.0 <0.9.0means any version from 0.8.0 up to but not including 0.9.0.Step 2: Compare with caret (^) operator
The^0.8.19syntax allows >=0.8.19 <0.9.0, excluding earlier 0.8.x versions like 0.8.0. The explicit range>=0.8.0 <0.9.0matches exactly.Final Answer:
pragma solidity >=0.8.0 <0.9.0; -> Option CQuick Check:
Version range syntax = >=0.8.0 <0.9.0 [OK]
- Using exact version without range
- Misplacing comparison operators
- Confusing caret (^) with range syntax
What will happen if you compile this Solidity code snippet?
// SPDX-License-Identifier: MIT
pragma solidity ^0.7.0;
contract Test {
uint public x = 5;
}Assuming you use Solidity compiler version 0.8.10.
Solution
Step 1: Check pragma version compatibility
The pragma^0.7.0means compiler versions from 0.7.0 up to but not including 0.8.0 are allowed.Step 2: Compare with compiler version used
Compiler version 0.8.10 is outside the allowed range, so compilation will fail due to version mismatch.Final Answer:
Compilation fails due to pragma version mismatch -> Option AQuick Check:
Pragma ^0.7.0 excludes 0.8.10 = mismatch [OK]
- Ignoring pragma version mismatch
- Thinking SPDX license affects compilation
- Assuming caret (^) allows all newer versions
Identify the error in this Solidity contract header:
// SPDX-License-Identifier MIT
pragma solidity ^0.8.0;
contract Sample {}Solution
Step 1: Check SPDX license line format
The SPDX license line must be in the format// SPDX-License-Identifier: LicenseNamewith a colon after the identifier.Step 2: Verify other parts
The pragma syntax and contract name are correct; SPDX license identifier does not require quotes.Final Answer:
Missing colon ':' after SPDX-License-Identifier -> Option DQuick Check:
SPDX line requires colon ':' [OK]
- Omitting colon after SPDX-License-Identifier
- Adding quotes around license name
- Thinking contract names must be lowercase
You want to write a Solidity contract that is compatible with any compiler version from 0.6.0 up to but not including 0.9.0, and you want to specify the MIT license. Which of the following headers is correct?
Solution
Step 1: Check SPDX license line correctness
The SPDX line must have a colon after the identifier and specify the license, so// SPDX-License-Identifier: MITis correct.Step 2: Verify pragma version range
The pragma>=0.6.0 <0.9.0correctly specifies compatibility from 0.6.0 up to but not including 0.9.0. Using<=0.9.0would include 0.9.0, which is not desired.Final Answer:
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.9.0; -> Option BQuick Check:
SPDX with colon + correct pragma range = // SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.9.0; [OK]
- Omitting colon in SPDX line
- Using exact version instead of range
- Including upper bound version with <= instead of <
Ready to prove it?
Pass the test and this pattern moves unknown
