class Contract

Public Class Methods

[]( key ) click to toggle source
# File lib/universum/contract.rb, line 53
def self.[]( key ) find_by_address( key ); end
all() click to toggle source
# File lib/universum/contract.rb, line 56
def self.all() @@directory.values; end
at( key) click to toggle source
# File lib/universum/contract.rb, line 52
def self.at( key) find_by_address( key ); end
create( *args ) click to toggle source

account (builtin) services / transaction methods

# File lib/universum/contract.rb, line 62
def self.create( *args )
  klass = new( nil, *args )
  klass.setup( *args )
  klass
end
find( key ) click to toggle source
# File lib/universum/contract.rb, line 51
def self.find( key ) find_by_address( key ); end
find_by_address( key ) click to toggle source
# File lib/universum/contract.rb, line 46
def self.find_by_address( key )
   ## clean key (allow "embedded" class name e.g 0x4de2ee8 (SatoshiDice))
   key = key.gsub(/\(.+\)/, '' ).strip
   @@directory[ key ];
end
load( path ) click to toggle source

load “class-less” contract

e.g.   SathoshiDice = Contract.load( './sathoshi_dice' )
# File lib/universum/contract.rb, line 10
def self.load( path )
  extname = File.extname( path )   #=> ".rb"
  if extname == '.rb'
    ## do nothing
  else
    ## "convenience" helper - (auto-)add .rb extension
    path = "#{path}.rb"
  end

  code = File.open( path, 'r:bom|utf-8' ) { |f| f.read }

  ## auto-patch!!!!
  ##   change all ivars to use storage
  ##   e.g.  @greeting                  => storage.greeting
  ##         @balance_of[ msg.sender ]  => storage.balance_of[ msg.sender ]
  ##         ...
  ##
  ##  todo/fix: check for possible class variables!! (e.g. @@logger or something)
  ##               make regex "smarter"
  code = code.gsub( /(@{1,})([a-z][a-zA-Z0-9_]*)/ ) do |_|
    if $1.size == 1
       puts "auto-patching contract code >#{$1}#{$2}< to >storage[ :#{$2} ]<"
       "storage[ :#{$2} ]"
    else
       ## assume class variable - skip - keep as is
       "#{$1}#{$2}"
    end
  end

  klass = Class.new( Contract )
  klass.class_eval( code )   ## note: use class_eval (NOT instance_eval)
  klass
end
new( address=nil, *args ) click to toggle source
# File lib/universum/contract.rb, line 68
def initialize( address=nil, *args )
  ##  fix/todo:  use/lookup proper addr from contract
  ## construct address for now from object_id
  address = "0x#{(object_id << 1).to_s(16)}"  if address.nil?
  @address = Address.new( address )
  @storage = Storage.new

  ###########
  # note: does NOT auto-call setup - why? why not?
  #   use create !!!!!!

  ## todo: make initialize private - why? why not?
end
payable( *args ) click to toggle source
function sig(nature) macro for types (dummy for now)

e.g. use like

payable :process
payable :initialize
payable :bet, Integer
payable :lend_money, Address => Bool   ## returns Bool
# File lib/universum/contract.rb, line 98
def self.payable( *args ); end
store( key, o ) click to toggle source
# File lib/universum/contract.rb, line 55
def self.store( key, o ) @@directory.store( key, o ); end

Public Instance Methods

address() click to toggle source
# File lib/universum/contract.rb, line 87
def address() @address; end
assert( condition, message=nil ) click to toggle source

todo/fix: use module Assertions and include in contract class

# File lib/universum/contract.rb, line 111
def assert( condition, message=nil )
  ## note: use message to avoid conflict with msg helper/builtin in contract!!!
  if condition == true
    ## do nothing
  else
    if message
      raise "Contract Assertion Failed; Contract Halted (Stopped): #{message}"
    else
      raise 'Contract Assertion Failed; Contract Halted (Stopped)'
    end
  end
end
block() click to toggle source
# File lib/universum/contract.rb, line 128
def block()      Universum.block;        end
blockhash( number ) click to toggle source
# File lib/universum/contract.rb, line 129
def blockhash( number )
  ## todo/fix: only allow going back 255 blocks; check if number is in range!!!
  Universum.blockhash( number )
end
log( event ) click to toggle source
# File lib/universum/contract.rb, line 126
def log( event ) Universum.log( event ); end
msg() click to toggle source
# File lib/universum/contract.rb, line 127
def msg()        Universum.msg;          end
setup() click to toggle source
# File lib/universum/contract.rb, line 83
def setup
  # default (built-in) setup; do nothing
end
storage() click to toggle source
# File lib/universum/contract.rb, line 90
def storage() @storage; end
this() click to toggle source
# File lib/universum/contract.rb, line 88
def this()    @address; end

Private Instance Methods

selfdestruct( owner ) click to toggle source
# File lib/universum/contract.rb, line 135
def selfdestruct( owner )   ## todo/check: use a different name e.g. destruct/ delete - why? why not?
  ## selfdestruct function (for clean-up on blockchain)
  owner.send( @balance )    ## send back all funds owned/hold by contract

   ## fix: does nothing for now - add some code (e.g. cleanup)
   ##  mark as destruct - why? why not?
end