Class: Universa::Contract

Inherits:
RemoteAdapter show all
Defined in:
lib/universa/contract.rb

Overview

Universa contract adapter.

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from RemoteAdapter

#__getobj__, #__setobj__, #initialize, #inspect, invoke_static, remote_class, remote_class_name, #to_s

Constructor Details

This class inherits a constructor from Universa::RemoteAdapter

Class Method Details

.create(issuer_key, expires_at: (Time.now + 90 * 24 * 60 * 60), use_short_address: false) ⇒ Contract

Create simple contract with preset critical parts:

  • expiration set to 90 days unless specified else

  • issuer role is set to the address of the issuer key_address, short ot long

  • creator role is set as link to issuer

  • owner role is set as link to issuer

  • change owner permission is set to link to owner

The while contract is then signed by the issuer key_address. Not that it will not seal it: caller almost always will add more data before it, then must call #seal().

Parameters:

  • issuer_key (PrivateKey)

    also will be used to sign it

  • expires_at (Time) (defaults to: (Time.now + 90 * 24 * 60 * 60))

    defaults to 90 days

  • use_short_address (Boolean) (defaults to: false)

    set to true to use short address of the issuer key_address in the role

Returns:

  • (Contract)

    simple contact, not sealed



104
105
106
107
108
109
110
111
112
113
114
# File 'lib/universa/contract.rb', line 104

def self.create issuer_key, expires_at: (Time.now + 90 * 24 * 60 * 60), use_short_address: false
  contract = Contract.new
  contract.set_expires_at expires_at
  contract.set_issuer_keys(use_short_address ? issuer_key.short_address : issuer_key.long_address)
  contract.register_role(contract.issuer.link_as("owner"))
  contract.register_role(contract.issuer.link_as("creator"))
  contract.add_permission ChangeOwnerPermission.new(contract.owner.link_as "@owner")
  contract.add_permission RevokePermission.new(contract.owner.link_as "@owner")
  contract.add_signer_key issuer_key
  contract
end

.from_packed(packed) ⇒ Object

Load from transaction pack



117
118
119
120
121
# File 'lib/universa/contract.rb', line 117

def self.from_packed packed
  packed.nil? and raise ArgumentError, "packed contract required"
  packed.force_encoding 'binary'
  self.invoke_static "fromPackedTransaction", packed
end

Instance Method Details

#amountBigDecimal

Helper for many token-like contracts containing state.data.amount

Returns:

  • (BigDecimal)

    amount or nil



211
212
213
# File 'lib/universa/contract.rb', line 211

def amount
  v = state[:amount] and BigDecimal(v.to_s)
end

#amount=(value) ⇒ Object

Write helper for many token-like contracts containing state.data.amount. Saves value in state.data.anomount and properly encodes it so it will be preserved on packing.

Parameters:

  • value (Object)

    should be some representation of a number (also string)



219
220
221
# File 'lib/universa/contract.rb', line 219

def amount= (value)
  state[:amount] = value.to_s.force_encoding('utf-8')
end

#can_perform_role(name, *keys) ⇒ Object

Test that some set of keys could be used to perform some role.

Parameters:

  • name (String)

    of the role to check

  • keys (PublicKey)

    instances to check against



250
251
252
253
254
# File 'lib/universa/contract.rb', line 250

def can_perform_role(name, *keys)
  getRole(name.to_s).isAllowedForKeys(Set.new keys.map {|x|
    x.is_a?(PrivateKey) ? x.public_key : x
  })
end

#create_revocation(*keys) ⇒ Contract

Create a contract that revokes this one if register with the Universa network. BE CAREFUL! REVOCATION IS IRREVERSIBLE! period.

Parameters:

  • keys (PrivateKey)

    enough to allow this contract revocation

Returns:

  • (Contract)

    revocation contract. Register it with the Universa network to perform revocation.



261
262
263
264
265
# File 'lib/universa/contract.rb', line 261

def create_revocation(*keys)
  revoke = Service.umi.invoke_static 'ContractsService', 'createRevocation', *keys
  revoke.seal
  revoke
end

#creatorRole

Shortcut ofr get_creator

Returns:

  • (Role)

    universa role of the creator



137
138
139
# File 'lib/universa/contract.rb', line 137

def creator
  get_creator
end

#definitionObject

Returns definition data.

Returns:

  • definition data



190
191
192
# File 'lib/universa/contract.rb', line 190

def definition
  @definition ||= get_definition.get_data
end

#errors_stringString

Call it after check to get summaru of errors found.

Returns:

  • (String)

    possibly empty ”



242
243
244
# File 'lib/universa/contract.rb', line 242

def errors_string
  getErrors.map {|e| "(#{e.object || ''}): #{e.error}"}.join(', ').strip
end

#expires_atObject

shortcut for get_expires_at. Get the contract expiration time.



179
180
181
# File 'lib/universa/contract.rb', line 179

def expires_at
  get_expires_at
end

#expires_at=(time) ⇒ Object

set expires_at field

Parameters:

  • time (Time)

    when this contract will be expired, if yet APPROVED.



185
186
187
# File 'lib/universa/contract.rb', line 185

def expires_at=(time)
  set_expires_at time
end

#hash_idHashId

shortcut for getHashId

Returns:

  • (HashId)

    of the contracr



164
165
166
# File 'lib/universa/contract.rb', line 164

def hash_id
  getId()
end

#issuerRole

Returns issuer role.

Returns:

  • (Role)

    issuer role



142
143
144
# File 'lib/universa/contract.rb', line 142

def issuer
  get_issuer
end

#keys_to_sign_withSet<PrivateKey>

returns keys that will be used to sign this contract on next #seal.

Returns:



131
132
133
# File 'lib/universa/contract.rb', line 131

def keys_to_sign_with
  get_keys_to_sign_with
end

#ok?Boolean

Shortcut for is_ok

Returns:

  • (Boolean)


158
159
160
# File 'lib/universa/contract.rb', line 158

def ok?
  is_ok
end

#originHashId

Returns of the origin contract.

Returns:

  • (HashId)

    of the origin contract



169
170
171
# File 'lib/universa/contract.rb', line 169

def origin
  getOrigin()
end

#ownerRole

Returns owner role.

Returns:

  • (Role)

    owner role



147
148
149
# File 'lib/universa/contract.rb', line 147

def owner
  get_owner
end

#owner=(key_address) ⇒ Object

Set owner to the key_address, usable only in the simplest case where owner is the single address.

Parameters:



153
154
155
# File 'lib/universa/contract.rb', line 153

def owner=(key_address)
  set_owner_key key_address
end

#packedObject

Get packed transaction containing the serialized signed contract and all its counterparts. Be sure to cal #seal somewhere before.

Returns:

  • binary string with packed transaction.



227
228
229
# File 'lib/universa/contract.rb', line 227

def packed
  get_packed_transaction
end

#parentHashId

Returns pf the parent contracr.

Returns:

  • (HashId)

    pf the parent contracr



174
175
176
# File 'lib/universa/contract.rb', line 174

def parent
  getParent()
end

#sealString

seal the contract

Returns:

  • (String)

    contract packed to the binary string



125
126
127
# File 'lib/universa/contract.rb', line 125

def seal
  super
end

#stateObject

Return state binder. Shortcut for Java API getStateData()



195
196
197
# File 'lib/universa/contract.rb', line 195

def state
  @state ||= getStateData()
end

#trace_errorsObject

trace found errors (call it afer check()): the Java version will not be able to trace to the process stdout, so we reqrite it here



233
234
235
236
237
# File 'lib/universa/contract.rb', line 233

def trace_errors
  getErrors.each {|e|
    puts "(#{e.object || ''}): #{e.error}"
  }
end

#transactionalBinder

Get transactional.data section creating it if need

Returns:



201
202
203
# File 'lib/universa/contract.rb', line 201

def transactional
  @transactional ||= getTransactionalData()
end