Files
smom-dbis-138/contracts/dbis/DBIS_EIP712Helper.sol
defiQUG 1511f33857 chore: update DBIS contracts and integrate EIP-712 helper
- Updated DBIS_ConversionRouter and DBIS_SettlementRouter to utilize IDBIS_EIP712Helper for EIP-712 hashing and signature recovery, improving stack depth management.
- Refactored minting logic in DBIS_GRU_MintController to streamline recipient processing.
- Enhanced BUILD_NOTES.md with updated build instructions and test coverage details.
- Added new functions in DBIS_SignerRegistry for duplicate signer checks and active signer validation.
- Introduced a new submodule, DBIS_EIP712Helper, to encapsulate EIP-712 related functionalities.

Made-with: Cursor
2026-03-04 02:00:09 -08:00

128 lines
3.9 KiB
Solidity

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import "./IDBIS_EIP712Helper.sol";
/**
* @title DBIS_EIP712Helper
* @notice Helper contract for EIP-712 hashing and ecrecover (own stack when called).
*/
contract DBIS_EIP712Helper is IDBIS_EIP712Helper {
function hashAddressArray(address[] calldata arr) external pure override returns (bytes32) {
bytes32[] memory hashes = new bytes32[](arr.length);
for (uint256 i = 0; i < arr.length; i++) {
hashes[i] = keccak256(abi.encode(arr[i]));
}
return keccak256(abi.encodePacked(hashes));
}
function hashUint256Array(uint256[] calldata arr) external pure override returns (bytes32) {
bytes32[] memory hashes = new bytes32[](arr.length);
for (uint256 i = 0; i < arr.length; i++) {
hashes[i] = keccak256(abi.encode(arr[i]));
}
return keccak256(abi.encodePacked(hashes));
}
function getMintAuthStructHash(
bytes32 typeHash,
bytes32 messageId,
bytes32 isoType,
bytes32 isoHash,
bytes32 accountingRef,
uint8 fundsStatus,
bytes32 corridor,
uint8 assetClass,
bytes32 recipientsHash,
bytes32 amountsHash,
uint64 notBefore,
uint64 expiresAt,
uint256 chainId,
address verifyingContract
) external pure override returns (bytes32) {
return keccak256(abi.encode(
typeHash,
messageId,
isoType,
isoHash,
accountingRef,
fundsStatus,
corridor,
assetClass,
recipientsHash,
amountsHash,
notBefore,
expiresAt,
chainId,
verifyingContract
));
}
function getDigest(bytes32 domainSeparator, bytes32 structHash) external pure override returns (bytes32) {
return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
}
function recover(bytes32 digest, bytes calldata signature) external pure override returns (address) {
return _recover(digest, signature);
}
function recoverSigners(bytes32 digest, bytes[] calldata signatures) external pure override returns (address[] memory signers) {
uint256 n = signatures.length;
signers = new address[](n);
unchecked {
for (uint256 i; i < n; i++) {
signers[i] = _recover(digest, signatures[i]);
}
}
}
function getSwapAuthDigest(
bytes32 domainSeparator,
bytes32 typeHash,
bytes32 messageId,
bytes32 lpaId,
bytes32 venue,
address tokenIn,
address tokenOut,
uint256 amountIn,
uint256 minAmountOut,
uint256 deadline,
bytes32 quoteHash,
address quoteIssuer,
uint256 chainId,
address verifyingContract
) external pure override returns (bytes32) {
bytes32 structHash = keccak256(abi.encode(
typeHash,
messageId,
lpaId,
venue,
tokenIn,
tokenOut,
amountIn,
minAmountOut,
deadline,
quoteHash,
quoteIssuer,
chainId,
verifyingContract
));
return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
}
function _recover(bytes32 digest, bytes calldata signature) private pure returns (address) {
require(signature.length == 65, "DBIS: sig length");
bytes32 r;
bytes32 s;
uint8 v;
assembly {
r := calldataload(signature.offset)
s := calldataload(add(signature.offset, 32))
v := byte(0, calldataload(add(signature.offset, 64)))
}
if (v < 27) v += 27;
require(v == 27 || v == 28, "DBIS: invalid v");
return ecrecover(digest, v, r, s);
}
}