inline contract functions to save gas for buckets
ERC20Bucket from 47,372 to 46,971 NFTBucket from 53,056 to 52,225
This commit is contained in:
parent
ce4df7d040
commit
c2251bd20d
|
@ -67,14 +67,21 @@ abstract contract Bucket {
|
||||||
function bucketType() virtual external returns (uint256);
|
function bucketType() virtual external returns (uint256);
|
||||||
|
|
||||||
function redeem(Redeem calldata _redeem, bytes calldata _sig) external {
|
function redeem(Redeem calldata _redeem, bytes calldata _sig) external {
|
||||||
validateRedeem(_redeem, maxTxDelayInBlocks, expirationTime, startTime);
|
// validate Redeem
|
||||||
|
require(_redeem.blockNumber < block.number, "transaction cannot be in the future");
|
||||||
|
require(_redeem.blockNumber >= (block.number - maxTxDelayInBlocks), "transaction too old");
|
||||||
|
require(_redeem.blockHash == blockhash(_redeem.blockNumber), "invalid block hash");
|
||||||
|
require(block.timestamp < expirationTime, "expired redeemable");
|
||||||
|
require(block.timestamp > startTime, "reedeming not yet started");
|
||||||
|
|
||||||
address recipient = recoverSigner(DOMAIN_SEPARATOR, _redeem, _sig);
|
address recipient = recoverSigner(DOMAIN_SEPARATOR, _redeem, _sig);
|
||||||
|
|
||||||
Redeemable storage redeemable = redeemables[recipient];
|
Redeemable storage redeemable = redeemables[recipient];
|
||||||
require(redeemable.recipient == recipient, "not found");
|
require(redeemable.recipient == recipient, "not found");
|
||||||
|
|
||||||
validateCode(_redeem, redeemable.code);
|
// validate code
|
||||||
|
bytes32 codeHash = keccak256(abi.encodePacked(_redeem.code));
|
||||||
|
require(codeHash == redeemable.code, "invalid code");
|
||||||
|
|
||||||
uint256 data = redeemable.data;
|
uint256 data = redeemable.data;
|
||||||
|
|
||||||
|
@ -109,15 +116,6 @@ abstract contract Bucket {
|
||||||
require(block.timestamp >= _expirationTime, "not expired yet");
|
require(block.timestamp >= _expirationTime, "not expired yet");
|
||||||
}
|
}
|
||||||
|
|
||||||
function validateRedeem(Redeem memory _redeem, uint256 _maxTxDelayInBlocks, uint256 _expirationTime, uint256 _startTime) internal view {
|
|
||||||
require(_redeem.blockNumber < block.number, "transaction cannot be in the future");
|
|
||||||
require(_redeem.blockNumber >= (block.number - _maxTxDelayInBlocks), "transaction too old");
|
|
||||||
require(_redeem.blockHash == blockhash(_redeem.blockNumber), "invalid block hash");
|
|
||||||
|
|
||||||
require(block.timestamp < _expirationTime, "expired redeemable");
|
|
||||||
require(block.timestamp > _startTime, "reedeming not yet started");
|
|
||||||
}
|
|
||||||
|
|
||||||
function hashRedeem(Redeem memory _redeem) internal pure returns (bytes32) {
|
function hashRedeem(Redeem memory _redeem) internal pure returns (bytes32) {
|
||||||
return keccak256(abi.encode(
|
return keccak256(abi.encode(
|
||||||
REDEEM_TYPEHASH,
|
REDEEM_TYPEHASH,
|
||||||
|
@ -155,9 +153,4 @@ abstract contract Bucket {
|
||||||
|
|
||||||
return ecrecover(digest, v, r, s);
|
return ecrecover(digest, v, r, s);
|
||||||
}
|
}
|
||||||
|
|
||||||
function validateCode(Redeem memory _redeem, bytes32 _code) internal pure {
|
|
||||||
bytes32 codeHash = keccak256(abi.encodePacked(_redeem.code));
|
|
||||||
require(codeHash == _code, "invalid code");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue