// Examples taken from the Solidity documentation online.
// for pragma version numbers, see https://docs.npmjs.com/misc/semver#versions
pragma solidity 0.4.0;
pragma solidity ^0.4.0;
import "SomeFile.sol";
import "SomeFile.sol" as SomeOtherFile;
import * as SomeSymbol from "AnotherFile.sol";
import {symbol1 as alias, symbol2} from "File.sol";
interface i {
function f();
}
contract c {
function c()
{
val1 = 1 wei; // 1
val2 = 1 szabo; // 1 * 10 ** 12
val3 = 1 finney; // 1 * 10 ** 15
val4 = 1 ether; // 1 * 10 ** 18
}
uint256 val1;
uint256 val2;
uint256 val3;
uint256 val4;
}
contract test {
enum ActionChoices { GoLeft, GoRight, GoStraight, SitStill }
function test()
{
choices = ActionChoices.GoStraight;
}
function getChoice() returns (uint d)
{
d = uint256(choices);
}
ActionChoices choices;
}
contract Base {
function Base(uint i)
{
m_i = i;
}
uint public m_i;
}
contract Derived is Base(0) {
function Derived(uint i) Base(i) {}
}
contract C {
uint248 x; // 31 bytes: slot 0, offset 0
uint16 y; // 2 bytes: slot 1, offset 0 (does not fit in slot 0)
uint240 z; // 30 bytes: slot 1, offset 2 bytes
uint8 a; // 1 byte: slot 2, offset 0 bytes
struct S {
uint8 a; // 1 byte, slot +0, offset 0 bytes
uint256 b; // 32 bytes, slot +1, offset 0 bytes (does not fit)
}
S structData; // 2 slots, slot 3, offset 0 bytes (does not really apply)
uint8 alpha; // 1 byte, slot 4 (start new slot after struct)
uint16[3] beta; // 3*16 bytes, slots 5+6 (start new slot for array)
uint8 gamma; // 1 byte, slot 7 (start new slot after array)
}
contract test {
function f(uint x, uint y) returns (uint z) {
var c = x + 3;
var b = 7 + (c * (8 - 7)) - x;
return -(-b | 0);
}
}
contract test {
function f(uint x, uint y) returns (uint z) {
return 10;
}
}
contract c {
function () returns (uint) { return g(8); }
function g(uint pos) internal returns (uint) { setData(pos, 8); return getData(pos); }
function setData(uint pos, uint value) internal { data[pos] = value; }
function getData(uint pos) internal { return data[pos]; }
mapping(uint => uint) data;
}
contract Sharer {
function sendHalf(address addr) returns (uint balance) {
if (!addr.send(msg.value/2))
throw; // also reverts the transfer to Sharer
return address(this).balance;
}
}
/// @dev Models a modifiable and iterable set of uint values.
library IntegerSet
{
struct data
{
/// Mapping item => index (or zero if not present)
mapping(uint => uint) index;
/// Items by index (index 0 is invalid), items with index[item] == 0 are invalid.
uint[] items;
/// Number of stored items.
uint size;
}
function insert(data storage self, uint value) returns (bool alreadyPresent)
{
uint index = self.index[value];
if (index > 0)
return true;
else
{
if (self.items.length == 0) self.items.length = 1;
index = self.items.length++;
self.items[index] = value;
self.index[value] = index;
self.size++;
return false;
}
}
function remove(data storage self, uint value) returns (bool success)
{
uint index = self.index[value];
if (index == 0)
return false;
delete self.index[value];
delete self.items[index];
self.size --;
}
function contains(data storage self, uint value) returns (bool)
{
return self.index[value] > 0;
}
function iterate_start(data storage self) returns (uint index)
{
return iterate_advance(self, 0);
}
function iterate_valid(data storage self, uint index) returns (bool)
{
return index < self.items.length;
}
function iterate_advance(data storage self, uint index) returns (uint r_index)
{
index++;
while (iterate_valid(self, index) && self.index[self.items[index]] == index)
index++;
return index;
}
function iterate_get(data storage self, uint index) returns (uint value)
{
return self.items[index];
}
}
/// How to use it:
contract User
{
/// Just a struct holding our data.
IntegerSet.data data;
/// Insert something
function insert(uint v) returns (uint size)
{
/// Sends `data` via reference, so IntegerSet can modify it.
IntegerSet.insert(data, v);
/// We can access members of the struct - but we should take care not to mess with them.
return data.size;
}
/// Computes the sum of all stored data.
function sum() returns (uint s)
{
for (var i = IntegerSet.iterate_start(data); IntegerSet.iterate_valid(data, i); i = IntegerSet.iterate_advance(data, i))
s += IntegerSet.iterate_get(data, i);
}
}
// This broke it at one point (namely the modifiers).
contract DualIndex {
mapping(uint => mapping(uint => uint)) data;
address public admin;
modifier restricted { if (msg.sender == admin) _; }
function DualIndex() {
admin = msg.sender;
}
function set(uint key1, uint key2, uint value) restricted {
uint[2][4] memory defaults; // "memory" broke things at one time.
data[key1][key2] = value;
}
function transfer_ownership(address _admin) restricted {
admin = _admin;
}
function lookup(uint key1, uint key2) returns(uint) {
return data[key1][key2];
}
}
contract A {
}
contract B {
}
contract C is A, B {
}
contract TestPrivate
{
uint private value;
}
contract TestInternal
{
uint internal value;
}
contract FromSolparse is A, B, TestPrivate, TestInternal {
function() {
uint a = 6 ** 9;
var (x) = 100;
uint y = 2 days;
}
}
contract CommentedOutFunction {
// FYI: This empty function, as well as the commented
// out function below (bad code) is important to this test.
function() {
}
// function something()
// uint x = 10;
// }
}
library VarHasBrackets {
string constant specialRight = "}";
//string storage specialLeft = "{";
}
library UsingExampleLibrary {
function sum(uint[] storage self) returns (uint s) {
for (uint i = 0; i < self.length; i++)
s += self[i];
}
}
contract UsingExampleContract {
using UsingExampleLibrary for uint[];
}
contract NewStuff {
uint[] b;
function someFunction() payable {
string storage a = hex"ab1248fe";
b[2+2];
}
}
// modifier with expression
contract MyContract {
function fun() mymodifier(foo.bar()) {}
}
library GetCode {
function at(address _addr) returns (bytes o_code) {
assembly {
// retrieve the size of the code, this needs assembly
let size := extcodesize(_addr)
// allocate output byte array - this could also be done without assembly
// by using o_code = new bytes(size)
o_code := mload(0x40)
// new "memory end" including padding
mstore(0x40, add(o_code, and(add(add(size, 0x20), 0x1f), not(0x1f))))
// store length in memory
mstore(o_code, size)
// actually retrieve the code, this needs assembly
extcodecopy(_addr, add(o_code, 0x20), 0, size)
}
}
}
contract assemblyLocalBinding {
function test(){
assembly {
let v := 1
let x := 0x00
let y := x
let z := "hello"
}
}
}
contract assemblyReturn {
uint a = 10;
function get() constant returns(uint) {
assembly {
mstore(0x40, sload(0))
byte(0)
address(0)
return(0x40,32)
}
}
}
contract usesConst {
uint const = 0;
}
contract memoryArrays {
uint seven = 7;
function returnNumber(uint number) returns (uint){
return number;
}
function alloc() {
uint[] memory a = new uint[](7);
uint[] memory b = new uint[](returnNumber(seven));
}
}
contract DeclarativeExpressions {
uint a;
uint b = 7;
uint b2=0;
uint public c;
uint constant public d;
uint public constant e;
uint private constant f = 7;
struct S { uint q;}
function ham(S storage s1, uint[] storage arr) internal {
uint x;
uint y = 7;
S storage s2 = s1;
uint[] memory stor;
uint[] storage stor2 = arr;
}
}
contract VariableDeclarationTuple {
function getMyTuple() returns (bool, bool){
return (true, false);
}
function ham (){
var (x, y) = (10, 20);
var (a, b) = getMyTuple();
var (,c) = (10, 20);
var (d,,) = (10, 20, 30);
var (,e,,f,) = (10, 20, 30, 40, 50);
var (
num1, num2,
num3, ,num5
) = (10, 20, 30, 40, 50);
}
}
contract TypeIndexSpacing {
uint [ 7 ] x;
uint [] y;
}
contract Ballot {
struct Voter {
uint weight;
bool voted;
}
function abstain() returns (bool) {
return false;
}
function foobar() payable owner (myPrice) returns (uint[], address myAdd, string[] names) {}
function foobar() payable owner (myPrice) returns (uint[], address myAdd, string[] names);
Voter you = Voter(1, true);
Voter me = Voter({
weight: 2,
voted: abstain()
});
Voter airbnb = Voter({
weight: 2,
voted: true,
});
}
contract multilineReturn {
function a() returns (uint x) {
return
5;
}
}