aboutsummaryrefslogblamecommitdiffstats
path: root/ethutil/parsing.go
blob: 553bb9717897a43dd42fb166692cd19540c3cc47 (plain) (tree)
1
2
3
4
5
6
7
8
9


               

                  


           
                              


















































                               

 




                                     
         

                    
 



                                              

         

                           
 
                               


                                                 
 















                                                                      
package ethutil

import (
    "math/big"
    "strconv"
)

// Op codes
var OpCodes = map[string]byte{
    "STOP":           0x00,
    "ADD":            0x01,
    "MUL":            0x02,
    "SUB":            0x03,
    "DIV":            0x04,
    "SDIV":           0x05,
    "MOD":            0x06,
    "SMOD":           0x07,
    "EXP":            0x08,
    "NEG":            0x09,
    "LT":             0x0a,
    "LE":             0x0b,
    "GT":             0x0c,
    "GE":             0x0d,
    "EQ":             0x0e,
    "NOT":            0x0f,
    "MYADDRESS":      0x10,
    "TXSENDER":       0x11,
    "TXVALUE":        0x12,
    "TXDATAN":        0x13,
    "TXDATA":         0x14,
    "BLK_PREVHASH":   0x15,
    "BLK_COINBASE":   0x16,
    "BLK_TIMESTAMP":  0x17,
    "BLK_NUMBER":     0x18,
    "BLK_DIFFICULTY": 0x19,
    "BLK_NONCE":      0x1a,
    "BASEFEE":        0x1b,
    "SHA256":         0x20,
    "RIPEMD160":      0x21,
    "ECMUL":          0x22,
    "ECADD":          0x23,
    "ECSIGN":         0x24,
    "ECRECOVER":      0x25,
    "ECVALID":        0x26,
    "SHA3":           0x27,
    "PUSH":           0x30,
    "POP":            0x31,
    "DUP":            0x32,
    "SWAP":           0x33,
    "MLOAD":          0x34,
    "MSTORE":         0x35,
    "SLOAD":          0x36,
    "SSTORE":         0x37,
    "JMP":            0x38,
    "JMPI":           0x39,
    "IND":            0x3a,
    "EXTRO":          0x3b,
    "BALANCE":        0x3c,
    "MKTX":           0x3d,
    "SUICIDE":        0x3f,
}

func IsOpCode(s string) bool {
    for key, _ := range OpCodes {
        if key == s {
            return true
        }
    }
    return false
}

func CompileInstr(s string) ([]byte, error) {
    isOp := IsOpCode(s)
    if isOp {
        return []byte{OpCodes[s]}, nil
    }

    num := new(big.Int)
    num.SetString(s, 0)

    return num.Bytes(), nil
}

func Instr(instr string) (int, []string, error) {

    base := new(big.Int)
    base.SetString(instr, 0)

    args := make([]string, 7)
    for i := 0; i < 7; i++ {
        // int(int(val) / int(math.Pow(256,float64(i)))) % 256
        exp := BigPow(256, i)
        num := new(big.Int)
        num.Div(base, exp)

        args[i] = num.Mod(num, big.NewInt(256)).String()
    }
    op, _ := strconv.Atoi(args[0])

    return op, args[1:7], nil
}