ETH Price: $1,963.65 (+2.96%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Close184754642023-11-01 6:27:35851 days ago1698820055IN
0xabAA8Fa0...6F217BEf4
0 ETH0.0024213812.91046176
Initialize184754622023-11-01 6:27:11851 days ago1698820031IN
0xabAA8Fa0...6F217BEf4
0 ETH0.0008049313.36037742

Latest 1 internal transaction

Advanced mode:
Parent Transaction Hash Method Block
From
To
0x3d602d80180702282023-09-05 12:18:23908 days ago1693916303  Contract Creation0 ETH
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

Minimal Proxy Contract for 0xa997d67cb629cd26d9bc954593e92c3e97a232cc

Contract Name:
LinkV2

Compiler Version
v0.8.15+commit.e14f2714

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-09-27
*/

/**
 *Submitted for verification at Etherscan.io on 2022-09-14
*/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

library SafeMath {
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
    unchecked {
        uint256 c = a + b;
        if (c < a) return (false, 0);
        return (true, c);
    }
    }
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
    unchecked {
        if (b > a) return (false, 0);
        return (true, a - b);
    }
    }
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
    unchecked {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) return (true, 0);
        uint256 c = a * b;
        if (c / a != b) return (false, 0);
        return (true, c);
    }
    }

    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
    unchecked {
        if (b == 0) return (false, 0);
        return (true, a / b);
    }
    }

    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
    unchecked {
        if (b == 0) return (false, 0);
        return (true, a % b);
    }
    }


    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }


    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }


    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

 
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }


    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }


    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
    unchecked {
        require(b <= a, errorMessage);
        return a - b;
    }
    }

 
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
    unchecked {
        require(b > 0, errorMessage);
        return a / b;
    }
    }

 
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
    unchecked {
        require(b > 0, errorMessage);
        return a % b;
    }
    }
}

interface IERC721{
    function balanceOf(address _owner) external view returns (uint256);
    function ownerOf(uint256 _tokenId) external view returns (address);
    function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes calldata data) external payable;
    function safeTransferFrom(address _from, address _to, uint256 _tokenId) external payable;
    function transferFrom(address _from, address _to, uint256 _tokenId) external payable;
    function approve(address _approved, uint256 _tokenId) external payable;
    function setApprovalForAll(address _operator, bool _approved) external;
    function getApproved(uint256 _tokenId) external view returns (address);
    function isApprovedForAll(address _owner, address _operator) external view returns (bool);
}

interface Ifactory{
    function getToken(address nft, address userB, uint256 id) external;
    function linkActive(address user, uint256 methodId) external;
    function mintShadow( address to, address nft, uint256 tokenId) external;
    function burnShadow(address nft, uint256 tokenId) external;
}


contract Initialize {
    bool internal initialized;
    modifier noInit(){
        require(!initialized, "initialized");
        _;
        initialized = true;
    }
}


contract Enum {
    Status public status;
    enum Status {INITED, AGREED, CLOSED}
    enum MethodId {cancel, agree, reject, close}
    
    function _init() internal {status = Status.INITED;}

    function _agree() internal {status = Status.AGREED;}

    function _close() internal {status = Status.CLOSED;}
}


contract LinkV2 is Initialize, Enum{
    using SafeMath for uint256;
    //string  public symbol;
    address public factory;
    address public NFT;
    address public userA;
    address public userB;
    uint256 public idA;
    uint256 public idB;
    bool    public isFullLink;
    address public closer;
    uint256 public lockDays;
    uint256 public startTime;
    uint256 public expiredTime;
    uint256 public closeTime;

    modifier onlyLinkUser(){
        require(msg.sender == userA || msg.sender == userB, "Link: access denied");
        _;
    }

    modifier onlyUserB(){
        require(msg.sender == userB, "Link: noly userB");
        _;
    }

    modifier onlyINITED(){
        require(status == Status.INITED, "Link: only initialized");
        _;
    }

    modifier onlyAGREED(){
        require(status == Status.AGREED, "Link: only agreed");
        _;
    }


    function _linkActive(MethodId _methodId) internal{
        Ifactory(factory).linkActive(msg.sender, uint256(_methodId));
    }

    function initialize(address _factory, address _nft, address _userA, address _userB, uint256 _idA, uint256 _idB, uint256 _lockDays) external{
        (factory, NFT, userA, userB, idA, idB, lockDays ) = (_factory, _nft, _userA, _userB, _idA, _idB, _lockDays);
        if(_idB != 0){
            isFullLink = true;
            startTime = block.timestamp;
            expiredTime = startTime.add(lockDays.mul(1 days));
            _agree();
        }else{
            _init();
        }
    }

    function getLinkInfo() external view returns(address NFT_, address userA_, address userB_, uint256 idA_, uint256 idB_, uint256 lockDays_, uint256 startTime_, uint256 expiredTime_, uint256 status_, bool isFullLink_){
        return (NFT, userA, userB, idA, idB, lockDays, startTime, expiredTime, uint256(status), isFullLink);
    }

    function getCloseInfo() external view returns(address closer_, uint256 closeTime_){
        return (closer, closeTime);
    }

    function getStatus() external view returns(string memory status_){
        if (Status.INITED == status)  return "initialized";
        if (Status.AGREED == status)  return "agreed";
        if (Status.CLOSED == status)  return "closed";
    }

    function cancel() external onlyINITED {
        IERC721(NFT).transferFrom(address(this), userA, idA);
        _close();
        _linkActive(MethodId.cancel);
    }

    function agree(uint256 _idB) external onlyUserB onlyINITED{
        require(_idB != 0, "idB can`t be 0");
        idB = _idB;
        Ifactory(factory).getToken(NFT, userB, idB);
        Ifactory(factory).mintShadow(userB, NFT, idB);
        startTime = block.timestamp;
        expiredTime = startTime.add(lockDays.mul(1 days));
        _agree();
        _linkActive(MethodId.agree);
    }

    function reject() external onlyUserB onlyINITED{
        IERC721(NFT).transferFrom(address(this), userA, idA);
        _close();
        _linkActive(MethodId.reject);
    }


    function close() external onlyLinkUser onlyAGREED{
        require(block.timestamp >= expiredTime, "not expired");
        //burn shadowNFT
        Ifactory(factory).burnShadow(NFT, idA);
        Ifactory(factory).burnShadow(NFT, idB);

        IERC721(NFT).transferFrom(address(this), userA, idA);
        if (isFullLink){ 
            IERC721(NFT).transferFrom(address(this), userA, idB);
        }else{
            IERC721(NFT).transferFrom(address(this), userB, idB);
        }
        
        _close();
        closer = msg.sender;
        closeTime = block.timestamp;

        _linkActive(MethodId.close);
    }
}

Contract ABI

API
[{"inputs":[],"name":"NFT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_idB","type":"uint256"}],"name":"agree","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cancel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"close","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"closeTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"closer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"expiredTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCloseInfo","outputs":[{"internalType":"address","name":"closer_","type":"address"},{"internalType":"uint256","name":"closeTime_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLinkInfo","outputs":[{"internalType":"address","name":"NFT_","type":"address"},{"internalType":"address","name":"userA_","type":"address"},{"internalType":"address","name":"userB_","type":"address"},{"internalType":"uint256","name":"idA_","type":"uint256"},{"internalType":"uint256","name":"idB_","type":"uint256"},{"internalType":"uint256","name":"lockDays_","type":"uint256"},{"internalType":"uint256","name":"startTime_","type":"uint256"},{"internalType":"uint256","name":"expiredTime_","type":"uint256"},{"internalType":"uint256","name":"status_","type":"uint256"},{"internalType":"bool","name":"isFullLink_","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getStatus","outputs":[{"internalType":"string","name":"status_","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"idA","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"idB","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_nft","type":"address"},{"internalType":"address","name":"_userA","type":"address"},{"internalType":"address","name":"_userB","type":"address"},{"internalType":"uint256","name":"_idA","type":"uint256"},{"internalType":"uint256","name":"_idB","type":"uint256"},{"internalType":"uint256","name":"_lockDays","type":"uint256"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isFullLink","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockDays","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reject","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"status","outputs":[{"internalType":"enum Enum.Status","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"userA","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"userB","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
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.