Contract Overview
Balance: 0 Ether
Ether Value: $0
Transactions: 2 txns
Misc:
Address Watch: Add To Watch List
Contract Creator: 0xa9b16b8c2399510706cd275ad9f86ef668067351at txn 0x6240d321760fd5ac066b5a9adfa41befa42747656f686d74956768e76c99f287
Token Balance:
 Latest 2 txns

TxHash Age From To Value [TxFee]
0xf9a101682c637f7741f281c858527d17036f4df284b7064bd1ca44531ab8837451 days 14 hrs ago0x52c7e34f94412567a8d067261ff715389ddf5cb6  IN   0xcf65a4e884373ad12cd91c8c868f1de9da48501f0 Ether0.004848755
0x6cb6bccb6d51445ce026dd76b8526e8014a6a276255d22e4f5be26f8efb891fb51 days 14 hrs ago0xa9b16b8c2399510706cd275ad9f86ef668067351  IN   0xcf65a4e884373ad12cd91c8c868f1de9da48501f0 Ether0.004692355
0xc25ee135911ed0ab68e1d63ffad6abd1df7b11fc787c6044995a16dcad8f9bb851 days 14 hrs ago0xa9b16b8c2399510706cd275ad9f86ef668067351  IN   0xcf65a4e884373ad12cd91c8c868f1de9da48501f0 Ether0.005443
0x6240d321760fd5ac066b5a9adfa41befa42747656f686d74956768e76c99f28751 days 14 hrs ago0xa9b16b8c2399510706cd275ad9f86ef668067351  IN    Contract Creation0 Ether0.006394785
[ Download CSV Export  ] 
 Internal Transactions as a result of Contract Execution
View All
ParentTxHash Block Age From To Value
Warning: The Compiled Contract might be susceptible to ExpExponentCleanup (medium/high-severity), EventStructWrongData (very low-severity) SolidityCompiler Bugs.

Contract Source Code Verified (Exact Match)
Contract Name: AZTECERC20Bridge
Compiler Text: v0.4.23+commit.124ca40d
Optimization Enabled: No
Runs (Optimiser):  200



  Contract Source Code   Find Similiar Contracts

pragma solidity ^0.4.23;

library AZTECInterface {
    function validateJoinSplit(bytes32[6][], uint, uint, bytes32[4]) external pure returns (bool) {}
}

/**
 * @title ERC20 interface
 * @dev https://github.com/ethereum/EIPs/issues/20
 **/
contract ERC20Interface {
  function transfer(address to, uint256 value) external returns (bool);

  function transferFrom(address from, address to, uint256 value)
    external returns (bool);
}

/**
 * @title  AZTEC token, providing a confidential representation of an ERC20 token 
 * @author Zachary Williamson, AZTEC
 * Copyright Spilsbury Holdings Ltd 2018. All rights reserved.
 * We will be releasing AZTEC as an open-source protocol that provides efficient transaction privacy for Ethereum.
 * This will include our bespoke AZTEC decentralized exchange, allowing for cross-asset transfers with full transaction privacy
 * and interopability with public decentralized exchanges.
 * Stay tuned for updates!
 **/
contract AZTECERC20Bridge {
    uint private constant groupModulusBoundary = 10944121435919637611123202872628637544274182200208017171849102093287904247808;
    uint private constant groupModulus = 21888242871839275222246405745257275088548364400416034343698204186575808495617;
    uint public scalingFactor;
    mapping(bytes32 => address) public noteRegistry;
    bytes32[4] setupPubKey;
    bytes32 domainHash;
    ERC20Interface token;

    event Created(bytes32 domainHash, address contractAddress);
    event ConfidentialTransfer();

    /**
    * @dev contract constructor.
    * @param _setupPubKey the trusted setup public key (group element of group G2)
    * @param _token the address of the ERC20 token being attached to
    * @param _scalingFactor the mapping from note value -> ERC20 token value.
    * AZTEC notes have a range between 0 and 2^{25}-1 and ERC20 tokens range between 0 and 2^{255} - 1
    * so we don't want to directly map note value : token value
    **/
    constructor(bytes32[4] _setupPubKey, address _token, uint256 _scalingFactor) public {
        setupPubKey = _setupPubKey;
        token = ERC20Interface(_token);
        scalingFactor = _scalingFactor;

        // calculate the EIP712 domain hash, for hashing structured data
        bytes32 _domainHash;
        assembly {
            let m := mload(0x40)
            mstore(m, 0x8d4b25bfecb769291b71726cd5ec8a497664cc7292c02b1868a0534306741fd9)
            mstore(add(m, 0x20), 0x87a23625953c9fb02b3570c86f75403039bbe5de82b48ca671c10157d91a991a) // name = "AZTEC_MAINNET_DOMAIN"
            mstore(add(m, 0x40), 0x25130290f410620ec94e7cf11f1cdab5dea284e1039a83fa7b87f727031ff5f4) // version = "0.1.0"
            mstore(add(m, 0x60), 1) // chain id
            mstore(add(m, 0x80), 0x210db872dec2e06c375dd40a5a354307bb4ba52ba65bd84594554580ae6f0639)
            mstore(add(m, 0xa0), address) // verifying contract
            _domainHash := keccak256(m, 0xc0)
        }
        domainHash = _domainHash;
        emit Created(_domainHash, this);
    }

    /**
    * @dev Determine validity of an input note and remove from note registry
    * 1. validate that the note is signed by the note owner
    * 2. validate that the note exists in the note registry
    *
    * Note signature is EIP712 signature (https://github.com/ethereum/EIPs/blob/master/EIPS/eip-712.md) over the following struct
    * struct AZTEC_NOTE_SIGNATURE {
    *     bytes32[4] note;
    *     uint256 challenge;
    *     address sender;    
    * };
    * @param note AZTEC confidential note being destroyed
    * @param signature ECDSA signature from note owner
    * @param challenge AZTEC zero-knowledge proof challenge
    * @param domainHashT Temporary holding ```domainHash``` (to minimize # of sload ops)
    **/
    function validateInputNote(bytes32[6] note, bytes32[3] signature, uint challenge, bytes32 domainHashT) internal {
        bytes32 noteHash;
        bytes32 signatureMessage;
        assembly {
            let m := mload(0x40)
            mstore(m, mload(add(note, 0x40)))
            mstore(add(m, 0x20), mload(add(note, 0x60)))
            mstore(add(m, 0x40), mload(add(note, 0x80)))
            mstore(add(m, 0x60), mload(add(note, 0xa0)))
            noteHash := keccak256(m, 0x80)
            mstore(m, 0x1aba5d08f7cd777136d3fa7eb7baa742ab84001b34c9de5b17d922fc2ca75cce) // keccak256 hash of "AZTEC_NOTE_SIGNATURE(bytes32[4] note,uint256 challenge,address sender)"
            mstore(add(m, 0x20), noteHash)
            mstore(add(m, 0x40), challenge)
            mstore(add(m, 0x60), caller)
            mstore(add(m, 0x40), keccak256(m, 0x80))
            mstore(add(m, 0x20), domainHashT)
            mstore(m, 0x1901)
            signatureMessage := keccak256(add(m, 0x1e), 0x42)
        }
        address owner = ecrecover(signatureMessage, uint8(signature[0]), signature[1], signature[2]);
        require(owner != address(0), "signature invalid");
        require(noteRegistry[noteHash] == owner, "expected input note to exist in registry");
        noteRegistry[noteHash] = 0;
    }

    /**
    * @dev Validate an output note from an AZTEC confidential transaction
    * If the note does not already exist in ```noteRegistry```, create it
    * @param note AZTEC confidential note to be created
    * @param owner The address of the note owner
    **/
    function validateOutputNote(bytes32[6] note, address owner) internal {
        bytes32 noteHash; // Construct a keccak256 hash of the note coordinates.
        assembly {
            let m := mload(0x40)
            mstore(m, mload(add(note, 0x40)))
            mstore(add(m, 0x20), mload(add(note, 0x60)))
            mstore(add(m, 0x40), mload(add(note, 0x80)))
            mstore(add(m, 0x60), mload(add(note, 0xa0)))
            noteHash := keccak256(m, 0x80)
        }
        require(owner != address(0), "owner must be valid Ethereum address");
        require(noteRegistry[noteHash] == 0, "expected output note to not exist in registry");
        noteRegistry[noteHash] = owner;
    }

    /**
    * @dev Perform a confidential transaction. Takes ```m``` input notes and ```notes.length - m``` output notes.
    * ```notes, m, challenge``` constitute an AZTEC zero-knowledge proof that states the following:
    * The sum of the values of the input notes is equal to a the sum of the values of the output notes + a public commitment value ```kPublic```
    * \sum_{i=0}^{m-1}k_i = \sum_{i=m}^{n-1}k_i + k_{public} (mod p)
    * notes[6][] contains value ```kPublic```  at notes[notes.length - 1][0].
    * If ```kPublic``` is negative, this represents ```(GROUP_MODULUS - kPublic) * SCALING_FACTOR``` ERC20 tokens being converted into confidential note form.
    * If ```kPublic``` is positive, this represents ```kPublic * SCALING_FACTOR``` worth of AZTEC notes being converted into ERC20 form
    * @param notes defines AZTEC input notes and output notes. notes[0,...,m-1] = input notes. notes[m,...,notes.length-1] = output notes
    * @param m where notes[0,..., m - 1] = input notes. notes[m,...,notes.length - 1] = output notes
    * @param challenge AZTEC zero-knowledge proof challenge variable
    * @param inputSignatures array of ECDSA signatures, one for each input note
    * @param outputOwners addresses of owners, one for each output note
    * Unnamed param is metadata: if AZTEC notes are assigned to stealth addresses, metadata should contain the ephemeral keys required for note owner to identify their note
    */
    function confidentialTransfer(bytes32[6][] notes, uint256 m, uint256 challenge, bytes32[3][] inputSignatures, address[] outputOwners, bytes) external {
        require(inputSignatures.length == m, "input signature length invalid");
        require(inputSignatures.length + outputOwners.length == notes.length, "array length mismatch");

        // validate AZTEC zero-knowledge proof
        require(AZTECInterface.validateJoinSplit(notes, m, challenge, setupPubKey), "proof not valid!");

        // extract variable kPublic from proof
        uint256 kPublic = uint(notes[notes.length - 1][0]);
        require(kPublic < groupModulus, "invalid value of kPublic");

        // iterate over the notes array and validate each input/output note
        for (uint256 i = 0; i < notes.length; i++) {

            // if i < m this is an input note
            if (i < m) {

                // call validateInputNote to check that the note exists and that we have a matching signature over the note.
                // pass domainHash in as a function parameter to prevent multiple sloads
                // this will remove the input notes from noteRegistry
                validateInputNote(notes[i], inputSignatures[i], challenge, domainHash);
            } else {
                
                // if i >= m this is an output note
                // validate that output notes, attached to the specified owners do not exist in noteRegistry.
                // if all checks pass, add notes into note registry
                validateOutputNote(notes[i], outputOwners[i - m]);
            }
        }

        if (kPublic > 0) {
            if (kPublic < groupModulusBoundary) {

                // if value < the group modulus boundary then this public value represents a conversion from confidential note form to public form
                // call token.transfer to send relevent tokens
                require(token.transfer(msg.sender, kPublic * scalingFactor), "token transfer to user failed!");
            } else {

                // if value > group modulus boundary, this represents a commitment of a public value into confidential note form.
                // only proceed if the required transferFrom call from msg.sender to this contract succeeds
                require(token.transferFrom(msg.sender, this, (groupModulus - kPublic) * scalingFactor), "token transfer from user failed!");
            }
        }

        // emit an event to mark this transaction. Can recover notes + metadata from input data
        emit ConfidentialTransfer();
    }
}

    Contract ABI  
[{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"noteRegistry","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"notes","type":"bytes32[6][]"},{"name":"m","type":"uint256"},{"name":"challenge","type":"uint256"},{"name":"inputSignatures","type":"bytes32[3][]"},{"name":"outputOwners","type":"address[]"},{"name":"","type":"bytes"}],"name":"confidentialTransfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"scalingFactor","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_setupPubKey","type":"bytes32[4]"},{"name":"_token","type":"address"},{"name":"_scalingFactor","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"domainHash","type":"bytes32"},{"indexed":false,"name":"contractAddress","type":"address"}],"name":"Created","type":"event"},{"anonymous":false,"inputs":[],"name":"ConfidentialTransfer","type":"event"}]

  Contract Creation Code Switch To Opcodes View
608060405234801561001057600080fd5b5060405160c0806111ed833981018060405281019080919082608001805190602001909291908051906020019092919050505060008360029060046100569291906101d2565b5082600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550816000819055506040517f8d4b25bfecb769291b71726cd5ec8a497664cc7292c02b1868a0534306741fd981527f87a23625953c9fb02b3570c86f75403039bbe5de82b48ca671c10157d91a991a60208201527f25130290f410620ec94e7cf11f1cdab5dea284e1039a83fa7b87f727031ff5f46040820152600160608201527f210db872dec2e06c375dd40a5a354307bb4ba52ba65bd84594554580ae6f063960808201523060a082015260c0812091505080600681600019169055507f6e765c1505df7edb32788588e8f625dd368914ea995e3d429094152b826977a781306040518083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a15050505061023d565b8260048101928215610207579160200282015b828111156102065782518290600019169055916020019190600101906101e5565b5b5090506102149190610218565b5090565b61023a91905b8082111561023657600081600090555060010161021e565b5090565b90565b610fa18061024c6000396000f300608060405260043610610057576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680632a8cdfbb1461005c578063da98cb7b146100cd578063ed3437f814610164575b600080fd5b34801561006857600080fd5b5061008b600480360381019080803560001916906020019092919050505061018f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156100d957600080fd5b5061016260048036038101908080359060200190820180359060200191909192939192939080359060200190929190803590602001909291908035906020019082018035906020019190919293919293908035906020019082018035906020019190919293919293908035906020019082018035906020019190919293919293905050506101c2565b005b34801561017057600080fd5b506101796109d2565b6040518082815260200191505060405180910390f35b60016020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080898888905014151561023f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f696e707574207369676e6174757265206c656e67746820696e76616c6964000081525060200191505060405180910390fd5b8b8b90508686905089899050011415156102c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f6172726179206c656e677468206d69736d61746368000000000000000000000081525060200191505060405180910390fd5b73a43f8675850ac3f60a4d4cec954f1a1b0e1dbb0763b5596a888d8d8d8d60026040518663ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180806020018581526020018481526020018360048015610348576020028201915b81546000191681526020019060010190808311610330575b50508281038252878782818152602001925060c002808284378201915050965050505050505060206040518083038186803b15801561038657600080fd5b505af415801561039a573d6000803e3d6000fd5b505050506040513d60208110156103b057600080fd5b81019080805190602001909291905050501515610435576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f70726f6f66206e6f742076616c6964210000000000000000000000000000000081525060200191505060405180910390fd5b8b8b60018e8e905003818110151561044957fe5b905060c00201600060068110151561045d57fe5b6020020135600019166001900491507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182101515610503576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f696e76616c69642076616c7565206f66206b5075626c6963000000000000000081525060200191505060405180910390fd5b600090505b8b8b905081101561061a578981101561059e576105998c8c83818110151561052c57fe5b905060c0020160068060200260405190810160405280929190826006602002808284378201915050505050898984818110151561056557fe5b905060600201600380602002604051908101604052809291908260036020028082843782019150505050508b6006546109d8565b61060d565b61060c8c8c8381811015156105af57fe5b905060c002016006806020026040519081016040528092919082600660200280828437820191505050505087878d850381811015156105ea57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff16610d2b565b5b8080600101915050610508565b6000821115610998577f183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f80000008210156107c857600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb3360005485026040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561071457600080fd5b505af1158015610728573d6000803e3d6000fd5b505050506040513d602081101561073e57600080fd5b810190808051906020019092919050505015156107c3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f746f6b656e207472616e7366657220746f2075736572206661696c656421000081525060200191505060405180910390fd5b610997565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330600054867f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103026040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b1580156108e757600080fd5b505af11580156108fb573d6000803e3d6000fd5b505050506040513d602081101561091157600080fd5b81019080805190602001909291905050501515610996576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f746f6b656e207472616e736665722066726f6d2075736572206661696c65642181525060200191505060405180910390fd5b5b5b7fc377ec77b2d4e164767d661c3543ed9afe3fd6656829a68e1edebd88ca8a3a6760405160405180910390a1505050505050505050505050565b60005481565b600080600060405160408801518152606088015160208201526080880151604082015260a088015160608201526080812093507f1aba5d08f7cd777136d3fa7eb7baa742ab84001b34c9de5b17d922fc2ca75cce815283602082015285604082015233606082015260808120604082015284602082015261190181526042601e820120925050600182876000600381101515610a7057fe5b602002015160019004886001600381101515610a8857fe5b6020020151896002600381101515610a9c57fe5b6020020151604051600081526020016040526040518085600019166000191681526020018460ff1660ff1681526020018360001916600019168152602001826000191660001916815260200194505050505060206040516020810390808403906000865af1158015610b12573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515610bc3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f7369676e617475726520696e76616c696400000000000000000000000000000081525060200191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660016000856000191660001916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515610cc7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001807f657870656374656420696e707574206e6f746520746f20657869737420696e2081526020017f726567697374727900000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b600060016000856000191660001916815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050505050565b600060405160408401518152606084015160208201526080840151604082015260a0840151606082015260808120915050600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515610e27576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001807f6f776e6572206d7573742062652076616c696420457468657265756d2061646481526020017f726573730000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b600060016000836000191660001916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515610f16576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d8152602001807f6578706563746564206f7574707574206e6f746520746f206e6f74206578697381526020017f7420696e2072656769737472790000000000000000000000000000000000000081525060400191505060405180910390fd5b8160016000836000191660001916815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505600a165627a7a723058208d4a1cba83ad5ccdae4d72ecf542a685997707f51cad4ba6691b13e356bc07c8002901cf7cc93bfbf7b2c5f04a3bc9cb8b72bbcf2defcabdceb09860c493bdf1588d08d554bf59102bbb961ba81107ec71785ef9ce6638e5332b6c1a58b87447d181204e5d81d86c561f9344ad5f122a625f259996b065b80cbbe74a9ad97b6d7cc202cb2a424885c9e412b94c40905b359e3043275cd29f5b557f008cd0a3e0c0dc00000000000000000000000089d24a6b4ccb1b6faa2625fe562bdd9a23260359000000000000000000000000000000000000000000000000016345785d8a0000

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

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 01cf7cc93bfbf7b2c5f04a3bc9cb8b72bbcf2defcabdceb09860c493bdf1588d
Arg [1] : 08d554bf59102bbb961ba81107ec71785ef9ce6638e5332b6c1a58b87447d181
Arg [2] : 204e5d81d86c561f9344ad5f122a625f259996b065b80cbbe74a9ad97b6d7cc2
Arg [3] : 02cb2a424885c9e412b94c40905b359e3043275cd29f5b557f008cd0a3e0c0dc
Arg [4] : 00000000000000000000000089d24a6b4ccb1b6faa2625fe562bdd9a23260359
Arg [5] : 000000000000000000000000000000000000000000000000016345785d8a0000


   Library Used
AZTECInterface : 0xA43F8675850ac3f60A4D4cec954F1A1B0e1dbB07

   Swarm Source:
bzzr://8d4a1cba83ad5ccdae4d72ecf542a685997707f51cad4ba6691b13e356bc07c8

 

View All
Block Age transaction Difficulty GasUsed Reward
View All
Block Age UncleNumber Difficulty GasUsed Reward
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.