Description:
Smart contract deployed on Ethereum with Factory features.
Blockchain: Ethereum
Source Code: View Code On The Blockchain
Solidity Source Code:
{{
"language": "Solidity",
"sources": {
"CommonConfigs.sol": {
"content": "// SPDX-License-Identifier: BUSL-1.1\r
pragma solidity 0.8.12;\r
import "./interfaces/ICommonConfigs.sol";\r
\r
contract CommonConfigs is ICommonConfigs{\r
mapping(uint => bytes4) private supportEmergencyCalls;\r
mapping(IMultiSigCold => uint) private feeRates;\r
IMultiSigUtc immutable multiSigUtc;\r
error UnauthorizedEmergencyCall(bytes4 methodId);\r
constructor(IMultiSigUtc _multiSigUtc){\r
multiSigUtc=_multiSigUtc;\r
}\r
\r
function getFeeInfo(IMultiSigCold user)external view returns(uint,address){\r
uint feeRate=feeRates[user];\r
if(feeRate==0){\r
feeRate=1;\r
} else if(feeRate==type(uint16).max){\r
feeRate=0;\r
}\r
return (feeRate,multiSigUtc.getUtcFeeAddr());\r
}\r
\r
function setSupportEmergencyCalls(uint callType,address callAddr,bytes4 methodId,bytes memory signatures) external {\r
checkSignatures(signatures,abi.encodeWithSelector(this.setSupportEmergencyCalls.selector,callType,callAddr,methodId,new bytes(0)));\r
supportEmergencyCalls[callType+uint256(uint160(callAddr))]=methodId;\r
}\r
function setFreeFeeRate(IMultiSigCold user,bytes memory signatures) external {\r
checkSignatures(signatures,abi.encodeWithSelector(this.setFreeFeeRate.selector,user,new bytes(0)));\r
feeRates[user]=type(uint16).max;\r
}\r
function setFeeRate(uint16 _feeRate,IMultiSigCold user,bytes memory signatures) external {\r
checkSignatures(signatures,abi.encodeWithSelector(this.setFeeRate.selector,_feeRate,user,new bytes(0)));\r
feeRates[user]=_feeRate;\r
}\r
\r
function checkEmergencyCall(\r
bytes memory data,\r
uint callType,\r
address callAddr\r
)external view{\r
bytes4 methodId;\r
assembly {\r
methodId:=shr(0xe0,mload(data))\r
}\r
if(methodId!=supportEmergencyCalls[callType+uint256(uint160(callAddr))]){\r
revert UnauthorizedEmergencyCall(methodId);\r
}\r
}\r
function checkSignatures(bytes memory signatures,bytes memory data) internal{\r
//获取管理员信息\r
(uint managerNumber,uint expirationTime,address[] memory managers)=multiSigUtc.getManagerInfo();\r
address lastOwner = address(0);\r
//当前签名的管理员地址,用于验签用途\r
address currentOwner;\r
uint t;//签名的时间戳(秒为单位)\r
uint8 j;//签名管理员在合约管理员信息的名单列表里面的位置(下标)\r
uint8 v;//签名数据V\r
bytes32 r;//签名数据R\r
bytes32 s;//签名数据S\r
//签名的原始数据datahash,满足EIP712并包括合约nonce等信息\r
bytes32 dataHash=_getTransactionHash(data);\r
for (uint i;i<managerNumber;++i) {\r
(t,j,v, r, s) = signatureSplit(signatures, i);\r
require(t >expirationTime);//验证是否过期\r
//获取签名的明文数据来恢复地址信息,其中明文数据是数据datahash和签名时间再次hash完成\r
currentOwner = ecrecover(getHashWithTimestamp(dataHash,t), v, r, s);\r
require(currentOwner > lastOwner);//保证账户不会重复\r
require(currentOwner==managers[j]);\r
lastOwner = currentOwner;\r
}\r
}\r
\r
function signatureSplit(bytes memory signatures, uint256 pos) internal pure returns (\r
uint t,uint8 j,uint8 v,bytes32 r,bytes32 s\r
) {\r
assembly {\r
let signaturePos := mul(0x62, pos)\r
r := mload(add(signatures, add(signaturePos, 0x20)))\r
s := mload(add(signatures, add(signaturePos, 0x40)))\r
t := mload(add(signatures, add(signaturePos, 0x60)))\r
j := byte(0, mload(add(signatures, add(signaturePos, 0x80))))\r
v := byte(0, mload(add(signatures, add(signaturePos, 0x81))))\r
}\r
}\r
\r
uint256 public nonce;\r
\r
bytes32 private constant DOMAIN_SEPARATOR_TYPEHASH = 0x47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a79469218;\r
function _domainSeparator() internal view returns (bytes32) {\r
uint256 chainId;\r
assembly {\r
chainId := chainid()\r
}\r
return keccak256(abi.encode(DOMAIN_SEPARATOR_TYPEHASH, chainId, this));\r
}\r
\r
function _getTransactionHash(bytes memory transactions) internal returns (bytes32 txHash) {\r
txHash =keccak256(abi.encodePacked(bytes1(0x19),bytes1(0x01),_domainSeparator(),keccak256(abi.encode(transactions,nonce++))));\r
}\r
\r
function getTransactionHash(bytes memory transactions) external view returns (bytes32 txHash) {\r
txHash =keccak256(abi.encodePacked(bytes1(0x19),bytes1(0x01),_domainSeparator(),keccak256(abi.encode(transactions,nonce))));\r
}\r
\r
function getHashWithTimestamp(bytes32 txHash,uint t)internal pure returns (bytes32 digest) {\r
bytes32 messageHash=keccak256(abi.encodePacked(txHash, t));\r
assembly {\r
mstore(0x00, "\x19Ethereum Signed Message:\
32") // 32 is the bytes-length of messageHash\r
mstore(0x1c, messageHash) // 0x1c (28) is the length of the prefix\r
digest := keccak256(0x00, 0x3c) // 0x3c is the length of the prefix (0x1c) + messageHash (0x20)\r
}\r
}\r
}"
},
"interfaces/ICommonConfigs.sol": {
"content": "// SPDX-License-Identifier: BUSL-1.1\r
pragma solidity 0.8.12;\r
import "./IMultiSigCold.sol";\r
interface ICommonConfigs{\r
struct FeeInfo{\r
address feeTo;\r
uint16 feeRate;\r
}\r
function getFeeInfo(IMultiSigCold user)external view returns(uint,address);\r
\r
function setSupportEmergencyCalls(uint callType,address callAddr,bytes4 methodId,bytes memory signatures) external ;\r
function setFeeRate(uint16 _feeRate,IMultiSigCold user,bytes memory signatures) external ;\r
function setFreeFeeRate(IMultiSigCold user,bytes memory signatures) external ;\r
function checkEmergencyCall(bytes memory data,uint callType,address callAddr)external view;\r
}"
},
"interfaces/IMultiSigCold.sol": {
"content": "// SPDX-License-Identifier: BUSL-1.1\r
pragma solidity 0.8.12;\r
\r
import "./IMultiSigUtc.sol";\r
struct Merchant {\r
/// Set the storage balance ratio of each merchant's hot contract\r
uint256 hotCoinMaxRatio;\r
/// Fee payment ratio for each merchant\r
uint256 feeRate;\r
/// Each merchant balance funds limit time\r
uint256 balancedTime;\r
/// The minimum voting ratio for multiple signatures for each merchant is at least 50 and the maximum is 100\r
uint256 primAgentProfitPerc;\r
/// Hot contract storage pool address\r
address payable hotPool;\r
/// Cold contract storage pool address\r
address payable coldPool;\r
/// Agent’s multi-signature address\r
address multiSigAgentAddr;\r
}\r
\r
interface IMultiSigCold{\r
function initManagers(Merchant memory data,IMultiSigUtc _multiSigUtc,uint ratio,uint expirationTime,address[] memory _managers) external;\r
function initOwner() external;\r
event TransferCommissionLogs(address indexed token, uint256 indexed totalCommission,uint256 indexed primCommission,uint256 web3PayCommission,uint256 transBalHot);\r
}"
},
"interfaces/IMultiSigUtc.sol": {
"content": "// SPDX-License-Identifier: BUSL-1.1\r
pragma solidity 0.8.12;\r
\r
interface IMultiSigUtc{\r
function getManagerInfo()external view returns(uint managerNumber,uint expirationTime,address[] memory managers);\r
function getUtcFeeAddr() external view returns(address);\r
}\r
"
}
},
"settings": {
"optimizer": {
"enabled": true,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"remappings": []
}
}}
Submitted on: 2025-11-07 12:05:45
Comments
Log in to comment.
No comments yet.