CommonConfigs

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": []
  }
}}

Tags:
Factory|addr:0x3e428648c8549ec5a50b12156f42bb08182545d5|verified:true|block:23744323|tx:0x3e941ceb5ef3e33600a8401370d64c4b3fe896f221b95923968c445f3153c0ae|first_check:1762513544

Submitted on: 2025-11-07 12:05:45

Comments

Log in to comment.

No comments yet.