Library contracts help you reuse code in blockchain programs. They save space and make your code easier to manage.
When you want to share common functions between multiple smart contracts.
When you want to save gas by avoiding duplicate code in your contracts.
When you want to organize your code better by separating reusable parts.
When you want to update logic in one place and have all contracts use it.
When you want to keep your main contract simple and clean.
Syntax
Blockchain / Solidity
library LibraryName {
function functionName(params) internal pure returns (returnType) {
// function code
}
}
contract MyContract {
using LibraryName for Type;
function myFunction() public {
// call library functions
}
}
Library contracts cannot have state variables or receive Ether.
Functions in libraries are usually marked internal or public.
Examples
This example shows a simple library with an add function used inside a contract.
Blockchain / Solidity
library MathLib {
function add(uint a, uint b) internal pure returns (uint) {
return a + b;
}
}
contract Calculator {
function sum(uint x, uint y) public pure returns (uint) {
return MathLib.add(x, y);
}
}
This example shows how to attach library functions to a type using using for.
Blockchain / Solidity
library StringUtils {
function toUpper(string memory str) internal pure returns (string memory) {
// code to convert string to uppercase
}
}
contract TextProcessor {
using StringUtils for string;
function shout(string memory text) public pure returns (string memory) {
return text.toUpper();
}
}
Sample Program
This program defines a library with a multiply function. The contract uses it to double a number.
Blockchain / Solidity
pragma solidity ^0.8.0;
library Math {
function multiply(uint a, uint b) internal pure returns (uint) {
return a * b;
}
}
contract Test {
function double(uint x) public pure returns (uint) {
return Math.multiply(x, 2);
}
}
OutputSuccess
Important Notes
Library contracts help reduce gas costs by avoiding code duplication.
Libraries cannot hold state or receive Ether, so they are safe helpers.
Use using LibraryName for Type; to add library functions to types.
Summary
Library contracts let you reuse code in smart contracts.
They help save gas and keep code organized.
Use library keyword and call functions from your contracts.
Practice
(1/5)
1. What is the main purpose of a library contract in blockchain development?
easy
A. To reuse code across multiple smart contracts
B. To store user data permanently
C. To mine new blocks
D. To create new tokens
Solution
Step 1: Understand the role of library contracts
Library contracts contain reusable code that can be called by other contracts to avoid duplication.
Step 2: Compare options with library purpose
Only To reuse code across multiple smart contracts correctly describes code reuse, while others describe unrelated blockchain functions.
Final Answer:
To reuse code across multiple smart contracts -> Option A
Quick Check:
Library = Code reuse [OK]
Hint: Library contracts are for sharing code, not storing data [OK]
Common Mistakes:
Confusing libraries with data storage contracts
Thinking libraries create tokens
Assuming libraries mine blocks
2. Which of the following is the correct way to declare a library in Solidity?
easy
A. library MyLib {}
B. contract MyLib {}
C. interface MyLib {}
D. struct MyLib {}
Solution
Step 1: Recall Solidity keywords for libraries
Solidity uses the keyword library to declare a library contract.
Step 2: Check each option's keyword
Only library MyLib {} uses library. Others declare contract, interface, or struct, which are different constructs.
Final Answer:
library MyLib {} -> Option A
Quick Check:
Keyword for library = library [OK]
Hint: Use 'library' keyword to declare libraries in Solidity [OK]
Common Mistakes:
Using 'contract' instead of 'library'
Confusing interfaces with libraries
Trying to declare libraries as structs
3. Given the following Solidity code, what will be the output of test.getDouble(5)?
library MathLib {
function double(uint x) internal pure returns (uint) {
return x * 2;
}
}
contract Test {
using MathLib for uint;
function getDouble(uint value) public pure returns (uint) {
return value.double();
}
}
medium
A. 5
B. 10
C. Compilation error
D. 0
Solution
Step 1: Understand the library function call
The library MathLib defines a function double that multiplies input by 2.
Step 2: Analyze the usage in contract Test
Using using MathLib for uint; allows calling double() on uint variables. So value.double() returns 5 * 2 = 10.
Final Answer:
10 -> Option B
Quick Check:
5 * 2 = 10 [OK]
Hint: Library functions called with 'using for' act on the type [OK]
Common Mistakes:
Expecting the original value instead of doubled
Thinking 'using for' is optional for calling library functions
Confusing internal and public function visibility
4. Identify the error in the following Solidity code using a library:
library Utils {
function increment(uint x) public pure returns (uint) {
return x + 1;
}
}
contract Counter {
using Utils for uint;
uint count;
function increase() public {
count = count.increment();
}
}
medium
A. Cannot use 'using for' with uint type
B. Missing constructor in contract
C. Library function must be internal, not public
D. Function increase should be view
Solution
Step 1: Check library function visibility
Library functions used with 'using for' must be internal, not public.
Step 2: Verify other options
No constructor is needed here, 'using for' works with uint, and increase modifies state so cannot be view.
Final Answer:
Library function must be internal, not public -> Option C
Quick Check:
Library function visibility = internal [OK]
Hint: Library functions called via 'using for' cannot be public [OK]
Common Mistakes:
Declaring library functions as public
Thinking 'using for' can't be used with uint
Marking state-changing functions as view
5. You want to create a library that provides a function to safely add two unsigned integers without overflow. Which of the following code snippets correctly implements this using Solidity 0.8+ features and can be used with using for in other contracts?
hard
A. library SafeMath {
function safeAdd(uint a, uint b) internal view returns (uint) {
return a + b;
}
}
B. library SafeMath {
function safeAdd(uint a, uint b) public pure returns (uint) {
return a + b;
}
}
C. library SafeMath {
function safeAdd(uint a, uint b) internal pure returns (uint) {
unchecked {
return a + b;
}
}
}
D. library SafeMath {
function safeAdd(uint a, uint b) internal pure returns (uint) {
uint c = a + b;
require(c >= a, "Overflow");
return c;
}
}
Solution
Step 1: Check function visibility and usage
Library functions used with 'using for' must be internal. library SafeMath {
function safeAdd(uint a, uint b) public pure returns (uint) {
return a + b;
}
} uses public (invalid), D uses view which is incorrect for pure functions. library SafeMath {
function safeAdd(uint a, uint b) internal pure returns (uint) {
uint c = a + b;
require(c >= a, "Overflow");
return c;
}
} uses internal pure.
Step 2: Verify overflow check and Solidity 0.8+ behavior
Solidity 0.8+ has built-in overflow checks, so unchecked block in C disables protection and returns wrapped value on overflow. library SafeMath {
function safeAdd(uint a, uint b) internal pure returns (uint) {
uint c = a + b;
require(c >= a, "Overflow");
return c;
}
} correctly relies on built-in checks with additional require guard and no unchecked block.
Final Answer:
library SafeMath {
function safeAdd(uint a, uint b) internal pure returns (uint) {
uint c = a + b;
require(c >= a, "Overflow");
return c;
}
} -> Option D
Quick Check:
Internal pure function with overflow check = library SafeMath {
function safeAdd(uint a, uint b) internal pure returns (uint) {
uint c = a + b;
require(c >= a, "Overflow");
return c;
}
} [OK]
Hint: Use internal pure functions with require for safe math [OK]
Common Mistakes:
Using public visibility in library functions
Using view instead of pure for math functions
Unnecessary unchecked blocks in Solidity 0.8+
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.