ETH Price: $3,163.75 (+1.40%)
Gas: 1 Gwei

Contract

0x4991c6B9a40173D1621e559514e1860fcf18fd2B
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Redeem136474242021-11-19 19:31:48967 days ago1637350308IN
0x4991c6B9...fcf18fd2B
0 ETH0.00660735133.69804886
Redeem136148402021-11-14 15:43:13972 days ago1636904593IN
0x4991c6B9...fcf18fd2B
0 ETH0.00487801109.3235261
Redeem135594692021-11-05 23:09:15980 days ago1636153755IN
0x4991c6B9...fcf18fd2B
0 ETH0.00799216161.75855703
Redeem135594572021-11-05 23:06:02980 days ago1636153562IN
0x4991c6B9...fcf18fd2B
0 ETH0.00792202160.33899329
Redeem135594252021-11-05 22:59:57980 days ago1636153197IN
0x4991c6B9...fcf18fd2B
0 ETH0.00629479127.37350161
Redeem135292222021-11-01 4:56:55985 days ago1635742615IN
0x4991c6B9...fcf18fd2B
0 ETH0.00610612123.58570494
Redeem135268362021-10-31 20:13:12986 days ago1635711192IN
0x4991c6B9...fcf18fd2B
0 ETH0.00563246176.89344117
Redeem135268352021-10-31 20:13:06986 days ago1635711186IN
0x4991c6B9...fcf18fd2B
0 ETH0.00842669188.90550316
Redeem135183122021-10-30 11:53:50987 days ago1635594830IN
0x4991c6B9...fcf18fd2B
0 ETH0.00586369118.65021348
Redeem135133142021-10-29 17:21:09988 days ago1635528069IN
0x4991c6B9...fcf18fd2B
0 ETH0.00867305175.49686976
Redeem134920262021-10-26 8:51:51991 days ago1635238311IN
0x4991c6B9...fcf18fd2B
0 ETH0.0028927964.83175682
Redeem134892282021-10-25 22:22:14991 days ago1635200534IN
0x4991c6B9...fcf18fd2B
0 ETH0.00631798141.59530064
Redeem134892192021-10-25 22:19:08991 days ago1635200348IN
0x4991c6B9...fcf18fd2B
0 ETH0.00529884118.75500386
Redeem134874782021-10-25 15:45:11992 days ago1635176711IN
0x4991c6B9...fcf18fd2B
0 ETH0.0044556190.18006147
Redeem134867702021-10-25 13:02:17992 days ago1635166937IN
0x4991c6B9...fcf18fd2B
0 ETH0.0024016448.59662659
Redeem134739492021-10-23 13:06:02994 days ago1634994362IN
0x4991c6B9...fcf18fd2B
0 ETH0.0021615143.73766001
Redeem134715192021-10-23 3:44:11994 days ago1634960651IN
0x4991c6B9...fcf18fd2B
0 ETH0.0031239463.24282562
Redeem134711462021-10-23 2:14:13994 days ago1634955253IN
0x4991c6B9...fcf18fd2B
0 ETH0.00267459.94443095
Redeem134674902021-10-22 12:47:00995 days ago1634906820IN
0x4991c6B9...fcf18fd2B
0 ETH0.0024094854
Redeem134545762021-10-20 12:23:09997 days ago1634732589IN
0x4991c6B9...fcf18fd2B
0 ETH0.0018740442
Redeem134490672021-10-19 15:42:22998 days ago1634658142IN
0x4991c6B9...fcf18fd2B
0 ETH0.0035833972.50899868
Redeem134487732021-10-19 14:31:48998 days ago1634653908IN
0x4991c6B9...fcf18fd2B
0 ETH0.0037886176.66151477
Redeem134463612021-10-19 5:31:40998 days ago1634621500IN
0x4991c6B9...fcf18fd2B
0 ETH0.0022464550.3464794
Redeem134458262021-10-19 3:31:23998 days ago1634614283IN
0x4991c6B9...fcf18fd2B
0 ETH0.0026421659.21478172
Redeem134450292021-10-19 0:39:26998 days ago1634603966IN
0x4991c6B9...fcf18fd2B
0 ETH0.002449954.90599766
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
GridRedemption

Compiler Version
v0.4.25+commit.59dbf8f1

Optimization Enabled:
No with 0 runs

Other Settings:
default evmVersion
/**
 *Submitted for verification at Etherscan.io on 2018-11-05
*/

pragma solidity ^0.4.23;

contract Token {
    /* This is a slight change to the ERC20 base standard.
    function totalSupply() constant returns (uint256 supply);
    is replaced with:
    uint256 public totalSupply;
    This automatically creates a getter function for the totalSupply.
    This is moved to the base contract since public getter functions are not
    currently recognised as an implementation of the matching abstract
    function by the compiler.
    */
    /// total amount of tokens
    uint256 public totalSupply;

    /// @param _owner The address from which the balance will be retrieved
    /// @return The balance
    function balanceOf(address _owner) constant returns (uint256 balance);

    /// @notice send `_value` token to `_to` from `msg.sender`
    /// @param _to The address of the recipient
    /// @param _value The amount of token to be transferred
    /// @return Whether the transfer was successful or not
    function transfer(address _to, uint256 _value) returns (bool success);

    /// @notice send `_value` token to `_to` from `_from` on the condition it is approved by `_from`
    /// @param _from The address of the sender
    /// @param _to The address of the recipient
    /// @param _value The amount of token to be transferred
    /// @return Whether the transfer was successful or not
    function transferFrom(address _from, address _to, uint256 _value) returns (bool success);

    /// @notice `msg.sender` approves `_spender` to spend `_value` tokens
    /// @param _spender The address of the account able to transfer the tokens
    /// @param _value The amount of tokens to be approved for transfer
    /// @return Whether the approval was successful or not
    function approve(address _spender, uint256 _value) returns (bool success);

    /// @param _owner The address of the account owning tokens
    /// @param _spender The address of the account able to transfer the tokens
    /// @return Amount of remaining tokens allowed to spent
    function allowance(address _owner, address _spender) constant returns (uint256 remaining);

    event Transfer(address indexed _from, address indexed _to, uint256 _value);
    event Approval(address indexed _owner, address indexed _spender, uint256 _value);
}

contract StandardToken is Token {

    function transfer(address _to, uint256 _value) returns (bool success) {
        //Default assumes totalSupply can't be over max (2^256 - 1).
        //If your token leaves out totalSupply and can issue more tokens as time goes on, you need to check if it doesn't wrap.
        //Replace the if with this one instead.
        //require(balances[msg.sender] >= _value && balances[_to] + _value > balances[_to]);
        require(balances[msg.sender] >= _value);
        balances[msg.sender] -= _value;
        balances[_to] += _value;
        Transfer(msg.sender, _to, _value);
        return true;
    }

    function transferFrom(address _from, address _to, uint256 _value) returns (bool success) {
        //same as above. Replace this line with the following if you want to protect against wrapping uints.
        //require(balances[_from] >= _value && allowed[_from][msg.sender] >= _value && balances[_to] + _value > balances[_to]);
        require(balances[_from] >= _value && allowed[_from][msg.sender] >= _value);
        balances[_to] += _value;
        balances[_from] -= _value;
        allowed[_from][msg.sender] -= _value;
        Transfer(_from, _to, _value);
        return true;
    }

    function balanceOf(address _owner) constant returns (uint256 balance) {
        return balances[_owner];
    }

    function approve(address _spender, uint256 _value) returns (bool success) {
        allowed[msg.sender][_spender] = _value;
        Approval(msg.sender, _spender, _value);
        return true;
    }

    function allowance(address _owner, address _spender) constant returns (uint256 remaining) {
      return allowed[_owner][_spender];
    }

    mapping (address => uint256) balances;
    mapping (address => mapping (address => uint256)) allowed;
}

contract HumanStandardToken is StandardToken {

    /* Public variables of the token */

    /*
    NOTE:
    The following variables are OPTIONAL vanities. One does not have to include them.
    They allow one to customise the token contract & in no way influences the core functionality.
    Some wallets/interfaces might not even bother to look at this information.
    */
    string public name;                   //fancy name: eg Simon Bucks
    uint8 public decimals;                //How many decimals to show. ie. There could 1000 base units with 3 decimals. Meaning 0.980 SBX = 980 base units. It's like comparing 1 wei to 1 ether.
    string public symbol;                 //An identifier: eg SBX
    string public version = 'H0.1';       //human 0.1 standard. Just an arbitrary versioning scheme.

    function HumanStandardToken(
        uint256 _initialAmount,
        string _tokenName,
        uint8 _decimalUnits,
        string _tokenSymbol
        ) {
        // balances[msg.sender] = _initialAmount;               // Give the creator all initial tokens
        balances[msg.sender] = _initialAmount;
        totalSupply = _initialAmount;                        // Update total supply
        name = _tokenName;                                   // Set the name for display purposes
        decimals = _decimalUnits;                            // Amount of decimals for display purposes
        symbol = _tokenSymbol;                               // Set the symbol for display purposes
    }

    /* Approves and then calls the receiving contract */
    function approveAndCall(address _spender, uint256 _value, bytes _extraData) returns (bool success) {
        allowed[msg.sender][_spender] = _value;
        Approval(msg.sender, _spender, _value);

        //call the receiveApproval function on the contract you want to be notified. This crafts the function signature manually so one doesn't have to include a contract in here just for this.
        //receiveApproval(address _from, uint256 _value, address _tokenContract, bytes _extraData)
        //it is assumed that when does this that the call *should* succeed, otherwise one would use vanilla approve instead.
        require(_spender.call(bytes4(bytes32(sha3("receiveApproval(address,uint256,address,bytes)"))), msg.sender, _value, this, _extraData));
        return true;
    }
}

contract GridRedemption {
    HumanStandardToken token;
    address public owner;
    uint public max = 1000000000000000000; // 1,000,000 GRID max by default
    event Redemption(bytes32 indexed id, address indexed sender, uint amount);

    constructor(address tokenAddr) public {
        token = HumanStandardToken(tokenAddr);
        owner = msg.sender;
    }

    function redeem(uint amount, bytes32 id) public {
        require(amount < max, "Amount is greater than max");
        token.transferFrom(msg.sender, address(0), amount);
        emit Redemption(id, msg.sender, amount);
    }

    function updateMax(uint newMax) public isOwner {
        max = newMax;
    }

    function updateOwner(address newOwner) public isOwner {
        owner = newOwner;
    }

    modifier isOwner() {
        require(msg.sender == owner, "Only the owner is allowed to do this");
        _;
    }

    function() public {
        revert("You cannot send ether to this contract");
    }
}

Contract Security Audit

Contract ABI

[{"constant":false,"inputs":[{"name":"amount","type":"uint256"},{"name":"id","type":"bytes32"}],"name":"redeem","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newMax","type":"uint256"}],"name":"updateMax","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"max","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"updateOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"tokenAddr","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":false,"stateMutability":"nonpayable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"name":"id","type":"bytes32"},{"indexed":true,"name":"sender","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"Redemption","type":"event"}]

6080604052670de0b6b3a764000060025534801561001c57600080fd5b5060405160208061078c83398101806040528101908080519060200190929190505050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550506106bc806100d06000396000f30060806040526004361061006d576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806322e4e61d1461010e578063444a1cec146101495780636ac5db1914610176578063880cdc31146101a15780638da5cb5b146101e4575b34801561007957600080fd5b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f596f752063616e6e6f742073656e6420657468657220746f207468697320636f81526020017f6e7472616374000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b34801561011a57600080fd5b5061014760048036038101908080359060200190929190803560001916906020019092919050505061023b565b005b34801561015557600080fd5b5061017460048036038101908080359060200190929190505050610440565b005b34801561018257600080fd5b5061018b610535565b6040518082815260200191505060405180910390f35b3480156101ad57600080fd5b506101e2600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061053b565b005b3480156101f057600080fd5b506101f961066a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b600254821015156102b4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f416d6f756e742069732067726561746572207468616e206d617800000000000081525060200191505060405180910390fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd336000856040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b1580156103ad57600080fd5b505af11580156103c1573d6000803e3d6000fd5b505050506040513d60208110156103d757600080fd5b8101908080519060200190929190505050503373ffffffffffffffffffffffffffffffffffffffff1681600019167fbd8b13a828e3a4925b34784711307f84f31c2a21c1d83a93251b11981b16f804846040518082815260200191505060405180910390a35050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561052b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001807f4f6e6c7920746865206f776e657220697320616c6c6f77656420746f20646f2081526020017f746869730000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b8060028190555050565b60025481565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610626576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001807f4f6e6c7920746865206f776e657220697320616c6c6f77656420746f20646f2081526020017f746869730000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16815600a165627a7a723058200b0ee2411e9a00773103e6e99ff057a709f833e1bfe74171e263c6ac996c8f4e002900000000000000000000000012b19d3e2ccc14da04fae33e63652ce469b3f2fd

Deployed Bytecode

0x60806040526004361061006d576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806322e4e61d1461010e578063444a1cec146101495780636ac5db1914610176578063880cdc31146101a15780638da5cb5b146101e4575b34801561007957600080fd5b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f596f752063616e6e6f742073656e6420657468657220746f207468697320636f81526020017f6e7472616374000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b34801561011a57600080fd5b5061014760048036038101908080359060200190929190803560001916906020019092919050505061023b565b005b34801561015557600080fd5b5061017460048036038101908080359060200190929190505050610440565b005b34801561018257600080fd5b5061018b610535565b6040518082815260200191505060405180910390f35b3480156101ad57600080fd5b506101e2600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061053b565b005b3480156101f057600080fd5b506101f961066a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b600254821015156102b4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f416d6f756e742069732067726561746572207468616e206d617800000000000081525060200191505060405180910390fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd336000856040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b1580156103ad57600080fd5b505af11580156103c1573d6000803e3d6000fd5b505050506040513d60208110156103d757600080fd5b8101908080519060200190929190505050503373ffffffffffffffffffffffffffffffffffffffff1681600019167fbd8b13a828e3a4925b34784711307f84f31c2a21c1d83a93251b11981b16f804846040518082815260200191505060405180910390a35050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561052b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001807f4f6e6c7920746865206f776e657220697320616c6c6f77656420746f20646f2081526020017f746869730000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b8060028190555050565b60025481565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610626576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001807f4f6e6c7920746865206f776e657220697320616c6c6f77656420746f20646f2081526020017f746869730000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16815600a165627a7a723058200b0ee2411e9a00773103e6e99ff057a709f833e1bfe74171e263c6ac996c8f4e0029

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000012b19d3e2ccc14da04fae33e63652ce469b3f2fd

-----Decoded View---------------
Arg [0] : tokenAddr (address): 0x12B19D3e2ccc14Da04FAe33e63652ce469b3F2FD

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000012b19d3e2ccc14da04fae33e63652ce469b3f2fd


Swarm Source

bzzr://0b0ee2411e9a00773103e6e99ff057a709f833e1bfe74171e263c6ac996c8f4e

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.