Forked from
blockchain / nucleo
85 commits behind the upstream repository.
-
Robert Martin-Legene authored33f2043e
libbfa.sh 4.61 KiB
# This should only be sourced, not executed directly.
# 20180626 Robert Martin-Legene <robert@nic.ar>
trap "echo Argh! ; exit 1" ERR
set -o errtrace
function fatal()
{
echo "$@" >&2
exit 1
}
function errtrap
{
fatal "${ERRTEXT:-Argh!}"
}
trap errtrap ERR
test -n "$BASH_VERSION" ||
fatal "This file must be source(d) from bash."
test "$( caller 2>/dev/null | awk '{print $1}' )" != "0" ||
fatal "This file must be source(d), not executed."
function yesno
{
local defreply=${1,,}
local yn=Yn
test "$defreply" = "n" &&
yn=yN
shift
REPLY=
read -p "$* [${yn}]: " -n 1 -e
REPLY=${REPLY,,}
if [ "$REPLY" != "y" -a "$REPLY" != "n" ]
then
REPLY=$defreply
fi
}
function cleanup
{
if [ $# -gt 0 ]
then
trap cleanup EXIT
cleanup_files="${cleanup_files} $@"
return
fi
rm -rf $cleanup_files
}
function geth_attach
{
geth --cache 0 "$@" attach ipc:${BFANODEDIR}/geth.ipc
}
function geth_exec_file
{
test -r "$1"
geth_attach --exec "loadScript(\"$1\")" </dev/null
}
function geth_exec
{
test -n "$1"
geth_attach --exec "$1" </dev/null
}
rpc_counter=0
function geth_rpc
{
local params= connectstring= cmd=$1
shift
test -n "$cmd"
rpc_counter=$(( $rpc_counter + 1 ))
if [ $# -gt 0 ]
then
params=',"params":['
while [ $# -gt 0 ]
do
params="${params}${1},"
shift
done
# Eat the last comma and add a ]
params=${params/%,/]}
fi
if [ "$BFASOCKETTYPE" = "ipc" ]
then
connectstring="--unix-socket ${BFASOCKETURL}"
else
connectstring="${BFASOCKETURL}"
fi
local json=$(
curl \
-H 'Content-type: application/json' \
-X POST \
--data "{\"jsonrpc\":\"2.0\",\"method\":\"${cmd}\"${params},\"id\":${rpc_counter}}" \
${connectstring} \
2>/dev/null
)
test -n "$json"
if [ "$( echo "$json" | jq .error )" != "null" ]
then
echo "$json" | jq -r .error.message >&2
false
fi
echo "$json" | jq .result
}
function create_account
{
geth --cache 0 --datadir ${BFANODEDIR} --password /dev/null account new
}
function prereq
{
local err=0
while [ -n "$1" ]
do
if ! which $1 > /dev/null
then
echo "Need $1"
err=1
fi
shift
done
test $err -eq 0
}
function contract
{
local contract="${BFANETWORKDIR}/contracts/${1}"
local realdir=$( realpath "${contract}" )
test -r "${realdir}"
local address=$( basename "${realdir}" )
test -n "${address}"
abi=$( cat ${contract}/abi )
test -n "${abi}"
echo "eth.contract(${abi}).at(\"${address}\")"
}
function contractSendTx
{
local name=$1
local func=$2
shift 2
echo "var contract = $( contract "${name}" );"
local args=
for x in $*
do
args="${args}, ${x}"
done
args="${args:1},"
if [ "$args" = "," ]
then
args=
fi
echo "contract.${func}.sendTransaction(${args} {from: eth.accounts[0], gas: 1000000} )"
}
function bfainit
{
###############
# bfainit #
test -n "${BFAHOME}" -a \
-d "${BFAHOME}" ||
fatal "\$BFAHOME in your environment must point to a directory."
#
# BFANETWORKID
test -n "${BFANETWORKID}" || BFANETWORKID=47525974938
#
# BFANETWORKDIR
test -n "${BFANETWORKDIR}" || BFANETWORKDIR="${BFAHOME}/network"
mkdir -p "${BFANETWORKDIR}"
test -d "${BFANETWORKDIR}" || fatal "\$BFANETWORKDIR (\"${BFANETWORKDIR}\") not found."
#
# BFANODEDIR
test -n "$BFANODEDIR" || BFANODEDIR="${BFANETWORKDIR}/node"
if [ ! -d "${BFANODEDIR}" -o ! -d "${BFANODEDIR}/geth/chaindata" ]
then
generate-genesis-block.sh
fi
#
# Default to IPC connections, because we have more geth modules available.
true ${BFASOCKETTYPE:=ipc}
case "${BFASOCKETTYPE}" in
ipc)
true ${BFASOCKETURL:="ipc:${BFANODEDIR}/geth.ipc"}
;;
http)
true ${BFASOCKETURL:="http://127.0.0.1:8545"}
;;
ws)
true ${BFASOCKETURL:="ws://127.0.0.1:8546"}
;;
*)
echo "Unknown socket type. Supported types are http, ws, ipc" >&2
exit 1
esac
}
if [ -z "$SOURCED_BFAINIT_SH" ]
then
SOURCED_BFAINIT_SH=yes
bfainit
fi