ETH Price: $2,104.63 (+1.26%)

Contract

0xfCeAAaEB8D564a9D0e71Ef36f027b9D162bC334e
 

Overview

ETH Balance

5.140414462777599987 ETH

Eth Value

$10,818.67 (@ $2,104.63/ETH)

Token Holdings

More Info

Private Name Tags

Multichain Info

1 address found via
Transaction Hash
Method
Block
From
To
Smg Release246597252026-03-15 1:53:114 hrs ago1773539591IN
0xfCeAAaEB...162bC334e
0 ETH0.000005650.02605453
User Burn246596822026-03-15 1:44:354 hrs ago1773539075IN
0xfCeAAaEB...162bC334e
0 ETH0.00000310.02453548
Smg Release246595772026-03-15 1:23:235 hrs ago1773537803IN
0xfCeAAaEB...162bC334e
0 ETH0.000005880.02709499
Smg Release246590072026-03-14 23:28:357 hrs ago1773530915IN
0xfCeAAaEB...162bC334e
0 ETH0.0000060.02563143
Smg Release246566042026-03-14 15:24:5915 hrs ago1773501899IN
0xfCeAAaEB...162bC334e
0 ETH0.000009810.04519603
Smg Release246564812026-03-14 15:00:2315 hrs ago1773500423IN
0xfCeAAaEB...162bC334e
0 ETH0.000009450.0403577
User Lock246564152026-03-14 14:47:1115 hrs ago1773499631IN
0xfCeAAaEB...162bC334e
0.00072 ETH0.000302372.04442999
User Lock246562602026-03-14 14:15:5916 hrs ago1773497759IN
0xfCeAAaEB...162bC334e
0.00072 ETH0.000306272.07078466
User Lock246559782026-03-14 13:19:3517 hrs ago1773494375IN
0xfCeAAaEB...162bC334e
0.00019 ETH0.000004450.03180304
User Lock246559262026-03-14 13:09:1117 hrs ago1773493751IN
0xfCeAAaEB...162bC334e
0.00019 ETH0.000005040.03597879
User Lock246558952026-03-14 13:02:5917 hrs ago1773493379IN
0xfCeAAaEB...162bC334e
0.00072 ETH0.000304552.05914218
Smg Release246556102026-03-14 12:05:4718 hrs ago1773489947IN
0xfCeAAaEB...162bC334e
0 ETH0.000007420.03170884
Smg Release246546492026-03-14 8:53:1121 hrs ago1773478391IN
0xfCeAAaEB...162bC334e
0 ETH0.000009610.04313308
Smg Release246426602026-03-12 16:44:472 days ago1773333887IN
0xfCeAAaEB...162bC334e
0 ETH0.000039730.17036987
Smg Release246421822026-03-12 15:08:352 days ago1773328115IN
0xfCeAAaEB...162bC334e
0 ETH0.000049810.22939632
Smg Release246421012026-03-12 14:52:112 days ago1773327131IN
0xfCeAAaEB...162bC334e
0 ETH0.000074790.31932493
Smg Release246390332026-03-12 4:35:473 days ago1773290147IN
0xfCeAAaEB...162bC334e
0 ETH0.000007390.03418915
User Lock246364742026-03-11 20:00:473 days ago1773259247IN
0xfCeAAaEB...162bC334e
0.00019 ETH0.00007180.49939125
User Lock246342792026-03-11 12:38:353 days ago1773232715IN
0xfCeAAaEB...162bC334e
0.00019 ETH0.0000620.44607491
Smg Mint246340562026-03-11 11:53:473 days ago1773230027IN
0xfCeAAaEB...162bC334e
0 ETH0.000034020.15003958
Smg Release246276442026-03-10 14:24:354 days ago1773152675IN
0xfCeAAaEB...162bC334e
0 ETH0.000058890.28625646
User Lock246261802026-03-10 9:28:594 days ago1773134939IN
0xfCeAAaEB...162bC334e
0.000064 ETH0.000008860.0634264
Smg Mint246259182026-03-10 8:36:114 days ago1773131771IN
0xfCeAAaEB...162bC334e
0 ETH0.000035390.1560689
Smg Mint246200462026-03-09 12:54:115 days ago1773060851IN
0xfCeAAaEB...162bC334e
0 ETH0.000012460.06009926
User Lock246104712026-03-08 4:51:237 days ago1772945483IN
0xfCeAAaEB...162bC334e
0 ETH0.000005790.04378231
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Method Block
From
To
User Lock246594472026-03-15 0:57:235 hrs ago1773536243
0xfCeAAaEB...162bC334e
0.0001 ETH
Transfer246564152026-03-14 14:47:1115 hrs ago1773499631
0xfCeAAaEB...162bC334e
0.00072 ETH
Transfer246562602026-03-14 14:15:5916 hrs ago1773497759
0xfCeAAaEB...162bC334e
0.00072 ETH
Transfer246559782026-03-14 13:19:3517 hrs ago1773494375
0xfCeAAaEB...162bC334e
0.00019 ETH
Transfer246559262026-03-14 13:09:1117 hrs ago1773493751
0xfCeAAaEB...162bC334e
0.00019 ETH
Transfer246558952026-03-14 13:02:5917 hrs ago1773493379
0xfCeAAaEB...162bC334e
0.00072 ETH
Transfer246364742026-03-11 20:00:473 days ago1773259247
0xfCeAAaEB...162bC334e
0.00019 ETH
Transfer246342792026-03-11 12:38:353 days ago1773232715
0xfCeAAaEB...162bC334e
0.00019 ETH
Transfer246261802026-03-10 9:28:594 days ago1773134939
0xfCeAAaEB...162bC334e
0.000064 ETH
Transfer246158092026-03-08 22:43:236 days ago1773009803
0xfCeAAaEB...162bC334e
0.00072 ETH
User Lock246158092026-03-08 22:43:236 days ago1773009803
0xfCeAAaEB...162bC334e
0.00072 ETH
Transfer246072902026-03-07 18:13:597 days ago1772907239
0xfCeAAaEB...162bC334e
0.00072 ETH
Transfer246068772026-03-07 16:50:357 days ago1772902235
0xfCeAAaEB...162bC334e
0.00117665 ETH
Transfer246068772026-03-07 16:50:357 days ago1772902235
0xfCeAAaEB...162bC334e
1.46964368 ETH
Transfer246002592026-03-06 18:38:598 days ago1772822339
0xfCeAAaEB...162bC334e
0.00072 ETH
Transfer245983612026-03-06 12:17:238 days ago1772799443
0xfCeAAaEB...162bC334e
0.0000038 ETH
Transfer245889532026-03-05 4:43:5910 days ago1772685839
0xfCeAAaEB...162bC334e
0.00072 ETH
Transfer245885282026-03-05 3:18:3510 days ago1772680715
0xfCeAAaEB...162bC334e
0.00072 ETH
User Lock245854302026-03-04 16:56:2310 days ago1772643383
0xfCeAAaEB...162bC334e
0.01 ETH
Transfer245854192026-03-04 16:54:1110 days ago1772643251
0xfCeAAaEB...162bC334e
0.00103135 ETH
Transfer245854192026-03-04 16:54:1110 days ago1772643251
0xfCeAAaEB...162bC334e
0.34275267 ETH
Transfer245847472026-03-04 14:39:1110 days ago1772635151
0xfCeAAaEB...162bC334e
0.0039 ETH
Transfer245787632026-03-03 18:37:1111 days ago1772563031
0xfCeAAaEB...162bC334e
0.00072 ETH
Transfer245654332026-03-01 21:57:5913 days ago1772402279
0xfCeAAaEB...162bC334e
0.00072 ETH
Transfer245570282026-02-28 17:49:5914 days ago1772300999
0xfCeAAaEB...162bC334e
0.0000048 ETH
View All Internal Transactions
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

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

Contract Source Code Verified (Exact Match)

Contract Name:
CrossProxy

Compiler Version
v0.4.26+commit.4563c3fc

Optimization Enabled:
Yes with 200 runs

Other Settings:
byzantium EvmVersion, None license
/**
 *Submitted for verification at Etherscan.io on 2020-10-26
*/

// File: contracts/components/Proxy.sol

/*

  Copyright 2019 Wanchain Foundation.

  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

  http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.

*/

//                            _           _           _
//  __      ____ _ _ __   ___| |__   __ _(_)_ __   __| | _____   __
//  \ \ /\ / / _` | '_ \ / __| '_ \ / _` | | '_ \@/ _` |/ _ \ \ / /
//   \ V  V / (_| | | | | (__| | | | (_| | | | | | (_| |  __/\ V /
//    \_/\_/ \__,_|_| |_|\___|_| |_|\__,_|_|_| |_|\__,_|\___| \_/
//
//

pragma solidity ^0.4.24;

/**
 * Math operations with safety checks
 */


contract Proxy {

    event Upgraded(address indexed implementation);

    address internal _implementation;

    function implementation() public view returns (address) {
        return _implementation;
    }

    function () external payable {
        address _impl = _implementation;
        require(_impl != address(0), "implementation contract not set");

        assembly {
            let ptr := mload(0x40)
            calldatacopy(ptr, 0, calldatasize)
            let result := delegatecall(gas, _impl, ptr, calldatasize, 0, 0)
            let size := returndatasize
            returndatacopy(ptr, 0, size)

            switch result
            case 0 { revert(ptr, size) }
            default { return(ptr, size) }
        }
    }
}

// File: contracts/components/Owned.sol

/*

  Copyright 2019 Wanchain Foundation.

  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

  http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.

*/

//                            _           _           _
//  __      ____ _ _ __   ___| |__   __ _(_)_ __   __| | _____   __
//  \ \ /\ / / _` | '_ \ / __| '_ \ / _` | | '_ \@/ _` |/ _ \ \ / /
//   \ V  V / (_| | | | | (__| | | | (_| | | | | | (_| |  __/\ V /
//    \_/\_/ \__,_|_| |_|\___|_| |_|\__,_|_|_| |_|\__,_|\___| \_/
//
//

pragma solidity ^0.4.24;

/// @dev `Owned` is a base level contract that assigns an `owner` that can be
///  later changed
contract Owned {

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /// @dev `owner` is the only address that can call a function with this
    /// modifier
    modifier onlyOwner() {
        require(msg.sender == owner, "Not owner");
        _;
    }

    address public owner;

    /// @notice The Constructor assigns the message sender to be `owner`
    constructor() public {
        owner = msg.sender;
    }

    address public newOwner;

    function transferOwner(address _newOwner) public onlyOwner {
        require(_newOwner != address(0), "New owner is the zero address");
        emit OwnershipTransferred(owner, _newOwner);
        owner = _newOwner;
    }

    /// @notice `owner` can step down and assign some other address to this role
    /// @param _newOwner The address of the new owner. 0x0 can be used to create
    ///  an unowned neutral vault, however that cannot be undone
    function changeOwner(address _newOwner) public onlyOwner {
        newOwner = _newOwner;
    }

    function acceptOwnership() public {
        if (msg.sender == newOwner) {
            owner = newOwner;
        }
    }

    function renounceOwnership() public onlyOwner {
        owner = address(0);
    }
}

// File: contracts/components/Halt.sol

/*

  Copyright 2019 Wanchain Foundation.

  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

  http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.

*/

//                            _           _           _
//  __      ____ _ _ __   ___| |__   __ _(_)_ __   __| | _____   __
//  \ \ /\ / / _` | '_ \ / __| '_ \ / _` | | '_ \@/ _` |/ _ \ \ / /
//   \ V  V / (_| | | | | (__| | | | (_| | | | | | (_| |  __/\ V /
//    \_/\_/ \__,_|_| |_|\___|_| |_|\__,_|_|_| |_|\__,_|\___| \_/
//
//

pragma solidity ^0.4.24;


contract Halt is Owned {

    bool public halted = false;

    modifier notHalted() {
        require(!halted, "Smart contract is halted");
        _;
    }

    modifier isHalted() {
        require(halted, "Smart contract is not halted");
        _;
    }

    /// @notice function Emergency situation that requires
    /// @notice contribution period to stop or not.
    function setHalt(bool halt)
        public
        onlyOwner
    {
        halted = halt;
    }
}

// File: contracts/components/ReentrancyGuard.sol

pragma solidity 0.4.26;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
contract ReentrancyGuard {
    bool private _notEntered;

    constructor () internal {
        // Storing an initial non-zero value makes deployment a bit more
        // expensive, but in exchange the refund on every call to nonReentrant
        // will be lower in amount. Since refunds are capped to a percetange of
        // the total transaction's gas, it is best to keep them low in cases
        // like this one, to increase the likelihood of the full refund coming
        // into effect.
        _notEntered = true;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_notEntered, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _notEntered = false;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _notEntered = true;
    }
}

// File: contracts/lib/BasicStorageLib.sol

pragma solidity ^0.4.24;

library BasicStorageLib {

    struct UintData {
        mapping(bytes => mapping(bytes => uint))           _storage;
    }

    struct BoolData {
        mapping(bytes => mapping(bytes => bool))           _storage;
    }

    struct AddressData {
        mapping(bytes => mapping(bytes => address))        _storage;
    }

    struct BytesData {
        mapping(bytes => mapping(bytes => bytes))          _storage;
    }

    struct StringData {
        mapping(bytes => mapping(bytes => string))         _storage;
    }

    /* uintStorage */

    function setStorage(UintData storage self, bytes memory key, bytes memory innerKey, uint value) internal {
        self._storage[key][innerKey] = value;
    }

    function getStorage(UintData storage self, bytes memory key, bytes memory innerKey) internal view returns (uint) {
        return self._storage[key][innerKey];
    }

    function delStorage(UintData storage self, bytes memory key, bytes memory innerKey) internal {
        delete self._storage[key][innerKey];
    }

    /* boolStorage */

    function setStorage(BoolData storage self, bytes memory key, bytes memory innerKey, bool value) internal {
        self._storage[key][innerKey] = value;
    }

    function getStorage(BoolData storage self, bytes memory key, bytes memory innerKey) internal view returns (bool) {
        return self._storage[key][innerKey];
    }

    function delStorage(BoolData storage self, bytes memory key, bytes memory innerKey) internal {
        delete self._storage[key][innerKey];
    }

    /* addressStorage */

    function setStorage(AddressData storage self, bytes memory key, bytes memory innerKey, address value) internal {
        self._storage[key][innerKey] = value;
    }

    function getStorage(AddressData storage self, bytes memory key, bytes memory innerKey) internal view returns (address) {
        return self._storage[key][innerKey];
    }

    function delStorage(AddressData storage self, bytes memory key, bytes memory innerKey) internal {
        delete self._storage[key][innerKey];
    }

    /* bytesStorage */

    function setStorage(BytesData storage self, bytes memory key, bytes memory innerKey, bytes memory value) internal {
        self._storage[key][innerKey] = value;
    }

    function getStorage(BytesData storage self, bytes memory key, bytes memory innerKey) internal view returns (bytes memory) {
        return self._storage[key][innerKey];
    }

    function delStorage(BytesData storage self, bytes memory key, bytes memory innerKey) internal {
        delete self._storage[key][innerKey];
    }

    /* stringStorage */

    function setStorage(StringData storage self, bytes memory key, bytes memory innerKey, string memory value) internal {
        self._storage[key][innerKey] = value;
    }

    function getStorage(StringData storage self, bytes memory key, bytes memory innerKey) internal view returns (string memory) {
        return self._storage[key][innerKey];
    }

    function delStorage(StringData storage self, bytes memory key, bytes memory innerKey) internal {
        delete self._storage[key][innerKey];
    }

}

// File: contracts/components/BasicStorage.sol

pragma solidity ^0.4.24;


contract BasicStorage {
    /************************************************************
     **
     ** VARIABLES
     **
     ************************************************************/

    //// basic variables
    using BasicStorageLib for BasicStorageLib.UintData;
    using BasicStorageLib for BasicStorageLib.BoolData;
    using BasicStorageLib for BasicStorageLib.AddressData;
    using BasicStorageLib for BasicStorageLib.BytesData;
    using BasicStorageLib for BasicStorageLib.StringData;

    BasicStorageLib.UintData    internal uintData;
    BasicStorageLib.BoolData    internal boolData;
    BasicStorageLib.AddressData internal addressData;
    BasicStorageLib.BytesData   internal bytesData;
    BasicStorageLib.StringData  internal stringData;
}

// File: contracts/interfaces/IRC20Protocol.sol

/*

  Copyright 2019 Wanchain Foundation.

  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

  http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.

*/

//                            _           _           _
//  __      ____ _ _ __   ___| |__   __ _(_)_ __   __| | _____   __
//  \ \ /\ / / _` | '_ \ / __| '_ \ / _` | | '_ \@/ _` |/ _ \ \ / /
//   \ V  V / (_| | | | | (__| | | | (_| | | | | | (_| |  __/\ V /
//    \_/\_/ \__,_|_| |_|\___|_| |_|\__,_|_|_| |_|\__,_|\___| \_/
//
//

pragma solidity ^0.4.26;

interface IRC20Protocol {
    function transfer(address, uint) external returns (bool);
    function transferFrom(address, address, uint) external returns (bool);
    function balanceOf(address _owner) external view returns (uint);
}

// File: contracts/interfaces/IQuota.sol

/*

  Copyright 2019 Wanchain Foundation.

  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

  http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.

*/

//                            _           _           _
//  __      ____ _ _ __   ___| |__   __ _(_)_ __   __| | _____   __
//  \ \ /\ / / _` | '_ \ / __| '_ \ / _` | | '_ \@/ _` |/ _ \ \ / /
//   \ V  V / (_| | | | | (__| | | | (_| | | | | | (_| |  __/\ V /
//    \_/\_/ \__,_|_| |_|\___|_| |_|\__,_|_|_| |_|\__,_|\___| \_/
//
//

pragma solidity 0.4.26;

interface IQuota {
  function userMintLock(uint tokenId, bytes32 storemanGroupId, uint value) external;
  function userMintRevoke(uint tokenId, bytes32 storemanGroupId, uint value) external;
  function userMintRedeem(uint tokenId, bytes32 storemanGroupId, uint value) external;

  function smgMintLock(uint tokenId, bytes32 storemanGroupId, uint value) external;
  function smgMintRevoke(uint tokenId, bytes32 storemanGroupId, uint value) external;
  function smgMintRedeem(uint tokenId, bytes32 storemanGroupId, uint value) external;

  function userBurnLock(uint tokenId, bytes32 storemanGroupId, uint value) external;
  function userBurnRevoke(uint tokenId, bytes32 storemanGroupId, uint value) external;
  function userBurnRedeem(uint tokenId, bytes32 storemanGroupId, uint value) external;

  function smgBurnLock(uint tokenId, bytes32 storemanGroupId, uint value) external;
  function smgBurnRevoke(uint tokenId, bytes32 storemanGroupId, uint value) external;
  function smgBurnRedeem(uint tokenId, bytes32 storemanGroupId, uint value) external;

  function userFastMint(uint tokenId, bytes32 storemanGroupId, uint value) external;
  function userFastBurn(uint tokenId, bytes32 storemanGroupId, uint value) external;

  function smgFastMint(uint tokenId, bytes32 storemanGroupId, uint value) external;
  function smgFastBurn(uint tokenId, bytes32 storemanGroupId, uint value) external;

  function assetLock(bytes32 srcStoremanGroupId, bytes32 dstStoremanGroupId) external;
  function assetRedeem(bytes32 srcStoremanGroupId, bytes32 dstStoremanGroupId) external;
  function assetRevoke(bytes32 srcStoremanGroupId, bytes32 dstStoremanGroupId) external;

  function debtLock(bytes32 srcStoremanGroupId, bytes32 dstStoremanGroupId) external;
  function debtRedeem(bytes32 srcStoremanGroupId, bytes32 dstStoremanGroupId) external;
  function debtRevoke(bytes32 srcStoremanGroupId, bytes32 dstStoremanGroupId) external;

  function getUserMintQuota(uint tokenId, bytes32 storemanGroupId) external view returns (uint);
  function getSmgMintQuota(uint tokenId, bytes32 storemanGroupId) external view returns (uint);

  function getUserBurnQuota(uint tokenId, bytes32 storemanGroupId) external view returns (uint);
  function getSmgBurnQuota(uint tokenId, bytes32 storemanGroupId) external view returns (uint);

  function getAsset(uint tokenId, bytes32 storemanGroupId) external view returns (uint asset, uint asset_receivable, uint asset_payable);
  function getDebt(uint tokenId, bytes32 storemanGroupId) external view returns (uint debt, uint debt_receivable, uint debt_payable);

  function isDebtClean(bytes32 storemanGroupId) external view returns (bool);
}

// File: contracts/interfaces/IStoremanGroup.sol

/*

  Copyright 2019 Wanchain Foundation.

  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

  http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.

*/

//                            _           _           _
//  __      ____ _ _ __   ___| |__   __ _(_)_ __   __| | _____   __
//  \ \ /\ / / _` | '_ \ / __| '_ \ / _` | | '_ \@/ _` |/ _ \ \ / /
//   \ V  V / (_| | | | | (__| | | | (_| | | | | | (_| |  __/\ V /
//    \_/\_/ \__,_|_| |_|\___|_| |_|\__,_|_|_| |_|\__,_|\___| \_/
//
//

pragma solidity ^0.4.24;

interface IStoremanGroup {
    function getSelectedSmNumber(bytes32 groupId) external view returns(uint number);
    function getStoremanGroupConfig(bytes32 id) external view returns(bytes32 groupId, uint8 status, uint deposit, uint chain1, uint chain2, uint curve1, uint curve2,  bytes gpk1, bytes gpk2, uint startTime, uint endTime);
    function getDeposit(bytes32 id) external view returns(uint);
    function getStoremanGroupStatus(bytes32 id) external view returns(uint8 status, uint startTime, uint endTime);
    function setGpk(bytes32 groupId, bytes gpk1, bytes gpk2) external;
    function setInvalidSm(bytes32 groupId, uint[] indexs, uint8[] slashTypes) external returns(bool isContinue);
    function getThresholdByGrpId(bytes32 groupId) external view returns (uint);
    function getSelectedSmInfo(bytes32 groupId, uint index) external view returns(address wkAddr, bytes PK, bytes enodeId);
    function recordSmSlash(address wk) public;
}

// File: contracts/interfaces/ITokenManager.sol

/*

  Copyright 2019 Wanchain Foundation.

  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

  http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.

*/

//                            _           _           _
//  __      ____ _ _ __   ___| |__   __ _(_)_ __   __| | _____   __
//  \ \ /\ / / _` | '_ \ / __| '_ \ / _` | | '_ \@/ _` |/ _ \ \ / /
//   \ V  V / (_| | | | | (__| | | | (_| | | | | | (_| |  __/\ V /
//    \_/\_/ \__,_|_| |_|\___|_| |_|\__,_|_|_| |_|\__,_|\___| \_/
//
//

pragma solidity 0.4.26;

interface ITokenManager {
    function getTokenPairInfo(uint id) external view
      returns (uint origChainID, bytes tokenOrigAccount, uint shadowChainID, bytes tokenShadowAccount);

    function getTokenPairInfoSlim(uint id) external view 
      returns (uint origChainID, bytes tokenOrigAccount, uint shadowChainID);

    function mintToken(uint id, address to,uint value) external;

    function burnToken(uint id, uint value) external;
}

// File: contracts/interfaces/ISignatureVerifier.sol

/*

  Copyright 2019 Wanchain Foundation.

  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

  http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.

*/

//                            _           _           _
//  __      ____ _ _ __   ___| |__   __ _(_)_ __   __| | _____   __
//  \ \ /\ / / _` | '_ \ / __| '_ \ / _` | | '_ \@/ _` |/ _ \ \ / /
//   \ V  V / (_| | | | | (__| | | | (_| | | | | | (_| |  __/\ V /
//    \_/\_/ \__,_|_| |_|\___|_| |_|\__,_|_|_| |_|\__,_|\___| \_/
//
//

pragma solidity 0.4.26;

interface ISignatureVerifier {
  function verify(
        uint curveId,
        bytes32 signature,
        bytes32 groupKeyX,
        bytes32 groupKeyY,
        bytes32 randomPointX,
        bytes32 randomPointY,
        bytes32 message
    ) external returns (bool);
}

// File: contracts/lib/SafeMath.sol

pragma solidity ^0.4.24;

/**
 * Math operations with safety checks
 */
library SafeMath {

    /**
    * @dev Multiplies two numbers, reverts on overflow.
    */
    function mul(uint256 a, uint256 b) internal pure returns (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-solidity/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath mul overflow");

        return c;
    }

    /**
    * @dev Integer division of two numbers truncating the quotient, reverts on division by zero.
    */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, "SafeMath div 0"); // Solidity only automatically asserts when dividing by 0
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
    * @dev Subtracts two numbers, reverts on overflow (i.e. if subtrahend is greater than minuend).
    */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a, "SafeMath sub b > a");
        uint256 c = a - b;

        return c;
    }

    /**
    * @dev Adds two numbers, reverts on overflow.
    */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath add overflow");

        return c;
    }

    /**
    * @dev Divides two numbers and returns the remainder (unsigned integer modulo),
    * reverts when dividing by zero.
    */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b != 0, "SafeMath mod 0");
        return a % b;
    }
}

// File: contracts/crossApproach/lib/HTLCTxLib.sol

/*

  Copyright 2019 Wanchain Foundation.

  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

  http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.

*/

//                            _           _           _
//  __      ____ _ _ __   ___| |__   __ _(_)_ __   __| | _____   __
//  \ \ /\ / / _` | '_ \ / __| '_ \ / _` | | '_ \@/ _` |/ _ \ \ / /
//   \ V  V / (_| | | | | (__| | | | (_| | | | | | (_| |  __/\ V /
//    \_/\_/ \__,_|_| |_|\___|_| |_|\__,_|_|_| |_|\__,_|\___| \_/
//
//

pragma solidity ^0.4.26;
pragma experimental ABIEncoderV2;


library HTLCTxLib {
    using SafeMath for uint;

    /**
     *
     * ENUMS
     *
     */

    /// @notice tx info status
    /// @notice uninitialized,locked,redeemed,revoked
    enum TxStatus {None, Locked, Redeemed, Revoked}

    /**
     *
     * STRUCTURES
     *
     */

    /// @notice struct of HTLC user mint lock parameters
    struct HTLCUserParams {
        bytes32 xHash;                  /// hash of HTLC random number
        bytes32 smgID;                  /// ID of storeman group which user has selected
        uint tokenPairID;               /// token pair id on cross chain
        uint value;                     /// exchange token value
        uint lockFee;                   /// exchange token value
        uint lockedTime;                /// HTLC lock time
    }

    /// @notice HTLC(Hashed TimeLock Contract) tx info
    struct BaseTx {
        bytes32 smgID;                  /// HTLC transaction storeman ID
        uint lockedTime;                /// HTLC transaction locked time
        uint beginLockedTime;           /// HTLC transaction begin locked time
        TxStatus status;                /// HTLC transaction status
    }

    /// @notice user  tx info
    struct UserTx {
        BaseTx baseTx;
        uint tokenPairID;
        uint value;
        uint fee;
        address userAccount;            /// HTLC transaction sender address for the security check while user's revoke
    }
    /// @notice storeman  tx info
    struct SmgTx {
        BaseTx baseTx;
        uint tokenPairID;
        uint value;
        address  userAccount;          /// HTLC transaction user address for the security check while user's redeem
    }
    /// @notice storeman  debt tx info
    struct DebtTx {
        BaseTx baseTx;
        bytes32 srcSmgID;              /// HTLC transaction sender(source storeman) ID
    }

    struct Data {
        /// @notice mapping of hash(x) to UserTx -- xHash->htlcUserTxData
        mapping(bytes32 => UserTx) mapHashXUserTxs;

        /// @notice mapping of hash(x) to SmgTx -- xHash->htlcSmgTxData
        mapping(bytes32 => SmgTx) mapHashXSmgTxs;

        /// @notice mapping of hash(x) to DebtTx -- xHash->htlcDebtTxData
        mapping(bytes32 => DebtTx) mapHashXDebtTxs;

    }

    /**
     *
     * MANIPULATIONS
     *
     */

    /// @notice                     add user transaction info
    /// @param params               parameters for user tx
    function addUserTx(Data storage self, HTLCUserParams memory params)
        public
    {
        UserTx memory userTx = self.mapHashXUserTxs[params.xHash];
        // UserTx storage userTx = self.mapHashXUserTxs[params.xHash];
        // require(params.value != 0, "Value is invalid");
        require(userTx.baseTx.status == TxStatus.None, "User tx exists");

        userTx.baseTx.smgID = params.smgID;
        userTx.baseTx.lockedTime = params.lockedTime;
        userTx.baseTx.beginLockedTime = now;
        userTx.baseTx.status = TxStatus.Locked;
        userTx.tokenPairID = params.tokenPairID;
        userTx.value = params.value;
        userTx.fee = params.lockFee;
        userTx.userAccount = msg.sender;

        self.mapHashXUserTxs[params.xHash] = userTx;
    }

    /// @notice                     refund coins from HTLC transaction, which is used for storeman redeem(outbound)
    /// @param x                    HTLC random number
    function redeemUserTx(Data storage self, bytes32 x)
        external
        returns(bytes32 xHash)
    {
        xHash = sha256(abi.encodePacked(x));

        UserTx storage userTx = self.mapHashXUserTxs[xHash];
        require(userTx.baseTx.status == TxStatus.Locked, "Status is not locked");
        require(now < userTx.baseTx.beginLockedTime.add(userTx.baseTx.lockedTime), "Redeem timeout");

        userTx.baseTx.status = TxStatus.Redeemed;

        return xHash;
    }

    /// @notice                     revoke user transaction
    /// @param  xHash               hash of HTLC random number
    function revokeUserTx(Data storage self, bytes32 xHash)
        external
    {
        UserTx storage userTx = self.mapHashXUserTxs[xHash];
        require(userTx.baseTx.status == TxStatus.Locked, "Status is not locked");
        require(now >= userTx.baseTx.beginLockedTime.add(userTx.baseTx.lockedTime), "Revoke is not permitted");

        userTx.baseTx.status = TxStatus.Revoked;
    }

    /// @notice                    function for get user info
    /// @param xHash               hash of HTLC random number
    /// @return smgID              ID of storeman which user has selected
    /// @return tokenPairID        token pair ID of cross chain
    /// @return value              exchange value
    /// @return fee                exchange fee
    /// @return userAccount        HTLC transaction sender address for the security check while user's revoke
    function getUserTx(Data storage self, bytes32 xHash)
        external
        view
        returns (bytes32, uint, uint, uint, address)
    {
        UserTx storage userTx = self.mapHashXUserTxs[xHash];
        return (userTx.baseTx.smgID, userTx.tokenPairID, userTx.value, userTx.fee, userTx.userAccount);
    }

    /// @notice                     add storeman transaction info
    /// @param  xHash               hash of HTLC random number
    /// @param  smgID               ID of the storeman which user has selected
    /// @param  tokenPairID         token pair ID of cross chain
    /// @param  value               HTLC transfer value of token
    /// @param  userAccount            user account address on the destination chain, which is used to redeem token
    function addSmgTx(Data storage self, bytes32 xHash, bytes32 smgID, uint tokenPairID, uint value, address userAccount, uint lockedTime)
        external
    {
        SmgTx memory smgTx = self.mapHashXSmgTxs[xHash];
        // SmgTx storage smgTx = self.mapHashXSmgTxs[xHash];
        require(value != 0, "Value is invalid");
        require(smgTx.baseTx.status == TxStatus.None, "Smg tx exists");

        smgTx.baseTx.smgID = smgID;
        smgTx.baseTx.status = TxStatus.Locked;
        smgTx.baseTx.lockedTime = lockedTime;
        smgTx.baseTx.beginLockedTime = now;
        smgTx.tokenPairID = tokenPairID;
        smgTx.value = value;
        smgTx.userAccount = userAccount;

        self.mapHashXSmgTxs[xHash] = smgTx;
    }

    /// @notice                     refund coins from HTLC transaction, which is used for users redeem(inbound)
    /// @param x                    HTLC random number
    function redeemSmgTx(Data storage self, bytes32 x)
        external
        returns(bytes32 xHash)
    {
        xHash = sha256(abi.encodePacked(x));

        SmgTx storage smgTx = self.mapHashXSmgTxs[xHash];
        require(smgTx.baseTx.status == TxStatus.Locked, "Status is not locked");
        require(now < smgTx.baseTx.beginLockedTime.add(smgTx.baseTx.lockedTime), "Redeem timeout");

        smgTx.baseTx.status = TxStatus.Redeemed;

        return xHash;
    }

    /// @notice                     revoke storeman transaction
    /// @param  xHash               hash of HTLC random number
    function revokeSmgTx(Data storage self, bytes32 xHash)
        external
    {
        SmgTx storage smgTx = self.mapHashXSmgTxs[xHash];
        require(smgTx.baseTx.status == TxStatus.Locked, "Status is not locked");
        require(now >= smgTx.baseTx.beginLockedTime.add(smgTx.baseTx.lockedTime), "Revoke is not permitted");

        smgTx.baseTx.status = TxStatus.Revoked;
    }

    /// @notice                     function for get smg info
    /// @param xHash                hash of HTLC random number
    /// @return smgID               ID of storeman which user has selected
    /// @return tokenPairID         token pair ID of cross chain
    /// @return value               exchange value
    /// @return userAccount            user account address for redeem
    function getSmgTx(Data storage self, bytes32 xHash)
        external
        view
        returns (bytes32, uint, uint, address)
    {
        SmgTx storage smgTx = self.mapHashXSmgTxs[xHash];
        return (smgTx.baseTx.smgID, smgTx.tokenPairID, smgTx.value, smgTx.userAccount);
    }

    /// @notice                     add storeman transaction info
    /// @param  xHash               hash of HTLC random number
    /// @param  srcSmgID            ID of source storeman group
    /// @param  destSmgID           ID of the storeman which will take over of the debt of source storeman group
    /// @param  lockedTime          HTLC lock time
    function addDebtTx(Data storage self, bytes32 xHash, bytes32 srcSmgID, bytes32 destSmgID, uint lockedTime)
        external
    {
        DebtTx memory debtTx = self.mapHashXDebtTxs[xHash];
        // DebtTx storage debtTx = self.mapHashXDebtTxs[xHash];
        require(debtTx.baseTx.status == TxStatus.None, "Debt tx exists");

        debtTx.baseTx.smgID = destSmgID;
        debtTx.baseTx.status = TxStatus.Locked;
        debtTx.baseTx.lockedTime = lockedTime;
        debtTx.baseTx.beginLockedTime = now;
        debtTx.srcSmgID = srcSmgID;

        self.mapHashXDebtTxs[xHash] = debtTx;
    }

    /// @notice                     refund coins from HTLC transaction
    /// @param x                    HTLC random number
    function redeemDebtTx(Data storage self, bytes32 x)
        external
        returns(bytes32 xHash)
    {
        xHash = sha256(abi.encodePacked(x));

        DebtTx storage debtTx = self.mapHashXDebtTxs[xHash];
        require(debtTx.baseTx.status == TxStatus.Locked, "Status is not locked");
        require(now < debtTx.baseTx.beginLockedTime.add(debtTx.baseTx.lockedTime), "Redeem timeout");

        debtTx.baseTx.status = TxStatus.Redeemed;

        return xHash;
    }

    /// @notice                     revoke debt transaction, which is used for source storeman group
    /// @param  xHash               hash of HTLC random number
    function revokeDebtTx(Data storage self, bytes32 xHash)
        external
    {
        DebtTx storage debtTx = self.mapHashXDebtTxs[xHash];
        require(debtTx.baseTx.status == TxStatus.Locked, "Status is not locked");
        require(now >= debtTx.baseTx.beginLockedTime.add(debtTx.baseTx.lockedTime), "Revoke is not permitted");

        debtTx.baseTx.status = TxStatus.Revoked;
    }

    /// @notice                     function for get debt info
    /// @param xHash                hash of HTLC random number
    /// @return srcSmgID            ID of source storeman
    /// @return destSmgID           ID of destination storeman
    function getDebtTx(Data storage self, bytes32 xHash)
        external
        view
        returns (bytes32, bytes32)
    {
        DebtTx storage debtTx = self.mapHashXDebtTxs[xHash];
        return (debtTx.srcSmgID, debtTx.baseTx.smgID);
    }

    function getLeftTime(uint endTime) private view returns (uint) {
        if (now < endTime) {
            return endTime.sub(now);
        }
        return 0;
    }

    /// @notice                     function for get debt info
    /// @param xHash                hash of HTLC random number
    /// @return leftTime            the left lock time
    function getLeftLockedTime(Data storage self, bytes32 xHash)
        external
        view
        returns (uint)
    {
        UserTx storage userTx = self.mapHashXUserTxs[xHash];
        if (userTx.baseTx.status != TxStatus.None) {
            return getLeftTime(userTx.baseTx.beginLockedTime.add(userTx.baseTx.lockedTime));
        }
        SmgTx storage smgTx = self.mapHashXSmgTxs[xHash];
        if (smgTx.baseTx.status != TxStatus.None) {
            return getLeftTime(smgTx.baseTx.beginLockedTime.add(smgTx.baseTx.lockedTime));
        }
        DebtTx storage debtTx = self.mapHashXDebtTxs[xHash];
        if (debtTx.baseTx.status != TxStatus.None) {
            return getLeftTime(debtTx.baseTx.beginLockedTime.add(debtTx.baseTx.lockedTime));
        }
        require(false, 'invalid xHash');
    }
}

// File: contracts/crossApproach/lib/RapidityTxLib.sol

/*

  Copyright 2019 Wanchain Foundation.

  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

  http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.

*/

//                            _           _           _
//  __      ____ _ _ __   ___| |__   __ _(_)_ __   __| | _____   __
//  \ \ /\ / / _` | '_ \ / __| '_ \ / _` | | '_ \@/ _` |/ _ \ \ / /
//   \ V  V / (_| | | | | (__| | | | (_| | | | | | (_| |  __/\ V /
//    \_/\_/ \__,_|_| |_|\___|_| |_|\__,_|_|_| |_|\__,_|\___| \_/
//
//

pragma solidity ^0.4.26;

library RapidityTxLib {

    /**
     *
     * ENUMS
     *
     */

    /// @notice tx info status
    /// @notice uninitialized,Redeemed
    enum TxStatus {None, Redeemed}

    /**
     *
     * STRUCTURES
     *
     */
    struct Data {
        /// @notice mapping of uniqueID to TxStatus -- uniqueID->TxStatus
        mapping(bytes32 => TxStatus) mapTxStatus;

    }

    /**
     *
     * MANIPULATIONS
     *
     */

    /// @notice                     add user transaction info
    /// @param  uniqueID            Rapidity random number
    function addRapidityTx(Data storage self, bytes32 uniqueID)
        internal
    {
        TxStatus status = self.mapTxStatus[uniqueID];
        require(status == TxStatus.None, "Rapidity tx exists");
        self.mapTxStatus[uniqueID] = TxStatus.Redeemed;
    }
}

// File: contracts/crossApproach/lib/CrossTypes.sol

/*

  Copyright 2019 Wanchain Foundation.

  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

  http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.

*/

//                            _           _           _
//  __      ____ _ _ __   ___| |__   __ _(_)_ __   __| | _____   __
//  \ \ /\ / / _` | '_ \ / __| '_ \ / _` | | '_ \@/ _` |/ _ \ \ / /
//   \ V  V / (_| | | | | (__| | | | (_| | | | | | (_| |  __/\ V /
//    \_/\_/ \__,_|_| |_|\___|_| |_|\__,_|_|_| |_|\__,_|\___| \_/
//
//

pragma solidity ^0.4.26;








library CrossTypes {
    using SafeMath for uint;

    /**
     *
     * STRUCTURES
     *
     */

    struct Data {

        /// map of the htlc transaction info
        HTLCTxLib.Data htlcTxData;

        /// map of the rapidity transaction info
        RapidityTxLib.Data rapidityTxData;

        /// quota data of storeman group
        IQuota quota;

        /// token manager instance interface
        ITokenManager tokenManager;

        /// storemanGroup admin instance interface
        IStoremanGroup smgAdminProxy;

        /// storemanGroup fee admin instance address
        address smgFeeProxy;

        ISignatureVerifier sigVerifier;

        /// @notice transaction fee, smgID => fee
        mapping(bytes32 => uint) mapStoremanFee;

        /// @notice transaction fee, origChainID => shadowChainID => fee
        mapping(uint => mapping(uint =>uint)) mapLockFee;

        /// @notice transaction fee, origChainID => shadowChainID => fee
        mapping(uint => mapping(uint =>uint)) mapRevokeFee;

    }

    /**
     *
     * MANIPULATIONS
     *
     */

    // /// @notice       convert bytes32 to address
    // /// @param b      bytes32
    // function bytes32ToAddress(bytes32 b) internal pure returns (address) {
    //     return address(uint160(bytes20(b))); // high
    //     // return address(uint160(uint256(b))); // low
    // }

    /// @notice       convert bytes to address
    /// @param b      bytes
    function bytesToAddress(bytes b) internal pure returns (address addr) {
        assembly {
            addr := mload(add(b,20))
        }
    }

    function transfer(address tokenScAddr, address to, uint value)
        internal
        returns(bool)
    {
        uint beforeBalance;
        uint afterBalance;
        beforeBalance = IRC20Protocol(tokenScAddr).balanceOf(to);
        // IRC20Protocol(tokenScAddr).transfer(to, value);
        tokenScAddr.call(bytes4(keccak256("transfer(address,uint256)")), to, value);
        afterBalance = IRC20Protocol(tokenScAddr).balanceOf(to);
        return afterBalance == beforeBalance.add(value);
    }

    function transferFrom(address tokenScAddr, address from, address to, uint value)
        internal
        returns(bool)
    {
        uint beforeBalance;
        uint afterBalance;
        beforeBalance = IRC20Protocol(tokenScAddr).balanceOf(to);
        // IRC20Protocol(tokenScAddr).transferFrom(from, to, value);
        tokenScAddr.call(bytes4(keccak256("transferFrom(address,address,uint256)")), from, to, value);
        afterBalance = IRC20Protocol(tokenScAddr).balanceOf(to);
        return afterBalance == beforeBalance.add(value);
    }
}

// File: contracts/crossApproach/CrossStorage.sol

/*

  Copyright 2019 Wanchain Foundation.

  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

  http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.

*/

//                            _           _           _
//  __      ____ _ _ __   ___| |__   __ _(_)_ __   __| | _____   __
//  \ \ /\ / / _` | '_ \ / __| '_ \ / _` | | '_ \@/ _` |/ _ \ \ / /
//   \ V  V / (_| | | | | (__| | | | (_| | | | | | (_| |  __/\ V /
//    \_/\_/ \__,_|_| |_|\___|_| |_|\__,_|_|_| |_|\__,_|\___| \_/
//
//

pragma solidity ^0.4.26;





contract CrossStorage is BasicStorage {
    using HTLCTxLib for HTLCTxLib.Data;
    using RapidityTxLib for RapidityTxLib.Data;

    /************************************************************
     **
     ** VARIABLES
     **
     ************************************************************/

    CrossTypes.Data internal storageData;

    /// @notice locked time(in seconds)
    uint public lockedTime = uint(3600*36);

    /// @notice Since storeman group admin receiver address may be changed, system should make sure the new address
    /// @notice can be used, and the old address can not be used. The solution is add timestamp.
    /// @notice unit: second
    uint public smgFeeReceiverTimeout = uint(10*60);

    enum GroupStatus { none, initial, curveSeted, failed, selected, ready, unregistered, dismissed }

}

// File: contracts/crossApproach/CrossProxy.sol

/*

  Copyright 2019 Wanchain Foundation.

  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

  http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.

*/

//                            _           _           _
//  __      ____ _ _ __   ___| |__   __ _(_)_ __   __| | _____   __
//  \ \ /\ / / _` | '_ \ / __| '_ \ / _` | | '_ \@/ _` |/ _ \ \ / /
//   \ V  V / (_| | | | | (__| | | | (_| | | | | | (_| |  __/\ V /
//    \_/\_/ \__,_|_| |_|\___|_| |_|\__,_|_|_| |_|\__,_|\___| \_/
//
//

pragma solidity ^0.4.26;

/**
 * Math operations with safety checks
 */






contract CrossProxy is CrossStorage, ReentrancyGuard, Halt, Proxy {

    ///@dev                   update the address of CrossDelegate contract
    ///@param impl            the address of the new CrossDelegate contract
    function upgradeTo(address impl) public onlyOwner {
        require(impl != address(0), "Cannot upgrade to invalid address");
        require(impl != _implementation, "Cannot upgrade to the same implementation");
        _implementation = impl;
        emit Upgraded(impl);
    }
}

Contract Security Audit

Contract ABI

API
[{"constant":false,"inputs":[{"name":"impl","type":"address"}],"name":"upgradeTo","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newOwner","type":"address"}],"name":"transferOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"implementation","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"acceptOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newOwner","type":"address"}],"name":"changeOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"lockedTime","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"halted","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"newOwner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"smgFeeReceiverTimeout","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"halt","type":"bool"}],"name":"setHalt","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]

60806040526201fa406011556102586012556014805460a060020a60ff02191690556013805460ff191660011761010060a860020a03191661010033021790556108838061004e6000396000f3006080604052600436106100b95763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416633659cfe681146101155780634fb2e45d146101375780635c60da1b14610157578063715018a61461018257806379ba5097146101975780638da5cb5b146101ac578063a6f9dae1146101c1578063a8b38205146101e1578063b9b8af0b14610203578063d4ee1d9014610225578063e92e2c1b1461023a578063f49543871461024f575b601554600160a060020a03168015156100f05760405160e560020a62461bcd0281526004016100e7906107e7565b60405180910390fd5b60405136600082376000803683855af43d806000843e818015610111578184f35b8184fd5b34801561012157600080fd5b50610135610130366004610614565b61026f565b005b34801561014357600080fd5b50610135610152366004610614565b610354565b34801561016357600080fd5b5061016c610425565b60405161017991906107b5565b60405180910390f35b34801561018e57600080fd5b50610135610434565b3480156101a357600080fd5b50610135610486565b3480156101b857600080fd5b5061016c6104d2565b3480156101cd57600080fd5b506101356101dc366004610614565b6104e6565b3480156101ed57600080fd5b506101f6610547565b6040516101799190610827565b34801561020f57600080fd5b5061021861054d565b60405161017991906107c9565b34801561023157600080fd5b5061016c61056e565b34801561024657600080fd5b506101f661057d565b34801561025b57600080fd5b5061013561026a36600461063a565b610583565b6013546101009004600160a060020a031633146102a15760405160e560020a62461bcd0281526004016100e790610807565b600160a060020a03811615156102cc5760405160e560020a62461bcd0281526004016100e7906107d7565b601554600160a060020a03828116911614156102fd5760405160e560020a62461bcd0281526004016100e790610817565b6015805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383169081179091556040517fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6013546101009004600160a060020a031633146103865760405160e560020a62461bcd0281526004016100e790610807565b600160a060020a03811615156103b15760405160e560020a62461bcd0281526004016100e7906107f7565b601354604051600160a060020a0380841692610100900416907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a360138054600160a060020a039092166101000274ffffffffffffffffffffffffffffffffffffffff0019909216919091179055565b601554600160a060020a031690565b6013546101009004600160a060020a031633146104665760405160e560020a62461bcd0281526004016100e790610807565b6013805474ffffffffffffffffffffffffffffffffffffffff0019169055565b601454600160a060020a03163314156104d05760145460138054600160a060020a039092166101000274ffffffffffffffffffffffffffffffffffffffff00199092169190911790555b565b6013546101009004600160a060020a031681565b6013546101009004600160a060020a031633146105185760405160e560020a62461bcd0281526004016100e790610807565b6014805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60115481565b60145474010000000000000000000000000000000000000000900460ff1681565b601454600160a060020a031681565b60125481565b6013546101009004600160a060020a031633146105b55760405160e560020a62461bcd0281526004016100e790610807565b60148054911515740100000000000000000000000000000000000000000274ff000000000000000000000000000000000000000019909216919091179055565b60006106018235610835565b9392505050565b60006106018235610841565b60006020828403121561062657600080fd5b600061063284846105f5565b949350505050565b60006020828403121561064c57600080fd5b60006106328484610608565b61066181610835565b82525050565b61066181610841565b602181527f43616e6e6f74207570677261646520746f20696e76616c69642061646472657360208201527f7300000000000000000000000000000000000000000000000000000000000000604082015260600190565b601f81527f696d706c656d656e746174696f6e20636f6e7472616374206e6f742073657400602082015260400190565b601d81527f4e6577206f776e657220697320746865207a65726f2061646472657373000000602082015260400190565b600981527f4e6f74206f776e65720000000000000000000000000000000000000000000000602082015260400190565b602981527f43616e6e6f74207570677261646520746f207468652073616d6520696d706c6560208201527f6d656e746174696f6e0000000000000000000000000000000000000000000000604082015260600190565b61066181610846565b602081016107c38284610658565b92915050565b602081016107c38284610667565b602080825281016107c381610670565b602080825281016107c3816106c6565b602080825281016107c3816106f6565b602080825281016107c381610726565b602080825281016107c381610756565b602081016107c382846107ac565b600160a060020a031690565b151590565b905600a265627a7a7230582004a0005c9a129c335f49082cea1921b0fe13a2c314d3511f284a6f9bd263c5ff6c6578706572696d656e74616cf50037

Deployed Bytecode

0x6080604052600436106100b95763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416633659cfe681146101155780634fb2e45d146101375780635c60da1b14610157578063715018a61461018257806379ba5097146101975780638da5cb5b146101ac578063a6f9dae1146101c1578063a8b38205146101e1578063b9b8af0b14610203578063d4ee1d9014610225578063e92e2c1b1461023a578063f49543871461024f575b601554600160a060020a03168015156100f05760405160e560020a62461bcd0281526004016100e7906107e7565b60405180910390fd5b60405136600082376000803683855af43d806000843e818015610111578184f35b8184fd5b34801561012157600080fd5b50610135610130366004610614565b61026f565b005b34801561014357600080fd5b50610135610152366004610614565b610354565b34801561016357600080fd5b5061016c610425565b60405161017991906107b5565b60405180910390f35b34801561018e57600080fd5b50610135610434565b3480156101a357600080fd5b50610135610486565b3480156101b857600080fd5b5061016c6104d2565b3480156101cd57600080fd5b506101356101dc366004610614565b6104e6565b3480156101ed57600080fd5b506101f6610547565b6040516101799190610827565b34801561020f57600080fd5b5061021861054d565b60405161017991906107c9565b34801561023157600080fd5b5061016c61056e565b34801561024657600080fd5b506101f661057d565b34801561025b57600080fd5b5061013561026a36600461063a565b610583565b6013546101009004600160a060020a031633146102a15760405160e560020a62461bcd0281526004016100e790610807565b600160a060020a03811615156102cc5760405160e560020a62461bcd0281526004016100e7906107d7565b601554600160a060020a03828116911614156102fd5760405160e560020a62461bcd0281526004016100e790610817565b6015805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383169081179091556040517fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6013546101009004600160a060020a031633146103865760405160e560020a62461bcd0281526004016100e790610807565b600160a060020a03811615156103b15760405160e560020a62461bcd0281526004016100e7906107f7565b601354604051600160a060020a0380841692610100900416907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a360138054600160a060020a039092166101000274ffffffffffffffffffffffffffffffffffffffff0019909216919091179055565b601554600160a060020a031690565b6013546101009004600160a060020a031633146104665760405160e560020a62461bcd0281526004016100e790610807565b6013805474ffffffffffffffffffffffffffffffffffffffff0019169055565b601454600160a060020a03163314156104d05760145460138054600160a060020a039092166101000274ffffffffffffffffffffffffffffffffffffffff00199092169190911790555b565b6013546101009004600160a060020a031681565b6013546101009004600160a060020a031633146105185760405160e560020a62461bcd0281526004016100e790610807565b6014805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60115481565b60145474010000000000000000000000000000000000000000900460ff1681565b601454600160a060020a031681565b60125481565b6013546101009004600160a060020a031633146105b55760405160e560020a62461bcd0281526004016100e790610807565b60148054911515740100000000000000000000000000000000000000000274ff000000000000000000000000000000000000000019909216919091179055565b60006106018235610835565b9392505050565b60006106018235610841565b60006020828403121561062657600080fd5b600061063284846105f5565b949350505050565b60006020828403121561064c57600080fd5b60006106328484610608565b61066181610835565b82525050565b61066181610841565b602181527f43616e6e6f74207570677261646520746f20696e76616c69642061646472657360208201527f7300000000000000000000000000000000000000000000000000000000000000604082015260600190565b601f81527f696d706c656d656e746174696f6e20636f6e7472616374206e6f742073657400602082015260400190565b601d81527f4e6577206f776e657220697320746865207a65726f2061646472657373000000602082015260400190565b600981527f4e6f74206f776e65720000000000000000000000000000000000000000000000602082015260400190565b602981527f43616e6e6f74207570677261646520746f207468652073616d6520696d706c6560208201527f6d656e746174696f6e0000000000000000000000000000000000000000000000604082015260600190565b61066181610846565b602081016107c38284610658565b92915050565b602081016107c38284610667565b602080825281016107c381610670565b602080825281016107c3816106c6565b602080825281016107c3816106f6565b602080825281016107c381610726565b602080825281016107c381610756565b602081016107c382846107ac565b600160a060020a031690565b151590565b905600a265627a7a7230582004a0005c9a129c335f49082cea1921b0fe13a2c314d3511f284a6f9bd263c5ff6c6578706572696d656e74616cf50037

Deployed Bytecode Sourcemap

45881:515:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1349:15;;-1:-1:-1;;;;;1349:15:0;1383:19;;;1375:63;;;;-1:-1:-1;;;;;1375:63:0;;;;;;;;;;;;;;;;;1492:4;1486:11;1532:12;1529:1;1524:3;1511:34;1620:1;1617;1603:12;1598:3;1591:5;1586:3;1573:49;1648:14;1699:4;1696:1;1691:3;1676:28;1727:6;1747:28;;;;1811:4;1806:3;1799:17;1747:28;1768:4;1763:3;1756:17;46109:284;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;46109:284:0;;;;;;;;;;;3470:225;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;3470:225:0;;;;;;;;;1188:97;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1188:97:0;;;;;;;;;;;;;;;;;;;;4168:83;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4168:83:0;;;;4037:123;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4037:123:0;;;;3269:20;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3269:20:0;;;;3933:96;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;3933:96:0;;;;;;;;;44344:38;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44344:38:0;;;;;;;;;;;;5306:26;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5306:26:0;;;;;;;;;;;;3438:23;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3438:23:0;;;;44636:47;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44636:47:0;;;;5664:100;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;5664:100:0;;;;;;;;;46109:284;3222:5;;;;;-1:-1:-1;;;;;3222:5:0;3208:10;:19;3200:41;;;;-1:-1:-1;;;;;3200:41:0;;;;;;;;;-1:-1:-1;;;;;46178:18:0;;;;46170:64;;;;-1:-1:-1;;;;;46170:64:0;;;;;;;;;46261:15;;-1:-1:-1;;;;;46253:23:0;;;46261:15;;46253:23;;46245:77;;;;-1:-1:-1;;;;;46245:77:0;;;;;;;;;46333:15;:22;;-1:-1:-1;;46333:22:0;-1:-1:-1;;;;;46333:22:0;;;;;;;;46371:14;;;;-1:-1:-1;;46371:14:0;46109:284;:::o;3470:225::-;3222:5;;;;;-1:-1:-1;;;;;3222:5:0;3208:10;:19;3200:41;;;;-1:-1:-1;;;;;3200:41:0;;;;;;;;;-1:-1:-1;;;;;3548:23:0;;;;3540:65;;;;-1:-1:-1;;;;;3540:65:0;;;;;;;;;3642:5;;3621:38;;-1:-1:-1;;;;;3621:38:0;;;;3642:5;;;;;3621:38;;;;;3670:5;:17;;-1:-1:-1;;;;;3670:17:0;;;;;-1:-1:-1;;3670:17:0;;;;;;;;;3470:225::o;1188:97::-;1262:15;;-1:-1:-1;;;;;1262:15:0;1188:97;:::o;4168:83::-;3222:5;;;;;-1:-1:-1;;;;;3222:5:0;3208:10;:19;3200:41;;;;-1:-1:-1;;;;;3200:41:0;;;;;;;;;4225:5;:18;;-1:-1:-1;;4225:18:0;;;4168:83::o;4037:123::-;4100:8;;-1:-1:-1;;;;;4100:8:0;4086:10;:22;4082:71;;;4133:8;;4125:5;:16;;-1:-1:-1;;;;;4133:8:0;;;;4125:16;-1:-1:-1;;4125:16:0;;;;;;;;;4082:71;4037:123::o;3269:20::-;;;;;;-1:-1:-1;;;;;3269:20:0;;:::o;3933:96::-;3222:5;;;;;-1:-1:-1;;;;;3222:5:0;3208:10;:19;3200:41;;;;-1:-1:-1;;;;;3200:41:0;;;;;;;;;4001:8;:20;;-1:-1:-1;;4001:20:0;-1:-1:-1;;;;;4001:20:0;;;;;;;;;;3933:96::o;44344:38::-;;;;:::o;5306:26::-;;;;;;;;;:::o;3438:23::-;;;-1:-1:-1;;;;;3438:23:0;;:::o;44636:47::-;;;;:::o;5664:100::-;3222:5;;;;;-1:-1:-1;;;;;3222:5:0;3208:10;:19;3200:41;;;;-1:-1:-1;;;;;3200:41:0;;;;;;;;;5743:6;:13;;;;;;;-1:-1:-1;;5743:13:0;;;;;;;;;5664:100::o;5:118:-1:-;;72:46;110:6;97:20;72:46;;;63:55;57:66;-1:-1;;;57:66;130:112;;194:43;229:6;216:20;194:43;;249:241;;353:2;341:9;332:7;328:23;324:32;321:2;;;369:1;366;359:12;321:2;404:1;421:53;466:7;446:9;421:53;;;411:63;315:175;-1:-1;;;;315:175;497:235;;598:2;586:9;577:7;573:23;569:32;566:2;;;614:1;611;604:12;566:2;649:1;666:50;708:7;688:9;666:50;;739:110;812:31;837:5;812:31;;;807:3;800:44;794:55;;;856:101;923:28;945:5;923:28;;965:397;1120:2;1108:15;;1157:66;1152:2;1143:12;;1136:88;1258:66;1253:2;1244:12;;1237:88;1353:2;1344:12;;1101:261;1371:296;1526:2;1514:15;;1563:66;1558:2;1549:12;;1542:88;1658:2;1649:12;;1507:160;1676:296;1831:2;1819:15;;1868:66;1863:2;1854:12;;1847:88;1963:2;1954:12;;1812:160;1981:295;2136:1;2124:14;;2172:66;2167:2;2158:12;;2151:88;2267:2;2258:12;;2117:159;2285:397;2440:2;2428:15;;2477:66;2472:2;2463:12;;2456:88;2578:66;2573:2;2564:12;;2557:88;2673:2;2664:12;;2421:261;2690:110;2763:31;2788:5;2763:31;;2807:193;2915:2;2900:18;;2929:61;2904:9;2963:6;2929:61;;;2886:114;;;;;3007:181;3109:2;3094:18;;3123:55;3098:9;3151:6;3123:55;;3195:387;3376:2;3390:47;;;3361:18;;3451:121;3361:18;3451:121;;3589:387;3770:2;3784:47;;;3755:18;;3845:121;3755:18;3845:121;;3983:387;4164:2;4178:47;;;4149:18;;4239:121;4149:18;4239:121;;4377:387;4558:2;4572:47;;;4543:18;;4633:121;4543:18;4633:121;;4771:387;4952:2;4966:47;;;4937:18;;5027:121;4937:18;5027:121;;5165:193;5273:2;5258:18;;5287:61;5262:9;5321:6;5287:61;;5365:128;-1:-1;;;;;5434:54;;5417:76;5500:92;5573:13;5566:21;;5549:43;5599:79;5668:5;5651:27

Swarm Source

bzzr://04a0005c9a129c335f49082cea1921b0fe13a2c314d3511f284a6f9bd263c5ff

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
0xfCeAAaEB8D564a9D0e71Ef36f027b9D162bC334e
Net Worth in USD
$2,394,206.64

Net Worth in ETH
1,137.590262

Token Allocations
USDC 59.12%
USDT 16.94%
WBTC 16.53%
Others 7.40%
Chain Token Portfolio % Price Amount Value
ETH59.12%$0.9999981,415,568.8638$1,415,566.03
ETH16.94%$1405,602.3813$405,602.38
ETH16.53%$71,367.865.5463$395,829.54
ETH3.66%$0.00267232,832,176.7261$87,712.45
ETH1.46%$0.0011330,992,035.3496$35,016.04
ETH1.41%$0.0000065,570,471,176.1151$33,786.07
ETH
Ether (ETH)
0.45%$2,104.635.1404$10,818.67
ETH0.23%<$0.0000011,319,848,034,805.9722$5,608.03
ETH0.06%$0.12244711,128.6084$1,362.66
ETH0.04%$1,800.60.5511$992.27
ETH0.03%$9.2388.4579$816.47
ETH0.02%$0.003,858.1678$0.00
ETH<0.01%$3.9540.9888$161.91
ETH<0.01%$0.209266665.9697$139.36
ETH<0.01%$1.14104.6642$119.32
ETH<0.01%$0.0814981,343.299$109.48
ETH<0.01%$0.00180226,039.1661$46.92
ETH<0.01%$0.99983140.4552$40.45
ETH<0.01%$4,987.980.001096$5.47
ETH<0.01%$0.9995323.2901$3.29
ETH<0.01%$0.032428100$3.24
ETH<0.01%$0.9996410.89$0.8896
ETH<0.01%$0.000001436,092.4951$0.4666
ETH<0.01%$0.1510462$0.302
ETH<0.01%$0.0559474.6398$0.2595
ETH<0.01%$0.000.0154$0.00
BASE<0.01%$0.019895160$3.18
BASE<0.01%$2,105.270.000000998516$0.002102
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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