from copy import copy
from typing import List
from typing import Optional
from typing import Type
from pymavryk.context.abstract import AbstractContext
from pymavryk.michelson.micheline import Micheline
from pymavryk.michelson.micheline import MichelineLiteral
from pymavryk.michelson.micheline import MichelineSequence
from pymavryk.michelson.micheline import parse_micheline_literal
from pymavryk.michelson.types.base import MichelsonType
[docs]class SaplingTransactionType(MichelsonType, prim='sapling_transaction', args_len=1):
pass
[docs]class SaplingTransactionDeprecatedType(MichelsonType, prim='sapling_transaction_deprecated', args_len=1):
pass
[docs]class SaplingStateType(MichelsonType, prim='sapling_state', args_len=1):
def __init__(self, ptr: Optional[int] = None):
super(SaplingStateType, self).__init__()
self.ptr = ptr
self.context: Optional[AbstractContext] = None
def __repr__(self):
if self.ptr:
return f'<{self.ptr}>'
else:
return '{}'
[docs] @staticmethod
def empty(memo_size: int):
cls = SaplingStateType.create_type(args=[MichelineLiteral.create(memo_size)])
return cls()
[docs] @classmethod
def from_micheline_value(cls, val_expr) -> 'SaplingStateType':
if isinstance(val_expr, dict):
ptr = parse_micheline_literal(val_expr, {'int': int})
return cls(ptr=ptr)
elif isinstance(val_expr, list):
return cls()
else:
raise AssertionError(f'unexpected value {val_expr}')
[docs] def to_micheline_value(self, mode='readable', lazy_diff=False):
if lazy_diff:
return []
else:
assert self.ptr is not None, f'Sapling_state id is not defined'
return {'int': str(self.ptr)}
[docs] def to_python_object(self, try_unpack=False, lazy_diff=False, comparable=False):
assert not comparable, f'{self.prim} is not comparable'
if self.ptr is not None:
return self.ptr
else:
return []
[docs] def to_literal(self) -> Type[Micheline]:
if self.ptr is not None:
return MichelineLiteral.create(self.ptr)
else:
return MichelineSequence.create_type(args=[])
[docs] def attach_context(self, context: AbstractContext, big_map_copy=False):
self.context = context
self.ptr = context.get_tmp_sapling_state_id()
[docs] def merge_lazy_diff(self, lazy_diff: List[dict]) -> 'MichelsonType':
return copy(self)
[docs] def aggregate_lazy_diff(self, lazy_diff: List[dict], mode='readable') -> 'MichelsonType':
assert self.ptr is not None, f'Sapling_state ID is not defined'
if self.context:
dst_ptr, _ = self.context.get_sapling_state_diff()
else:
dst_ptr = self.ptr
return type(self)(dst_ptr)