Branch data Line data Source code
1 : : // SPDX-License-Identifier: MIT
2 : : pragma solidity ^0.8.10;
3 : :
4 : : import {Context} from '../../../dependencies/openzeppelin/contracts/Context.sol';
5 : : import {Errors} from '../../libraries/helpers/Errors.sol';
6 : : import {VersionedInitializable} from '../../../misc/aave-upgradeability/VersionedInitializable.sol';
7 : : import {ICreditDelegationToken} from '../../../interfaces/ICreditDelegationToken.sol';
8 : : import {EIP712Base} from './EIP712Base.sol';
9 : :
10 : : /**
11 : : * @title DebtTokenBase
12 : : * @author Aave
13 : : * @notice Base contract for different types of debt tokens, like VariableDebtToken
14 : : */
15 : : abstract contract DebtTokenBase is
16 : : VersionedInitializable,
17 : : EIP712Base,
18 : : Context,
19 : : ICreditDelegationToken
20 : : {
21 : : // Map of borrow allowances (delegator => delegatee => borrowAllowanceAmount)
22 : : mapping(address => mapping(address => uint256)) internal _borrowAllowances;
23 : :
24 : : // Credit Delegation Typehash
25 : : bytes32 public constant DELEGATION_WITH_SIG_TYPEHASH =
26 : : keccak256('DelegationWithSig(address delegatee,uint256 value,uint256 nonce,uint256 deadline)');
27 : :
28 : : address internal _underlyingAsset;
29 : :
30 : : /**
31 : : * @dev Constructor.
32 : : */
33 : : constructor() EIP712Base() {
34 : : // Intentionally left blank
35 : : }
36 : :
37 : : /// @inheritdoc ICreditDelegationToken
38 : : function approveDelegation(address delegatee, uint256 amount) external override {
39 : 1001 : _approveDelegation(_msgSender(), delegatee, amount);
40 : : }
41 : :
42 : : /// @inheritdoc ICreditDelegationToken
43 : : function delegationWithSig(
44 : : address delegator,
45 : : address delegatee,
46 : : uint256 value,
47 : : uint256 deadline,
48 : : uint8 v,
49 : : bytes32 r,
50 : : bytes32 s
51 : : ) external {
52 : 7 : require(delegator != address(0), Errors.ZERO_ADDRESS_NOT_VALID);
53 : : //solium-disable-next-line
54 : 6 : require(block.timestamp <= deadline, Errors.INVALID_EXPIRATION);
55 : 5 : uint256 currentValidNonce = _nonces[delegator];
56 : 5 : bytes32 digest = keccak256(
57 : : abi.encodePacked(
58 : : '\x19\x01',
59 : : DOMAIN_SEPARATOR(),
60 : : keccak256(
61 : : abi.encode(DELEGATION_WITH_SIG_TYPEHASH, delegatee, value, currentValidNonce, deadline)
62 : : )
63 : : )
64 : : );
65 : 5 : require(delegator == ecrecover(digest, v, r, s), Errors.INVALID_SIGNATURE);
66 : 4 : _nonces[delegator] = currentValidNonce + 1;
67 : 4 : _approveDelegation(delegator, delegatee, value);
68 : : }
69 : :
70 : : /// @inheritdoc ICreditDelegationToken
71 : : function borrowAllowance(
72 : : address fromUser,
73 : : address toUser
74 : : ) external view override returns (uint256) {
75 : 5 : return _borrowAllowances[fromUser][toUser];
76 : : }
77 : :
78 : : /**
79 : : * @notice Updates the borrow allowance of a user on the specific debt token.
80 : : * @param delegator The address delegating the borrowing power
81 : : * @param delegatee The address receiving the delegated borrowing power
82 : : * @param amount The allowance amount being delegated.
83 : : */
84 : : function _approveDelegation(address delegator, address delegatee, uint256 amount) internal {
85 : 1005 : _borrowAllowances[delegator][delegatee] = amount;
86 : 1005 : emit BorrowAllowanceDelegated(delegator, delegatee, _underlyingAsset, amount);
87 : : }
88 : :
89 : : /**
90 : : * @notice Decreases the borrow allowance of a user on the specific debt token.
91 : : * @param delegator The address delegating the borrowing power
92 : : * @param delegatee The address receiving the delegated borrowing power
93 : : * @param amount The amount to subtract from the current allowance
94 : : */
95 : : function _decreaseBorrowAllowance(address delegator, address delegatee, uint256 amount) internal {
96 : 1001 : uint256 newAllowance = _borrowAllowances[delegator][delegatee] - amount;
97 : :
98 : 1001 : _borrowAllowances[delegator][delegatee] = newAllowance;
99 : :
100 : 1001 : emit BorrowAllowanceDelegated(delegator, delegatee, _underlyingAsset, newAllowance);
101 : : }
102 : : }
|