Skip to content

Commit

Permalink
things getting seriously out of hand here
Browse files Browse the repository at this point in the history
  • Loading branch information
0age committed Oct 15, 2024
1 parent 61f5b1e commit 21fbe36
Show file tree
Hide file tree
Showing 2 changed files with 138 additions and 42 deletions.
75 changes: 46 additions & 29 deletions src/TheCompact.sol
Original file line number Diff line number Diff line change
Expand Up @@ -643,20 +643,16 @@ contract TheCompact is ITheCompact, ERC6909, Extsload {
}
}

function _notExpiredAndWithValidSignatures(Claim calldata claimPayload)
internal
returns (bytes32 messageHash)
{
function _notExpiredAndWithValidSignatures(
bytes32 messageHash,
Claim calldata claimPayload,
address allocator
) internal view {
claimPayload.expires.later();

messageHash = claimPayload.toMessageHash();
bytes32 domainSeparator = _INITIAL_DOMAIN_SEPARATOR.toLatest(_INITIAL_CHAIN_ID);
messageHash.signedBy(claimPayload.sponsor, claimPayload.sponsorSignature, domainSeparator);
messageHash.signedBy(
claimPayload.id.toRegisteredAllocatorWithConsumed(claimPayload.nonce),
claimPayload.allocatorSignature,
domainSeparator
);
messageHash.signedBy(allocator, claimPayload.allocatorSignature, domainSeparator);
}

// NOTE: this function expects that there's at least one array element
Expand Down Expand Up @@ -749,20 +745,15 @@ contract TheCompact is ITheCompact, ERC6909, Extsload {
);
}

function _notExpiredAndWithValidSignaturesWithWitness(ClaimWithWitness calldata claimPayload)
internal
returns (bytes32 messageHash)
{
function _notExpiredAndWithValidSignaturesWithWitness(
bytes32 messageHash,
ClaimWithWitness calldata claimPayload,
address allocator
) internal view {
claimPayload.expires.later();

messageHash = claimPayload.toMessageHash();
bytes32 domainSeparator = _INITIAL_DOMAIN_SEPARATOR.toLatest(_INITIAL_CHAIN_ID);
messageHash.signedBy(claimPayload.sponsor, claimPayload.sponsorSignature, domainSeparator);
messageHash.signedBy(
claimPayload.id.toRegisteredAllocatorWithConsumed(claimPayload.nonce),
claimPayload.allocatorSignature,
domainSeparator
);
messageHash.signedBy(allocator, claimPayload.allocatorSignature, domainSeparator);
}

function _notExpiredAndWithValidSignaturesQualifiedWithWitness(
Expand Down Expand Up @@ -794,21 +785,21 @@ contract TheCompact is ITheCompact, ERC6909, Extsload {
}

function _usingSplitClaimWithWitness(
function(ClaimWithWitness calldata) internal returns (bytes32) fnIn
function(bytes32, ClaimWithWitness calldata, address) internal view fnIn
)
internal
pure
returns (function(SplitClaimWithWitness calldata) internal returns (bytes32) fnOut)
returns (function(bytes32, SplitClaimWithWitness calldata, address) internal view fnOut)
{
assembly {
fnOut := fnIn
}
}

function _usingSplitClaim(function(Claim calldata) internal returns (bytes32) fnIn)
function _usingSplitClaim(function(bytes32, Claim calldata, address) internal view fnIn)
internal
pure
returns (function(SplitClaim calldata) internal returns (bytes32) fnOut)
returns (function(bytes32, SplitClaim calldata, address) internal view fnOut)
{
assembly {
fnOut := fnIn
Expand Down Expand Up @@ -928,7 +919,12 @@ contract TheCompact is ITheCompact, ERC6909, Extsload {
Claim calldata claimPayload,
function(address, address, uint256, uint256) internal returns (bool) operation
) internal returns (bool) {
bytes32 messageHash = _notExpiredAndWithValidSignatures(claimPayload);
bytes32 messageHash = claimPayload.toMessageHash();
_notExpiredAndWithValidSignatures(
messageHash,
claimPayload,
claimPayload.id.toRegisteredAllocatorWithConsumed(claimPayload.nonce)
);

claimPayload.amount.withinAllocated(claimPayload.allocatedAmount);

Expand Down Expand Up @@ -985,9 +981,16 @@ contract TheCompact is ITheCompact, ERC6909, Extsload {
SplitClaim calldata claimPayload,
function(address, address, uint256, uint256) internal returns (bool) operation
) internal returns (bool) {
bytes32 messageHash = claimPayload.toMessageHash();
_usingSplitClaim(_notExpiredAndWithValidSignatures)(
messageHash,
claimPayload,
claimPayload.id.toRegisteredAllocatorWithConsumed(claimPayload.nonce)
);

return _verifyAndProcessSplitComponents(
claimPayload.sponsor,
_usingSplitClaim(_notExpiredAndWithValidSignatures)(claimPayload),
messageHash,
claimPayload.id,
claimPayload.allocatedAmount,
claimPayload.claimants,
Expand Down Expand Up @@ -1029,13 +1032,20 @@ contract TheCompact is ITheCompact, ERC6909, Extsload {
ClaimWithWitness calldata claimPayload,
function(address, address, uint256, uint256) internal returns (bool) operation
) internal returns (bool) {
bytes32 messageHash = claimPayload.toMessageHash();
_notExpiredAndWithValidSignaturesWithWitness(
messageHash,
claimPayload,
claimPayload.id.toRegisteredAllocatorWithConsumed(claimPayload.nonce)
);

claimPayload.amount.withinAllocated(claimPayload.allocatedAmount);

return _emitAndOperate(
claimPayload.sponsor,
claimPayload.claimant,
claimPayload.id,
_notExpiredAndWithValidSignaturesWithWitness(claimPayload),
messageHash,
claimPayload.amount,
operation
);
Expand All @@ -1045,9 +1055,16 @@ contract TheCompact is ITheCompact, ERC6909, Extsload {
SplitClaimWithWitness calldata claimPayload,
function(address, address, uint256, uint256) internal returns (bool) operation
) internal returns (bool) {
bytes32 messageHash = claimPayload.toMessageHash();
_usingSplitClaimWithWitness(_notExpiredAndWithValidSignaturesWithWitness)(
messageHash,
claimPayload,
claimPayload.id.toRegisteredAllocatorWithConsumed(claimPayload.nonce)
);

return _verifyAndProcessSplitComponents(
claimPayload.sponsor,
_usingSplitClaimWithWitness(_notExpiredAndWithValidSignaturesWithWitness)(claimPayload),
messageHash,
claimPayload.id,
claimPayload.allocatedAmount,
claimPayload.claimants,
Expand Down
105 changes: 92 additions & 13 deletions src/lib/HashLib.sol
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@ library HashLib {
}
}

function toMessageHash(Claim calldata claim) internal view returns (bytes32 messageHash) {
function toClaimMessageHash(Claim calldata claim) internal view returns (bytes32 messageHash) {
assembly ("memory-safe") {
let m := mload(0x40) // Grab the free memory pointer; memory will be left dirtied.

Expand All @@ -142,7 +142,11 @@ library HashLib {
}
}

function toMessageHash(QualifiedClaim calldata claim)
function toMessageHash(Claim calldata claim) internal view returns (bytes32 messageHash) {
return toClaimMessageHash(claim);
}

function toQualifiedClaimMessageHash(QualifiedClaim calldata claim)
internal
view
returns (bytes32 messageHash, bytes32 qualificationMessageHash)
Expand All @@ -161,28 +165,36 @@ library HashLib {
qualificationMessageHash = toQualificationMessageHash(claim, messageHash, 0);
}

function toMessageHash(QualifiedClaim calldata claim)
internal
view
returns (bytes32 messageHash, bytes32 qualificationMessageHash)
{
return toQualifiedClaimMessageHash(claim);
}

function usingQualifiedSplitClaim(
function (
QualifiedClaim calldata,
bytes32,
uint256
) internal pure returns (bytes32) fnIn
function(QualifiedClaim calldata) internal view returns (bytes32, bytes32) fnIn
)
internal
pure
returns (
function(
QualifiedSplitClaim calldata,
bytes32,
uint256
) internal pure returns (bytes32) fnOut
function(QualifiedSplitClaim calldata) internal view returns (bytes32, bytes32) fnOut
)
{
assembly {
fnOut := fnIn
}
}

function toMessageHash(QualifiedSplitClaim calldata claim)
internal
view
returns (bytes32 messageHash, bytes32 qualificationMessageHash)
{
return usingQualifiedSplitClaim(toQualifiedClaimMessageHash)(claim);
}

function toQualificationMessageHash(
QualifiedClaim calldata claim,
bytes32 messageHash,
Expand Down Expand Up @@ -273,7 +285,7 @@ library HashLib {
}
}

function toMessageHash(QualifiedClaimWithWitness calldata claim)
function toQualifiedClaimWithWitnessMessageHash(QualifiedClaimWithWitness calldata claim)
internal
view
returns (bytes32 messageHash, bytes32 qualificationMessageHash)
Expand All @@ -283,6 +295,37 @@ library HashLib {
usingQualifiedClaimWithWitness(toQualificationMessageHash)(claim, messageHash, 0x40);
}

function _usingQualifiedSplitClaimWithWitness(
function (QualifiedClaimWithWitness calldata) internal view returns (bytes32, bytes32) fnIn
)
internal
pure
returns (
function (QualifiedSplitClaimWithWitness calldata) internal view returns (bytes32, bytes32)
fnOut
)
{
assembly {
fnOut := fnIn
}
}

function toMessageHash(QualifiedClaimWithWitness calldata claim)
internal
view
returns (bytes32 messageHash, bytes32 qualificationMessageHash)
{
return toQualifiedClaimWithWitnessMessageHash(claim);
}

function toMessageHash(QualifiedSplitClaimWithWitness calldata claim)
internal
view
returns (bytes32 messageHash, bytes32 qualificationMessageHash)
{
return _usingQualifiedSplitClaimWithWitness(toQualifiedClaimWithWitnessMessageHash)(claim);
}

function toMessageHash(BatchTransfer calldata transfer)
internal
view
Expand Down Expand Up @@ -477,6 +520,42 @@ library HashLib {
);
}

function _usingSplitClaim(function (Claim calldata) internal view returns (bytes32) fnIn)
internal
pure
returns (function (SplitClaim calldata) internal view returns (bytes32) fnOut)
{
assembly {
fnOut := fnIn
}
}

function toMessageHash(SplitClaim calldata claim) internal view returns (bytes32 messageHash) {
return _usingSplitClaim(toClaimMessageHash)(claim);
}

function _usingSplitClaimWithWitness(
function (ClaimWithWitness calldata, uint256) internal view returns (bytes32) fnIn
)
internal
pure
returns (
function (SplitClaimWithWitness calldata, uint256) internal view returns (bytes32) fnOut
)
{
assembly {
fnOut := fnIn
}
}

function toMessageHash(SplitClaimWithWitness calldata claim)
internal
view
returns (bytes32 messageHash)
{
return _usingSplitClaimWithWitness(toMessageHashWithWitness)(claim, 0);
}

// TODO: all these SplitBatch can just use a function cast to leverage
// BatchClaim.toMessageHash logic as the structs have the exact same offsets
function toMessageHash(SplitBatchClaim memory claim)
Expand Down

0 comments on commit 21fbe36

Please sign in to comment.