shrub/pkg/bitcoin/lib/btc-provider.hoon

216 lines
4.6 KiB
Plaintext
Raw Normal View History

2021-02-20 14:49:28 +03:00
/- bp=btc-provider, json-rpc
/+ bc=bitcoin, bcu=bitcoin-utils
~% %btc-provider-lib ..part ~
2020-10-20 13:44:31 +03:00
|%
2020-12-01 15:23:11 +03:00
:: +from-epoch: time since Jan 1, 1970 in seconds.
::
++ from-epoch
|= secs=@ud
^- (unit @da)
?: =(0 secs) ~
[~ (add ~1970.1.1 `@dr`(mul secs ~s1))]
2020-11-12 18:20:54 +03:00
::
2020-11-13 13:14:35 +03:00
++ get-request
2020-11-12 18:20:54 +03:00
|= url=@t
^- request:http
[%'GET' url ~ ~]
2020-10-20 17:13:52 +03:00
::
2020-12-08 12:56:32 +03:00
++ post-request
|= [url=@t body=json]
^- request:http
:* %'POST'
url
~[['Content-Type' 'application/json']]
=, html
%- some
%- as-octt:mimes
(en-json body)
2020-12-08 12:56:32 +03:00
==
::
2020-10-20 17:13:52 +03:00
++ gen-request
2021-02-19 17:11:01 +03:00
|= [=host-info:bp ract=action:rpc-types:bp]
2020-10-20 17:13:52 +03:00
^- request:http
2020-11-13 13:14:35 +03:00
%+ rpc-action-to-http
api-url.host-info ract
2020-10-20 17:13:52 +03:00
::
2020-12-13 13:04:47 +03:00
++ rpc
~/ %rpc
=, dejs:format
2020-12-13 13:04:47 +03:00
|%
++ parse-result
|= res=response:json-rpc
2021-02-19 17:11:01 +03:00
|^ ^- result:rpc-types:bp
2020-12-13 13:04:47 +03:00
~| -.res
?> ?=(%result -.res)
2020-12-13 20:00:52 +03:00
?+ id.res ~|([%unsupported-result id.res] !!)
2020-12-13 13:04:47 +03:00
%get-address-info
[id.res (address-info res.res)]
::
%get-tx-vals
[id.res (tx-vals res.res)]
::
%get-raw-tx
[id.res (raw-tx res.res)]
2020-12-21 12:50:33 +03:00
::
2020-12-13 20:00:52 +03:00
%broadcast-tx
2020-12-13 23:33:08 +03:00
[%broadcast-tx (broadcast-tx res.res)]
2020-12-13 13:04:47 +03:00
::
%get-block-count
[id.res (ni res.res)]
2020-12-13 13:04:47 +03:00
::
2021-01-26 14:27:32 +03:00
%get-block-info
[id.res (block-info res.res)]
2020-11-16 19:30:50 +03:00
==
::
2020-12-13 13:04:47 +03:00
++ address-info
2021-02-11 18:25:27 +03:00
%- ot
2021-02-20 14:49:28 +03:00
:~ [%address (cu from-cord:adr:bc so)]
2021-02-11 18:25:27 +03:00
[%utxos (as utxo)]
[%used bo]
[%block ni]
2020-12-13 13:04:47 +03:00
==
::
2020-12-13 13:04:47 +03:00
++ utxo
%- ot
2021-02-11 18:25:27 +03:00
:~ ['tx_pos' ni]
['tx_hash' (cu from-cord:hxb:bcu so)]
2021-02-11 18:25:27 +03:00
[%height ni]
[%value ni]
[%recvd (cu from-epoch ni)]
2020-12-13 13:04:47 +03:00
==
::
2021-01-26 14:27:32 +03:00
++ tx-vals
2021-02-11 18:25:27 +03:00
%- ot
:~ [%included bo]
[%txid (cu from-cord:hxb:bcu so)]
2021-02-11 18:25:27 +03:00
[%confs ni]
[%recvd (cu from-epoch ni)]
[%inputs (ar tx-val)]
[%outputs (ar tx-val)]
2020-12-13 13:04:47 +03:00
==
::
2020-12-13 13:04:47 +03:00
++ tx-val
2021-02-11 18:25:27 +03:00
%- ot
:~ [%txid (cu from-cord:hxb:bcu so)]
2021-02-11 18:25:27 +03:00
[%pos ni]
2021-02-20 14:49:28 +03:00
[%address (cu from-cord:adr:bc so)]
2021-02-11 18:25:27 +03:00
[%value ni]
2020-12-13 13:04:47 +03:00
==
::
2020-12-13 13:04:47 +03:00
++ raw-tx
2021-02-11 18:25:27 +03:00
%- ot
:~ [%txid (cu from-cord:hxb:bcu so)]
[%rawtx (cu from-cord:hxb:bcu so)]
2020-12-13 13:04:47 +03:00
==
::
2020-12-13 23:33:08 +03:00
++ broadcast-tx
2021-02-11 18:25:27 +03:00
%- ot
:~ [%txid (cu from-cord:hxb:bcu so)]
2021-02-11 18:25:27 +03:00
[%broadcast bo]
[%included bo]
2020-12-13 23:33:08 +03:00
==
::
2021-01-26 14:27:32 +03:00
++ block-info
2021-02-11 18:25:27 +03:00
%- ot
:~ [%block ni]
[%fee (mu ni)]
[%blockhash (cu from-cord:hxb:bcu so)]
[%blockfilter (cu from-cord:hxb:bcu so)]
2020-12-13 13:04:47 +03:00
==
--
2020-11-13 13:14:35 +03:00
--
::
++ rpc-action-to-http
2021-02-19 17:11:01 +03:00
|= [endpoint=@t ract=action:rpc-types:bp]
2020-11-13 13:14:35 +03:00
|^ ^- request:http
?- -.ract
%get-address-info
2020-12-08 12:56:32 +03:00
%- get-request
2020-11-20 14:58:27 +03:00
%+ mk-url '/addresses/info/'
2021-02-20 14:49:28 +03:00
(to-cord:adr:bc address.ract)
2020-12-06 20:53:02 +03:00
::
%get-tx-vals
2020-12-08 12:56:32 +03:00
%- get-request
2020-12-06 20:53:02 +03:00
%+ mk-url '/gettxvals/'
(to-cord:hxb:bcu txid.ract)
2020-11-20 14:58:27 +03:00
::
%get-raw-tx
2020-12-08 12:56:32 +03:00
%- get-request
2020-11-20 14:58:27 +03:00
%+ mk-url '/getrawtx/'
(to-cord:hxb:bcu txid.ract)
2020-12-13 13:04:47 +03:00
::
%broadcast-tx
%- get-request
%+ mk-url '/broadcasttx/'
(to-cord:hxb:bcu rawtx.ract)
2020-11-13 13:14:35 +03:00
::
%get-block-count
2020-12-08 12:56:32 +03:00
%- get-request
2020-11-20 14:58:27 +03:00
(mk-url '/getblockcount' '')
2020-11-16 19:30:50 +03:00
::
2021-01-26 14:27:32 +03:00
%get-block-info
2020-12-08 12:56:32 +03:00
%- get-request
2021-01-26 14:27:32 +03:00
(mk-url '/getblockinfo' '')
2020-11-13 13:14:35 +03:00
==
++ mk-url
2020-11-20 14:58:27 +03:00
|= [base=@t params=@t]
2020-11-13 13:14:35 +03:00
%^ cat 3
2020-11-20 14:58:27 +03:00
(cat 3 endpoint base) params
2020-11-12 18:20:54 +03:00
--
:: RPC/HTTP Utilities
::
++ httr-to-rpc-response
|= hit=httr:eyre
2020-12-09 12:35:02 +03:00
^- response:json-rpc
~| hit
=/ jon=json (need (de-json:html q:(need r.hit)))
?. =(%2 (div p.hit 100))
(parse-rpc-error jon)
=, dejs-soft:format
2020-12-09 12:35:02 +03:00
^- response:json-rpc
=; dere
=+ res=((ar dere) jon)
?~ res (need (dere jon))
[%batch u.res]
|= jon=json
2020-12-09 12:35:02 +03:00
^- (unit response:json-rpc)
=/ res=[id=(unit @t) res=(unit json) err=(unit json)]
%. jon
=, dejs:format
=- (ou -)
:~ ['id' (uf ~ (mu so))]
['result' (uf ~ (mu same))]
['error' (uf ~ (mu same))]
==
?: ?=([^ * ~] res)
`[%result [u.id.res ?~(res.res ~ u.res.res)]]
~| jon
`(parse-rpc-error jon)
::
++ get-rpc-response
|= response=client-response:iris
2020-12-09 12:35:02 +03:00
^- response:json-rpc
?> ?=(%finished -.response)
%- httr-to-rpc-response
%+ to-httr:iris
response-header.response
full-file.response
::
++ parse-rpc-error
|= =json
2020-12-09 12:35:02 +03:00
^- response:json-rpc
:- %error
?~ json ['' '' '']
%. json
=, dejs:format
=- (ou -)
:~ =- ['id' (uf '' (cu - (mu so)))]
|*(a=(unit) ?~(a '' u.a))
:- 'error'
=- (uf ['' ''] -)
=- (cu |*(a=(unit) ?~(a ['' ''] u.a)) (mu (ou -)))
:~ ['code' (uf '' no)]
['message' (uf '' so)]
== ==
2020-10-20 13:44:31 +03:00
--