A Pong contract variant that receives ETH via send(), testing value transfer between contracts.
Historical Significance
An early mainnet test of ETH value transfer between contracts via send(), from a tutorial series documenting Solidity development patterns.
Context
Deployed in September 2015 during the Frontier era. The send() function and its gas limitations were important concepts that developers needed to understand for safe ETH handling.
Key Facts
Description
A variant of the Pong tutorial contract from Cyrus Adkisson's solidity-baby-steps series (contract #46) that tests receiving ETH via the send() function. Unlike the basic Pong which only stores an int8 value, this version includes payable functionality to test inter-contract value transfers.
Deployed on September 22, 2015. Part of the Ping/Pong tutorial series exploring different patterns for contract-to-contract communication.
Source Verified
Exact creation bytecode match. Author Cyrus Adkisson published source at https://github.com/cyrusadkisson/solidity-baby-steps/blob/master/contracts/46_pong_via_send.sol. Batch-matched against 357 deploy TXs from deployer 0xcf684dfb8304729355b58315e8019b1aa2ad1bac.
Heuristic Analysis
The following characteristics were detected through bytecode analysis and may not be accurate.
Frontier Era
The initial release of Ethereum. A bare-bones implementation for technical users.
Bytecode Overview
Verified Source Available
Source verified through compiler archaeology and exact bytecode matching.
View Verification ProofShow source code (Solidity)
/***
* _ _ ___ ______ _ _ _____ _ _ _____
* | | | |/ _ \ | ___ \ \ | |_ _| \ | | __ \
* | | | / /_\ \| |_/ / \| | | | | \| | | \/
* | |/\| | _ || /| . ` | | | | . ` | | __
* \ /\ / | | || |\ \| |\ |_| |_| |\ | |_\ \
* \/ \/\_| |_/\_| \_\_| \_/\___/\_| \_/\____/
*
* This contract DOES NOT WORK at the moment. 9/22/2015
*/
// 1. Deploy Pong .
// 2. Deploy Ping, giving it the address of Pong.
// 3. Call Ping.touchPong() using a <pongaddress>.send()
// 4. ... which does... something ...
contract Pong {
address creator;
int8 constructortouches = 0;
int8 namelesstouches = 0;
/*********
Step 1: Deploy Pong
*********/
function Pong()
{
creator = msg.sender;
constructortouches = constructortouches + 1;
}
/*********
Step 4. Accept generic transaction (send(), hopefully)
*********/
function ()
{
namelesstouches = namelesstouches + 1;
return;
}
// ----------------------------------------------------------------------------------------------------------------------------------------
function getBalance() public constant returns (uint)
{
return this.balance;
}
/*********
touches getters
*********/
function getConstructorTouches() public constant returns (int8)
{
return constructortouches;
}
function getNamelessTouches() public constant returns (int8)
{
return namelesstouches;
}
/****
For double-checking this contract's address
****/
function getAddress() constant returns (address)
{
return this;
}
/**********
Standard kill() function to recover funds
**********/
function kill()
{
if (msg.sender == creator)
suicide(creator); // kills this contract and sends remaining funds back to creator
}
}