def submit(self, name, code, owner=None, constructor_args={}): if self._driver.get_contract(name) is not None: raise Exception('Contract already exists.') c = ContractingCompiler(module_name=name) code_obj = c.parse_to_code(code, lint=True) scope = env.gather() scope.update({'__contract__': True}) scope.update(rt.env) exec(code_obj, scope) if scope.get(config.INIT_FUNC_NAME) is not None: if constructor_args is None: constructor_args = {} scope[config.INIT_FUNC_NAME](**constructor_args) now = scope.get('now') if now is not None: self._driver.set_contract(name=name, code=code_obj, owner=owner, overwrite=False, timestamp=now) else: self._driver.set_contract(name=name, code=code_obj, owner=owner, overwrite=False)
def exec_module(self, module): # fetch the individual contract code = MODULE_CACHE.get(module.__name__) if MODULE_CACHE.get(module.__name__) is None: code = self.d.get_compiled(module.__name__) if code is None: raise ImportError("Module {} not found".format(module.__name__)) if type(code) != bytes: code = bytes.fromhex(code) code = marshal.loads(code) MODULE_CACHE[module.__name__] = code if code is None: raise ImportError("Module {} not found".format(module.__name__)) scope = env.gather() scope.update(rt.env) scope.update({'__contract__': True}) # execute the module with the std env and update the module to pass forward exec(code, scope) # Update the module's attributes with the new scope vars(module).update(scope) del vars(module)['__builtins__'] rt.loaded_modules.append(module.__name__)
def test_visit_assign_variable(self): code = ''' v = Variable() ''' c = ContractingCompiler() comp = c.parse(code, lint=False) code_str = astor.to_source(comp) scope = env.gather() exec(code_str, scope) v = scope['__v'] self.assertEqual(v._key, '__main__.v')
def test_assign_hash_variable(self): code = ''' h = Hash() ''' c = ContractingCompiler() comp = c.parse(code, lint=False) code_str = astor.to_source(comp) scope = env.gather() exec(code_str, scope) h = scope['__h'] self.assertEqual(h._key, '__main__.h')
def test_visit_assign_foreign_variable(self): code = ''' fv = ForeignVariable(foreign_contract='scoob', foreign_name='kumbucha') ''' c = ContractingCompiler() comp = c.parse(code, lint=False) code_str = astor.to_source(comp) scope = env.gather() exec(code_str, scope) fv = scope['__fv'] self.assertEqual(fv._key, 'scoob.kumbucha')