Skip to content

Add ability to set individual elements in ABI containers #602

@jasonpaulos

Description

@jasonpaulos

Problem

Right now the Tuple, StaticArray, and DynamicArray ABI type containers have set methods which can be used to set the entire container's value.

However, it's not currently possible to set the value of only a single element in that container.

Possible Solution

Perhaps the existing TupleElement and ArrayElement classes which are returned from __getitem__ for tuples and arrays, respectively, can be extended to allow modifying individual values as well.

That would make something like this possible:

def f() -> Expr:
    a = abi.make(abi.Bool)
    b = abi.make(abi.Uint64)
    c = abi.make(abi.Tuple2[abi.Bool, abi.Uint64])
    return Seq(
        a.set(True),  # a=True,  b=uninitialized, c=uninitialized
        b.set(100),   # a=True,  b=100,           c=uninitialized
        c.set(a, b),  # a=True,  b=100,           c=[True,100]
        a.set(False), # a=False, b=100,           c=[True,100]
        c[0].set(a)   # a=False, b=100,           c=[False,100]
        # the above line would be the proposed change
    )

Follow-up Concerns

If a way to set individual elements in a container is adopted, that doesn't change the fact that a container must be fully populated with all elements before any other operation can happen. Should we instead allow containers to be partially initialized, or initialized with default values?

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions