diff --git a/pkg/interop/contract/contract.go b/pkg/interop/contract/contract.go
index f1d6af376..d220b85e2 100644
--- a/pkg/interop/contract/contract.go
+++ b/pkg/interop/contract/contract.go
@@ -1,55 +1,85 @@
+/*
+Package contract provides functions to work with contracts.
+*/
 package contract
 
 import "github.com/nspcc-dev/neo-go/pkg/interop/storage"
 
-// Package contract provides function signatures that can be used inside
-// smart contracts that are written in the neo-go framework.
-
-// Contract stubs a NEO contract type.
+// Contract represents a Neo contract and is used in interop functions. It's
+// an opaque data structure that you can manipulate with using functions from
+// this package. It's similar in function to the Contract class in the Neo .net
+// framework.
 type Contract struct{}
 
-// GetScript returns the script of the given contract.
+// GetScript returns the script of the given contract. It uses
+// `Neo.Contract.GetScript` syscall.
 func GetScript(c Contract) []byte {
 	return nil
 }
 
-// IsPayable returns whether the given contract is payable.
+// IsPayable returns whether the given contract is payable (able to accept
+// asset transfers to its address). It uses `Neo.Contract.IsPayable` syscall.
 func IsPayable(c Contract) bool {
 	return false
 }
 
-// GetStorageContext returns the storage context for the given contract.
+// GetStorageContext returns storage context for the given contract. It only
+// works for contracts created in this transaction (so you can't take a storage
+// context for arbitrary contract). Refer to the `storage` package on how to
+// use this context. This function uses `Neo.Contract.GetStorageContext` syscall.
 func GetStorageContext(c Contract) storage.Context {
 	return storage.Context{}
 }
 
-// Create creates a new contract.
-// @FIXME What is the type of the returnType here?
+// Create creates a new contract using a set of input parameters:
+//     script      contract's bytecode (limited in length by 1M)
+//     params      contract's input parameter types, one byte per parameter, see
+//                 ParamType in the `smartcontract` package for value
+//                 definitions. Maximum number of parameters: 252.
+//     returnType  return value type, also a ParamType constant
+//     properties  bit field with contract's permissions (storage, dynamic
+//                 invoke, payable), see PropertyState in the `smartcontract`
+//                 package
+//     name        human-readable contract name (no longer than 252 bytes)
+//     version     human-readable contract version (no longer than 252 bytes)
+//     author      contract's author (no longer than 252 bytes)
+//     email       contract's author/support e-mail (no longer than 252 bytes)
+//     description human-readable contract description (no longer than 64K bytes)
+// It returns this new created Contract when successful (and fails transaction
+// if not). It uses `Neo.Contract.Create` syscall.
 func Create(
 	script []byte,
-	params []interface{},
+	params []byte,
 	returnType byte,
-	properties interface{},
+	properties byte,
 	name,
 	version,
 	author,
 	email,
-	description string) {
+	description string) Contract {
+	return Contract{}
 }
 
-// Migrate migrates a new contract.
-// @FIXME What is the type of the returnType here?
+// Migrate migrates calling contract (that is the one that calls Migrate) to
+// the new contract. Its parameters have exactly the same semantics as for
+// Create. The old contract will be deleted by this call, if it has any storage
+// associated it will be migrated to the new contract. New contract is returned.
+// This function uses `Neo.Contract.Migrate` syscall.
 func Migrate(
 	script []byte,
-	params []interface{},
+	params []byte,
 	returnType byte,
-	properties interface{},
+	properties byte,
 	name,
 	version,
 	author,
 	email,
-	description string) {
+	description string) Contract {
+	return Contract{}
 }
 
-// Destroy deletes a contract that is registered on the blockchain.
-func Destroy(c Contract) {}
+// Destroy deletes calling contract (the one that calls Destroy) from the
+// blockchain, so it's only possible to do that from the contract itself and
+// not by any outside code. When contract is deleted all associated storage
+// items are deleted too. This function uses `Neo.Contract.Destroy` syscall.
+func Destroy() {}