buildNeoVMParamInter build neovm invoke param code
(builder *vm.ParamsBuilder, smartContractParams []interface{})
| 107 | |
| 108 | //buildNeoVMParamInter build neovm invoke param code |
| 109 | func BuildNeoVMParam(builder *vm.ParamsBuilder, smartContractParams []interface{}) error { |
| 110 | //VM load params in reverse order |
| 111 | for i := len(smartContractParams) - 1; i >= 0; i-- { |
| 112 | switch v := smartContractParams[i].(type) { |
| 113 | case bool: |
| 114 | builder.EmitPushBool(v) |
| 115 | case byte: |
| 116 | builder.EmitPushInteger(big.NewInt(int64(v))) |
| 117 | case int: |
| 118 | builder.EmitPushInteger(big.NewInt(int64(v))) |
| 119 | case uint: |
| 120 | builder.EmitPushInteger(big.NewInt(int64(v))) |
| 121 | case int32: |
| 122 | builder.EmitPushInteger(big.NewInt(int64(v))) |
| 123 | case uint32: |
| 124 | builder.EmitPushInteger(big.NewInt(int64(v))) |
| 125 | case int64: |
| 126 | builder.EmitPushInteger(big.NewInt(int64(v))) |
| 127 | case common.Fixed64: |
| 128 | builder.EmitPushInteger(big.NewInt(int64(v.GetData()))) |
| 129 | case uint64: |
| 130 | val := big.NewInt(0) |
| 131 | builder.EmitPushInteger(val.SetUint64(uint64(v))) |
| 132 | case string: |
| 133 | builder.EmitPushByteArray([]byte(v)) |
| 134 | case *big.Int: |
| 135 | builder.EmitPushInteger(v) |
| 136 | case []byte: |
| 137 | builder.EmitPushByteArray(v) |
| 138 | case common.Address: |
| 139 | builder.EmitPushByteArray(v[:]) |
| 140 | case common.Uint256: |
| 141 | builder.EmitPushByteArray(v.ToArray()) |
| 142 | case []interface{}: |
| 143 | err := BuildNeoVMParam(builder, v) |
| 144 | if err != nil { |
| 145 | return err |
| 146 | } |
| 147 | builder.EmitPushInteger(big.NewInt(int64(len(v)))) |
| 148 | builder.Emit(vm.PACK) |
| 149 | default: |
| 150 | object := reflect.ValueOf(v) |
| 151 | kind := object.Kind().String() |
| 152 | if kind == "ptr" { |
| 153 | object = object.Elem() |
| 154 | kind = object.Kind().String() |
| 155 | } |
| 156 | switch kind { |
| 157 | case "slice": |
| 158 | ps := make([]interface{}, 0) |
| 159 | for i := 0; i < object.Len(); i++ { |
| 160 | ps = append(ps, object.Index(i).Interface()) |
| 161 | } |
| 162 | err := BuildNeoVMParam(builder, []interface{}{ps}) |
| 163 | if err != nil { |
| 164 | return err |
| 165 | } |
| 166 | case "struct": |
no test coverage detected