ETH Price: $2,046.09 (-4.81%)
Gas: 0.06 Gwei

Transaction Decoder

Block:
13765872 at Dec-08-2021 04:37:17 PM +UTC
Transaction Fee:
0.013596052925778395 ETH $27.82
Gas Used:
159,545 Gas / 85.217668531 Gwei

Emitted Events:

Account State Difference:

  Address   Before After State Difference Code
0x24329eEc...9827e8C57
0x32D56856...688e85c8e
0.043189459872888917 Eth
Nonce: 7
0.029253406947110522 Eth
Nonce: 8
0.013936052925778395
0x4bB003E4...b70559417
0xaA8330FB...8505C6B37
(Poolin 4)
2,124.081464693875110036 Eth2,124.082174175004353246 Eth0.00070948112924321
0xf7A9F600...d719f2D76 0.948419716528257867 Eth0.948759716528257867 Eth0.00034

Execution Trace

ETH 0.00034 POLCBridgeTransfers.bridgeSend( _amount=139000000000000000000 )
  • PolkaProfitContract.addBankEarnings( _amount=69500000000000000 )
  • ETH 0.00034 0xf7a9f6001ff8b499149569c54852226d719f2d76.CALL( )
  • POLCToken.transferFrom( _from=0x32D568569e050D4e7DfcD524F5aF6f2688e85c8e, _to=0xf7A9F6001ff8b499149569C54852226d719f2D76, _value=139000000000000000000 ) => ( success=True )
    File 1 of 3: POLCBridgeTransfers
    // SPDX-License-Identifier: MIT
    
    
    pragma solidity 0.8.2;
    
    interface IERC20Token {
        function totalSupply() external view returns (uint256 supply);
        function transfer(address _to, uint256 _value) external  returns (bool success);
        function transferFrom(address _from, address _to, uint256 _value) external returns (bool success);
        function balanceOf(address _owner) external view returns (uint256 balance);
        function approve(address _spender, uint256 _value) external returns (bool success);
        function allowance(address _owner, address _spender) external view returns (uint256 remaining);
        function mint(address account, uint256 value) external returns (bool);
    }
    
    interface POLCProfits {
        function addBankEarnings(uint256 _amount) external;
    }
    
    library Address {
    
        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");
        }
    
    }
    
    contract Ownable {
    
        address private owner;
        
        event OwnerSet(address indexed oldOwner, address indexed newOwner);
        
        modifier onlyOwner() {
            require(msg.sender == owner, "Caller is not owner");
            _;
        }
    
        constructor() {
            owner = msg.sender; // 'msg.sender' is sender of current call, contract deployer for a constructor
            emit OwnerSet(address(0), owner);
        }
    
    
        function changeOwner(address newOwner) public onlyOwner {
            emit OwnerSet(owner, newOwner);
            owner = newOwner;
        }
    
        function getOwner() external view returns (address) {
            return owner;
        }
    }
    
    
    contract POLCBridgeTransfers is Ownable {
    
        address payable public bankVault;
        address public polcVault;
        address public polcTokenAddress;
        uint256 public bridgeFee;
        uint256 public gasFee;
        IERC20Token private polcToken;
        POLCProfits public profitsContract;
    
        uint256 public depositIndex;
        
        struct Deposit {
            address sender;
            uint256 amount;
            uint256 fee;
        } 
        
        mapping (uint256 => Deposit) public deposits;
        mapping (address => bool) public whitelisted;
        uint256 maxTXAmount = 25000 ether;
        
        constructor() {
            polcTokenAddress = 0xaA8330FB2B4D5D07ABFE7A72262752a8505C6B37;
            polcToken = IERC20Token(polcTokenAddress);
            bankVault = payable(0xf7A9F6001ff8b499149569C54852226d719f2D76);
            polcVault = 0xf7A9F6001ff8b499149569C54852226d719f2D76;
            bridgeFee = 1;
            gasFee = (1 gwei)*70000;
            whitelisted[0xf7A9F6001ff8b499149569C54852226d719f2D76] = true;
            whitelisted[0xeA50CE6EBb1a5E4A8F90Bfb35A2fb3c3F0C673ec] = true;
            profitsContract = POLCProfits(0xD7588254A4B16B3A0d4B544b0D0a13523115C140);
        }
    
        function bridgeSend(uint256 _amount) public payable {
            require((_amount>=(50 ether) && _amount<=(maxTXAmount)), "Invalid amount");
            require(msg.value >= gasFee, "Invalid gas fee");
            uint256 fee;
            if (bridgeFee > 0) {
                fee = (_amount * bridgeFee) /100;  // bridge transaction fee
                profitsContract.addBankEarnings((fee / 20)); //25% of the fees goes to bank hodlers, 5 banks = 5% each
            }
            Address.sendValue(bankVault, msg.value);
            require(polcToken.transferFrom(msg.sender, polcVault, _amount), "ERC20 transfer error");
            deposits[depositIndex].sender = msg.sender;
            deposits[depositIndex].amount = _amount;
            deposits[depositIndex].fee = fee;
            depositIndex += 1;
        }
        
        function platformTransfer(uint256 _amount) public {
            require(whitelisted[msg.sender] == true, "Not allowed");
            require(polcToken.transferFrom(msg.sender, polcVault, _amount), "ERC20 transfer error");
            deposits[depositIndex].sender = msg.sender;
            deposits[depositIndex].amount = _amount;
            deposits[depositIndex].fee = 0;
            depositIndex += 1;
        }
        
        function setBankVault(address _vault) public onlyOwner {
            bankVault = payable(_vault);
        }
        
        function setPOLCVault(address _vault) public onlyOwner {
            polcVault = _vault;
        }
        
        function setFee(uint256 _fee) public onlyOwner {
            bridgeFee = _fee;   
        }
        
        function setProfitsContract(address _contract) public onlyOwner {
            profitsContract = POLCProfits(_contract);
        }
    
        function setGasFee(uint256 _fee) public onlyOwner {
            gasFee = _fee;
        }
        
        function setMaxTXAmount(uint256 _amount) public onlyOwner {
            maxTXAmount = _amount;
        }
        
        function whitelistWallet(address _wallet, bool _whitelisted) public onlyOwner {
            whitelisted[_wallet] = _whitelisted;
        }
    
        
    }

    File 2 of 3: POLCToken
    // SPDX-License-Identifier: MIT
    
    pragma solidity ^0.8.0;
    
    library SafeMath {
    
        function add(uint256 a, uint256 b) internal pure returns (uint256) {
            uint256 c = a + b;
            require(c >= a, "SafeMath: addition overflow");
    
            return c;
        }
    
        function sub(uint256 a, uint256 b) internal pure returns (uint256) {
            return sub(a, b, "SafeMath: subtraction overflow");
        }
    
        function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
            require(b <= a, errorMessage);
            uint256 c = a - b;
    
            return c;
        }
            
    }
    
    interface ItokenRecipient { 
        function receiveApproval(address _from, uint256 _value, address _token, bytes calldata _extraData) external returns (bool); 
    }
    
    interface IERC20Token {
        function totalSupply() external view returns (uint256 supply);
        function transfer(address _to, uint256 _value) external  returns (bool success);
        function transferFrom(address _from, address _to, uint256 _value) external returns (bool success);
        function balanceOf(address _owner) external view returns (uint256 balance);
        function approve(address _spender, uint256 _value) external returns (bool success);
        function allowance(address _owner, address _spender) external view returns (uint256 remaining);
    }
    
    contract Ownable {
    
        address private owner;
        
        event OwnerSet(address indexed oldOwner, address indexed newOwner);
        
        modifier onlyOwner() {
            require(msg.sender == owner, "Caller is not owner");
            _;
        }
    
        constructor() {
            owner = msg.sender; // 'msg.sender' is sender of current call, contract deployer for a constructor
            emit OwnerSet(address(0), owner);
        }
    
    
        function changeOwner(address newOwner) public onlyOwner {
            emit OwnerSet(owner, newOwner);
            owner = newOwner;
        }
    
        function getOwner() external view returns (address) {
            return owner;
        }
    }
    
    contract StandardToken is IERC20Token {
        
        using SafeMath for uint256;
        mapping (address => uint256) public balances;
        mapping (address => mapping (address => uint256)) public allowed;
        uint256 public _totalSupply;
        
        event Transfer(address indexed _from, address indexed _to, uint256 _value);
        event Approval(address indexed _owner, address indexed _spender, uint256 _value);
        
        function totalSupply() override public view returns (uint256 supply) {
            return _totalSupply;
        }
    
        function transfer(address _to, uint256 _value) override virtual public returns (bool success) {
            require(_to != address(0x0), "Use burn function instead");                              
    		require(_value >= 0, "Invalid amount"); 
    		require(balances[msg.sender] >= _value, "Not enough balance");
    		balances[msg.sender] = balances[msg.sender].sub(_value);
    		balances[_to] = balances[_to].add(_value);
    		emit Transfer(msg.sender, _to, _value);
            return true;
        }
    
        function transferFrom(address _from, address _to, uint256 _value) override virtual public returns (bool success) {
            require(_to != address(0x0), "Use burn function instead");                               
    		require(_value >= 0, "Invalid amount"); 
    		require(balances[_from] >= _value, "Not enough balance");
    		require(allowed[_from][msg.sender] >= _value, "You need to increase allowance");
    		balances[_from] = balances[_from].sub(_value);
    		balances[_to] = balances[_to].add(_value);
    		emit Transfer(_from, _to, _value);
            return true;
        }
    
        function balanceOf(address _owner) override public view returns (uint256 balance) {
            return balances[_owner];
        }
    
        function approve(address _spender, uint256 _value) override public returns (bool success) {
            allowed[msg.sender][_spender] = _value;
            emit Approval(msg.sender, _spender, _value);
            return true;
        }
    
        function allowance(address _owner, address _spender) override public view returns (uint256 remaining) {
            return allowed[_owner][_spender];
        }
        
    }
    
    contract POLCToken is Ownable, StandardToken {
    
        using SafeMath for uint256;
        string public name = "Polka City";
        uint8 public decimals = 18;
        string public symbol = "POLC";
    
        // Time lock for progressive release of team, marketing and platform balances
        struct TimeLock {
            uint256 totalAmount;
            uint256 lockedBalance;
            uint128 baseDate;
            uint64 step;
            uint64 tokensStep;
        }
        mapping (address => TimeLock) public timeLocks; 
    
        // Prevent Bots - If true, limits transactions to 1 transfer per block (whitelisted can execute multiple transactions)
        bool public limitTransactions;
        mapping (address => bool) public contractsWhiteList;
        mapping (address => uint) public lastTXBlock;
        event Burn(address indexed from, uint256 value);
    
    // token sale
    
        // Wallet for the tokens to be sold, and receive ETH
        address payable public salesWallet;
        uint256 public soldOnCSale;
        uint256 public constant CROWDSALE_START = 1613926800;
        uint256 public constant CROWDSALE_END = 1614556740;
        uint256 public constant CSALE_WEI_FACTOR = 15000;
        uint256 public constant CSALE_HARDCAP = 7500000 ether;
        
        constructor() {
            _totalSupply = 250000000 ether;
            
            // Base date to calculate team, marketing and platform tokens lock
            uint256 lockStartDate = 1613494800;
            
            // Team wallet - 10000000 tokens
            // 0 tokens free, 10000000 tokens locked - progressive release of 5% every 30 days (after 180 days of waiting period)
            address team = 0x4ef5B3d10fD217AC7ddE4DDee5bF319c5c356723;
            balances[team] = 10000000 ether;
            timeLocks[team] = TimeLock(10000000 ether, 10000000 ether, uint128(lockStartDate + (180 days)), 30 days, 500000);
            emit Transfer(address(0x0), team, balances[team]);
    
            // Marketing wallet - 5000000 tokens
            // 1000000 tokens free, 4000000 tokens locked - progressive release of 5% every 30 days
            address marketingWallet = 0x056F878d4Ac07E66C9a46a8db4918E827c6fD71c;
            balances[marketingWallet] = 5000000 ether;
            timeLocks[marketingWallet] = TimeLock(4000000 ether, 4000000 ether, uint128(lockStartDate), 30 days, 200000);
            emit Transfer(address(0x0), marketingWallet, balances[marketingWallet]);
            
            // Private sale wallet - 2500000 tokens
            address privateWallet = 0xED854fCF86efD8473F174d6dE60c8A5EBDdCc37A;
            balances[privateWallet] = 2500000 ether;
            emit Transfer(address(0x0), privateWallet, balances[privateWallet]);
            
            // Sales wallet, holds Pre-Sale balance - 7500000 tokens
            salesWallet = payable(0x4bb74E94c1EB133a6868C53aA4f6BD437F99c347);
            balances[salesWallet] = 7500000 ether;
            emit Transfer(address(0x0), salesWallet, balances[salesWallet]);
            
            // Exchanges - 25000000 tokens
            address exchanges = 0xE50d4358425a93702988eCd8B66c2EAD8b41CE5d;  
            balances[exchanges] = 25000000 ether;
            emit Transfer(address(0x0), exchanges, balances[exchanges]);
            
            // Platform wallet - 200000000 tokens
            // 50000000 tokens free, 150000000 tokens locked - progressive release of 25000000 every 90 days
            address platformWallet = 0xAD334543437EF71642Ee59285bAf2F4DAcBA613F;
            balances[platformWallet] = 200000000 ether;
            timeLocks[platformWallet] = TimeLock(150000000 ether, 150000000 ether, uint128(lockStartDate), 90 days, 25000000);
            emit Transfer(address(0x0), platformWallet, balances[platformWallet]);
            
    
    
        }
        
        function transfer(address _to, uint256 _value) override public returns (bool success) {
            require(checkTransferLimit(), "Transfers are limited to 1 per block");
            require(_value <= (balances[msg.sender] - timeLocks[msg.sender].lockedBalance));
            return super.transfer(_to, _value);
        }
        
        function transferFrom(address _from, address _to, uint256 _value) override public returns (bool success) {
            require(checkTransferLimit(), "Transfers are limited to 1 per block");
            require(_value <= (balances[_from] - timeLocks[_from].lockedBalance));
            return super.transferFrom(_from, _to, _value);
        }
        
        function burn(uint256 _value) public returns (bool success) {
            require(balances[msg.sender] >= _value, "Not enough balance");
    		require(_value >= 0, "Invalid amount"); 
            balances[msg.sender] = balances[msg.sender].sub(_value);
            _totalSupply = _totalSupply.sub(_value);
            emit Burn(msg.sender, _value);
            return true;
        }
        
        function approveAndCall(address _spender, uint256 _value, bytes memory _extraData) public returns (bool success) {
            allowed[msg.sender][_spender] = _value;
            emit Approval(msg.sender, _spender, _value);
            ItokenRecipient recipient = ItokenRecipient(_spender);
            require(recipient.receiveApproval(msg.sender, _value, address(this), _extraData));
            return true;
        }
        
    
        function releaseTokens(address _account) public {
            uint256 timeDiff = block.timestamp - uint256(timeLocks[_account].baseDate);
            require(timeDiff > uint256(timeLocks[_account].step), "Unlock point not reached yet");
            uint256 steps = (timeDiff / uint256(timeLocks[_account].step));
            uint256 unlockableAmount = ((uint256(timeLocks[_account].tokensStep) * 1 ether) * steps);
            if (unlockableAmount >=  timeLocks[_account].totalAmount) {
                timeLocks[_account].lockedBalance = 0;
            } else {
                timeLocks[_account].lockedBalance = timeLocks[_account].totalAmount - unlockableAmount;
            }
        }
           
        function checkTransferLimit() internal returns (bool txAllowed) {
            address _caller = msg.sender;
            if (limitTransactions == true && contractsWhiteList[_caller] != true) {
                if (lastTXBlock[_caller] == block.number) {
                    return false;
                } else {
                    lastTXBlock[_caller] = block.number;
                    return true;
                }
            } else {
                return true;
            }
        }
        
        function enableTXLimit() public onlyOwner {
            limitTransactions = true;
        }
        
        function disableTXLimit() public onlyOwner {
            limitTransactions = false;
        }
        
        function includeWhiteList(address _contractAddress) public onlyOwner {
            contractsWhiteList[_contractAddress] = true;
        }
        
        function removeWhiteList(address _contractAddress) public onlyOwner {
            contractsWhiteList[_contractAddress] = false;
        }
        
        function getLockedBalance(address _wallet) public view returns (uint256 lockedBalance) {
            return timeLocks[_wallet].lockedBalance;
        }
        
        function buy() public payable {
            require((block.timestamp > CROWDSALE_START) && (block.timestamp < CROWDSALE_END), "Contract is not selling tokens");
            uint weiValue = msg.value;
            require(weiValue >= (5 * (10 ** 16)), "Minimum amount is 0.05 eth");
            require(weiValue <= (20 ether), "Maximum amount is 20 eth");
            uint amount = CSALE_WEI_FACTOR * weiValue;
            require((soldOnCSale) <= (CSALE_HARDCAP), "That quantity is not available");
            soldOnCSale += amount;
            balances[salesWallet] = balances[salesWallet].sub(amount);
            balances[msg.sender] = balances[msg.sender].add(amount);
            require(salesWallet.send(weiValue));
            emit Transfer(salesWallet, msg.sender, amount);
    
        }
        
        function burnUnsold() public onlyOwner {
            require(block.timestamp > CROWDSALE_END);
            uint currentBalance = balances[salesWallet];
            balances[salesWallet] = 0;
            _totalSupply = _totalSupply.sub(currentBalance);
            emit Burn(salesWallet, currentBalance);
        }
    }

    File 3 of 3: PolkaProfitContract
    // SPDX-License-Identifier: MIT
    
    pragma solidity 0.8.2;
    
    interface IERC20Token {
        function transferFrom(address _from, address _to, uint256 _value) external returns (bool success);
    }
    
    interface IERC721 {
    
        function setPaymentDate(uint256 _asset) external;
        function getTokenDetails(uint256 index) external view returns (uint32 aType, uint32 customDetails, uint32 lastTx, uint32 lastPayment, uint256 initialvalue, string memory coin);
        function ownerOf(uint256 tokenId) external view returns (address owner);
        function balanceOf(address _owner) external view returns (uint256);
    }
    
    library Address {
    
        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;
        }
    
    
        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");
        }
    
       
        function functionCall(address target, bytes memory data) internal returns (bytes memory) {
          return functionCall(target, data, "Address: low-level call failed");
        }
    
        
        function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
            return functionCallWithValue(target, data, 0, errorMessage);
        }
    
        
        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");
        }
    
        
        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);
        }
    
       
        function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
            return functionStaticCall(target, data, "Address: low-level static call failed");
        }
    
        
        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);
        }
    
       
        function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
            return functionDelegateCall(target, data, "Address: low-level delegate call failed");
        }
    
      
        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);
                }
            }
        }
    }
    
    contract Ownable {
    
        address private owner;
        
        event OwnerSet(address indexed oldOwner, address indexed newOwner);
        
        modifier onlyOwner() {
            require(msg.sender == owner, "Caller is not owner");
            _;
        }
    
        constructor() {
            owner = msg.sender; // 'msg.sender' is sender of current call, contract deployer for a constructor
            emit OwnerSet(address(0), owner);
        }
    
    
        function changeOwner(address newOwner) public onlyOwner {
            emit OwnerSet(owner, newOwner);
            owner = newOwner;
        }
    
        function getOwner() external view returns (address) {
            return owner;
        }
    }
    
    contract PolkaProfitContract is Ownable {
        
        event Payment(address indexed to, uint256 amount, uint8 network, uint256 gasFee);
        
        bool public paused;
    
        struct Claim {
            address account;
            uint8 dNetwork;  // 1= Ethereum   2= BSC
            uint256 assetId;
            uint256 amount;
            uint256 date;
        }
        
        Claim[] public payments;
        
        mapping (address => bool) public blackListed;
        mapping (uint256 => uint256) public weeklyByType;
        address public nftAddress = 0xB20217bf3d89667Fa15907971866acD6CcD570C8;
        address public tokenAddress = 0xaA8330FB2B4D5D07ABFE7A72262752a8505C6B37;
        address payable public walletAddress;
        uint256 public gasFee = 1000000000000000;
        mapping (uint256 => uint256) public bankWithdraws;
        uint256 public bankEarnings;
        address bridgeContract;
        
    
        uint256 wUnit = 1 weeks;
        
        constructor() {
            weeklyByType[20] = 18 ether;
            weeklyByType[22] = 4 ether;
            weeklyByType[23] = 3 ether;
            weeklyByType[25] = 1041 ether;
            weeklyByType[26] = 44 ether;
            weeklyByType[29] = 3125 ether;
            weeklyByType[30] = 29 ether;
            weeklyByType[31] = 5 ether;
            weeklyByType[32] = 20 ether;
            weeklyByType[34] = 10 ether;
            weeklyByType[36] = 70 ether;
            weeklyByType[37] = 105 ether;
            weeklyByType[38] = 150 ether;
            weeklyByType[39] = 600 ether;
            weeklyByType[40] = 20 ether;
            
            walletAddress = payable(0xAD334543437EF71642Ee59285bAf2F4DAcBA613F);
            bridgeContract = 0x0A0b052D93EaA7C67F498fb3F8D9f4f56456BA51;
        }
        
        function profitsPayment(uint256 _assetId) public returns (bool success) {
            require(paused == false, "Contract is paused");
            IERC721 nft = IERC721(nftAddress);
            address assetOwner = nft.ownerOf(_assetId);
            require(assetOwner == msg.sender, "Only asset owner can claim profits");
            require(blackListed[assetOwner] == false, "This address cannot claim profits");
            (uint256 totalPayment, ) = calcProfit(_assetId);
            require (totalPayment > 0, "You need to wait at least 1 week to claim");
            nft.setPaymentDate(_assetId);
            IERC20Token token = IERC20Token(tokenAddress);
            require(token.transferFrom(walletAddress, assetOwner, totalPayment), "ERC20 transfer fail");
            Claim memory thisclaim = Claim(msg.sender, 1, _assetId, totalPayment, block.timestamp);
            payments.push(thisclaim);
            emit Payment(msg.sender, totalPayment, 1, 0);
            return true;
        }
        
        function profitsPaymentBSC(uint256 _assetId) public payable returns (bool success) {
            require(paused == false, "Contract is paused");
            require(msg.value >= gasFee, "Gas fee too low");
            IERC721 nft = IERC721(nftAddress);
            address assetOwner = nft.ownerOf(_assetId);
            require(assetOwner == msg.sender, "Only asset owner can claim profits");
            require(blackListed[assetOwner] == false, "This address cannot claim profits");
            (uint256 totalPayment, ) = calcProfit(_assetId);
            require (totalPayment > 0, "You need to wait at least 1 week to claim");
            nft.setPaymentDate(_assetId);
            Address.sendValue(walletAddress, msg.value);
            Claim memory thisclaim = Claim(msg.sender, 2, _assetId, totalPayment, block.timestamp);
            payments.push(thisclaim);
            emit Payment(msg.sender, totalPayment, 2, msg.value);
            return true;
        }
        
        function calcProfit(uint256 _assetId) public view returns (uint256 _profit, uint256 _lastPayment) {
            IERC721 nft = IERC721(nftAddress);
            (uint32 assetType,, uint32 lastTransfer, uint32 lastPayment,, ) = nft.getTokenDetails(_assetId);
            uint256 cTime = block.timestamp - lastTransfer;
            uint256 dTime = 0;
            if (lastTransfer < lastPayment) {
                dTime = lastPayment - lastTransfer;
            }
            if ((cTime) < wUnit) { 
                return (0, lastTransfer);
            } else {
                 uint256 weekCount;  
                if (dTime == 0) {
                    weekCount = ((cTime)/(wUnit));
                } else {
                    weekCount = ((cTime)/(wUnit)) - (dTime)/(wUnit);
                }
                if (weekCount < 1) {
                    return (0, lastPayment);
                } else {
                    uint256 totalPayment;
                    totalPayment = ((weekCount * weeklyByType[assetType]));
                    return (totalPayment, lastPayment);  
                    
                }
            }
        }
        
        function calcTotalEarnings(uint256 _assetId) public view returns (uint256 _profit, uint256 _lastPayment) {
            IERC721 nft = IERC721(nftAddress);
            (uint32 assetType,, uint32 lastTransfer,,, ) = nft.getTokenDetails(_assetId);
            uint256 timeFrame = block.timestamp - lastTransfer;
            if (timeFrame < wUnit) {  
                return (0, lastTransfer);
            } else {
                uint256 weekCount = timeFrame/(wUnit); 
                uint256 totalPayment;
                totalPayment = ((weekCount * weeklyByType[assetType]));
                return (totalPayment, lastTransfer);    
            }
    
        }
        
    
        function pauseContract(bool _paused) public onlyOwner {
            paused = _paused;
        }
        
        function blackList(address _wallet, bool _blacklist) public onlyOwner {
            blackListed[_wallet] = _blacklist;
        }
    
        function paymentCount() public view returns (uint256 _paymentCount) {
            return payments.length;
        }
        
        function paymentDetail(uint256 _paymentIndex) public view returns (address _to, uint8 _network, uint256 assetId, uint256 _amount, uint256 _date) {
            Claim memory thisPayment = payments[_paymentIndex];
            return (thisPayment.account, thisPayment.dNetwork, thisPayment.assetId, thisPayment.amount, thisPayment.date);
        }
        
        function addType(uint256 _aType, uint256 _weekly) public onlyOwner {
            weeklyByType[_aType] = _weekly;
        }
        
        function setGasFee(uint256 _gasFee) public onlyOwner {
            gasFee = _gasFee;
        }
        
        function setWalletAddress(address _wallet) public onlyOwner {
            walletAddress = payable(_wallet);
        }
        
        function setBridgeContract(address _contract) public onlyOwner {
            bridgeContract = _contract;
        }
        
        function addBankEarnings(uint256 _amount) public {
            require(msg.sender == bridgeContract, "Not Allowed");
            bankEarnings += _amount;
        }
        
        function claimBankEarnings(uint256 _assetId) public {
            IERC721 nft = IERC721(nftAddress);
            (uint32 assetType,,,,, ) = nft.getTokenDetails(_assetId);
            address assetOwner = nft.ownerOf(_assetId);
            require(assetType == 33, "Invalid asset");
            uint256 toPay = bankEarnings - bankWithdraws[_assetId];
            if (toPay > 0) {
                bankWithdraws[_assetId] = bankEarnings;
                IERC20Token token = IERC20Token(tokenAddress);
                require(token.transferFrom(walletAddress, assetOwner, toPay), "ERC20 transfer fail");
                emit Payment(assetOwner, toPay, 2, 0);
            }
        }
        
        function claimBankEarningsBSC(uint256 _assetId) public payable {
            IERC721 nft = IERC721(nftAddress);
            (uint32 assetType,,,,, ) = nft.getTokenDetails(_assetId);
            address assetOwner = nft.ownerOf(_assetId);
            require(assetType == 33, "Invalid asset");
            uint256 toPay = bankEarnings - bankWithdraws[_assetId];
            if (toPay > 0) {
                bankWithdraws[_assetId] = bankEarnings;
                Claim memory thisclaim = Claim(assetOwner, 2, _assetId, toPay, block.timestamp);
                payments.push(thisclaim);
                emit Payment(assetOwner, toPay, 2, msg.value);
            }
    
        }
        
    
    
        
    }