summaryrefslogtreecommitdiff
path: root/data/transactions/logic/assembler_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'data/transactions/logic/assembler_test.go')
-rw-r--r--data/transactions/logic/assembler_test.go121
1 files changed, 90 insertions, 31 deletions
diff --git a/data/transactions/logic/assembler_test.go b/data/transactions/logic/assembler_test.go
index 37c6333cd..bc61b83b2 100644
--- a/data/transactions/logic/assembler_test.go
+++ b/data/transactions/logic/assembler_test.go
@@ -303,13 +303,43 @@ extract 0 8
int 0
int 8
extract3
-int 0
-extract64bits
int 0
-extract32bits
-int 0
-extract16bits
+extract_uint64
+int 0
+extract_uint32
+int 0
+extract_uint16
log
+txn Nonparticipation
+gtxn 0 Nonparticipation
+itxn_begin
+itxn_field Sender
+itxn_submit
+int 1
+txnas ApplicationArgs
+int 0
+gtxnas 0 ApplicationArgs
+int 0
+int 0
+gtxnsas ApplicationArgs
+int 0
+args
+int 0
+loads
+int 0
+stores
+int 32
+bzero
+ecdsa_pk_decompress Secp256k1
+byte 0x0123456789abcd
+dup
+dup
+ecdsa_verify Secp256k1
+byte 0x0123456789abcd
+dup
+dup
+ecdsa_pk_recover Secp256k1
+itxna Logs 3
`
var nonsense = map[uint64]string{
@@ -325,7 +355,7 @@ var compiled = map[uint64]string{
2: "022008b7a60cf8acd19181cf959a12f8acd19181cf951af8acd19181cf15f8acd191810f01020026050212340c68656c6c6f20776f726c6421208dae2087fbba51304eb02b91f656948397a7946390e8cb70fc9ea4d95f92251d024242047465737400320032013202320328292929292a0431003101310231043105310731083109310a310b310c310d310e310f3111311231133114311533000033000133000233000433000533000733000833000933000a33000b33000c33000d33000e33000f3300113300123300133300143300152d2e0102222324252104082209240a220b230c240d250e230f23102311231223132314181b1c2b171615400003290349483403350222231d4a484848482a50512a63222352410003420000432105602105612105270463484821052b62482b642b65484821052b2106662b21056721072b682b692107210570004848210771004848361c0037001a0031183119311b311d311e311f3120210721051e312131223123312431253126312731283129312a312b312c312d312e312f",
3: "032008b7a60cf8acd19181cf959a12f8acd19181cf951af8acd19181cf15f8acd191810f01020026050212340c68656c6c6f20776f726c6421208dae2087fbba51304eb02b91f656948397a7946390e8cb70fc9ea4d95f92251d024242047465737400320032013202320328292929292a0431003101310231043105310731083109310a310b310c310d310e310f3111311231133114311533000033000133000233000433000533000733000833000933000a33000b33000c33000d33000e33000f3300113300123300133300143300152d2e0102222324252104082209240a220b230c240d250e230f23102311231223132314181b1c2b171615400003290349483403350222231d4a484848482a50512a63222352410003420000432105602105612105270463484821052b62482b642b65484821052b2106662b21056721072b682b692107210570004848210771004848361c0037001a0031183119311b311d311e311f3120210721051e312131223123312431253126312731283129312a312b312c312d312e312f4478222105531421055427042106552105082106564c4d4b02210538212106391c0081e80780046a6f686e",
4: "042004010200b7a60c26040242420c68656c6c6f20776f726c6421208dae2087fbba51304eb02b91f656948397a7946390e8cb70fc9ea4d95f92251d047465737400320032013202320380021234292929292a0431003101310231043105310731083109310a310b310c310d310e310f3111311231133114311533000033000133000233000433000533000733000833000933000a33000b33000c33000d33000e33000f3300113300123300133300143300152d2e01022581f8acd19181cf959a1281f8acd19181cf951a81f8acd19181cf1581f8acd191810f082209240a220b230c240d250e230f23102311231223132314181b1c28171615400003290349483403350222231d4a484848482a50512a632223524100034200004322602261222b634848222862482864286548482228236628226724286828692422700048482471004848361c0037001a0031183119311b311d311e311f312024221e312131223123312431253126312731283129312a312b312c312d312e312f44782522531422542b2355220823564c4d4b0222382123391c0081e80780046a6f686e2281d00f24231f880003420001892223902291922394239593a0a1a2a3a4a5a6a7a8a9aaabacadae23af3a00003b003c003d8164",
- 5: "052004010200b7a60c26040242420c68656c6c6f20776f726c6421208dae2087fbba51304eb02b91f656948397a7946390e8cb70fc9ea4d95f92251d047465737400320032013202320380021234292929292a0431003101310231043105310731083109310a310b310c310d310e310f3111311231133114311533000033000133000233000433000533000733000833000933000a33000b33000c33000d33000e33000f3300113300123300133300143300152d2e01022581f8acd19181cf959a1281f8acd19181cf951a81f8acd19181cf1581f8acd191810f082209240a220b230c240d250e230f23102311231223132314181b1c28171615400003290349483403350222231d4a484848482a50512a632223524100034200004322602261222b634848222862482864286548482228236628226724286828692422700048482471004848361c0037001a0031183119311b311d311e311f312024221e312131223123312431253126312731283129312a312b312c312d312e312f44782522531422542b2355220823564c4d4b0222382123391c0081e80780046a6f686e2281d00f24231f880003420001892223902291922394239593a0a1a2a3a4a5a6a7a8a9aaabacadae23af3a00003b003c003d816472064e014f0180070123456789abcd57000824810858245b245a2459b0",
+ 5: "052004010002b7a60c26050242420c68656c6c6f20776f726c6421070123456789abcd208dae2087fbba51304eb02b91f656948397a7946390e8cb70fc9ea4d95f92251d047465737400320032013202320380021234292929292b0431003101310231043105310731083109310a310b310c310d310e310f3111311231133114311533000033000133000233000433000533000733000833000933000a33000b33000c33000d33000e33000f3300113300123300133300143300152d2e01022581f8acd19181cf959a1281f8acd19181cf951a81f8acd19181cf1581f8acd191810f082209240a220b230c240d250e230f23102311231223132314181b1c28171615400003290349483403350222231d4a484848482b50512a632223524100034200004322602261222704634848222862482864286548482228246628226723286828692322700048482371004848361c0037001a0031183119311b311d311e311f312023221e312131223123312431253126312731283129312a312b312c312d312e312f447825225314225427042455220824564c4d4b0222382124391c0081e80780046a6f686e2281d00f23241f880003420001892224902291922494249593a0a1a2a3a4a5a6a7a8a9aaabacadae24af3a00003b003c003d816472064e014f012a57000823810858235b235a2359b03139330039b1b200b322c01a23c1001a2323c21a23c3233e233f8120af06002a494905002a49490700b53a03",
}
func pseudoOp(opcode string) bool {
@@ -384,19 +414,11 @@ func TestAssembleAlias(t *testing.T) {
t.Parallel()
source1 := `txn Accounts 0 // alias to txna
pop
-gtxn 0 ApplicationArgs 0 // alias to gtxn
+gtxn 0 ApplicationArgs 0 // alias to gtxna
pop
`
- ops1, err := AssembleStringWithVersion(source1, AssemblerMaxVersion)
- require.NoError(t, err)
-
- source2 := `txna Accounts 0
-pop
-gtxna 0 ApplicationArgs 0
-pop
-`
- ops2, err := AssembleStringWithVersion(source2, AssemblerMaxVersion)
- require.NoError(t, err)
+ ops1 := testProg(t, source1, AssemblerMaxVersion)
+ ops2 := testProg(t, strings.Replace(source1, "txn", "txna", -1), AssemblerMaxVersion)
require.Equal(t, ops1.Program, ops2.Program)
}
@@ -431,6 +453,20 @@ func testProg(t testing.TB, source string, ver uint64, expected ...expect) *OpSt
require.NoError(t, err)
require.NotNil(t, ops)
require.NotNil(t, ops.Program)
+ // It should always be possible to Disassemble
+ dis, err := Disassemble(ops.Program)
+ require.NoError(t, err)
+ // And, while the disassembly may not match input
+ // exactly, the assembly of the disassembly should
+ // give the same bytecode
+ ops2, err := AssembleStringWithVersion(dis, ver)
+ if len(ops2.Errors) > 0 || err != nil || ops2 == nil || ops2.Program == nil {
+ t.Log(program)
+ t.Log(dis)
+ }
+ require.Empty(t, ops2.Errors)
+ require.NoError(t, err)
+ require.Equal(t, ops.Program, ops2.Program)
} else {
require.Error(t, err)
errors := ops.Errors
@@ -486,13 +522,15 @@ func TestAssembleTxna(t *testing.T) {
testLine(t, "gtxna 0 Sender 256", AssemblerMaxVersion, "gtxna unknown field: \"Sender\"")
testLine(t, "txn Accounts 0", 1, "txn expects one argument")
testLine(t, "txn Accounts 0 1", 2, "txn expects one or two arguments")
- testLine(t, "txna Accounts 0 1", AssemblerMaxVersion, "txna expects two arguments")
+ testLine(t, "txna Accounts 0 1", AssemblerMaxVersion, "txna expects two immediate arguments")
+ testLine(t, "txnas Accounts 1", AssemblerMaxVersion, "txnas expects one immediate argument")
testLine(t, "txna Accounts a", AssemblerMaxVersion, "strconv.ParseUint...")
testLine(t, "gtxn 0 Sender 0", 1, "gtxn expects two arguments")
testLine(t, "gtxn 0 Sender 1 2", 2, "gtxn expects two or three arguments")
testLine(t, "gtxna 0 Accounts 1 2", AssemblerMaxVersion, "gtxna expects three arguments")
testLine(t, "gtxna a Accounts 0", AssemblerMaxVersion, "strconv.ParseUint...")
testLine(t, "gtxna 0 Accounts a", AssemblerMaxVersion, "strconv.ParseUint...")
+ testLine(t, "gtxnas Accounts 1 2", AssemblerMaxVersion, "gtxnas expects two immediate arguments")
testLine(t, "txn ABC", 2, "txn unknown field: \"ABC\"")
testLine(t, "gtxn 0 ABC", 2, "gtxn unknown field: \"ABC\"")
testLine(t, "gtxn a ABC", 2, "strconv.ParseUint...")
@@ -592,8 +630,7 @@ func TestAssembleInt(t *testing.T) {
}
text := "int 0xcafebabe"
- ops, err := AssembleStringWithVersion(text, v)
- require.NoError(t, err)
+ ops := testProg(t, text, v)
s := hex.EncodeToString(ops.Program)
require.Equal(t, mutateProgVersion(v, expected), s)
})
@@ -643,8 +680,7 @@ func TestAssembleBytes(t *testing.T) {
}
for _, vi := range variations {
- ops, err := AssembleStringWithVersion(vi, v)
- require.NoError(t, err)
+ ops := testProg(t, vi, v)
s := hex.EncodeToString(ops.Program)
require.Equal(t, mutateProgVersion(v, expected), s)
}
@@ -890,8 +926,7 @@ int ClearState
for v := uint64(optimizeConstantsEnabledVersion); v <= AssemblerMaxVersion; v++ {
t.Run(fmt.Sprintf("v=%d", v), func(t *testing.T) {
- ops, err := AssembleStringWithVersion(program, v)
- require.NoError(t, err)
+ ops := testProg(t, program, v)
s := hex.EncodeToString(ops.Program)
require.Equal(t, mutateProgVersion(v, expected), s)
})
@@ -1184,8 +1219,7 @@ intc 0
intc 0
bnz done
done:`
- ops, err := AssembleStringWithVersion(source, AssemblerMaxVersion)
- require.NoError(t, err)
+ ops := testProg(t, source, AssemblerMaxVersion)
require.Equal(t, 9, len(ops.Program))
expectedProgBytes := []byte("\x01\x20\x01\x01\x22\x22\x40\x00\x00")
expectedProgBytes[0] = byte(AssemblerMaxVersion)
@@ -1249,6 +1283,7 @@ global Round
global LatestTimestamp
global CurrentApplicationID
global CreatorAddress
+global GroupID
txn Sender
txn Fee
bnz label1
@@ -1309,6 +1344,12 @@ txn LocalNumUint
txn LocalNumByteSlice
gtxn 12 Fee
txn ExtraProgramPages
+txn Nonparticipation
+global CurrentApplicationAddress
+itxna Logs 1
+itxn NumLogs
+itxn CreatedAssetID
+itxn CreatedApplicationID
`, AssemblerMaxVersion)
for _, globalField := range GlobalFieldNames {
if !strings.Contains(text, globalField) {
@@ -1394,6 +1435,7 @@ func TestConstantDisassembly(t *testing.T) {
}
func TestConstantArgs(t *testing.T) {
+ partitiontest.PartitionTest(t)
t.Parallel()
for v := uint64(1); v <= AssemblerMaxVersion; v++ {
testProg(t, "int", v, expect{1, "int needs one argument"})
@@ -1967,8 +2009,7 @@ func TestPragmas(t *testing.T) {
testProg(t, `#pragma version 100`, assemblerNoVersion,
expect{1, "unsupported version: 100"})
- ops, err := AssembleStringWithVersion(`int 1`, 99)
- require.Error(t, err)
+ testProg(t, `int 1`, 99, expect{0, "Can not assemble version 99"})
testProg(t, `#pragma version 0`, assemblerNoVersion,
expect{1, "unsupported version: 0"})
@@ -1977,7 +2018,7 @@ func TestPragmas(t *testing.T) {
expect{1, `bad #pragma version: "a"`})
// will default to 1
- ops = testProg(t, "int 3", assemblerNoVersion)
+ ops := testProg(t, "int 3", assemblerNoVersion)
require.Equal(t, uint64(1), ops.Version)
require.Equal(t, uint8(1), ops.Program[0])
@@ -1991,7 +2032,7 @@ func TestPragmas(t *testing.T) {
testProg(t, "#pragma version 1", 2, expect{1, "version mismatch..."})
testProg(t, "#pragma version 2", 1, expect{1, "version mismatch..."})
- ops = testProg(t, "#pragma version 2\n#pragma version 1", assemblerNoVersion,
+ testProg(t, "#pragma version 2\n#pragma version 1", assemblerNoVersion,
expect{2, "version mismatch..."})
// repetitive, but fine
@@ -2097,7 +2138,7 @@ func TestErrShortBytecblock(t *testing.T) {
_, _, err = parseIntcblock(ops.Program, 0)
require.Equal(t, err, errShortIntcblock)
- var cx evalContext
+ var cx EvalContext
cx.program = ops.Program
err = checkIntConstBlock(&cx)
require.Equal(t, err, errShortIntcblock)
@@ -2139,6 +2180,7 @@ flip: // [x]
}
func TestSwapTypeCheck(t *testing.T) {
+ partitiontest.PartitionTest(t)
t.Parallel()
/* reconfirm that we detect this type error */
testProg(t, "int 1; byte 0x1234; +", AssemblerMaxVersion, expect{3, "+ arg 1..."})
@@ -2148,6 +2190,7 @@ func TestSwapTypeCheck(t *testing.T) {
}
func TestDigAsm(t *testing.T) {
+ partitiontest.PartitionTest(t)
t.Parallel()
testProg(t, "int 1; dig; +", AssemblerMaxVersion, expect{2, "dig expects 1 immediate..."})
testProg(t, "int 1; dig junk; +", AssemblerMaxVersion, expect{2, "...invalid syntax..."})
@@ -2167,6 +2210,7 @@ func TestDigAsm(t *testing.T) {
}
func TestEqualsTypeCheck(t *testing.T) {
+ partitiontest.PartitionTest(t)
t.Parallel()
testProg(t, "int 1; byte 0x1234; ==", AssemblerMaxVersion, expect{3, "== arg 0..."})
testProg(t, "int 1; byte 0x1234; !=", AssemblerMaxVersion, expect{3, "!= arg 0..."})
@@ -2175,6 +2219,7 @@ func TestEqualsTypeCheck(t *testing.T) {
}
func TestDupTypeCheck(t *testing.T) {
+ partitiontest.PartitionTest(t)
t.Parallel()
testProg(t, "byte 0x1234; dup; int 1; +", AssemblerMaxVersion, expect{4, "+ arg 0..."})
testProg(t, "byte 0x1234; int 1; dup; +", AssemblerMaxVersion)
@@ -2189,18 +2234,21 @@ func TestDupTypeCheck(t *testing.T) {
}
func TestSelectTypeCheck(t *testing.T) {
+ partitiontest.PartitionTest(t)
t.Parallel()
testProg(t, "int 1; int 2; int 3; select; len", AssemblerMaxVersion, expect{5, "len arg 0..."})
testProg(t, "byte 0x1234; byte 0x5678; int 3; select; !", AssemblerMaxVersion, expect{5, "! arg 0..."})
}
func TestSetBitTypeCheck(t *testing.T) {
+ partitiontest.PartitionTest(t)
t.Parallel()
testProg(t, "int 1; int 2; int 3; setbit; len", AssemblerMaxVersion, expect{5, "len arg 0..."})
testProg(t, "byte 0x1234; int 2; int 3; setbit; !", AssemblerMaxVersion, expect{5, "! arg 0..."})
}
func TestCoverAsm(t *testing.T) {
+ partitiontest.PartitionTest(t)
t.Parallel()
testProg(t, `int 4; byte "john"; int 5; cover 2; pop; +`, AssemblerMaxVersion)
testProg(t, `int 4; byte "ayush"; int 5; cover 1; pop; +`, AssemblerMaxVersion)
@@ -2209,9 +2257,20 @@ func TestCoverAsm(t *testing.T) {
}
func TestUncoverAsm(t *testing.T) {
+ partitiontest.PartitionTest(t)
t.Parallel()
testProg(t, `int 4; byte "john"; int 5; uncover 2; +`, AssemblerMaxVersion)
testProg(t, `int 4; byte "ayush"; int 5; uncover 1; pop; +`, AssemblerMaxVersion)
testProg(t, `int 1; byte "jj"; byte "ayush"; byte "john"; int 5; uncover 4; +`, AssemblerMaxVersion)
testProg(t, `int 4; byte "ayush"; int 5; uncover 1; +`, AssemblerMaxVersion, expect{5, "+ arg 1..."})
}
+
+func TestTxTypes(t *testing.T) {
+ testProg(t, "itxn_begin; itxn_field Sender", 5, expect{2, "itxn_field Sender expects 1 stack argument..."})
+ testProg(t, "itxn_begin; int 1; itxn_field Sender", 5, expect{3, "...wanted type []byte got uint64"})
+ testProg(t, "itxn_begin; byte 0x56127823; itxn_field Sender", 5)
+
+ testProg(t, "itxn_begin; itxn_field Amount", 5, expect{2, "itxn_field Amount expects 1 stack argument..."})
+ testProg(t, "itxn_begin; byte 0x87123376; itxn_field Amount", 5, expect{3, "...wanted type uint64 got []byte"})
+ testProg(t, "itxn_begin; int 1; itxn_field Amount", 5)
+}