Utility functions for transferring ETH and tokens

* implemented some util functions to transfer ETH and ERC20 tokens for
  aiding testing
* add and improve doctrings
This commit is contained in:
Teemu Patja 2017-08-23 15:11:46 +03:00
parent aeb5d08657
commit 881e79477f
No known key found for this signature in database
GPG Key ID: F5B7035E6580FD4C
2 changed files with 70 additions and 5 deletions

View File

@ -30,6 +30,7 @@
response (:body @(post (eth-rpc-url) options))
result (json/read-str response :key-fn keyword)]
(log/debug body "\n" result)
(if (= (:id result) request-id)
(:result result)
(do
@ -57,6 +58,11 @@
[wei]
(/ wei 1000000000000000000))
(defn eth->wei
[eth]
(biginteger (* eth 1000000000000000000)))
(defn hex->eth
[hex digits]
(->> hex hex->big-integer from-wei double (format (str "%." digits "f"))))
@ -74,6 +80,7 @@
(hex->eth (get-balance-hex account) digits))
(defn send-transaction
"Send transaction using default commiteth bot account."
[from to value & [params]]
(let [args (merge params
{:from from
@ -91,6 +98,25 @@
args)
(eth-password)])))
(defn send-transaction-using-from-account
"Send transaction using account address in parameter from. Assumes
account has been unlocked."
[from to value & [params]]
(let [args (merge params
{:from from
:value value}
(when-not (nil? (gas-price))
{:gasPrice (integer->hex (gas-price))})
(when-not (contains? params :gas)
{:gas
(estimate-gas from to value params)}))]
(log/debug "args:" args)
(eth-rpc
"eth_sendTransaction"
[(if-not (nil? to)
(merge args {:to to})
args)])))
(defn get-transaction-receipt
[hash]
(eth-rpc "eth_getTransactionReceipt" [hash]))
@ -117,6 +143,28 @@
value (format "0x%x" 0)]
(send-transaction from contract value {:data data})))
(defn execute-using-addr
[from-addr from-passphrase contract method-id & params]
(eth-rpc "personal_unlockAccount" [from-addr from-passphrase 30])
(let [data (apply format-call-params method-id params)
value (format "0x%x" 0)]
(send-transaction-using-from-account from-addr
contract
value
{:data data})))
(defn transfer-eth
"Transfer amount-wei of ETH from from-addr to to-addr."
[from-addr from-passphrase to-addr amount-wei]
(eth-rpc "personal_unlockAccount" [from-addr from-passphrase 30])
(let [data "0x"
value (integer->hex amount-wei)]
(println "value" value)
(send-transaction-using-from-account from-addr
to-addr
value
{:data data})))
(defn hex-ch->num
[ch]

View File

@ -19,7 +19,8 @@
:get-token-list "getTokenList()"
:create "create(address[],uint256)"
:watch "watch(address)"
:balance-of "balanceOf(address)"})))
:balance-of "balanceOf(address)"
:transfer "transfer(address,uint256)"})))
(def topics
{:factory-create (eth/event-sig->topic-id "Create(address,address)")
@ -120,7 +121,7 @@
(BigInteger/valueOf 500000)))
(defn convert-token-value
"Convert given value to decimal using given token's base"
"Convert given value to decimal using given token's base."
[value token]
(let [token-details (token-data/token-info token)
token-base (:base token-details)]
@ -130,7 +131,8 @@
(defn token-balance-in-bounty
"Query (internal) ERC20 token balance from bounty contract for given token TLA"
"Query (internal) ERC20 token balance from bounty contract for given
token TLA."
[bounty-addr token]
(let [bounty-contract (load-bounty-contract bounty-addr)
token-address (get-token-address token)
@ -142,7 +144,8 @@
(convert-token-value token))))
(defn token-balance
"Query balance of given ERC20 token TLA for given address from ERC20 contract"
"Query balance of given ERC20 token TLA for given address from ERC20
contract."
[bounty-addr token]
(let [token-address (get-token-address token)]
@ -154,7 +157,8 @@
(defn token-balances
"Get a given bounty contract's token balances. Assumes contract's internal balances have been updated"
"Get a given bounty contract's token balances. Assumes contract's
internal balances have been updated."
[bounty-addr]
(let [bounty-contract (load-bounty-contract bounty-addr)
token-addresses (-> bounty-contract
@ -168,3 +172,16 @@
(assert tla)
[tla (token-balance bounty-addr tla)])) addrs)))
{})))
(defn transfer-tokens
"Transfer mount of given ERC20 token from from-addr to
to-addr. Connected geth needs to have keys for the account and
passphrase needs to be supplied. Returns transaction ID."
[from-addr from-passphrase token to-addr amount]
(let [token-addr (get-token-address token)]
(eth/execute-using-addr from-addr
from-passphrase
token-addr
(method-ids :transfer)
to-addr
amount)))