import { cosmosclient, proto } from "@cosmos-client/core";
import { Balance, Fees, Network, TxHash } from "../client";
import { CosmosSDKClient, TxLog } from "../cosmos";
import { Address, Asset, BaseAmount } from "@dojima-wallet/utils";
import Long from "long";
import { MsgCreateOperator, MsgRegisterChain, MsgNativeTx, MsgSetIpAddressTx, MsgSetPubkeysTx, MsgSetVersionTx, MsgCreateEndpoint } from "./messages";
import { ChainId, ExplorerUrls, TxData } from "./types";
export declare const DOJ_DECIMAL = 8;
export declare const DEFAULT_GAS_ADJUSTMENT = 2;
export declare const DEFAULT_GAS_LIMIT_VALUE = "8000000";
export declare const DEPOSIT_GAS_LIMIT_VALUE = "600000000";
export declare const MAX_TX_COUNT = 100;
/**
 * Get denomination from Asset
 *
 * @param {Asset} asset
 * @returns {string} The denomination of the given asset.
 */
export declare const getDenom: (asset: Asset) => string;
/**
 * Get Asset from denomination
 *
 * @param {string} denom
 * @returns {Asset|null} The asset of the given denomination.
 */
export declare const assetFromDenom: (denom: string) => Asset | null;
/**
 * Response guard for transaction broadcast
 *
 * @param {any} response The response from the node.
 * @returns {boolean} `true` or `false`.
 */
export declare const isBroadcastSuccess: (response: unknown) => boolean;
/**
 * Get address prefix based on the network.
 *
 * @param {Network} network
 * @returns {string} The address prefix based on the network.
 *
 **/
export declare const getPrefix: (network: Network) => "dojima" | "sdojima" | "tdojima";
/**
 * Register type for encoding `MsgSetVersion` messages
 */
export declare const registerSetVersionCodecs: () => void;
/**
 * Register type for encoding `MsgSetNodeKeys` messages
 */
export declare const registerSetNodePubkeysCodecs: () => void;
/**
 * Register type for encoding `MsgCreateOperator` messages
 */
export declare const registerCreateOperatorCodecs: () => void;
/**
 * Register type for encoding `MsgRegisterChain` messages
 */
export declare const registerRegisterChainCodecs: () => void;
export declare const registerCreateEndpointCodecs: () => void;
/**
 * Register type for encoding `MsgDeposit` messages
 */
export declare const registerDepositCodecs: () => void;
/**
 * Register type for encoding `MsgSend` messages
 */
export declare const registerSendCodecs: () => void;
/**
 * Register type for encoding `MsgSetIpAddress` messages
 */
export declare const registerSetIpAddrCodecs: () => void;
/**
 * Parse transaction data from event logs
 *
 * @param {TxLog[]} logs List of tx logs
 * @param {Address} address - Address to get transaction data for
 * @returns {TxData} Parsed transaction data
 */
export declare const getDepositTxDataFromLogs: (logs: TxLog[], address: Address) => TxData;
/**
 * Get the default fee.
 *
 * @returns {Fees} The default fee.
 */
export declare const getDefaultFees: () => Fees;
/**
 * Get transaction type.
 *
 * @param {string} txData the transaction input data
 * @param {string} encoding `base64` or `hex`
 * @returns {string} the transaction type.
 */
export declare const getTxType: (txData: string, encoding: "base64" | "hex") => string;
/**
 * Helper to get HermesChain's chain id
 * @param {string} nodeUrl HermesNode url
 */
export declare const getChainId: (nodeUrl: string) => Promise<ChainId>;
/**
 * Builds final unsigned TX
 *
 * @param cosmosSdk - CosmosSDK
 * @param txBody - txBody with encoded Msgs
 * @param signerPubkey - signerPubkey string
 * @param sequence - account sequence
 * @param gasLimit - transaction gas limit
 * @returns
 */
export declare const buildUnsignedTx: ({ cosmosSdk, txBody, signerPubkey, sequence, gasLimit, }: {
    cosmosSdk: cosmosclient.CosmosSDK;
    txBody: proto.cosmos.tx.v1beta1.TxBody;
    signerPubkey: proto.google.protobuf.Any;
    sequence: Long;
    gasLimit?: Long;
}) => cosmosclient.TxBuilder;
/**
 * Estimates usage of gas
 *
 * Note: Be careful by using this helper function,
 * it's still experimental and result might be incorrect.
 * Change `multiplier` to get a valid estimation of gas.
 */
export declare const getEstimatedGas: ({ cosmosSDKClient, txBody, privKey, accountNumber, accountSequence, multiplier, }: {
    cosmosSDKClient: CosmosSDKClient;
    txBody: proto.cosmos.tx.v1beta1.TxBody;
    privKey: proto.cosmos.crypto.secp256k1.PrivKey;
    accountNumber: Long;
    accountSequence: Long;
    multiplier?: number;
}) => Promise<Long | undefined>;
export declare const buildRegisterChainTx: ({ msgRegisterChain, nodeUrl, chainId, }: {
    msgRegisterChain: MsgRegisterChain;
    nodeUrl: string;
    chainId: ChainId;
}) => Promise<proto.cosmos.tx.v1beta1.TxBody>;
export declare const buildCreateEndpointTx: ({ msgCreateEndpoint, nodeUrl, chainId, }: {
    msgCreateEndpoint: MsgCreateEndpoint;
    nodeUrl: string;
    chainId: ChainId;
}) => Promise<proto.cosmos.tx.v1beta1.TxBody>;
/**
 * Builds a create operator transaction
 * @param {MsgCreateOperator} msgCreateOperator
 * @param {string} nodeUrl
 * @param {ChainId} chainId
 */
export declare const buildCreateOperatorTx: ({ msgCreateOperator, nodeUrl, chainId, }: {
    msgCreateOperator: MsgCreateOperator;
    nodeUrl: string;
    chainId: ChainId;
}) => Promise<proto.cosmos.tx.v1beta1.TxBody>;
/**
 * Structure a MsgDeposit
 *
 * @param {MsgNativeTx} msgNativeTx Msg of type `MsgNativeTx`.
 * @param {string} nodeUrl Node url
 * @param {chainId} ChainId Chain id of the network
 *
 * @returns {Tx} The transaction details of the given transaction id.
 *
 * @throws {"Invalid client url"} Thrown if the client url is an invalid one.
 */
export declare const buildDepositTx: ({ msgNativeTx, nodeUrl, chainId, }: {
    msgNativeTx: MsgNativeTx;
    nodeUrl: string;
    chainId: ChainId;
}) => Promise<proto.cosmos.tx.v1beta1.TxBody>;
/**
 * Structure a MsgSetVersion
 *
 * @param {MsgSetVersionTx} msgSetVersionTx Msg of type `MsgSetVersionTx`.
 * @param {string} nodeUrl Node url
 * @param {chainId} ChainId Chain id of the network
 *
 * @returns {Tx} The transaction details of the given transaction id.
 *
 * @throws {"Invalid client url"} Thrown if the client url is an invalid one.
 */
export declare const buildSetVersionTx: ({ msgSetVersionTx, nodeUrl, chainId, }: {
    msgSetVersionTx: MsgSetVersionTx;
    nodeUrl: string;
    chainId: ChainId;
}) => Promise<proto.cosmos.tx.v1beta1.TxBody>;
/**
 * Structure a MsgSetNodeKeys
 *
 * @param {MsgSetPubkeysTx} msgSetPubkeysTx Msg of type `MsgSetPubkeysTx`.
 * @param {string} nodeUrl Node url
 * @param {chainId} ChainId Chain id of the network
 *
 * @returns {Tx} The transaction details of the given transaction id.
 *
 * @throws {"Invalid client url"} Thrown if the client url is an invalid one.
 */
export declare const buildSetPubkeysTx: ({ msgSetNodePubkeysTx, nodeUrl, chainId, }: {
    msgSetNodePubkeysTx: MsgSetPubkeysTx;
    nodeUrl: string;
    chainId: ChainId;
}) => Promise<proto.cosmos.tx.v1beta1.TxBody>;
/**
 * Structure a MsgSetIpAddress
 *
 * @param {MsgSetIpAddressTx} msgSetIpAddressTx Msg of type `MsgSetIpAddressTx`.
 * @param {string} nodeUrl Node url
 * @param {chainId} ChainId Chain id of the network
 *
 * @returns {Tx} The transaction details of the given transaction id.
 *
 * @throws {"Invalid client url"} Thrown if the client url is an invalid one.
 */
export declare const buildSetIpAddressTx: ({ msgSetIpAddressTx, nodeUrl, chainId, }: {
    msgSetIpAddressTx: MsgSetIpAddressTx;
    nodeUrl: string;
    chainId: ChainId;
}) => Promise<proto.cosmos.tx.v1beta1.TxBody>;
/**
 * Structure a MsgSend
 *
 * @param fromAddress - required, from address string
 * @param toAddress - required, to address string
 * @param assetAmount - required, asset amount string (e.g. "10000")
 * @param assetDenom - required, asset denom string (e.g. "doj")
 * @param memo - optional, memo string
 *
 * @returns
 */
export declare const buildTransferTx: ({ fromAddress, toAddress, assetAmount, assetDenom, memo, nodeUrl, chainId, }: {
    fromAddress: Address;
    toAddress: Address;
    assetAmount: BaseAmount;
    assetDenom: string;
    memo?: string;
    nodeUrl: string;
    chainId: ChainId;
}) => Promise<proto.cosmos.tx.v1beta1.TxBody>;
/**
 * Get the balance of a given address.
 *
 * @param {Address} address By default, it will return the balance of the current wallet. (optional)
 * @param {Asset} asset If not set, it will return all assets available. (optional)
 * @param {cosmosClient} CosmosSDKClient
 *
 * @returns {Balance[]} The balance of the address.
 */
export declare const getBalance: ({ address, assets, cosmosClient, }: {
    address: Address;
    assets?: Asset[];
    cosmosClient: CosmosSDKClient;
}) => Promise<Balance[]>;
/**
 * Get the explorer url.
 *
 * @param {Network} network
 * @param {ExplorerUrls} Explorer urls
 * @returns {string} The explorer url for hermeschain based on the given network.
 */
export declare const getExplorerUrl: ({ root }: ExplorerUrls, network: Network) => string;
/**
 * Get explorer address url.
 *
 * @param {ExplorerUrls} Explorer urls
 * @param {Network} network
 * @param {Address} address
 * @returns {string} The explorer url for the given address.
 */
export declare const getExplorerAddressUrl: ({ urls, network, address, }: {
    urls: ExplorerUrls;
    network: Network;
    address: Address;
}) => string;
/**
 * Get transaction url.
 *
 * @param {ExplorerUrls} Explorer urls
 * @param {Network} network
 * @param {TxHash} txID
 * @returns {string} The explorer url for the given transaction id.
 */
export declare const getExplorerTxUrl: ({ urls, network, txID, }: {
    urls: ExplorerUrls;
    network: Network;
    txID: TxHash;
}) => string;
export type ComputeUnits = {
    blockUnits: number;
    txnUnits: number;
};
