ETH Price: $2,199.73 (+2.42%)

Contract

0x2aB37662AC4DC8AADA595256Cd57221c0C38C838
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To

There are no matching entries

Please try again later

Advanced mode:
Parent Transaction Hash Block
From
To
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
FeeHelper

Compiler Version
v0.8.26+commit.8a97fa7a

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 1 : FeeHelper.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.26;

interface ICrossConfig {
    function getCrossChainAgentFee(
        string calldata symbol, uint256 srcChainID, uint256 destChainID
    ) external view returns (uint256 numerator, uint256 denominator, uint256 fixedFee, uint256 minFeeLimit, uint256 maxFeeLimit);
}

interface IBridge {
    struct GetFeesParam {
        uint256 srcChainID;
        uint256 destChainID;
    }

    struct GetFeesReturn {
        uint256 contractFee;
        uint256 agentFee;
    }

    function getFee(
        GetFeesParam calldata param
    ) external view returns (GetFeesReturn memory fee);

    function getTokenPairFee(uint256 tokenPairID) external view returns(uint256 contractFee);
}

interface ITokenManager {
    function getAncestorInfo(uint id) external view returns (bytes memory account, string memory name, string memory symbol, uint8 decimals, uint chainId);
}

interface IDecimals {
    function decimals() external view returns (uint8);
}

interface IDiscount {
    function discount(address user) external view returns (uint256 discountE18);
}

contract FeeHelper {
    struct ServiceFeeInput {
        uint256 fromChainId;
        uint256 toChainId;
        uint256 tokenPairId;
        uint256 decimals;
        uint256 toAmount;
        bytes toAddress;
    }

    address public bridge;
    address public crossConfig;
    address public tokenManager;
    address public discountSC;

    constructor(address _bridge, address _crossConfig, address _tokenManager, address _discountSC) {
        bridge = _bridge;
        crossConfig = _crossConfig;
        tokenManager = _tokenManager;
        discountSC = _discountSC;
    }

    function getNetworkFee(uint fromChainId, uint toChainId, uint tokenPairId) public view returns (uint256) {
        IBridge.GetFeesParam memory param = IBridge.GetFeesParam(fromChainId, toChainId);
        IBridge.GetFeesReturn memory fee = IBridge(bridge).getFee(param);
        uint tokenPairFee = IBridge(bridge).getTokenPairFee(tokenPairId);
        return tokenPairFee > 0 ? tokenPairFee : fee.contractFee;
    }

    function getServiceFee(ServiceFeeInput memory params) public view returns (uint256 serviceFee) {
        if (crossConfig == address(0)) {
            return 0;
        }

        (,,string memory symbol,,) = ITokenManager(tokenManager).getAncestorInfo(params.tokenPairId);

        {
            (uint256 numerator, uint256 denominator, uint256 fixedFee, uint256 minFeeLimit, uint256 maxFeeLimit) = ICrossConfig(crossConfig).getCrossChainAgentFee(symbol, params.fromChainId, params.toChainId);
            serviceFee = calculateFee(numerator, denominator, fixedFee, minFeeLimit, maxFeeLimit, params.toAmount, params.decimals);
        }
        
        serviceFee = discount(bytesToAddress(params.toAddress), serviceFee);
    }

    function calculateFee(
        uint256 numerator,
        uint256 denominator,
        uint256 fixedFee,
        uint256 minFeeLimit,
        uint256 maxFeeLimit,
        uint256 amount,
        uint256 decimals
    ) public pure returns (uint256) {
        // Convert amount to 1e18 unit
        uint256 amountIn18 = amount * 1e18 / (10 ** decimals);
        // Calculate the dynamic fee
        uint256 dynamicFee = (amountIn18 * numerator) / denominator;

        uint256 totalFeeIn18 = dynamicFee;
        if (totalFeeIn18 == 0 && fixedFee > 0) {
            totalFeeIn18 = fixedFee;
        } else {
            // Ensure the total fee is within the limits
            if (totalFeeIn18 < minFeeLimit) {
                totalFeeIn18 = minFeeLimit;
            } else if (totalFeeIn18 > maxFeeLimit) {
                totalFeeIn18 = maxFeeLimit;
            }
        }

        // Convert total fee back to original decimals
        uint256 totalFee = totalFeeIn18 * (10 ** decimals) / 1e18;
        return totalFee;
    }

    function discount(address user, uint256 amount) internal view returns (uint256 amountAfterDiscount) {
        if (discountSC == address(0)) {
            return amount;
        }
        uint _discount = IDiscount(discountSC).discount(user);
        return amount * _discount / 1 ether;
    }

    function bytesToAddress(bytes memory b) public pure returns (address) {
        require(b.length >= 20, "Invalid address length");

        address addr;
        assembly {
            addr := mload(add(b, 20))
        }
        return addr;
    }

}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "remappings": []
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"_bridge","type":"address"},{"internalType":"address","name":"_crossConfig","type":"address"},{"internalType":"address","name":"_tokenManager","type":"address"},{"internalType":"address","name":"_discountSC","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"bridge","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"b","type":"bytes"}],"name":"bytesToAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"numerator","type":"uint256"},{"internalType":"uint256","name":"denominator","type":"uint256"},{"internalType":"uint256","name":"fixedFee","type":"uint256"},{"internalType":"uint256","name":"minFeeLimit","type":"uint256"},{"internalType":"uint256","name":"maxFeeLimit","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"decimals","type":"uint256"}],"name":"calculateFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"crossConfig","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"discountSC","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"fromChainId","type":"uint256"},{"internalType":"uint256","name":"toChainId","type":"uint256"},{"internalType":"uint256","name":"tokenPairId","type":"uint256"}],"name":"getNetworkFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"fromChainId","type":"uint256"},{"internalType":"uint256","name":"toChainId","type":"uint256"},{"internalType":"uint256","name":"tokenPairId","type":"uint256"},{"internalType":"uint256","name":"decimals","type":"uint256"},{"internalType":"uint256","name":"toAmount","type":"uint256"},{"internalType":"bytes","name":"toAddress","type":"bytes"}],"internalType":"struct FeeHelper.ServiceFeeInput","name":"params","type":"tuple"}],"name":"getServiceFee","outputs":[{"internalType":"uint256","name":"serviceFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

608060405234801561000f575f80fd5b50604051610c07380380610c0783398101604081905261002e9161009b565b5f80546001600160a01b039586166001600160a01b03199182161790915560018054948616948216949094179093556002805492851692841692909217909155600380549190931691161790556100ec565b80516001600160a01b0381168114610096575f80fd5b919050565b5f805f80608085870312156100ae575f80fd5b6100b785610080565b93506100c560208601610080565b92506100d360408601610080565b91506100e160608601610080565b905092959194509250565b610b0e806100f95f395ff3fe608060405234801561000f575f80fd5b5060043610610085575f3560e01c8063ab045bab11610058578063ab045bab14610100578063ab49b1c814610113578063d791376c14610126578063e78cea9214610139575f80fd5b80632752f2f7146100895780632a709b14146100af57806342526e4e146100da5780635d95ecaf146100ed575b5f80fd5b61009c610097366004610655565b61014b565b6040519081526020015b60405180910390f35b6002546100c2906001600160a01b031681565b6040516001600160a01b0390911681526020016100a6565b6100c26100e83660046106f3565b6102a5565b61009c6100fb366004610725565b6102fd565b6003546100c2906001600160a01b031681565b61009c61012136600461076c565b6103ad565b6001546100c2906001600160a01b031681565b5f546100c2906001600160a01b031681565b6001545f906001600160a01b031661016457505f919050565b6002546040838101519051639027e6f760e01b815260048101919091525f916001600160a01b031690639027e6f7906024015f60405180830381865afa1580156101b0573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526101d791908101906107fe565b505060015486516020880151604051639a1aca0f60e01b81529396505f95508594508493849384936001600160a01b0390911692639a1aca0f92610221928b9290916004016108bb565b60a060405180830381865afa15801561023c573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061026091906108fe565b9450945094509450945061028185858585858d608001518e606001516102fd565b9650505050505061029e6102988460a001516102a5565b836104c0565b9392505050565b5f6014825110156102f55760405162461bcd60e51b8152602060048201526016602482015275092dcecc2d8d2c840c2c8c8e4cae6e640d8cadccee8d60531b604482015260640160405180910390fd5b506014015190565b5f8061030a83600a610a31565b61031c85670de0b6b3a7640000610a3c565b6103269190610a53565b90505f886103348b84610a3c565b61033e9190610a53565b9050808015801561034e57505f89115b1561035a575087610374565b87811015610369575086610374565b868111156103745750855b5f670de0b6b3a764000061038987600a610a31565b6103939084610a3c565b61039d9190610a53565b9c9b505050505050505050505050565b604080518082018252848152602081018481525f80549351630ec61b7960e01b815283516004820152915160248301529283916001600160a01b0390911690630ec61b79906044016040805180830381865afa15801561040f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104339190610a72565b5f805460405163392a62b960e01b81526004810188905292935090916001600160a01b039091169063392a62b990602401602060405180830381865afa15801561047f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104a39190610ac1565b90505f81116104b35781516104b5565b805b979650505050505050565b6003545f906001600160a01b03166104d9575080610568565b60035460405163019c0d1360e71b81526001600160a01b0385811660048301525f92169063ce06898090602401602060405180830381865afa158015610521573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105459190610ac1565b9050670de0b6b3a764000061055a8285610a3c565b6105649190610a53565b9150505b92915050565b634e487b7160e01b5f52604160045260245ffd5b60405160c0810167ffffffffffffffff811182821017156105a5576105a561056e565b60405290565b604051601f8201601f1916810167ffffffffffffffff811182821017156105d4576105d461056e565b604052919050565b5f67ffffffffffffffff8211156105f5576105f561056e565b50601f01601f191660200190565b5f82601f830112610612575f80fd5b8135610625610620826105dc565b6105ab565b818152846020838601011115610639575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60208284031215610665575f80fd5b813567ffffffffffffffff81111561067b575f80fd5b820160c0818503121561068c575f80fd5b610694610582565b813581526020808301359082015260408083013590820152606080830135908201526080808301359082015260a082013567ffffffffffffffff8111156106d9575f80fd5b6106e586828501610603565b60a083015250949350505050565b5f60208284031215610703575f80fd5b813567ffffffffffffffff811115610719575f80fd5b61056484828501610603565b5f805f805f805f60e0888a03121561073b575f80fd5b505085359760208701359750604087013596606081013596506080810135955060a0810135945060c0013592509050565b5f805f6060848603121561077e575f80fd5b505081359360208301359350604090920135919050565b5f6107a2610620846105dc565b90508281528383830111156107b5575f80fd5b8282602083015e5f602084830101529392505050565b5f82601f8301126107da575f80fd5b61029e83835160208501610795565b805160ff811681146107f9575f80fd5b919050565b5f805f805f60a08688031215610812575f80fd5b855167ffffffffffffffff811115610828575f80fd5b8601601f81018813610838575f80fd5b61084788825160208401610795565b955050602086015167ffffffffffffffff811115610863575f80fd5b61086f888289016107cb565b945050604086015167ffffffffffffffff81111561088b575f80fd5b610897888289016107cb565b9350506108a6606087016107e9565b60809690960151949793965091949392915050565b606081525f84518060608401528060208701608085015e5f608082850101526080601f19601f830116840101915050836020830152826040830152949350505050565b5f805f805f60a08688031215610912575f80fd5b5050835160208501516040860151606087015160809097015192989197509594509092509050565b634e487b7160e01b5f52601160045260245ffd5b6001815b60018411156109895780850481111561096d5761096d61093a565b600184161561097b57908102905b60019390931c928002610952565b935093915050565b5f8261099f57506001610568565b816109ab57505f610568565b81600181146109c157600281146109cb576109e7565b6001915050610568565b60ff8411156109dc576109dc61093a565b50506001821b610568565b5060208310610133831016604e8410600b8410161715610a0a575081810a610568565b610a165f19848461094e565b805f1904821115610a2957610a2961093a565b029392505050565b5f61029e8383610991565b80820281158282048414176105685761056861093a565b5f82610a6d57634e487b7160e01b5f52601260045260245ffd5b500490565b5f6040828403128015610a83575f80fd5b506040805190810167ffffffffffffffff81118282101715610aa757610aa761056e565b604052825181526020928301519281019290925250919050565b5f60208284031215610ad1575f80fd5b505191905056fea26469706673582212207bf3027db002b305c0d7c9b86dad206cddc60eda41163234b5033882fdc0ed8f64736f6c634300081a0033000000000000000000000000fceaaaeb8d564a9d0e71ef36f027b9d162bc334e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561000f575f80fd5b5060043610610085575f3560e01c8063ab045bab11610058578063ab045bab14610100578063ab49b1c814610113578063d791376c14610126578063e78cea9214610139575f80fd5b80632752f2f7146100895780632a709b14146100af57806342526e4e146100da5780635d95ecaf146100ed575b5f80fd5b61009c610097366004610655565b61014b565b6040519081526020015b60405180910390f35b6002546100c2906001600160a01b031681565b6040516001600160a01b0390911681526020016100a6565b6100c26100e83660046106f3565b6102a5565b61009c6100fb366004610725565b6102fd565b6003546100c2906001600160a01b031681565b61009c61012136600461076c565b6103ad565b6001546100c2906001600160a01b031681565b5f546100c2906001600160a01b031681565b6001545f906001600160a01b031661016457505f919050565b6002546040838101519051639027e6f760e01b815260048101919091525f916001600160a01b031690639027e6f7906024015f60405180830381865afa1580156101b0573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526101d791908101906107fe565b505060015486516020880151604051639a1aca0f60e01b81529396505f95508594508493849384936001600160a01b0390911692639a1aca0f92610221928b9290916004016108bb565b60a060405180830381865afa15801561023c573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061026091906108fe565b9450945094509450945061028185858585858d608001518e606001516102fd565b9650505050505061029e6102988460a001516102a5565b836104c0565b9392505050565b5f6014825110156102f55760405162461bcd60e51b8152602060048201526016602482015275092dcecc2d8d2c840c2c8c8e4cae6e640d8cadccee8d60531b604482015260640160405180910390fd5b506014015190565b5f8061030a83600a610a31565b61031c85670de0b6b3a7640000610a3c565b6103269190610a53565b90505f886103348b84610a3c565b61033e9190610a53565b9050808015801561034e57505f89115b1561035a575087610374565b87811015610369575086610374565b868111156103745750855b5f670de0b6b3a764000061038987600a610a31565b6103939084610a3c565b61039d9190610a53565b9c9b505050505050505050505050565b604080518082018252848152602081018481525f80549351630ec61b7960e01b815283516004820152915160248301529283916001600160a01b0390911690630ec61b79906044016040805180830381865afa15801561040f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104339190610a72565b5f805460405163392a62b960e01b81526004810188905292935090916001600160a01b039091169063392a62b990602401602060405180830381865afa15801561047f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104a39190610ac1565b90505f81116104b35781516104b5565b805b979650505050505050565b6003545f906001600160a01b03166104d9575080610568565b60035460405163019c0d1360e71b81526001600160a01b0385811660048301525f92169063ce06898090602401602060405180830381865afa158015610521573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105459190610ac1565b9050670de0b6b3a764000061055a8285610a3c565b6105649190610a53565b9150505b92915050565b634e487b7160e01b5f52604160045260245ffd5b60405160c0810167ffffffffffffffff811182821017156105a5576105a561056e565b60405290565b604051601f8201601f1916810167ffffffffffffffff811182821017156105d4576105d461056e565b604052919050565b5f67ffffffffffffffff8211156105f5576105f561056e565b50601f01601f191660200190565b5f82601f830112610612575f80fd5b8135610625610620826105dc565b6105ab565b818152846020838601011115610639575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60208284031215610665575f80fd5b813567ffffffffffffffff81111561067b575f80fd5b820160c0818503121561068c575f80fd5b610694610582565b813581526020808301359082015260408083013590820152606080830135908201526080808301359082015260a082013567ffffffffffffffff8111156106d9575f80fd5b6106e586828501610603565b60a083015250949350505050565b5f60208284031215610703575f80fd5b813567ffffffffffffffff811115610719575f80fd5b61056484828501610603565b5f805f805f805f60e0888a03121561073b575f80fd5b505085359760208701359750604087013596606081013596506080810135955060a0810135945060c0013592509050565b5f805f6060848603121561077e575f80fd5b505081359360208301359350604090920135919050565b5f6107a2610620846105dc565b90508281528383830111156107b5575f80fd5b8282602083015e5f602084830101529392505050565b5f82601f8301126107da575f80fd5b61029e83835160208501610795565b805160ff811681146107f9575f80fd5b919050565b5f805f805f60a08688031215610812575f80fd5b855167ffffffffffffffff811115610828575f80fd5b8601601f81018813610838575f80fd5b61084788825160208401610795565b955050602086015167ffffffffffffffff811115610863575f80fd5b61086f888289016107cb565b945050604086015167ffffffffffffffff81111561088b575f80fd5b610897888289016107cb565b9350506108a6606087016107e9565b60809690960151949793965091949392915050565b606081525f84518060608401528060208701608085015e5f608082850101526080601f19601f830116840101915050836020830152826040830152949350505050565b5f805f805f60a08688031215610912575f80fd5b5050835160208501516040860151606087015160809097015192989197509594509092509050565b634e487b7160e01b5f52601160045260245ffd5b6001815b60018411156109895780850481111561096d5761096d61093a565b600184161561097b57908102905b60019390931c928002610952565b935093915050565b5f8261099f57506001610568565b816109ab57505f610568565b81600181146109c157600281146109cb576109e7565b6001915050610568565b60ff8411156109dc576109dc61093a565b50506001821b610568565b5060208310610133831016604e8410600b8410161715610a0a575081810a610568565b610a165f19848461094e565b805f1904821115610a2957610a2961093a565b029392505050565b5f61029e8383610991565b80820281158282048414176105685761056861093a565b5f82610a6d57634e487b7160e01b5f52601260045260245ffd5b500490565b5f6040828403128015610a83575f80fd5b506040805190810167ffffffffffffffff81118282101715610aa757610aa761056e565b604052825181526020928301519281019290925250919050565b5f60208284031215610ad1575f80fd5b505191905056fea26469706673582212207bf3027db002b305c0d7c9b86dad206cddc60eda41163234b5033882fdc0ed8f64736f6c634300081a0033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000fceaaaeb8d564a9d0e71ef36f027b9d162bc334e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _bridge (address): 0xfCeAAaEB8D564a9D0e71Ef36f027b9D162bC334e
Arg [1] : _crossConfig (address): 0x0000000000000000000000000000000000000000
Arg [2] : _tokenManager (address): 0x0000000000000000000000000000000000000000
Arg [3] : _discountSC (address): 0x0000000000000000000000000000000000000000

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000fceaaaeb8d564a9d0e71ef36f027b9d162bc334e
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000000


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.