class TestTSC(nc.NativeContract):

        address = utils.int_to_addr(2051)
        size = nc.Scalar('uint32')
        numbers = nc.List('uint32')
        words = nc.Dict('bytes')

        def setup_numbers(ctx, size='uint32', returns=None):
            ctx.size = size
            assert isinstance(ctx.numbers, nc.List)
            for i in range(size):
                ctx.numbers.append(i)

        def sum_numbers(ctx, returns='uint32'):
            assert ctx.size == len(ctx.numbers)
            return sum(ctx.numbers[i] for i in range(len(ctx.numbers)))

        def setup_words(ctx, num='uint32', returns=None):
            for i in range(num):
                key = 'key%d' % i
                word = 'word%d' % i
                ctx.words[key] = word
                assert ctx.words[key] == word

        def get_word(ctx, key='bytes', returns='bytes'):
            r = ctx.words[key]
            return r

        def muladdsize(ctx, val='uint32', returns='uint32'):
            ctx.size += val
            ctx.size *= val
            return ctx.size
def test_nested_typed_storage_list():

    td = dict()

    def _get(k):
        if k not in td:
            td[k] = 0
        return td[k]

    def _set(k, v):
        td[k] = v

    c = nc.List(nc.Dict('uint16'))
    d = nc.List('uint16')
    l = nc.List(nc.List('uint16'))
    m = nc.List(nc.List('uint16'))
    n = nc.List(nc.Scalar('string'))

    c.setup(b'c', _get, _set)
    d.setup(b'd', _get, _set)
    l.setup(b'l', _get, _set)
    m.setup(b'm', _get, _set)
    n.setup(b'n', _get, _set)

    # test list
    assert d[2] == 0
    d[2] = 1

    # nested in lists

    la = c[3]
    assert isinstance(la, nc.Dict)
    assert len(c) == 0
    la['test'] = 1
    assert len(c) == 4
    assert c[3]['test'] == 1
    c[2]['test2'] = 9
    assert len(c) == 4

    l[5][6] = 8
    m[5][6] = 9
    assert l[5][6] != m[5][6]

    n[4] = 'someaddress'
    assert n[4] == 'someaddress'
    class TestTSC(nc.NativeContract):

        address = utils.int_to_addr(2051)
        owner = nc.Scalar('address')

        def own(ctx, returns=None):
            if ctx.owner == '\0' * 20:
                ctx.owner = ctx.tx_origin
                assert ctx.owner == ctx.tx_origin

        def assert_owner(ctx):
            if ctx.tx_origin != ctx.owner:
                raise RuntimeError('not owner')

        @nc.constant
        def protected(ctx, returns='uint32'):
            ctx.assert_owner()
            return 1
示例#4
0
    class TestTSC(nc.TypedStorageContract):

        address = utils.int_to_addr(2050)
        a = nc.Scalar('uint32')
        b = nc.List('uint16')
        c = nc.Dict('uint32')

        def _safe_call(ctx):
            # skalar
            assert ctx.a == 0
            ctx.a = 1
            assert ctx.a == 1

            ctx.a = 2
            assert ctx.a == 2

            # list
            assert isinstance(ctx.b, nc.List)
            ctx.b[0] = 10
            assert ctx.b[0] == 10

            ctx.b[1000] = 12
            assert ctx.b[1000] == 12

            assert len(ctx.b) == 1001
            ctx.b[1000] = 66
            assert ctx.b[1000] == 66
            assert len(ctx.b) == 1001

            ctx.b.append(99)
            assert len(ctx.b) == 1002
            ctx.b.append(99)
            assert len(ctx.b) == 1003

            # mapping
            assert isinstance(ctx.c, nc.Dict)
            key = b'test'
            assert ctx.c[key] == 0
            ctx.c[key] = 33
            assert ctx.c[key] == 33
            ctx.c[key] = 66
            assert ctx.c[key] == 66

            return 1, 1, []
def test_nested_typed_storage_struct():
    def _key(self, k):
        k = zpad(k, 32)
        return b'%s:%s' % (self._prefix, k)

    original_key = nc.TypedStorage._key
    nc.TypedStorage._key = _key

    # the storage cannot be defined globally as the calls would interfere
    td = dict()

    def _get(k):
        if k not in td:
            td[k] = 0
        return td[k]

    def _set(k, v):
        td[k] = v

    g = nc.Struct(x=nc.List('uint32'), y=nc.Scalar('address'))
    h = nc.IterableDict(nc.Struct(x=nc.List('uint32'), y=nc.Scalar('address')))
    i = nc.List(
        nc.Struct(x=nc.Scalar('uint16'),
                  y=nc.Dict('uint32'),
                  z=nc.List('uint16')))
    j = nc.Struct(v=nc.Struct(
        x=nc.List('uint32'), y=nc.Scalar('address'), w=nc.Dict('uint16')))

    g.setup(b'g', _get, _set)
    h.setup(b'h', _get, _set)
    i.setup(b'i', _get, _set)
    j.setup(b'j', _get, _set)

    # test Struct

    g.x[538] = 78
    assert g.x[538] == 78
    assert (
        'g'
        ':\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
        '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00x'
        ':\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
        '\x00\x00\x00\x00\x00\x00\x00\x00538') in td

    with pytest.raises(AttributeError):
        assert g.idontexist == 0

    with pytest.raises(TypeError):
        g[2354645] = 2540

    with pytest.raises(TypeError):
        assert g['imnotadict'] == 0

    h['abcde'].x[4891] = 875
    assert h['abcde'].x[4891] == 875
    assert (
        'h'
        ':\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
        '\x00\x00\x00\x00\x00\x00abcde'
        ':\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
        '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00x'
        ':\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
        '\x00\x00\x00\x00\x00\x00\x004891') in td

    i[3].y['here'] = 634
    assert i[3].y['here'] == 634
    assert (
        'i'
        ':\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
        '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x003'
        ':\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
        '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00y'
        ':\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
        '\x00\x00\x00\x00\x00\x00\x00here') in td

    i[4].z[41] = 88
    # assert i[4].z[41] == 88
    assert (
        'i'
        ':\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
        '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x004'
        ':\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
        '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00z'
        ':\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
        '\x00\x00\x00\x00\x00\x00\x00\x00\x0041') in td

    assert len(i) == 5
    assert len(i[4].z) == 42

    j.v.w['then'] = 34
    assert j.v.w['then'] == 34
    assert (
        'j'
        ':\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
        '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00v'
        ':\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
        '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00w'
        ':\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
        '\x00\x00\x00\x00\x00\x00\x00then') in td

    j.v.x[471734] = 7
    assert j.v.x[471734] == 7
    assert (
        'j'
        ':\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
        '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00v'
        ':\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
        '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00x'
        ':\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
        '\x00\x00\x00\x00\x00471734') in td

    nc.TypedStorage._key = original_key
    class TestTSC(nc.TypedStorageContract):

        address = utils.int_to_addr(2050)
        a = nc.Scalar('uint32')
        b = nc.List('uint16')
        c = nc.Dict('uint32')
        d = nc.IterableDict('uint256')
        e = nc.IterableDict('string')

        def _safe_call(ctx):
            # skalar
            assert ctx.a == 0
            ctx.a = 1
            assert ctx.a == 1

            ctx.a = 2
            assert ctx.a == 2

            # list
            assert isinstance(ctx.b, nc.List)
            ctx.b[0] = 10
            assert ctx.b[0] == 10

            ctx.b[1000] = 12
            assert ctx.b[1000] == 12

            assert len(ctx.b) == 1001
            ctx.b[1000] = 66
            assert ctx.b[1000] == 66
            assert len(ctx.b) == 1001

            ctx.b.append(99)
            assert len(ctx.b) == 1002
            ctx.b.append(99)
            assert len(ctx.b) == 1003

            # mapping
            assert isinstance(ctx.c, nc.Dict)
            key = b'test'
            assert ctx.c[key] == 0
            ctx.c[key] = 33
            assert ctx.c[key] == 33
            ctx.c[key] = 66
            assert ctx.c[key] == 66

            k = '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17q'
            v = 2146209080

            ctx.c[k] = v
            assert ctx.c[k] == v

            # iterable dict

            ctx.d[k] = v
            assert len(ctx.d) == 1
            assert ctx.d[k] == v
            ctx.d[k] = 0

            N = 10
            for i in range(1, N + 1):
                v = i**2
                k = bytes(i)
                ctx.d[k] = v
                assert ctx.d[k] == v
                assert len(list(ctx.d.keys())) == i
                assert set(ctx.d.keys()) == set(
                    [bytes(j) for j in range(1, i + 1)])
                assert set(ctx.d.values()) == set(
                    [j**2 for j in range(1, i + 1)])

            # iterable dict with strings
            N = 10
            for i in range(1, N + 1):
                v = str(i**2)
                k = bytes(i)
                ctx.e[k] = v
                # log.DEV('kv', k=k, v=v)
                assert ctx.e[k] == v, ctx.e[k]
                assert len(list(ctx.e.keys())) == i
                assert set(ctx.e.keys()) == set(
                    [bytes(j) for j in range(1, i + 1)])
                assert set(ctx.e.values()) == set(
                    [str(j**2) for j in range(1, i + 1)])

            print list(ctx.e.keys())
            print list(ctx.e.values())
            print len(list(ctx.e.keys()))

            return 1, 1, []