Skip to content

Add Counter Example #609

Description

@DavePearce
const COUNTER_CODE : seq<u8> := [
    0x60,0x00,0x54,0x60,0x01,0x01,0x80,0x61,0x00,0x10,0x57,0x60,0x00,0x60,0x00,0xfd,0x5b,0x60,0x00,0x55,0x00
]
const ENTRY_STATE : ExecutingState := EVM.Init(gas:=1000,code:=COUNTER_CODE)

method Counter(st0: ExecutingState) returns (stn:State)
// Require enough space for two stack items
requires st0 == ENTRY_STATE 
// Upon successful execution, counter increases by 1.
ensures stn.EXECUTING? ==> st0.Load(0x0) < stn.Load(0x0) {
    var st := st0;
    st := Bytecode.Push1(st,0x00);
    st := Bytecode.SLoad(st);
    st := Bytecode.Push1(st,0x01);
    st := Bytecode.Add(st);
    st := Bytecode.Dup(st,1);
    st := Bytecode.Push2(st,0x0010);
    st := Bytecode.JumpI(st);
    assert st.PC() in {0x0b,0x10};
    if st.PC() == 0x0b {
        st := Bytecode.Push1(st,0x00);
        st := Bytecode.Push1(st,0x00);
        st := Bytecode.Revert(st);
    } else {
        st := Bytecode.JumpDest(st);
        st := Bytecode.Push1(st,0x00);
        st := Bytecode.SStore(st);
        st := Bytecode.Stop(st);
    }
    return st;
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions