Lock
source code
// tests
Lock
provides a reentrancy mutex. Contracts that inherit from Lock
will have the lock
modifier
available, any subcall resulting from a call to a locked method will revert if it attempts to call
any other locked method on the same contract.
Note that reentrant calls to methods that are not protected by the lock modifier will still succeed.
Interface
Data
bool unlocked
: lock status
Modifiers
lock()
:
reverts if unlocked
is true, and sets it to false
for the duration of the call to the wrapped method.
Example
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity ^0.8.6;
import {Lock} from "dappsys-v2/lock.sol";
contract Locked is Lock {
uint public value = 0;
function badSet(uint v) external lock {
doSet(v);
}
function doBadSet(uint v) internal lock {
value = v;
}
function goodSet(uint v) external lock {
doGoodSet(v);
}
function doGoodSet(uint v) internal {
value = v;
}
}
contract Test {
function go() external {
Locked locked = new Locked();
// this call will work since `doGoodSet` is not protected by the lock
locked.goodSet(10);
// this will always revert since `unlocked` is `false` during the inner call to `doBadSet`
locked.badSet(10);
}
}