├── .gitignore
├── LICENSE
├── README.md
├── changelog.txt
├── client
├── .gitignore
├── common
│ ├── bwidth.go
│ ├── common.go
│ ├── config.go
│ └── mining.go
├── init.go
├── main.go
├── miners.json
├── network
│ ├── addr.go
│ ├── cblk.go
│ ├── core.go
│ ├── data.go
│ ├── hdrs.go
│ ├── invs.go
│ ├── ping.go
│ ├── tick.go
│ ├── trxs.go
│ ├── vars.go
│ └── ver.go
├── peersdb
│ ├── peerdb.go
│ └── peerdb_test.go
├── rpcapi
│ ├── address.go
│ ├── block.go
│ ├── mining.go
│ └── rpcapi.go
├── speedups
│ ├── sipadll.go
│ └── sipasec.go
├── ssl_cert
│ └── README.md
├── start.bat
├── start.sh
├── txpool
│ ├── check.go
│ ├── disk.go
│ ├── mining.go
│ ├── network.go
│ ├── pkgs.go
│ ├── rjected.go
│ ├── sort.go
│ ├── system.go
│ └── tosend.go
├── usif
│ ├── fees.go
│ ├── textui
│ │ ├── beta.go
│ │ ├── commands.go
│ │ ├── mining.go
│ │ ├── network.go
│ │ ├── peers.go
│ │ ├── transactions.go
│ │ └── wallet.go
│ ├── usif.go
│ └── webui
│ │ ├── blocks.go
│ │ ├── config.go
│ │ ├── counts.go
│ │ ├── home.go
│ │ ├── mining.go
│ │ ├── network.go
│ │ ├── sendtx.go
│ │ ├── txs.go
│ │ ├── wallets.go
│ │ └── webui.go
├── wallet
│ ├── db.go
│ ├── disk.go
│ └── onoff.go
└── www
│ ├── blocks.html
│ ├── counts.html
│ ├── help.html
│ ├── home.html
│ ├── miners.html
│ ├── net.html
│ ├── send.html
│ ├── static
│ ├── back_online.mp3
│ ├── bech32.js
│ ├── chainsync.png
│ ├── copy.png
│ ├── crypto.js
│ ├── dark.png
│ ├── del-black.png
│ ├── del-white.png
│ ├── empty.png
│ ├── export-black.png
│ ├── export-white.png
│ ├── favicon.ico
│ ├── feeschart.js
│ ├── free-black.png
│ ├── free-white.png
│ ├── gocoin.js
│ ├── gocoin_dark.css
│ ├── gocoin_light.css
│ ├── import-black.png
│ ├── import-white.png
│ ├── in-black.png
│ ├── in-white.png
│ ├── info-black.png
│ ├── info-white.png
│ ├── jquery.flot.crosshair.js
│ ├── jquery.flot.min.js
│ ├── jquery.flot.time.min.js
│ ├── jquery.min.js
│ ├── light.png
│ ├── loading.gif
│ ├── message.png
│ ├── music-black.png
│ ├── music-white.png
│ ├── new_block.mp3
│ ├── nosort-black.png
│ ├── nosort-white.png
│ ├── out-black.png
│ ├── out-white.png
│ ├── pkgsort-off-black.png
│ ├── pkgsort-off-white.png
│ ├── pkgsort-on-black.png
│ ├── pkgsort-on-white.png
│ ├── qrcode-black.png
│ ├── qrcode-white.png
│ ├── qrcode.min.js
│ ├── refresh-black.png
│ ├── refresh-white.png
│ ├── request-black.png
│ ├── request-white.png
│ ├── saving.png
│ ├── send.png
│ ├── send_once.png
│ ├── server-black.png
│ ├── server-white.png
│ ├── sort-black.png
│ ├── sort-white.png
│ ├── stats.png
│ ├── switch-off.png
│ ├── switch-on.png
│ ├── theme-switch-black.png
│ ├── theme-switch-white.png
│ ├── warning-black.png
│ └── warning-white.png
│ ├── templ
│ ├── error.html
│ ├── page_head.html
│ ├── page_tail.html
│ ├── restarting.html
│ ├── shutdown.html
│ ├── txs_load.html
│ └── wallet_off.html
│ ├── txs.html
│ └── wallet.html
├── go.mod
├── lib
├── btc
│ ├── addr.go
│ ├── addr_test.go
│ ├── block.go
│ ├── block_test.go
│ ├── const.go
│ ├── ecdsa.go
│ ├── ecdsa_test.go
│ ├── funcs.go
│ ├── funcs_test.go
│ ├── hash.go
│ ├── hash_test.go
│ ├── key.go
│ ├── key_test.go
│ ├── multisig.go
│ ├── multisig_test.go
│ ├── netaddr.go
│ ├── opcodes.go
│ ├── script.go
│ ├── taproot.go
│ ├── target.go
│ ├── target_test.go
│ ├── tx.go
│ ├── tx_sys.go
│ ├── uint256.go
│ ├── unspent.go
│ ├── wallet.go
│ ├── wallet_test.go
│ ├── wallethd.go
│ └── wallethd_test.go
├── chain
│ ├── block_check.go
│ ├── blockdb.go
│ ├── chain.go
│ ├── chain_accept.go
│ ├── chain_diff.go
│ ├── chain_load.go
│ ├── chain_tree.go
│ ├── const.go
│ └── dbg.go
├── others
│ ├── bech32
│ │ ├── bech32.go
│ │ ├── bech32_test.go
│ │ ├── segwit.go
│ │ └── segwit_test.go
│ ├── bip39
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── bip39.go
│ │ ├── bip39_test.go
│ │ └── wordlist.go
│ ├── blockdb
│ │ ├── README.md
│ │ └── blockdb.go
│ ├── cgo
│ │ ├── README.md
│ │ ├── ec_bench
│ │ │ ├── gonative.go
│ │ │ ├── sipadll.go
│ │ │ └── sipasec.go
│ │ └── sipasec
│ │ │ ├── .gitignore
│ │ │ ├── README.md
│ │ │ ├── sipasec.go
│ │ │ ├── sipasec_test.go
│ │ │ ├── sipasec_unix.go
│ │ │ └── sipasec_windows.go
│ ├── ltc
│ │ └── ltc.go
│ ├── memory
│ │ ├── AUTHORS
│ │ ├── CONTRIBUTORS
│ │ ├── LICENSE
│ │ ├── LICENSE-GO
│ │ ├── LICENSE-MMAP-GO
│ │ ├── README.md
│ │ ├── counters.go
│ │ ├── memory.go
│ │ ├── memory32.go
│ │ ├── memory64.go
│ │ ├── mmap_darwin.go
│ │ ├── mmap_freebsd_32.go
│ │ ├── mmap_freebsd_64.go
│ │ ├── mmap_linux_32.go
│ │ ├── mmap_linux_64.go
│ │ ├── mmap_linux_s390x.go
│ │ ├── mmap_netbsd_32.go
│ │ ├── mmap_netbsd_64.go
│ │ ├── mmap_openbsd.go
│ │ ├── mmap_unix.go
│ │ ├── mmap_windows.go
│ │ └── trace.go
│ ├── prof
│ │ └── profiler.go
│ ├── qdb
│ │ ├── README.md
│ │ ├── db.go
│ │ ├── db_disk.go
│ │ ├── db_test.go
│ │ ├── index.go
│ │ ├── index_disk.go
│ │ ├── membind.go
│ │ ├── os_membinds
│ │ │ ├── README.md
│ │ │ ├── membind_linux.go
│ │ │ └── membind_windows.go
│ │ └── stats.go
│ ├── rawtxlib
│ │ └── rawtxtool.go
│ ├── ripemd160
│ │ ├── LICENSE
│ │ ├── ripemd160.go
│ │ ├── ripemd160_test.go
│ │ └── ripemd160block.go
│ ├── scrypt
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── pbkdf2
│ │ │ ├── pbkdf2.go
│ │ │ └── pbkdf2_test.go
│ │ ├── scrypt.go
│ │ └── scrypt_test.go
│ ├── siphash
│ │ ├── .travis.yml
│ │ ├── README.md
│ │ ├── blocks.go
│ │ ├── blocks_amd64.s
│ │ ├── blocks_arm.s
│ │ ├── hash.go
│ │ ├── hash128.go
│ │ ├── hash128_amd64.s
│ │ ├── hash128_arm.s
│ │ ├── hash_amd64.s
│ │ ├── hash_arm.s
│ │ ├── hash_asm.go
│ │ ├── siphash.go
│ │ └── siphash_test.go
│ ├── snappy
│ │ ├── AUTHORS
│ │ ├── CONTRIBUTORS
│ │ ├── LICENSE
│ │ ├── README
│ │ ├── decode.go
│ │ ├── decode_amd64.go
│ │ ├── decode_amd64.s
│ │ ├── decode_other.go
│ │ ├── encode.go
│ │ ├── encode_amd64.go
│ │ ├── encode_amd64.s
│ │ ├── encode_other.go
│ │ └── snappy.go
│ ├── sys
│ │ ├── atomic.go
│ │ ├── dblock_unix.go
│ │ ├── dblock_windows.go
│ │ ├── dutex.go
│ │ ├── hidepass_unix.go
│ │ ├── hidepass_windows.go
│ │ ├── ipnet.go
│ │ ├── mutexes.go
│ │ └── stuff.go
│ └── utils
│ │ ├── fetchbl.go
│ │ ├── fetchtx.go
│ │ ├── unspent.go
│ │ └── verbose.go
├── script
│ ├── checker.go
│ ├── dbg.go
│ ├── misc.go
│ ├── script.go
│ ├── script_test.go
│ ├── stack.go
│ ├── taproot_test.go
│ ├── tx_test.go
│ └── witness.go
├── secp256k1
│ ├── .gitignore
│ ├── COPYING
│ ├── README.md
│ ├── ec.go
│ ├── ec_test.go
│ ├── field.go
│ ├── field_10x26.go
│ ├── field_5x52.go
│ ├── field_test.go
│ ├── multi_test.go
│ ├── num.go
│ ├── schnorr.go
│ ├── schnorr_test.go
│ ├── secp256k1.go
│ ├── sig.go
│ ├── sig_test.go
│ ├── xy.go
│ ├── xyz.go
│ ├── xyz_test.go
│ ├── z_consts_10x26.go
│ ├── z_consts_5x52.go
│ └── z_init.go
├── test
│ ├── README.md
│ ├── base58_encode_decode.json
│ ├── bip340_test_vectors.csv
│ ├── bip341_script_tests.json
│ ├── script_tests.json
│ ├── sighash.json
│ ├── tx_invalid.json
│ └── tx_valid.json
└── utxo
│ ├── unspent.go
│ ├── unspent_db.go
│ ├── unspent_rec.go
│ ├── unspent_recc.go
│ ├── unspent_recu.go
│ └── unspent_test.go
├── todo.txt
├── tools
├── balio
│ └── balio.go
├── base58
│ └── base58.go
├── bdb
│ ├── bdb.go
│ └── defrag.go
├── bip39wal
│ └── bip39wal.go
├── blockinfo
│ └── blockinfo.go
├── bootdat_qt
│ └── bootdat_qt.go
├── btcversig
│ └── btcversig.go
├── fetchblock
│ └── fetchblock.go
├── fetchtx
│ └── fetchtx.go
├── goc
│ └── goc.go
├── hdwal
│ └── hdwal.go
├── importblocks
│ └── importblocks.go
├── mkmulti
│ └── mkmulti.go
├── peers
│ └── peers.go
├── sipa_dll
│ ├── secp256k1.dll
│ ├── sipadll.go
│ └── sipadll_test.go
├── tap2old
│ └── tap2old.go
├── trumpic
│ ├── .gitignore
│ ├── block_879613_fees.go
│ ├── blocks
│ │ └── readme.txt
│ ├── fees.zip
│ ├── getfees
│ │ └── getfees.go
│ ├── trumpic.go
│ └── working_blocks.txt
├── txaddsig
│ └── txaddsig.go
├── txmod
│ └── txmod.go
├── txoutset
│ └── txoutset.go
├── type2determ
│ └── type2determ.go
├── type2next
│ └── type2next.go
├── unspent4_to_UTXO
│ └── unspent4_to_UTXO.go
├── utxo
│ ├── benchmark.go
│ ├── compress.go
│ ├── fileinfo.go
│ └── utxo.go
├── verify_script
│ └── verify_script.go
└── verify_tx
│ └── verify_tx.go
├── version.go
├── wallet
├── .gitignore
├── config.go
├── encrypt.go
├── main.go
├── multisig.go
├── send.go
├── signmsg.go
├── signtx.go
├── stuff.go
├── unspent.go
├── wallet.cfg
├── wallet.go
└── wallet_test.go
└── website
├── .htaccess
├── 2503-fi-cod_effect.png
├── 2503-fi-twaek_effect.png
├── README.md
├── d3_quick.png
├── d3_turbo.png
├── dd_quick.png
├── de_gocoin_vs_core.png
├── dw32_quick.png
├── favicon.ico
├── fin_quick.png
├── fin_turbo.png
├── gocoin_index.html
├── gocoin_installation.html
├── gocoin_issues.html
├── gocoin_links.html
├── gocoin_manual.html
├── gocoin_manual_client.html
├── gocoin_manual_config.html
├── gocoin_manual_multisig.html
├── gocoin_manual_spending.html
├── gocoin_manual_wallet.html
├── gocoin_performance.html
├── gocoin_tweaks.html
├── index.html
├── logo.png
├── menu.html
├── page.php
├── quick_sync_gocoin_vs_core.png
├── quick_sync_gocoin_vs_core_mar25.png
├── rep_quick.png
└── style.css
/.gitignore:
--------------------------------------------------------------------------------
1 | *.exe
2 | *.bin
3 | *.dat
4 | *.a
5 | client/sipadll.go
6 | client/sipasec.go
7 | client/openssl.go
8 | .DS_Store
9 | .vscode
10 |
--------------------------------------------------------------------------------
/client/.gitignore:
--------------------------------------------------------------------------------
1 | client
2 | *.conf
3 | ssl_cert/*.crt
4 | ssl_cert/*.key
5 |
--------------------------------------------------------------------------------
/client/common/mining.go:
--------------------------------------------------------------------------------
1 | package common
2 |
3 | import (
4 | "bytes"
5 | "encoding/json"
6 | "io/ioutil"
7 |
8 | "github.com/piotrnar/gocoin/lib/btc"
9 | )
10 |
11 | type oneMinerId struct {
12 | Name string
13 | Tag []byte
14 | }
15 |
16 | var MinerIds []oneMinerId
17 |
18 | // return miner ID of the given coinbase transaction
19 | func TxMiner(cbtx *btc.Tx) (string, int) {
20 | txdat := cbtx.Serialize()
21 | for i, m := range MinerIds {
22 | if bytes.Equal(m.Tag, []byte("_p2pool_")) { // P2Pool
23 | if len(cbtx.TxOut) > 10 &&
24 | bytes.Equal(cbtx.TxOut[len(cbtx.TxOut)-1].Pk_script[:2], []byte{0x6A, 0x28}) {
25 | return m.Name, i
26 | }
27 | } else if bytes.Equal(m.Tag, []byte("_RSK_")) { // RSK Pool
28 | if len(cbtx.TxOut) > 1 {
29 | txo := cbtx.TxOut[len(cbtx.TxOut)-1]
30 | if len(txo.Pk_script) >= 10 && txo.Pk_script[0] == 0x6A && string(txo.Pk_script[2:10]) == "RSKBLOCK" {
31 | return m.Name, i
32 | }
33 | }
34 | } else if bytes.Contains(txdat, m.Tag) {
35 | return m.Name, i
36 | }
37 | }
38 |
39 | for _, txo := range cbtx.TxOut {
40 | adr := btc.NewAddrFromPkScript(txo.Pk_script, Testnet)
41 | if adr != nil {
42 | return adr.String(), -1
43 | }
44 | }
45 |
46 | return "", -1
47 | }
48 |
49 | func ReloadMiners() {
50 | d, _ := ioutil.ReadFile("miners.json")
51 | if d != nil {
52 | var MinerIdFile [][3]string
53 | e := json.Unmarshal(d, &MinerIdFile)
54 | if e != nil {
55 | println("miners.json", e.Error())
56 | return
57 | }
58 | MinerIds = nil
59 | for _, r := range MinerIdFile {
60 | var rec oneMinerId
61 | rec.Name = r[0]
62 | if r[1] != "" {
63 | rec.Tag = []byte(r[1])
64 | } else {
65 | if a, _ := btc.NewAddrFromString(r[2]); a != nil {
66 | rec.Tag = a.OutScript()
67 | } else {
68 | println("Error in miners.json for", r[0])
69 | continue
70 | }
71 | }
72 | MinerIds = append(MinerIds, rec)
73 | }
74 | }
75 | }
76 |
--------------------------------------------------------------------------------
/client/miners.json:
--------------------------------------------------------------------------------
1 | [
2 | ["AntPool", "AntPool", ""],
3 | ["BTC.TOP", "BTC.TOP/", ""],
4 | ["BTC.COM", "BTC.COM/", ""],
5 | ["BTC.COM", "BTC.com/", ""],
6 | ["BTC.COM", "btc.com/", ""],
7 | ["BTC.COM", "btccom", ""],
8 | ["ViaBTC", "/ViaBTC/", ""],
9 | ["BTCC", "/BTCC/", ""],
10 | ["F2Pool", "/F2Pool/", "1KFHE7w8BhaENAswwryaoccDb6qcT6DbYY"],
11 | ["F2Pool", "/f2pool", "1K6KoYC69NnafWJ7YgtrpwJxBLiijWqwa6"],
12 | ["Slush", "/slush/", ""],
13 | ["Bixin", "/Bixin/", ""],
14 | ["Bixin", "", "1KsFhYKLs8qb1GHqrPxHoywNQpet2CtP9t"],
15 | ["Bitfury", "/Bitfury/", ""],
16 | ["BitClub", "/BitClub Network/", ""],
17 | ["BW.COM", "/BW Pool/", ""],
18 | ["1Hash", "Mined by 1hash.com", ""],
19 | ["GBMiners", "/mined by gbminers/", ""],
20 | ["Bitcoin.com", "/pool.bitcoin.com", ""],
21 | ["BTPOOL", "/BTPOOL/", ""],
22 | ["Bitcoin-Russia", "/Bitcoin-Russia.ru/", ""],
23 | ["KanoPool", "KanoPool", ""],
24 | ["Bitcoin-India", "/Bitcoin-India/", ""],
25 | ["ConnectBTC", "/ConnectBTC - Home for Miners/", ""],
26 | ["BATPOOL", "/BATPOOL/", ""],
27 | ["58coin", "/58coin.com/", ""],
28 | ["DPOOL", "/DPOOL.TOP/", ""],
29 | ["canoepool", "/canoepool/", ""],
30 | ["Helix", "/Helix/", ""],
31 | ["BWPool", "BWPool", ""],
32 | ["SecretSuperstar", "/SecretSuperstar/", ""],
33 | ["Huobi", "/Huobi/", ""],
34 | ["Huobi", "/HuoBi/", ""],
35 | ["Huobi", "", "18Zcyxqna6h7Z7bRjhKvGpr8HSfieQWXqj"],
36 | ["tigerpool.net", "tigerpool.net", ""],
37 | ["Rawpool.com", "/Rawpool.com/", ""],
38 | ["poolin", "poolin.com", ""],
39 | ["bytepool.com", "/bytepool.com/", ""],
40 | ["www.okpool.top", "/www.okpool.top/", ""],
41 | ["Bitdeer", "/Bitdeer", ""],
42 | ["1THash&58COIN", "/1THash&58COIN/", ""],
43 | ["NovaBlock", "/NovaBlock/", ""],
44 | ["SpiderPool.com", "/SpiderPool.com/", ""],
45 | ["OKEX", "/www.okex.com/", ""],
46 | ["Lubian", "/lubian.com/", ""],
47 | ["Binance", "binance", ""],
48 | ["Binance", "/Binance/", ""],
49 | ["SpiderPool", "SpiderPool", ""],
50 | ["OKKONG", "/hash.okkong.com/", ""],
51 | ["Sigmapool", "Sigmapool.com/", ""],
52 | ["MiningCity", "/MiningCity/", ""],
53 | ["1THash", "/1THash/", ""],
54 | ["bitdeer", "/bitdeer/", ""],
55 | ["Foundry", "/Foundry", ""],
56 | ["BTCPool", "BTCPool", ""],
57 | ["BTCPool", "BTCpool", ""],
58 | ["BTCPool", "btcpool", ""],
59 | ["BTCPool", "BTC-POOL", ""],
60 | ["SBICrypto", "/SBICrypto", ""],
61 | ["Mara Pool", "MARA ", ""],
62 | ["one_more_mcd", "/one_more_mcd/", ""],
63 | ["Luxor", "Powered by Luxor", ""],
64 | ["bitdeer", "bitdeer/", ""],
65 | ["Terra Pool", "terrapool.io", ""],
66 | ["OKKONG", "okkong.com", ""],
67 | ["Blockfills", "/BlockfillsPool/", ""],
68 | ["pegapool", "/pegapool/", ""],
69 | ["NiceHash", "/NiceHash/", ""],
70 | ["Titan.io", "_Titan.io_", ""],
71 | ["mmpool", "/mmpool/", ""],
72 | ["Lucky pool", "Lucky pool", ""],
73 | ["WhitePool", "WhitePool", ""],
74 | ["OCEAN", "OCEAN.XYZ", ""],
75 | ["ultimus", "/ultimus/", ""],
76 | ["RSK Merged", "_RSK_", ""],
77 | ["P2Pool", "_p2pool_", ""]
78 | ]
79 |
--------------------------------------------------------------------------------
/client/peersdb/peerdb_test.go:
--------------------------------------------------------------------------------
1 | package peersdb
2 |
3 | import (
4 | "os"
5 | "testing"
6 |
7 | "github.com/piotrnar/gocoin/client/common"
8 | "github.com/piotrnar/gocoin/lib/others/qdb"
9 | )
10 |
11 | func test_one_addr(t *testing.T, host string, ip [4]byte, port uint16) {
12 | var p *PeerAddr
13 | var e error
14 | p, e = NewAddrFromString(host, false)
15 |
16 | if e != nil {
17 | t.Fatal(e.Error(), host, port)
18 | }
19 | if p.Ip4 != ip {
20 | t.Error("Bad IP4 returned", host, port)
21 | }
22 | if p.Services != Services {
23 | t.Error("Bad Services returned", host, port)
24 | }
25 | if p.Port != port {
26 | t.Error("Bad port returned", host, port)
27 | }
28 |
29 | p, e = NewAddrFromString(host+":1234", true)
30 | if e != nil {
31 | t.Fatal(e.Error(), host, port)
32 | }
33 | if p.Ip4 != ip {
34 | t.Error("Bad IP4 returned", host, port)
35 | }
36 | if p.Services != Services {
37 | t.Error("Bad Services returned", host, port)
38 | }
39 | if p.Port != port {
40 | t.Error("Bad port returned", host, port)
41 | }
42 |
43 | p, e = NewAddrFromString(host+":1234", false)
44 | if e != nil {
45 | t.Fatal(e.Error(), host, port)
46 | }
47 | if p.Ip4 != ip {
48 | t.Error("Bad IP4 returned", host, port)
49 | }
50 | if p.Services != Services {
51 | t.Error("Bad Services returned", host, port)
52 | }
53 | if p.Port != 1234 {
54 | t.Error("Bad port returned", host, port)
55 | }
56 |
57 | _, e = NewAddrFromString(host+":123456", false)
58 | if e == nil {
59 | t.Error("Error expected as port number too high", host, port)
60 | }
61 |
62 | _, e = NewAddrFromString(host+":123456", true)
63 | if e != nil {
64 | t.Error("No Error expected as port number to be ignored", host, port)
65 | }
66 | }
67 |
68 | func TestNewAddrFromString(t *testing.T) {
69 | PeerDB, _ = qdb.NewDB("tmpdir", true)
70 |
71 | // mainnet
72 | common.DefaultTcpPort = 8333
73 | test_one_addr(t, "fi.gocoin.pl", [4]byte{95, 217, 73, 162}, 8333)
74 | test_one_addr(t, "1.2.3.4", [4]byte{1, 2, 3, 4}, 8333)
75 |
76 | // Testnet
77 | common.DefaultTcpPort = 18333
78 | test_one_addr(t, "kaja.gocoin.pl", [4]byte{195, 136, 152, 164}, 18333)
79 | test_one_addr(t, "255.254.253.252", [4]byte{255, 254, 253, 252}, 18333)
80 |
81 | var e error
82 | _, e = NewAddrFromString("1.2.3.4.5", false)
83 | if e == nil {
84 | println("error expected")
85 | }
86 |
87 | _, e = NewAddrFromString("1.2.3.256", false)
88 | if e == nil {
89 | println("error expected")
90 | }
91 | PeerDB.Close()
92 | os.RemoveAll("tmpdir")
93 | }
94 |
--------------------------------------------------------------------------------
/client/rpcapi/address.go:
--------------------------------------------------------------------------------
1 | package rpcapi
2 |
3 | import (
4 | "encoding/hex"
5 | "github.com/piotrnar/gocoin/lib/btc"
6 | //"github.com/piotrnar/gocoin/client/common"
7 | )
8 |
9 | /*
10 |
11 | {"result":
12 | {"isvalid":true,
13 | "address":"mqzwxBkSH1UKqEAjGwvkj6aV5Gc6BtBCSs",
14 | "scriptPubKey":"76a91472fc9e6b1bbbd40a66653989a758098bfbf1b54788ac",
15 | "ismine":false,
16 | "iswatchonly":false,
17 | "isscript":false
18 | }
19 | */
20 |
21 | type ValidAddressResponse struct {
22 | Address string `json:"address"`
23 | ScriptPubKey string `json:"scriptPubKey"`
24 | IsValid bool `json:"isvalid"`
25 | IsMine bool `json:"ismine"`
26 | IsWatchOnly bool `json:"iswatchonly"`
27 | IsScript bool `json:"isscript"`
28 | }
29 |
30 | type InvalidAddressResponse struct {
31 | IsValid bool `json:"isvalid"`
32 | }
33 |
34 | func ValidateAddress(addr string) interface{} {
35 | a, e := btc.NewAddrFromString(addr)
36 | if e != nil {
37 | return new(InvalidAddressResponse)
38 | }
39 | res := new(ValidAddressResponse)
40 | res.IsValid = true
41 | res.Address = addr
42 | res.ScriptPubKey = hex.EncodeToString(a.OutScript())
43 | return res
44 | //res.IsMine = false
45 | //res.IsWatchOnly = false
46 | //res.IsScript = false
47 | }
48 |
--------------------------------------------------------------------------------
/client/speedups/sipasec.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | /*
4 | This is a EC_Verify speedup that is advised for non Windows systems.
5 |
6 | 1) Build and install sipa's secp256k1 lib for your system
7 |
8 | 2) Copy this file one level up and remove "speedup.go" from there
9 |
10 | 3) Rebuild clinet.exe and enjoy sipa's verify lib.
11 | */
12 |
13 | import (
14 | "github.com/piotrnar/gocoin/client/common"
15 | "github.com/piotrnar/gocoin/lib/btc"
16 | "github.com/piotrnar/gocoin/lib/others/cgo/sipasec"
17 | )
18 |
19 | func sipa_ec_verify(k, s, h []byte) bool {
20 | return sipasec.EC_Verify(k, s, h) == 1
21 | }
22 |
23 | func schnorr_ec_verify(pkey, sign, msg []byte) bool {
24 | return sipasec.Schnorr_Verify(pkey, sign, msg) == 1
25 | }
26 |
27 | func check_pay_to_contract(m_keydata, base, hash []byte, parity bool) bool {
28 | return sipasec.CheckPayToContract(m_keydata, base, hash, parity) == 1
29 | }
30 |
31 | func init() {
32 | common.Log.Println("Using libsecp256k1.a for ECVerify, SchnorrVerify & CheckPayToContact")
33 | btc.EC_Verify = sipa_ec_verify
34 | btc.Schnorr_Verify = schnorr_ec_verify
35 | btc.Check_PayToContract = check_pay_to_contract
36 | }
37 |
--------------------------------------------------------------------------------
/client/start.bat:
--------------------------------------------------------------------------------
1 | @echo off
2 | :again
3 | client.exe %1 %2 %3 %4 %5 %6 %7 %8 %9
4 | if errorlevel 67 goto terminate
5 | if errorlevel 66 goto again
6 | :terminate
7 |
--------------------------------------------------------------------------------
/client/start.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | while true; do
4 | ./client $*
5 | if [ $? -ne 66 ]; then
6 | break
7 | fi
8 | done
9 |
10 |
--------------------------------------------------------------------------------
/client/txpool/system.go:
--------------------------------------------------------------------------------
1 | package txpool
2 |
3 | import (
4 | "unsafe"
5 | )
6 |
7 | func (t *OneTxToSend) SysSize() (size int) {
8 | size = int(unsafe.Sizeof(*t))
9 | size += t.Tx.SysSize()
10 | if t.inPackages != nil {
11 | size += 8 * cap(t.inPackages)
12 | }
13 | if t.MemInputs != nil {
14 | size += (cap(t.MemInputs) + 7) & ^7 // round the size up to the nearest 8 bytes
15 | }
16 | return
17 | }
18 |
19 | func (t *OneTxRejected) SysSize() (size int) {
20 | size = int(unsafe.Sizeof(*t))
21 | if t.Waiting4 != nil {
22 | size += int(unsafe.Sizeof(*t.Waiting4))
23 | }
24 | if t.Tx != nil {
25 | size += t.Tx.SysSize()
26 | }
27 | return
28 | }
29 |
30 | func (t2s *OneTxToSend) memInputsSet(newval []bool) {
31 | if t2s.Footprint == 0 || cap(newval) == cap(t2s.MemInputs) {
32 | t2s.MemInputs = newval
33 | return
34 | }
35 | var old_size, new_size int
36 | if t2s.MemInputs != nil {
37 | old_size = (cap(t2s.MemInputs) + 7) & ^7 // round the size up to the nearest 8 bytes
38 | }
39 | t2s.MemInputs = newval
40 | if t2s.MemInputs != nil {
41 | new_size = (cap(t2s.MemInputs) + 7) & ^7 // round the size up to the nearest 8 bytes
42 | }
43 | if old_size != new_size {
44 | t2s.Footprint -= uint32(old_size)
45 | t2s.Footprint += uint32(new_size)
46 | TransactionsToSendSize -= uint64(old_size)
47 | TransactionsToSendSize += uint64(new_size)
48 | }
49 | }
50 |
51 | func (t2s *OneTxToSend) inPackagesSet(newval []*OneTxsPackage) {
52 | if t2s.Footprint == 0 || cap(newval) == cap(t2s.inPackages) {
53 | t2s.inPackages = newval
54 | return
55 | }
56 | var old_size, new_size int
57 | if t2s.inPackages != nil {
58 | old_size = 8 * cap(t2s.inPackages)
59 | }
60 | t2s.inPackages = newval
61 | if t2s.inPackages != nil {
62 | new_size = 8 * cap(t2s.inPackages)
63 | }
64 | if old_size != new_size {
65 | t2s.Footprint -= uint32(old_size)
66 | t2s.Footprint += uint32(new_size)
67 | TransactionsToSendSize -= uint64(old_size)
68 | TransactionsToSendSize += uint64(new_size)
69 | }
70 | }
71 |
72 | func FeePackagesSysSize() (size int) {
73 | size = int(unsafe.Sizeof(FeePackages)) + cap(FeePackages)*int(unsafe.Sizeof(FeePackages[0]))
74 | if len(FeePackages) > 0 {
75 | size += len(FeePackages) * int(unsafe.Sizeof(*FeePackages[0]))
76 | for _, fp := range FeePackages {
77 | size += cap(fp.Txs) * int(unsafe.Sizeof(fp.Txs[0]))
78 | }
79 | }
80 | return
81 | }
82 |
--------------------------------------------------------------------------------
/client/usif/webui/counts.go:
--------------------------------------------------------------------------------
1 | package webui
2 |
3 | import (
4 | "encoding/json"
5 | "net/http"
6 | "sort"
7 |
8 | "github.com/piotrnar/gocoin/client/common"
9 | )
10 |
11 | func json_counts(w http.ResponseWriter, r *http.Request) {
12 | if !ipchecker(r) {
13 | return
14 | }
15 | type one_var_cnt struct {
16 | Var string `json:"var"`
17 | Cnt uint64 `json:"cnt"`
18 | }
19 | type one_net_rec struct {
20 | Var string `json:"var"`
21 | Rcvd uint64 `json:"rcvd"`
22 | Rbts uint64 `json:"rbts"`
23 | Sent uint64 `json:"sent"`
24 | Sbts uint64 `json:"sbts"`
25 | }
26 |
27 | var all_var_cnt struct {
28 | Gen []*one_var_cnt `json:"gen"`
29 | Txs []*one_var_cnt `json:"txs"`
30 | Net []*one_net_rec `json:"net"`
31 | }
32 |
33 | common.CounterMutex.Lock()
34 | for k, v := range common.Counter {
35 | if k[4] == '_' {
36 | var i int
37 | for i = 0; i < len(all_var_cnt.Net); i++ {
38 | if all_var_cnt.Net[i].Var == k[5:] {
39 | break
40 | }
41 | }
42 | if i == len(all_var_cnt.Net) {
43 | fin := k[5:]
44 | var nrec one_net_rec
45 | nrec.Var = fin
46 | nrec.Rcvd = common.Counter["rcvd_"+fin]
47 | nrec.Rbts = common.Counter["rbts_"+fin]
48 | nrec.Sent = common.Counter["sent_"+fin]
49 | nrec.Sbts = common.Counter["sbts_"+fin]
50 | all_var_cnt.Net = append(all_var_cnt.Net, &nrec)
51 | }
52 | } else if k[:2] == "Tx" {
53 | all_var_cnt.Txs = append(all_var_cnt.Txs, &one_var_cnt{Var: k[2:], Cnt: v})
54 | } else {
55 | all_var_cnt.Gen = append(all_var_cnt.Gen, &one_var_cnt{Var: k, Cnt: v})
56 | }
57 | }
58 | common.CounterMutex.Unlock()
59 | sort.Slice(all_var_cnt.Gen, func(i, j int) bool {
60 | return all_var_cnt.Gen[i].Var < all_var_cnt.Gen[j].Var
61 | })
62 | sort.Slice(all_var_cnt.Txs, func(i, j int) bool {
63 | return all_var_cnt.Txs[i].Var < all_var_cnt.Txs[j].Var
64 | })
65 | sort.Slice(all_var_cnt.Net, func(i, j int) bool {
66 | return all_var_cnt.Net[i].Var < all_var_cnt.Net[j].Var
67 | })
68 |
69 | bx, er := json.Marshal(all_var_cnt)
70 | if er == nil {
71 | w.Header()["Content-Type"] = []string{"application/json"}
72 | w.Write(bx)
73 | } else {
74 | println(er.Error())
75 | }
76 | }
77 |
--------------------------------------------------------------------------------
/client/www/static/back_online.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/piotrnar/gocoin/3d9458514f7770744fd9e4e4fa60ff4ff2fdeafa/client/www/static/back_online.mp3
--------------------------------------------------------------------------------
/client/www/static/chainsync.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/piotrnar/gocoin/3d9458514f7770744fd9e4e4fa60ff4ff2fdeafa/client/www/static/chainsync.png
--------------------------------------------------------------------------------
/client/www/static/copy.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/piotrnar/gocoin/3d9458514f7770744fd9e4e4fa60ff4ff2fdeafa/client/www/static/copy.png
--------------------------------------------------------------------------------
/client/www/static/dark.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/piotrnar/gocoin/3d9458514f7770744fd9e4e4fa60ff4ff2fdeafa/client/www/static/dark.png
--------------------------------------------------------------------------------
/client/www/static/del-black.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/piotrnar/gocoin/3d9458514f7770744fd9e4e4fa60ff4ff2fdeafa/client/www/static/del-black.png
--------------------------------------------------------------------------------
/client/www/static/del-white.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/piotrnar/gocoin/3d9458514f7770744fd9e4e4fa60ff4ff2fdeafa/client/www/static/del-white.png
--------------------------------------------------------------------------------
/client/www/static/empty.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/piotrnar/gocoin/3d9458514f7770744fd9e4e4fa60ff4ff2fdeafa/client/www/static/empty.png
--------------------------------------------------------------------------------
/client/www/static/export-black.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/piotrnar/gocoin/3d9458514f7770744fd9e4e4fa60ff4ff2fdeafa/client/www/static/export-black.png
--------------------------------------------------------------------------------
/client/www/static/export-white.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/piotrnar/gocoin/3d9458514f7770744fd9e4e4fa60ff4ff2fdeafa/client/www/static/export-white.png
--------------------------------------------------------------------------------
/client/www/static/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/piotrnar/gocoin/3d9458514f7770744fd9e4e4fa60ff4ff2fdeafa/client/www/static/favicon.ico
--------------------------------------------------------------------------------
/client/www/static/free-black.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/piotrnar/gocoin/3d9458514f7770744fd9e4e4fa60ff4ff2fdeafa/client/www/static/free-black.png
--------------------------------------------------------------------------------
/client/www/static/free-white.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/piotrnar/gocoin/3d9458514f7770744fd9e4e4fa60ff4ff2fdeafa/client/www/static/free-white.png
--------------------------------------------------------------------------------
/client/www/static/import-black.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/piotrnar/gocoin/3d9458514f7770744fd9e4e4fa60ff4ff2fdeafa/client/www/static/import-black.png
--------------------------------------------------------------------------------
/client/www/static/import-white.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/piotrnar/gocoin/3d9458514f7770744fd9e4e4fa60ff4ff2fdeafa/client/www/static/import-white.png
--------------------------------------------------------------------------------
/client/www/static/in-black.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/piotrnar/gocoin/3d9458514f7770744fd9e4e4fa60ff4ff2fdeafa/client/www/static/in-black.png
--------------------------------------------------------------------------------
/client/www/static/in-white.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/piotrnar/gocoin/3d9458514f7770744fd9e4e4fa60ff4ff2fdeafa/client/www/static/in-white.png
--------------------------------------------------------------------------------
/client/www/static/info-black.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/piotrnar/gocoin/3d9458514f7770744fd9e4e4fa60ff4ff2fdeafa/client/www/static/info-black.png
--------------------------------------------------------------------------------
/client/www/static/info-white.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/piotrnar/gocoin/3d9458514f7770744fd9e4e4fa60ff4ff2fdeafa/client/www/static/info-white.png
--------------------------------------------------------------------------------
/client/www/static/light.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/piotrnar/gocoin/3d9458514f7770744fd9e4e4fa60ff4ff2fdeafa/client/www/static/light.png
--------------------------------------------------------------------------------
/client/www/static/loading.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/piotrnar/gocoin/3d9458514f7770744fd9e4e4fa60ff4ff2fdeafa/client/www/static/loading.gif
--------------------------------------------------------------------------------
/client/www/static/message.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/piotrnar/gocoin/3d9458514f7770744fd9e4e4fa60ff4ff2fdeafa/client/www/static/message.png
--------------------------------------------------------------------------------
/client/www/static/music-black.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/piotrnar/gocoin/3d9458514f7770744fd9e4e4fa60ff4ff2fdeafa/client/www/static/music-black.png
--------------------------------------------------------------------------------
/client/www/static/music-white.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/piotrnar/gocoin/3d9458514f7770744fd9e4e4fa60ff4ff2fdeafa/client/www/static/music-white.png
--------------------------------------------------------------------------------
/client/www/static/new_block.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/piotrnar/gocoin/3d9458514f7770744fd9e4e4fa60ff4ff2fdeafa/client/www/static/new_block.mp3
--------------------------------------------------------------------------------
/client/www/static/nosort-black.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/piotrnar/gocoin/3d9458514f7770744fd9e4e4fa60ff4ff2fdeafa/client/www/static/nosort-black.png
--------------------------------------------------------------------------------
/client/www/static/nosort-white.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/piotrnar/gocoin/3d9458514f7770744fd9e4e4fa60ff4ff2fdeafa/client/www/static/nosort-white.png
--------------------------------------------------------------------------------
/client/www/static/out-black.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/piotrnar/gocoin/3d9458514f7770744fd9e4e4fa60ff4ff2fdeafa/client/www/static/out-black.png
--------------------------------------------------------------------------------
/client/www/static/out-white.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/piotrnar/gocoin/3d9458514f7770744fd9e4e4fa60ff4ff2fdeafa/client/www/static/out-white.png
--------------------------------------------------------------------------------
/client/www/static/pkgsort-off-black.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/piotrnar/gocoin/3d9458514f7770744fd9e4e4fa60ff4ff2fdeafa/client/www/static/pkgsort-off-black.png
--------------------------------------------------------------------------------
/client/www/static/pkgsort-off-white.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/piotrnar/gocoin/3d9458514f7770744fd9e4e4fa60ff4ff2fdeafa/client/www/static/pkgsort-off-white.png
--------------------------------------------------------------------------------
/client/www/static/pkgsort-on-black.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/piotrnar/gocoin/3d9458514f7770744fd9e4e4fa60ff4ff2fdeafa/client/www/static/pkgsort-on-black.png
--------------------------------------------------------------------------------
/client/www/static/pkgsort-on-white.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/piotrnar/gocoin/3d9458514f7770744fd9e4e4fa60ff4ff2fdeafa/client/www/static/pkgsort-on-white.png
--------------------------------------------------------------------------------
/client/www/static/qrcode-black.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/piotrnar/gocoin/3d9458514f7770744fd9e4e4fa60ff4ff2fdeafa/client/www/static/qrcode-black.png
--------------------------------------------------------------------------------
/client/www/static/qrcode-white.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/piotrnar/gocoin/3d9458514f7770744fd9e4e4fa60ff4ff2fdeafa/client/www/static/qrcode-white.png
--------------------------------------------------------------------------------
/client/www/static/refresh-black.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/piotrnar/gocoin/3d9458514f7770744fd9e4e4fa60ff4ff2fdeafa/client/www/static/refresh-black.png
--------------------------------------------------------------------------------
/client/www/static/refresh-white.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/piotrnar/gocoin/3d9458514f7770744fd9e4e4fa60ff4ff2fdeafa/client/www/static/refresh-white.png
--------------------------------------------------------------------------------
/client/www/static/request-black.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/piotrnar/gocoin/3d9458514f7770744fd9e4e4fa60ff4ff2fdeafa/client/www/static/request-black.png
--------------------------------------------------------------------------------
/client/www/static/request-white.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/piotrnar/gocoin/3d9458514f7770744fd9e4e4fa60ff4ff2fdeafa/client/www/static/request-white.png
--------------------------------------------------------------------------------
/client/www/static/saving.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/piotrnar/gocoin/3d9458514f7770744fd9e4e4fa60ff4ff2fdeafa/client/www/static/saving.png
--------------------------------------------------------------------------------
/client/www/static/send.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/piotrnar/gocoin/3d9458514f7770744fd9e4e4fa60ff4ff2fdeafa/client/www/static/send.png
--------------------------------------------------------------------------------
/client/www/static/send_once.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/piotrnar/gocoin/3d9458514f7770744fd9e4e4fa60ff4ff2fdeafa/client/www/static/send_once.png
--------------------------------------------------------------------------------
/client/www/static/server-black.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/piotrnar/gocoin/3d9458514f7770744fd9e4e4fa60ff4ff2fdeafa/client/www/static/server-black.png
--------------------------------------------------------------------------------
/client/www/static/server-white.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/piotrnar/gocoin/3d9458514f7770744fd9e4e4fa60ff4ff2fdeafa/client/www/static/server-white.png
--------------------------------------------------------------------------------
/client/www/static/sort-black.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/piotrnar/gocoin/3d9458514f7770744fd9e4e4fa60ff4ff2fdeafa/client/www/static/sort-black.png
--------------------------------------------------------------------------------
/client/www/static/sort-white.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/piotrnar/gocoin/3d9458514f7770744fd9e4e4fa60ff4ff2fdeafa/client/www/static/sort-white.png
--------------------------------------------------------------------------------
/client/www/static/stats.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/piotrnar/gocoin/3d9458514f7770744fd9e4e4fa60ff4ff2fdeafa/client/www/static/stats.png
--------------------------------------------------------------------------------
/client/www/static/switch-off.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/piotrnar/gocoin/3d9458514f7770744fd9e4e4fa60ff4ff2fdeafa/client/www/static/switch-off.png
--------------------------------------------------------------------------------
/client/www/static/switch-on.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/piotrnar/gocoin/3d9458514f7770744fd9e4e4fa60ff4ff2fdeafa/client/www/static/switch-on.png
--------------------------------------------------------------------------------
/client/www/static/theme-switch-black.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/piotrnar/gocoin/3d9458514f7770744fd9e4e4fa60ff4ff2fdeafa/client/www/static/theme-switch-black.png
--------------------------------------------------------------------------------
/client/www/static/theme-switch-white.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/piotrnar/gocoin/3d9458514f7770744fd9e4e4fa60ff4ff2fdeafa/client/www/static/theme-switch-white.png
--------------------------------------------------------------------------------
/client/www/static/warning-black.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/piotrnar/gocoin/3d9458514f7770744fd9e4e4fa60ff4ff2fdeafa/client/www/static/warning-black.png
--------------------------------------------------------------------------------
/client/www/static/warning-white.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/piotrnar/gocoin/3d9458514f7770744fd9e4e4fa60ff4ff2fdeafa/client/www/static/warning-white.png
--------------------------------------------------------------------------------
/client/www/templ/error.html:
--------------------------------------------------------------------------------
1 |
7 |
8 |
9 | You will be automatically redirected in 5 seconds...
10 |
--------------------------------------------------------------------------------
/client/www/templ/page_tail.html:
--------------------------------------------------------------------------------
1 |
2 | -->
3 |
4 |