Contract
0xfe0fa3C06d03bDC7fb49c892BbB39113B534fB57
6
Contract Overview
Balance:
0 ETH
ETH Value:
$0.00
My Name Tag:
Not Available
Txn Hash | Method |
Block
|
From
|
To
|
Value | [Txn Fee] | |||
---|---|---|---|---|---|---|---|---|---|
0xe0f99400fe0aadd981d294b27aa3f0adecead4d388323a1d879d64502daa0078 | 0x41706c4e | 5415703 | 111 days 2 hrs ago | 0x4032a039d9035571912d6e74adf403561561e9d8 | IN | 0xfe0fa3c06d03bdc7fb49c892bbb39113b534fb57 | 0 ETH | 0.001105205124 ETH | |
0x124d2ef13e23f6920c94bf937406d7cd97a2623f8d43a6855c9f2c6026b9a1e3 | 0x41706c4e | 4449702 | 139 days 3 hrs ago | 0x08df298eb3b35f4649c6cb0754fb3593bc781264 | IN | 0xfe0fa3c06d03bdc7fb49c892bbb39113b534fb57 | 0 ETH | 0.001547175559 ETH | |
0xef43009197c014ed357820b528919ccc2bd309b2658b5380396a3ee851e600ae | Register Domain ... | 4449014 | 139 days 4 hrs ago | 0x2b241cbe6b455e08ade78a7ccc42de2403d7b566 | IN | 0xfe0fa3c06d03bdc7fb49c892bbb39113b534fb57 | 0 ETH | 0.001052264064 ETH | |
0xc917e470d12f723bd91feab9fe9ad415dc5432504f131ba837b56ffbd907a687 | 0x60806040 | 4449009 | 139 days 4 hrs ago | 0x2b241cbe6b455e08ade78a7ccc42de2403d7b566 | IN | Contract Creation | 0 ETH | 0.013853877355 ETH |
[ Download CSV Export ]
Latest 4 internal transactions
Parent Txn Hash | Block | From | To | Value | |||
---|---|---|---|---|---|---|---|
0xe0f99400fe0aadd981d294b27aa3f0adecead4d388323a1d879d64502daa0078 | 5415703 | 111 days 2 hrs ago | 0xfe0fa3c06d03bdc7fb49c892bbb39113b534fb57 | 0xd9f3456fc9eaad006d043502c34362fc030e29dd | 0 ETH | ||
0xe0f99400fe0aadd981d294b27aa3f0adecead4d388323a1d879d64502daa0078 | 5415703 | 111 days 2 hrs ago | 0xfe0fa3c06d03bdc7fb49c892bbb39113b534fb57 | 0x0000000000000000000000000000000000000001 | 0 ETH | ||
0x124d2ef13e23f6920c94bf937406d7cd97a2623f8d43a6855c9f2c6026b9a1e3 | 4449702 | 139 days 3 hrs ago | 0xfe0fa3c06d03bdc7fb49c892bbb39113b534fb57 | 0xd9f3456fc9eaad006d043502c34362fc030e29dd | 0 ETH | ||
0x124d2ef13e23f6920c94bf937406d7cd97a2623f8d43a6855c9f2c6026b9a1e3 | 4449702 | 139 days 3 hrs ago | 0xfe0fa3c06d03bdc7fb49c892bbb39113b534fb57 | 0x0000000000000000000000000000000000000001 | 0 ETH |
[ Download CSV Export ]
Similar Match Source Code
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0x6271Ca63D30507f2Dcbf99B52787032506D75BBF
Contract Name:
BiconomyForwarder
Compiler Version
v0.7.6+commit.7338295f
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity 0.7.6; pragma experimental ABIEncoderV2; import "@openzeppelin/contracts/math/SafeMath.sol"; import "@openzeppelin/contracts/cryptography/ECDSA.sol"; import "./ERC20ForwardRequestTypes.sol"; import "../libs/Ownable.sol"; /** * * @title BiconomyForwarder * * @notice A trusted forwarder for Biconomy relayed meta transactions * * @dev - Inherits the ERC20ForwarderRequest struct * @dev - Verifies EIP712 signatures * @dev - Verifies personalSign signatures * @dev - Implements 2D nonces... each Tx has a BatchId and a BatchNonce * @dev - Keeps track of highest BatchId used by a given address, to assist in encoding of transactions client-side * @dev - maintains a list of verified domain seperators * */ contract BiconomyForwarder is ERC20ForwardRequestTypes,Ownable{ using ECDSA for bytes32; mapping(bytes32 => bool) public domains; uint256 chainId; string public constant EIP712_DOMAIN_TYPE = "EIP712Domain(string name,string version,address verifyingContract,bytes32 salt)"; bytes32 public constant REQUEST_TYPEHASH = keccak256(bytes("ERC20ForwardRequest(address from,address to,address token,uint256 txGas,uint256 tokenGasPrice,uint256 batchId,uint256 batchNonce,uint256 deadline,bytes data)")); mapping(address => mapping(uint256 => uint256)) nonces; constructor( address _owner ) public Ownable(_owner){ uint256 id; assembly { id := chainid() } chainId = id; require(_owner != address(0), "Owner Address cannot be 0"); } /** * @dev registers domain seperators, maintaining that all domain seperators used for EIP712 forward requests use... * ... the address of this contract and the chainId of the chain this contract is deployed to * @param name : name of dApp/dApp fee proxy * @param version : version of dApp/dApp fee proxy */ function registerDomainSeparator(string calldata name, string calldata version) external onlyOwner{ uint256 id; /* solhint-disable-next-line no-inline-assembly */ assembly { id := chainid() } bytes memory domainValue = abi.encode( keccak256(bytes(EIP712_DOMAIN_TYPE)), keccak256(bytes(name)), keccak256(bytes(version)), address(this), bytes32(id)); bytes32 domainHash = keccak256(domainValue); domains[domainHash] = true; emit DomainRegistered(domainHash, domainValue); } event DomainRegistered(bytes32 indexed domainSeparator, bytes domainValue); event MetaTransactionExecuted(address indexed userAddress, address payable indexed relayerAddress, bytes indexed functionSignature); /** * @dev returns a value from the nonces 2d mapping * @param from : the user address * @param batchId : the key of the user's batch being queried * @return nonce : the number of transaction made within said batch */ function getNonce(address from, uint256 batchId) public view returns (uint256) { return nonces[from][batchId]; } /** * @dev an external function which exposes the internal _verifySigEIP712 method * @param req : request being verified * @param domainSeparator : the domain separator presented to the user when signing * @param sig : the signature generated by the user's wallet */ function verifyEIP712( ERC20ForwardRequest calldata req, bytes32 domainSeparator, bytes calldata sig) external view { _verifySigEIP712(req, domainSeparator, sig); } /** * @dev verifies the call is valid by calling _verifySigEIP712 * @dev executes the forwarded call if valid * @dev updates the nonce after * @param req : request being executed * @param domainSeparator : the domain separator presented to the user when signing * @param sig : the signature generated by the user's wallet * @return success : false if call fails. true otherwise * @return ret : any return data from the call */ function executeEIP712( ERC20ForwardRequest calldata req, bytes32 domainSeparator, bytes calldata sig ) external returns (bool success, bytes memory ret) { _verifySigEIP712(req,domainSeparator,sig); _updateNonce(req); /* solhint-disable-next-line avoid-low-level-calls */ (success,ret) = req.to.call{gas : req.txGas}(abi.encodePacked(req.data, req.from)); // Validate that the relayer has sent enough gas for the call. // See https://ronan.eth.link/blog/ethereum-gas-dangers/ assert(gasleft() > req.txGas / 63); _verifyCallResult(success,ret,"Forwarded call to destination did not succeed"); emit MetaTransactionExecuted(req.from, msg.sender, req.data); } /** * @dev an external function which exposes the internal _verifySigPersonSign method * @param req : request being verified * @param sig : the signature generated by the user's wallet */ function verifyPersonalSign( ERC20ForwardRequest calldata req, bytes calldata sig) external view { _verifySigPersonalSign(req, sig); } /** * @dev verifies the call is valid by calling _verifySigPersonalSign * @dev executes the forwarded call if valid * @dev updates the nonce after * @param req : request being executed * @param sig : the signature generated by the user's wallet * @return success : false if call fails. true otherwise * @return ret : any return data from the call */ function executePersonalSign(ERC20ForwardRequest calldata req,bytes calldata sig) external returns(bool success, bytes memory ret){ _verifySigPersonalSign(req, sig); _updateNonce(req); (success,ret) = req.to.call{gas : req.txGas}(abi.encodePacked(req.data, req.from)); // Validate that the relayer has sent enough gas for the call. // See https://ronan.eth.link/blog/ethereum-gas-dangers/ assert(gasleft() > req.txGas / 63); _verifyCallResult(success,ret,"Forwarded call to destination did not succeed"); emit MetaTransactionExecuted(req.from, msg.sender, req.data); } /** * @dev Increments the nonce of given user/batch pair * @dev Updates the highestBatchId of the given user if the request's batchId > current highest * @dev only intended to be called post call execution * @param req : request that was executed */ function _updateNonce(ERC20ForwardRequest calldata req) internal { nonces[req.from][req.batchId]++; } /** * @dev verifies the domain separator used has been registered via registerDomainSeparator() * @dev recreates the 32 byte hash signed by the user's wallet (as per EIP712 specifications) * @dev verifies the signature using Open Zeppelin's ECDSA library * @dev signature valid if call doesn't throw * * @param req : request being executed * @param domainSeparator : the domain separator presented to the user when signing * @param sig : the signature generated by the user's wallet * */ function _verifySigEIP712( ERC20ForwardRequest calldata req, bytes32 domainSeparator, bytes memory sig) internal view { uint256 id; /* solhint-disable-next-line no-inline-assembly */ assembly { id := chainid() } require(req.deadline == 0 || block.timestamp + 20 <= req.deadline, "request expired"); require(domains[domainSeparator], "unregistered domain separator"); require(chainId == id, "potential replay attack on the fork"); bytes32 digest = keccak256(abi.encodePacked( "\x19\x01", domainSeparator, keccak256(abi.encode(REQUEST_TYPEHASH, req.from, req.to, req.token, req.txGas, req.tokenGasPrice, req.batchId, nonces[req.from][req.batchId], req.deadline, keccak256(req.data) )))); require(digest.recover(sig) == req.from, "signature mismatch"); } /** * @dev encodes a 32 byte data string (presumably a hash of encoded data) as per eth_sign * * @param hash : hash of encoded data that signed by user's wallet using eth_sign * @return input hash encoded to matched what is signed by the user's key when using eth_sign*/ function prefixed(bytes32 hash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev recreates the 32 byte hash signed by the user's wallet * @dev verifies the signature using Open Zeppelin's ECDSA library * @dev signature valid if call doesn't throw * * @param req : request being executed * @param sig : the signature generated by the user's wallet * */ function _verifySigPersonalSign( ERC20ForwardRequest calldata req, bytes memory sig) internal view { require(req.deadline == 0 || block.timestamp + 20 <= req.deadline, "request expired"); bytes32 digest = prefixed(keccak256(abi.encodePacked( req.from, req.to, req.token, req.txGas, req.tokenGasPrice, req.batchId, nonces[req.from][req.batchId], req.deadline, keccak256(req.data) ))); require(digest.recover(sig) == req.from, "signature mismatch"); } /** * @dev verifies the call result and bubbles up revert reason for failed calls * * @param success : outcome of forwarded call * @param returndata : returned data from the frowarded call * @param errorMessage : fallback error message to show */ function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure { if (!success) { // 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); } } } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b > a) return (false, 0); return (true, a - b); } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, 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-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a / b); } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a % b); } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SafeMath: subtraction overflow"); return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) return 0; uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: division by zero"); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: modulo by zero"); return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); return a - b; } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryDiv}. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a % b; } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { // Check the signature length if (signature.length != 65) { revert("ECDSA: invalid signature length"); } // Divide the signature in r, s and v variables bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. // 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))) } return recover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover-bytes32-bytes-} that receives the `v`, * `r` and `s` signature fields separately. */ function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (281): 0 < s < secp256k1n ÷ 2 + 1, and for v in (282): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. 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; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * replicates the behavior of the * https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_sign[`eth_sign`] * JSON-RPC method. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } }
// SPDX-License-Identifier: MIT pragma solidity 0.7.6; pragma experimental ABIEncoderV2; /* deadline can be removed : GSN reference https://github.com/opengsn/gsn/blob/master/contracts/forwarder/IForwarder.sol (Saves 250 more gas)*/ /** * This contract defines a struct which both ERC20FeeProxy and BiconomyForwarder inherit. ERC20ForwardRequest specifies all the fields present in the GSN V2 ForwardRequest struct, * but adds the following : * address token * uint256 tokenGasPrice * uint256 txGas * uint256 batchNonce (can be removed) * uint256 deadline * Fields are placed in type order, to minimise storage used when executing transactions. */ contract ERC20ForwardRequestTypes{ /*allow the EVM to optimize for this, ensure that you try to order your storage variables and struct members such that they can be packed tightly*/ struct ERC20ForwardRequest { address from; address to; address token; uint256 txGas; uint256 tokenGasPrice; uint256 batchId; uint256 batchNonce; uint256 deadline; bytes data; } struct PermitRequest { address holder; address spender; uint256 value; uint256 nonce; uint256 expiry; bool allowed; uint8 v; bytes32 r; bytes32 s; } }
// SPDX-License-Identifier: MIT pragma solidity 0.7.6; /** * @title Ownable * @dev The Ownable contract has an owner address, and provides basic authorization control * functions, this simplifies the implementation of "user permissions". */ contract Ownable { address private _owner; event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); /** * @dev The Ownable constructor sets the original `owner` of the contract to the sender * account. */ constructor(address owner) public { _owner = owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require( isOwner(), "Only contract owner is allowed to perform this operation" ); _; } /** * @return the address of the owner. */ function owner() public view returns (address) { return _owner; } /** * @return true if `msg.sender` is the owner of the contract. */ function isOwner() public view returns (bool) { return msg.sender == _owner; } /** * @dev Allows the current owner to relinquish control of the contract. * @notice Renouncing to ownership will leave the contract without an owner. * It will not be possible to call the functions with the `onlyOwner` * modifier anymore. */ function renounceOwnership() public onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Allows the current owner to transfer control of the contract to a newOwner. * @param newOwner The address to transfer ownership to. */ function transferOwnership(address newOwner) public onlyOwner { _transferOwnership(newOwner); } /** * @dev Transfers control of the contract to a newOwner. * @param newOwner The address to transfer ownership to. */ function _transferOwnership(address newOwner) internal { require(newOwner != address(0)); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } }, "libraries": {} }
[{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"domainSeparator","type":"bytes32"},{"indexed":false,"internalType":"bytes","name":"domainValue","type":"bytes"}],"name":"DomainRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"userAddress","type":"address"},{"indexed":true,"internalType":"address payable","name":"relayerAddress","type":"address"},{"indexed":true,"internalType":"bytes","name":"functionSignature","type":"bytes"}],"name":"MetaTransactionExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"EIP712_DOMAIN_TYPE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REQUEST_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"domains","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"txGas","type":"uint256"},{"internalType":"uint256","name":"tokenGasPrice","type":"uint256"},{"internalType":"uint256","name":"batchId","type":"uint256"},{"internalType":"uint256","name":"batchNonce","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct ERC20ForwardRequestTypes.ERC20ForwardRequest","name":"req","type":"tuple"},{"internalType":"bytes32","name":"domainSeparator","type":"bytes32"},{"internalType":"bytes","name":"sig","type":"bytes"}],"name":"executeEIP712","outputs":[{"internalType":"bool","name":"success","type":"bool"},{"internalType":"bytes","name":"ret","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"txGas","type":"uint256"},{"internalType":"uint256","name":"tokenGasPrice","type":"uint256"},{"internalType":"uint256","name":"batchId","type":"uint256"},{"internalType":"uint256","name":"batchNonce","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct ERC20ForwardRequestTypes.ERC20ForwardRequest","name":"req","type":"tuple"},{"internalType":"bytes","name":"sig","type":"bytes"}],"name":"executePersonalSign","outputs":[{"internalType":"bool","name":"success","type":"bool"},{"internalType":"bytes","name":"ret","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"batchId","type":"uint256"}],"name":"getNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"version","type":"string"}],"name":"registerDomainSeparator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"txGas","type":"uint256"},{"internalType":"uint256","name":"tokenGasPrice","type":"uint256"},{"internalType":"uint256","name":"batchId","type":"uint256"},{"internalType":"uint256","name":"batchNonce","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct ERC20ForwardRequestTypes.ERC20ForwardRequest","name":"req","type":"tuple"},{"internalType":"bytes32","name":"domainSeparator","type":"bytes32"},{"internalType":"bytes","name":"sig","type":"bytes"}],"name":"verifyEIP712","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"txGas","type":"uint256"},{"internalType":"uint256","name":"tokenGasPrice","type":"uint256"},{"internalType":"uint256","name":"batchId","type":"uint256"},{"internalType":"uint256","name":"batchNonce","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct ERC20ForwardRequestTypes.ERC20ForwardRequest","name":"req","type":"tuple"},{"internalType":"bytes","name":"sig","type":"bytes"}],"name":"verifyPersonalSign","outputs":[],"stateMutability":"view","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b506040516116b73803806116b783398101604081905261002f91610080565b600080546001600160a01b0319166001600160a01b038316908117909155466002819055906100795760405162461bcd60e51b8152600401610070906100ae565b60405180910390fd5b50506100e5565b600060208284031215610091578081fd5b81516001600160a01b03811681146100a7578182fd5b9392505050565b60208082526019908201527f4f776e657220416464726573732063616e6e6f74206265203000000000000000604082015260600190565b6115c3806100f46000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c80638f32d59b1161008c578063a41a03f211610066578063a41a03f214610193578063c3f28abd146101a6578063c722f177146101bb578063f2fde38b146101ce576100cf565b80638f32d59b146101635780639c7b4592146101785780639e39b73e1461018b576100cf565b806341706c4e146100d45780636e4cb075146100fe578063715018a6146101135780638171e6321461011b578063895358031461012e5780638da5cb5b1461014e575b600080fd5b6100e76100e2366004610ff6565b6101e1565b6040516100f59291906111f9565b60405180910390f35b61011161010c36600461104a565b610381565b005b6101116103c6565b6100e761012936600461104a565b610453565b61014161013c366004610f4c565b6105f1565b6040516100f5919061121c565b610156610619565b6040516100f591906111da565b61016b610628565b6040516100f591906111ee565b610111610186366004610f8d565b610639565b61014161075e565b6101116101a1366004610ff6565b610781565b6101ae6107c8565b6040516100f591906112a5565b61016b6101c9366004610f75565b6107e4565b6101116101dc366004610f2b565b6107f9565b60006060610226868686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061084892505050565b61022f86610a51565b61023f6040870160208801610f2b565b6001600160a01b0316606087013561025b610100890189611387565b61026860208b018b610f2b565b60405160200161027a93929190611149565b60408051601f198184030181529082905261029491611172565b60006040518083038160008787f1925050503d80600081146102d2576040519150601f19603f3d011682016040523d82523d6000602084013e6102d7565b606091505b509092509050603f6060870135045a116102ed57fe5b61031082826040518060600160405280602d8152602001611561602d9139610a97565b61031e610100870187611387565b60405161032c929190611139565b604051908190039020336103436020890189610f2b565b6001600160a01b03167f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b60405160405180910390a494509492505050565b6103c18383838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610ac692505050565b505050565b6103ce610628565b6104095760405162461bcd60e51b815260040180806020018281038252603881526020018061148c6038913960400191505060405180910390fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b600060606104978585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610ac692505050565b6104a085610a51565b6104b06040860160208701610f2b565b6001600160a01b031660608601356104cc610100880188611387565b6104d960208a018a610f2b565b6040516020016104eb93929190611149565b60408051601f198184030181529082905261050591611172565b60006040518083038160008787f1925050503d8060008114610543576040519150601f19603f3d011682016040523d82523d6000602084013e610548565b606091505b509092509050603f6060860135045a1161055e57fe5b61058182826040518060600160405280602d8152602001611561602d9139610a97565b61058f610100860186611387565b60405161059d929190611139565b604051908190039020336105b46020880188610f2b565b6001600160a01b03167f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b60405160405180910390a4935093915050565b6001600160a01b03919091166000908152600360209081526040808320938352929052205490565b6000546001600160a01b031690565b6000546001600160a01b0316331490565b610641610628565b61067c5760405162461bcd60e51b815260040180806020018281038252603881526020018061148c6038913960400191505060405180910390fd5b600046905060006040518060800160405280604f81526020016113f9604f91398051906020012086866040516106b3929190611139565b604051809103902085856040516106cb929190611139565b6040519081900381206106e693929130908790602001611279565b60408051601f198184030181528282528051602080830191909120600081815260019283905293909320805460ff1916909117905592509081907f4bc68689cbe89a4a6333a3ab0a70093874da3e5bfb71e93102027f3f073687d89061074d9085906112a5565b60405180910390a250505050505050565b6040518060c00160405280609d81526020016114c4609d91398051906020012081565b6107c2848484848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061084892505050565b50505050565b6040518060800160405280604f81526020016113f9604f913981565b60016020526000908152604090205460ff1681565b610801610628565b61083c5760405162461bcd60e51b815260040180806020018281038252603881526020018061148c6038913960400191505060405180910390fd5b61084581610c18565b50565b4660e0840135158061086157508360e001354260140111155b6108865760405162461bcd60e51b815260040161087d906112b8565b60405180910390fd5b60008381526001602052604090205460ff166108b45760405162461bcd60e51b815260040161087d906112e1565b80600254146108d55760405162461bcd60e51b815260040161087d90611318565b6000836040518060c00160405280609d81526020016114c4609d913980516020918201209061090690880188610f2b565b6109166040890160208a01610f2b565b61092660608a0160408b01610f2b565b89606001358a608001358b60a00135600360008e600001602081019061094c9190610f2b565b6001600160a01b03166001600160a01b0316815260200190815260200160002060008e60a001358152602001908152602001600020548d60e001358e8061010001906109989190611387565b6040516109a6929190611139565b6040519081900381206109c49a999897969594939291602001611225565b604051602081830303815290604052805190602001206040516020016109eb9291906111bf565b60408051601f1981840301815291905280516020918201209150610a1190860186610f2b565b6001600160a01b0316610a248285610c86565b6001600160a01b031614610a4a5760405162461bcd60e51b815260040161087d9061135b565b5050505050565b60036000610a626020840184610f2b565b6001600160a01b031681526020808201929092526040908101600090812060a090940135815292909152902080546001019055565b826103c157815115610aac5781518083602001fd5b8060405162461bcd60e51b815260040161087d91906112a5565b60e08201351580610ade57508160e001354260140111155b610afa5760405162461bcd60e51b815260040161087d906112b8565b6000610bd0610b0c6020850185610f2b565b610b1c6040860160208701610f2b565b610b2c6060870160408801610f2b565b6060870135608088013560a089013560036000610b4c60208d018d610f2b565b6001600160a01b031681526020808201929092526040908101600090812060a08e0135825290925290205460e08b0135610b8a6101008d018d611387565b604051610b98929190611139565b604051908190038120610bb59998979695949392916020016110dc565b60405160208183030381529060405280519060200120610d06565b9050610bdf6020840184610f2b565b6001600160a01b0316610bf28284610c86565b6001600160a01b0316146103c15760405162461bcd60e51b815260040161087d9061135b565b6001600160a01b038116610c2b57600080fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60008151604114610cde576040805162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015290519081900360640190fd5b60208201516040830151606084015160001a610cfc86828585610d37565b9695505050505050565b600081604051602001610d19919061118e565b6040516020818303038152906040528051906020012090505b919050565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0821115610d985760405162461bcd60e51b81526004018080602001828103825260228152602001806114486022913960400191505060405180910390fd5b8360ff16601b1480610dad57508360ff16601c145b610de85760405162461bcd60e51b815260040180806020018281038252602281526020018061146a6022913960400191505060405180910390fd5b600060018686868660405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015610e44573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116610eac576040805162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015290519081900360640190fd5b95945050505050565b80356001600160a01b0381168114610d3257600080fd5b60008083601f840112610edd578182fd5b50813567ffffffffffffffff811115610ef4578182fd5b602083019150836020828501011115610f0c57600080fd5b9250929050565b60006101208284031215610f25578081fd5b50919050565b600060208284031215610f3c578081fd5b610f4582610eb5565b9392505050565b60008060408385031215610f5e578081fd5b610f6783610eb5565b946020939093013593505050565b600060208284031215610f86578081fd5b5035919050565b60008060008060408587031215610fa2578182fd5b843567ffffffffffffffff80821115610fb9578384fd5b610fc588838901610ecc565b90965094506020870135915080821115610fdd578384fd5b50610fea87828801610ecc565b95989497509550505050565b6000806000806060858703121561100b578384fd5b843567ffffffffffffffff80821115611022578586fd5b61102e88838901610f13565b9550602087013594506040870135915080821115610fdd578384fd5b60008060006040848603121561105e578283fd5b833567ffffffffffffffff80821115611075578485fd5b61108187838801610f13565b94506020860135915080821115611096578384fd5b506110a386828701610ecc565b9497909650939450505050565b600081518084526110c88160208601602086016113cc565b601f01601f19169290920160200192915050565b6bffffffffffffffffffffffff1960609a8b1b81168252988a1b891660148201529690981b9096166028860152603c850193909352605c840191909152607c830152609c82015260bc81019190915260dc81019190915260fc0190565b6000828483379101908152919050565b6000838583375060609190911b6bffffffffffffffffffffffff19169101908152601401919050565b600082516111848184602087016113cc565b9190910192915050565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b61190160f01b81526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b901515815260200190565b600083151582526040602083015261121460408301846110b0565b949350505050565b90815260200190565b998a526001600160a01b0398891660208b015296881660408a0152949096166060880152608087019290925260a086015260c085015260e08401929092526101008301919091526101208201526101400190565b948552602085019390935260408401919091526001600160a01b03166060830152608082015260a00190565b600060208252610f4560208301846110b0565b6020808252600f908201526e1c995c5d595cdd08195e1c1a5c9959608a1b604082015260600190565b6020808252601d908201527f756e7265676973746572656420646f6d61696e20736570617261746f72000000604082015260600190565b60208082526023908201527f706f74656e7469616c207265706c61792061747461636b206f6e2074686520666040820152626f726b60e81b606082015260800190565b6020808252601290820152710e6d2cedcc2e8eae4ca40dad2e6dac2e8c6d60731b604082015260600190565b6000808335601e1984360301811261139d578283fd5b83018035915067ffffffffffffffff8211156113b7578283fd5b602001915036819003821315610f0c57600080fd5b60005b838110156113e75781810151838201526020016113cf565b838111156107c2575050600091015256fe454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c6164647265737320766572696679696e67436f6e74726163742c627974657333322073616c742945434453413a20696e76616c6964207369676e6174757265202773272076616c756545434453413a20696e76616c6964207369676e6174757265202776272076616c75654f6e6c7920636f6e7472616374206f776e657220697320616c6c6f77656420746f20706572666f726d2074686973206f7065726174696f6e4552433230466f72776172645265717565737428616464726573732066726f6d2c6164647265737320746f2c6164647265737320746f6b656e2c75696e743235362074784761732c75696e7432353620746f6b656e47617350726963652c75696e7432353620626174636849642c75696e743235362062617463684e6f6e63652c75696e7432353620646561646c696e652c6279746573206461746129466f727761726465642063616c6c20746f2064657374696e6174696f6e20646964206e6f742073756363656564a2646970667358221220c4c37b7b4f7fb250c49231440c04e22a7c56a82ba87c72c5b6a8eadc747850ff64736f6c634300070600330000000000000000000000002b241cbe6b455e08ade78a7ccc42de2403d7b566
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.