Contract 0xfa28ddb74b08b2b6430f5f61a1dd5104268cc29e 2

Txn Hash Method
Block
From
To
Value [Txn Fee]
0x11433f0134692cba6f73c67044e73c7d0da8ae44ffbbefb4b9adab6c863da6dbDeposit ETH38714672023-03-22 4:54:5416 hrs 54 mins ago0x040000946d72095ce1d2484a540e6f1ebedd209e IN  0xfa28ddb74b08b2b6430f5f61a1dd5104268cc29e0.15 MOVR0.00019605025
0xbeb71d6d84d6a7b90f8719d61a8e3638f20d9bfb767052396016b65781f19e53Redeem38691762023-03-21 21:09:181 day 39 mins ago0x1587c94817bfaa7172f6c82e03bb2ac3a5ad6102 IN  0xfa28ddb74b08b2b6430f5f61a1dd5104268cc29e0 MOVR0.00095430375
0xb028f456211d22e2b84a02ba8c3f6f5a46004399d0450e88ee8360946b07a7dcDeposit ETH38558942023-03-20 0:03:482 days 21 hrs ago0x58a3e388a564fa5de8ecd786030092d56d463ce5 IN  0xfa28ddb74b08b2b6430f5f61a1dd5104268cc29e0.28 MOVR0.00017825
0x3c859e092317f79484b17e4346e0367e301f1df6fee8cd0cf17dbef8554bea5aDeposit38545552023-03-19 19:31:423 days 2 hrs ago0xeada1d15a7e182c38f4936d4e0c94c74f2b40ba3 IN  0xfa28ddb74b08b2b6430f5f61a1dd5104268cc29e0 MOVR0.0002075675
0x9e490ddb86bc7f4a2e7c77df996a32f6c8eaf64991aa33c9c381c3b239fbf97aDeposit38450852023-03-18 11:24:004 days 10 hrs ago0x0c39296c0bf6d92c3bf878a2393c378611122bcb IN  0xfa28ddb74b08b2b6430f5f61a1dd5104268cc29e0 MOVR0.000332144
0xccae82d3dfbfcadb7ca9823553f0f6b74647d36e6f09f6154c3e1b9222301381Deposit38450432023-03-18 11:15:244 days 10 hrs ago0x16556c03ff395758c84eafa691bd92b9b562f3a1 IN  0xfa28ddb74b08b2b6430f5f61a1dd5104268cc29e0 MOVR0.000332108
0x64b0f8bc2a1291fccafdf3f31cf647944eac65867ecd98d1fe5619ba2d1b83b3Deposit38312852023-03-16 12:41:306 days 9 hrs ago0xfb09da501a1939959daefa9dbdf196007a9befa4 IN  0xfa28ddb74b08b2b6430f5f61a1dd5104268cc29e0 MOVR0.00020752
0xdcd430fc89251ab6189b5e2cefcf6d5be3e39003966fa341dab5b079fa8c3d12Deposit38311182023-03-16 12:07:306 days 9 hrs ago0xfb09da501a1939959daefa9dbdf196007a9befa4 IN  0xfa28ddb74b08b2b6430f5f61a1dd5104268cc29e0 MOVR0.0002075675
0x774f2df1fefe41a74d8dc25a3741d3e28f32b4e074efc4d90ea7c8ca11f774e5Deposit ETH38193932023-03-14 20:22:548 days 1 hr ago0x9c8d7afdd90bbb07e54a60291c5af391d8ae6dfa IN  0xfa28ddb74b08b2b6430f5f61a1dd5104268cc29e7.407674281969343 MOVR0.0001783225
0x46e53ff585b246c117c4b30182606ab7431056bfd75f82e00c8aaf2be1ada00eDeposit ETH38168472023-03-14 11:44:128 days 10 hrs ago0x58a3e388a564fa5de8ecd786030092d56d463ce5 IN  0xfa28ddb74b08b2b6430f5f61a1dd5104268cc29e0.46 MOVR0.00017825
0x10b1ce0cf6f048388a4dea2f1c85ad79b702d7387680e98b51c3bd2352ad9419Deposit ETH38102302023-03-13 13:13:549 days 8 hrs ago0xd683b78e988ba4bdb9fa0e2012c4c36b7cc96aad IN  0xfa28ddb74b08b2b6430f5f61a1dd5104268cc29e0.7 MOVR0.000178275
0xf23ebe8ec5d349ae8c3fa02c6cf3fefd069cad109142492816d7c9d24dec2c70Redeem37945752023-03-11 7:41:4811 days 14 hrs ago0xa69303d076dfb54d50589c4d018205a409aa4293 IN  0xfa28ddb74b08b2b6430f5f61a1dd5104268cc29e0 MOVR0.000056623776
0x6c9cfcefd67cb426896efdcb59dc03d428003ac3fa4857ca03cd65d79da961c6Redeem37945712023-03-11 7:41:0011 days 14 hrs ago0xa69303d076dfb54d50589c4d018205a409aa4293 IN  0xfa28ddb74b08b2b6430f5f61a1dd5104268cc29e0 MOVR0.00005547
0x59a62dbd1e9e0a9f1bffd2025beb44b7e8dfbcf1d7ec4b067056b24748e9d119Redeem37945662023-03-11 7:40:0011 days 14 hrs ago0xa69303d076dfb54d50589c4d018205a409aa4293 IN  0xfa28ddb74b08b2b6430f5f61a1dd5104268cc29e0 MOVR0.00005547
0x73b53ade7ab07c6245043db804f8d7c24b229889865f85d98d07f4698b371c94Deposit ETH37930832023-03-11 2:27:0611 days 19 hrs ago0xb15a11842955e9f891b59c0c1ed6e44ca25fa518 IN  0xfa28ddb74b08b2b6430f5f61a1dd5104268cc29e9 MOVR0.000178275
0x03b66e86e49b8415aacfa4948b4cb857885bf0a20845662a3793e494eefb72b5Deposit ETH37858802023-03-09 21:39:5413 days 9 mins ago0x7ce15d2199b01cde1d130d519cb068155ad35d8c IN  0xfa28ddb74b08b2b6430f5f61a1dd5104268cc29e3 MOVR0.000178275
0xb680bee483c86eb2007669d98fb8ff99b367086a1218ca0abd1453cca467b85eDeposit37692052023-03-07 12:56:3615 days 8 hrs ago0xfb09da501a1939959daefa9dbdf196007a9befa4 IN  0xfa28ddb74b08b2b6430f5f61a1dd5104268cc29e0 MOVR0.0002075675
0x8c88e44a1a6b2250a96b440d242bd06ca4c0386ee1979187e45505a2c10db247Deposit ETH37529242023-03-05 5:37:4917 days 16 hrs ago0x58a3e388a564fa5de8ecd786030092d56d463ce5 IN  0xfa28ddb74b08b2b6430f5f61a1dd5104268cc29e0.535 MOVR0.000178275
0xe081c53e41643ab8e562496533a137d3618bfcae902dbccb7da17a3fea20064aDeposit ETH37442042023-03-03 23:57:3018 days 21 hrs ago0x396a6d7a33655c45044143cb8a812227bf279578 IN  0xfa28ddb74b08b2b6430f5f61a1dd5104268cc29e3.6 MOVR0.000178275
0x186791ba183a7ef3369ec0bf7307f1316fab3f2c8f76ae75a71e0e5efa7be219Deposit ETH37391182023-03-03 6:37:3619 days 15 hrs ago0xceb2699242dc52f8dcd2cfdf8892dc87c150784d IN  0xfa28ddb74b08b2b6430f5f61a1dd5104268cc29e0.1 MOVR0.00007131
0xfae8237ab84aad01b08fa7765a22e4f80c694103b0c689af7e22083941048bd4Deposit37375442023-03-03 1:13:1819 days 20 hrs ago0x0c39296c0bf6d92c3bf878a2393c378611122bcb IN  0xfa28ddb74b08b2b6430f5f61a1dd5104268cc29e0 MOVR0.00020759
0x85a6e77b7b828bf8939d9855e19a4b7fd73d572d467e61c80ff7466f4e7b4d94Deposit37372442023-03-03 0:11:5419 days 21 hrs ago0x16556c03ff395758c84eafa691bd92b9b562f3a1 IN  0xfa28ddb74b08b2b6430f5f61a1dd5104268cc29e0 MOVR0.00020759
0xab8dd3ab14a619b71609631f6d5140c0d3ecd1a257487e7785991af603916cf5Deposit ETH37344302023-03-02 14:36:0620 days 7 hrs ago0x396a6d7a33655c45044143cb8a812227bf279578 IN  0xfa28ddb74b08b2b6430f5f61a1dd5104268cc29e8.8 MOVR0.000178275
0x64311dd21b00eaf0ea9d49b2a953a19adf7848b47ac542d4c0c633f34ac32342Deposit ETH37090672023-02-26 22:55:1223 days 22 hrs ago0x58a3e388a564fa5de8ecd786030092d56d463ce5 IN  0xfa28ddb74b08b2b6430f5f61a1dd5104268cc29e0.157 MOVR0.000178275
0xe15aae030c9eb43ef6243337800fe78d6b59cae6d70172357e744e628111a592Deposit ETH37051222023-02-26 9:25:4224 days 12 hrs ago0x67b5fb289c4701596e28bc3622e1f0021ee3bd24 IN  0xfa28ddb74b08b2b6430f5f61a1dd5104268cc29e22 MOVR0.0001783
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x11433f0134692cba6f73c67044e73c7d0da8ae44ffbbefb4b9adab6c863da6db38714672023-03-22 4:54:5416 hrs 54 mins ago 0xfa28ddb74b08b2b6430f5f61a1dd5104268cc29e Moonbeam Foundation: WMOVR Token0.15 MOVR
0xb028f456211d22e2b84a02ba8c3f6f5a46004399d0450e88ee8360946b07a7dc38558942023-03-20 0:03:482 days 21 hrs ago 0xfa28ddb74b08b2b6430f5f61a1dd5104268cc29e Moonbeam Foundation: WMOVR Token0.28 MOVR
0x774f2df1fefe41a74d8dc25a3741d3e28f32b4e074efc4d90ea7c8ca11f774e538193932023-03-14 20:22:548 days 1 hr ago 0xfa28ddb74b08b2b6430f5f61a1dd5104268cc29e Moonbeam Foundation: WMOVR Token7.407674281969343224 MOVR
0x46e53ff585b246c117c4b30182606ab7431056bfd75f82e00c8aaf2be1ada00e38168472023-03-14 11:44:128 days 10 hrs ago 0xfa28ddb74b08b2b6430f5f61a1dd5104268cc29e Moonbeam Foundation: WMOVR Token0.46 MOVR
0x10b1ce0cf6f048388a4dea2f1c85ad79b702d7387680e98b51c3bd2352ad941938102302023-03-13 13:13:549 days 8 hrs ago 0xfa28ddb74b08b2b6430f5f61a1dd5104268cc29e Moonbeam Foundation: WMOVR Token0.7 MOVR
0x73b53ade7ab07c6245043db804f8d7c24b229889865f85d98d07f4698b371c9437930832023-03-11 2:27:0611 days 19 hrs ago 0xfa28ddb74b08b2b6430f5f61a1dd5104268cc29e Moonbeam Foundation: WMOVR Token9 MOVR
0x03b66e86e49b8415aacfa4948b4cb857885bf0a20845662a3793e494eefb72b537858802023-03-09 21:39:5413 days 9 mins ago 0xfa28ddb74b08b2b6430f5f61a1dd5104268cc29e Moonbeam Foundation: WMOVR Token3 MOVR
0x8c88e44a1a6b2250a96b440d242bd06ca4c0386ee1979187e45505a2c10db24737529242023-03-05 5:37:4917 days 16 hrs ago 0xfa28ddb74b08b2b6430f5f61a1dd5104268cc29e Moonbeam Foundation: WMOVR Token0.535 MOVR
0xe081c53e41643ab8e562496533a137d3618bfcae902dbccb7da17a3fea20064a37442042023-03-03 23:57:3018 days 21 hrs ago 0xfa28ddb74b08b2b6430f5f61a1dd5104268cc29e Moonbeam Foundation: WMOVR Token3.6 MOVR
0x186791ba183a7ef3369ec0bf7307f1316fab3f2c8f76ae75a71e0e5efa7be21937391182023-03-03 6:37:3619 days 15 hrs ago 0xfa28ddb74b08b2b6430f5f61a1dd5104268cc29e Moonbeam Foundation: WMOVR Token0.1 MOVR
0xab8dd3ab14a619b71609631f6d5140c0d3ecd1a257487e7785991af603916cf537344302023-03-02 14:36:0620 days 7 hrs ago 0xfa28ddb74b08b2b6430f5f61a1dd5104268cc29e Moonbeam Foundation: WMOVR Token8.8 MOVR
0x64311dd21b00eaf0ea9d49b2a953a19adf7848b47ac542d4c0c633f34ac3234237090672023-02-26 22:55:1223 days 22 hrs ago 0xfa28ddb74b08b2b6430f5f61a1dd5104268cc29e Moonbeam Foundation: WMOVR Token0.157 MOVR
0xe15aae030c9eb43ef6243337800fe78d6b59cae6d70172357e744e628111a59237051222023-02-26 9:25:4224 days 12 hrs ago 0xfa28ddb74b08b2b6430f5f61a1dd5104268cc29e Moonbeam Foundation: WMOVR Token22 MOVR
0x8287d4ef41fda20c98024d3b51d17d62ea44b2fe1427a78448d7f6a914aa557c36990112023-02-25 12:28:3025 days 9 hrs ago 0xfa28ddb74b08b2b6430f5f61a1dd5104268cc29e Moonbeam Foundation: WMOVR Token5.6 MOVR
0x99deb2ced6fb9550496f54b87e5a2ce80d75f4a09367ceb0c603a1f640f783a336854342023-02-23 14:23:5427 days 7 hrs ago 0xfa28ddb74b08b2b6430f5f61a1dd5104268cc29e Moonbeam Foundation: WMOVR Token0.1342 MOVR
0x94b19df5c719f2256a31b9393a9dbf6b4bbd15b02c7e7bbc69986f8c96e7f99036455262023-02-17 21:47:3033 days 1 min ago 0xfa28ddb74b08b2b6430f5f61a1dd5104268cc29e Moonbeam Foundation: WMOVR Token72 MOVR
0x6137087346cb7082260d48f79f6a3cf4e1d643effca7feb8f2dde752231fca3736409752023-02-17 6:17:4833 days 15 hrs ago 0xfa28ddb74b08b2b6430f5f61a1dd5104268cc29e Moonbeam Foundation: WMOVR Token0.5 MOVR
0xe4e5d667763cefdefe5dc4a25131f455c3eaf0081a90952e64e86ae91a9f85b636401532023-02-17 3:30:4233 days 18 hrs ago 0xfa28ddb74b08b2b6430f5f61a1dd5104268cc29e Moonbeam Foundation: WMOVR Token0.232 MOVR
0x037c79a03903cc03fcc7754a9bd488d91843d14541508f34ea11d61fdf15077a36114772023-02-13 2:10:3637 days 19 hrs ago 0xfa28ddb74b08b2b6430f5f61a1dd5104268cc29e Moonbeam Foundation: WMOVR Token99 MOVR
0x547cc8d08d7a2c76154e2d7f41cac8343d5a76a91089083a58d3295464013c5136079332023-02-12 14:06:4238 days 7 hrs ago 0xfa28ddb74b08b2b6430f5f61a1dd5104268cc29e Moonbeam Foundation: WMOVR Token0.1 MOVR
0xae5d9c2422cd41f90c41f82ce2d823804ef6d1c13a1e238416e6686dfdbae99a35943202023-02-10 15:47:4840 days 6 hrs ago 0xfa28ddb74b08b2b6430f5f61a1dd5104268cc29e Moonbeam Foundation: WMOVR Token0.185 MOVR
0x35f347fa3278258d68b5f6ec234576944749b2497789a1132fc849ca5267b03135943052023-02-10 15:44:4840 days 6 hrs ago 0xfa28ddb74b08b2b6430f5f61a1dd5104268cc29e Moonbeam Foundation: WMOVR Token1 MOVR
0xb734a83f2fb4d046a4262d1a2f8b78ee552f189080433805a5b5d3a3118e223735897222023-02-10 0:09:1240 days 21 hrs ago 0xfa28ddb74b08b2b6430f5f61a1dd5104268cc29e Moonbeam Foundation: WMOVR Token0.2 MOVR
0x06d6a8dae95cbefcf4992703ed62f02cc702549cfee1b980ace231605b16875435808772023-02-08 17:59:5442 days 3 hrs ago 0xfa28ddb74b08b2b6430f5f61a1dd5104268cc29e Moonbeam Foundation: WMOVR Token21.77 MOVR
0x4c16075e60ac48888996abb4624df5e84937880262f9dc8d91e5c3d7cb19b85735797442023-02-08 14:06:0642 days 7 hrs ago 0xfa28ddb74b08b2b6430f5f61a1dd5104268cc29e Moonbeam Foundation: WMOVR Token32 MOVR
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
MoonriverBridgeZap

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 10000 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Standard Json-Input format)

File 1 of 11 : SafeMath.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
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) {
        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) {
        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) {
        // 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) {
        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) {
        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) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");
        return c;
    }

    /**
     * @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) {
        require(b <= a, "SafeMath: subtraction overflow");
        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) {
        if (a == 0) return 0;
        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }

    /**
     * @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. 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) internal pure returns (uint256) {
        require(b > 0, "SafeMath: division by zero");
        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) {
        require(b > 0, "SafeMath: modulo by zero");
        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) {
        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.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryDiv}.
     *
     * 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) {
        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) {
        require(b > 0, errorMessage);
        return a % b;
    }
}

File 2 of 11 : ERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

import "../../utils/Context.sol";
import "./IERC20.sol";
import "../../math/SafeMath.sol";

/**
 * @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 {
    using SafeMath for uint256;

    mapping (address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;
    uint8 private _decimals;

    /**
     * @dev Sets the values for {name} and {symbol}, initializes {decimals} with
     * a default value of 18.
     *
     * To select a different value for {decimals}, use {_setupDecimals}.
     *
     * All three of these values are immutable: they can only be set once during
     * construction.
     */
    constructor (string memory name_, string memory symbol_) public {
        _name = name_;
        _symbol = symbol_;
        _decimals = 18;
    }

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

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual 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 {_setupDecimals} is
     * called.
     *
     * 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 returns (uint8) {
        return _decimals;
    }

    /**
     * @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);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        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].add(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) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        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);

        _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
        _balances[recipient] = _balances[recipient].add(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 = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(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);

        _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
        _totalSupply = _totalSupply.sub(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 Sets {decimals} to a value other than the default one of 18.
     *
     * WARNING: This function should only be called from the constructor. Most
     * applications that interact with token contracts will not expect
     * {decimals} to ever change, and may work incorrectly if it does.
     */
    function _setupDecimals(uint8 decimals_) internal virtual {
        _decimals = decimals_;
    }

    /**
     * @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 3 of 11 : ERC20Burnable.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

import "../../utils/Context.sol";
import "./ERC20.sol";

/**
 * @dev Extension of {ERC20} that allows token holders to destroy both their own
 * tokens and those that they have an allowance for, in a way that can be
 * recognized off-chain (via event analysis).
 */
abstract contract ERC20Burnable is Context, ERC20 {
    using SafeMath for uint256;

    /**
     * @dev Destroys `amount` tokens from the caller.
     *
     * See {ERC20-_burn}.
     */
    function burn(uint256 amount) public virtual {
        _burn(_msgSender(), amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, deducting from the caller's
     * allowance.
     *
     * See {ERC20-_burn} and {ERC20-allowance}.
     *
     * Requirements:
     *
     * - the caller must have allowance for ``accounts``'s tokens of at least
     * `amount`.
     */
    function burnFrom(address account, uint256 amount) public virtual {
        uint256 decreasedAllowance = allowance(account, _msgSender()).sub(amount, "ERC20: burn amount exceeds allowance");

        _approve(account, _msgSender(), decreasedAllowance);
        _burn(account, amount);
    }
}

File 4 of 11 : IERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <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 5 of 11 : SafeERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

import "./IERC20.sol";
import "../../math/SafeMath.sol";
import "../../utils/Address.sol";

/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using SafeMath for uint256;
    using Address for address;

    function safeTransfer(IERC20 token, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(IERC20 token, address spender, uint256 value) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        // solhint-disable-next-line max-line-length
        require((value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).add(value);
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero");
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) { // Return data is optional
            // solhint-disable-next-line max-line-length
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

File 6 of 11 : Address.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.2 <0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain`call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
      return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

File 7 of 11 : Context.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <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 GSN 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 payable) {
        return msg.sender;
    }

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

File 8 of 11 : ISwap.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.6.12;

import '@openzeppelin/contracts/token/ERC20/ERC20.sol';

interface ISwap {
  // pool data view functions
  function getA() external view returns (uint256);

  function getToken(uint8 index) external view returns (IERC20);

  function getTokenIndex(address tokenAddress) external view returns (uint8);

  function getTokenBalance(uint8 index) external view returns (uint256);

  function getVirtualPrice() external view returns (uint256);

  // min return calculation functions
  function calculateSwap(
    uint8 tokenIndexFrom,
    uint8 tokenIndexTo,
    uint256 dx
  ) external view returns (uint256);

  function calculateTokenAmount(uint256[] calldata amounts, bool deposit)
    external
    view
    returns (uint256);

  function calculateRemoveLiquidity(uint256 amount)
    external
    view
    returns (uint256[] memory);

  function calculateRemoveLiquidityOneToken(
    uint256 tokenAmount,
    uint8 tokenIndex
  ) external view returns (uint256 availableTokenAmount);

  // state modifying functions
  function initialize(
    IERC20[] memory pooledTokens,
    uint8[] memory decimals,
    string memory lpTokenName,
    string memory lpTokenSymbol,
    uint256 a,
    uint256 fee,
    uint256 adminFee,
    address lpTokenTargetAddress
  ) external;

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

  function addLiquidity(
    uint256[] calldata amounts,
    uint256 minToMint,
    uint256 deadline
  ) external returns (uint256);

  function removeLiquidity(
    uint256 amount,
    uint256[] calldata minAmounts,
    uint256 deadline
  ) external returns (uint256[] memory);

  function removeLiquidityOneToken(
    uint256 tokenAmount,
    uint8 tokenIndex,
    uint256 minAmount,
    uint256 deadline
  ) external returns (uint256);

  function removeLiquidityImbalance(
    uint256[] calldata amounts,
    uint256 maxBurnAmount,
    uint256 deadline
  ) external returns (uint256);
}

File 9 of 11 : ISynapseBridge.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.6.12;

import '@openzeppelin/contracts/token/ERC20/SafeERC20.sol';
import '@openzeppelin/contracts/token/ERC20/ERC20Burnable.sol';

interface ISynapseBridge {
  using SafeERC20 for IERC20;

  function deposit(
    address to,
    uint256 chainId,
    IERC20 token,
    uint256 amount
  ) external;

  function depositAndSwap(
    address to,
    uint256 chainId,
    IERC20 token,
    uint256 amount,
    uint8 tokenIndexFrom,
    uint8 tokenIndexTo,
    uint256 minDy,
    uint256 deadline
  ) external;

  function redeem(
    address to,
    uint256 chainId,
    IERC20 token,
    uint256 amount
  ) external;

  function redeemAndSwap(
    address to,
    uint256 chainId,
    IERC20 token,
    uint256 amount,
    uint8 tokenIndexFrom,
    uint8 tokenIndexTo,
    uint256 minDy,
    uint256 deadline
  ) external;

  function redeemAndRemove(
    address to,
    uint256 chainId,
    IERC20 token,
    uint256 amount,
    uint8 liqTokenIndex,
    uint256 liqMinAmount,
    uint256 liqDeadline
  ) external;
}

File 10 of 11 : IWETH9.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.4.0;

interface IWETH9 {
    function name() external view returns (string memory);

    function symbol() external view returns (string memory);

    function decimals() external view returns (uint8);

    function balanceOf(address) external view returns (uint256);

    function allowance(address, address) external view returns (uint256);

    receive() external payable;

    function deposit() external payable;

    function withdraw(uint256 wad) external;

    function totalSupply() external view returns (uint256);

    function approve(address guy, uint256 wad) external returns (bool);

    function transfer(address dst, uint256 wad) external returns (bool);

    function transferFrom(
        address src,
        address dst,
        uint256 wad
    ) external returns (bool);
}

File 11 of 11 : MoonriverBridgeZap.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;

import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC20/SafeERC20.sol";
import "../interfaces/ISwap.sol";
import "../interfaces/ISynapseBridge.sol";
import "../interfaces/IWETH9.sol";

interface IFrax {
    function exchangeCanonicalForOld(address bridge_token_address, uint256 token_amount) external returns (uint256);
}

contract MoonriverBridgeZap {
    using SafeERC20 for IERC20;

    ISynapseBridge synapseBridge;
    address payable public immutable WETH_ADDRESS;
    IFrax private  constant CANOLICAL_FRAX = IFrax(0x1A93B23281CC1CDE4C4741353F3064709A16197d);
    IERC20 private constant SYN_FRAX = IERC20(0xE96AC70907ffF3Efee79f502C985A7A21Bce407d);

    mapping(address => address) public swapMap;
    mapping(address => IERC20[]) public swapTokensMap;

    uint256 constant MAX_UINT256 = 2**256 - 1;

    constructor(
        address payable _wethAddress,
        address _swapOne,
        address tokenOne,
        address _swapTwo,
        address tokenTwo,
        ISynapseBridge _synapseBridge
    ) public {
        WETH_ADDRESS = _wethAddress;
        synapseBridge = _synapseBridge;
        swapMap[tokenOne] = _swapOne;
        swapMap[tokenTwo] = _swapTwo;
        IERC20(_wethAddress).safeIncreaseAllowance(address(_synapseBridge), MAX_UINT256);
        if (address(_swapOne) != address(0)) {
            {
                uint8 i;
                for (; i < 32; i++) {
                    try ISwap(_swapOne).getToken(i) returns (
                        IERC20 token
                    ) {
                        swapTokensMap[_swapOne].push(token);
                        token.safeApprove(address(_swapOne), MAX_UINT256);
                        token.safeApprove(address(synapseBridge), MAX_UINT256);
                    } catch {
                        break;
                    }
                }
                require(i > 1, "swap must have at least 2 tokens");
            }
        }
        if (address(_swapTwo) != address(0)) {
            {
                uint8 i;
                for (; i < 32; i++) {
                    try ISwap(_swapTwo).getToken(i) returns (
                        IERC20 token
                    ) {
                        swapTokensMap[_swapTwo].push(token);
                        token.safeApprove(address(_swapTwo), MAX_UINT256);
                        token.safeApprove(address(synapseBridge), MAX_UINT256);
                    } catch {
                        break;
                    }
                }
                require(i > 1, "swap must have at least 2 tokens");
            }
        }
    }

    /**
     * @notice Calculate amount of tokens you receive on swap
     * @param tokenIndexFrom the token the user wants to sell
     * @param tokenIndexTo the token the user wants to buy
     * @param dx the amount of tokens the user wants to sell. If the token charges
     * a fee on transfers, use the amount that gets transferred after the fee.
     * @return amount of tokens the user will receive
     */
    function calculateSwap(
        IERC20 token,
        uint8 tokenIndexFrom,
        uint8 tokenIndexTo,
        uint256 dx
    ) external view virtual returns (uint256) {
        ISwap swap = ISwap(
            swapMap[address(token)]
        );
        return swap.calculateSwap(tokenIndexFrom, tokenIndexTo, dx);
    }

    function swapAndRedeem(
        address to,
        uint256 chainId,
        IERC20 token,
        uint8 tokenIndexFrom,
        uint8 tokenIndexTo,
        uint256 dx,
        uint256 minDy,
        uint256 deadline
    ) external {
        ISwap swap = ISwap(swapMap[address(token)]);
        require(address(swap) != address(0), "Swap is 0x00");
        IERC20[] memory tokens = swapTokensMap[address(swap)];
        tokens[tokenIndexFrom].safeTransferFrom(
            msg.sender,
            address(this),
            dx
        );
        // swap

        uint256 swappedAmount = swap.swap(
            tokenIndexFrom,
            tokenIndexTo,
            dx,
            minDy,
            deadline
        );
        // deposit into bridge, gets nUSD
        if (
            token.allowance(address(this), address(synapseBridge)) <
            swappedAmount
        ) {
            token.safeApprove(address(synapseBridge), MAX_UINT256);
        }
        synapseBridge.redeem(to, chainId, token, swappedAmount);
    }

    function swapAndRedeemAndSwap(
        address to,
        uint256 chainId,
        IERC20 token,
        uint8 tokenIndexFrom,
        uint8 tokenIndexTo,
        uint256 dx,
        uint256 minDy,
        uint256 deadline,
        uint8 swapTokenIndexFrom,
        uint8 swapTokenIndexTo,
        uint256 swapMinDy,
        uint256 swapDeadline
    ) external {
        require(
            address(swapMap[address(token)]) != address(0),
            "Swap is 0x00"
        );
        IERC20[] memory tokens = swapTokensMap[
            swapMap[address(token)]
        ];
        tokens[tokenIndexFrom].safeTransferFrom(
            msg.sender,
            address(this),
            dx
        );
        // swap

        uint256 swappedAmount = ISwap(swapMap[address(token)]).swap(tokenIndexFrom, tokenIndexTo, dx, minDy, deadline);
        // deposit into bridge, gets nUSD
        if (
            token.allowance(address(this), address(synapseBridge)) <
            swappedAmount
        ) {
            token.safeApprove(address(synapseBridge), MAX_UINT256);
        }
        synapseBridge.redeemAndSwap(
            to,
            chainId,
            token,
            swappedAmount,
            swapTokenIndexFrom,
            swapTokenIndexTo,
            swapMinDy,
            swapDeadline
        );
    }

    function swapAndRedeemAndRemove(
        address to,
        uint256 chainId,
        IERC20 token,
        uint8 tokenIndexFrom,
        uint8 tokenIndexTo,
        uint256 dx,
        uint256 minDy,
        uint256 deadline,
        uint8 liqTokenIndex,
        uint256 liqMinAmount,
        uint256 liqDeadline
    ) external {
        ISwap swap = ISwap(swapMap[address(token)]);
        require(address(swap) != address(0), "Swap is 0x00");
        IERC20[] memory tokens = swapTokensMap[address(swap)];
        tokens[tokenIndexFrom].safeTransferFrom(
            msg.sender,
            address(this),
            dx
        );
        // swap

        uint256 swappedAmount = swap.swap(
            tokenIndexFrom,
            tokenIndexTo,
            dx,
            minDy,
            deadline
        );
        // deposit into bridge, gets nUSD
        if (
            token.allowance(address(this), address(synapseBridge)) <
            swappedAmount
        ) {
            token.safeApprove(address(synapseBridge), MAX_UINT256);
        }
        synapseBridge.redeemAndRemove(
            to,
            chainId,
            token,
            swappedAmount,
            liqTokenIndex,
            liqMinAmount,
            liqDeadline
        );
    }

    /**
     * @notice wraps SynapseBridge redeem()
     * @param to address on other chain to redeem underlying assets to
     * @param chainId which underlying chain to bridge assets onto
     * @param token ERC20 compatible token to deposit into the bridge
     * @param amount Amount in native token decimals to transfer cross-chain pre-fees
     **/
    function redeem(
        address to,
        uint256 chainId,
        IERC20 token,
        uint256 amount
    ) external {
        token.safeTransferFrom(msg.sender, address(this), amount);
        if (address(token) == address(CANOLICAL_FRAX)) {
            uint256 swappedAmount = CANOLICAL_FRAX.exchangeCanonicalForOld(address(SYN_FRAX), amount);
            if (SYN_FRAX.allowance(address(this), address(synapseBridge)) < amount) {
                SYN_FRAX.safeApprove(address(synapseBridge), MAX_UINT256);
            }
            synapseBridge.redeem(to, chainId, SYN_FRAX, swappedAmount);
        } else {
            if (token.allowance(address(this), address(synapseBridge)) < amount) {
                token.safeApprove(address(synapseBridge), MAX_UINT256);
            }
            synapseBridge.redeem(to, chainId, token, amount);
        }
        
    }

    /**
     * @notice wraps SynapseBridge redeem()
     * @param to address on other chain to redeem underlying assets to
     * @param chainId which underlying chain to bridge assets onto
     * @param token ERC20 compatible token to deposit into the bridge
     * @param amount Amount in native token decimals to transfer cross-chain pre-fees
     **/
    function deposit(
        address to,
        uint256 chainId,
        IERC20 token,
        uint256 amount
    ) external {
        token.safeTransferFrom(msg.sender, address(this), amount);
        if (token.allowance(address(this), address(synapseBridge)) < amount) {
            token.safeApprove(address(synapseBridge), MAX_UINT256);
        }
        synapseBridge.deposit(to, chainId, token, amount);
    }

    /**
   * @notice Wraps SynapseBridge deposit() function to make it compatible w/ ETH -> WETH conversions
   * @param to address on other chain to bridge assets to
   * @param chainId which chain to bridge assets onto
   * @param amount Amount in native token decimals to transfer cross-chain pre-fees
   **/
  function depositETH(
    address to,
    uint256 chainId,
    uint256 amount
    ) external payable {
      require(msg.value > 0 && msg.value == amount, 'INCORRECT MSG VALUE');
      IWETH9(WETH_ADDRESS).deposit{value: msg.value}();
      synapseBridge.deposit(to, chainId, IERC20(WETH_ADDRESS), amount);
    }



    function swapETHAndRedeem(
        address to,
        uint256 chainId,
        IERC20 token,
        uint8 tokenIndexFrom,
        uint8 tokenIndexTo,
        uint256 dx,
        uint256 minDy,
        uint256 deadline
    ) external payable {
        require(WETH_ADDRESS != address(0), "WETH 0");
        require(msg.value > 0 && msg.value == dx, "INCORRECT MSG VALUE");
        ISwap swap = ISwap(swapMap[address(token)]);
        require(address(swap) != address(0), "Swap is 0x00");
        IWETH9(WETH_ADDRESS).deposit{value: msg.value}();

        // swap
        uint256 swappedAmount = swap.swap(
            tokenIndexFrom,
            tokenIndexTo,
            dx,
            minDy,
            deadline
        );
        synapseBridge.redeem(to, chainId, token, swappedAmount);
    }

    /**
     * @notice Wraps redeemAndSwap on SynapseBridge.sol
     * Relays to nodes that (typically) a wrapped synAsset ERC20 token has been burned and the underlying needs to be redeeemed on the native chain. This function indicates to the nodes that they should attempt to redeem the LP token for the underlying assets (E.g "swap" out of the LP token)
     * @param to address on other chain to redeem underlying assets to
     * @param chainId which underlying chain to bridge assets onto
     * @param token ERC20 compatible token to deposit into the bridge
     * @param amount Amount in native token decimals to transfer cross-chain pre-fees
     * @param tokenIndexFrom the token the user wants to swap from
     * @param tokenIndexTo the token the user wants to swap to
     * @param minDy the min amount the user would like to receive, or revert to only minting the SynERC20 token crosschain.
     * @param deadline latest timestamp to accept this transaction
     **/
    function redeemAndSwap(
        address to,
        uint256 chainId,
        IERC20 token,
        uint256 amount,
        uint8 tokenIndexFrom,
        uint8 tokenIndexTo,
        uint256 minDy,
        uint256 deadline
    ) external {
        token.safeTransferFrom(msg.sender, address(this), amount);
        if (token.allowance(address(this), address(synapseBridge)) < amount) {
            token.safeApprove(address(synapseBridge), MAX_UINT256);
        }
        synapseBridge.redeemAndSwap(
            to,
            chainId,
            token,
            amount,
            tokenIndexFrom,
            tokenIndexTo,
            minDy,
            deadline
        );
    }

    /**
     * @notice Wraps redeemAndRemove on SynapseBridge
     * Relays to nodes that (typically) a wrapped synAsset ERC20 token has been burned and the underlying needs to be redeeemed on the native chain. This function indicates to the nodes that they should attempt to redeem the LP token for the underlying assets (E.g "swap" out of the LP token)
     * @param to address on other chain to redeem underlying assets to
     * @param chainId which underlying chain to bridge assets onto
     * @param token ERC20 compatible token to deposit into the bridge
     * @param amount Amount of (typically) LP token to pass to the nodes to attempt to removeLiquidity() with to redeem for the underlying assets of the LP token
     * @param liqTokenIndex Specifies which of the underlying LP assets the nodes should attempt to redeem for
     * @param liqMinAmount Specifies the minimum amount of the underlying asset needed for the nodes to execute the redeem/swap
     * @param liqDeadline Specificies the deadline that the nodes are allowed to try to redeem/swap the LP token
     **/
    function redeemAndRemove(
        address to,
        uint256 chainId,
        IERC20 token,
        uint256 amount,
        uint8 liqTokenIndex,
        uint256 liqMinAmount,
        uint256 liqDeadline
    ) external {
        token.safeTransferFrom(msg.sender, address(this), amount);
        if (token.allowance(address(this), address(synapseBridge)) < amount) {
            token.safeApprove(address(synapseBridge), MAX_UINT256);
        }
        synapseBridge.redeemAndRemove(
            to,
            chainId,
            token,
            amount,
            liqTokenIndex,
            liqMinAmount,
            liqDeadline
        );
    }
}

Settings
{
  "evmVersion": "istanbul",
  "libraries": {},
  "metadata": {
    "bytecodeHash": "ipfs",
    "useLiteralContent": true
  },
  "optimizer": {
    "enabled": true,
    "runs": 10000
  },
  "remappings": [],
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  }
}

Contract ABI

[{"inputs":[{"internalType":"address payable","name":"_wethAddress","type":"address"},{"internalType":"address","name":"_swapOne","type":"address"},{"internalType":"address","name":"tokenOne","type":"address"},{"internalType":"address","name":"_swapTwo","type":"address"},{"internalType":"address","name":"tokenTwo","type":"address"},{"internalType":"contract ISynapseBridge","name":"_synapseBridge","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"WETH_ADDRESS","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint8","name":"tokenIndexFrom","type":"uint8"},{"internalType":"uint8","name":"tokenIndexTo","type":"uint8"},{"internalType":"uint256","name":"dx","type":"uint256"}],"name":"calculateSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"depositETH","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"redeem","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint8","name":"liqTokenIndex","type":"uint8"},{"internalType":"uint256","name":"liqMinAmount","type":"uint256"},{"internalType":"uint256","name":"liqDeadline","type":"uint256"}],"name":"redeemAndRemove","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint8","name":"tokenIndexFrom","type":"uint8"},{"internalType":"uint8","name":"tokenIndexTo","type":"uint8"},{"internalType":"uint256","name":"minDy","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"redeemAndSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint8","name":"tokenIndexFrom","type":"uint8"},{"internalType":"uint8","name":"tokenIndexTo","type":"uint8"},{"internalType":"uint256","name":"dx","type":"uint256"},{"internalType":"uint256","name":"minDy","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapAndRedeem","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint8","name":"tokenIndexFrom","type":"uint8"},{"internalType":"uint8","name":"tokenIndexTo","type":"uint8"},{"internalType":"uint256","name":"dx","type":"uint256"},{"internalType":"uint256","name":"minDy","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"liqTokenIndex","type":"uint8"},{"internalType":"uint256","name":"liqMinAmount","type":"uint256"},{"internalType":"uint256","name":"liqDeadline","type":"uint256"}],"name":"swapAndRedeemAndRemove","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint8","name":"tokenIndexFrom","type":"uint8"},{"internalType":"uint8","name":"tokenIndexTo","type":"uint8"},{"internalType":"uint256","name":"dx","type":"uint256"},{"internalType":"uint256","name":"minDy","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"swapTokenIndexFrom","type":"uint8"},{"internalType":"uint8","name":"swapTokenIndexTo","type":"uint8"},{"internalType":"uint256","name":"swapMinDy","type":"uint256"},{"internalType":"uint256","name":"swapDeadline","type":"uint256"}],"name":"swapAndRedeemAndSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint8","name":"tokenIndexFrom","type":"uint8"},{"internalType":"uint8","name":"tokenIndexTo","type":"uint8"},{"internalType":"uint256","name":"dx","type":"uint256"},{"internalType":"uint256","name":"minDy","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapETHAndRedeem","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"swapMap","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"swapTokensMap","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

60a06040523480156200001157600080fd5b5060405162002db438038062002db4833981810160405260c08110156200003757600080fd5b50805160208083015160408085015160608087015160808089015160a0909901519288901b6001600160601b0319169052600080546001600160a01b03199081166001600160a01b0380861691909117835580861683526001895286832080548316828a16179055808b1683529590912080549091168583161790559596939591949193929091620000db91881690839060001990620003cf811b62001c8c17901c565b6001600160a01b038516156200024f5760005b60208160ff1610156200020557856001600160a01b03166382b86600826040518263ffffffff1660e01b8152600401808260ff16815260200191505060206040518083038186803b1580156200014357600080fd5b505afa9250505080156200016a57506040513d60208110156200016557600080fd5b505160015b620001755762000205565b6001600160a01b038781166000908152600260209081526040822080546001810182559083529181902090910180546001600160a01b0319169284169283179055620001d19190899060001990620004d8811b62001da517901c565b600054620001fb906001600160a01b038381169116600019620004d8602090811b62001da517901c565b50600101620000ee565b60018160ff16116200024d576040805162461bcd60e51b8152602060048201819052602482015260008051602062002d34833981519152604482015290519081900360640190fd5b505b6001600160a01b03831615620003c35760005b60208160ff1610156200037957836001600160a01b03166382b86600826040518263ffffffff1660e01b8152600401808260ff16815260200191505060206040518083038186803b158015620002b757600080fd5b505afa925050508015620002de57506040513d6020811015620002d957600080fd5b505160015b620002e95762000379565b6001600160a01b038581166000908152600260209081526040822080546001810182559083529181902090910180546001600160a01b0319169284169283179055620003459190879060001990620004d8811b62001da517901c565b6000546200036f906001600160a01b038381169116600019620004d8602090811b62001da517901c565b5060010162000262565b60018160ff1611620003c1576040805162461bcd60e51b8152602060048201819052602482015260008051602062002d34833981519152604482015290519081900360640190fd5b505b5050505050506200094b565b60006200047682856001600160a01b031663dd62ed3e30876040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b031681526020019250505060206040518083038186803b1580156200043557600080fd5b505afa1580156200044a573d6000803e3d6000fd5b505050506040513d60208110156200046157600080fd5b505190620005fc602090811b62001f0417901c565b604080516001600160a01b038616602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152919250620004d2918691906200065e16565b50505050565b80158062000562575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b1580156200053257600080fd5b505afa15801562000547573d6000803e3d6000fd5b505050506040513d60208110156200055e57600080fd5b5051155b6200059f5760405162461bcd60e51b815260040180806020018281038252603681526020018062002d7e6036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152620005f79185916200065e16565b505050565b60008282018381101562000657576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6060620006ba826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166200071a60201b62001f65179092919060201c565b805190915015620005f757808060200190516020811015620006db57600080fd5b5051620005f75760405162461bcd60e51b815260040180806020018281038252602a81526020018062002d54602a913960400191505060405180910390fd5b60606200072b848460008562000733565b949350505050565b606082471015620007765760405162461bcd60e51b815260040180806020018281038252602681526020018062002d0e6026913960400191505060405180910390fd5b62000781856200089b565b620007d3576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b60208310620008145780518252601f199092019160209182019101620007f3565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811462000878576040519150601f19603f3d011682016040523d82523d6000602084013e6200087d565b606091505b50909250905062000890828286620008a1565b979650505050505050565b3b151590565b60608315620008b257508162000657565b825115620008c35782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156200090f578181015183820152602001620008f5565b50505050905090810190601f1680156200093d5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b60805160601c6123916200097d6000398061051d5280610d415280610e8952806117ad528061186052506123916000f3fe6080604052600436106100d25760003560e01c8063798af7201161007f57806390d250741161005957806390d25074146103d65780639f3307271461041d578063ce0b63ce146104a2578063f3f094a1146104d4576100d2565b8063798af720146102de578063839ed90a1461033c57806385528f0b146103a3576100d2565b8063393494b8116100b0578063393494b8146101e45780634a517a551461021d57806365749c9d14610284576100d2565b8063040141e5146100d7578063174dc9521461010857806336e712ed14610188575b600080fd5b3480156100e357600080fd5b506100ec61051b565b604080516001600160a01b039092168252519081900360200190f35b34801561011457600080fd5b50610186600480360361016081101561012c57600080fd5b506001600160a01b0381358116916020810135916040820135169060ff6060820135811691608081013582169160a08201359160c08101359160e0820135916101008101359091169061012081013590610140013561053f565b005b34801561019457600080fd5b50610186600480360360e08110156101ab57600080fd5b506001600160a01b0381358116916020810135916040820135169060608101359060ff6080820135169060a08101359060c00135610888565b3480156101f057600080fd5b506100ec6004803603604081101561020757600080fd5b506001600160a01b038135169060200135610a09565b34801561022957600080fd5b50610186600480360361010081101561024157600080fd5b506001600160a01b0381358116916020810135916040820135169060ff606082013581169160808101359091169060a08101359060c08101359060e00135610a3e565b610186600480360361010081101561029b57600080fd5b506001600160a01b0381358116916020810135916040820135169060ff606082013581169160808101359091169060a08101359060c08101359060e00135610d3f565b3480156102ea57600080fd5b5061032a6004803603608081101561030157600080fd5b506001600160a01b038135169060ff60208201358116916040810135909116906060013561104b565b60408051918252519081900360200190f35b34801561034857600080fd5b50610186600480360361010081101561036057600080fd5b506001600160a01b0381358116916020810135916040820135169060608101359060ff608082013581169160a08101359091169060c08101359060e00135611104565b3480156103af57600080fd5b506100ec600480360360208110156103c657600080fd5b50356001600160a01b031661128f565b3480156103e257600080fd5b50610186600480360360808110156103f957600080fd5b506001600160a01b03813581169160208101359160408201351690606001356112aa565b34801561042957600080fd5b50610186600480360361018081101561044157600080fd5b506001600160a01b0381358116916020810135916040820135169060ff6060820135811691608081013582169160a08201359160c08101359160e0820135916101008101358216916101208201351690610140810135906101600135611411565b610186600480360360608110156104b857600080fd5b506001600160a01b03813516906020810135906040013561174b565b3480156104e057600080fd5b50610186600480360360808110156104f757600080fd5b506001600160a01b03813581169160208101359160408201351690606001356118d7565b7f000000000000000000000000000000000000000000000000000000000000000081565b6001600160a01b03808a1660009081526001602052604090205416806105ac576040805162461bcd60e51b815260206004820152600c60248201527f5377617020697320307830300000000000000000000000000000000000000000604482015290519081900360640190fd5b6001600160a01b03811660009081526002602090815260409182902080548351818402810184019094528084526060939283018282801561061657602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116105f8575b5050505050905061065333308a848e60ff168151811061063257fe5b60200260200101516001600160a01b0316611f7c909392919063ffffffff16565b604080517f9169558600000000000000000000000000000000000000000000000000000000815260ff808d1660048301528b166024820152604481018a9052606481018990526084810188905290516000916001600160a01b0385169163916955869160a48082019260209290919082900301818787803b1580156106d757600080fd5b505af11580156106eb573d6000803e3d6000fd5b505050506040513d602081101561070157600080fd5b5051600054604080517fdd62ed3e0000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03928316602482015290519293508392918f169163dd62ed3e91604480820192602092909190829003018186803b15801561077457600080fd5b505afa158015610788573d6000803e3d6000fd5b505050506040513d602081101561079e57600080fd5b505110156107c2576000546107c2906001600160a01b038e81169116600019611da5565b60008054906101000a90046001600160a01b03166001600160a01b03166336e712ed8f8f8f858b8b8b6040518863ffffffff1660e01b815260040180886001600160a01b03168152602001878152602001866001600160a01b031681526020018581526020018460ff168152602001838152602001828152602001975050505050505050600060405180830381600087803b15801561086057600080fd5b505af1158015610874573d6000803e3d6000fd5b505050505050505050505050505050505050565b61089d6001600160a01b038616333087611f7c565b600054604080517fdd62ed3e0000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b0392831660248201529051869288169163dd62ed3e916044808301926020929190829003018186803b15801561090957600080fd5b505afa15801561091d573d6000803e3d6000fd5b505050506040513d602081101561093357600080fd5b5051101561095757600054610957906001600160a01b038781169116600019611da5565b60008054604080517f36e712ed0000000000000000000000000000000000000000000000000000000081526001600160a01b038b81166004830152602482018b905289811660448301526064820189905260ff8816608483015260a4820187905260c48201869052915191909216926336e712ed9260e4808201939182900301818387803b1580156109e857600080fd5b505af11580156109fc573d6000803e3d6000fd5b5050505050505050505050565b60026020528160005260406000208181548110610a2257fe5b6000918252602090912001546001600160a01b03169150829050565b6001600160a01b038087166000908152600160205260409020541680610aab576040805162461bcd60e51b815260206004820152600c60248201527f5377617020697320307830300000000000000000000000000000000000000000604482015290519081900360640190fd5b6001600160a01b038116600090815260026020908152604091829020805483518184028101840190945280845260609392830182828015610b1557602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610af7575b50505050509050610b31333087848b60ff168151811061063257fe5b604080517f9169558600000000000000000000000000000000000000000000000000000000815260ff808a1660048301528816602482015260448101879052606481018690526084810185905290516000916001600160a01b0385169163916955869160a48082019260209290919082900301818787803b158015610bb557600080fd5b505af1158015610bc9573d6000803e3d6000fd5b505050506040513d6020811015610bdf57600080fd5b5051600054604080517fdd62ed3e0000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03928316602482015290519293508392918c169163dd62ed3e91604480820192602092909190829003018186803b158015610c5257600080fd5b505afa158015610c66573d6000803e3d6000fd5b505050506040513d6020811015610c7c57600080fd5b50511015610ca057600054610ca0906001600160a01b038b81169116600019611da5565b60008054604080517ff3f094a10000000000000000000000000000000000000000000000000000000081526001600160a01b038f81166004830152602482018f90528d81166044830152606482018690529151919092169263f3f094a1926084808201939182900301818387803b158015610d1a57600080fd5b505af1158015610d2e573d6000803e3d6000fd5b505050505050505050505050505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610dba576040805162461bcd60e51b815260206004820152600660248201527f5745544820300000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b600034118015610dc957508234145b610e1a576040805162461bcd60e51b815260206004820152601360248201527f494e434f5252454354204d53472056414c554500000000000000000000000000604482015290519081900360640190fd5b6001600160a01b038087166000908152600160205260409020541680610e87576040805162461bcd60e51b815260206004820152600c60248201527f5377617020697320307830300000000000000000000000000000000000000000604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015610ee257600080fd5b505af1158015610ef6573d6000803e3d6000fd5b5050604080517f9169558600000000000000000000000000000000000000000000000000000000815260ff808c1660048301528a1660248201526044810189905260648101889052608481018790529051600094506001600160a01b03861693506391695586925060a480830192602092919082900301818787803b158015610f7e57600080fd5b505af1158015610f92573d6000803e3d6000fd5b505050506040513d6020811015610fa857600080fd5b505160008054604080517ff3f094a10000000000000000000000000000000000000000000000000000000081526001600160a01b038f81166004830152602482018f90528d8116604483015260648201869052915194955091169263f3f094a19260848084019391929182900301818387803b15801561102757600080fd5b505af115801561103b573d6000803e3d6000fd5b5050505050505050505050505050565b6001600160a01b0380851660009081526001602090815260408083205481517fa95b089f00000000000000000000000000000000000000000000000000000000815260ff808a1660048301528816602482015260448101879052915193941692839263a95b089f9260648082019391829003018186803b1580156110ce57600080fd5b505afa1580156110e2573d6000803e3d6000fd5b505050506040513d60208110156110f857600080fd5b50519695505050505050565b6111196001600160a01b038716333088611f7c565b600054604080517fdd62ed3e0000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b0392831660248201529051879289169163dd62ed3e916044808301926020929190829003018186803b15801561118557600080fd5b505afa158015611199573d6000803e3d6000fd5b505050506040513d60208110156111af57600080fd5b505110156111d3576000546111d3906001600160a01b038881169116600019611da5565b60008054604080517f839ed90a0000000000000000000000000000000000000000000000000000000081526001600160a01b038c81166004830152602482018c90528a81166044830152606482018a905260ff808a166084840152881660a483015260c4820187905260e482018690529151919092169263839ed90a92610104808201939182900301818387803b15801561126d57600080fd5b505af1158015611281573d6000803e3d6000fd5b505050505050505050505050565b6001602052600090815260409020546001600160a01b031681565b6112bf6001600160a01b038316333084611f7c565b600054604080517fdd62ed3e0000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b0392831660248201529051839285169163dd62ed3e916044808301926020929190829003018186803b15801561132b57600080fd5b505afa15801561133f573d6000803e3d6000fd5b505050506040513d602081101561135557600080fd5b5051101561137957600054611379906001600160a01b038481169116600019611da5565b60008054604080517f90d250740000000000000000000000000000000000000000000000000000000081526001600160a01b03888116600483015260248201889052868116604483015260648201869052915191909216926390d25074926084808201939182900301818387803b1580156113f357600080fd5b505af1158015611407573d6000803e3d6000fd5b5050505050505050565b6001600160a01b038a81166000908152600160205260409020541661147d576040805162461bcd60e51b815260206004820152600c60248201527f5377617020697320307830300000000000000000000000000000000000000000604482015290519081900360640190fd5b6001600160a01b03808b16600090815260016020908152604080832054909316825260028152908290208054835181840281018401909452808452606093928301828280156114f557602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116114d7575b5050505050905061151133308a848e60ff168151811061063257fe5b6000600160008d6001600160a01b03166001600160a01b0316815260200190815260200160002060009054906101000a90046001600160a01b03166001600160a01b031663916955868c8c8c8c8c6040518663ffffffff1660e01b8152600401808660ff1681526020018560ff16815260200184815260200183815260200182815260200195505050505050602060405180830381600087803b1580156115b757600080fd5b505af11580156115cb573d6000803e3d6000fd5b505050506040513d60208110156115e157600080fd5b5051600054604080517fdd62ed3e0000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03928316602482015290519293508392918f169163dd62ed3e91604480820192602092909190829003018186803b15801561165457600080fd5b505afa158015611668573d6000803e3d6000fd5b505050506040513d602081101561167e57600080fd5b505110156116a2576000546116a2906001600160a01b038e81169116600019611da5565b60008054906101000a90046001600160a01b03166001600160a01b031663839ed90a8f8f8f858b8b8b8b6040518963ffffffff1660e01b815260040180896001600160a01b03168152602001888152602001876001600160a01b031681526020018681526020018560ff1681526020018460ff16815260200183815260200182815260200198505050505050505050600060405180830381600087803b15801561086057600080fd5b60003411801561175a57508034145b6117ab576040805162461bcd60e51b815260206004820152601360248201527f494e434f5252454354204d53472056414c554500000000000000000000000000604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b15801561180657600080fd5b505af115801561181a573d6000803e3d6000fd5b505060008054604080517f90d250740000000000000000000000000000000000000000000000000000000081526001600160a01b038a81166004830152602482018a90527f0000000000000000000000000000000000000000000000000000000000000000811660448301526064820189905291519190921695506390d25074945060848083019450909182900301818387803b1580156118ba57600080fd5b505af11580156118ce573d6000803e3d6000fd5b50505050505050565b6118ec6001600160a01b038316333084611f7c565b6001600160a01b038216731a93b23281cc1cde4c4741353f3064709a16197d1415611b5257604080517f280cf3ed00000000000000000000000000000000000000000000000000000000815273e96ac70907fff3efee79f502c985a7a21bce407d6004820152602481018390529051600091731a93b23281cc1cde4c4741353f3064709a16197d9163280cf3ed9160448082019260209290919082900301818787803b15801561199b57600080fd5b505af11580156119af573d6000803e3d6000fd5b505050506040513d60208110156119c557600080fd5b5051600054604080517fdd62ed3e0000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03909216602483015251919250839173e96ac70907fff3efee79f502c985a7a21bce407d9163dd62ed3e916044808301926020929190829003018186803b158015611a4857600080fd5b505afa158015611a5c573d6000803e3d6000fd5b505050506040513d6020811015611a7257600080fd5b50511015611aa857600054611aa89073e96ac70907fff3efee79f502c985a7a21bce407d906001600160a01b0316600019611da5565b60008054604080517ff3f094a10000000000000000000000000000000000000000000000000000000081526001600160a01b0389811660048301526024820189905273e96ac70907fff3efee79f502c985a7a21bce407d6044830152606482018690529151919092169263f3f094a1926084808201939182900301818387803b158015611b3457600080fd5b505af1158015611b48573d6000803e3d6000fd5b5050505050611c86565b600054604080517fdd62ed3e0000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b0392831660248201529051839285169163dd62ed3e916044808301926020929190829003018186803b158015611bbe57600080fd5b505afa158015611bd2573d6000803e3d6000fd5b505050506040513d6020811015611be857600080fd5b50511015611c0c57600054611c0c906001600160a01b038481169116600019611da5565b60008054604080517ff3f094a10000000000000000000000000000000000000000000000000000000081526001600160a01b038881166004830152602482018890528681166044830152606482018690529151919092169263f3f094a1926084808201939182900301818387803b1580156113f357600080fd5b50505050565b6000611d2282856001600160a01b031663dd62ed3e30876040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b031681526020019250505060206040518083038186803b158015611cf057600080fd5b505afa158015611d04573d6000803e3d6000fd5b505050506040513d6020811015611d1a57600080fd5b505190611f04565b604080516001600160a01b038616602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f095ea7b300000000000000000000000000000000000000000000000000000000179052909150611c86908590612000565b801580611e445750604080517fdd62ed3e0000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015611e1657600080fd5b505afa158015611e2a573d6000803e3d6000fd5b505050506040513d6020811015611e4057600080fd5b5051155b611e7f5760405162461bcd60e51b81526004018080602001828103825260368152602001806123266036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f095ea7b300000000000000000000000000000000000000000000000000000000179052611eff908490612000565b505050565b600082820183811015611f5e576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6060611f7484846000856120b1565b949350505050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd00000000000000000000000000000000000000000000000000000000179052611c869085905b6060612055826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611f659092919063ffffffff16565b805190915015611eff5780806020019051602081101561207457600080fd5b5051611eff5760405162461bcd60e51b815260040180806020018281038252602a8152602001806122fc602a913960400191505060405180910390fd5b6060824710156120f25760405162461bcd60e51b81526004018080602001828103825260268152602001806122d66026913960400191505060405180910390fd5b6120fb8561222b565b61214c576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b602083106121a957805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161216c565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461220b576040519150601f19603f3d011682016040523d82523d6000602084013e612210565b606091505b5091509150612220828286612231565b979650505050505050565b3b151590565b60608315612240575081611f5e565b8251156122505782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561229a578181015183820152602001612282565b50505050905090810190601f1680156122c75780820380516001836020036101000a031916815260200191505b509250505060405180910390fdfe416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c5361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a26469706673582212201f3b8707cf25cc9e1f0f55cee3fd5a53e50e789bb32e90a7e9af2d0fc4eb6a0664736f6c634300060c0033416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c73776170206d7573742068617665206174206c65617374203220746f6b656e735361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000000098878b06940ae243284ca214f92bb71a2b032b8a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000aed5b25be1c3163c907a471082640450f928ddfe

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

00000000000000000000000098878b06940ae243284ca214f92bb71a2b032b8a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000aed5b25be1c3163c907a471082640450f928ddfe

-----Decoded View---------------
Arg [0] : _wethAddress (address): 0x98878b06940ae243284ca214f92bb71a2b032b8a
Arg [1] : _swapOne (address): 0x0000000000000000000000000000000000000000
Arg [2] : tokenOne (address): 0x0000000000000000000000000000000000000000
Arg [3] : _swapTwo (address): 0x0000000000000000000000000000000000000000
Arg [4] : tokenTwo (address): 0x0000000000000000000000000000000000000000
Arg [5] : _synapseBridge (address): 0xaed5b25be1c3163c907a471082640450f928ddfe

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 00000000000000000000000098878b06940ae243284ca214f92bb71a2b032b8a
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [5] : 000000000000000000000000aed5b25be1c3163c907a471082640450f928ddfe


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.