Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def make_byte_slice_copier(destination, source, length, max_length, pos=None):
# Special case: memory to memory
if source.location == "memory" and destination.location == "memory":
return LLLnode.from_list([
'with', '_l', max_length,
[
'pop',
['call', 18 + max_length // 10, 4, 0, source, '_l', destination, '_l']
]
], typ=None, annotation='copy byte slice dest: %s' % str(destination))
# Copy over data
if isinstance(source.typ, NullType):
loader = 0
elif source.location == "memory":
loader = ['mload', ['add', '_pos', ['mul', 32, ['mload', MemoryPositions.FREE_LOOP_INDEX]]]]
elif source.location == "storage":
loader = ['sload', ['add', '_pos', ['mload', MemoryPositions.FREE_LOOP_INDEX]]]
else:
raise Exception("Unsupported location:" + source.location)
# Where to paste it?
if destination.location == "memory":
setter = [
'mstore',
['add', '_opos', ['mul', 32, ['mload', MemoryPositions.FREE_LOOP_INDEX]]],
loader
]
elif destination.location == "storage":
setter = ['sstore', ['add', '_opos', ['mload', MemoryPositions.FREE_LOOP_INDEX]], loader]
else:
raise Exception("Unsupported location:" + destination.location)
# Check to see if we hit the length
'pop',
['call', 18 + max_length // 10, 4, 0, source, '_l', destination, '_l']
]
], typ=None, annotation=f'copy byte slice dest: {str(destination)}')
# special case: rhs is zero
if source.value is None:
if destination.location == 'memory':
return mzero(destination, max_length)
else:
loader = 0
# Copy over data
elif source.location == "memory":
loader = ['mload', ['add', '_pos', ['mul', 32, ['mload', MemoryPositions.FREE_LOOP_INDEX]]]]
elif source.location == "storage":
loader = ['sload', ['add', '_pos', ['mload', MemoryPositions.FREE_LOOP_INDEX]]]
else:
raise CompilerPanic(f'Unsupported location: {source}')
# Where to paste it?
if destination.location == "memory":
setter = [
'mstore',
['add', '_opos', ['mul', 32, ['mload', MemoryPositions.FREE_LOOP_INDEX]]],
loader
]
elif destination.location == "storage":
setter = ['sstore', ['add', '_opos', ['mload', MemoryPositions.FREE_LOOP_INDEX]], loader]
else:
raise CompilerPanic("Unsupported location:" + destination.location)
# Check to see if we hit the length
setter = ['sstore', ['add', '_opos', ['mload', MemoryPositions.FREE_LOOP_INDEX]], loader]
else:
raise Exception("Unsupported location:" + destination.location)
# Check to see if we hit the length
checker = [
'if',
['gt', ['mul', 32, ['mload', MemoryPositions.FREE_LOOP_INDEX]], '_actual_len'],
'break'
]
# Make a loop to do the copying
o = [
'with', '_pos', source, [
'with', '_opos', destination, [
'with', '_actual_len', length, [
'repeat',
MemoryPositions.FREE_LOOP_INDEX,
0,
(max_length + 31) // 32,
['seq', checker, setter]
]
]
]
]
return LLLnode.from_list(
o,
typ=None,
annotation='copy byte slice src: %s dst: %s' % (source, destination),
pos=pos,
)
assert isinstance(type_str, str)
if type_str == 'decimal':
return float(cls.MINDECIMAL) <= value <= float(cls.MAXDECIMAL)
if type_str == 'uint256':
return 0 <= value <= cls.MAX_UINT256
elif type_str == 'int128':
return cls.MINNUM <= value <= cls.MAXNUM
else:
raise Exception('Unknown type "%s" supplied.' % type_str)
# Map representing all limits loaded into a contract as part of the initializer
# code.
LOADED_LIMIT_MAP = OrderedDict((
(MemoryPositions.ADDRSIZE, SizeLimits.ADDRSIZE),
(MemoryPositions.MAXNUM, SizeLimits.MAXNUM),
(MemoryPositions.MINNUM, SizeLimits.MINNUM),
(MemoryPositions.MAXDECIMAL, SizeLimits.MAXDECIMAL),
(MemoryPositions.MINDECIMAL, SizeLimits.MINDECIMAL),
))
RLP_DECODER_ADDRESS = hex_to_int('0x5185D17c44699cecC3133114F8df70753b856709')
# Instructions for creating RLP decoder on other chains
# First send 6270960000000000 wei to 0xd2c560282c9C02465C2dAcdEF3E859E730848761
# Publish this tx to create the contract: 0xf90237808506fc23ac00830330888080b902246102128061000e60003961022056600060007f010000000000000000000000000000000000000000000000000000000000000060003504600060c082121515585760f882121561004d5760bf820336141558576001905061006e565b600181013560f783036020035260005160f6830301361415585760f6820390505b5b368112156101c2577f010000000000000000000000000000000000000000000000000000000000000081350483602086026040015260018501945060808112156100d55760018461044001526001828561046001376001820191506021840193506101bc565b60b881121561014357608081038461044001526080810360018301856104600137608181141561012e5760807f010000000000000000000000000000000000000000000000000000000000000060018401350412151558575b607f81038201915060608103840193506101bb565b60c08112156101b857600182013560b782036020035260005160388112157f010000000000000000000000000000000000000000000000000000000000000060018501350402155857808561044001528060b6838501038661046001378060b6830301830192506020810185019450506101ba565bfe5b5b5b5061006f565b601f841315155857602060208502016020810391505b6000821215156101fc578082604001510182826104400301526020820391506101d8565b808401610420528381018161044003f350505050505b6000f31b2d4f
# This is the contract address: 0xCb969cAAad21A78a24083164ffa81604317Ab603
# Available base types
base_types = ['int128', 'decimal', 'bytes32', 'uint256', 'int256', 'bool', 'address']
for i, arg in enumerate(sig.args):
if i < len(sig.base_args):
clampers.append(make_arg_clamper(
arg.pos,
context.memory_allocator.get_next_memory_position(),
arg.typ,
sig.name == '__init__',
))
if isinstance(arg.typ, ByteArrayLike):
mem_pos, _ = context.memory_allocator.increase_memory(32 * get_size_of_type(arg.typ))
context.vars[arg.name] = VariableRecord(arg.name, mem_pos, arg.typ, False)
else:
if sig.name == '__init__':
context.vars[arg.name] = VariableRecord(
arg.name,
MemoryPositions.RESERVED_MEMORY + arg.pos,
arg.typ,
False,
)
elif i >= default_args_start_pos: # default args need to be allocated in memory.
default_arg_pos, _ = context.memory_allocator.increase_memory(32)
context.vars[arg.name] = VariableRecord(
name=arg.name,
pos=default_arg_pos,
typ=arg.typ,
mutable=False,
)
else:
context.vars[arg.name] = VariableRecord(
name=arg.name,
pos=4 + arg.pos,
typ=arg.typ,
location='memory'
)
setter = make_setter(tmp_list, right, 'memory', pos=getpos(self.expr))
load_i_from_list = [
'mload',
['add', tmp_list, ['mul', 32, ['mload', MemoryPositions.FREE_LOOP_INDEX]]],
]
elif right.location == "storage":
load_i_from_list = [
'sload',
['add', ['sha3_32', right], ['mload', MemoryPositions.FREE_LOOP_INDEX]],
]
else:
load_i_from_list = [
'mload',
['add', right, ['mul', 32, ['mload', MemoryPositions.FREE_LOOP_INDEX]]],
]
# Condition repeat loop has to break on.
break_loop_condition = [
'if',
['eq', unwrap_location(left), load_i_from_list],
['seq',
['mstore', '_result', 1], # store true.
'break']
]
# Repeat loop to loop-compare each item in the list.
for_loop_sequence = [
['mstore', result_placeholder, 0],
['with', '_result', result_placeholder, [
'repeat',
def in_bounds(cls, type_str, value):
assert isinstance(type_str, str)
if type_str == 'decimal':
return float(cls.MINDECIMAL) <= value <= float(cls.MAXDECIMAL)
if type_str == 'uint256':
return 0 <= value <= cls.MAX_UINT256
elif type_str == 'int128':
return cls.MINNUM <= value <= cls.MAXNUM
else:
raise Exception(f'Unknown type "{type_str}" supplied.')
# Map representing all limits loaded into a contract as part of the initializer
# code.
LOADED_LIMITS = {
MemoryPositions.ADDRSIZE: SizeLimits.ADDRSIZE,
MemoryPositions.MAXNUM: SizeLimits.MAXNUM,
MemoryPositions.MINNUM: SizeLimits.MINNUM,
MemoryPositions.MAXDECIMAL: SizeLimits.MAXDECIMAL,
MemoryPositions.MINDECIMAL: SizeLimits.MINDECIMAL,
}
RLP_DECODER_ADDRESS = hex_to_int('0x5185D17c44699cecC3133114F8df70753b856709')
# Instructions for creating RLP decoder on other chains
# First send 6270960000000000 wei to 0xd2c560282c9C02465C2dAcdEF3E859E730848761
# Publish this tx to create the contract: 0xf90237808506fc23ac00830330888080b902246102128061000e60003961022056600060007f010000000000000000000000000000000000000000000000000000000000000060003504600060c082121515585760f882121561004d5760bf820336141558576001905061006e565b600181013560f783036020035260005160f6830301361415585760f6820390505b5b368112156101c2577f010000000000000000000000000000000000000000000000000000000000000081350483602086026040015260018501945060808112156100d55760018461044001526001828561046001376001820191506021840193506101bc565b60b881121561014357608081038461044001526080810360018301856104600137608181141561012e5760807f010000000000000000000000000000000000000000000000000000000000000060018401350412151558575b607f81038201915060608103840193506101bb565b60c08112156101b857600182013560b782036020035260005160388112157f010000000000000000000000000000000000000000000000000000000000000060018501350402155857808561044001528060b6838501038661046001378060b6830301830192506020810185019450506101ba565bfe5b5b5b5061006f565b601f841315155857602060208502016020810391505b6000821215156101fc578082604001510182826104400301526020820391506101d8565b808401610420528381018161044003f350505050505b6000f31b2d4f # noqa: E501
# This is the contract address: 0xCb969cAAad21A78a24083164ffa81604317Ab603
# Keywords available for ast.Call type
VALID_CALL_KEYWORDS = {'uint256', 'int128', 'decimal', 'address', 'contract', 'indexed'}
return cls.MINDECIMAL <= value <= cls.MAXDECIMAL
if type_str == 'uint256':
return 0 <= value <= cls.MAX_UINT256
elif type_str == 'int128':
return cls.MINNUM <= value <= cls.MAXNUM
else:
raise Exception('Unknown type "%s" supplied.' % type_str)
# Map representing all limits loaded into a contract as part of the initializer
# code.
LOADED_LIMIT_MAP = OrderedDict((
(MemoryPositions.ADDRSIZE, SizeLimits.ADDRSIZE),
(MemoryPositions.MAXNUM, SizeLimits.MAXNUM),
(MemoryPositions.MINNUM, SizeLimits.MINNUM),
(MemoryPositions.MAXDECIMAL, SizeLimits.MAXDECIMAL),
(MemoryPositions.MINDECIMAL, SizeLimits.MINDECIMAL),
))
RLP_DECODER_ADDRESS = hex_to_int('0x5185D17c44699cecC3133114F8df70753b856709')
# Instructions for creating RLP decoder on other chains
# First send 6270960000000000 wei to 0xd2c560282c9C02465C2dAcdEF3E859E730848761
# Publish this tx to create the contract: 0xf90237808506fc23ac00830330888080b902246102128061000e60003961022056600060007f010000000000000000000000000000000000000000000000000000000000000060003504600060c082121515585760f882121561004d5760bf820336141558576001905061006e565b600181013560f783036020035260005160f6830301361415585760f6820390505b5b368112156101c2577f010000000000000000000000000000000000000000000000000000000000000081350483602086026040015260018501945060808112156100d55760018461044001526001828561046001376001820191506021840193506101bc565b60b881121561014357608081038461044001526080810360018301856104600137608181141561012e5760807f010000000000000000000000000000000000000000000000000000000000000060018401350412151558575b607f81038201915060608103840193506101bb565b60c08112156101b857600182013560b782036020035260005160388112157f010000000000000000000000000000000000000000000000000000000000000060018501350402155857808561044001528060b6838501038661046001378060b6830301830192506020810185019450506101ba565bfe5b5b5b5061006f565b601f841315155857602060208502016020810391505b6000821215156101fc578082604001510182826104400301526020820391506101d8565b808401610420528381018161044003f350505050505b6000f31b2d4f
# This is the contract address: 0xCb969cAAad21A78a24083164ffa81604317Ab603
# Available base types
base_types = ['int128', 'decimal', 'bytes32', 'uint256', 'int256', 'bool', 'address']
# Keywords available for ast.Call type
valid_call_keywords = ['uint256', 'int128', 'decimal', 'address', 'contract', 'indexed']
def make_clamper(datapos, mempos, typ, is_init=False):
if not is_init:
data_decl = ['calldataload', ['add', 4, datapos]]
copier = lambda pos, sz: ['calldatacopy', mempos, ['add', 4, pos], sz]
else:
data_decl = ['codeload', ['add', '~codelen', datapos]]
copier = lambda pos, sz: ['codecopy', mempos, ['add', '~codelen', pos], sz]
# Numbers: make sure they're in range
if is_base_type(typ, 'int128'):
return LLLnode.from_list(['clamp', ['mload', MemoryPositions.MINNUM], data_decl, ['mload', MemoryPositions.MAXNUM]],
typ=typ, annotation='checking int128 input')
# Booleans: make sure they're zero or one
elif is_base_type(typ, 'bool'):
return LLLnode.from_list(['uclamplt', data_decl, 2], typ=typ, annotation='checking bool input')
# Addresses: make sure they're in range
elif is_base_type(typ, 'address'):
return LLLnode.from_list(['uclamplt', data_decl, ['mload', MemoryPositions.ADDRSIZE]], typ=typ, annotation='checking address input')
# Bytes: make sure they have the right size
elif isinstance(typ, ByteArrayType):
return LLLnode.from_list(['seq',
copier(data_decl, 32 + typ.maxlen),
['assert', ['le', ['calldataload', ['add', 4, data_decl]], typ.maxlen]]],
typ=None, annotation='checking bytearray input')
# Lists: recurse
elif isinstance(typ, ListType):
o = []
def in_bounds(cls, type_str, value):
assert isinstance(type_str, str)
if type_str == 'decimal':
return float(cls.MINDECIMAL) <= value <= float(cls.MAXDECIMAL)
if type_str == 'uint256':
return 0 <= value <= cls.MAX_UINT256
elif type_str == 'int128':
return cls.MINNUM <= value <= cls.MAXNUM
else:
raise Exception('Unknown type "%s" supplied.' % type_str)
# Map representing all limits loaded into a contract as part of the initializer
# code.
LOADED_LIMIT_MAP = OrderedDict((
(MemoryPositions.ADDRSIZE, SizeLimits.ADDRSIZE),
(MemoryPositions.MAXNUM, SizeLimits.MAXNUM),
(MemoryPositions.MINNUM, SizeLimits.MINNUM),
(MemoryPositions.MAXDECIMAL, SizeLimits.MAXDECIMAL),
(MemoryPositions.MINDECIMAL, SizeLimits.MINDECIMAL),
))
RLP_DECODER_ADDRESS = hex_to_int('0x5185D17c44699cecC3133114F8df70753b856709')
# Instructions for creating RLP decoder on other chains
# First send 6270960000000000 wei to 0xd2c560282c9C02465C2dAcdEF3E859E730848761
# Publish this tx to create the contract: 0xf90237808506fc23ac00830330888080b902246102128061000e60003961022056600060007f010000000000000000000000000000000000000000000000000000000000000060003504600060c082121515585760f882121561004d5760bf820336141558576001905061006e565b600181013560f783036020035260005160f6830301361415585760f6820390505b5b368112156101c2577f010000000000000000000000000000000000000000000000000000000000000081350483602086026040015260018501945060808112156100d55760018461044001526001828561046001376001820191506021840193506101bc565b60b881121561014357608081038461044001526080810360018301856104600137608181141561012e5760807f010000000000000000000000000000000000000000000000000000000000000060018401350412151558575b607f81038201915060608103840193506101bb565b60c08112156101b857600182013560b782036020035260005160388112157f010000000000000000000000000000000000000000000000000000000000000060018501350402155857808561044001528060b6838501038661046001378060b6830301830192506020810185019450506101ba565bfe5b5b5b5061006f565b601f841315155857602060208502016020810391505b6000821215156101fc578082604001510182826104400301526020820391506101d8565b808401610420528381018161044003f350505050505b6000f31b2d4f
# This is the contract address: 0xCb969cAAad21A78a24083164ffa81604317Ab603
# Available base types
base_types = ['int128', 'decimal', 'bytes32', 'uint256', 'int256', 'bool', 'address']