Skip to content

Commit 2bf4456

Browse files
committed
fix: verify state transition for tap collector thawing signers (TRST-R03)
Signed-off-by: Tomás Migone <[email protected]>
1 parent 670fba7 commit 2bf4456

File tree

3 files changed

+25
-4
lines changed

3 files changed

+25
-4
lines changed

packages/horizon/contracts/interfaces/ITAPCollector.sol

+7
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,13 @@ interface ITAPCollector is IPaymentsCollector {
130130
*/
131131
error TAPCollectorAuthorizationAlreadyRevoked(address payer, address signer);
132132

133+
/**
134+
* Thrown when attempting to thaw a signer that is already thawing
135+
* @param signer The address of the signer
136+
* @param thawEndTimestamp The timestamp at which the thawing period ends
137+
*/
138+
error TAPCollectorSignerAlreadyThawing(address signer, uint256 thawEndTimestamp);
139+
133140
/**
134141
* Thrown when the signer is not thawing
135142
* @param signer The address of the signer

packages/horizon/contracts/payments/collectors/TAPCollector.sol

+5-4
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,10 @@ contract TAPCollector is EIP712, GraphDirectory, ITAPCollector {
8282

8383
require(authorization.payer == msg.sender, TAPCollectorSignerNotAuthorizedByPayer(msg.sender, signer));
8484
require(!authorization.revoked, TAPCollectorAuthorizationAlreadyRevoked(msg.sender, signer));
85+
require(
86+
authorization.thawEndTimestamp == 0,
87+
TAPCollectorSignerAlreadyThawing(signer, authorization.thawEndTimestamp)
88+
);
8589

8690
authorization.thawEndTimestamp = block.timestamp + REVOKE_SIGNER_THAWING_PERIOD;
8791
emit SignerThawing(msg.sender, signer, authorization.thawEndTimestamp);
@@ -174,10 +178,7 @@ contract TAPCollector is EIP712, GraphDirectory, ITAPCollector {
174178

175179
// Ensure RAV payer matches the authorized payer
176180
address payer = authorizedSigners[signer].payer;
177-
require(
178-
signedRAV.rav.payer == payer,
179-
TAPCollectorInvalidRAVPayer(payer, signedRAV.rav.payer)
180-
);
181+
require(signedRAV.rav.payer == payer, TAPCollectorInvalidRAVPayer(payer, signedRAV.rav.payer));
181182

182183
address dataService = signedRAV.rav.dataService;
183184
address receiver = signedRAV.rav.serviceProvider;

packages/horizon/test/payments/tap-collector/signer/thawSigner.t.sol

+13
Original file line numberDiff line numberDiff line change
@@ -40,4 +40,17 @@ contract TAPCollectorThawSignerTest is TAPCollectorTest {
4040
vm.expectRevert(expectedError);
4141
tapCollector.thawSigner(signer);
4242
}
43+
44+
function testTAPCollector_ThawSigner_RevertWhen_AlreadyThawing() public useGateway useSigner {
45+
_thawSigner(signer);
46+
47+
(,uint256 thawEndTimestamp,) = tapCollector.authorizedSigners(signer);
48+
bytes memory expectedError = abi.encodeWithSelector(
49+
ITAPCollector.TAPCollectorSignerAlreadyThawing.selector,
50+
signer,
51+
thawEndTimestamp
52+
);
53+
vm.expectRevert(expectedError);
54+
tapCollector.thawSigner(signer);
55+
}
4356
}

0 commit comments

Comments
 (0)