or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

Files

docs

access-control.mdcrosschain.mdfinance.mdgovernance.mdindex.mdmetatx.mdproxy.mdsecurity.mdtokens.mdutilities.md

index.mddocs/

0

# OpenZeppelin Contracts

1

2

OpenZeppelin Contracts is a comprehensive library of secure, battle-tested smart contract components for Solidity development on Ethereum and EVM-compatible blockchains. It provides standardized implementations of industry-standard token contracts (ERC20, ERC721, ERC1155, ERC777), flexible access control mechanisms, security patterns, proxy systems for upgradeability, governance frameworks, and essential utilities for cryptographic operations and mathematical calculations.

3

4

## Package Information

5

6

- **Package Name**: openzeppelin-solidity

7

- **Package Type**: npm

8

- **Language**: Solidity, JavaScript

9

- **Installation**: `npm install openzeppelin-solidity`

10

- **Documentation**: https://docs.openzeppelin.com/contracts

11

- **Version**: 4.8.1

12

13

## Core Imports

14

15

Import contracts using Solidity import statements:

16

17

```solidity

18

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";

19

import "@openzeppelin/contracts/token/ERC721/ERC721.sol";

20

import "@openzeppelin/contracts/access/Ownable.sol";

21

import "@openzeppelin/contracts/security/ReentrancyGuard.sol";

22

```

23

24

For specific extensions:

25

26

```solidity

27

import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol";

28

import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol";

29

import "@openzeppelin/contracts/access/AccessControl.sol";

30

```

31

32

## Basic Usage

33

34

### Simple ERC20 Token

35

36

```solidity

37

pragma solidity ^0.8.0;

38

39

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";

40

import "@openzeppelin/contracts/access/Ownable.sol";

41

42

contract MyToken is ERC20, Ownable {

43

constructor() ERC20("MyToken", "MTK") {

44

_mint(msg.sender, 1000000 * 10**decimals());

45

}

46

47

function mint(address to, uint256 amount) public onlyOwner {

48

_mint(to, amount);

49

}

50

}

51

```

52

53

### Simple NFT Collection

54

55

```solidity

56

pragma solidity ^0.8.0;

57

58

import "@openzeppelin/contracts/token/ERC721/ERC721.sol";

59

import "@openzeppelin/contracts/access/Ownable.sol";

60

import "@openzeppelin/contracts/utils/Counters.sol";

61

62

contract MyNFT is ERC721, Ownable {

63

using Counters for Counters.Counter;

64

Counters.Counter private _tokenIds;

65

66

constructor() ERC721("MyNFT", "MNFT") {}

67

68

function mint(address recipient) public onlyOwner returns (uint256) {

69

_tokenIds.increment();

70

uint256 newItemId = _tokenIds.current();

71

_safeMint(recipient, newItemId);

72

return newItemId;

73

}

74

}

75

```

76

77

## Architecture

78

79

OpenZeppelin Contracts follows several key design patterns:

80

81

- **Inheritance-Based Extensions**: Core implementations extended through inheritance for additional functionality

82

- **Interface Compliance**: All contracts implement standard interfaces (IERC20, IERC721, etc.)

83

- **Security First**: Every contract follows security best practices and undergoes rigorous auditing

84

- **Gas Optimization**: Implementations balance security with gas efficiency

85

- **Modular Design**: Contracts can be combined and extended for custom use cases

86

- **Role-Based Access**: Flexible access control through roles and ownership patterns

87

88

## Capabilities

89

90

### Token Standards

91

92

Complete implementations of major Ethereum token standards with extensive extensions and utilities. Includes fungible tokens (ERC20), non-fungible tokens (ERC721), multi-tokens (ERC1155), and advanced tokens (ERC777).

93

94

```solidity { .api }

95

contract ERC20 is Context, IERC20, IERC20Metadata {

96

function name() external view returns (string memory);

97

function symbol() external view returns (string memory);

98

function decimals() external view returns (uint8);

99

function totalSupply() external view returns (uint256);

100

function balanceOf(address account) external view returns (uint256);

101

function transfer(address to, uint256 amount) external returns (bool);

102

function allowance(address owner, address spender) external view returns (uint256);

103

function approve(address spender, uint256 amount) external returns (bool);

104

function transferFrom(address from, address to, uint256 amount) external returns (bool);

105

}

106

107

contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {

108

function balanceOf(address owner) external view returns (uint256 balance);

109

function ownerOf(uint256 tokenId) external view returns (address owner);

110

function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;

111

function safeTransferFrom(address from, address to, uint256 tokenId) external;

112

function transferFrom(address from, address to, uint256 tokenId) external;

113

function approve(address to, uint256 tokenId) external;

114

function setApprovalForAll(address operator, bool approved) external;

115

function getApproved(uint256 tokenId) external view returns (address operator);

116

function isApprovedForAll(address owner, address operator) external view returns (bool);

117

}

118

```

119

120

[Token Standards](./tokens.md)

121

122

### Access Control

123

124

Role-based and ownership-based access control mechanisms for restricting function access and managing permissions in smart contracts.

125

126

```solidity { .api }

127

abstract contract AccessControl is Context, IAccessControl, ERC165 {

128

function hasRole(bytes32 role, address account) public view virtual returns (bool);

129

function getRoleAdmin(bytes32 role) public view virtual returns (bytes32);

130

function grantRole(bytes32 role, address account) public virtual;

131

function revokeRole(bytes32 role, address account) public virtual;

132

function renounceRole(bytes32 role, address account) public virtual;

133

}

134

135

abstract contract Ownable is Context {

136

function owner() public view virtual returns (address);

137

function renounceOwnership() public virtual onlyOwner;

138

function transferOwnership(address newOwner) public virtual onlyOwner;

139

}

140

```

141

142

[Access Control](./access-control.md)

143

144

### Security Patterns

145

146

Security mechanisms including reentrancy protection, pausable contracts, and pull payment patterns to prevent common smart contract vulnerabilities.

147

148

```solidity { .api }

149

abstract contract ReentrancyGuard {

150

modifier nonReentrant();

151

}

152

153

abstract contract Pausable is Context {

154

function paused() public view virtual returns (bool);

155

modifier whenNotPaused();

156

modifier whenPaused();

157

}

158

```

159

160

[Security Patterns](./security.md)

161

162

### Proxy Patterns

163

164

Upgradeable contract patterns and proxy utilities for creating flexible, maintainable smart contract systems.

165

166

```solidity { .api }

167

library Clones {

168

function clone(address implementation) internal returns (address instance);

169

function cloneDeterministic(address implementation, bytes32 salt) internal returns (address instance);

170

function predictDeterministicAddress(address implementation, bytes32 salt, address deployer) internal pure returns (address predicted);

171

}

172

173

abstract contract Proxy {

174

function _delegate(address implementation) internal virtual;

175

function _implementation() internal view virtual returns (address);

176

function _fallback() internal virtual;

177

}

178

```

179

180

[Proxy Patterns](./proxy.md)

181

182

### Governance

183

184

On-chain governance systems with voting mechanisms, proposal management, and timelock controllers for decentralized decision making.

185

186

```solidity { .api }

187

abstract contract Governor is Context, ERC165, EIP712, IGovernor {

188

function name() public view virtual returns (string memory);

189

function version() public view virtual returns (string memory);

190

function hashProposal(address[] memory targets, uint256[] memory values, bytes[] memory calldatas, bytes32 descriptionHash) public pure virtual returns (uint256);

191

function state(uint256 proposalId) public view virtual returns (ProposalState);

192

function propose(address[] memory targets, uint256[] memory values, bytes[] memory calldatas, string memory description) public virtual returns (uint256);

193

function execute(address[] memory targets, uint256[] memory values, bytes[] memory calldatas, bytes32 descriptionHash) public payable virtual returns (uint256);

194

function castVote(uint256 proposalId, uint8 support) public virtual returns (uint256);

195

}

196

197

contract TimelockController is AccessControl {

198

function isOperation(bytes32 id) public view virtual returns (bool registered);

199

function isOperationPending(bytes32 id) public view virtual returns (bool pending);

200

function isOperationReady(bytes32 id) public view virtual returns (bool ready);

201

function isOperationDone(bytes32 id) public view virtual returns (bool done);

202

function getTimestamp(bytes32 id) public view virtual returns (uint256 timestamp);

203

function getMinDelay() public view virtual returns (uint256 duration);

204

function schedule(address target, uint256 value, bytes calldata data, bytes32 predecessor, bytes32 salt, uint256 delay) public virtual;

205

function execute(address target, uint256 value, bytes calldata data, bytes32 predecessor, bytes32 salt) public payable virtual;

206

}

207

```

208

209

[Governance](./governance.md)

210

211

### Utility Functions

212

213

Common utility functions including mathematical operations, cryptographic utilities, data structures, and helper functions for smart contract development.

214

215

```solidity { .api }

216

library Math {

217

function max(uint256 a, uint256 b) internal pure returns (uint256);

218

function min(uint256 a, uint256 b) internal pure returns (uint256);

219

function average(uint256 a, uint256 b) internal pure returns (uint256);

220

function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256);

221

function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result);

222

function sqrt(uint256 a) internal pure returns (uint256);

223

}

224

225

library ECDSA {

226

function recover(bytes32 hash, bytes memory signature) internal pure returns (address);

227

function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32);

228

function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32);

229

}

230

231

library Address {

232

function isContract(address account) internal view returns (bool);

233

function sendValue(address payable recipient, uint256 amount) internal;

234

function functionCall(address target, bytes memory data) internal returns (bytes memory);

235

}

236

```

237

238

[Utilities](./utilities.md)

239

240

### Financial Primitives

241

242

Payment splitting, vesting schedules, and other financial mechanisms for handling cryptocurrency payments and distributions.

243

244

```solidity { .api }

245

contract PaymentSplitter is Context {

246

function totalShares() public view returns (uint256);

247

function totalReleased() public view returns (uint256);

248

function shares(address account) public view returns (uint256);

249

function released(address account) public view returns (uint256);

250

function payee(uint256 index) public view returns (address);

251

function release(address payable account) public virtual;

252

}

253

254

contract VestingWallet is Context {

255

function beneficiary() public view virtual returns (address);

256

function start() public view virtual returns (uint256);

257

function duration() public view virtual returns (uint256);

258

function released() public view virtual returns (uint256);

259

function releasable() public view virtual returns (uint256);

260

function release() public virtual;

261

}

262

```

263

264

[Financial Primitives](./finance.md)

265

266

### Meta-Transactions

267

268

ERC2771 meta-transaction support for gasless transactions and improved user experience in decentralized applications.

269

270

```solidity { .api }

271

abstract contract ERC2771Context is Context {

272

function isTrustedForwarder(address forwarder) public view virtual returns (bool);

273

function _msgSender() internal view virtual override returns (address sender);

274

function _msgData() internal view virtual override returns (bytes calldata);

275

}

276

277

contract MinimalForwarder is EIP712 {

278

struct ForwardRequest {

279

address from;

280

address to;

281

uint256 value;

282

uint256 gas;

283

uint256 nonce;

284

bytes data;

285

}

286

287

function getNonce(address from) public view returns (uint256);

288

function verify(ForwardRequest calldata req, bytes calldata signature) public view returns (bool);

289

function execute(ForwardRequest calldata req, bytes calldata signature) public payable returns (bool, bytes memory);

290

}

291

```

292

293

[Meta-Transactions](./metatx.md)

294

295

### Cross-Chain Integration

296

297

Cross-chain messaging utilities for communicating across different blockchain networks, supporting Layer 2 solutions and bridge protocols.

298

299

```solidity { .api }

300

abstract contract CrossChainEnabled {

301

function _isCrossChain() internal view virtual returns (bool);

302

function _crossChainSender() internal view virtual returns (address);

303

}

304

305

abstract contract CrossChainEnabledOptimism is CrossChainEnabled {

306

constructor(address crossChainMessenger);

307

function crossChainMessenger() public view virtual returns (address);

308

}

309

310

abstract contract CrossChainEnabledArbitrumL1 is CrossChainEnabled {

311

constructor(address bridge);

312

function bridge() public view virtual returns (address);

313

}

314

```

315

316

[Cross-Chain Integration](./crosschain.md)