Contract 0x89d56979795c4b82828d893ac3ffe9711114a6f9 2

 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0xa06ad1b7fa2b211608875ef651bc528389bf44853f18895e8289d8facba38ff50xe8b26c2b108274532021-09-11 18:07:456 days 8 hrs ago0xc0847f6a6ff51abbf3e145812e4eb819a80fa944 IN  0x89d56979795c4b82828d893ac3ffe9711114a6f90 BNB0.002512875
0xeac99f9cfa1ee1edb60a301cd7f333ccdc42997dd715f19a197278cafa9bcd730xe8b26c2b99733732021-08-12 19:33:0936 days 6 hrs ago0xb0509656456a9ae80a97936c7cf2576e9b96a885 IN  0x89d56979795c4b82828d893ac3ffe9711114a6f90 BNB0.002311392
0xae44effa465b240b7581bca100cf94fb49290746d0e0cbeab5e4b165d96e423c0xe8b26c2b99733082021-08-12 19:29:5436 days 6 hrs ago0xb0509656456a9ae80a97936c7cf2576e9b96a885 IN  0x89d56979795c4b82828d893ac3ffe9711114a6f90 BNB0.000887075
0xb6157f78d0f333202788df9ca8bff3cc04cd1518d8331bc0d279a2f9970677970xe8b26c2b99726002021-08-12 18:54:0236 days 7 hrs ago0xb0509656456a9ae80a97936c7cf2576e9b96a885 IN  0x89d56979795c4b82828d893ac3ffe9711114a6f90 BNB0.002111975
0xdc45eebb988c5e69ca24fad98e727d086f7379018af6722e55047edfde7e1cca0xe8b26c2b99488632021-08-11 22:44:4137 days 3 hrs ago0xb0509656456a9ae80a97936c7cf2576e9b96a885 IN  0x89d56979795c4b82828d893ac3ffe9711114a6f90 BNB0.001283055
0x885f46b99346f6f9155793aa068323ed67905de193a6d7b626df0bdcd9564c750xe8b26c2b99432542021-08-11 17:19:5837 days 9 hrs ago0x27b66a40320b03a8aecba40f501ef4453e640faf IN  0x89d56979795c4b82828d893ac3ffe9711114a6f90 BNB0.00088568
0x9035dff466b61037caeef9cd1145089a5957cd0e9ed0736a983e38f7b9db63420xe8b26c2b99396312021-08-11 14:13:1537 days 12 hrs ago0xabf8dfb5c1626f74cbf57e443ac9ea18b7f759d8 IN  0x89d56979795c4b82828d893ac3ffe9711114a6f90.000007 BNB0.00241258
0xcfa4e9dffa8b4bd170195446eb1cf6ccfe68dd888a74a6730fee8650a90e630a0xe8b26c2b99394852021-08-11 14:04:3037 days 12 hrs ago0xabf8dfb5c1626f74cbf57e443ac9ea18b7f759d8 IN  0x89d56979795c4b82828d893ac3ffe9711114a6f90.00002 BNB0.00172323
0xd7a79300713359b4da809a41249ef41b2b93e109ee12eaeb020bd75ac0de13c80xe8b26c2b99391082021-08-11 13:44:0937 days 12 hrs ago0x27b66a40320b03a8aecba40f501ef4453e640faf IN  0x89d56979795c4b82828d893ac3ffe9711114a6f90.00002 BNB0.002705915
0x5c64d7d9121ff0e1cc1c00ad454d1b0e2af2fe7ca38d0330ce7aa115dc274b540xe8b26c2b99375012021-08-11 12:22:5737 days 14 hrs ago0x834a53f9481289180d7653feca8706647707afbe IN  0x89d56979795c4b82828d893ac3ffe9711114a6f90 BNB0.001576445
0x9fc5b59bc7bfbc1bb3668bd16718af3d8e2f1f27094f4b7473d0113c7412dd9f0xe8b26c2b99364322021-08-11 11:29:2937 days 14 hrs ago0xc614a4c2fe9f999f85d1c316d6af556457db7dc4 IN  0x89d56979795c4b82828d893ac3ffe9711114a6f90 BNB0.000929845
0xe9c335a9ea95436066509c00b9768aa74406d05e033b77d5bc1ce34ed761061e0xe8b26c2b99355272021-08-11 10:44:1037 days 15 hrs ago0xff6def64b45d5fc600bfaf6b60d30d1771f1e458 IN  0x89d56979795c4b82828d893ac3ffe9711114a6f90 BNB0.0019869
0x50474b58ff3ab503bfa29762ad4d3f7d594081431cdd9d05eac0d97609f2b92f0xe8b26c2b99347992021-08-11 10:07:2437 days 16 hrs ago0x0023715104e790c1920439a444f777929eb7c556 IN  0x89d56979795c4b82828d893ac3ffe9711114a6f90 BNB0.002111915
0xba47155ea46f75a944595390a1c0a7cc2874dca16417359ef521cdca827e52a00xe8b26c2b99332152021-08-11 8:47:0337 days 17 hrs ago0xb982300bc9600eb38882f32541ab3dbb44664943 IN  0x89d56979795c4b82828d893ac3ffe9711114a6f90 BNB0.001961185
0x8dd61d55e6a68498267a1d1e4a3ae4e91c3aa4300e6f29306e675432f46e86b20xe8b26c2b99327102021-08-11 8:21:4737 days 18 hrs ago0x7d31d88b15b43f6b00f28c4effc73c7e347c5a7a IN  0x89d56979795c4b82828d893ac3ffe9711114a6f90 BNB0.003311765
0x2c9648fb41ba881d70799d02d884e7e5943208ed59ac4e3871ac5e4cc4be1d1f0xe8b26c2b99323922021-08-11 8:05:5337 days 18 hrs ago0x057bef0132507b3fec45f8303bbe295541ec640f IN  0x89d56979795c4b82828d893ac3ffe9711114a6f90 BNB0.00558044
0xa1e2e4906f1e0dd49d5e308efa9d1bd4845db5bf51162f794e181172622ff7150xe8b26c2b99323802021-08-11 8:05:1737 days 18 hrs ago0x10414a2ddbaafc6e3af68ea323aff145656074c2 IN  0x89d56979795c4b82828d893ac3ffe9711114a6f90 BNB0.00107649
0x143266fcb76f1b1c76d907b0a15396d7e723e34e5a3c3ac266adb9a01da27a6e0xe8b26c2b99323742021-08-11 8:04:5937 days 18 hrs ago0x057bef0132507b3fec45f8303bbe295541ec640f IN  0x89d56979795c4b82828d893ac3ffe9711114a6f90 BNB0.001881995
0x4d0c828b9a7dee63d32ba8c97085806d8f6de8ae13238698bc4ace12f40a24270xe8b26c2b99323092021-08-11 8:01:4437 days 18 hrs ago0x77b0881dfe72fa4d47cd6bc71e6f26a752af4352 IN  0x89d56979795c4b82828d893ac3ffe9711114a6f90 BNB0.00075848
0xcea8c1e531bd031ce16d243a5d74d3a17e58733ba3f98bd26bd82951bf24ba580xe8b26c2b99321492021-08-11 7:53:4337 days 18 hrs ago0x7d31d88b15b43f6b00f28c4effc73c7e347c5a7a IN  0x89d56979795c4b82828d893ac3ffe9711114a6f90 BNB0.00133809
0x2fba1f97c254d9b1a0a9cf3ecc36d3c1d3c9f340a2e3ee09128695b43e3fca130xe8b26c2b99321382021-08-11 7:53:1037 days 18 hrs ago0xe378b80090ce63a4277dc114c143900ecd7c117b IN  0x89d56979795c4b82828d893ac3ffe9711114a6f90 BNB0.001968355
0x04672e1ae139697015eb3107bb45b8a57b00177aeb3410459cd559b1cba7232f0xe8b26c2b99311892021-08-11 7:05:4337 days 19 hrs ago0x27b66a40320b03a8aecba40f501ef4453e640faf IN  0x89d56979795c4b82828d893ac3ffe9711114a6f90 BNB0.00175801
0x2e0be3c10f0b57781add97173f87b8c6e43be319dafeb4138c123251b4043b490xe8b26c2b99306802021-08-11 6:40:1637 days 19 hrs ago0xb982300bc9600eb38882f32541ab3dbb44664943 IN  0x89d56979795c4b82828d893ac3ffe9711114a6f90 BNB0.000837835
0x74e4bac9c51597a703206530ed3ea6c25b74691924b574922215e901ab57cf550xe8b26c2b99296402021-08-11 5:48:0637 days 20 hrs ago0x057bef0132507b3fec45f8303bbe295541ec640f IN  0x89d56979795c4b82828d893ac3ffe9711114a6f90 BNB0.00090639
0x1f70a47f1894ca697dd94e29c21801e5dce999bf42e2f06b26d5cfc26937a1be0xe8b26c2b99293222021-08-11 5:32:1137 days 20 hrs ago0xc614a4c2fe9f999f85d1c316d6af556457db7dc4 IN  0x89d56979795c4b82828d893ac3ffe9711114a6f90 BNB0.003305565
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xa06ad1b7fa2b211608875ef651bc528389bf44853f18895e8289d8facba38ff5108274532021-09-11 18:07:456 days 8 hrs ago 0x89d56979795c4b82828d893ac3ffe9711114a6f9 0x3a6d8ca21d1cf76f653a67577fa0d27453350dd80.203596011947655082 BNB
0xa06ad1b7fa2b211608875ef651bc528389bf44853f18895e8289d8facba38ff5108274532021-09-11 18:07:456 days 8 hrs ago 0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef 0x89d56979795c4b82828d893ac3ffe9711114a6f90.203596011947655082 BNB
0xb6157f78d0f333202788df9ca8bff3cc04cd1518d8331bc0d279a2f99706779799726002021-08-12 18:54:0236 days 7 hrs ago 0x89d56979795c4b82828d893ac3ffe9711114a6f9 0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef1.303526527227658259 BNB
0xb6157f78d0f333202788df9ca8bff3cc04cd1518d8331bc0d279a2f99706779799726002021-08-12 18:54:0236 days 7 hrs ago 0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef 0x89d56979795c4b82828d893ac3ffe9711114a6f91.303526527227658259 BNB
0x885f46b99346f6f9155793aa068323ed67905de193a6d7b626df0bdcd9564c7599432542021-08-11 17:19:5837 days 9 hrs ago 0x89d56979795c4b82828d893ac3ffe9711114a6f90x27b66a40320b03a8aecba40f501ef4453e640faf0.051640247609850096 BNB
0x885f46b99346f6f9155793aa068323ed67905de193a6d7b626df0bdcd9564c7599432542021-08-11 17:19:5837 days 9 hrs ago 0x89d56979795c4b82828d893ac3ffe9711114a6f9 0x72156230d64f2bd82e0c772e2db56c0c80b9e9620.000051691939549399 BNB
0x885f46b99346f6f9155793aa068323ed67905de193a6d7b626df0bdcd9564c7599432542021-08-11 17:19:5837 days 9 hrs ago PancakeSwap: Router v2 0x89d56979795c4b82828d893ac3ffe9711114a6f90.051691939549399495 BNB
0x9035dff466b61037caeef9cd1145089a5957cd0e9ed0736a983e38f7b9db634299396312021-08-11 14:13:1537 days 12 hrs ago 0x89d56979795c4b82828d893ac3ffe9711114a6f9 PancakeSwap: Router v20.000007 BNB
0xcfa4e9dffa8b4bd170195446eb1cf6ccfe68dd888a74a6730fee8650a90e630a99394852021-08-11 14:04:3037 days 12 hrs ago 0x89d56979795c4b82828d893ac3ffe9711114a6f9 PancakeSwap: Router v20.00002 BNB
0xd7a79300713359b4da809a41249ef41b2b93e109ee12eaeb020bd75ac0de13c899391082021-08-11 13:44:0937 days 12 hrs ago 0x89d56979795c4b82828d893ac3ffe9711114a6f9 PancakeSwap: Router v20.00002 BNB
0xe9c335a9ea95436066509c00b9768aa74406d05e033b77d5bc1ce34ed761061e99355272021-08-11 10:44:1037 days 15 hrs ago 0x89d56979795c4b82828d893ac3ffe9711114a6f9 0x3a6d8ca21d1cf76f653a67577fa0d27453350dd81.773928474593488658 BNB
0xe9c335a9ea95436066509c00b9768aa74406d05e033b77d5bc1ce34ed761061e99355272021-08-11 10:44:1037 days 15 hrs ago 0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef 0x89d56979795c4b82828d893ac3ffe9711114a6f91.773928474593488658 BNB
0x50474b58ff3ab503bfa29762ad4d3f7d594081431cdd9d05eac0d97609f2b92f99347992021-08-11 10:07:2437 days 16 hrs ago 0x89d56979795c4b82828d893ac3ffe9711114a6f9 0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef0.640911956685524284 BNB
0x50474b58ff3ab503bfa29762ad4d3f7d594081431cdd9d05eac0d97609f2b92f99347992021-08-11 10:07:2437 days 16 hrs ago 0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef 0x89d56979795c4b82828d893ac3ffe9711114a6f90.640911956685524284 BNB
0xba47155ea46f75a944595390a1c0a7cc2874dca16417359ef521cdca827e52a099332152021-08-11 8:47:0337 days 17 hrs ago 0x89d56979795c4b82828d893ac3ffe9711114a6f9 0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef2.896994753069200473 BNB
0xba47155ea46f75a944595390a1c0a7cc2874dca16417359ef521cdca827e52a099332152021-08-11 8:47:0337 days 17 hrs ago 0xc0788a3ad43d79aa53b09c2eacc313a787d1d607 0x89d56979795c4b82828d893ac3ffe9711114a6f92.607257832007251941 BNB
0xba47155ea46f75a944595390a1c0a7cc2874dca16417359ef521cdca827e52a099332152021-08-11 8:47:0337 days 17 hrs ago PantherSwap: Router 0x89d56979795c4b82828d893ac3ffe9711114a6f90.289736921061948532 BNB
0x8dd61d55e6a68498267a1d1e4a3ae4e91c3aa4300e6f29306e675432f46e86b299327102021-08-11 8:21:4737 days 18 hrs ago 0x89d56979795c4b82828d893ac3ffe9711114a6f9 Wault Finance: WS Router0.230828570702839297 BNB
0x8dd61d55e6a68498267a1d1e4a3ae4e91c3aa4300e6f29306e675432f46e86b299327102021-08-11 8:21:4737 days 18 hrs ago 0x89d56979795c4b82828d893ac3ffe9711114a6f9 Mdex: Router0.005918681300072802 BNB
0x8dd61d55e6a68498267a1d1e4a3ae4e91c3aa4300e6f29306e675432f46e86b299327102021-08-11 8:21:4737 days 18 hrs ago Mdex: Router 0x89d56979795c4b82828d893ac3ffe9711114a6f90.089030379522952099 BNB
0x8dd61d55e6a68498267a1d1e4a3ae4e91c3aa4300e6f29306e675432f46e86b299327102021-08-11 8:21:4737 days 18 hrs ago PantherSwap: Router 0x89d56979795c4b82828d893ac3ffe9711114a6f90.14771687247996 BNB
0x2fba1f97c254d9b1a0a9cf3ecc36d3c1d3c9f340a2e3ee09128695b43e3fca1399321382021-08-11 7:53:1037 days 18 hrs ago 0x89d56979795c4b82828d893ac3ffe9711114a6f90xe378b80090ce63a4277dc114c143900ecd7c117b0.515437138925829819 BNB
0x2fba1f97c254d9b1a0a9cf3ecc36d3c1d3c9f340a2e3ee09128695b43e3fca1399321382021-08-11 7:53:1037 days 18 hrs ago 0x89d56979795c4b82828d893ac3ffe9711114a6f9 0x72156230d64f2bd82e0c772e2db56c0c80b9e9620.000515953092017847 BNB
0x2fba1f97c254d9b1a0a9cf3ecc36d3c1d3c9f340a2e3ee09128695b43e3fca1399321382021-08-11 7:53:1037 days 18 hrs ago PancakeSwap: Router v2 0x89d56979795c4b82828d893ac3ffe9711114a6f90.515953092017847666 BNB
0x74e4bac9c51597a703206530ed3ea6c25b74691924b574922215e901ab57cf5599296402021-08-11 5:48:0637 days 20 hrs ago 0x89d56979795c4b82828d893ac3ffe9711114a6f90x057bef0132507b3fec45f8303bbe295541ec640f0.28302254846755827 BNB
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ArkenDex

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at BscScan.com on 2021-06-25
*/

// SPDX-License-Identifier: MIT
// Sources flattened with hardhat v2.3.0 https://hardhat.org

// File @openzeppelin/contracts/token/ERC20/[email protected]


pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}


// File @openzeppelin/contracts/token/ERC20/extensions/[email protected]


pragma solidity ^0.8.0;

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}


// File @openzeppelin/contracts/utils/[email protected]


pragma solidity ^0.8.0;

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}


// File @openzeppelin/contracts/token/ERC20/[email protected]


pragma solidity ^0.8.0;



/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin guidelines: functions revert instead
 * of returning `false` on failure. This behavior is nonetheless conventional
 * and does not conflict with the expectations of ERC20 applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping (address => uint256) private _balances;

    mapping (address => mapping (address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The defaut value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor (string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5,05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless this function is
     * overridden;
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * Requirements:
     *
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
        _approve(sender, _msgSender(), currentAllowance - amount);

        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        _approve(_msgSender(), spender, currentAllowance - subtractedValue);

        return true;
    }

    /**
     * @dev Moves tokens `amount` from `sender` to `recipient`.
     *
     * This is internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(address sender, address recipient, uint256 amount) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
        _balances[sender] = senderBalance - amount;
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        _balances[account] = accountBalance - amount;
        _totalSupply -= amount;

        emit Transfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(address owner, address spender, uint256 amount) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be to transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }
}


// File @openzeppelin/contracts/utils/math/[email protected]


pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}


// File contracts/interfaces/UniswapRouterV2.sol


pragma solidity ^0.8.0;

interface IUniswapV2Router {
    function getAmountsOut(uint256 amountIn, address[] calldata path)
        external
        view
        returns (uint256[] memory amounts);

    function swapExactTokensForTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactETHForTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function swapExactTokensForETH(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);
}


// File contracts/interfaces/BakeryRouterV2.sol


pragma solidity ^0.8.0;

interface IBakeryV2Router {
    function getAmountsOut(uint256 amountIn, address[] calldata path)
        external
        view
        returns (uint256[] memory amounts);

    function swapExactTokensForTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactBNBForTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function swapExactTokensForBNB(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);
}


// File contracts/interfaces/VyperSwap.sol


pragma solidity ^0.8.0;

interface IVyperSwap {
    function exchange(
        int128 tokenIndexFrom,
        int128 tokenIndexTo,
        uint256 dx,
        uint256 minDy
    ) external;
}


// File contracts/interfaces/VyperUnderlyingSwap.sol


pragma solidity ^0.8.0;

interface IVyperUnderlyingSwap {
    function exchange(
        int128 tokenIndexFrom,
        int128 tokenIndexTo,
        uint256 dx,
        uint256 minDy
    ) external;

    function exchange_underlying(
        int128 tokenIndexFrom,
        int128 tokenIndexTo,
        uint256 dx,
        uint256 minDy
    ) external;
}


// File contracts/interfaces/DoppleSwap.sol


pragma solidity ^0.8.0;

interface IDoppleSwap {
    function getTokenIndex(address tokenAddress) external view returns (uint8);

    function swap(
        uint8 tokenIndexFrom,
        uint8 tokenIndexTo,
        uint256 dx,
        uint256 minDy,
        uint256 deadline
    ) external returns (uint256);
}


// File contracts/ArkenDex.sol


pragma solidity ^0.8.0;
pragma experimental ABIEncoderV2;


// import 'hardhat/console.sol';





contract ArkenDex {
    using SafeMath for uint256;

    uint256 public constant DEADLINE = 2**256 - 1;
    IERC20 constant ETHER_ERC20 =
        IERC20(0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE);

    enum RouterInterface {
        UNISWAP,
        BAKERY,
        VYPER,
        VYPER_UNDERLYING,
        DOPPLE
    }

    struct Result {
        bool success;
        bytes returnData;
    }

    struct TradeRoute {
        address[] paths;
        address dexAddr;
        RouterInterface dexInterface;
        uint256 part;
    }

    struct MultiSwapDesctiption {
        IERC20 srcToken;
        IERC20 dstToken;
        TradeRoute[] routes;
        uint256 amountIn;
        uint256 amountOutMin;
        address payable to;
    }

    event Swapped(
        address srcToken,
        address dstToken,
        uint256 amountIn,
        uint256 returnAmount
    );

    event Received(address sender, uint256 amount);

    receive() external payable {
        emit Received(msg.sender, msg.value);
    }

    address public ownerAddress;
    address payable public feeWalletAddress;
    IERC20 wrapperEtherERC20;
    mapping(address => mapping(address => int128)) vyperCoinsMap;

    modifier onlyOwner {
        require(msg.sender == ownerAddress, 'Not owner');
        _;
    }

    struct VyperConstructor {
        address[] dexAddress;
        address[][] tokenAddress;
    }

    constructor(
        address payable _feeWalletAddress,
        address _owner,
        IERC20 _wrappedEther,
        VyperConstructor memory _vyperParams
    ) {
        ownerAddress = _owner;
        wrapperEtherERC20 = _wrappedEther;
        feeWalletAddress = _feeWalletAddress;
        _initializeVyper(_vyperParams);
    }

    function _initializeVyper(VyperConstructor memory params) private {
        address[] memory dexAddrs = params.dexAddress;
        address[][] memory tokenAddrs = params.tokenAddress;
        require(
            dexAddrs.length == tokenAddrs.length,
            'vyper params dexAddress and tokenAddress and tokenIndex has to be the same length'
        );
        for (uint32 i = 0; i < dexAddrs.length; i++) {
            for (int128 j = 0; uint128(j) < tokenAddrs[i].length; j++) {
                vyperCoinsMap[dexAddrs[i]][tokenAddrs[i][uint128(j)]] = j;
            }
        }
    }

    function _collectFee(uint256 amount, IERC20 token)
        private
        returns (
            uint256 // remaining amount to swap
        )
    {
        uint256 fee = amount.div(1000); // 0.1%
        // console.log('fee: %s from %s on %s', fee, amount, address(token));
        require(fee < amount, 'Fee exceeds amount');
        if (ETHER_ERC20 == token) {
            feeWalletAddress.transfer(fee);
        } else {
            token.transfer(feeWalletAddress, fee);
        }
        return amount.sub(fee);
    }

    function _tradeIUniswap(
        IERC20 _src,
        IERC20 _dest,
        uint256 inputAmount,
        uint256 minOutputAmount,
        address[] memory paths,
        address to,
        address dexAddr
    ) private returns (uint256[] memory amounts) {
        IUniswapV2Router uniRouter = IUniswapV2Router(dexAddr);
        if (_src == ETHER_ERC20) {
            // ETH => TOKEN
            if (paths[0] == address(ETHER_ERC20)) {
                paths[0] = address(wrapperEtherERC20);
            }
            amounts = uniRouter.swapExactETHForTokens{value: inputAmount}(
                minOutputAmount,
                paths,
                to,
                DEADLINE
            );
        } else if (_dest == ETHER_ERC20) {
            // TOKEN => ETH
            if (paths[paths.length - 1] == address(ETHER_ERC20)) {
                paths[paths.length - 1] = address(wrapperEtherERC20);
            }
            bool approveSuccess = _src.approve(dexAddr, inputAmount);
            require(approveSuccess, 'Approve token failed');
            amounts = uniRouter.swapExactTokensForETH(
                inputAmount,
                minOutputAmount,
                paths,
                to,
                DEADLINE
            );
        } else {
            // TOKEN => TOKEN
            bool approveSuccess = _src.approve(dexAddr, inputAmount);
            require(approveSuccess, 'Approve token failed');
            amounts = uniRouter.swapExactTokensForTokens(
                inputAmount,
                minOutputAmount,
                paths,
                to,
                DEADLINE
            );
        }
    }

    function _tradeIBakery(
        IERC20 _src,
        IERC20 _dest,
        uint256 inputAmount,
        uint256 minOutputAmount,
        address[] memory paths,
        address to,
        address dexAddr
    ) private returns (uint256[] memory amounts) {
        IBakeryV2Router bakeryRouter = IBakeryV2Router(dexAddr);
        if (_src == ETHER_ERC20) {
            // ETH => TOKEN
            if (paths[0] == address(ETHER_ERC20)) {
                paths[0] = address(wrapperEtherERC20);
            }
            amounts = bakeryRouter.swapExactBNBForTokens{value: inputAmount}(
                minOutputAmount,
                paths,
                to,
                DEADLINE
            );
        } else if (_dest == ETHER_ERC20) {
            // TOKEN => ETH
            if (paths[paths.length - 1] == address(ETHER_ERC20)) {
                paths[paths.length - 1] = address(wrapperEtherERC20);
            }
            bool approveSuccess = _src.approve(dexAddr, inputAmount);
            require(approveSuccess, 'Approve token failed');
            amounts = bakeryRouter.swapExactTokensForBNB(
                inputAmount,
                minOutputAmount,
                paths,
                to,
                DEADLINE
            );
        } else {
            // TOKEN => TOKEN
            bool approveSuccess = _src.approve(dexAddr, inputAmount);
            require(approveSuccess, 'Approve token failed');
            amounts = bakeryRouter.swapExactTokensForTokens(
                inputAmount,
                minOutputAmount,
                paths,
                to,
                DEADLINE
            );
        }
    }

    function _tradeVyper(
        IERC20 _src,
        IERC20 _dest,
        uint256 inputAmount,
        uint256 minOutputAmount,
        address dexAddr
    ) private {
        IVyperSwap vyperSwap = IVyperSwap(dexAddr);
        bool approveSuccess = _src.approve(dexAddr, inputAmount);
        require(approveSuccess, 'Approve token failed');
        int128 tokenIndexFrom = vyperCoinsMap[dexAddr][address(_src)];
        // console.log('tokenIndexFrom: %d', uint128(tokenIndexFrom));
        int128 tokenIndexTo = vyperCoinsMap[dexAddr][address(_dest)];
        // console.log('tokenIndexTo: %d', uint128(tokenIndexTo));
        vyperSwap.exchange(
            tokenIndexFrom,
            tokenIndexTo,
            inputAmount,
            minOutputAmount
        );
    }

    function _tradeVyperUnderlying(
        IERC20 _src,
        IERC20 _dest,
        uint256 inputAmount,
        uint256 minOutputAmount,
        address dexAddr
    ) private {
        IVyperUnderlyingSwap vyperSwap = IVyperUnderlyingSwap(dexAddr);
        bool approveSuccess = _src.approve(dexAddr, inputAmount);
        require(approveSuccess, 'Approve token failed');
        int128 tokenIndexFrom = vyperCoinsMap[dexAddr][address(_src)];
        // console.log('tokenIndexFrom: %d', uint128(tokenIndexFrom));
        int128 tokenIndexTo = vyperCoinsMap[dexAddr][address(_dest)];
        // console.log('tokenIndexTo: %d', uint128(tokenIndexTo));
        vyperSwap.exchange_underlying(
            tokenIndexFrom,
            tokenIndexTo,
            inputAmount,
            minOutputAmount
        );
    }

    function _tradeDopple(
        IERC20 _src,
        IERC20 _dest,
        uint256 inputAmount,
        uint256 minOutputAmount,
        address dexAddr
    ) private returns (uint256 amount) {
        IDoppleSwap doppleSwap = IDoppleSwap(dexAddr);
        bool approveSuccess = _src.approve(dexAddr, inputAmount);
        require(approveSuccess, 'Approve token failed');
        // console.log('getTokenIndex: %s %s', address(_src), address(_dest));
        uint8 tokenIndexFrom = doppleSwap.getTokenIndex(address(_src));
        // console.log('tokenIndexFrom: %d', uint128(tokenIndexFrom));
        uint8 tokenIndexTo = doppleSwap.getTokenIndex(address(_dest));
        // console.log('tokenIndexTo: %d', uint128(tokenIndexTo));
        amount = doppleSwap.swap(
            tokenIndexFrom,
            tokenIndexTo,
            inputAmount,
            minOutputAmount,
            DEADLINE
        );
    }

    function multiTrade(MultiSwapDesctiption memory desc)
        external
        payable
        returns (uint256 returnAmount, uint256 blockNumber)
    {
        require(desc.amountIn > 0, 'Amount-in needs to be more than zero');
        blockNumber = block.number;

        IERC20 srcToken = desc.srcToken;
        IERC20 dstToken = desc.dstToken;

        if (ETHER_ERC20 == desc.srcToken) {
            require(msg.value == desc.amountIn, 'Value not match amountIn');
        } else {
            uint256 allowance = srcToken.allowance(msg.sender, address(this));
            require(allowance >= desc.amountIn, 'Allowance not enough');
            bool transferSuccess = srcToken.transferFrom(
                msg.sender,
                address(this),
                desc.amountIn
            );
            require(transferSuccess, 'Get token from message sender failed');
        }

        TradeRoute[] memory routes = desc.routes;
        uint256 srcTokenAmount;

        for (uint256 i = 0; i < routes.length; i++) {
            TradeRoute memory route = routes[i];
            IERC20 startToken = ERC20(route.paths[0]);
            IERC20 endToken = ERC20(route.paths[route.paths.length - 1]);
            if (ETHER_ERC20 == startToken) {
                srcTokenAmount = address(this).balance;
            } else {
                srcTokenAmount = startToken.balanceOf(address(this));
            }
            uint256 inputAmount = srcTokenAmount.mul(route.part).div(100000000); // 1% = 10^6
            require(
                route.part <= 100000000,
                'Route percentage can not exceed 100000000'
            );
            // console.log(
            //     '_trade:',
            //     address(startToken),
            //     srcTokenAmount,
            //     route.dexAddr
            // );
            // uint256[] memory amounts
            if (route.dexInterface == RouterInterface.BAKERY) {
                // amounts =
                _tradeIBakery(
                    startToken,
                    endToken,
                    inputAmount,
                    0,
                    route.paths,
                    address(this),
                    route.dexAddr
                );
            } else if (route.dexInterface == RouterInterface.VYPER) {
                // amounts =
                _tradeVyper(
                    startToken,
                    endToken,
                    inputAmount,
                    0,
                    route.dexAddr
                );
            } else if (route.dexInterface == RouterInterface.VYPER_UNDERLYING) {
                // amounts =
                _tradeVyperUnderlying(
                    startToken,
                    endToken,
                    inputAmount,
                    0,
                    route.dexAddr
                );
            } else if (route.dexInterface == RouterInterface.DOPPLE) {
                // amounts =
                _tradeDopple(
                    startToken,
                    endToken,
                    inputAmount,
                    0,
                    route.dexAddr
                );
            } else {
                // amounts =
                _tradeIUniswap(
                    startToken,
                    endToken,
                    inputAmount,
                    0,
                    route.paths,
                    address(this),
                    route.dexAddr
                );
            }
            // for (uint256 idx = 0; idx < amounts.length; idx++) {
            //     console.log('\tamount[%d]: %d', idx, amounts[idx]);
            // }
        }

        if (ETHER_ERC20 == desc.dstToken) {
            returnAmount = address(this).balance;
        } else {
            returnAmount = desc.dstToken.balanceOf(address(this));
        }

        returnAmount = _collectFee(returnAmount, desc.dstToken);
        // console.log(
        //     'returnAmount after fee:',
        //     returnAmount,
        //     'amountOutMin:',
        //     desc.amountOutMin
        // );
        require(
            returnAmount >= desc.amountOutMin,
            'Return amount is not enough'
        );
        if (ETHER_ERC20 == desc.dstToken) {
            (bool sent, ) = desc.to.call{value: returnAmount}('');
            require(sent, 'Failed to send Ether');
        } else {
            bool transferSuccess = dstToken.transfer(msg.sender, returnAmount);
            require(transferSuccess, 'Send token to message sender failed');
        }

        emit Swapped(
            address(srcToken),
            address(dstToken),
            desc.amountIn,
            returnAmount
        );
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address payable","name":"_feeWalletAddress","type":"address"},{"internalType":"address","name":"_owner","type":"address"},{"internalType":"contract IERC20","name":"_wrappedEther","type":"address"},{"components":[{"internalType":"address[]","name":"dexAddress","type":"address[]"},{"internalType":"address[][]","name":"tokenAddress","type":"address[][]"}],"internalType":"struct ArkenDex.VyperConstructor","name":"_vyperParams","type":"tuple"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Received","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"srcToken","type":"address"},{"indexed":false,"internalType":"address","name":"dstToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"returnAmount","type":"uint256"}],"name":"Swapped","type":"event"},{"inputs":[],"name":"DEADLINE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeWalletAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"contract IERC20","name":"srcToken","type":"address"},{"internalType":"contract IERC20","name":"dstToken","type":"address"},{"components":[{"internalType":"address[]","name":"paths","type":"address[]"},{"internalType":"address","name":"dexAddr","type":"address"},{"internalType":"enum ArkenDex.RouterInterface","name":"dexInterface","type":"uint8"},{"internalType":"uint256","name":"part","type":"uint256"}],"internalType":"struct ArkenDex.TradeRoute[]","name":"routes","type":"tuple[]"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address payable","name":"to","type":"address"}],"internalType":"struct ArkenDex.MultiSwapDesctiption","name":"desc","type":"tuple"}],"name":"multiTrade","outputs":[{"internalType":"uint256","name":"returnAmount","type":"uint256"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"ownerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040523480156200001157600080fd5b50604051620022fd380380620022fd83398101604081905262000034916200032b565b600080546001600160a01b038086166001600160a01b0319928316179092556002805485841690831617905560018054928716929091169190911790556200007c8162000086565b505050506200059e565b805160208201518051825114620001235760405162461bcd60e51b815260206004820152605160248201527f767970657220706172616d73206465784164647265737320616e6420746f6b6560448201527f6e4164647265737320616e6420746f6b656e496e6465782068617320746f20626064820152700ca40e8d0ca40e6c2daca40d8cadccee8d607b1b608482015260a40160405180910390fd5b60005b82518163ffffffff161015620002a35760005b828263ffffffff16815181106200016057634e487b7160e01b600052603260045260246000fd5b602002602001015151816001600160801b031610156200028d578060036000868563ffffffff1681518110620001a657634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000206000858563ffffffff1681518110620001f757634e487b7160e01b600052603260045260246000fd5b6020026020010151846001600160801b0316815181106200022857634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a8154816001600160801b030219169083600f0b6001600160801b031602179055508080620002849062000508565b91505062000139565b50806200029a8162000532565b91505062000126565b50505050565b600082601f830112620002ba578081fd5b81516020620002d3620002cd83620004e2565b620004af565b80838252828201915082860187848660051b8901011115620002f3578586fd5b855b858110156200031e5781516200030b8162000585565b84529284019290840190600101620002f5565b5090979650505050505050565b6000806000806080858703121562000341578384fd5b84516200034e8162000585565b6020860151909450620003618162000585565b6040860151909350620003748162000585565b60608601519092506001600160401b038082111562000391578283fd5b9086019060408289031215620003a5578283fd5b620003af62000484565b825182811115620003be578485fd5b620003cc8a828601620002a9565b825250602083015182811115620003e1578485fd5b80840193505088601f840112620003f6578384fd5b825162000407620002cd82620004e2565b80828252602082019150602086018c60208560051b89010111156200042a578788fd5b875b848110156200046c578151878111156200044457898afd5b620004558f6020838c0101620002a9565b85525060209384019391909101906001016200042c565b50506020840152509699959850939650929450505050565b604080519081016001600160401b0381118282101715620004a957620004a96200056f565b60405290565b604051601f8201601f191681016001600160401b0381118282101715620004da57620004da6200056f565b604052919050565b60006001600160401b03821115620004fe57620004fe6200056f565b5060051b60200190565b6000600f82900b60016001607f1b0381141562000529576200052962000559565b60010192915050565b600063ffffffff808316818114156200054f576200054f62000559565b6001019392505050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146200059b57600080fd5b50565b611d4f80620005ae6000396000f3fe6080604052600436106100435760003560e01c806308a300cb146100875780638f84aa09146100c4578063a082c86e146100e4578063e8b26c2b1461010857600080fd5b3661008257604080513381523460208201527f88a5966d370b9919b20f3e2c13ff65706f196a4e32cc2c12bf57088f88525874910160405180910390a1005b600080fd5b34801561009357600080fd5b506001546100a7906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156100d057600080fd5b506000546100a7906001600160a01b031681565b3480156100f057600080fd5b506100fa60001981565b6040519081526020016100bb565b61011b6101163660046119d4565b610130565b604080519283526020830191909152016100bb565b60008060008360600151116101985760405162461bcd60e51b8152602060048201526024808201527f416d6f756e742d696e206e6565647320746f206265206d6f7265207468616e206044820152637a65726f60e01b60648201526084015b60405180910390fd5b5081516020830151439190600080516020611cfa8339815191526001600160a01b038316141561021a57846060015134146102155760405162461bcd60e51b815260206004820152601860248201527f56616c7565206e6f74206d6174636820616d6f756e74496e0000000000000000604482015260640161018f565b6103d4565b604051636eb1769f60e11b81523360048201523060248201526000906001600160a01b0384169063dd62ed3e9060440160206040518083038186803b15801561026257600080fd5b505afa158015610276573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061029a9190611a88565b905085606001518110156102e75760405162461bcd60e51b8152602060048201526014602482015273082d8d8deeec2dcc6ca40dcdee840cadcdeeaced60631b604482015260640161018f565b60608601516040516323b872dd60e01b815233600482015230602482015260448101919091526000906001600160a01b038516906323b872dd90606401602060405180830381600087803b15801561033e57600080fd5b505af1158015610352573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061037691906119b4565b9050806103d15760405162461bcd60e51b8152602060048201526024808201527f47657420746f6b656e2066726f6d206d6573736167652073656e6465722066616044820152631a5b195960e21b606482015260840161018f565b50505b60408501516000805b82518110156106fb57600083828151811061040857634e487b7160e01b600052603260045260246000fd5b602002602001015190506000816000015160008151811061043957634e487b7160e01b600052603260045260246000fd5b6020026020010151905060008260000151600184600001515161045c9190611c83565b8151811061047a57634e487b7160e01b600052603260045260246000fd5b60200260200101519050816001600160a01b0316600080516020611cfa8339815191526001600160a01b031614156104b45747945061052e565b6040516370a0823160e01b81523060048201526001600160a01b038316906370a082319060240160206040518083038186803b1580156104f357600080fd5b505afa158015610507573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061052b9190611a88565b94505b60006105556305f5e10061054f866060015189610a2590919063ffffffff16565b90610a38565b90506305f5e100846060015111156105c15760405162461bcd60e51b815260206004820152602960248201527f526f7574652070657263656e746167652063616e206e6f74206578636565642060448201526803130303030303030360bc1b606482015260840161018f565b6001846040015160048111156105e757634e487b7160e01b600052602160045260246000fd5b141561060b5761060583838360008860000151308a60200151610a44565b506106e4565b60028460400151600481111561063157634e487b7160e01b600052602160045260246000fd5b141561064e5761064983838360008860200151610eed565b6106e4565b60038460400151600481111561067457634e487b7160e01b600052602160045260246000fd5b141561068c5761064983838360008860200151611044565b6004846040015160048111156106b257634e487b7160e01b600052602160045260246000fd5b14156106ca5761060583838360008860200151611162565b6106e283838360008860000151308a602001516113b2565b505b5050505080806106f390611c9a565b9150506103dd565b5086602001516001600160a01b0316600080516020611cfa8339815191526001600160a01b03161415610730574795506107b0565b60208701516040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b15801561077557600080fd5b505afa158015610789573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ad9190611a88565b95505b6107be86886020015161165f565b955086608001518610156108145760405162461bcd60e51b815260206004820152601b60248201527f52657475726e20616d6f756e74206973206e6f7420656e6f7567680000000000604482015260640161018f565b86602001516001600160a01b0316600080516020611cfa8339815191526001600160a01b031614156108e45760008760a001516001600160a01b03168760405160006040518083038185875af1925050503d8060008114610891576040519150601f19603f3d011682016040523d82523d6000602084013e610896565b606091505b50509050806108de5760405162461bcd60e51b81526020600482015260146024820152732330b4b632b2103a379039b2b7321022ba3432b960611b604482015260640161018f565b506109c4565b60405163a9059cbb60e01b8152336004820152602481018790526000906001600160a01b0385169063a9059cbb90604401602060405180830381600087803b15801561092f57600080fd5b505af1158015610943573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061096791906119b4565b9050806109c25760405162461bcd60e51b815260206004820152602360248201527f53656e6420746f6b656e20746f206d6573736167652073656e646572206661696044820152621b195960ea1b606482015260840161018f565b505b606080880151604080516001600160a01b03808916825287166020820152908101919091529081018790527fa078c4190abe07940190effc1846be0ccf03ad6007bc9e93f9697d0b460befbb9060800160405180910390a150505050915091565b6000610a318284611c64565b9392505050565b6000610a318284611c44565b6060816001600160a01b038916600080516020611cfa8339815191521415610b9a57600080516020611cfa8339815191526001600160a01b031685600081518110610a9f57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03161415610b075760025485516001600160a01b03909116908690600090610ae657634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b0316815250505b604051639cf6891160e01b81526001600160a01b03821690639cf68911908990610b3d908a908a908a9060001990600401611b32565b6000604051808303818588803b158015610b5657600080fd5b505af1158015610b6a573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f19168201604052610b93919081019061192d565b9150610ee1565b6001600160a01b038816600080516020611cfa8339815191521415610dac57600080516020611cfa8339815191526001600160a01b03168560018751610be09190611c83565b81518110610bfe57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03161415610c735760025485516001600160a01b03909116908690610c3490600190611c83565b81518110610c5257634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b0316815250505b60405163095ea7b360e01b81526001600160a01b03848116600483015260248201899052600091908b169063095ea7b390604401602060405180830381600087803b158015610cc157600080fd5b505af1158015610cd5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cf991906119b4565b905080610d185760405162461bcd60e51b815260040161018f90611b04565b604051635d616c5b60e01b81526001600160a01b03831690635d616c5b90610d4e908b908b908b908b9060001990600401611b67565b600060405180830381600087803b158015610d6857600080fd5b505af1158015610d7c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610da4919081019061192d565b925050610ee1565b60405163095ea7b360e01b81526001600160a01b03848116600483015260248201899052600091908b169063095ea7b390604401602060405180830381600087803b158015610dfa57600080fd5b505af1158015610e0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e3291906119b4565b905080610e515760405162461bcd60e51b815260040161018f90611b04565b6040516338ed173960e01b81526001600160a01b038316906338ed173990610e87908b908b908b908b9060001990600401611b67565b600060405180830381600087803b158015610ea157600080fd5b505af1158015610eb5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610edd919081019061192d565b9250505b50979650505050505050565b60405163095ea7b360e01b81526001600160a01b03808316600483015260248201859052829160009188169063095ea7b390604401602060405180830381600087803b158015610f3c57600080fd5b505af1158015610f50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f7491906119b4565b905080610f935760405162461bcd60e51b815260040161018f90611b04565b6001600160a01b0383811660009081526003602090815260408083208b8516845290915280822054898416835291819020549051630f7c084960e21b8152600f92830b80840b600483015291830b9283900b602482015260448101899052606481018890529092851690633df02124906084015b600060405180830381600087803b15801561102157600080fd5b505af1158015611035573d6000803e3d6000fd5b50505050505050505050505050565b60405163095ea7b360e01b81526001600160a01b03808316600483015260248201859052829160009188169063095ea7b390604401602060405180830381600087803b15801561109357600080fd5b505af11580156110a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110cb91906119b4565b9050806110ea5760405162461bcd60e51b815260040161018f90611b04565b6001600160a01b0383811660009081526003602090815260408083208b8516845290915280822054898416835291819020549051635320bf6b60e11b8152600f92830b80840b600483015291830b9283900b60248201526044810189905260648101889052909285169063a6417ed690608401611007565b60405163095ea7b360e01b81526001600160a01b03808316600483015260248201859052600091839183919089169063095ea7b390604401602060405180830381600087803b1580156111b457600080fd5b505af11580156111c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ec91906119b4565b90508061120b5760405162461bcd60e51b815260040161018f90611b04565b6040516319b02f4960e21b81526001600160a01b038981166004830152600091908416906366c0bd249060240160206040518083038186803b15801561125057600080fd5b505afa158015611264573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112889190611aa0565b6040516319b02f4960e21b81526001600160a01b038a811660048301529192506000918516906366c0bd249060240160206040518083038186803b1580156112cf57600080fd5b505afa1580156112e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113079190611aa0565b6040516348b4aac360e11b815260ff808516600483015282166024820152604481018a90526064810189905260001960848201529091506001600160a01b0385169063916955869060a401602060405180830381600087803b15801561136c57600080fd5b505af1158015611380573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113a49190611a88565b9a9950505050505050505050565b6060816001600160a01b038916600080516020611cfa83398151915214156114ab57600080516020611cfa8339815191526001600160a01b03168560008151811061140d57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b031614156114755760025485516001600160a01b0390911690869060009061145457634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b0316815250505b604051637ff36ab560e01b81526001600160a01b03821690637ff36ab5908990610b3d908a908a908a9060001990600401611b32565b6001600160a01b038816600080516020611cfa8339815191521415610dac57600080516020611cfa8339815191526001600160a01b031685600187516114f19190611c83565b8151811061150f57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b031614156115845760025485516001600160a01b0390911690869061154590600190611c83565b8151811061156357634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b0316815250505b60405163095ea7b360e01b81526001600160a01b03848116600483015260248201899052600091908b169063095ea7b390604401602060405180830381600087803b1580156115d257600080fd5b505af11580156115e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061160a91906119b4565b9050806116295760405162461bcd60e51b815260040161018f90611b04565b6040516318cbafe560e01b81526001600160a01b038316906318cbafe590610d4e908b908b908b908b9060001990600401611b67565b60008061166e846103e8610a38565b90508381106116b45760405162461bcd60e51b815260206004820152601260248201527111995948195e18d959591cc8185b5bdd5b9d60721b604482015260640161018f565b600080516020611cfa8339815191526001600160a01b0384161415611713576001546040516001600160a01b039091169082156108fc029083906000818181858888f1935050505015801561170d573d6000803e3d6000fd5b5061179b565b60015460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018390529084169063a9059cbb90604401602060405180830381600087803b15801561176157600080fd5b505af1158015611775573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061179991906119b4565b505b6117a584826117ad565b949350505050565b6000610a318284611c83565b80356117c481611ce1565b919050565b600082601f8301126117d9578081fd5b813560206117ee6117e983611c20565b611bef565b80838252828201915082860187848660051b890101111561180d578586fd5b855b8581101561191157813567ffffffffffffffff8082111561182e578889fd5b908901906080828c03601f19011215611845578889fd5b61184d611ba3565b878301358281111561185d578a8bfd5b83019150603f82018c1361186f57898afd5b8782013561187f6117e982611c20565b808282528a82019150604085018f60408560051b88010111156118a0578d8efd5b8d95505b838610156118cb5780356118b781611ce1565b835260019590950194918b01918b016118a4565b508352506118dd9050604084016117b9565b888201526118ed6060840161191e565b6040820152608092909201356060830152508452928401929084019060010161180f565b5090979650505050505050565b8035600581106117c457600080fd5b6000602080838503121561193f578182fd5b825167ffffffffffffffff811115611955578283fd5b8301601f81018513611965578283fd5b80516119736117e982611c20565b80828252848201915084840188868560051b8701011115611992578687fd5b8694505b83851015610ee1578051835260019490940193918501918501611996565b6000602082840312156119c5578081fd5b81518015158114610a31578182fd5b6000602082840312156119e5578081fd5b813567ffffffffffffffff808211156119fc578283fd5b9083019060c08286031215611a0f578283fd5b611a17611bcc565b8235611a2281611ce1565b81526020830135611a3281611ce1565b6020820152604083013582811115611a48578485fd5b611a54878286016117c9565b6040830152506060830135606082015260808301356080820152611a7a60a084016117b9565b60a082015295945050505050565b600060208284031215611a99578081fd5b5051919050565b600060208284031215611ab1578081fd5b815160ff81168114610a31578182fd5b6000815180845260208085019450808401835b83811015611af95781516001600160a01b031687529582019590820190600101611ad4565b509495945050505050565b602080825260149082015273105c1c1c9bdd99481d1bdad95b8819985a5b195960621b604082015260600190565b848152608060208201526000611b4b6080830186611ac1565b6001600160a01b03949094166040830152506060015292915050565b85815284602082015260a060408201526000611b8660a0830186611ac1565b6001600160a01b0394909416606083015250608001529392505050565b6040516080810167ffffffffffffffff81118282101715611bc657611bc6611ccb565b60405290565b60405160c0810167ffffffffffffffff81118282101715611bc657611bc6611ccb565b604051601f8201601f1916810167ffffffffffffffff81118282101715611c1857611c18611ccb565b604052919050565b600067ffffffffffffffff821115611c3a57611c3a611ccb565b5060051b60200190565b600082611c5f57634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615611c7e57611c7e611cb5565b500290565b600082821015611c9557611c95611cb5565b500390565b6000600019821415611cae57611cae611cb5565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114611cf657600080fd5b5056fe000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeea2646970667358221220b47715e7cf211a9cca8be808ef941257c163fb63a6385a04c0fda06af445d3c764736f6c6343000804003300000000000000000000000072156230d64f2bd82e0c772e2db56c0c80b9e96200000000000000000000000072156230d64f2bd82e0c772e2db56c0c80b9e962000000000000000000000000bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000002000000000000000000000000160caed03795365f3a589f10c379ffa7d75d4e76000000000000000000000000aea4f7dcd172997947809ce6f12018a6d5c1e8b60000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000003000000000000000000000000e9e7cea3dedca5984780bafc599bd69add087d560000000000000000000000008ac76a51cc950d9822d68b83fe1ad97b32cd580d00000000000000000000000055d398326f99059ff775485246999027b319795500000000000000000000000000000000000000000000000000000000000000040000000000000000000000001af3f329e8be154074d8769d1ffa4ee058b1dbc30000000000000000000000008ac76a51cc950d9822d68b83fe1ad97b32cd580d00000000000000000000000055d398326f99059ff775485246999027b3197955000000000000000000000000e9e7cea3dedca5984780bafc599bd69add087d56

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

00000000000000000000000072156230d64f2bd82e0c772e2db56c0c80b9e96200000000000000000000000072156230d64f2bd82e0c772e2db56c0c80b9e962000000000000000000000000bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000002000000000000000000000000160caed03795365f3a589f10c379ffa7d75d4e76000000000000000000000000aea4f7dcd172997947809ce6f12018a6d5c1e8b60000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000003000000000000000000000000e9e7cea3dedca5984780bafc599bd69add087d560000000000000000000000008ac76a51cc950d9822d68b83fe1ad97b32cd580d00000000000000000000000055d398326f99059ff775485246999027b319795500000000000000000000000000000000000000000000000000000000000000040000000000000000000000001af3f329e8be154074d8769d1ffa4ee058b1dbc30000000000000000000000008ac76a51cc950d9822d68b83fe1ad97b32cd580d00000000000000000000000055d398326f99059ff775485246999027b3197955000000000000000000000000e9e7cea3dedca5984780bafc599bd69add087d56
-----Encoded View---------------
21 Constructor Arguments found :
Arg [0] : 00000000000000000000000072156230d64f2bd82e0c772e2db56c0c80b9e962
Arg [1] : 00000000000000000000000072156230d64f2bd82e0c772e2db56c0c80b9e962
Arg [2] : 000000000000000000000000bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [5] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [7] : 000000000000000000000000160caed03795365f3a589f10c379ffa7d75d4e76
Arg [8] : 000000000000000000000000aea4f7dcd172997947809ce6f12018a6d5c1e8b6
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [11] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [13] : 000000000000000000000000e9e7cea3dedca5984780bafc599bd69add087d56
Arg [14] : 0000000000000000000000008ac76a51cc950d9822d68b83fe1ad97b32cd580d
Arg [15] : 00000000000000000000000055d398326f99059ff775485246999027b3197955
Arg [16] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [17] : 0000000000000000000000001af3f329e8be154074d8769d1ffa4ee058b1dbc3
Arg [18] : 0000000000000000000000008ac76a51cc950d9822d68b83fe1ad97b32cd580d
Arg [19] : 00000000000000000000000055d398326f99059ff775485246999027b3197955
Arg [20] : 000000000000000000000000e9e7cea3dedca5984780bafc599bd69add087d56


Deployed ByteCode Sourcemap

25558:13784:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26579:31;;;26588:10;6645:51:1;;26600:9:0;6727:2:1;6712:18;;6705:34;26579:31:0;;6618:18:1;26579:31:0;;;;;;;25558:13784;;;;;26660:39;;;;;;;;;;-1:-1:-1;26660:39:0;;;;-1:-1:-1;;;;;26660:39:0;;;;;;-1:-1:-1;;;;;6195:32:1;;;6177:51;;6165:2;6150:18;26660:39:0;;;;;;;;26626:27;;;;;;;;;;-1:-1:-1;26626:27:0;;;;-1:-1:-1;;;;;26626:27:0;;;25618:45;;;;;;;;;;;;-1:-1:-1;;25618:45:0;;;;;12467:25:1;;;12455:2;12440:18;25618:45:0;12422:76:1;34510:4829:0;;;;;;:::i;:::-;;:::i;:::-;;;;13184:25:1;;;13240:2;13225:18;;13218:34;;;;13157:18;34510:4829:0;13139:119:1;34510:4829:0;34617:20;34639:19;34700:1;34684:4;:13;;;:17;34676:66;;;;-1:-1:-1;;;34676:66:0;;9550:2:1;34676:66:0;;;9532:21:1;9589:2;9569:18;;;9562:30;9628:34;9608:18;;;9601:62;-1:-1:-1;;;9679:18:1;;;9672:34;9723:19;;34676:66:0;;;;;;;;;-1:-1:-1;34810:13:0;;34852;;;;34767:12;;34810:13;-1:-1:-1;;;;;;;;;;;;;;;;34882:28:0;;;34878:542;;;34948:4;:13;;;34935:9;:26;34927:63;;;;-1:-1:-1;;;34927:63:0;;12170:2:1;34927:63:0;;;12152:21:1;12209:2;12189:18;;;12182:30;12248:26;12228:18;;;12221:54;12292:18;;34927:63:0;12142:174:1;34927:63:0;34878:542;;;35043:45;;-1:-1:-1;;;35043:45:0;;35062:10;35043:45;;;6962:34:1;35082:4:0;7012:18:1;;;7005:43;35023:17:0;;-1:-1:-1;;;;;35043:18:0;;;;;6897::1;;35043:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35023:65;;35124:4;:13;;;35111:9;:26;;35103:59;;;;-1:-1:-1;;;35103:59:0;;10658:2:1;35103:59:0;;;10640:21:1;10697:2;10677:18;;;10670:30;-1:-1:-1;;;10716:18:1;;;10709:50;10776:18;;35103:59:0;10630:170:1;35103:59:0;35301:13;;;;35200:129;;-1:-1:-1;;;35200:129:0;;35240:10;35200:129;;;7299:34:1;35277:4:0;7349:18:1;;;7342:43;7401:18;;;7394:34;;;;35177:20:0;;-1:-1:-1;;;;;35200:21:0;;;;;7234:18:1;;35200:129:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35177:152;;35352:15;35344:64;;;;-1:-1:-1;;;35344:64:0;;9145:2:1;35344:64:0;;;9127:21:1;9184:2;9164:18;;;9157:30;9223:34;9203:18;;;9196:62;-1:-1:-1;;;9274:18:1;;;9267:34;9318:19;;35344:64:0;9117:226:1;35344:64:0;34878:542;;;35461:11;;;;35432:26;;35518:2742;35542:6;:13;35538:1;:17;35518:2742;;;35577:23;35603:6;35610:1;35603:9;;;;;;-1:-1:-1;;;35603:9:0;;;;;;;;;;;;;;;35577:35;;35627:17;35653:5;:11;;;35665:1;35653:14;;;;;;-1:-1:-1;;;35653:14:0;;;;;;;;;;;;;;;35627:41;;35683:15;35707:5;:11;;;35740:1;35719:5;:11;;;:18;:22;;;;:::i;:::-;35707:35;;;;;;-1:-1:-1;;;35707:35:0;;;;;;;;;;;;;;;35683:60;;35777:10;-1:-1:-1;;;;;35762:25:0;-1:-1:-1;;;;;;;;;;;;;;;;35762:25:0;;35758:197;;;35825:21;35808:38;;35758:197;;;35904:35;;-1:-1:-1;;;35904:35:0;;35933:4;35904:35;;;6177:51:1;-1:-1:-1;;;;;35904:20:0;;;;;6150:18:1;;35904:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35887:52;;35758:197;35969:19;35991:45;36026:9;35991:30;36010:5;:10;;;35991:14;:18;;:30;;;;:::i;:::-;:34;;:45::i;:::-;35969:67;;36104:9;36090:5;:10;;;:23;;36064:126;;;;-1:-1:-1;;;36064:126:0;;11356:2:1;36064:126:0;;;11338:21:1;11395:2;11375:18;;;11368:30;11434:34;11414:18;;;11407:62;-1:-1:-1;;;11485:18:1;;;11478:39;11534:19;;36064:126:0;11328:231:1;36064:126:0;36462:22;36440:5;:18;;;:44;;;;;;-1:-1:-1;;;36440:44:0;;;;;;;;;;36436:1654;;;36535:260;36571:10;36604:8;36635:11;36669:1;36693:5;:11;;;36735:4;36763:5;:13;;;36535;:260::i;:::-;;36436:1654;;;36843:21;36821:5;:18;;;:43;;;;;;-1:-1:-1;;;36821:43:0;;;;;;;;;;36817:1273;;;36915:188;36949:10;36982:8;37013:11;37047:1;37071:5;:13;;;36915:11;:188::i;:::-;36817:1273;;;37151:32;37129:5;:18;;;:54;;;;;;-1:-1:-1;;;37129:54:0;;;;;;;;;;37125:965;;;37234:198;37278:10;37311:8;37342:11;37376:1;37400:5;:13;;;37234:21;:198::i;37125:965::-;37480:22;37458:5;:18;;;:44;;;;;;-1:-1:-1;;;37458:44:0;;;;;;;;;;37454:636;;;37553:189;37588:10;37621:8;37652:11;37686:1;37710:5;:13;;;37553:12;:189::i;37454:636::-;37813:261;37850:10;37883:8;37914:11;37948:1;37972:5;:11;;;38014:4;38042:5;:13;;;37813:14;:261::i;:::-;;37454:636;35518:2742;;;;35557:3;;;;;:::i;:::-;;;;35518:2742;;;;38291:4;:13;;;-1:-1:-1;;;;;38276:28:0;-1:-1:-1;;;;;;;;;;;;;;;;38276:28:0;;38272:183;;;38336:21;38321:36;;38272:183;;;38405:13;;;;:38;;-1:-1:-1;;;38405:38:0;;38437:4;38405:38;;;6177:51:1;-1:-1:-1;;;;;38405:23:0;;;;;;6150:18:1;;38405:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38390:53;;38272:183;38482:40;38494:12;38508:4;:13;;;38482:11;:40::i;:::-;38467:55;;38751:4;:17;;;38735:12;:33;;38713:110;;;;-1:-1:-1;;;38713:110:0;;9955:2:1;38713:110:0;;;9937:21:1;9994:2;9974:18;;;9967:30;10033:29;10013:18;;;10006:57;10080:18;;38713:110:0;9927:177:1;38713:110:0;38853:4;:13;;;-1:-1:-1;;;;;38838:28:0;-1:-1:-1;;;;;;;;;;;;;;;;38838:28:0;;38834:343;;;38884:9;38899:4;:7;;;-1:-1:-1;;;;;38899:12:0;38919;38899:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38883:53;;;38959:4;38951:37;;;;-1:-1:-1;;;38951:37:0;;8796:2:1;38951:37:0;;;8778:21:1;8835:2;8815:18;;;8808:30;-1:-1:-1;;;8854:18:1;;;8847:50;8914:18;;38951:37:0;8768:170:1;38951:37:0;38834:343;;;;39044:43;;-1:-1:-1;;;39044:43:0;;39062:10;39044:43;;;6645:51:1;6712:18;;;6705:34;;;39021:20:0;;-1:-1:-1;;;;;39044:17:0;;;;;6618:18:1;;39044:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39021:66;;39110:15;39102:63;;;;-1:-1:-1;;;39102:63:0;;11766:2:1;39102:63:0;;;11748:21:1;11805:2;11785:18;;;11778:30;11844:34;11824:18;;;11817:62;-1:-1:-1;;;11895:18:1;;;11888:33;11938:19;;39102:63:0;11738:225:1;39102:63:0;38834:343;;39280:13;;;;;39194:137;;;-1:-1:-1;;;;;7726:15:1;;;7708:34;;7778:15;;7773:2;7758:18;;7751:43;7810:18;;;7803:34;;;;7853:18;;;7846:34;;;39194:137:0;;7657:3:1;7642:19;39194:137:0;;;;;;;34510:4829;;;;;;;:::o;18919:98::-;18977:7;19004:5;19008:1;19004;:5;:::i;:::-;18997:12;18919:98;-1:-1:-1;;;18919:98:0:o;19318:::-;19376:7;19403:5;19407:1;19403;:5;:::i;30220:1701::-;30456:24;30540:7;-1:-1:-1;;;;;30563:19:0;;-1:-1:-1;;;;;;;;;;;30563:19:0;30559:1355;;;-1:-1:-1;;;;;;;;;;;;;;;;30632:32:0;:5;30638:1;30632:8;;;;;;-1:-1:-1;;;30632:8:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;30632:32:0;;30628:110;;;30704:17;;30685:8;;-1:-1:-1;;;;;30704:17:0;;;;30685:5;;30704:17;;30685:8;;-1:-1:-1;;;30685:8:0;;;;;;;;;;;;;;:37;-1:-1:-1;;;;;30685:37:0;;;-1:-1:-1;;;;;30685:37:0;;;;;30628:110;30762:175;;-1:-1:-1;;;30762:175:0;;-1:-1:-1;;;;;30762:34:0;;;;;30804:11;;30762:175;;30835:15;;30869:5;;30893:2;;-1:-1:-1;;25653:10:0;30762:175;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;30762:175:0;;;;;;;;;;;;:::i;:::-;30752:185;;30559:1355;;;-1:-1:-1;;;;;30959:20:0;;-1:-1:-1;;;;;;;;;;;30959:20:0;30955:959;;;-1:-1:-1;;;;;;;;;;;;;;;;31029:47:0;:5;31050:1;31035:5;:12;:16;;;;:::i;:::-;31029:23;;;;;;-1:-1:-1;;;31029:23:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;31029:47:0;;31025:140;;;31131:17;;31103:12;;-1:-1:-1;;;;;31131:17:0;;;;31097:5;;31103:16;;31131:17;;31103:16;:::i;:::-;31097:23;;;;;;-1:-1:-1;;;31097:23:0;;;;;;;;;;;;;;:52;-1:-1:-1;;;;;31097:52:0;;;-1:-1:-1;;;;;31097:52:0;;;;;31025:140;31201:34;;-1:-1:-1;;;31201:34:0;;-1:-1:-1;;;;;6663:32:1;;;31201:34:0;;;6645:51:1;6712:18;;;6705:34;;;31179:19:0;;31201:12;;;;;;6618:18:1;;31201:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31179:56;;31258:14;31250:47;;;;-1:-1:-1;;;31250:47:0;;;;;;;:::i;:::-;31322:185;;-1:-1:-1;;;31322:185:0;;-1:-1:-1;;;;;31322:34:0;;;;;:185;;31375:11;;31405:15;;31439:5;;31463:2;;-1:-1:-1;;25653:10:0;31322:185;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;31322:185:0;;;;;;;;;;;;:::i;:::-;31312:195;;30955:959;;;;31593:34;;-1:-1:-1;;;31593:34:0;;-1:-1:-1;;;;;6663:32:1;;;31593:34:0;;;6645:51:1;6712:18;;;6705:34;;;31571:19:0;;31593:12;;;;;;6618:18:1;;31593:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31571:56;;31650:14;31642:47;;;;-1:-1:-1;;;31642:47:0;;;;;;;:::i;:::-;31714:188;;-1:-1:-1;;;31714:188:0;;-1:-1:-1;;;;;31714:37:0;;;;;:188;;31770:11;;31800:15;;31834:5;;31858:2;;-1:-1:-1;;25653:10:0;31714:188;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;31714:188:0;;;;;;;;;;;;:::i;:::-;31704:198;;30955:959;;30220:1701;;;;;;;;;;:::o;31929:792::-;32186:34;;-1:-1:-1;;;32186:34:0;;-1:-1:-1;;;;;6663:32:1;;;32186:34:0;;;6645:51:1;6712:18;;;6705:34;;;32145:7:0;;32111:20;;32186:12;;;;;6618:18:1;;32186:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32164:56;;32239:14;32231:47;;;;-1:-1:-1;;;32231:47:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;32313:22:0;;;32289:21;32313:22;;;:13;:22;;;;;;;;:37;;;;;;;;;;;;32455:38;;;;;;;;;;32572:141;;-1:-1:-1;;;32572:141:0;;32313:37;;;;8415:22:1;;;32572:141:0;;;8397:41:1;32455:38:0;;;8474:22:1;;;;8454:18;;;8447:50;8513:18;;;8506:34;;;8556:18;;;8549:34;;;32313:37:0;;32572:18;;;;;8369:19:1;;32572:141:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31929:792;;;;;;;;;:::o;32729:833::-;33016:34;;-1:-1:-1;;;33016:34:0;;-1:-1:-1;;;;;6663:32:1;;;33016:34:0;;;6645:51:1;6712:18;;;6705:34;;;32975:7:0;;32921:30;;33016:12;;;;;6618:18:1;;33016:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32994:56;;33069:14;33061:47;;;;-1:-1:-1;;;33061:47:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;33143:22:0;;;33119:21;33143:22;;;:13;:22;;;;;;;;:37;;;;;;;;;;;;33285:38;;;;;;;;;;33402:152;;-1:-1:-1;;;33402:152:0;;33143:37;;;;8415:22:1;;;33402:152:0;;;8397:41:1;33285:38:0;;;8474:22:1;;;;8454:18;;;8447:50;8513:18;;;8506:34;;;8556:18;;;8549:34;;;33143:37:0;;33402:29;;;;;8369:19:1;;33402:152:0;8351:238:1;33570:932:0;33856:34;;-1:-1:-1;;;33856:34:0;;-1:-1:-1;;;;;6663:32:1;;;33856:34:0;;;6645:51:1;6712:18;;;6705:34;;;33751:14:0;;33815:7;;33751:14;;33856:12;;;;;;6618:18:1;;33856:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33834:56;;33909:14;33901:47;;;;-1:-1:-1;;;33901:47:0;;;;;;;:::i;:::-;34062:39;;-1:-1:-1;;;34062:39:0;;-1:-1:-1;;;;;6195:32:1;;;34062:39:0;;;6177:51:1;34039:20:0;;34062:24;;;;;;6150:18:1;;34062:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34205:40;;-1:-1:-1;;;34205:40:0;;-1:-1:-1;;;;;6195:32:1;;;34205:40:0;;;6177:51:1;34039:62:0;;-1:-1:-1;34184:18:0;;34205:24;;;;;6150:18:1;;34205:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34333:161;;-1:-1:-1;;;34333:161:0;;14123:4:1;14111:17;;;34333:161:0;;;14093:36:1;14165:17;;14145:18;;;14138:45;14199:18;;;14192:34;;;14242:18;;;14235:34;;;-1:-1:-1;;14285:19:1;;;14278:35;34184:61:0;;-1:-1:-1;;;;;;34333:15:0;;;;;14065:19:1;;34333:161:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34324:170;33570:932;-1:-1:-1;;;;;;;;;;33570:932:0:o;28520:1692::-;28757:24;28840:7;-1:-1:-1;;;;;28863:19:0;;-1:-1:-1;;;;;;;;;;;28863:19:0;28859:1346;;;-1:-1:-1;;;;;;;;;;;;;;;;28932:32:0;:5;28938:1;28932:8;;;;;;-1:-1:-1;;;28932:8:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;28932:32:0;;28928:110;;;29004:17;;28985:8;;-1:-1:-1;;;;;29004:17:0;;;;28985:5;;29004:17;;28985:8;;-1:-1:-1;;;28985:8:0;;;;;;;;;;;;;;:37;-1:-1:-1;;;;;28985:37:0;;;-1:-1:-1;;;;;28985:37:0;;;;;28928:110;29062:172;;-1:-1:-1;;;29062:172:0;;-1:-1:-1;;;;;29062:31:0;;;;;29101:11;;29062:172;;29132:15;;29166:5;;29190:2;;-1:-1:-1;;25653:10:0;29062:172;;;:::i;28859:1346::-;-1:-1:-1;;;;;29256:20:0;;-1:-1:-1;;;;;;;;;;;29256:20:0;29252:953;;;-1:-1:-1;;;;;;;;;;;;;;;;29326:47:0;:5;29347:1;29332:5;:12;:16;;;;:::i;:::-;29326:23;;;;;;-1:-1:-1;;;29326:23:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;29326:47:0;;29322:140;;;29428:17;;29400:12;;-1:-1:-1;;;;;29428:17:0;;;;29394:5;;29400:16;;29428:17;;29400:16;:::i;:::-;29394:23;;;;;;-1:-1:-1;;;29394:23:0;;;;;;;;;;;;;;:52;-1:-1:-1;;;;;29394:52:0;;;-1:-1:-1;;;;;29394:52:0;;;;;29322:140;29498:34;;-1:-1:-1;;;29498:34:0;;-1:-1:-1;;;;;6663:32:1;;;29498:34:0;;;6645:51:1;6712:18;;;6705:34;;;29476:19:0;;29498:12;;;;;;6618:18:1;;29498:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29476:56;;29555:14;29547:47;;;;-1:-1:-1;;;29547:47:0;;;;;;;:::i;:::-;29619:182;;-1:-1:-1;;;29619:182:0;;-1:-1:-1;;;;;29619:31:0;;;;;:182;;29669:11;;29699:15;;29733:5;;29757:2;;-1:-1:-1;;25653:10:0;29619:182;;;:::i;27974:538::-;28074:7;;28151:16;:6;28162:4;28151:10;:16::i;:::-;28137:30;;28279:6;28273:3;:12;28265:43;;;;-1:-1:-1;;;28265:43:0;;10311:2:1;28265:43:0;;;10293:21:1;10350:2;10330:18;;;10323:30;-1:-1:-1;;;10369:18:1;;;10362:48;10427:18;;28265:43:0;10283:168:1;28265:43:0;-1:-1:-1;;;;;;;;;;;;;;;;28323:20:0;;;28319:153;;;28360:16;;:30;;-1:-1:-1;;;;;28360:16:0;;;;:30;;;;;28386:3;;28360:16;:30;:16;:30;28386:3;28360:16;:30;;;;;;;;;;;;;;;;;;;;;28319:153;;;28438:16;;28423:37;;-1:-1:-1;;;28423:37:0;;-1:-1:-1;;;;;28438:16:0;;;28423:37;;;6645:51:1;6712:18;;;6705:34;;;28423:14:0;;;;;;6618:18:1;;28423:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;28319:153;28489:15;:6;28500:3;28489:10;:15::i;:::-;28482:22;27974:538;-1:-1:-1;;;;27974:538:0:o;18562:98::-;18620:7;18647:5;18651:1;18647;:5;:::i;14:134:1:-;82:20;;111:31;82:20;111:31;:::i;:::-;63:85;;;:::o;153:2159::-;217:5;270:3;263:4;255:6;251:17;247:27;237:2;;292:5;285;278:20;237:2;332:6;319:20;358:4;382:60;398:43;438:2;398:43;:::i;:::-;382:60;:::i;:::-;464:3;488:2;483:3;476:15;516:2;511:3;507:12;500:19;;551:2;543:6;539:15;603:3;598:2;592;589:1;585:10;577:6;573:23;569:32;566:41;563:2;;;624:5;617;610:20;563:2;650:5;664:1619;678:2;675:1;672:9;664:1619;;;755:3;742:17;782:18;832:2;819:11;816:19;813:2;;;852:5;845;838:20;813:2;883:24;;;;955:4;931:12;;;-1:-1:-1;;927:26:1;923:37;920:2;;;977:5;970;963:20;920:2;1011:22;;:::i;:::-;1083:2;1079;1075:11;1062:25;1116:2;1106:8;1103:16;1100:2;;;1136:5;1129;1122:20;1100:2;1167:17;;;-1:-1:-1;1219:2:1;1211:11;;1207:21;-1:-1:-1;1197:2:1;;1246:5;1239;1232:20;1197:2;1298;1294;1290:11;1277:25;1328:60;1344:43;1384:2;1344:43;:::i;1328:60::-;1414:5;1446:2;1439:5;1432:17;1482:2;1475:5;1471:14;1462:23;;1519:2;1515;1511:11;1571:3;1566:2;1560;1557:1;1553:10;1549:2;1545:19;1541:28;1538:37;1535:2;;;1592:5;1585;1578:20;1535:2;1624:5;1613:16;;1642:290;1658:2;1653:3;1650:11;1642:290;;;1743:5;1730:19;1766:33;1791:7;1766:33;:::i;:::-;1816:22;;1680:1;1671:11;;;;;1864:14;;;;1904;;1642:290;;;-1:-1:-1;1945:20:1;;-1:-1:-1;2001:31:1;;-1:-1:-1;2028:2:1;2020:11;;2001:31;:::i;:::-;1996:2;1989:5;1985:14;1978:55;2069:44;2109:2;2105;2101:11;2069:44;:::i;:::-;2064:2;2053:14;;2046:68;2171:4;2163:13;;;;2150:27;2145:2;2134:14;;2127:51;-1:-1:-1;2191:18:1;;2229:12;;;;2261;;;;696:1;689:9;664:1619;;;-1:-1:-1;2301:5:1;;227:2085;-1:-1:-1;;;;;;;227:2085:1:o;2317:156::-;2398:20;;2447:1;2437:12;;2427:2;;2463:1;2460;2453:12;2478:937;2573:6;2604:2;2647;2635:9;2626:7;2622:23;2618:32;2615:2;;;2668:6;2660;2653:22;2615:2;2706:9;2700:16;2739:18;2731:6;2728:30;2725:2;;;2776:6;2768;2761:22;2725:2;2804:22;;2857:4;2849:13;;2845:27;-1:-1:-1;2835:2:1;;2891:6;2883;2876:22;2835:2;2925;2919:9;2948:60;2964:43;3004:2;2964:43;:::i;2948:60::-;3030:3;3054:2;3049:3;3042:15;3082:2;3077:3;3073:12;3066:19;;3113:2;3109;3105:11;3161:7;3156:2;3150;3147:1;3143:10;3139:2;3135:19;3131:28;3128:41;3125:2;;;3187:6;3179;3172:22;3125:2;3214:6;3205:15;;3229:156;3243:2;3240:1;3237:9;3229:156;;;3300:10;;3288:23;;3261:1;3254:9;;;;;3331:12;;;;3363;;3229:156;;3420:297;3487:6;3540:2;3528:9;3519:7;3515:23;3511:32;3508:2;;;3561:6;3553;3546:22;3508:2;3598:9;3592:16;3651:5;3644:13;3637:21;3630:5;3627:32;3617:2;;3678:6;3670;3663:22;3722:1129;3819:6;3872:2;3860:9;3851:7;3847:23;3843:32;3840:2;;;3893:6;3885;3878:22;3840:2;3938:9;3925:23;3967:18;4008:2;4000:6;3997:14;3994:2;;;4029:6;4021;4014:22;3994:2;4057:22;;;;4113:4;4095:16;;;4091:27;4088:2;;;4136:6;4128;4121:22;4088:2;4167:22;;:::i;:::-;4226:2;4213:16;4238:33;4263:7;4238:33;:::i;:::-;4280:22;;4347:2;4339:11;;4326:25;4360:33;4326:25;4360:33;:::i;:::-;4420:2;4409:14;;4402:31;4479:2;4471:11;;4458:25;4495:16;;;4492:2;;;4529:6;4521;4514:22;4492:2;4570:66;4628:7;4617:8;4613:2;4609:17;4570:66;:::i;:::-;4565:2;4558:5;4554:14;4547:90;;4690:2;4686;4682:11;4669:25;4664:2;4657:5;4653:14;4646:49;4749:3;4745:2;4741:12;4728:26;4722:3;4715:5;4711:15;4704:51;4788:32;4815:3;4811:2;4807:12;4788:32;:::i;:::-;4782:3;4771:15;;4764:57;4775:5;3830:1021;-1:-1:-1;;;;;3830:1021:1:o;4856:194::-;4926:6;4979:2;4967:9;4958:7;4954:23;4950:32;4947:2;;;5000:6;4992;4985:22;4947:2;-1:-1:-1;5028:16:1;;4937:113;-1:-1:-1;4937:113:1:o;5055:293::-;5123:6;5176:2;5164:9;5155:7;5151:23;5147:32;5144:2;;;5197:6;5189;5182:22;5144:2;5234:9;5228:16;5284:4;5277:5;5273:16;5266:5;5263:27;5253:2;;5309:6;5301;5294:22;5353:463;5406:3;5444:5;5438:12;5471:6;5466:3;5459:19;5497:4;5526:2;5521:3;5517:12;5510:19;;5563:2;5556:5;5552:14;5584:3;5596:195;5610:6;5607:1;5604:13;5596:195;;;5675:13;;-1:-1:-1;;;;;5671:39:1;5659:52;;5731:12;;;;5766:15;;;;5707:1;5625:9;5596:195;;;-1:-1:-1;5807:3:1;;5414:402;-1:-1:-1;;;;;5414:402:1:o;10805:344::-;11007:2;10989:21;;;11046:2;11026:18;;;11019:30;-1:-1:-1;;;11080:2:1;11065:18;;11058:50;11140:2;11125:18;;10979:170::o;12503:502::-;12766:6;12755:9;12748:25;12809:3;12804:2;12793:9;12789:18;12782:31;12729:4;12830:57;12882:3;12871:9;12867:19;12859:6;12830:57;:::i;:::-;-1:-1:-1;;;;;12923:32:1;;;;12918:2;12903:18;;12896:60;-1:-1:-1;12987:2:1;12972:18;12965:34;12822:65;12738:267;-1:-1:-1;;12738:267:1:o;13263:574::-;13554:6;13543:9;13536:25;13597:6;13592:2;13581:9;13577:18;13570:34;13640:3;13635:2;13624:9;13620:18;13613:31;13517:4;13661:57;13713:3;13702:9;13698:19;13690:6;13661:57;:::i;:::-;-1:-1:-1;;;;;13754:32:1;;;;13749:2;13734:18;;13727:60;-1:-1:-1;13818:3:1;13803:19;13796:35;13653:65;13526:311;-1:-1:-1;;;13526:311:1:o;14324:253::-;14396:2;14390:9;14438:4;14426:17;;14473:18;14458:34;;14494:22;;;14455:62;14452:2;;;14520:18;;:::i;:::-;14556:2;14549:22;14370:207;:::o;14582:253::-;14654:2;14648:9;14696:4;14684:17;;14731:18;14716:34;;14752:22;;;14713:62;14710:2;;;14778:18;;:::i;14840:275::-;14911:2;14905:9;14976:2;14957:13;;-1:-1:-1;;14953:27:1;14941:40;;15011:18;14996:34;;15032:22;;;14993:62;14990:2;;;15058:18;;:::i;:::-;15094:2;15087:22;14885:230;;-1:-1:-1;14885:230:1:o;15120:183::-;15180:4;15213:18;15205:6;15202:30;15199:2;;;15235:18;;:::i;:::-;-1:-1:-1;15280:1:1;15276:14;15292:4;15272:25;;15189:114::o;15308:217::-;15348:1;15374;15364:2;;-1:-1:-1;;;15399:31:1;;15453:4;15450:1;15443:15;15481:4;15406:1;15471:15;15364:2;-1:-1:-1;15510:9:1;;15354:171::o;15530:168::-;15570:7;15636:1;15632;15628:6;15624:14;15621:1;15618:21;15613:1;15606:9;15599:17;15595:45;15592:2;;;15643:18;;:::i;:::-;-1:-1:-1;15683:9:1;;15582:116::o;15703:125::-;15743:4;15771:1;15768;15765:8;15762:2;;;15776:18;;:::i;:::-;-1:-1:-1;15813:9:1;;15752:76::o;15833:135::-;15872:3;-1:-1:-1;;15893:17:1;;15890:2;;;15913:18;;:::i;:::-;-1:-1:-1;15960:1:1;15949:13;;15880:88::o;15973:127::-;16034:10;16029:3;16025:20;16022:1;16015:31;16065:4;16062:1;16055:15;16089:4;16086:1;16079:15;16105:127;16166:10;16161:3;16157:20;16154:1;16147:31;16197:4;16194:1;16187:15;16221:4;16218:1;16211:15;16237:131;-1:-1:-1;;;;;16312:31:1;;16302:42;;16292:2;;16358:1;16355;16348:12;16292:2;16282:86;:::o

Swarm Source

ipfs://b47715e7cf211a9cca8be808ef941257c163fb63a6385a04c0fda06af445d3c7
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.