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