PaymentHelper

Git Source

Inherits: IPaymentHelper

Author: ZeroPoint Labs

helps estimating the cost for the entire transaction lifecycle

State Variables

superRegistry

is the address of the superRegistry on the chain

ISuperRegistry public immutable superRegistry;

CHAIN_ID

uint64 public immutable CHAIN_ID;

NATIVE

address constant NATIVE = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;

TIMELOCK_FORM_ID

uint32 public constant TIMELOCK_FORM_ID = 1;

nativeFeedOracle

xchain params

mapping(uint64 chainId => AggregatorV3Interface) public nativeFeedOracle;

gasPriceOracle

mapping(uint64 chainId => AggregatorV3Interface) public gasPriceOracle;

swapGasUsed

mapping(uint64 chainId => uint256 gasForSwap) public swapGasUsed;

updateGasUsed

mapping(uint64 chainId => uint256 gasForUpdate) public updateGasUsed;

depositGasUsed

mapping(uint64 chainId => uint256 gasForOps) public depositGasUsed;

withdrawGasUsed

mapping(uint64 chainId => uint256 gasForOps) public withdrawGasUsed;

nativePrice

mapping(uint64 chainId => uint256 defaultNativePrice) public nativePrice;

gasPrice

mapping(uint64 chainId => uint256 defaultGasPrice) public gasPrice;

gasPerKB

mapping(uint64 chainId => uint256 gasPerKB) public gasPerKB;

ackGasCost

mapping(uint64 chainId => uint256 gasForOps) public ackGasCost;

twoStepCost

mapping(uint64 chainId => uint256 gasForOps) public twoStepCost;

Functions

onlyProtocolAdmin

modifier onlyProtocolAdmin();

onlyEmergencyAdmin

modifier onlyEmergencyAdmin();

constructor

constructor(address superRegistry_);

addChain

admin config destination chain config for estimation

function addChain(uint64 chainId_, PaymentHelperConfig calldata config_) external override onlyProtocolAdmin;

Parameters

NameTypeDescription
chainId_uint64is the identifier of new chain id
config_PaymentHelperConfigis the chain config

updateChainConfig

admin update remote chain config for estimation

function updateChainConfig(
    uint64 chainId_,
    uint256 configType_,
    bytes memory config_
)
    external
    override
    onlyEmergencyAdmin;

Parameters

NameTypeDescription
chainId_uint64is the remote chain's identifier
configType_uint256is the type of config from 1 -> 6
config_bytesis the encoded new configuration

calculateAMBData

Type 1: DST TOKEN PRICE FEED ORACLE

Type 2: DST GAS PRICE ORACLE

Type 3: PAYLOAD UPDATE GAS COST PER TX FOR DEPOSIT

Type 4: DEPOSIT GAS COST PER TX

Type 5: WITHDRAW GAS COST PER TX

Type 6: DEFAULT NATIVE PRICE

Type 7: DEFAULT GAS PRICE

Type 8: GAS PRICE PER KB of Message

Type 9: ACK GAS COST

Type 10: TWO STEP PROCESSING COST

Type 11: SWAP GAS USED

function calculateAMBData(
    uint64 dstChainId_,
    uint8[] calldata ambIds_,
    bytes memory message_
)
    external
    view
    override
    returns (uint256 totalFees, bytes memory extraData);

Parameters

NameTypeDescription
dstChainId_uint64is the unique dst chain identifier
ambIds_uint8[]is the identifiers of arbitrary message bridges to be used
message_bytesis the encoded cross-chain payload

estimateMultiDstMultiVault

estimates the gas fees for multiple destination and multi vault operation

function estimateMultiDstMultiVault(
    MultiDstMultiVaultStateReq calldata req_,
    bool isDeposit_
)
    external
    view
    override
    returns (uint256 liqAmount, uint256 srcAmount, uint256 dstAmount, uint256 totalAmount);

Parameters

NameTypeDescription
req_MultiDstMultiVaultStateReqis the request object containing all necessary data for the actual operation on SuperRouter
isDeposit_bool

Returns

NameTypeDescription
liqAmountuint256is the amount of liquidity to be provided in native tokens
srcAmountuint256is the gas expense on source chain in native tokens
dstAmountuint256is the gas expense on dst chain in terms of src chain's native tokens
totalAmountuint256is the native_tokens to be sent along the transaction

estimateMultiDstSingleVault

optimistically estimating. (Ideal case scenario: no failed deposits / withdrawals)

step 1: estimate amb costs

step 2: estimate update cost (only for deposit)

step 3: estimation processing cost of acknowledgement

step 4: estimate liq amount

step 5: estimate dst swap cost if it exists

step 6: estimate execution costs in dst (withdraw / deposit) note: execution cost includes acknowledgement messaging cost

step 7: convert all dst gas estimates to src chain estimate (withdraw / deposit)

function estimateMultiDstSingleVault(
    MultiDstSingleVaultStateReq calldata req_,
    bool isDeposit_
)
    external
    view
    override
    returns (uint256 liqAmount, uint256 srcAmount, uint256 dstAmount, uint256 totalAmount);

Parameters

NameTypeDescription
req_MultiDstSingleVaultStateReqis the request object containing all necessary data for the actual operation on SuperRouter
isDeposit_bool

Returns

NameTypeDescription
liqAmountuint256is the amount of liquidity to be provided in native tokens
srcAmountuint256is the gas expense on source chain in native tokens
dstAmountuint256is the gas expense on dst chain in terms of src chain's native tokens
totalAmountuint256is the native_tokens to be sent along the transaction

estimateSingleXChainMultiVault

step 1: estimate amb costs

step 2: estimate update cost (only for deposit)

step 3: estimation execution cost of acknowledgement

step 4: estimate the liqAmount

step 5: estimate if swap costs are involved

step 5: estimate execution costs in dst note: execution cost includes acknowledgement messaging cost

step 6: convert all dst gas estimates to src chain estimate

function estimateSingleXChainMultiVault(
    SingleXChainMultiVaultStateReq calldata req_,
    bool isDeposit_
)
    external
    view
    override
    returns (uint256 liqAmount, uint256 srcAmount, uint256 dstAmount, uint256 totalAmount);

Parameters

NameTypeDescription
req_SingleXChainMultiVaultStateReqis the request object containing all necessary data for the actual operation on SuperRouter ///
isDeposit_bool

Returns

NameTypeDescription
liqAmountuint256is the amount of liquidity to be provided in native tokens
srcAmountuint256is the gas expense on source chain in native tokens
dstAmountuint256is the gas expense on dst chain in terms of src chain's native tokens
totalAmountuint256is the native_tokens to be sent along the transaction

estimateSingleXChainSingleVault

step 1: estimate amb costs

step 2: estimate update cost (only for deposit)

step 3: estimate execution costs in dst note: execution cost includes acknowledgement messaging cost

step 4: estimation execution cost of acknowledgement

step 5: estimate liq amount

step 6: estimate if swap costs are involved

step 7: convert all dst gas estimates to src chain estimate

function estimateSingleXChainSingleVault(
    SingleXChainSingleVaultStateReq calldata req_,
    bool isDeposit_
)
    external
    view
    override
    returns (uint256 liqAmount, uint256 srcAmount, uint256 dstAmount, uint256 totalAmount);

Parameters

NameTypeDescription
req_SingleXChainSingleVaultStateReqis the request object containing all necessary data for the actual operation on SuperRouter
isDeposit_bool

Returns

NameTypeDescription
liqAmountuint256is the amount of liquidity to be provided in native tokens
srcAmountuint256is the gas expense on source chain in native tokens
dstAmountuint256is the gas expense on dst chain in terms of src chain's native tokens
totalAmountuint256is the native_tokens to be sent along the transaction

estimateSingleDirectSingleVault

step 1: estimate amb costs

step 2: estimate update cost (only for deposit)

step 3: estimate execution costs in dst note: execution cost includes acknowledgement messaging cost

step 4: estimation execution cost of acknowledgement

step 5: estimate the liq amount

step 6: estimate if swap costs are involved

step 7: convert all dst gas estimates to src chain estimate

function estimateSingleDirectSingleVault(
    SingleDirectSingleVaultStateReq calldata req_,
    bool isDeposit_
)
    external
    view
    override
    returns (uint256 liqAmount, uint256 srcAmount, uint256 dstAmount, uint256 totalAmount);

Parameters

NameTypeDescription
req_SingleDirectSingleVaultStateReqis the request object containing all necessary data for the actual operation on SuperRouter
isDeposit_bool

Returns

NameTypeDescription
liqAmountuint256is the amount of liquidity to be provided in native tokens
srcAmountuint256is the gas expense on source chain in native tokens
dstAmountuint256is the gas expense on dst chain in terms of src chain's native tokens
totalAmountuint256is the native_tokens to be sent along the transaction

estimateSingleDirectMultiVault

only if timelock form withdrawal is involved

not adding dstAmount to save some GAS

function estimateSingleDirectMultiVault(
    SingleDirectMultiVaultStateReq calldata req_,
    bool isDeposit_
)
    external
    view
    override
    returns (uint256 liqAmount, uint256 srcAmount, uint256 dstAmount, uint256 totalAmount);

Parameters

NameTypeDescription
req_SingleDirectMultiVaultStateReqis the request object containing all necessary data for the actual operation on SuperRouter
isDeposit_bool

Returns

NameTypeDescription
liqAmountuint256is the amount of liquidity to be provided in native tokens
srcAmountuint256is the gas expense on source chain in native tokens
dstAmountuint256is the gas expense on dst chain in terms of src chain's native tokens
totalAmountuint256is the native_tokens to be sent along the transaction

estimateAMBFees

only if timelock form withdrawal is involved

not adding dstAmount to save some GAS

function estimateAMBFees(
    uint8[] memory ambIds_,
    uint64 dstChainId_,
    bytes memory message_,
    bytes[] memory extraData_
)
    public
    view
    returns (uint256 totalFees, uint256[] memory);

Parameters

NameTypeDescription
ambIds_uint8[]is the identifier of different AMBs
dstChainId_uint64is the identifier of the destination chain
message_bytesis the cross-chain message
extraData_bytes[]is any amb-specific information

Returns

NameTypeDescription
totalFeesuint256ambFees is the native_tokens to be sent along the transaction for all the ambIds_ included
<none>uint256[]

_generateExtraData

just checks the estimate for sending message from src -> dst

helps generate extra data per amb

function _generateExtraData(
    uint64 dstChainId_,
    uint8[] calldata ambIds_,
    bytes memory message_
)
    public
    view
    returns (bytes[] memory extraDataPerAMB);

_estimateAMBFees

helps estimate the cross-chain message costs

function _estimateAMBFees(
    uint8[] calldata ambIds_,
    uint64 dstChainId_,
    bytes memory message_
)
    public
    view
    returns (uint256[] memory feeSplitUp, uint256 totalFees);

_estimateAMBFeesReturnExtraData

just checks the estimate for sending message from src -> dst

only ambIds_[0] = primary amb (rest of the ambs send only the proof)

helps estimate the cross-chain message costs

function _estimateAMBFeesReturnExtraData(
    uint64 dstChainId_,
    uint8[] calldata ambIds_,
    bytes memory message_
)
    public
    view
    returns (uint256[] memory feeSplitUp, bytes[] memory extraDataPerAMB, uint256 totalFees);

_estimateLiqAmount

just checks the estimate for sending message from src -> dst

helps estimate the liq amount involved in the tx

function _estimateLiqAmount(LiqRequest[] memory req_) internal view returns (uint256 liqAmount);

_estimateSwapFees

helps estimate the dst chain swap gas limit (if multi-tx is involved)

function _estimateSwapFees(uint64 dstChainId_, LiqRequest[] memory liqReq_) internal view returns (uint256 gasUsed);

_estimateUpdateCost

checks if tx_data receiver is dstSwapProcessor

helps estimate the dst chain update payload gas limit

function _estimateUpdateCost(uint64 dstChainId_, uint256 vaultsCount_) internal view returns (uint256 gasUsed);

_estimateDstExecutionCost

helps estimate the dst chain processing gas limit

function _estimateDstExecutionCost(
    bool isDeposit_,
    uint64 dstChainId_,
    uint256 vaultsCount_
)
    internal
    view
    returns (uint256 gasUsed);

_estimateAckProcessingCost

helps estimate the src chain processing fee

function _estimateAckProcessingCost(
    uint256 dstChainCount_,
    uint256 vaultsCount_
)
    internal
    view
    returns (uint256 nativeFee);

_generateSingleVaultMessage

generates the amb message for single vault data

function _generateSingleVaultMessage(SingleVaultSFData memory sfData_) internal view returns (bytes memory message_);

_generateMultiVaultMessage

sample router id for estimation

generates the amb message for multi vault data

function _generateMultiVaultMessage(MultiVaultSFData memory sfData_) internal view returns (bytes memory message_);

_convertToNativeFee

sample router id for estimation

helps convert the dst gas fee into src chain native fee

https://docs.soliditylang.org/en/v0.8.4/units-and-global-variables.html#ether-units

all native tokens should be 18 decimals across all EVMs

function _convertToNativeFee(uint64 dstChainId_, uint256 dstGas_) internal view returns (uint256 nativeFee);

_getNextPayloadId

gas fee * gas price (to get the gas amounts in dst chain's native token)

gas price is 9 decimal (in gwei)

assumption: all evm native tokens are 18 decimals

converts the gas to pay in terms of native token to usd value

native token price is 8 decimal

converts the usd value to source chain's native token

native token price is 8 decimal which cancels the 8 decimal multiplied in previous step

helps generate the new payload id

next payload id = current payload id + 1

function _getNextPayloadId() internal view returns (uint256 nextPayloadId);

_getGasPrice

helps return the current gas price of different networks

function _getGasPrice(uint64 chainId_) internal view returns (uint256);

Returns

NameTypeDescription
<none>uint256native token price

_getNativeTokenPrice

helps return the dst chain token price of different networks

function _getNativeTokenPrice(uint64 chainId_) internal view returns (uint256);

Returns

NameTypeDescription
<none>uint256native token price