contract Ownable {
address public owner;
modifier onlyOwner() {
require(msg.sender == owner,
"Not owner");
_;
}
constructor() {
owner = msg.sender;
}
}contract MyVault is Ownable {
function emergencyWithdraw()
external
onlyOwner
{
// Admin-only logic
}
}contract Token {
function transfer(address to, uint a)
public virtual { ... }
}
contract AuditedToken is Token {
event TransferAudited(address f, address t, uint a);
function transfer(address to, uint a)
public override
{
emit TransferAudited(msg.sender, to, a);
super.transfer(to, a);
}
}contract Base {
function foo() public virtual {}
}
contract A is Base {
function foo() public virtual override {}
}
contract B is Base {
function foo() public virtual override {}
}
contract Final is A, B {
function foo() public override(A,B) {
super.foo();
}
}super.foo() → next in chain = B.foo()event Deposit(address from, uint amount);
function deposit() external payable {
emit Deposit(msg.sender, msg.value);
}vault.on("Deposit", (from, amount) => {
console.log(`${from} deposited ${ethers.formatEther(amount)} ETH`);
});library SafeMath {
function add(uint a, uint b)
internal pure
returns(uint)
{
return a + b;
}
}abstract contract ReentrancyGuard {
uint private locked;
modifier nonReentrant() {
require(locked == 0, "reentrancy");
locked = 1;
_;
locked = 0;
}
}locked acts as mutex for critical sections.using SafeMath for uint256;
contract Vault is ReentrancyGuard {
mapping(address => uint) balances;
function deposit() external payable {
balances[msg.sender] = balances[msg.sender].add(msg.value);
}
function withdraw(uint a) external nonReentrant {
require(balances[msg.sender] >= a, "Insufficient");
balances[msg.sender] -= a;
(bool ok,) = msg.sender.call{value: a}("");
require(ok, "Transfer failed");
}
}interface IERC20 {
function transfer(address to, uint a)
external returns(bool);
function approve(address s, uint a)
external returns(bool);
}
contract Treasury {
IERC20 public token;
constructor(address _t) {
token = IERC20(_t);
}
function deposit(uint a) external {
token.transferFrom(msg.sender, address(this), a);
}
}require(amount > 0);
balances[msg.sender] -= amount;
(bool ok,) = msg.sender.call{value:amount}("");
require(ok);modifier nonReentrant() {
require(!locked);
locked = true;
_;
locked = false;
}function claim() external {
uint a = pending[msg.sender];
pending[msg.sender] = 0;
(bool ok,) = msg.sender.call{value:a}("");
require(ok);
}