414 lines
9.0 KiB
Solidity
414 lines
9.0 KiB
Solidity
// 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;
|
|
}
|
|
}
|