You are an expert in writing code in many different languages. Your goal is to perform code completion for the following code, keeping in mind the rest of the code and the file meta data.
    Metadata details:
    filename: codec_entry.go
    path of file: ./repos/chainlink/core/services/relay/evm/types
    
    the code of the file until where you have to start completion: package types

import (
	"fmt"
	"reflect"
	"strings"

	"github.com/ethereum/go-ethereum/accounts/abi"
	"github.com/ethereum/go-ethereum/common"

	"github.com/smartcontractkit/chainlink-common/pkg/codec"

	commontypes "github.com/smartcontractkit/chainlink-common/pkg/types"
)

// MaxTopicFields is three because the EVM has a max of four topics, but the first topic is always the event signature.
const MaxTopicFields = 3

type CodecEntry interface {
	Init() error
	Args() abi.Arguments
	EncodingPrefix() []byte
	GetMaxSize(n int) (int, error)
	Modifier() codec.Modifier

	// CheckedType provides a type that can be used to decode into with type-safety around sizes of integers etc
    
func getNativeAndCheckedTypes(curType *abi.Type) (reflect.Type, reflect.Type, error) {
	converter := func(t reflect.Type) reflect.Type { return t }
	for curType.Elem != nil {
		prior := converter
		switch curType.GetType().Kind() {
		case reflect.Slice:
			converter = func(t reflect.Type) reflect.Type {
				return prior(reflect.SliceOf(t))
			}
			curType = curType.Elem
		case reflect.Array:
			tmp := curType
			converter = func(t reflect.Type) reflect.Type {
				return prior(reflect.ArrayOf(tmp.Size, t))
			}
			curType = curType.Elem
		default:
			return nil, nil, fmt.Errorf(
				"%w: cannot create type for kind %v", commontypes.ErrInvalidType, curType.GetType().Kind())
		}
	}
	base, ok := GetAbiEncodingType(curType.String())
	if ok {
		return converter(base.native), converter(base.checked), nil
	}

	return createTupleType(curType, converter)
}