Source code for genlayer.gl

"""
Blockchain specific functionality, that won't work without GenVM
and reexports form :py:mod:`genlayer.py` provided for convenience
"""

__all__ = (
	'Lazy',
	'Event',
	'MessageType',
	'MessageRawType',
	'message',
	'message_raw',
	'private',
	'public',
	# auto-loaded modules
	'wasi',
	'calldata',
	'storage',
	'advanced',
	# lazy loaded modules
	'vm',
	'evm',
	'nondet',
	'eq_principle',
	# other
	'contract_interface',
	'deploy_contract',
	'Contract',
	'get_contract_at',
)

import typing
import os

import genlayer.py.calldata as calldata
import _genlayer_wasi as wasi

from .events import Event

# reexports
from ..py.types import *
import genlayer.py.storage as storage

from ._internal.storage import STORAGE_MAN

storage.Root.MANAGER = STORAGE_MAN


def _post_load_evm(mod):
	from ._internal.eth import evm_contract_interface as ci

	mod.contract_interface = ci


if typing.TYPE_CHECKING or os.getenv('GENERATING_DOCS', 'false') == 'true':
	import genlayer.gl.nondet as nondet
	import genlayer.gl.advanced as advanced
	import genlayer.gl.eq_principle as eq_principle
	import genlayer.py.evm as evm
	import genlayer.gl.vm as vm
else:
	_modules = {
		'nondet': ('genlayer.gl.nondet', None),
		'eq_principle': ('genlayer.gl.eq_principle', None),
		'evm': ('genlayer.py.evm', _post_load_evm),
		'advanced': ('genlayer.gl.advanced', None),
		'vm': ('genlayer.gl.vm', None),
	}

	def __getattr__(name: str):
		module, post_load = _modules.get(name, (None, None))
		if module is None:
			raise AttributeError(f"module 'genlayer.gl' has no attribute '{name}'")
		mod = __import__(module, fromlist=[name])
		if post_load is not None:
			post_load(mod)
		globals()[name] = mod
		return mod


from .genvm_contracts import *
from .annotations import *
from genlayer._internal.msg import MessageRawType, message_raw as _message_raw_original


[docs] class MessageType(typing.NamedTuple): contract_address: Address """ Address of current Intelligent Contract """ sender_address: Address """ Address of this call initiator """ origin_address: Address """ Entire transaction initiator """ value: u256 chain_id: u256 """ Current chain ID """
def trace(*objs: typing.Any, sep: str = ' '): wasi.gl_call( calldata.encode( { 'Trace': { 'Message': sep.join(str(obj) for obj in objs), }, } ) ) def trace_time_micro() -> int: import genlayer.gl._internal.gl_call as gl_call return gl_call.gl_call_generic( { 'Trace': { 'RuntimeMicroSec': None, }, }, lambda x: typing.cast(int, calldata.decode(x)), ).get() if os.getenv('GENERATING_DOCS', 'false') == 'true': message_raw: MessageRawType = ... # type: ignore """ Raw message, parsed """ message: MessageType = ... # type: ignore """ Represents fields from a transaction message that was sent """ else: message_raw = _message_raw_original message = MessageType( contract_address=message_raw['contract_address'], sender_address=message_raw['sender_address'], origin_address=message_raw['origin_address'], value=u256(message_raw['value']), chain_id=u256(message_raw['chain_id']), )