From 4fb0dd487c23fe256ef20f4c5486943e3d7a60b1 Mon Sep 17 00:00:00 2001
From: zramsay <zach@monax.io>
Date: Tue, 21 Mar 2017 09:52:58 -0400
Subject: [PATCH] docs: update harmonized links; remove generator

---
 README.md                   |  10 +-
 client/cmd/eris-client.go   |   2 +-
 cmd/eris-db.go              |   2 +-
 docs/build.sh               |  59 ------
 docs/generator.go           | 178 ------------------
 docs/generator/generator.go | 347 ------------------------------------
 docs/specs/api.md           |   4 +-
 7 files changed, 8 insertions(+), 594 deletions(-)
 delete mode 100755 docs/build.sh
 delete mode 100644 docs/generator.go
 delete mode 100644 docs/generator/generator.go

diff --git a/README.md b/README.md
index 10c36f2c..dc2fdb1e 100644
--- a/README.md
+++ b/README.md
@@ -5,7 +5,7 @@
 | Master | [![Circle CI](https://circleci.com/gh/eris-ltd/eris-db/tree/master.svg?style=svg)](https://circleci.com/gh/eris-ltd/eris-db/tree/master) |
 | Develop | [![Circle CI (develop)](https://circleci.com/gh/eris-ltd/eris-db/tree/develop.svg?style=svg)](https://circleci.com/gh/eris-ltd/eris-db/tree/develop) |
 
-Eris-db is Monax' permissioned blockchain client. It executes Ethereum smart contracts on a permissioned virtual machine. Eris-db provides transaction finality and high transaction throughput on proof-of-stake Tendermint consensus engine. For smart contract development most functionality is provided by `eris chains`, exposed through [eris](https://monax.io/docs/documentation/cli), the entry point for the Eris Platform.
+Eris-db is Monax' permissioned blockchain client. It executes Ethereum smart contracts on a permissioned virtual machine. Eris-db provides transaction finality and high transaction throughput on proof-of-stake Tendermint consensus engine. For smart contract development most functionality is provided by `eris chains`, exposed through [eris](https://monax.io/docs), the entry point for the Eris Platform.
 
 ## Table of Contents
 
@@ -36,11 +36,9 @@ Eris-db has been architected with a longer term vision on security and data priv
 - **Secure Signing:** Monax is a legal engineering company; we partner with expert companies to natively support secure signing solutions going forward.
 - **Multi-chain Universe (Step 1 of 3):** from the start the eris platform has been conceived for orchestrating many chains, as exemplified by the command “eris chains make” or by that transactions are only valid on the intended chain. Separating state into different chains is only the first of three steps towards privacy on smart contract chains (see future work below).
 
-See the [eris-db documentation](https://monax.io/docs/documentation/db/) for more information.
-
 ## Installation
 
-`eris-db` is intended to be used by the `eris chains` command via [eris](https://monax.io/docs/documentation/cli/latest/eris_chains). Available commands such as `make | start | stop | logs | inspect | update` are used for chain lifecycle management.
+`eris-db` is intended to be used by the `eris chains` command via [eris](https://monax.io/docs). Available commands such as `make | start | stop | logs | inspect | update` are used for chain lifecycle management.
 
 ### For Developers
 Dependency management for eris-db is managed with [glide](github.com/Masterminds/glide), and you can build eris-db from source by following
@@ -63,11 +61,11 @@ For a Vagrant file see [eris-vagrant](https://github.com/eris-ltd/eris-vagrant)
 
 ## Usage
 
-Once the server has started, it will begin syncing up with the network. At that point you may begin using it. The preferred way is through our [javascript api](https://monax.io/docs/documentation/db.js/), but it is possible to connect directly via HTTP or websocket. The JSON-RPC and web-api reference can be found [here](https://monax.io/docs/documentation/db/latest/specifications/api/).
+Once the server has started, it will begin syncing up with the network. At that point you may begin using it. The preferred way is through our [javascript api](https://github.com/monax/eris-db.js), but it is possible to connect directly via HTTP or websocket.
 
 ## Configuration
 
-A commented template config will be written as part of the `eris chains make` [process](https://monax.io/docs/documentation/cli/latest/eris_chains_make/) and can be edited prior to the `eris chains start` [process](https://monax.io/docs/documentation/cli/latest/eris_chains_start/).
+A commented template config will be written as part of the `eris chains make` [process](https://monax.io/docs/getting-started) and can be edited prior to the `eris chains start` [process](https://monax.io/docs/getting-started).
 
 ## Contribute
 
diff --git a/client/cmd/eris-client.go b/client/cmd/eris-client.go
index 681dc525..bdedcd21 100644
--- a/client/cmd/eris-client.go
+++ b/client/cmd/eris-client.go
@@ -35,7 +35,7 @@ var ErisClientCmd = &cobra.Command{
 
 Made with <3 by Monax Industries.
 
-Complete documentation is available at https://monax.io/docs/documentation
+Complete documentation is available at https://monax.io/docs
 ` + "\nVERSION:\n " + version.VERSION,
 	Run: func(cmd *cobra.Command, args []string) { cmd.Help() },
 }
diff --git a/cmd/eris-db.go b/cmd/eris-db.go
index c0f6e582..74e28b68 100644
--- a/cmd/eris-db.go
+++ b/cmd/eris-db.go
@@ -34,7 +34,7 @@ your needs.
 
 Made with <3 by Monax Industries.
 
-Complete documentation is available at https://monax.io/docs/documentation
+Complete documentation is available at https://monax.io/docs
 ` + "\nVERSION:\n " + version.VERSION,
 	Run: func(cmd *cobra.Command, args []string) { cmd.Help() },
 }
diff --git a/docs/build.sh b/docs/build.sh
deleted file mode 100755
index ac790cbf..00000000
--- a/docs/build.sh
+++ /dev/null
@@ -1,59 +0,0 @@
-#!/usr/bin/env bash
-
-# -------------------------------------------------------------------
-# Set vars (change if used in another repo)
-
-base_name=eris-db
-user_name=eris-ltd
-docs_site=monax.io
-docs_name=./docs/documentation
-slim_name=db
-
-# -------------------------------------------------------------------
-# Set vars (usually shouldn't be changed)
-
-if [ "$CIRCLE_BRANCH" ]
-then
-  repo=`pwd`
-else
-  repo=$GOPATH/src/github.com/$user_name/$base_name
-fi
-release_min=$(cat $repo/version/version.go | tail -n 1 | cut -d \  -f 4 | tr -d '"')
-start=`pwd`
-
-# -------------------------------------------------------------------
-# Build
-
-cd $repo
-rm -rf $docs_name
-go run ./docs/generator.go
-
-if [[ "$1" == "latest" ]]
-then
-  mkdir -p $docs_name/$slim_name/latest
-  rsync -av $docs_name/$slim_name/$release_min/ $docs_name/$slim_name/latest/
-  find $docs_name/latest -type f -name "*.md" -exec sed -i "s/$release_min/latest/g" {} +
-fi
-
-tmp_dir=`mktemp -d 2>/dev/null || mktemp -d -t 'tmp_dir'`
-git clone git@github.com:$user_name/$docs_site.git $tmp_dir/$docs_site
-
-rsync -av $docs_name $tmp_dir/$docs_site/content/docs/
-
-# ------------------------------------------------------------------
-# Commit and push if there are changes
-
-cd $tmp_dir/$docs_site
-if [ -z "$(git status --porcelain)" ]; then
-  echo "All Good!"
-else
-  git add -A :/ &&
-  git commit -m "$base_name build number $CIRCLE_BUILD_NUM doc generation" &&
-  git push origin master
-fi
-
-# ------------------------------------------------------------------
-# Cleanup
-
-rm -rf $tmp_dir
-cd $start
\ No newline at end of file
diff --git a/docs/generator.go b/docs/generator.go
deleted file mode 100644
index 404b1593..00000000
--- a/docs/generator.go
+++ /dev/null
@@ -1,178 +0,0 @@
-// Copyright 2017 Monax Industries Limited
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//    http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package main
-
-import (
-	"fmt"
-	"io/ioutil"
-	"os"
-	"strings"
-	"text/template"
-
-	commands "github.com/eris-ltd/eris-db/cmd"
-	docs "github.com/eris-ltd/eris-db/docs/generator"
-
-	clientCommands "github.com/eris-ltd/eris-db/client/cmd"
-	"github.com/eris-ltd/eris-db/definitions"
-	"github.com/eris-ltd/eris-db/version"
-	"github.com/spf13/cobra"
-)
-
-// Repository maintainers should customize the next two lines.
-var Description = "Blockchain Client"                                       // should match the docs site name
-var RenderDir = fmt.Sprintf("./docs/documentation/db/%s/", version.VERSION) // should be the "shortversion..."
-
-// The below variables should be updated only if necessary.
-var Specs = []*docs.Entry{}
-var Examples = []*docs.Entry{}
-var SpecsDir = "./docs/specs"
-var ExamplesDir = "./docs/examples"
-
-type Cmd struct {
-	Command     *cobra.Command
-	Entry       *docs.Entry
-	Description string
-}
-
-func RenderFiles(cmdRaw *cobra.Command, tmpl *template.Template) error {
-	this_entry := &docs.Entry{
-		Title:          cmdRaw.CommandPath(),
-		Specifications: Specs,
-		Examples:       Examples,
-		BaseURL:        strings.Replace(RenderDir, ".", "", 1),
-		Template:       tmpl,
-		FileName:       docs.GenerateFileName(RenderDir, cmdRaw.CommandPath()),
-	}
-
-	cmd := &Cmd{
-		Command:     cmdRaw,
-		Entry:       this_entry,
-		Description: Description,
-	}
-
-	for _, command := range cmd.Command.Commands() {
-		RenderFiles(command, tmpl)
-	}
-
-	if !cmd.Command.HasParent() {
-		entries := append(cmd.Entry.Specifications, cmd.Entry.Examples...)
-		for _, entry := range entries {
-			entry.Specifications = cmd.Entry.Specifications
-			entry.Examples = cmd.Entry.Examples
-			entry.CmdEntryPoint = cmd.Entry.Title
-			entry.BaseURL = cmd.Entry.BaseURL
-			if err := docs.RenderEntry(entry); err != nil {
-				return err
-			}
-		}
-	}
-
-	outFile, err := os.Create(cmd.Entry.FileName)
-	if err != nil {
-		return err
-	}
-	defer outFile.Close()
-
-	err = cmd.Entry.Template.Execute(outFile, cmd)
-	if err != nil {
-		return err
-	}
-
-	return nil
-}
-
-func AddClientToDB(dbCmd, clientCmd *cobra.Command) error {
-	// formulate the filenames properly
-	dbFile := docs.GenerateFileName(RenderDir, dbCmd.CommandPath())
-	clFile := docs.GenerateFileName(RenderDir, clientCmd.CommandPath())
-
-	// get the manual additions sorted
-	dbAdditions := []byte(fmt.Sprintf("\n# Related Commands\n\n* [%s](%s)", "Eris Client", docs.GenerateURLFromFileName(clFile)))
-	clAdditions := []byte(fmt.Sprintf("\n# Related Commands\n\n* [%s](%s)", "Eris DB", docs.GenerateURLFromFileName(dbFile)))
-
-	// read and write the db file
-	dbTxt, err := ioutil.ReadFile(dbFile)
-	if err != nil {
-		return err
-	}
-	dbTxt = append(dbTxt, dbAdditions...)
-	err = ioutil.WriteFile(dbFile, dbTxt, 0644)
-	if err != nil {
-		return err
-	}
-
-	// read and write the client file
-	clTxt, err := ioutil.ReadFile(clFile)
-	if err != nil {
-		return err
-	}
-	clTxt = append(clTxt, clAdditions...)
-	err = ioutil.WriteFile(clFile, clTxt, 0644)
-	if err != nil {
-		return err
-	}
-
-	return nil
-}
-
-func main() {
-	// Repository maintainers should populate the top level command object.
-	erisDbCommand := commands.ErisDbCmd
-	do := definitions.NewDo()
-	commands.AddGlobalFlags(do)
-	commands.AddCommands(do)
-
-	erisClientCommand := clientCommands.ErisClientCmd
-	clientCommands.InitErisClientInit()
-	clientCommands.AddClientCommands()
-
-	// Make the proper directory.
-	var err error
-	if _, err = os.Stat(RenderDir); os.IsNotExist(err) {
-		err = os.MkdirAll(RenderDir, 0755)
-		if err != nil {
-			panic(err)
-		}
-	}
-
-	// Generate specs and examples files.
-	Specs, err = docs.GenerateEntries(SpecsDir, (RenderDir + "specifications/"), Description)
-	if err != nil {
-		panic(err)
-	}
-	Examples, err = docs.GenerateEntries(ExamplesDir, (RenderDir + "examples/"), Description)
-	if err != nil {
-		panic(err)
-	}
-
-	// Get template from docs generator.
-	tmpl, err := docs.GenerateCommandsTemplate()
-	if err != nil {
-		panic(err)
-	}
-
-	// Render the templates.
-	if err = RenderFiles(erisDbCommand, tmpl); err != nil {
-		panic(err)
-	}
-
-	if err = RenderFiles(erisClientCommand, tmpl); err != nil {
-		panic(err)
-	}
-
-	if err = AddClientToDB(erisDbCommand, erisClientCommand); err != nil {
-		panic(err)
-	}
-}
diff --git a/docs/generator/generator.go b/docs/generator/generator.go
deleted file mode 100644
index 296704a4..00000000
--- a/docs/generator/generator.go
+++ /dev/null
@@ -1,347 +0,0 @@
-// Copyright 2017 Monax Industries Limited
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//    http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package generator
-
-import (
-	"bufio"
-	"fmt"
-	"io"
-	"io/ioutil"
-	"os"
-	"path/filepath"
-	"regexp"
-	"strconv"
-	"strings"
-	"text/template"
-)
-
-const FrontMatter = `---
-
-layout: single
-type: docs
-title: "Documentation | {{ .Description }} | {{ $name }}"
-
----`
-
-type Entry struct {
-	Title          string
-	Template       *template.Template
-	Specifications []*Entry
-	Examples       []*Entry
-	Description    string
-	FileName       string
-	CmdEntryPoint  string
-	URL            string
-	BaseURL        string
-}
-
-func GenerateFileName(dir, s string) string {
-	return (dir + strings.Replace(strings.ToLower(s), " ", "_", -1) + ".md")
-}
-
-func GenerateTitleFromFileName(file string) string {
-	file = strings.Replace(file, "_", " ", -1)
-	file = strings.Replace(file, "-", " ", -1)
-	return strings.Title(strings.Replace(file, ".md", "", 1))
-}
-
-func GenerateFileNameFromGlob(dir, s string) string {
-	return (dir + strings.Replace(filepath.Base(s), " ", "_", -1))
-}
-
-func GenerateURLFromFileName(s string) string {
-	s = strings.Replace(s, "./", "/", 1)
-	return strings.Replace(s, ".md", "/", -1)
-}
-
-func GenerateCommandsTemplate() (*template.Template, error) {
-	handle_link := func(s string) string {
-		return (strings.Replace(s, ".md", "/", -1))
-	}
-
-	handle_file := func(s1, s2 string) string {
-		return strings.Replace((s1 + " " + s2 + ".md"), " ", "_", -1)
-	}
-
-	funcMap := template.FuncMap{
-		"title":       strings.Title,
-		"replace":     strings.Replace,
-		"chomp":       strings.TrimSpace,
-		"handle_file": handle_file,
-		"handle_link": handle_link,
-	}
-
-	var templateText = `{{- $name := .Command.CommandPath -}}` + FrontMatter + `
-
-# {{ $name }}
-
-{{ title .Command.Short }}
-
-{{ if .Command.Runnable }}## Usage
-
-` + "```bash\n{{ .Command.UseLine }}\n```" + `{{ end }}
-
-{{ if ne .Command.Long  "" }}## Synopsis
-
-{{ .Command.Long }}
-{{ end }}
-{{ $flags := .Command.NonInheritedFlags }}
-{{ if $flags.HasFlags }}## Options
-
-` + "```bash\n  {{ $flags.FlagUsages | chomp }}\n```" + `{{ end }}
-{{ $global_flags := .Command.InheritedFlags }}
-{{ if $global_flags.HasFlags }}## Options inherited from parent commands
-
-` + "```bash\n  {{ $global_flags.FlagUsages | chomp }}\n```" + `{{ end }}
-
-{{ if .Command.HasSubCommands }}# Subcommands
-{{ range .Command.Commands }}
-{{ if ne .Deprecated "" }}
-* [{{ $name }} {{ .Name }}]({{ .BaseURL }}{{ handle_file $name .Name | handle_link }}) - {{ .Short }}
-{{ end }}
-{{ end }}
-{{ end }}
-
-{{ if .Command.HasParent }}{{ $parent := .Command.Parent }}## See Also
-* [{{ $parent.CommandPath }}]({{ .BaseURL }}{{ handle_file $parent.CommandPath "" | handle_link }}) - {{ $parent.Short }}
-{{ end }}
-
-{{ if ne .Command.Example "" }}# Quick Tips
-
-` + "```bash\n{{ .Command.Example }}\n```" + `{{ end }}
-
-{{ if ne (len .Entry.Examples) 0 }}# Examples
-{{ range .Entry.Examples }}
-* [{{ title .Title }}]({{ .URL }})
-{{- end }}
-{{ end }}
-
-{{ if ne (len .Entry.Specifications) 0 }}# Specifications
-{{ range .Entry.Specifications }}
-* [{{ title .Title }}]({{ .URL }})
-{{- end }}
-{{ end }}
-`
-
-	return template.New("docGenerator").Funcs(funcMap).Parse(templateText)
-}
-
-func GenerateEntries(dir, render_dir, description string) ([]*Entry, error) {
-	var entries []*Entry
-
-	if _, err := os.Stat(render_dir); os.IsNotExist(err) {
-		err = os.MkdirAll(render_dir, 0755)
-		if err != nil {
-			panic(err)
-		}
-	}
-
-	files := CollectEntries(dir)
-
-	for _, file := range files {
-		this_entry, err := GenerateEntry(file, dir, render_dir, description)
-		if err != nil {
-			return nil, err
-		} else {
-			entries = append(entries, this_entry)
-		}
-	}
-
-	return entries, nil
-}
-
-func CollectEntries(dir string) []string {
-	var newFiles []string
-
-	files, err := filepath.Glob(dir + "/*")
-	if err != nil {
-		panic(err)
-	}
-
-	for _, file := range files {
-		f_info, err := os.Stat(file)
-
-		if err != nil {
-			panic(err)
-		}
-
-		if f_info.IsDir() {
-			newFiles = append(newFiles, CollectEntries(file)...)
-		} else {
-			if filepath.Ext(file) == ".md" {
-				newFiles = append(newFiles, file)
-			}
-		}
-	}
-
-	return newFiles
-}
-
-func GenerateEntry(file, dir, render_dir, description string) (*Entry, error) {
-	var err error
-
-	this_entry := &Entry{
-		FileName:    GenerateFileNameFromGlob(render_dir, file),
-		Title:       GenerateTitleFromFileName(filepath.Base(file)),
-		Description: description,
-	}
-
-	this_entry.URL = GenerateURLFromFileName(this_entry.FileName)
-
-	txt, err := ioutil.ReadFile(file)
-	if err != nil {
-		return nil, err
-	}
-
-	// Get template from docs generator
-	this_entry.Template, err = GenerateEntriesTemplate(txt)
-	if err != nil {
-		return nil, err
-	}
-
-	return this_entry, nil
-}
-
-func GenerateEntriesTemplate(txt []byte) (*template.Template, error) {
-	handle_link := func(s string) string {
-		return (strings.Replace(s, ".md", "/", -1))
-	}
-
-	handle_file := func(s1 string) string {
-		return strings.Replace((s1 + ".md"), " ", "_", -1)
-	}
-
-	insert_definition := func(file string, struc string) string {
-		txt, err := ioutil.ReadFile(filepath.Join("definitions", file))
-		if err != nil {
-			panic(err)
-		}
-		finder := regexp.MustCompile(fmt.Sprintf(`(?ms:^type %s struct {.*?^})`, struc))
-		return ("```go\n" + string(finder.Find(txt)) + "\n```")
-	}
-
-	insert_bash_lines := func(file string, linesToRead string) string {
-		var lines []byte
-		var line []byte
-		var start int
-		var stop int
-
-		fileInfo, err := os.Open(filepath.Join("docs", "tests", file))
-		if err != nil {
-			panic(err)
-		}
-		defer fileInfo.Close()
-
-		start, err = strconv.Atoi(strings.Split(linesToRead, "-")[0])
-		if strings.Contains(linesToRead, "-") {
-			stop, err = strconv.Atoi(strings.Split(linesToRead, "-")[1])
-		} else {
-			stop = start
-		}
-		if err != nil {
-			panic(err)
-		}
-
-		r := bufio.NewReader(fileInfo)
-		for i := 1; ; i++ {
-			line, err = r.ReadBytes('\n')
-			if err != nil {
-				break
-			}
-			if i >= start && i <= stop {
-				lines = append(lines, line...)
-			}
-		}
-		if err != io.EOF {
-			panic(err)
-		}
-
-		return ("```bash\n" + string(lines) + "```")
-	}
-
-	insert_file := func(file string) string {
-		file = filepath.Join("docs", "tests", file)
-		ext := filepath.Ext(file)
-		switch ext {
-		case ".sol":
-			ext = ".javascript"
-		case ".yml":
-			ext = ".yaml"
-		}
-
-		ext = strings.Replace(ext, ".", "", 1)
-
-		txtB, err := ioutil.ReadFile(file)
-		if err != nil {
-			panic(err)
-		}
-
-		txt := string(txtB)
-		if !strings.HasSuffix(txt, "\n") {
-			txt = txt + "\n"
-		}
-
-		return ("```" + ext + "\n" + txt + "```") // TODO: add auto-curl text
-	}
-
-	funcMap := template.FuncMap{
-		"title":             strings.Title,
-		"replace":           strings.Replace,
-		"chomp":             strings.TrimSpace,
-		"handle_file":       handle_file,
-		"handle_link":       handle_link,
-		"insert_definition": insert_definition,
-		"insert_bash_lines": insert_bash_lines,
-		"insert_file":       insert_file,
-	}
-
-	var templateText = `{{- $name := .Title -}}` + FrontMatter + `
-
-` + string(txt) + `
-
-## Commands
-
-* [{{ .CmdEntryPoint }}]({{ .BaseURL }}{{ handle_file .CmdEntryPoint | handle_link }})
-
-{{ if ne (len .Examples) 0 }}# Examples
-{{ range .Examples }}
-* [{{ title .Title }}]({{ .URL }})
-{{- end }}
-{{ end }}
-
-{{ if ne (len .Specifications) 0 }}# Specifications
-{{ range .Specifications }}
-* [{{ title .Title }}]({{ .URL }})
-{{- end }}
-{{ end }}
-`
-
-	return template.New("entryGenerator").Funcs(funcMap).Parse(templateText)
-}
-
-func RenderEntry(this_entry *Entry) error {
-	out_file, err := os.Create(this_entry.FileName)
-	if err != nil {
-		return err
-	}
-	defer out_file.Close()
-
-	err = this_entry.Template.Execute(out_file, this_entry)
-	if err != nil {
-		return err
-	}
-
-	return nil
-}
diff --git a/docs/specs/api.md b/docs/specs/api.md
index 30869583..4454d792 100644
--- a/docs/specs/api.md
+++ b/docs/specs/api.md
@@ -2,7 +2,7 @@
 
 ### for eris-db version 0.11.x
 
-Eris DB allows remote access to its functionality over http and websocket. It currently supports [JSON-RPC 2.0](http://www.jsonrpc.org/specification), and REST-like http. There is also javascript bindings available in the [erisdb-js](/docs/documentation/db.js/) library.
+Eris DB allows remote access to its functionality over http and websocket. It currently supports [JSON-RPC 2.0](http://www.jsonrpc.org/specification), and REST-like http. There is also javascript bindings available in the [erisdb-js](https://github.com/monax/eris-db.js) library.
 
 ## TOC
 
@@ -1755,7 +1755,7 @@ Parameters:
 #####Additional info
 
 `code` is a hex-string representation of compiled contract code.
-`data` is a string of data formatted in accordance with the [contract ABI](/docs/documentation/contracts.js/).
+`data` is a string of data formatted in accordance with the [contract ABI](https://github.com/monax/eris-contracts.js).
 
 ***
 
-- 
GitLab