Skip to content

Commit

Permalink
Add sequence specific tests
Browse files Browse the repository at this point in the history
  • Loading branch information
Agusx1211 committed Feb 12, 2024
1 parent b3c804d commit 3f4ae73
Show file tree
Hide file tree
Showing 4 changed files with 244 additions and 4 deletions.
35 changes: 35 additions & 0 deletions compressor/cmd/czip-compressor/extras.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (

encoder "github.com/0xsequence/czip/compressor"
"github.com/0xsequence/ethkit/go-ethereum/common"
"github.com/0xsequence/go-sequence"
)

func encodeExtras(args *ParsedArgs) (string, error) {
Expand All @@ -28,6 +29,12 @@ func encodeExtras(args *ParsedArgs) (string, error) {
err = encodeSequenceNestedSignaturePart(buf, data)
case "SEQUENCE_CHAINED_SIGNATURE":
buf.WriteSequenceChainedSignature(data)
case "FLAG_SEQUENCE_SIG":
buf.WriteSequenceSignature(data, false)
case "FLAG_SEQUENCE_EXECUTE":
err = encodeSequenceExecute(buf, data)
case "FLAG_SEQUENCE_SELF_EXECUTE":
err = encodeSequenceSelfExecute(buf, data)

default:
return "", fmt.Errorf("unknown extra: %s", args.Positional[1])
Expand Down Expand Up @@ -66,3 +73,31 @@ func encodeSequenceNestedSignaturePart(buf *encoder.Buffer, data []byte) error {
buf.WriteSequenceNestedSignaturePart(weight, threshold, signature)
return nil
}

func encodeSequenceExecute(buf *encoder.Buffer, data []byte) error {
txs, nonce, sig, err := sequence.DecodeExecdata(data)
if err != nil {
return err
}

_, err = buf.WriteSequenceExecuteFlag(&sequence.Transaction{
Nonce: nonce,
Transactions: txs,
Signature: sig,
})

return err
}

func encodeSequenceSelfExecute(buf *encoder.Buffer, data []byte) error {
txs, _, _, err := sequence.DecodeExecdata(data)
if err != nil {
return err
}

_, err = buf.WriteSequenceSelfExecuteFlag(&sequence.Transaction{
Transactions: txs,
})

return err
}
17 changes: 13 additions & 4 deletions compressor/encode.go
Original file line number Diff line number Diff line change
Expand Up @@ -483,10 +483,7 @@ func (buf *Buffer) WriteSequenceTransaction(tx *sequence.Transaction) (EncodeTyp
var t EncodeType

if len(tx.Transactions) > 0 {
buf.commitUint(FLAG_SEQUENCE_EXECUTE)
buf.end([]byte{}, Stateless)

t, err = buf.WriteSequenceExecute(nil, tx)
t, err = buf.WriteSequenceExecuteFlag(tx)
} else {
t, err = buf.WriteBytesOptimized(tx.Data, buf.Refs.useContractStorage)
}
Expand All @@ -501,6 +498,18 @@ func (buf *Buffer) WriteSequenceTransaction(tx *sequence.Transaction) (EncodeTyp
return encodeType, nil
}

func (buf *Buffer) WriteSequenceExecuteFlag(transaction *sequence.Transaction) (EncodeType, error) {
buf.commitUint(FLAG_SEQUENCE_EXECUTE)
buf.end([]byte{}, Stateless)
return buf.WriteSequenceExecute(nil, transaction)
}

func (buf *Buffer) WriteSequenceSelfExecuteFlag(transaction *sequence.Transaction) (EncodeType, error) {
buf.commitUint(FLAG_SEQUENCE_SELF_EXECUTE)
buf.end([]byte{}, Stateless)
return buf.WriteSequenceTransactions(transaction.Transactions)
}

func (buf *Buffer) WriteSequenceExecute(to []byte, transaction *sequence.Transaction) (EncodeType, error) {
var t EncodeType

Expand Down
35 changes: 35 additions & 0 deletions test/flags.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -367,6 +367,17 @@ contract FlagsTest is Test {
assertEq(expected, decoded);
}

function test_sequenceSignature(uint16 _t, uint32 _c, uint8 _w1, address _part1, uint8 _w2, address _part2) external {
bytes memory data = abi.encodePacked(uint8(0x01), _t, _c, uint8(0x01), _w1, _part1, uint8(0x01), _w2, _part2);

bytes memory encoded = vm.encodeExtra("FLAG_SEQUENCE_SIG", data)
.useStorage(false)
.run();

bytes memory decoded = decompressor.call(encoded);
assertEq(data, decoded);
}

function test_sequenceChainedSignature(address[] calldata _parts) external {
vm.assume(_parts.length > 0);

Expand Down Expand Up @@ -408,6 +419,30 @@ contract FlagsTest is Test {
assertEq(abi.encodePacked(data, abi.encode(_wallet)), decoded);
}

function test_sequenceExecute_flag(SequenceTransaction[] calldata _txs, uint256 _nonce, bytes memory _signature) external {
vm.assume(_txs.length > 0 && _txs.length <= 100);

bytes memory data = abi.encodeWithSelector(0x7a9a1628, _txs, _nonce, _signature);
bytes memory encoded = vm.encodeExtra("FLAG_SEQUENCE_EXECUTE", data)
.useStorage(false)
.run();

bytes memory decoded = decompressor.call(encoded);
assertEq(data, decoded);
}

function test_sequenceSelfExecute_flag(SequenceTransaction[] calldata _txs) external {
vm.assume(_txs.length > 0 && _txs.length <= 100);

bytes memory data = abi.encodeWithSelector(0x61c2926c, _txs);
bytes memory encoded = vm.encodeExtra("FLAG_SEQUENCE_SELF_EXECUTE", data)
.useStorage(false)
.run();

bytes memory decoded = decompressor.call(encoded);
assertEq(data, decoded);
}

function test_sequenceExecute_call(address _wallet, SequenceTransaction[] calldata _txs, uint256 _nonce, bytes memory _signature) external {
vm.assume(_txs.length > 0 && _txs.length <= 100);
vm.assume(_wallet != address(this) && !decompressor.eq(_wallet));
Expand Down
161 changes: 161 additions & 0 deletions test/flags_no_go.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,30 @@ uint8 constant FLAG_COPY_CALLDATA_S = 0x3f;
uint8 constant FLAG_COPY_CALLDATA_L = 0x40;
uint8 constant FLAG_COPY_CALLDATA_XL = 0x41;

uint8 constant FLAG_SEQUENCE_EXECUTE = 0x42;
uint8 constant FLAG_SEQUENCE_SELF_EXECUTE = 0x43;
uint8 constant FLAG_SEQUENCE_SIGNATURE_W0 = 0x44;
uint8 constant FLAG_SEQUENCE_SIGNATURE_W1 = 0x45;
uint8 constant FLAG_SEQUENCE_SIGNATURE_W2 = 0x46;
uint8 constant FLAG_SEQUENCE_SIGNATURE_W3 = 0x47;
uint8 constant FLAG_SEQUENCE_SIGNATURE_W4 = 0x48;
uint8 constant FLAG_SEQUENCE_ADDRESS_W0 = 0x49;
uint8 constant FLAG_SEQUENCE_ADDRESS_W1 = 0x4a;
uint8 constant FLAG_SEQUENCE_ADDRESS_W2 = 0x4b;
uint8 constant FLAG_SEQUENCE_ADDRESS_W3 = 0x4c;
uint8 constant FLAG_SEQUENCE_ADDRESS_W4 = 0x4d;
uint8 constant FLAG_SEQUENCE_NODE = 0x4e;
uint8 constant FLAG_SEQUENCE_BRANCH = 0x4f;
uint8 constant FLAG_SEQUENCE_SUBDIGEST = 0x50;
uint8 constant FLAG_SEQUENCE_NESTED = 0x51;
uint8 constant FLAG_SEQUENCE_DYNAMIC_SIGNATURE = 0x52;
uint8 constant FLAG_SEQUENCE_SIG_NO_CHAIN = 0x53;
uint8 constant FLAG_SEQUENCE_SIG = 0x54;
uint8 constant FLAG_SEQUENCE_L_SIG_NO_CHAIN = 0x55;
uint8 constant FLAG_SEQUENCE_L_SIG = 0x56;
uint8 constant FLAG_SEQUENCE_READ_CHAINED_S = 0x57;
uint8 constant FLAG_SEQUENCE_READ_CHAINED_L = 0x58;

contract FlagsTestNoGo is Test {
using Decompressor for Decompressor.DContract;
using Compressor for Compressor.CommandBuffer;
Expand Down Expand Up @@ -349,4 +373,141 @@ contract FlagsTestNoGo is Test {
bytes memory decoded = decompressor.call(encoded);
assertEq(decoded, data);
}

function test_readSignatureW0(uint8 _w, bytes32 _a, bytes32 _b, bytes2 _c) external {
bytes memory data = abi.encodePacked(uint8(0x00), _w, _a, _b, _c);
bytes memory encoded = abi.encodePacked(
DECODE_ANY,
FLAG_SEQUENCE_SIGNATURE_W0,
_w,
_a,
_b,
_c
);

bytes memory decoded = decompressor.call(encoded);
assertEq(decoded, data);
}

function test_readSignatureW1(bytes32 _a, bytes32 _b, bytes2 _c) external {
bytes memory data = abi.encodePacked(uint8(0x00), uint8(1), _a, _b, _c);
bytes memory encoded = abi.encodePacked(
DECODE_ANY,
FLAG_SEQUENCE_SIGNATURE_W1,
_a,
_b,
_c
);

bytes memory decoded = decompressor.call(encoded);
assertEq(decoded, data);
}

function test_readSignatureW2(bytes32 _a, bytes32 _b, bytes2 _c) external {
bytes memory data = abi.encodePacked(uint8(0x00), uint8(2), _a, _b, _c);
bytes memory encoded = abi.encodePacked(
DECODE_ANY,
FLAG_SEQUENCE_SIGNATURE_W2,
_a,
_b,
_c
);

bytes memory decoded = decompressor.call(encoded);
assertEq(decoded, data);
}

function test_readSignatureW3(bytes32 _a, bytes32 _b, bytes2 _c) external {
bytes memory data = abi.encodePacked(uint8(0x00), uint8(3), _a, _b, _c);
bytes memory encoded = abi.encodePacked(
DECODE_ANY,
FLAG_SEQUENCE_SIGNATURE_W3,
_a,
_b,
_c
);

bytes memory decoded = decompressor.call(encoded);
assertEq(decoded, data);
}

function test_readSignatureW4(bytes32 _a, bytes32 _b, bytes2 _c) external {
bytes memory data = abi.encodePacked(uint8(0x00), uint8(4), _a, _b, _c);
bytes memory encoded = abi.encodePacked(
DECODE_ANY,
FLAG_SEQUENCE_SIGNATURE_W4,
_a,
_b,
_c
);

bytes memory decoded = decompressor.call(encoded);
assertEq(decoded, data);
}

function test_readAddressW0(uint8 _w, address _addr) external {
bytes memory data = abi.encodePacked(uint8(0x01), _w, _addr);
bytes memory encoded = abi.encodePacked(
DECODE_ANY,
FLAG_SEQUENCE_ADDRESS_W0,
_w,
FLAG_READ_WORD_20,
_addr
);

bytes memory decoded = decompressor.call(encoded);
assertEq(decoded, data);
}

function test_readAddressW1(address _addr) external {
bytes memory data = abi.encodePacked(uint8(0x01), uint8(1), _addr);
bytes memory encoded = abi.encodePacked(
DECODE_ANY,
FLAG_SEQUENCE_ADDRESS_W1,
FLAG_READ_WORD_20,
_addr
);

bytes memory decoded = decompressor.call(encoded);
assertEq(decoded, data);
}

function test_readAddressW2(address _addr) external {
bytes memory data = abi.encodePacked(uint8(0x01), uint8(2), _addr);
bytes memory encoded = abi.encodePacked(
DECODE_ANY,
FLAG_SEQUENCE_ADDRESS_W2,
FLAG_READ_WORD_20,
_addr
);

bytes memory decoded = decompressor.call(encoded);
assertEq(decoded, data);
}

function test_readAddressW3(address _addr) external {
bytes memory data = abi.encodePacked(uint8(0x01), uint8(3), _addr);
bytes memory encoded = abi.encodePacked(
DECODE_ANY,
FLAG_SEQUENCE_ADDRESS_W3,
FLAG_READ_WORD_20,
_addr
);

bytes memory decoded = decompressor.call(encoded);
assertEq(decoded, data);
}

function test_readAddressW4(address _addr) external {
bytes memory data = abi.encodePacked(uint8(0x01), uint8(4), _addr);
bytes memory encoded = abi.encodePacked(
DECODE_ANY,
FLAG_SEQUENCE_ADDRESS_W4,
FLAG_READ_WORD_20,
_addr
);

bytes memory decoded = decompressor.call(encoded);
assertEq(decoded, data);
}
}

0 comments on commit 3f4ae73

Please sign in to comment.