DCIPs/assets/eip-5453/ThresholdMultiSigForwarder.sol

57 lines
1.8 KiB
Solidity

// SPDX-License-Identifier: CC0.0 OR Apache-2.0
// Author: Zainan Victor Zhou <zzn-ercref@zzn.im>
// See a full runnable hardhat project in https://github.com/ercref/ercref-contracts/tree/main/ERCs/eip-5453
pragma solidity ^0.8.9;
import "./AERC5453.sol";
contract ThresholdMultiSigForwarder is AERC5453Endorsible {
mapping(address => bool) private owners;
uint256 private ownerCount;
constructor() AERC5453Endorsible("ThresholdMultiSigForwarder", "v1") {}
function initialize(
address[] calldata _owners,
uint256 _threshold
) external {
require(_threshold >= 1, "Threshold must be positive");
require(_owners.length >= _threshold);
require(_noRepeat(_owners));
_setThreshold(_threshold);
for (uint256 i = 0; i < _owners.length; i++) {
owners[_owners[i]] = true;
}
ownerCount = _owners.length;
}
function forward(
address _dest,
uint256 _value,
uint256 _gasLimit,
bytes calldata _calldata,
bytes calldata _extraData
)
external
onlyEndorsed(
_computeFunctionParamHash(
"function forward(address _dest,uint256 _value,uint256 _gasLimit,bytes calldata _calldata)",
abi.encode(_dest, _value, _gasLimit, keccak256(_calldata))
),
_extraData
)
{
string memory errorMessage = "Fail to call remote contract";
(bool success, bytes memory returndata) = _dest.call{value: _value}(
_calldata
);
Address.verifyCallResult(success, returndata, errorMessage);
}
function _isEligibleEndorser(
address _endorser
) internal view override returns (bool) {
return owners[_endorser] == true;
}
}