@@ -39,8 +39,7 @@ contract AllowancePositionManager is
3939
4040 /// @inheritdoc IAllowancePositionManager
4141 function approveWithdraw (address spender , uint256 reserveId , uint256 amount ) external {
42- _withdrawAllowances[msg .sender ][spender][reserveId] = amount;
43- emit WithdrawApproval (msg .sender , spender, reserveId, amount);
42+ _updateWithdrawAllowance (msg .sender , spender, reserveId, amount, true );
4443 }
4544
4645 /// @inheritdoc IAllowancePositionManager
@@ -49,19 +48,19 @@ contract AllowancePositionManager is
4948 bytes calldata signature
5049 ) external {
5150 require (block .timestamp <= params.deadline, InvalidSignature ());
52- address user = params.owner;
5351 bytes32 digest = _hashTypedData (params.hash ());
54- require (SignatureChecker.isValidSignatureNow (user, digest, signature), InvalidSignature ());
55- _useCheckedNonce (user, params.nonce);
52+ require (
53+ SignatureChecker.isValidSignatureNow (params.owner, digest, signature),
54+ InvalidSignature ()
55+ );
56+ _useCheckedNonce (params.owner, params.nonce);
5657
57- _withdrawAllowances[user][params.spender][params.reserveId] = params.amount;
58- emit WithdrawApproval (user, params.spender, params.reserveId, params.amount);
58+ _updateWithdrawAllowance (params.owner, params.spender, params.reserveId, params.amount, true );
5959 }
6060
6161 /// @inheritdoc IAllowancePositionManager
6262 function approveCreditDelegation (address spender , uint256 reserveId , uint256 amount ) external {
63- _creditDelegations[msg .sender ][spender][reserveId] = amount;
64- emit CreditDelegation (msg .sender , spender, reserveId, amount);
63+ _updateCreditDelegation (msg .sender , spender, reserveId, amount, true );
6564 }
6665
6766 /// @inheritdoc IAllowancePositionManager
@@ -70,25 +69,36 @@ contract AllowancePositionManager is
7069 bytes calldata signature
7170 ) external {
7271 require (block .timestamp <= params.deadline, InvalidSignature ());
73- address user = params.owner;
7472 bytes32 digest = _hashTypedData (params.hash ());
75- require (SignatureChecker.isValidSignatureNow (user, digest, signature), InvalidSignature ());
76- _useCheckedNonce (user, params.nonce);
73+ require (
74+ SignatureChecker.isValidSignatureNow (params.owner, digest, signature),
75+ InvalidSignature ()
76+ );
77+ _useCheckedNonce (params.owner, params.nonce);
7778
78- _creditDelegations[user][params.spender][params.reserveId] = params.amount;
79- emit CreditDelegation (user, params.spender, params.reserveId, params.amount);
79+ _updateCreditDelegation (params.owner, params.spender, params.reserveId, params.amount, true );
8080 }
8181
8282 /// @inheritdoc IAllowancePositionManager
8383 function renounceWithdrawAllowance (address owner , uint256 reserveId ) external {
84- _withdrawAllowances[owner][msg .sender ][reserveId] = 0 ;
85- emit WithdrawApproval (owner, msg .sender , reserveId, 0 );
84+ _updateWithdrawAllowance (
85+ owner,
86+ msg .sender ,
87+ reserveId,
88+ 0 ,
89+ ! (_withdrawAllowances[owner][msg .sender ][reserveId] == 0 )
90+ );
8691 }
8792
8893 /// @inheritdoc IAllowancePositionManager
8994 function renounceCreditDelegation (address owner , uint256 reserveId ) external {
90- _creditDelegations[owner][msg .sender ][reserveId] = 0 ;
91- emit CreditDelegation (owner, msg .sender , reserveId, 0 );
95+ _updateCreditDelegation (
96+ owner,
97+ msg .sender ,
98+ reserveId,
99+ 0 ,
100+ ! (_creditDelegations[owner][msg .sender ][reserveId] == 0 )
101+ );
92102 }
93103
94104 /// @inheritdoc IAllowancePositionManager
@@ -100,7 +110,13 @@ contract AllowancePositionManager is
100110 require (amount > 0 , InvalidAmount ());
101111 uint256 currentAllowance = _withdrawAllowances[onBehalfOf][msg .sender ][reserveId];
102112 require (currentAllowance >= amount, InsufficientWithdrawAllowance (currentAllowance, amount));
103- _withdrawAllowances[onBehalfOf][msg .sender ][reserveId] = currentAllowance.uncheckedSub (amount);
113+ _updateWithdrawAllowance (
114+ onBehalfOf,
115+ msg .sender ,
116+ reserveId,
117+ currentAllowance.uncheckedSub (amount),
118+ true
119+ );
104120
105121 IERC20 asset = _getReserveUnderlying (reserveId);
106122 (uint256 withdrawnShares , uint256 withdrawnAmount ) = ISpokeBase (SPOKE).withdraw (
@@ -122,7 +138,13 @@ contract AllowancePositionManager is
122138 require (amount > 0 , InvalidAmount ());
123139 uint256 currentAllowance = _creditDelegations[onBehalfOf][msg .sender ][reserveId];
124140 require (currentAllowance >= amount, InsufficientCreditDelegation (currentAllowance, amount));
125- _creditDelegations[onBehalfOf][msg .sender ][reserveId] = currentAllowance.uncheckedSub (amount);
141+ _updateCreditDelegation (
142+ onBehalfOf,
143+ msg .sender ,
144+ reserveId,
145+ currentAllowance.uncheckedSub (amount),
146+ true
147+ );
126148
127149 IERC20 asset = _getReserveUnderlying (reserveId);
128150 (uint256 borrowedShares , uint256 borrowedAmount ) = ISpokeBase (SPOKE).borrow (
@@ -145,7 +167,7 @@ contract AllowancePositionManager is
145167 }
146168
147169 /// @inheritdoc IAllowancePositionManager
148- function creditDelegationAllowance (
170+ function creditDelegation (
149171 address owner ,
150172 address spender ,
151173 uint256 reserveId
@@ -168,6 +190,32 @@ contract AllowancePositionManager is
168190 return EIP712Hash.CREDIT_DELEGATION_TYPEHASH;
169191 }
170192
193+ function _updateWithdrawAllowance (
194+ address owner ,
195+ address spender ,
196+ uint256 reserveId ,
197+ uint256 newAllowance ,
198+ bool emitEvent
199+ ) internal {
200+ _withdrawAllowances[owner][spender][reserveId] = newAllowance;
201+ if (emitEvent) {
202+ emit WithdrawApproval (owner, spender, reserveId, newAllowance);
203+ }
204+ }
205+
206+ function _updateCreditDelegation (
207+ address owner ,
208+ address spender ,
209+ uint256 reserveId ,
210+ uint256 newCreditDelegation ,
211+ bool emitEvent
212+ ) internal {
213+ _creditDelegations[owner][spender][reserveId] = newCreditDelegation;
214+ if (emitEvent) {
215+ emit CreditDelegation (owner, spender, reserveId, newCreditDelegation);
216+ }
217+ }
218+
171219 function _domainNameAndVersion () internal pure override returns (string memory , string memory ) {
172220 return ('AllowancePositionManager ' , '1 ' );
173221 }
0 commit comments