Forkchoice Ethereum Mainnet

Address Contract Partially Verified

Address 0x40Db2fd7d8501667029466Ec93149CC45Dc7a0fB
Balance 0 ETH
Nonce 1
Code Size 5167 bytes
Indexed Transactions 0 (1 on-chain, 0% indexed)
External Etherscan · Sourcify

Contract Bytecode

5167 bytes
0x608060405234801561001057600080fd5b50600436106100cf5760003560e01c80638831e9cf1161008c578063d72dd3b411610066578063d72dd3b4146101ae578063fa2af9da146101c1578063faeec01e146101d4578063fdff9b4d146101e757600080fd5b80638831e9cf146101755780639349e66414610188578063a5e90eee1461019b57600080fd5b80630d3245a0146100d45780635722e24a146100fc57806364656bbf146101115780636817031b1461013c5780636c19e7831461014f5780636d31b5c514610162575b600080fd5b6100e76100e2366004611265565b61020a565b60405190151581526020015b60405180910390f35b61010f61010a366004611171565b61029c565b005b600754610124906001600160a01b031681565b6040516001600160a01b0390911681526020016100f3565b61010f61014a366004611171565b610321565b61010f61015d366004611171565b61039d565b61010f6101703660046111ca565b610419565b61010f610183366004611171565b610bf0565b61010f610196366004611171565b610c6c565b61010f6101a9366004611193565b610ce8565b61010f6101bc3660046112ac565b610e30565b600554610124906001600160a01b031681565b600654610124906001600160a01b031681565b6100e76101f5366004611171565b60006020819052908152604090205460ff1681565b60008061026d610267856040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b84610e69565b6003549091506001600160a01b0380831691161415610290576001915050610296565b60009150505b92915050565b3360009081526020819052604090205460ff1615156001146102d95760405162461bcd60e51b81526004016102d090611335565b60405180910390fd5b6001600160a01b0381166102ff5760405162461bcd60e51b81526004016102d0906112de565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b3360009081526020819052604090205460ff1615156001146103555760405162461bcd60e51b81526004016102d090611335565b6001600160a01b03811661037b5760405162461bcd60e51b81526004016102d0906112de565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b3360009081526020819052604090205460ff1615156001146103d15760405162461bcd60e51b81526004016102d090611335565b6001600160a01b0381166103f75760405162461bcd60e51b81526004016102d0906112de565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b600454831461045a5760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b21031b430b4b760991b60448201526064016102d0565b6008546001141561060d57600154600754604051636eb1769f60e11b81526001600160a01b0391821660048201523060248201528892919091169063dd62ed3e9060440160206040518083038186803b1580156104b657600080fd5b505afa1580156104ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104ee91906112c5565b101561053c5760405162461bcd60e51b815260206004820152601d60248201527f5661756c74206e65656420696e63726561736520616c6c6f77616e636500000060448201526064016102d0565b6001546007546040516370a0823160e01b81526001600160a01b039182166004820152889291909116906370a082319060240160206040518083038186803b15801561058757600080fd5b505afa15801561059b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105bf91906112c5565b101561060d5760405162461bcd60e51b815260206004820152601860248201527f5661756c742062616c616e636520697320746f6f206c6f77000000000000000060448201526064016102d0565b604080516001600160a01b0389166020820152908101879052606081018690526080810185905260a0810184905260c0810183905260009060e001604051602081830303815290604052805190602001209050600061066c828461020a565b90506001811515146106b45760405162461bcd60e51b8152602060048201526011602482015270496e76616c6964207369676e617475726560781b60448201526064016102d0565b600254604051636d5dbaa760e01b8152600481018490526001600160a01b0390911690636d5dbaa79060240160206040518083038186803b1580156106f857600080fd5b505afa15801561070c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107309190611248565b1561077d5760405162461bcd60e51b815260206004820152601c60248201527f5769746864726177616c20616c726561647920636f6d706c657465640000000060448201526064016102d0565b60025460405163db67fa6360e01b81526001600160a01b038b81166004830152602482018b9052604482018a9052606482018990526084820187905260a482018590529091169063db67fa639060c401600060405180830381600087803b1580156107e757600080fd5b505af11580156107fb573d6000803e3d6000fd5b5050505060008088111561082357606461081689604b611386565b6108209190611364565b90505b60085461099c576001546001600160a01b03166340c10f198b6108468b8d6113a5565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561088c57600080fd5b505af11580156108a0573d6000803e3d6000fd5b505050506000811115610997576001546005546040516340c10f1960e01b81526001600160a01b039182166004820152602481018490529116906340c10f1990604401600060405180830381600087803b1580156108fd57600080fd5b505af1158015610911573d6000803e3d6000fd5b50506001546006546001600160a01b0391821693506340c10f19925016610938848c6113a5565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561097e57600080fd5b505af1158015610992573d6000803e3d6000fd5b505050505b610be4565b6001546007546001600160a01b03918216916323b872dd91168c6109c08c8e6113a5565b6040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401602060405180830381600087803b158015610a0f57600080fd5b505af1158015610a23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a479190611248565b610a635760405162461bcd60e51b81526004016102d090611307565b8015610be4576001546007546005546040516323b872dd60e01b81526001600160a01b0392831660048201529082166024820152604481018490529116906323b872dd90606401602060405180830381600087803b158015610ac457600080fd5b505af1158015610ad8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610afc9190611248565b610b185760405162461bcd60e51b81526004016102d090611307565b6001546007546006546001600160a01b03928316926323b872dd9281169116610b41858d6113a5565b6040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401602060405180830381600087803b158015610b9057600080fd5b505af1158015610ba4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bc89190611248565b610be45760405162461bcd60e51b81526004016102d090611307565b50505050505050505050565b3360009081526020819052604090205460ff161515600114610c245760405162461bcd60e51b81526004016102d090611335565b6001600160a01b038116610c4a5760405162461bcd60e51b81526004016102d0906112de565b600580546001600160a01b0319166001600160a01b0392909216919091179055565b3360009081526020819052604090205460ff161515600114610ca05760405162461bcd60e51b81526004016102d090611335565b6001600160a01b038116610cc65760405162461bcd60e51b81526004016102d0906112de565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b3360009081526020819052604090205460ff161515600114610d1c5760405162461bcd60e51b81526004016102d090611335565b6001600160a01b038216331415610d635760405162461bcd60e51b815260206004820152600b60248201526a139bdd08185b1b1bddd95960aa1b60448201526064016102d0565b6001600160a01b038216610d895760405162461bcd60e51b81526004016102d0906112de565b6001600160a01b0382166000908152602081905260409020805460ff19168215801591909117909155610df7576040516001600160a01b03831681527f3630096a7f9a158ab9fae41e86bfe31fd2202585a26a9668242672566dae028d906020015b60405180910390a15050565b6040516001600160a01b03831681527f1e25ed4cabec84d314dc176241019653f237da01f2bdd3a10cb0f38b33da676390602001610deb565b3360009081526020819052604090205460ff161515600114610e645760405162461bcd60e51b81526004016102d090611335565b600855565b600080600080845160411415610e935750505060208201516040830151606084015160001a610f09565b845160401415610ec15750505060408201516020830151906001600160ff1b0381169060ff1c601b01610f09565b60405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016102d0565b610f1586828585610f1f565b9695505050505050565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0821115610f9c5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016102d0565b8360ff16601b1480610fb157508360ff16601c145b6110085760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b60648201526084016102d0565b6040805160008082526020820180845288905260ff871692820192909252606081018590526080810184905260019060a0016020604051602081039080840390855afa15801561105c573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166110bf5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016102d0565b95945050505050565b80356001600160a01b03811681146110df57600080fd5b919050565b600082601f8301126110f557600080fd5b813567ffffffffffffffff80821115611110576111106113d2565b604051601f8301601f19908116603f01168101908282118183101715611138576111386113d2565b8160405283815286602085880101111561115157600080fd5b836020870160208301376000602085830101528094505050505092915050565b60006020828403121561118357600080fd5b61118c826110c8565b9392505050565b600080604083850312156111a657600080fd5b6111af836110c8565b915060208301356111bf816113e8565b809150509250929050565b600080600080600080600060e0888a0312156111e557600080fd5b6111ee886110c8565b96506020880135955060408801359450606088013593506080880135925060a0880135915060c088013567ffffffffffffffff81111561122d57600080fd5b6112398a828b016110e4565b91505092959891949750929550565b60006020828403121561125a57600080fd5b815161118c816113e8565b6000806040838503121561127857600080fd5b82359150602083013567ffffffffffffffff81111561129657600080fd5b6112a2858286016110e4565b9150509250929050565b6000602082840312156112be57600080fd5b5035919050565b6000602082840312156112d757600080fd5b5051919050565b6020808252600f908201526e496e76616c6964206164647265737360881b604082015260600190565b60208082526014908201527322a9219918103a3930b739b332b91032b93937b960611b604082015260600190565b60208082526015908201527421b0b63632b91034b9903737ba1036b0b730b3b2b960591b604082015260600190565b60008261138157634e487b7160e01b600052601260045260246000fd5b500490565b60008160001904831182151516156113a0576113a06113bc565b500290565b6000828210156113b7576113b76113bc565b500390565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b80151581146113f657600080fd5b5056fea2646970667358221220a0ff4fc018ca469553728828e0d1c8224185d54f1107cf5ca783768f335a0bfa64736f6c63430008070033

Verified Source Code Partial Match

Compiler: v0.8.7+commit.e28d00a7 EVM: london Optimization: Yes (200 runs)
POLCBridgeMinter.sol 206 lines
// File: ethereum/IERC20Token.sol



pragma solidity 0.8.7;

interface IERC20Token {
    function mint(address account, uint256 value) external;
    function transferFrom(address _from, address _to, uint256 _value) external returns (bool success);
    function allowance(address owner, address spender) external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
}
// File: ethereum/IBridgeLog.sol



pragma solidity 0.8.7;

interface IBridgeLog {
  function outgoing(address _wallet, uint256 _amount, uint256 _fee, uint256 _chainID, uint256 _bridgeIndex) external;
  function incoming(address _wallet, uint256 _amount, uint256 _fee, uint256 _chainID, uint256 _logIndex, bytes32 _txHash) external;
  function withdrawalCompleted(bytes32 _withdrawalId) external view returns (bool completed);
}
// File: ethereum/Managed.sol



// This contract stores and verify accounts with administratives privileges

pragma solidity 0.8.7;

contract Managed {
  event AddManager(address Wallet);
  event RemoveManager(address Wallet);
  mapping(address => bool) public managers;
  modifier onlyManagers() {
    require(managers[msg.sender] == true, "Caller is not manager");
    _;
  }
  constructor() {
    managers[msg.sender] = true;
    emit AddManager(msg.sender);
  }
  function setManager(address _wallet, bool _manager) public onlyManagers {
    require(_wallet != msg.sender, "Not allowed");
    require(_wallet != address(0), "Invalid address");
    managers[_wallet] = _manager;
    if (_manager) {
      emit AddManager(_wallet);
    } else {
      emit RemoveManager(_wallet);
    }
  }
}
// File: ethereum/PolcBridgeMinter.sol



pragma solidity 0.8.7;




// signature verification library

library ECDSA {
  function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
    bytes32 r;
    bytes32 s;
    uint8 v;
    if (signature.length == 65) {
      // solhint-disable-next-line no-inline-assembly
      assembly {
        r := mload(add(signature, 0x20))
        s := mload(add(signature, 0x40))
        v := byte(0, mload(add(signature, 0x60)))
      }
    } else if (signature.length == 64) {
      // solhint-disable-next-line no-inline-assembly
      assembly {
        let vs := mload(add(signature, 0x40))
        r := mload(add(signature, 0x20))
        s := and(
          vs,
          0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
        )
        v := add(shr(255, vs), 27)
      }
    } else {
      revert("ECDSA: invalid signature length");
    }

    return recover(hash, v, r, s);
  }

  function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {
    require(uint256(s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, "ECDSA: invalid signature 's' value");
    require(v == 27 || v == 28, "ECDSA: invalid signature 'v' value");

    // If the signature is valid (and not malleable), return the signer address
    address signer = ecrecover(hash, v, r, s);
    require(signer != address(0), "ECDSA: invalid signature");
    return signer;
  }

  function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
    return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
  }

  function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
    return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
  }
}

contract POLCBridgeMinter is Managed {
  IERC20Token private polcToken;
  IBridgeLog private logger;
  address private signer;
  uint256 private chainID;
  address public platformWallet;
  address public banksWallet;
  address public polcVault;
  uint256 private txMode; // 0 minting, 1 transfer
  
  constructor() {
    polcToken = IERC20Token(0xaA8330FB2B4D5D07ABFE7A72262752a8505C6B37);
    logger = IBridgeLog(0x303bAA0Ef71F1882Ed0Ca7Abe296a642F62Ddf02);
    chainID = 1;
    polcVault = 0xf7A9F6001ff8b499149569C54852226d719f2D76;
    platformWallet = 0x00d6E1038564047244Ad37080E2d695924F8515B;
    banksWallet = 0x57379373df97B21d5cDCdA4A718432704Bd0c2A6;
    signer = 0xa4C03a9B4f1c67aC645A990DDB7B8A27D4D9e7af;
    managers[0x00d6E1038564047244Ad37080E2d695924F8515B] = true;
  }

  // verify transaction signature to ensure signer is valid
  function verifyTXCall(bytes32 _taskHash, bytes memory _sig) public view returns (bool valid) {
    address mSigner = ECDSA.recover(ECDSA.toEthSignedMessageHash(_taskHash), _sig);
    if (mSigner == signer) {
      return true;
    } else {
      return false;
    }
  }

  // users will withdraw their assets with a pre-signed hash validation
  function withdraw(address _wallet, uint256 _amount, uint256 _fee, uint256 _chainFrom, uint256 _chainTo, uint256 _logIndex, bytes memory _sig) public {
    require(_chainTo == chainID, "Invalid chain");
    if (txMode == 1) {
      require(polcToken.allowance(polcVault, address(this)) >= _amount, "Vault need increase allowance");
      require(polcToken.balanceOf(polcVault) >= _amount, "Vault balance is too low");
    }
    bytes32 txHash = keccak256(abi.encode(_wallet, _amount, _fee, _chainFrom, _chainTo, _logIndex));
    bool txv = verifyTXCall(txHash, _sig);
    require (txv == true, "Invalid signature");
    require(logger.withdrawalCompleted(txHash) == false, "Withdrawal already completed");
    logger.incoming(_wallet, _amount, _fee, _chainFrom, _logIndex, txHash);
    uint256 platformFees;
    if (_fee > 0) {
      platformFees = (_fee * 75) / 100;
    }
    if (txMode == 0) {
      polcToken.mint(_wallet, _amount-_fee);
      if (platformFees > 0) {
        polcToken.mint(platformWallet, platformFees);
        polcToken.mint(banksWallet, _fee - platformFees);
      }
    } else {
      require(polcToken.transferFrom(polcVault, _wallet, (_amount - _fee)), "ERC20 transfer error");
        if (platformFees > 0) {
        require(polcToken.transferFrom(polcVault, platformWallet, platformFees), "ERC20 transfer error");
        require(polcToken.transferFrom(polcVault, banksWallet, (_fee - platformFees)), "ERC20 transfer error");
      }
    }
  }

  // administrative variables update
  function setLogger (address _logger) public onlyManagers {
    require(_logger != address(0), "Invalid address");
    logger = IBridgeLog(_logger);
  }
  
  function setSigner (address _signer) public onlyManagers {
    require(_signer != address(0), "Invalid address");
    signer = _signer;
  }

  function setBanksWallet(address _wallet) public onlyManagers {
    require(_wallet != address(0), "Invalid address");
    banksWallet = _wallet;
  }

  function setVault(address _wallet) public onlyManagers {
    require(_wallet != address(0), "Invalid address");
    polcVault = _wallet;
  }

  function setPlatformWallet(address _wallet) public onlyManagers {
    require(_wallet != address(0), "Invalid address");
    platformWallet = _wallet;
  }
  
  function setMode(uint256 _mode) public onlyManagers {
    txMode = _mode;
  }
}

Read Contract

banksWallet 0xfaeec01e → address
managers 0xfdff9b4d → bool
platformWallet 0xfa2af9da → address
polcVault 0x64656bbf → address
verifyTXCall 0x0d3245a0 → bool

Write Contract 8 functions

These functions modify contract state and require a wallet transaction to execute.

setBanksWallet 0x9349e664
address _wallet
setLogger 0x5722e24a
address _logger
setManager 0xa5e90eee
address _wallet
bool _manager
setMode 0xd72dd3b4
uint256 _mode
setPlatformWallet 0x8831e9cf
address _wallet
setSigner 0x6c19e783
address _signer
setVault 0x6817031b
address _wallet
withdraw 0x6d31b5c5
address _wallet
uint256 _amount
uint256 _fee
uint256 _chainFrom
uint256 _chainTo
uint256 _logIndex
bytes _sig

Recent Transactions

This address has 1 on-chain transactions, but only 0% of the chain is indexed. Transactions will appear as indexing progresses. View on Etherscan →