Skip to content

Commit 6ee2b26

Browse files
committed
Merge branch 'feat/new-position-managers' into feat/posm-temporary-approvals
2 parents a443ac9 + 480e518 commit 6ee2b26

10 files changed

+630
-178
lines changed
Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,25 @@
11
{
2-
"AllowancePositionManager - borrowOnBehalfOf": "307050",
3-
"AllowancePositionManager - withdrawOnBehalfOf: full": "122024",
4-
"AllowancePositionManager - withdrawOnBehalfOf: partial": "132329",
5-
"Common - setSelfAsUserPositionManagerWithSig": "72588",
6-
"SupplyRepayPositionManager - repayOnBehalfOf": "167131",
7-
"SupplyRepayPositionManager - supplyOnBehalfOf": "135803"
2+
"AllowancePositionManager: approveWithdraw": "46858",
3+
"AllowancePositionManager: approveWithdrawWithSig": "63069",
4+
"AllowancePositionManager: borrowOnBehalfOf": "309383",
5+
"AllowancePositionManager: creditDelegation": "46836",
6+
"AllowancePositionManager: creditDelegationWithSig": "63156",
7+
"AllowancePositionManager: renounceCreditDelegation": "24989",
8+
"AllowancePositionManager: renounceWithdrawAllowance": "24900",
9+
"AllowancePositionManager: withdrawOnBehalfOf: full": "123872",
10+
"AllowancePositionManager: withdrawOnBehalfOf: partial": "134639",
11+
"PositionConfigPositionManager: renounceGlobalPermission": "24423",
12+
"PositionConfigPositionManager: renounceUserDynamicConfigPermission": "24468",
13+
"PositionConfigPositionManager: renounceUserRiskPremiumPermission": "24467",
14+
"PositionConfigPositionManager: renounceUsingAsCollateralPermission": "24490",
15+
"PositionConfigPositionManager: setGlobalPermission": "46607",
16+
"PositionConfigPositionManager: setUserDynamicConfigPermission": "46563",
17+
"PositionConfigPositionManager: setUserRiskPremiumPermission": "46542",
18+
"PositionConfigPositionManager: setUsingAsCollateralOnBehalfOf": "69052",
19+
"PositionConfigPositionManager: setUsingAsCollateralPermission": "46607",
20+
"PositionConfigPositionManager: updateUserDynamicConfigOnBehalfOf": "46765",
21+
"PositionConfigPositionManager: updateUserRiskPremiumOnBehalfOf": "127837",
22+
"SupplyRepayPositionManager: repayOnBehalfOf": "167131",
23+
"SupplyRepayPositionManager: supplyOnBehalfOf": "135803",
24+
"common: setSelfAsUserPositionManagerWithSig": "72588"
825
}

src/position-manager/AllowancePositionManager.sol

Lines changed: 72 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,7 @@ contract AllowancePositionManager is
5353

5454
/// @inheritdoc IAllowancePositionManager
5555
function approveWithdraw(address spender, uint256 reserveId, uint256 amount) external {
56-
_withdrawAllowances[msg.sender][spender][reserveId] = amount;
57-
emit WithdrawApproval(msg.sender, spender, reserveId, amount);
56+
_updateWithdrawAllowance(msg.sender, spender, reserveId, amount, true);
5857
}
5958

6059
/// @inheritdoc IAllowancePositionManager
@@ -63,13 +62,14 @@ contract AllowancePositionManager is
6362
bytes calldata signature
6463
) external {
6564
require(block.timestamp <= params.deadline, InvalidSignature());
66-
address user = params.owner;
6765
bytes32 digest = _hashTypedData(params.hash());
68-
require(SignatureChecker.isValidSignatureNow(user, digest, signature), InvalidSignature());
69-
_useCheckedNonce(user, params.nonce);
66+
require(
67+
SignatureChecker.isValidSignatureNow(params.owner, digest, signature),
68+
InvalidSignature()
69+
);
70+
_useCheckedNonce(params.owner, params.nonce);
7071

71-
_withdrawAllowances[user][params.spender][params.reserveId] = params.amount;
72-
emit WithdrawApproval(user, params.spender, params.reserveId, params.amount);
72+
_updateWithdrawAllowance(params.owner, params.spender, params.reserveId, params.amount, true);
7373
}
7474

7575
/// @inheritdoc IAllowancePositionManager
@@ -78,45 +78,51 @@ contract AllowancePositionManager is
7878
}
7979

8080
/// @inheritdoc IAllowancePositionManager
81-
function approveCreditDelegation(address spender, uint256 reserveId, uint256 amount) external {
82-
_creditDelegations[msg.sender][spender][reserveId] = amount;
83-
emit CreditDelegation(msg.sender, spender, reserveId, amount);
81+
function creditDelegation(address spender, uint256 reserveId, uint256 amount) external {
82+
_updateCreditDelegation(msg.sender, spender, reserveId, amount, true);
8483
}
8584

8685
/// @inheritdoc IAllowancePositionManager
87-
function approveCreditDelegationWithSig(
86+
function creditDelegationWithSig(
8887
EIP712Types.CreditDelegation calldata params,
8988
bytes calldata signature
9089
) external {
9190
require(block.timestamp <= params.deadline, InvalidSignature());
92-
address user = params.owner;
9391
bytes32 digest = _hashTypedData(params.hash());
94-
require(SignatureChecker.isValidSignatureNow(user, digest, signature), InvalidSignature());
95-
_useCheckedNonce(user, params.nonce);
92+
require(
93+
SignatureChecker.isValidSignatureNow(params.owner, digest, signature),
94+
InvalidSignature()
95+
);
96+
_useCheckedNonce(params.owner, params.nonce);
9697

97-
_creditDelegations[user][params.spender][params.reserveId] = params.amount;
98-
emit CreditDelegation(user, params.spender, params.reserveId, params.amount);
98+
_updateCreditDelegation(params.owner, params.spender, params.reserveId, params.amount, true);
9999
}
100100

101101
/// @inheritdoc IAllowancePositionManager
102-
function temporaryApproveCreditDelegation(
103-
address spender,
104-
uint256 reserveId,
105-
uint256 amount
106-
) external {
102+
function temporaryCreditDelegation(address spender, uint256 reserveId, uint256 amount) external {
107103
_temporaryCreditDelegationsSlot(msg.sender, spender, reserveId).tstore(amount);
108104
}
109105

110106
/// @inheritdoc IAllowancePositionManager
111107
function renounceWithdrawAllowance(address owner, uint256 reserveId) external {
112-
_withdrawAllowances[owner][msg.sender][reserveId] = 0;
113-
emit WithdrawApproval(owner, msg.sender, reserveId, 0);
108+
_updateWithdrawAllowance(
109+
owner,
110+
msg.sender,
111+
reserveId,
112+
0,
113+
!(_withdrawAllowances[owner][msg.sender][reserveId] == 0)
114+
);
114115
}
115116

116117
/// @inheritdoc IAllowancePositionManager
117118
function renounceCreditDelegation(address owner, uint256 reserveId) external {
118-
_creditDelegations[owner][msg.sender][reserveId] = 0;
119-
emit CreditDelegation(owner, msg.sender, reserveId, 0);
119+
_updateCreditDelegation(
120+
owner,
121+
msg.sender,
122+
reserveId,
123+
0,
124+
!(_creditDelegations[owner][msg.sender][reserveId] == 0)
125+
);
120126
}
121127

122128
/// @inheritdoc IAllowancePositionManager
@@ -169,7 +175,7 @@ contract AllowancePositionManager is
169175
}
170176

171177
/// @inheritdoc IAllowancePositionManager
172-
function creditDelegationAllowance(
178+
function creditDelegation(
173179
address owner,
174180
address spender,
175181
uint256 reserveId
@@ -192,6 +198,32 @@ contract AllowancePositionManager is
192198
return EIP712Hash.CREDIT_DELEGATION_TYPEHASH;
193199
}
194200

201+
function _updateWithdrawAllowance(
202+
address owner,
203+
address spender,
204+
uint256 reserveId,
205+
uint256 newAllowance,
206+
bool emitEvent
207+
) internal {
208+
_withdrawAllowances[owner][spender][reserveId] = newAllowance;
209+
if (emitEvent) {
210+
emit WithdrawApproval(owner, spender, reserveId, newAllowance);
211+
}
212+
}
213+
214+
function _updateCreditDelegation(
215+
address owner,
216+
address spender,
217+
uint256 reserveId,
218+
uint256 newCreditDelegation,
219+
bool emitEvent
220+
) internal {
221+
_creditDelegations[owner][spender][reserveId] = newCreditDelegation;
222+
if (emitEvent) {
223+
emit CreditDelegation(owner, spender, reserveId, newCreditDelegation);
224+
}
225+
}
226+
195227
function _domainNameAndVersion() internal pure override returns (string memory, string memory) {
196228
return ('AllowancePositionManager', '1');
197229
}
@@ -216,7 +248,13 @@ contract AllowancePositionManager is
216248
} else {
217249
uint256 allowance = _withdrawAllowances[onBehalfOf][spender][reserveId];
218250
require(allowance >= amount, InsufficientWithdrawAllowance(allowance, amount));
219-
_withdrawAllowances[onBehalfOf][spender][reserveId] = allowance.uncheckedSub(amount);
251+
_updateWithdrawAllowance({
252+
owner: onBehalfOf,
253+
spender: spender,
254+
reserveId: reserveId,
255+
newAllowance: allowance.uncheckedSub(amount),
256+
emitEvent: true
257+
});
220258
}
221259
}
222260

@@ -240,7 +278,13 @@ contract AllowancePositionManager is
240278
} else {
241279
uint256 allowance = _creditDelegations[onBehalfOf][spender][reserveId];
242280
require(allowance >= amount, InsufficientCreditDelegation(allowance, amount));
243-
_creditDelegations[onBehalfOf][spender][reserveId] = allowance.uncheckedSub(amount);
281+
_updateCreditDelegation({
282+
owner: onBehalfOf,
283+
spender: spender,
284+
reserveId: reserveId,
285+
newCreditDelegation: allowance.uncheckedSub(amount),
286+
emitEvent: true
287+
});
244288
}
245289
}
246290

src/position-manager/PositionConfigPositionManager.sol

Lines changed: 73 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -13,42 +13,98 @@ import {IPositionConfigPositionManager, ConfigPermissions} from 'src/position-ma
1313
contract PositionConfigPositionManager is IPositionConfigPositionManager, PositionManagerBase {
1414
using ConfigPermissionsMap for ConfigPermissions;
1515

16-
mapping(address owner => mapping(address caller => ConfigPermissions)) private _configPermissions;
16+
mapping(address owner => mapping(address caller => ConfigPermissions)) private _config;
1717

1818
/// @dev Constructor.
1919
/// @param spoke_ The address of the spoke contract.
2020
constructor(address spoke_) PositionManagerBase(spoke_) {}
2121

2222
/// @inheritdoc IPositionConfigPositionManager
2323
function setGlobalPermission(address caller, bool permission) external {
24-
_configPermissions[msg.sender][caller] = _configPermissions[msg.sender][caller]
25-
.setFullPermissions(permission);
24+
ConfigPermissions oldPermissions = _config[msg.sender][caller];
25+
ConfigPermissions newPermissions = oldPermissions.setFullPermissions(permission);
26+
_config[msg.sender][caller] = newPermissions;
2627

27-
emit GlobalConfigPermissionUpdated(msg.sender, caller, permission);
28+
if (!oldPermissions.eq(newPermissions)) {
29+
emit ConfigPermissionsUpdated(msg.sender, caller, newPermissions);
30+
}
2831
}
2932

3033
/// @inheritdoc IPositionConfigPositionManager
3134
function setUsingAsCollateralPermission(address caller, bool permission) external {
32-
_configPermissions[msg.sender][caller] = _configPermissions[msg.sender][caller]
33-
.setCanSetUsingAsCollateral(permission);
35+
ConfigPermissions oldPermissions = _config[msg.sender][caller];
36+
ConfigPermissions newPermissions = oldPermissions.setCanSetUsingAsCollateral(permission);
37+
_config[msg.sender][caller] = newPermissions;
3438

35-
emit SetUsingAsCollateralPermissionUpdated(msg.sender, caller, permission);
39+
if (!oldPermissions.eq(newPermissions)) {
40+
emit ConfigPermissionsUpdated(msg.sender, caller, newPermissions);
41+
}
3642
}
3743

3844
/// @inheritdoc IPositionConfigPositionManager
3945
function setUserRiskPremiumPermission(address caller, bool permission) external {
40-
_configPermissions[msg.sender][caller] = _configPermissions[msg.sender][caller]
41-
.setCanUpdateUserRiskPremium(permission);
46+
ConfigPermissions oldPermissions = _config[msg.sender][caller];
47+
ConfigPermissions newPermissions = oldPermissions.setCanUpdateUserRiskPremium(permission);
48+
_config[msg.sender][caller] = newPermissions;
4249

43-
emit UserRiskPremiumPermissionUpdated(msg.sender, caller, permission);
50+
if (!oldPermissions.eq(newPermissions)) {
51+
emit ConfigPermissionsUpdated(msg.sender, caller, newPermissions);
52+
}
4453
}
4554

4655
/// @inheritdoc IPositionConfigPositionManager
4756
function setUserDynamicConfigPermission(address caller, bool permission) external {
48-
_configPermissions[msg.sender][caller] = _configPermissions[msg.sender][caller]
49-
.setCanUpdateUserDynamicConfig(permission);
57+
ConfigPermissions oldPermissions = _config[msg.sender][caller];
58+
ConfigPermissions newPermissions = oldPermissions.setCanUpdateUserDynamicConfig(permission);
59+
_config[msg.sender][caller] = newPermissions;
5060

51-
emit UserDynamicConfigPermissionUpdated(msg.sender, caller, permission);
61+
if (!oldPermissions.eq(newPermissions)) {
62+
emit ConfigPermissionsUpdated(msg.sender, caller, newPermissions);
63+
}
64+
}
65+
66+
/// @inheritdoc IPositionConfigPositionManager
67+
function renounceGlobalPermission(address owner) external {
68+
ConfigPermissions oldPermissions = _config[owner][msg.sender];
69+
ConfigPermissions newPermissions = oldPermissions.setFullPermissions(false);
70+
_config[owner][msg.sender] = newPermissions;
71+
72+
if (!oldPermissions.eq(newPermissions)) {
73+
emit ConfigPermissionsUpdated(owner, msg.sender, newPermissions);
74+
}
75+
}
76+
77+
/// @inheritdoc IPositionConfigPositionManager
78+
function renounceUsingAsCollateralPermission(address owner) external {
79+
ConfigPermissions oldPermissions = _config[owner][msg.sender];
80+
ConfigPermissions newPermissions = oldPermissions.setCanSetUsingAsCollateral(false);
81+
_config[owner][msg.sender] = newPermissions;
82+
83+
if (!oldPermissions.eq(newPermissions)) {
84+
emit ConfigPermissionsUpdated(owner, msg.sender, newPermissions);
85+
}
86+
}
87+
88+
/// @inheritdoc IPositionConfigPositionManager
89+
function renounceUserRiskPremiumPermission(address owner) external {
90+
ConfigPermissions oldPermissions = _config[owner][msg.sender];
91+
ConfigPermissions newPermissions = oldPermissions.setCanUpdateUserRiskPremium(false);
92+
_config[owner][msg.sender] = newPermissions;
93+
94+
if (!oldPermissions.eq(newPermissions)) {
95+
emit ConfigPermissionsUpdated(owner, msg.sender, newPermissions);
96+
}
97+
}
98+
99+
/// @inheritdoc IPositionConfigPositionManager
100+
function renounceUserDynamicConfigPermission(address owner) external {
101+
ConfigPermissions oldPermissions = _config[owner][msg.sender];
102+
ConfigPermissions newPermissions = oldPermissions.setCanUpdateUserDynamicConfig(false);
103+
_config[owner][msg.sender] = newPermissions;
104+
105+
if (!oldPermissions.eq(newPermissions)) {
106+
emit ConfigPermissionsUpdated(owner, msg.sender, newPermissions);
107+
}
52108
}
53109

54110
/// @inheritdoc IPositionConfigPositionManager
@@ -57,30 +113,21 @@ contract PositionConfigPositionManager is IPositionConfigPositionManager, Positi
57113
uint256 reserveId,
58114
bool usingAsCollateral
59115
) external {
60-
require(
61-
_configPermissions[onBehalfOf][msg.sender].canSetUsingAsCollateral(),
62-
CallerNotAllowed()
63-
);
116+
require(_config[onBehalfOf][msg.sender].canSetUsingAsCollateral(), CallerNotAllowed());
64117

65118
ISpoke(SPOKE).setUsingAsCollateral(reserveId, usingAsCollateral, onBehalfOf);
66119
}
67120

68121
/// @inheritdoc IPositionConfigPositionManager
69122
function updateUserRiskPremiumOnBehalfOf(address onBehalfOf) external {
70-
require(
71-
_configPermissions[onBehalfOf][msg.sender].canUpdateUserRiskPremium(),
72-
CallerNotAllowed()
73-
);
123+
require(_config[onBehalfOf][msg.sender].canUpdateUserRiskPremium(), CallerNotAllowed());
74124

75125
ISpoke(SPOKE).updateUserRiskPremium(onBehalfOf);
76126
}
77127

78128
/// @inheritdoc IPositionConfigPositionManager
79129
function updateUserDynamicConfigOnBehalfOf(address onBehalfOf) external {
80-
require(
81-
_configPermissions[onBehalfOf][msg.sender].canUpdateUserDynamicConfig(),
82-
CallerNotAllowed()
83-
);
130+
require(_config[onBehalfOf][msg.sender].canUpdateUserDynamicConfig(), CallerNotAllowed());
84131

85132
ISpoke(SPOKE).updateUserDynamicConfig(onBehalfOf);
86133
}
@@ -90,7 +137,7 @@ contract PositionConfigPositionManager is IPositionConfigPositionManager, Positi
90137
address caller,
91138
address onBehalfOf
92139
) external view returns (ConfigPermissionValues memory) {
93-
ConfigPermissions permissions = _configPermissions[onBehalfOf][caller];
140+
ConfigPermissions permissions = _config[onBehalfOf][caller];
94141
return
95142
ConfigPermissionValues({
96143
canSetUsingAsCollateral: permissions.canSetUsingAsCollateral(),

src/position-manager/PositionManagerBase.sol

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -29,14 +29,14 @@ abstract contract PositionManagerBase is IPositionManagerBase, Multicall {
2929
bytes calldata signature
3030
) external {
3131
try
32-
ISpoke(SPOKE).setUserPositionManagerWithSig(
33-
address(this),
34-
params.user,
35-
params.approve,
36-
params.nonce,
37-
params.deadline,
38-
signature
39-
)
32+
ISpoke(SPOKE).setUserPositionManagerWithSig({
33+
positionManager: address(this),
34+
user: params.user,
35+
approve: params.approve,
36+
nonce: params.nonce,
37+
deadline: params.deadline,
38+
signature: signature
39+
})
4040
{} catch {}
4141
}
4242

0 commit comments

Comments
 (0)