Skip to content

Commit

Permalink
add more claim methods
Browse files Browse the repository at this point in the history
  • Loading branch information
0age committed Oct 12, 2024
1 parent 906145b commit 1736cee
Show file tree
Hide file tree
Showing 2 changed files with 143 additions and 30 deletions.
8 changes: 6 additions & 2 deletions foundry.toml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
[profile.default]
solc = '0.8.27'
solc = '0.8.28'
evm_version='cancun'
via_ir = true
optimizer_runs = 4_294_967_295
Expand All @@ -9,7 +9,11 @@ out = "out"
libs = ["lib"]
extra_output_files = ["irOptimized"]

[profile.default.optimizer_details.yulDetails]
# optimizerSteps = "dhfoD[xarrscLMcCTU]uljmul:fDnTOcmu"
# TODO: use default with everything but FunctionSpecializer (F)

[fmt]
line_length = 100
tab_width = 4
bracket_spacing = true
bracket_spacing = true
165 changes: 137 additions & 28 deletions src/TheCompact.sol
Original file line number Diff line number Diff line change
Expand Up @@ -361,14 +361,14 @@ contract TheCompact is ITheCompact, ERC6909, Extsload {
return _processBasic(transfer, _release);
}

function allocatedTransfer(SplitTransfer memory transfer) external returns (bool) {
return _processSplit(transfer, _release);
}

function allocatedWithdrawal(BasicTransfer memory withdrawal) external returns (bool) {
return _processBasic(withdrawal, _withdraw);
}

function allocatedTransfer(SplitTransfer memory transfer) external returns (bool) {
return _processSplit(transfer, _release);
}

function allocatedWithdrawal(SplitTransfer memory withdrawal) external returns (bool) {
return _processSplit(withdrawal, _withdraw);
}
Expand All @@ -393,12 +393,32 @@ contract TheCompact is ITheCompact, ERC6909, Extsload {
return _processClaim(claimPayload, _release);
}

function claimAndWithdraw(Claim memory claimPayload) external returns (bool) {
return _processClaim(claimPayload, _withdraw);
}

function claim(QualifiedClaim memory claimPayload) external returns (bool) {
return _processQualifiedClaim(claimPayload, _release);
}

function claimAndWithdraw(QualifiedClaim memory claimPayload) external returns (bool) {
return _processQualifiedClaim(claimPayload, _withdraw);
}

function claim(ClaimWithWitness memory claimPayload) external returns (bool) {
return _processClaimWithWitness(claimPayload, _release);
}

function claimAndWithdraw(ClaimWithWitness memory claimPayload) external returns (bool) {
return _processClaimWithWitness(claimPayload, _withdraw);
}

function claim(BatchClaim memory claimPayload) external returns (bool) {
return _processBatchClaim(claimPayload);
return _processBatchClaim(claimPayload, _release);
}

function claimAndWithdraw(Claim memory claimPayload) external returns (bool) {
return _processClaim(claimPayload, _withdraw);
function claimAndWithdraw(BatchClaim memory claimPayload) external returns (bool) {
return _processBatchClaim(claimPayload, _release);
}

function enableForcedWithdrawal(uint256 id) external returns (uint256 withdrawableAt) {
Expand Down Expand Up @@ -634,7 +654,68 @@ contract TheCompact is ITheCompact, ERC6909, Extsload {
);
}

function _processBatchClaim(BatchClaim memory batchClaim) internal returns (bool) {
function _processQualifiedClaim(
QualifiedClaim memory claimPayload,
function(address, address, uint256, uint256) internal returns (bool) operation
) internal returns (bool) {
claimPayload.expires.later();
if (claimPayload.allocatedAmount < claimPayload.amount) {
revert AllocatedAmountExceeded(claimPayload.allocatedAmount, claimPayload.amount);
}

address allocator = claimPayload.id.toRegisteredAllocatorWithConsumed(claimPayload.nonce);

(bytes32 messageHash, bytes32 qualificationMessageHash) = claimPayload.toMessageHash();
bytes32 domainSeparator = _INITIAL_DOMAIN_SEPARATOR.toLatest(_INITIAL_CHAIN_ID);
messageHash.signedBy(claimPayload.sponsor, claimPayload.sponsorSignature, domainSeparator);
qualificationMessageHash.signedBy(allocator, claimPayload.allocatorSignature, domainSeparator);

emit Claimed(
claimPayload.sponsor,
claimPayload.claimant,
claimPayload.id,
messageHash,
claimPayload.amount
);

return operation(
claimPayload.sponsor, claimPayload.claimant, claimPayload.id, claimPayload.amount
);
}

function _processClaimWithWitness(
ClaimWithWitness memory claimPayload,
function(address, address, uint256, uint256) internal returns (bool) operation
) internal returns (bool) {
claimPayload.expires.later();
if (claimPayload.allocatedAmount < claimPayload.amount) {
revert AllocatedAmountExceeded(claimPayload.allocatedAmount, claimPayload.amount);
}

address allocator = claimPayload.id.toRegisteredAllocatorWithConsumed(claimPayload.nonce);

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

emit Claimed(
claimPayload.sponsor,
claimPayload.claimant,
claimPayload.id,
messageHash,
claimPayload.amount
);

return operation(
claimPayload.sponsor, claimPayload.claimant, claimPayload.id, claimPayload.amount
);
}

function _processBatchClaim(
BatchClaim memory batchClaim,
function(address, address, uint256, uint256) internal returns (bool) operation
) internal returns (bool) {
batchClaim.expires.later();

uint256 totalClaims = batchClaim.claims.length;
Expand All @@ -657,7 +738,7 @@ contract TheCompact is ITheCompact, ERC6909, Extsload {
uint256 errorBuffer = (component.allocatedAmount < component.amount).asUint256();
uint256 id = component.id;
emit Claimed(batchClaim.sponsor, component.claimant, id, messageHash, component.amount);
_release(batchClaim.sponsor, component.claimant, component.id, component.amount);
operation(batchClaim.sponsor, component.claimant, component.id, component.amount);

unchecked {
for (uint256 i = 1; i < totalClaims; ++i) {
Expand All @@ -673,7 +754,7 @@ contract TheCompact is ITheCompact, ERC6909, Extsload {
messageHash,
component.amount
);
_release(batchClaim.sponsor, component.claimant, component.id, component.amount);
operation(batchClaim.sponsor, component.claimant, component.id, component.amount);
}
}
if (errorBuffer.asBool()) {
Expand Down Expand Up @@ -715,11 +796,55 @@ contract TheCompact is ITheCompact, ERC6909, Extsload {
ids[0] = initialId;
}


(
ISignatureTransfer.SignatureTransferDetails[] memory details,
ISignatureTransfer.TokenPermissions[] memory permittedTokens
) = _preparePermit2ArraysAndPerformDeposits(
ids,
totalTokensLessInitialNative,
firstUnderlyingTokenIsNative,
permitted,
initialId,
recipient,
depositor
);

ISignatureTransfer.PermitBatchTransferFrom memory permitTransferFrom =
ISignatureTransfer.PermitBatchTransferFrom({
permitted: permittedTokens,
nonce: nonce,
deadline: deadline
});

_PERMIT2.permitWitnessTransferFrom(
permitTransferFrom,
details,
depositor,
witness,
"CompactDeposit witness)CompactDeposit(address depositor,address allocator,uint8 resetPeriod,uint8 scope,address recipient)TokenPermissions(address token,uint256 amount)",
signature
);

}

function _preparePermit2ArraysAndPerformDeposits(
uint256[] memory ids,
uint256 totalTokensLessInitialNative,
bool firstUnderlyingTokenIsNative,
ISignatureTransfer.TokenPermissions[] calldata permitted,
uint256 initialId,
address recipient,
address depositor
) internal returns (
ISignatureTransfer.SignatureTransferDetails[] memory details,
ISignatureTransfer.TokenPermissions[] memory permittedTokens
) {
unchecked {
ISignatureTransfer.SignatureTransferDetails[] memory details =
details =
new ISignatureTransfer.SignatureTransferDetails[](totalTokensLessInitialNative);

ISignatureTransfer.TokenPermissions[] memory permittedTokens =
permittedTokens =
new ISignatureTransfer.TokenPermissions[](totalTokensLessInitialNative);

for (uint256 i = 0; i < totalTokensLessInitialNative; ++i) {
Expand All @@ -737,22 +862,6 @@ contract TheCompact is ITheCompact, ERC6909, Extsload {

_deposit(depositor, recipient, id, permittedToken.amount);
}

ISignatureTransfer.PermitBatchTransferFrom memory permitTransferFrom =
ISignatureTransfer.PermitBatchTransferFrom({
permitted: permittedTokens,
nonce: nonce,
deadline: deadline
});

_PERMIT2.permitWitnessTransferFrom(
permitTransferFrom,
details,
depositor,
witness,
"CompactDeposit witness)CompactDeposit(address depositor,address allocator,uint8 resetPeriod,uint8 scope,address recipient)TokenPermissions(address token,uint256 amount)",
signature
);
}
}

Expand Down

0 comments on commit 1736cee

Please sign in to comment.