When making a contract transaction using go-ethereum (golang) how can I decode the transaction inputs. Specifically Given a `tx.Data []byte` , the contract's `contractABI abi.ABI` and the method that is being called its `methodID string` how can I decode `tx.Data` from hexadecimal to go types ? I've tried doing `abi.Methods[methodID].Inputs.Arguments.UnpackValues(tx.Data)` but this always results in an empty slice of values. Code: ``` func decodeTxParams(abi abi.ABI, method string, data []byte) ([]interface{}, error) { txParams, err := abi.Methods[method].Inputs.UnpackValues(data) if err != nil { return []interface{}{}, err } return txParams, nil } ``` caller: ``` func (b *backend) SendTransaction(ctx context.Context, tx *types.Transaction) error { err := b.Client.SendTransaction(ctx, tx) if err != nil { return err } // update local nonce msg, err := tx.AsMessage(types.HomesteadSigner{}) if err != nil { return err } sender := msg.From() b.nonceManager.Lock(sender) b.nonceManager.Update(sender, tx.Nonce()) b.nonceManager.Unlock(sender) data := msg.Data() method, ok := b.methods[string(data[:4])] if !ok { method = "unknown" } txParams, err := decodeTxParams(b.abiMap[string(data[:4])], string(data[:4]), data[4:]) if err != nil { return err } if err != nil { glog.Infof("\n%vEth Transaction%v\n\nInvoking transaction: \"%v\". \nTransaction Failed: %v\n\n%v\n", strings.Repeat("*", 30), strings.Repeat("*", 30), method, err, strings.Repeat("*", 75)) return err } glog.Infof("\n%vEth Transaction%v\n\nInvoking transaction: \"%v\". Hash: \"%v\". \n\n%v\n", strings.Repeat("*", 30), strings.Repeat("*", 30), method, tx.Hash().String(), strings.Repeat("*", 75)) return nil } ```