Address Contract Partially Verified
Address
0x40Db2fd7d8501667029466Ec93149CC45Dc7a0fB
Balance
0 ETH
Nonce
1
Code Size
5167 bytes
Creator
0xbcdDBfca...5FAE at tx 0x6033e905...80644f
Indexed Transactions
0 (1 on-chain, 0% indexed)
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 →