Contract Overview
Balance: 0.2 Ether
Transactions: 7 txns
 Latest 7 txns

TxHash Age From To Value [TxFee]
0x3a11bd2b08088835b7a7e033ba28ac2b35d5daec1e9ad3f96fed1b838726564696 days 23 hrs ago0xbe375fb4db2ea7f8b30e47c798cc6b56bf4557ff  IN   0x5e10d764314040b04ac7d96610b9851c8bc028150.1 Ether0.000218705
0x2c952a215ff3e7b26dd1e9e996150dc960420f0ea71dab9f8e4fbf1979857e17397 days 7 hrs ago0xb2f145feea21e76e62c8ed812d3f14da5209b6b6  IN   0x5e10d764314040b04ac7d96610b9851c8bc028150 Ether0.010728081
0x1304cbf32acc703bff4e7e09bb4ea6aed8913ea981ec3c4637197f2b4c1c85a6397 days 7 hrs ago0xb2f145feea21e76e62c8ed812d3f14da5209b6b6  IN   0x5e10d764314040b04ac7d96610b9851c8bc028150 Ether0.01487252
0x002e9c8cc0feaed23997b470b232f85e1cc20257d14ccd2ac0e85a18a278284a397 days 7 hrs ago0xb2f145feea21e76e62c8ed812d3f14da5209b6b6  IN   0x5e10d764314040b04ac7d96610b9851c8bc028150 Ether0.026509476
0x900cb4d7806ded68badb825c70eae24e4bb79cade8e05cba1f4f055fceba4075397 days 7 hrs ago0xb2f145feea21e76e62c8ed812d3f14da5209b6b6  IN   0x5e10d764314040b04ac7d96610b9851c8bc028150 Ether0.031034241
0x36c5d3cbc75e437c6b09fb0cc7442b9b555bc52eab2a250594b9814ca5fd78dd397 days 7 hrs ago0xb2f145feea21e76e62c8ed812d3f14da5209b6b6  IN   0x5e10d764314040b04ac7d96610b9851c8bc028150.5 Ether0.00266172
0x7dbc8aea7446da7133013517ac2a1bb368c47f5ebc2545c16be2a45f4920cbe4397 days 7 hrs ago0xb2f145feea21e76e62c8ed812d3f14da5209b6b6  IN    Contract Creation0 Ether0.03456312
[ Download CSV Export  ] 
 Internal Transactions as a result of Contract Execution
 Latest 8 Internal Transactions

ParentTxHash Block Age From To Value
0x2c952a215ff3e7b26dd1e9e996150dc960420f0ea71dab9f8e4fbf1979857e171872256397 days 7 hrs ago0x5e10d764314040b04ac7d96610b9851c8bc028150xb2f145feea21e76e62c8ed812d3f14da5209b6b60.1 Ether
0x1304cbf32acc703bff4e7e09bb4ea6aed8913ea981ec3c4637197f2b4c1c85a61872244397 days 7 hrs ago0x5e10d764314040b04ac7d96610b9851c8bc028150xb2f145feea21e76e62c8ed812d3f14da5209b6b60.1 Ether
0x002e9c8cc0feaed23997b470b232f85e1cc20257d14ccd2ac0e85a18a278284a1872170397 days 7 hrs ago0x5e10d764314040b04ac7d96610b9851c8bc028150x773bc209b10d1b99337998797f23598a611cdbf80.01 Ether
0x002e9c8cc0feaed23997b470b232f85e1cc20257d14ccd2ac0e85a18a278284a1872170397 days 7 hrs ago0x5e10d764314040b04ac7d96610b9851c8bc028150x1c480eadcb722b13bb7e1d181f24adadfcd0fb100.04 Ether
0x002e9c8cc0feaed23997b470b232f85e1cc20257d14ccd2ac0e85a18a278284a1872170397 days 7 hrs ago0x5e10d764314040b04ac7d96610b9851c8bc028150x0081002a98378ab0c4c3a0796b7d9e9da4a94a260.025 Ether
0x002e9c8cc0feaed23997b470b232f85e1cc20257d14ccd2ac0e85a18a278284a1872170397 days 7 hrs ago0x5e10d764314040b04ac7d96610b9851c8bc028150xb2f145feea21e76e62c8ed812d3f14da5209b6b60.025 Ether
0x900cb4d7806ded68badb825c70eae24e4bb79cade8e05cba1f4f055fceba40751872169397 days 7 hrs ago0x5e10d764314040b04ac7d96610b9851c8bc028150x0081002a98378ab0c4c3a0796b7d9e9da4a94a260.03 Ether
0x900cb4d7806ded68badb825c70eae24e4bb79cade8e05cba1f4f055fceba40751872169397 days 7 hrs ago0x5e10d764314040b04ac7d96610b9851c8bc028150xb2f145feea21e76e62c8ed812d3f14da5209b6b60.07 Ether
[ Download CSV Export  ] 
Warning: The Compiled Contract might be susceptible to ExpExponentCleanup (medium/high-severity), EventStructWrongData (very low-severity), NestedArrayFunctionCallDecoder (medium-severity), ZeroFunctionSelector (very low-severity) SolidityCompiler Bugs.

Contract Source Code Verified (Exact Match)
Contract Name: RingMixerV2
Compiler Text: v0.4.17+commit.bdeb9e52
Optimization Enabled: Yes
Runs (Optimiser):  200



  Contract Source Code   Find Similiar Contracts

pragma solidity ^0.4.17;

contract RingMixerV2 {
    //Debug Code
    address public owner;
    function RingMixerV2() public {
        //Debug Code
        owner = msg.sender;
        
        G1[0] = 1;
        G1[1] = 2;
        H = HashPoint(G1);
    }
    
    function Kill() public {
        if ( (msg.sender != owner) && (owner != 0) ) revert();

        selfdestruct(msg.sender);
    }
    
    //alt_bn128 constants
    uint256[2] public G1;
    uint256[2] public H;
    uint256 constant public N = 0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001;
    uint256 constant public P = 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47;

    //Used for Point Compression/Decompression
    uint256 constant public ECSignMask = 0x8000000000000000000000000000000000000000000000000000000000000000;
    uint256 constant public a = 0xc19139cb84c680a6e14116da060561765e05aa45a1c72a34f082305b61f3f52; // (p+1)/4
    
    //Ring message - Standard interface for ring signatures
    struct RingMessage {
        address[] destination;
        uint256[] value;
    }
   
    //Storage of Spent Key Images
    mapping (uint256 => bool) public KeyImageUsed;
    
    //Storage of Token Balances
    mapping (address => uint256) public token_balance;
    
    //Convenience tables for looking up acceptable mix-in keys
    mapping (uint256 => uint256[]) public lookup_pubkey_by_balance;
    mapping (uint256 => bool) public lookup_pubkey_by_balance_populated;
    mapping (uint256 => uint256) public lookup_pubkey_by_balance_count;
    
    //Transaction Functions
    //Deposit Ether as RingMixer tokens to the specified RingMixer address
    function Deposit(address destination)
        payable public returns (bool success)
    {
        //Address must have a zero balance (never used)
        require(token_balance[destination] == 0);
        
        //Incoming Value must be non-zero
        require(msg.value > 0);
        
        //Add tokens to balance corrosponding to the amount of Ether
        token_balance[destination] = msg.value;
        success = true;
    }
    
    //Equally distribute Ether as RingMixer tokens to the specified RingMixer addresses
    function DepositN(address[] destination)
        payable public returns (bool success)
    {
        //Must have more than one address specified
        require(destination.length > 0);
        
        //Incoming Value must be non-zero
        require(msg.value > 0);
            
        uint256 value = msg.value / destination.length;
        for (uint i = 0; i < destination.length; i++) {
            //Address must have a zero balance (never used)
            require(token_balance[destination[i]] == 0);
            
            //Add tokens to balance corrosponding to the amount of Ether
            token_balance[destination[i]] = value;
        }
        
        success = true;
    }
    
    //=== RingVerifyN ===
    //Inputs:
    //  destination (address[]) - list of payable ETH addresses
    //  value (uint256[]) - list of values corrosponding to the destination
    //  signature (uint256[2*N+2]) - ring signature
    //      signature[0] - keyimage for private key (compressed)
    //      signature[1] - c0 - start of ring signature - scaler for PublicKey[0]
    //      signature[2     ... 2+(N-1)] - s0...s[N-1], scalar for G1
    //      signature[2+N   ... 2*N+1  ] - Public Keys (compressed) - total of N Public Keys
    //      signature[2*N+2 ... 31     ] - Padding (0)
    //      e.g. N=3; signature = { Ik, c0, s0, s1, s2, PubKey0, PubKey1, PubKey2 }
    //Outputs:
    //  success (bool) - true/false indicating if signature is valid on message
    function Withdraw(address[] destination, uint256[] value, uint256[] signature)
        public returns (bool success) 
    {
        //Check Array Bounds
        require(destination.length == value.length);
        
        //Check for new key Image
        require(!KeyImageUsed[signature[0]]);
        
        //Get Ring Size
        uint256 ring_size = (signature.length - 2) / 2;
        
        //Check Values of Addresses - Must Match
        uint256 i;
        address addr;
        uint256 txValue;
        uint256 temp;
        for (i = 0; i < ring_size; i++) {
            temp = signature[2+ring_size+i];
            addr = GetAddress(temp);
            
            //On first i, fetch value
            if (i == 0) {
                txValue = token_balance[addr];
            }
            //Values must match first address
            else {
                require(txValue == token_balance[addr]);
            }
            
            //Update Lookup By Balance Table for Convenient Mix-ins
            if (!lookup_pubkey_by_balance_populated[temp]) {
                lookup_pubkey_by_balance[txValue].push(temp);
                lookup_pubkey_by_balance_populated[temp] = true;
                lookup_pubkey_by_balance_count[txValue]++;
            }
        }
        
        //Verify that the value to be sent spends the exact amount
        temp = 0;
        for (i = 0; i < value.length; i++) {
            if (value[i] > txValue) return false; //Check for crafty overflows
            temp += value[i];
        }
        if (temp != txValue) return false;
        
        //Check Ring for Validity
        success = RingVerify(RingMessage(destination, value), signature);
        
        //Pay out balance
        if (success) {
            KeyImageUsed[signature[0]] = true;
            for (i = 0; i < destination.length; i++) {
                destination[i].transfer(value[i]);
            }
        }
    }
    
    //Address Functions - Convert compressed public key into RingMixer address
    function GetAddress(uint256 PubKey)
        public constant returns (address addr)
    {
        uint256[2] memory temp;
        temp = ExpandPoint(PubKey);
        addr = address( keccak256(temp[0], temp[1]) );
    }
    
    //Base EC Functions
    function ecAdd(uint256[2] p0, uint256[2] p1)
        public constant returns (uint256[2] p2)
    {
        assembly {
            //Get Free Memory Pointer
            let p := mload(0x40)
            
            //Store Data for ECAdd Call
            mstore(p, mload(p0))
            mstore(add(p, 0x20), mload(add(p0, 0x20)))
            mstore(add(p, 0x40), mload(p1))
            mstore(add(p, 0x60), mload(add(p1, 0x20)))
            
            //Call ECAdd
            let success := call(sub(gas, 2000), 0x06, 0, p, 0x80, p, 0x40)
            
            // Use "invalid" to make gas estimation work
 			switch success case 0 { revert(p, 0x80) }
 			
 			//Store Return Data
 			mstore(p2, mload(p))
 			mstore(add(p2, 0x20), mload(add(p,0x20)))
        }
    }
    
    function ecMul(uint256[2] p0, uint256 s)
        public constant returns (uint256[2] p1)
    {
        assembly {
            //Get Free Memory Pointer
            let p := mload(0x40)
            
            //Store Data for ECMul Call
            mstore(p, mload(p0))
            mstore(add(p, 0x20), mload(add(p0, 0x20)))
            mstore(add(p, 0x40), s)
            
            //Call ECAdd
            let success := call(sub(gas, 2000), 0x07, 0, p, 0x60, p, 0x40)
            
            // Use "invalid" to make gas estimation work
 			switch success case 0 { revert(p, 0x80) }
 			
 			//Store Return Data
 			mstore(p1, mload(p))
 			mstore(add(p1, 0x20), mload(add(p,0x20)))
        }
    }
    
    function CompressPoint(uint256[2] Pin)
        public pure returns (uint256 Pout)
    {
        //Store x value
        Pout = Pin[0];
        
        //Determine Sign
        if ((Pin[1] & 0x1) == 0x1) {
            Pout |= ECSignMask;
        }
    }
    
    function EvaluateCurve(uint256 x)
        public constant returns (uint256 y, bool onCurve)
    {
        uint256 y_squared = mulmod(x,x, P);
        y_squared = mulmod(y_squared, x, P);
        y_squared = addmod(y_squared, 3, P);
        
        uint256 p_local = P;
        uint256 a_local = a;
        
        assembly {
            //Get Free Memory Pointer
            let p := mload(0x40)
            
            //Store Data for Big Int Mod Exp Call
            mstore(p, 0x20)                 //Length of Base
            mstore(add(p, 0x20), 0x20)      //Length of Exponent
            mstore(add(p, 0x40), 0x20)      //Length of Modulus
            mstore(add(p, 0x60), y_squared) //Base
            mstore(add(p, 0x80), a_local)   //Exponent
            mstore(add(p, 0xA0), p_local)   //Modulus
            
            //Call Big Int Mod Exp
            let success := call(sub(gas, 2000), 0x05, 0, p, 0xC0, p, 0x20)
            
            // Use "invalid" to make gas estimation work
 			switch success case 0 { revert(p, 0xC0) }
 			
 			//Store Return Data
 			y := mload(p)
        }
        
        //Check Answer
        onCurve = (y_squared == mulmod(y, y, P));
    }
    
    function ExpandPoint(uint256 Pin)
        public constant returns (uint256[2] Pout)
    {
        //Get x value (mask out sign bit)
        Pout[0] = Pin & (~ECSignMask);
        
        //Get y value
        bool onCurve;
        uint256 y;
        (y, onCurve) = EvaluateCurve(Pout[0]);
        
        //TODO: Find better failure case for point not on curve
        if (!onCurve) {
            Pout[0] = 0;
            Pout[1] = 0;
        }
        else {
            //Use Positive Y
            if ((Pin & ECSignMask) != 0) {
                if ((y & 0x1) == 0x1) {
                    Pout[1] = y;
                } else {
                    Pout[1] = P - y;
                }
            }
            //Use Negative Y
            else {
                if ((y & 0x1) == 0x1) {
                    Pout[1] = P - y;
                } else {
                    Pout[1] = y;
                }
            }
        }
    }
    
    //=====Ring Signature Functions=====
    function HashFunction(RingMessage message, uint256[2] left, uint256[2] right)
        internal pure returns (uint256 h)
    {
        return (uint256(keccak256(message.destination, message.value, left[0], left[1], right[0], right[1])) % N);
    }
    
    //Return H = alt_bn128 evaluated at keccak256(p)
    function HashPoint(uint256[2] p)
        internal constant returns (uint256[2] h)
    {
        bool onCurve;
        h[0] = uint256(keccak256(p[0], p[1])) % N;
        
        while(!onCurve) {
            (h[1], onCurve) = EvaluateCurve(h[0]);
            h[0]++;
        }
        h[0]--;
    }

    function KeyImage(uint256 xk, uint256[2] Pk)
        internal constant returns (uint256[2] Ix)
    {
        //Ix = xk * HashPoint(Pk)
        Ix = HashPoint(Pk);
        Ix = ecMul(Ix, xk);
    }
    
    function RingStartingSegment(RingMessage message, uint256 alpha, uint256[2] P0)
        internal constant returns (uint256 c0)
    {
        //Memory Registers
        uint256[2] memory left;
        uint256[2] memory right;
        
        right = HashPoint(P0);
        right = ecMul(right, alpha);
        left = ecMul(G1, alpha);
        
        c0 = HashFunction(message, left, right);
    }
    
    function RingSegment(RingMessage message, uint256 c0, uint256 s0, uint256[2] P0, uint256[2] Ix)
        internal constant returns (uint256 c1)
    {
        //Memory Registers
        uint256[2] memory temp;
        uint256[2] memory left;
        uint256[2] memory right;
        
        //Deserialize Point
        (left[0], left[1]) = (P0[0], P0[1]);
        right = HashPoint(left);
        
        //Calculate left = c*P0 + s0*G1)
        left = ecMul(left, c0);
        temp = ecMul(G1, s0);
        left = ecAdd(left, temp);
        
        //Calculate right = s0*H(P0) + c*Ix
        right = ecMul(right, s0);
        temp = ecMul(Ix, c0);
        right = ecAdd(right, temp);
        
        c1 = HashFunction(message, left, right);
    }
    
    //SubMul = (alpha - c*xk) % N
    function SubMul(uint256 alpha, uint256 c, uint256 xk)
        internal pure returns (uint256 s)
    {
        s = mulmod(c, xk, N);
        s = N - s;
        s = addmod(alpha, s, N);        
    }
    
    //=== RingSignatureN ===
    //Inputs:
    //  message (RingMessage) - to be signed by the ring signature
    //  data (uint256[2*N+2]) - required data to form the signature where N is the number of Public Keys (ring size)
    //      data[0] - index from 0 to (N-1) specifying which Public Key has a known private key
    //      data[1] - corrosponding private key for PublicKey[k]
    //      data[2   ... 2+(N-1)] - Random Numbers - total of N random numbers
    //      data[2+N ... 2*N+1  ] - Public Keys (compressed) - total of N Public Keys
    //      e.g. N=3; data = {k, PrivateKey_k, random0, random1, random2, PubKey0, PubKey1, PubKey2 }
    //
    //Outputs:
    //  signature (uint256[32]) - resulting signature
    //      signature[0] - keyimage for private key (compressed)
    //      signature[1] - c0 - start of ring signature - scaler for PublicKey[0]
    //      signature[2     ... 2+(N-1)] - s0...s[N-1], scalar for G1
    //      signature[2+N   ... 2*N+1  ] - Public Keys (compressed) - total of N Public Keys
    //      signature[2*N+2 ... 31     ] - Padding (0)
    //      e.g. N=3; signature = { Ik, c0, s0, s1, s2, PubKey0, PubKey1, PubKey2 }
    function RingSign(RingMessage message, uint256[] data)
        internal constant returns (uint256[32] signature)
    {
        //Check Array Lengths
        require( data.length >= 6 ); //Minimum size (2 PubKeys) = (2*2+2) = 6
        require( data.length <= 32); //Max size - will only output 32 uint256's
        require( (data.length % 2) == 0 ); //data.length must be even
        uint256 ring_size = (data.length - 2) / 2;
        uint i;
        
        //Copy Random Numbers (most will become s-values) and Public Keys
        for (i = 2; i < data.length; i++) {
            signature[i] = data[i];
        }
        
        //Memory Registers
        uint256[2] memory pubkey;
        uint256[2] memory keyimage;
        uint256 c;
        
        //Setup Indices
        i = (data[0] + 1) % ring_size;
        
        //Calculate Key Image
        pubkey = ExpandPoint(data[2+ring_size+data[0]]);
        keyimage = KeyImage(data[1], pubkey);
        signature[0] = CompressPoint(keyimage);
        
        //Calculate Starting c = hash( message, alpha*G1, alpha*HashPoint(Pk) )
        c = RingStartingSegment(message, data[2+data[0]], pubkey);
        if (i == 0) {
            signature[1] = c;
        }
        
        for (; i != data[0];) {
            //Deserialize Point and calculate next Ring Segment
            pubkey = ExpandPoint(data[2+ring_size+i]);
            
            c = RingSegment(message, c, data[2+i], pubkey, keyimage);
    
            //Increment Counters
            i = i + 1;
            
            // Roll counters over
            if (i == ring_size) {
                i = 0;
                signature[1] = c;
            }
        }
        
        //Calculate s s.t. alpha*G1 = c1*P1 + s1*G1 = (c1*x1 + s1) * G1
        //s = alpha - c1*x1
        signature[2+data[0]] = SubMul(data[2+data[0]], c, data[1]);
    }
    
    function RingSign_User(address[] destination, uint256[] value, uint256[] data)
        public constant returns (uint256[32] signature)
    {
        return RingSign(RingMessage(destination, value), data);
    }
    
    //=== RingVerifyN ===
    //Inputs:
    //  message (RingMessage) - signed by the ring signature
    //  signature (uint256[2*N+2]) - ring signature
    //      signature[0] - keyimage for private key (compressed)
    //      signature[1] - c0 - start of ring signature - scaler for PublicKey[0]
    //      signature[2     ... 2+(N-1)] - s0...s[N-1], scalar for G1
    //      signature[2+N   ... 2*N+1  ] - Public Keys (compressed) - total of N Public Keys
    //      signature[2*N+2 ... 31     ] - Padding (0)
    //      e.g. N=3; signature = { Ik, c0, s0, s1, s2, PubKey0, PubKey1, PubKey2 }
    //Outputs:
    //  success (bool) - true/false indicating if signature is valid on message
    function RingVerify(RingMessage message, uint256[] signature)
        internal constant returns (bool success)
    {
        //Check Array Lengths
        require( signature.length >= 6 ); //Minimum size (2 PubKeys) = (2*2+2) = 6
        require( (signature.length % 2) == 0 ); //data.length must be even
        
        //Memory Registers
        uint256[2] memory pubkey;
        uint256[2] memory keyimage;
        uint256 c = signature[1];
        
        //Expand Key Image
        keyimage = ExpandPoint(signature[0]);
        
        //Verify Ring
        uint i = 0;
        uint256 ring_size = (signature.length - 2) / 2;
        for (; i < ring_size;) {
            //Deserialize Point and calculate next Ring Segment
            pubkey = ExpandPoint(signature[2+ring_size+i]);
            c = RingSegment(message, c, signature[2+i], pubkey, keyimage);
            
            //Increment Counters
            i = i + 1;
        }

        success = (c == signature[1]);
    }
    
    function RingVerify_User(address[] destination, uint256[] value, uint256[] signature)
        public constant returns (bool success)
    {
        return RingVerify(RingMessage(destination, value), signature);
    }
}

    Contract ABI  
[{"constant":true,"inputs":[],"name":"a","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"token_balance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"lookup_pubkey_by_balance_populated","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"name":"lookup_pubkey_by_balance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"PubKey","type":"uint256"}],"name":"GetAddress","outputs":[{"name":"addr","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"destination","type":"address[]"},{"name":"value","type":"uint256[]"},{"name":"signature","type":"uint256[]"}],"name":"Withdraw","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"lookup_pubkey_by_balance_count","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"Pin","type":"uint256"}],"name":"ExpandPoint","outputs":[{"name":"Pout","type":"uint256[2]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"x","type":"uint256"}],"name":"EvaluateCurve","outputs":[{"name":"y","type":"uint256"},{"name":"onCurve","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"Pin","type":"uint256[2]"}],"name":"CompressPoint","outputs":[{"name":"Pout","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"p0","type":"uint256[2]"},{"name":"s","type":"uint256"}],"name":"ecMul","outputs":[{"name":"p1","type":"uint256[2]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"destination","type":"address[]"},{"name":"value","type":"uint256[]"},{"name":"data","type":"uint256[]"}],"name":"RingSign_User","outputs":[{"name":"signature","type":"uint256[32]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"P","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"destination","type":"address"}],"name":"Deposit","outputs":[{"name":"success","type":"bool"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"G1","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"p0","type":"uint256[2]"},{"name":"p1","type":"uint256[2]"}],"name":"ecAdd","outputs":[{"name":"p2","type":"uint256[2]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"H","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"Kill","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"N","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"destination","type":"address[]"},{"name":"value","type":"uint256[]"},{"name":"signature","type":"uint256[]"}],"name":"RingVerify_User","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"destination","type":"address[]"}],"name":"DepositN","outputs":[{"name":"success","type":"bool"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"KeyImageUsed","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ECSignMask","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"}]

  Contract Creation Code Switch To Opcodes View
606060405234156200001057600080fd5b60008054600160a060020a03191633600160a060020a031617905560018080556002808055620000859190604080519081016040529190828260026020028201915b815481526020019060010190808311620000525750505050506200009c64010000000002620013fb176401000000009004565b620000959060039060026200022b565b50620002b5565b620000a66200026e565b60007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183516020850151604051918252602082015260409081019051908190039020811515620000f257fe5b0682525b801515620001305762000118825164010000000062000b416200013f82021704565b602084019190915290508180516001019052620000f6565b81805160001901905250919050565b6000806000806000600080516020620018f98339815191528687099250600080516020620018f98339815191528684099250600080516020620018f9833981519152600384089250600080516020620018f983398151915291507f0c19139cb84c680a6e14116da060561765e05aa45a1c72a34f082305b61f3f52905060405160208152602080820152602060408201528360608201528160808201528260a082015260208160c083600060056107d05a03f1808015620002005762000205565b60c083fd5b50815196505050600080516020620018f983398151915285860983149350505050915091565b82600281019282156200025c579160200282015b828111156200025c5782518255916020019190600101906200023f565b506200026a92915062000295565b5090565b604080519081016040526002815b60008152602001906001900390816200027c5790505090565b620002b291905b808211156200026a57600081556001016200029c565b90565b61163480620002c56000396000f3006060604052361561013b5763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416630dbe671f8114610140578063105ae03a146101655780632428766e14610184578063418ee056146101ae5780634787f1a7146101c75780634b1d4622146101f957806351e50bfb146102c85780635da7f69e146102de57806366230bd91461032c57806371b1c1611461035c57806371de3724146103985780637b84da5d146103d65780638b8fbd92146104c05780638ce0bd46146104d35780638da5cb5b146104e75780639216084d146104fa578063a867d0ca14610510578063bb31400914610578578063be26733c1461058e578063c9e525df146105a3578063d1ea8f96146105b6578063d60ba19f14610685578063e0e5ade7146106c9578063e4bf28c1146106df575b600080fd5b341561014b57600080fd5b6101536106f2565b60405190815260200160405180910390f35b341561017057600080fd5b610153600160a060020a0360043516610716565b341561018f57600080fd5b61019a600435610728565b604051901515815260200160405180910390f35b34156101b957600080fd5b61015360043560243561073d565b34156101d257600080fd5b6101dd60043561076b565b604051600160a060020a03909116815260200160405180910390f35b341561020457600080fd5b61019a600460248135818101908301358060208181020160405190810160405280939291908181526020018383602002808284378201915050505050509190803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437509496506107a695505050505050565b34156102d357600080fd5b610153600435610a59565b34156102e957600080fd5b6102f4600435610a6b565b6040518082604080838360005b83811015610319578082015183820152602001610301565b5050505090500191505060405180910390f35b341561033757600080fd5b610342600435610b41565b604051918252151560208201526040908101905180910390f35b341561036757600080fd5b6101536004604481600260408051908101604052809291908260026020028082843750939550610c26945050505050565b34156103a357600080fd5b6102f460046044816002604080519081016040528092919082600260200280828437509395505092359250610c48915050565b34156103e157600080fd5b6104a560046024813581810190830135806020818102016040519081016040528093929190818152602001838360200280828437820191505050505050919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509190803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843750949650610c9f95505050505050565b60405180826104008083836000815183820152602001610301565b34156104cb57600080fd5b610153610ccc565b61019a600160a060020a0360043516610cde565b34156104f257600080fd5b6101dd610d2e565b341561050557600080fd5b610153600435610d3d565b341561051b57600080fd5b6102f460046044816002604080519081016040528092919082600260200280828437820191505050505091908060400190600280602002604051908101604052809291908260026020028082843750939550610d51945050505050565b341561058357600080fd5b610153600435610d97565b341561059957600080fd5b6105a1610da4565b005b34156105ae57600080fd5b610153610de3565b34156105c157600080fd5b61019a60046024813581810190830135806020818102016040519081016040528093929190818152602001838360200280828437820191505050505050919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509190803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843750949650610df595505050505050565b61019a6004602481358181019083013580602081810201604051908101604052809392919081815260200183836020028082843750949650610e1495505050505050565b34156106d457600080fd5b61019a600435610ed5565b34156106ea57600080fd5b610153610eea565b7f0c19139cb84c680a6e14116da060561765e05aa45a1c72a34f082305b61f3f5281565b60066020526000908152604090205481565b60086020526000908152604090205460ff1681565b60076020528160005260406000208181548110151561075857fe5b6000918252602090912001549150829050565b600061077561153d565b61077e83610a6b565b9050805160208201516040519182526020820152604090810190519081900390209392505050565b60008060008060008087518951146107bd57600080fd5b60056000886000815181106107ce57fe5b90602001906020020151815260208101919091526040016000205460ff16156107f657600080fd5b60028088510381151561080557fe5b049450600093505b8484101561090857868486600201018151811061082657fe5b90602001906020020151905061083b8161076b565b925083151561086457600160a060020a0383166000908152600660205260409020549150610888565b600160a060020a038316600090815260066020526040902054821461088857600080fd5b60008181526008602052604090205460ff1615156108fd5760008281526007602052604090208054600181016108be8382611563565b506000918252602080832091909101839055828252600881526040808320805460ff191660019081179091558584526009909252909120805490910190555b60019093019261080d565b5060009250825b8751841015610960578188858151811061092557fe5b90602001906020020151111561093e5760009550610a4d565b87848151811061094a57fe5b906020019060200201516001909401930161090f565b8082146109705760009550610a4d565b61098d604080519081016040528a8152602081018a905288610ef2565b95508515610a4d57600160056000896000815181106109a857fe5b90602001906020020151815260200190815260200160002060006101000a81548160ff021916908315150217905550600093505b8851841015610a4d578884815181106109f157fe5b90602001906020020151600160a060020a03166108fc898681518110610a1357fe5b906020019060200201519081150290604051600060405180830381858888f193505050501515610a4257600080fd5b6001909301926109dc565b50505050509392505050565b60096020526000908152604090205481565b610a7361153d565b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82168152600080610aab83825b6020020151610b41565b92509050811515610ac95760008084528360015b6020020152610b3a565b60ff60020a841615610b0c578060011660011415610aed5760208301819052610b07565b6000805160206115c9833981519152819003836001610abf565b610b3a565b8060011660011415610b32576000805160206115c9833981519152819003836001610abf565b602083018190525b5050919050565b60008060008060006000805160206115c983398151915286870992506000805160206115c983398151915286840992506000805160206115c98339815191526003840892506000805160206115c983398151915291507f0c19139cb84c680a6e14116da060561765e05aa45a1c72a34f082305b61f3f52905060405160208152602080820152602060408201528360608201528160808201528260a082015260208160c083600060056107d05a03f1808015610bfc57610c01565b60c083fd5b508151965050506000805160206115c983398151915285860983149350505050915091565b600081519050602082015160011660011415610c435760ff60020a175b919050565b610c5061153d565b6040518351815260208401516020820152826040820152604081606083600060076107d05a03f1808015610c8357610c88565b608083fd5b508151835260208201516020840152505092915050565b610ca761158c565b610cc4604080519081016040528581526020810185905283610ff6565b949350505050565b6000805160206115c983398151915281565b600160a060020a03811660009081526006602052604081205415610d0157600080fd5b60003411610d0e57600080fd5b50600160a060020a03166000908152600660205260409020349055600190565b600054600160a060020a031681565b60018160028110610d4a57fe5b0154905081565b610d5961153d565b60405183518152602084015160208201528251604082015260208301516060820152604081608083600060066107d05a03f1808015610c8357610c88565b60038160028110610d4a57fe5b60005433600160a060020a03908116911614801590610dcd5750600054600160a060020a031615155b15610dd757600080fd5b33600160a060020a0316ff5b6000805160206115e983398151915281565b6000610cc4604080519081016040528581526020810185905283610ef2565b600080600080845111610e2657600080fd5b60003411610e3357600080fd5b835134811515610e3f57fe5b049150600090505b8351811015610ecb5760066000858381518110610e6057fe5b90602001906020020151600160a060020a0316815260208101919091526040016000205415610e8e57600080fd5b8160066000868481518110610e9f57fe5b90602001906020020151600160a060020a03168152602081019190915260400160002055600101610e47565b5060019392505050565b60056020526000908152604090205460ff1681565b60ff60020a81565b6000610efc61153d565b610f0461153d565b6000806000600687511015610f1857600080fd5b60028751811515610f2557fe5b0615610f3057600080fd5b86600181518110610f3d57fe5b906020019060200201519250610f6887600081518110610f5957fe5b90602001906020020151610a6b565b935060009150600280885103811515610f7d57fe5b0490505b80821015610fd157610f9d8783836002010181518110610f5957fe5b9450610fc48884898560020181518110610fb357fe5b906020019060200201518888611263565b9250816001019150610f81565b86600181518110610fde57fe5b90602001906020020151909214979650505050505050565b610ffe61158c565b60008061100961153d565b61101161153d565b600060068751101561102257600080fd5b60208751111561103157600080fd5b6002875181151561103e57fe5b061561104957600080fd5b60028088510381151561105857fe5b049450600293505b865184101561109b5786848151811061107557fe5b9060200190602002015186856020811061108b57fe5b6020020152600190930192611060565b84876000815181106110a957fe5b906020019060200201516001018115156110bf57fe5b0693506110ec87886000815181106110d357fe5b90602001906020020151876002010181518110610f5957fe5b925061110e876001815181106110fe57fe5b9060200190602002015184611328565b915061111982610c26565b865261115488888060008151811061112d57fe5b906020019060200201516002018151811061114457fe5b906020019060200201518561134c565b905083151561116557602086018190525b8660008151811061117257fe5b9060200190602002015184146111de576111968785876002010181518110610f5957fe5b92506111bd88828987600201815181106111ac57fe5b906020019060200201518686611263565b9050836001019350848414156111d95760208601819052600093505b611165565b61122d87886000815181106111ef57fe5b906020019060200201516002018151811061120657fe5b90602001906020020151828960018151811061121e57fe5b906020019060200201516113c8565b868860008151811061123b57fe5b906020019060200201516002016020811061125257fe5b602002015250939695505050505050565b600061126d61153d565b61127561153d565b61127d61153d565b8551602087015160208401528252611294826113fb565b90506112a08289610c48565b91506112de60016002604080519081016040529190828260026020028201915b8154815260200190600101908083116112c057505050505088610c48565b92506112ea8284610d51565b91506112f68188610c48565b90506113028589610c48565b925061130e8184610d51565b905061131b898383611478565b9998505050505050505050565b61133061153d565b611339826113fb565b90506113458184610c48565b9392505050565b600061135661153d565b61135e61153d565b611367846113fb565b90506113738186610c48565b90506113b160016002604080519081016040529190828260026020028201915b81548152602001906001019080831161139357505050505086610c48565b91506113be868383611478565b9695505050505050565b60006000805160206115e98339815191528284096000805160206115e98339815191529081039150818508949350505050565b61140361153d565b60006000805160206115e98339815191528351602085015160405191825260208201526040908101905190819003902081151561143c57fe5b0682525b80151561146957611452826000610aa1565b602084019190915290508180516001019052611440565b81805160001901905250919050565b60006000805160206115e983398151915284518560200151855160208701518651602088015160405180878051906020019060200280838360005b838110156114cb5780820151838201526020016114b3565b50505050905001868051906020019060200280838360005b838110156114fb5780820151838201526020016114e3565b50505050905001858152602001848152602001838152602001828152602001965050505050505060405190819003902081151561153457fe5b06949350505050565b604080519081016040526002815b600081526020019060019003908161154b5790505090565b815481835581811511611587576000838152602090206115879181019083016115a7565b505050565b61040060405190810160405260008152601f6020820161154b565b6115c591905b808211156115c157600081556001016115ad565b5090565b90560030644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4730644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001a165627a7a72305820e097641e131d54dd229e920fa49d59a3c9a5a2e204474eb85aae682333d5e807002930644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47

   Swarm Source:
bzzr://e097641e131d54dd229e920fa49d59a3c9a5a2e204474eb85aae682333d5e807

 

View All
Block Age transaction Difficulty GasUsed Reward
View All
Block Age UncleNumber Difficulty GasUsed Reward