mirror of https://github.com/vacp2p/minime.git
36 lines
1.1 KiB
Solidity
36 lines
1.1 KiB
Solidity
|
// SPDX-License-Identifier: MIT
|
||
|
pragma solidity ^0.8.0;
|
||
|
|
||
|
/**
|
||
|
* @dev Provides tracking nonces for addresses. Nonces will only increment.
|
||
|
*/
|
||
|
abstract contract Nonces {
|
||
|
/**
|
||
|
* @dev The nonce used for an `account` is not the expected current nonce.
|
||
|
*/
|
||
|
error InvalidAccountNonce(address account, uint256 currentNonce);
|
||
|
|
||
|
mapping(address account => uint256) private _nonces;
|
||
|
|
||
|
/**
|
||
|
* @dev Returns the next unused nonce for an address.
|
||
|
*/
|
||
|
function nonces(address owner) public view virtual returns (uint256) {
|
||
|
return _nonces[owner];
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @dev Consumes a nonce.
|
||
|
*
|
||
|
* Returns the current value and increments nonce.
|
||
|
*/
|
||
|
function _useNonce(address owner) internal virtual returns (uint256) {
|
||
|
// For each account, the nonce has an initial value of 0, can only be incremented by one, and cannot be
|
||
|
// decremented or reset. This guarantees that the nonce never overflows.
|
||
|
unchecked {
|
||
|
// It is important to do x++ and not ++x here.
|
||
|
return _nonces[owner]++;
|
||
|
}
|
||
|
}
|
||
|
}
|