141 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Factor
		
	
	
		
		
			
		
	
	
			141 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Factor
		
	
	
| 
								 | 
							
								! Copyright (C) 2010 Chris Double.
							 | 
						||
| 
								 | 
							
								! See http://factorcode.org/license.txt for BSD license.
							 | 
						||
| 
								 | 
							
								!
							 | 
						||
| 
								 | 
							
								! bitcoin API documentation at:
							 | 
						||
| 
								 | 
							
								!  http://www.bitcoin.org/wiki/doku.php?id=api
							 | 
						||
| 
								 | 
							
								!
							 | 
						||
| 
								 | 
							
								! Donations can be sent to the following bitcoin address:
							 | 
						||
| 
								 | 
							
								! 1HVMkUcaPhCeCK3rrBm31EY2bf5r33VHsj
							 | 
						||
| 
								 | 
							
								!
							 | 
						||
| 
								 | 
							
								USING:
							 | 
						||
| 
								 | 
							
								    accessors
							 | 
						||
| 
								 | 
							
								    assocs
							 | 
						||
| 
								 | 
							
								    base64
							 | 
						||
| 
								 | 
							
								    byte-arrays
							 | 
						||
| 
								 | 
							
								    hashtables
							 | 
						||
| 
								 | 
							
								    http
							 | 
						||
| 
								 | 
							
								    http.client
							 | 
						||
| 
								 | 
							
								    io.encodings.binary
							 | 
						||
| 
								 | 
							
								    json.reader
							 | 
						||
| 
								 | 
							
								    json.writer
							 | 
						||
| 
								 | 
							
								    kernel
							 | 
						||
| 
								 | 
							
								    locals
							 | 
						||
| 
								 | 
							
								    namespaces
							 | 
						||
| 
								 | 
							
								    sequences
							 | 
						||
| 
								 | 
							
								    strings
							 | 
						||
| 
								 | 
							
								    urls
							 | 
						||
| 
								 | 
							
								;
							 | 
						||
| 
								 | 
							
								IN: bitcoin.client
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: bitcoin-server ( -- string )
							 | 
						||
| 
								 | 
							
								    \ bitcoin-server get "localhost" or ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: bitcoin-port ( -- n )
							 | 
						||
| 
								 | 
							
								    \ bitcoin-port get 8332 or ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: bitcoin-user ( -- string )
							 | 
						||
| 
								 | 
							
								    \ bitcoin-user get "" or ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: bitcoin-password ( -- string )
							 | 
						||
| 
								 | 
							
								    \ bitcoin-password get ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<PRIVATE
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: bitcoin-url ( -- url )
							 | 
						||
| 
								 | 
							
								    <url>
							 | 
						||
| 
								 | 
							
								      "http" >>protocol
							 | 
						||
| 
								 | 
							
								      "/" >>path
							 | 
						||
| 
								 | 
							
								      bitcoin-server >>host
							 | 
						||
| 
								 | 
							
								      bitcoin-port >>port ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:: payload ( method params -- data ) 
							 | 
						||
| 
								 | 
							
								    "text/plain" <post-data>
							 | 
						||
| 
								 | 
							
								        binary >>content-encoding
							 | 
						||
| 
								 | 
							
								        H{
							 | 
						||
| 
								 | 
							
								            { "method" method }
							 | 
						||
| 
								 | 
							
								            { "params" params }
							 | 
						||
| 
								 | 
							
								        } clone >json >byte-array >>data ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: basic-auth ( -- string )
							 | 
						||
| 
								 | 
							
								    bitcoin-user bitcoin-password ":" glue >base64 >string
							 | 
						||
| 
								 | 
							
								    "Basic " prepend ; 
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: bitcoin-request ( method params -- request )
							 | 
						||
| 
								 | 
							
								    payload bitcoin-url <post-request> 
							 | 
						||
| 
								 | 
							
								    basic-auth "Authorization" set-header
							 | 
						||
| 
								 | 
							
								    dup post-data>> data>> length "Content-Length" set-header
							 | 
						||
| 
								 | 
							
								    http-request nip >string json> "result" swap at ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								PRIVATE>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:: get-addresses-by-label ( label -- seq )
							 | 
						||
| 
								 | 
							
								    "getaddressesbylabel" { label } bitcoin-request ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: get-balance ( -- n )
							 | 
						||
| 
								 | 
							
								    "getbalance" { } bitcoin-request ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: get-block-count ( -- n )
							 | 
						||
| 
								 | 
							
								    "getblockcount" { } bitcoin-request ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: get-block-number ( -- n )
							 | 
						||
| 
								 | 
							
								    "getblocknumber" { } bitcoin-request ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: get-connection-count ( -- n )
							 | 
						||
| 
								 | 
							
								    "getconnectioncount" { } bitcoin-request ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: get-difficulty ( -- n )
							 | 
						||
| 
								 | 
							
								    "getdifficulty" { } bitcoin-request ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: get-generate ( -- ? )
							 | 
						||
| 
								 | 
							
								    "getgenerate" { } bitcoin-request ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:: set-generate ( gen n -- )
							 | 
						||
| 
								 | 
							
								    "setgenerate" { gen n } bitcoin-request  drop ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: get-info ( -- result )
							 | 
						||
| 
								 | 
							
								    "getinfo" { } bitcoin-request ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:: get-label ( address -- label )
							 | 
						||
| 
								 | 
							
								    "getlabel" { address } bitcoin-request ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:: set-label ( address label -- )
							 | 
						||
| 
								 | 
							
								    "setlabel" { address  label } bitcoin-request  drop ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:: remove-label ( address -- )
							 | 
						||
| 
								 | 
							
								    "setlabel" { address } bitcoin-request  drop ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: get-new-address ( -- address )
							 | 
						||
| 
								 | 
							
								    "getnewaddress" { } bitcoin-request ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:: get-new-labelled-address ( label -- address )
							 | 
						||
| 
								 | 
							
								    "getnewaddress" { label } bitcoin-request ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:: get-received-by-address ( address -- amount )
							 | 
						||
| 
								 | 
							
								    "getreceivedbyaddress" { address } bitcoin-request ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:: get-confirmed-received-by-address ( address minconf -- amount )
							 | 
						||
| 
								 | 
							
								    "getreceivedbyaddress" { address minconf } bitcoin-request ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:: get-received-by-label ( label -- amount )
							 | 
						||
| 
								 | 
							
								    "getreceivedbylabel" { label } bitcoin-request ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:: get-confirmed-received-by-label ( label minconf -- amount )
							 | 
						||
| 
								 | 
							
								    "getreceivedbylabel" { label minconf } bitcoin-request ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:: list-received-by-address ( minconf include-empty -- seq )
							 | 
						||
| 
								 | 
							
								    "listreceivedbyaddress" { minconf include-empty } bitcoin-request ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:: list-received-by-label ( minconf include-empty -- seq )
							 | 
						||
| 
								 | 
							
								    "listreceivedbylabel" { minconf include-empty } bitcoin-request ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:: send-to-address ( address amount -- ? )
							 | 
						||
| 
								 | 
							
								    "sendtoaddress" { address amount } bitcoin-request "sent" = ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: stop ( -- )
							 | 
						||
| 
								 | 
							
								    "stop" { } bitcoin-request drop ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#! requires patched bitcoind
							 | 
						||
| 
								 | 
							
								:: list-transactions ( count include-generated -- seq )
							 | 
						||
| 
								 | 
							
								    "listtransactions" { count include-generated } bitcoin-request ;
							 | 
						||
| 
								 | 
							
								
							 |